1

我需要编写一个GTK应用程序C来执行一些动画,使用Cairo它将呈现到GTK另一个正在运行的应用程序中存在的小部件中。这个想法是做同样的事情,你可以用VLC和做Mplayer。例如Mplayer-wid选项:

-wid(另见 -guiwid)(仅限 X11、OpenGL 和 DirectX)这告诉 MPlayer 附加到现有窗口。用于在浏览器中嵌入 MPlayer(例如插件扩展)。此选项完全填充给定窗口,因此 MPlayer 不再处理纵横比缩放、panscan 等,但必须由创建窗口的应用程序管理。

使用此Mplayer选项,您可以使用 GTKImage 小部件创建 GTK 应用程序,获取它的 Xid,然后GTK使用指定的 Xid 在应用程序中播放电影Mplayer

我正在尝试做同样的事情,除了使用Cairo. 有人有建议或更好的小代码示例吗?

4

1 回答 1

4

看看GtkSocketGtkPlug类。

主程序将创建一个GtkSocketXID您可以传递给其他程序的将由函数返回gtk_socket_get_id()。然后另一个程序将使用它作为函数的参数gtk_plug_new()。所有的渲染都将在这个新GtkPlug对象的子对象中完成。

更新:好吧,如果你想......这是一个最小的例子GtkSocket/GtkPlug。你没有说你使用的是 GTK+2 还是 GTK+3,所以我假设是版本 2。

服务器.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;
}

客户端.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 回答