2012-06-21 99 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

相关问题