看看GtkSocket
和GtkPlug
類。
主程序將創建一個GtkSocket
和XID
您可以傳遞給另一個程序將返回的功能gtk_socket_get_id()
。然後另一個程序將使用它作爲gtk_plug_new()
函數的參數。所有的渲染將在這個新的GtkPlug
對象的子項中完成。
UPDATE:那麼,如果你想...這裏它是一個簡單的例子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
我不認爲你可以重新將任何東西放入另一個進程的窗口中。然而,如果rodrigo的解決方案能夠工作,我會很高興,因爲我肯定會錯誤的;-) – ptomato
我*可以做到因爲我以前做過。寫了一個簡單的GTK應用程序,其中包含一個GtkImage小部件。我能夠獲得GtkImage組件Xid並將其傳遞給Mplayer(一個單獨的進程),然後將一個電影渲染到我的Gtk應用程序GtkImage中。這是一個C++ gtkmm的例子。 http://developer.gnome.org/gtkmm-tutorial/stable/sec-plugs-sockets-example.html – Chimera