1

別の実行中のアプリケーションに存在するウィジェットにレンダリングするアニメーションを使用してGTKアプリケーションを作成する必要があります。アイデアは、とでできることとまったく同じことをすることです。たとえば、次のオプション があります。CCairoGTKVLCMplayerMplayer-wid

-wid(-guiwidも参照)(X11、OpenGL、DirectXのみ)これは、MPlayerに既存のウィンドウに接続するように指示します。ブラウザにMPlayerを埋め込むのに便利です(例:プラガー拡張機能)。このオプションは指定されたウィンドウを完全に埋めるため、アスペクトスケーリング、パンスキャンなどはMPlayerで処理されなくなりますが、ウィンドウを作成したアプリケーションで管理する必要があります。

このMplayerオプションを使用すると、GTKImageウィジェットを使用してGTKアプリケーションを作成し、Xidを取得して、指定したXidGTKを使用してアプリケーションでムービーを再生Mplayerできます。

を使用して外部ウィンドウにレンダリング/描画することを除いて、同じことを行おうとしていますCairo。誰かが提案を持っているか、もっと良いのに小さなコードサンプルがありますか?

4

1 に答える 1

4

GtkSocketGtkPlugクラスを見てください。

メインプログラムがを作成しGtkSocketXID他のプログラムに渡すことができるものが関数によって返されますgtk_socket_get_id()。次に、他のプログラムがそれをgtk_plug_new()関数の引数として使用します。すべてのレンダリングは、この新しいGtkPlugオブジェクトの子で行われます。

更新:まあ、あなたが望むなら...ここにそれはの最小限の例ですGtkSocket/GtkPlug。GTK+2とGTK+3のどちらを使用しているかはわからないので、バージョン2を想定しています。

server.c:

#include <gtk/gtk.h>

int main(int argc, char **argv)
{
    gtk_init(&argc, &argv);

    GtkWidget *wnd = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    GtkWidget *sck = gtk_socket_new();
    gtk_container_add(GTK_CONTAINER(wnd), sck);
    gtk_window_set_default_size(GTK_WINDOW(wnd), 400, 300);
    gtk_widget_show_all(wnd);

    GdkNativeWindow nwnd = gtk_socket_get_id(GTK_SOCKET(sck));
    g_print("%lu\n", nwnd);

    gtk_main();
    return 0;
}

client.c:

#include <stdlib.h>
#include <gtk/gtk.h>
#include <cairo/cairo.h>
#include <math.h>

gboolean OnDraw(GtkWidget *w, GdkEvent *ev, gpointer data)
{
    GtkAllocation size;
    gtk_widget_get_allocation(w, &size);

    cairo_t *cr = gdk_cairo_create(gtk_widget_get_window(w));
    cairo_set_source_rgb(cr, 1, 0, 0);
    cairo_arc(cr, size.width/2, size.height/2, size.height/2, 0, 2*M_PI);
    cairo_fill(cr);
    cairo_destroy(cr);
    return TRUE;
}

int main(int argc, char **argv)
{
    gtk_init(&argc, &argv);

    GdkNativeWindow nwnd = strtoul(argv[1], NULL, 10);

    GtkWidget *plug = gtk_plug_new(nwnd);
    GtkWidget *canvas = gtk_drawing_area_new();
    gtk_container_add(GTK_CONTAINER(plug), canvas);
    g_signal_connect(canvas, "expose-event", (GCallback)OnDraw, NULL);
    gtk_widget_show_all(plug);

    gtk_main();
    return 0;
}

使用するXIDはによって出力され、 :serverへの引数としてコピー/貼り付けする必要があります。client

$ ./server
60817441
^Z
[1]+  Stopped                 ./server
$ bg
$ ./client 60817441
于 2012-06-21T16:31:18.097 に答える