2012-06-21 77 views
1

我有必要在C,做使用Cairo一些動畫將呈現到一個GTK小部件存在於寫GTK應用另一個運行的應用這個想法是做與VLCMplayer完全相同的事情。例如Mplayer-wid選項:
如何繪製/使用小部件的Xid在GTK /開​​羅渲染到窗口小部件「C」

-wid(見-guiwid)(X11,OpenGL和DirectX的只) 這告訴MPlayer附着於一個已有的窗口。用於在瀏覽器中嵌入MPlayer(例如插件擴展)。此選項 完全填充給定窗口,因此方面縮放,panscan等不再由MPlayer處理,但必須由創建窗口的 應用程序管理。

有了這個Mplayer選項,您可以創建一個GTKImage小部件GTK應用程序,得到它的的Xid,然後使用Mplayer與指定的Xid的GTK應用程序中播放電影。

我試圖做同樣的事情,除了使用Cairo渲染/繪製到外部窗口。任何人都有建議或更好的小代碼示例?

+0

我不認爲你可以重新將任何東西放入另一個進程的窗口中。然而,如果rodrigo的解決方案能夠工作,我會很高興,因爲我肯定會錯誤的;-) – ptomato

+0

我*可以做到因爲我以前做過。寫了一個簡單的GTK應用程序,其中包含一個GtkImage小部件。我能夠獲得GtkImage組件Xid並將其傳遞給Mplayer(一個單獨的進程),然後將一個電影渲染到我的Gtk應用程序GtkImage中。這是一個C++ gtkmm的例子。 http://developer.gnome.org/gtkmm-tutorial/stable/sec-plugs-sockets-example.html – Chimera

回答

4

看看GtkSocketGtkPlug類。

主程序將創建一個GtkSocketXID您可以傳遞給另一個程序將返回的功能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 
+0

謝謝rodrigo。我會看看。 – Chimera

+0

羅德里戈,這感覺可能是一個答案,但是,我是一個GTK和開羅的新手,我似乎無法把它們放在一起看着文檔。你有一個小的代碼片段,演示了我正在嘗試做什麼? – Chimera

+1

@JimNorton - 我寫了一個非常簡單的例子,我希望它可能足以讓你開始。 – rodrigo

相關問題