diff --git a/sflphone-client-gnome/configure.ac b/sflphone-client-gnome/configure.ac index da02c0746e6848813f990e64482d525174ec0a60..6b513f95b95b008f2ad60be6c6d132f0c15b5a2c 100644 --- a/sflphone-client-gnome/configure.ac +++ b/sflphone-client-gnome/configure.ac @@ -53,6 +53,7 @@ AC_SUBST(LIBSEXY_LIBS) PKG_CHECK_MODULES(DBUSGLIB, dbus-glib-1 >= 0.75, HAVE_DBUS_G_PROXY_SET_DEFAULT_TIMEOUT=true, HAVE_DBUS_G_PROXY_SET_DEFAULT_TIMEOUT=false); PKG_CHECK_MODULES([LIBNOTIFY], [libnotify >= 0.7.2], [AC_DEFINE([LIBNOTIFY_VERSION_0_7_2],[],[Using libnotify-0.7.2 or higher])],[PKG_CHECK_MODULES([LIBNOTIFY], [libnotify >= 0.4])]) PKG_CHECK_MODULES(CLUTTER, clutter-1.0) +PKG_CHECK_MODULES(CLUTTERGTK, clutter-gtk-0.10) PKG_CHECK_MODULES(SFLGTK, gtk+-2.0 > 2.2) PKG_CHECK_MODULES(SFLGLIB, glib-2.0 >= 2.2) PKG_CHECK_MODULES(WEBKIT, webkit-1.0) diff --git a/sflphone-client-gnome/src/config/videoconf.c b/sflphone-client-gnome/src/config/videoconf.c index f85977ad95d5612e0bf4af9b7328a8782687d145..365fe7d25ca9a54850caaf2a8fca787aa9b99cbb 100644 --- a/sflphone-client-gnome/src/config/videoconf.c +++ b/sflphone-client-gnome/src/config/videoconf.c @@ -38,6 +38,7 @@ #include <assert.h> #include <clutter/clutter.h> +#include <clutter-gtk/clutter-gtk.h> static GtkWidget *v4l2Device; static GtkWidget *v4l2Channel; @@ -114,6 +115,7 @@ static VideoPreview *preview = NULL; static GtkWidget *preview_button = NULL; static GtkWidget *drawarea = NULL; +static int using_clutter; static int drawWidth = 20 * 16; static int drawHeight = 20 * 9; static const char *drawFormat; @@ -153,11 +155,7 @@ preview_button_clicked(GtkButton *button, gpointer data UNUSED) static const char *formats[2] = { "rgb24", "bgra" }; - if (clutter_init(NULL, NULL) == CLUTTER_INIT_SUCCESS) { - drawFormat = formats[0]; - } else { - drawFormat = formats[1]; - } + drawFormat = using_clutter ? formats[0] : formats[1]; dbus_start_video_preview(drawWidth, drawHeight, drawFormat); } else { @@ -190,7 +188,8 @@ GtkWidget* create_video_configuration() g_signal_connect(G_OBJECT(preview_button), "clicked", G_CALLBACK(preview_button_clicked), NULL); gtk_widget_show(GTK_WIDGET(preview_button)); - drawarea = gtk_drawing_area_new(); + using_clutter = clutter_init(NULL, NULL) == CLUTTER_INIT_SUCCESS; + drawarea = using_clutter ? gtk_clutter_embed_new() : gtk_drawing_area_new(); gtk_widget_set_size_request (drawarea, drawWidth, drawHeight); gtk_table_attach(GTK_TABLE(table), drawarea, 1, 2, 0, 1, GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 0, 6); gtk_widget_show(GTK_WIDGET(drawarea)); diff --git a/sflphone-client-gnome/src/video/Makefile.am b/sflphone-client-gnome/src/video/Makefile.am index 6da73dce5c36128d9fdc0744ee0ee234f6077f5a..7a66cf0c3380a253279c44a562769e076c4cc893 100644 --- a/sflphone-client-gnome/src/video/Makefile.am +++ b/sflphone-client-gnome/src/video/Makefile.am @@ -4,10 +4,10 @@ noinst_LTLIBRARIES = libvideo.la libvideo_la_SOURCES = video_preview.c -libvideo_la_LDFLAGS = @CLUTTER_LDFLAGS@ +libvideo_la_LDFLAGS = @CLUTTER_LDFLAGS@ @CLUTTERGTK_LDFLAGS@ libvideo_la_LIBADD = @CLUTTER_LIBS@ \ - @SFLGTK_LIBS@ @SFLGLIB_LIBS@ + @SFLGTK_LIBS@ @SFLGLIB_LIBS@ @CLUTTERGTK_LIBS@ libvideo_la_CFLAGS = @CLUTTER_CFLAGS@ \ - @SFLGTK_CFLAGS@ @SFLGLIB_CFLAGS@ + @SFLGTK_CFLAGS@ @SFLGLIB_CFLAGS@ @CLUTTERGTK_CFLAGS@ diff --git a/sflphone-client-gnome/src/video/video_preview.c b/sflphone-client-gnome/src/video/video_preview.c index a535b961c14596f383d40707f7293f0b4506fdae..73c9618762c6b607d195f946c9ca797017bb8e02 100644 --- a/sflphone-client-gnome/src/video/video_preview.c +++ b/sflphone-client-gnome/src/video/video_preview.c @@ -42,6 +42,7 @@ #include <string.h> #include <clutter/clutter.h> +#include <clutter-gtk/clutter-gtk.h> #include <cairo.h> #define VIDEO_PREVIEW_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \ @@ -372,9 +373,10 @@ readFrameFromShm(VideoPreviewPrivate *priv) } if (priv->using_clutter) { - if (strcmp(priv->format, "rgb24")) { - g_print("clutter render: Unknown pixel format `%s'\n", priv->format); - } + if (strcmp(priv->format, "rgb24")) { + g_print("clutter render: Unknown pixel format `%s'\n", priv->format); + return; + } clutter_texture_set_from_rgb_data (CLUTTER_TEXTURE(texture), (void*)data, @@ -386,14 +388,12 @@ readFrameFromShm(VideoPreviewPrivate *priv) 0, NULL); } else { - cairo_format_t format; - if (!strcmp(priv->format, "bgra")) - format = CAIRO_FORMAT_RGB24; - else { - g_print("cairo render: Unknown pixel format `%s'\n", priv->format); + if (strcmp(priv->format, "bgra")) { + g_print("cairo render: Unknown pixel format `%s'\n", priv->format); return; } + cairo_format_t format = CAIRO_FORMAT_RGB24; int stride = cairo_format_stride_for_width (format, width); assert(stride == align(4*width)); @@ -487,29 +487,25 @@ video_preview_run(VideoPreview *preview) priv->using_clutter = !strcmp(priv->format, "rgb24"); g_print("Preview: using %s render\n", priv->using_clutter ? "clutter" : "cairo"); + g_signal_connect(priv->drawarea, "unrealize", G_CALLBACK(on_drawarea_unrealize), preview); + if (priv->using_clutter) { ClutterActor *stage; - /* Get a stage */ - stage = clutter_stage_new (); + stage = gtk_clutter_embed_get_stage (GTK_CLUTTER_EMBED(priv->drawarea)); + assert(stage); g_signal_connect (stage, "delete-event", G_CALLBACK(on_stage_delete), preview); - clutter_actor_set_size(stage, - priv->width, - priv->height); + //clutter_actor_set_size(stage, priv->width, priv->height); priv->texture = clutter_texture_new(); - clutter_stage_set_title(CLUTTER_STAGE (stage), "Video Test"); /* Add ClutterTexture to the stage */ clutter_container_add(CLUTTER_CONTAINER (stage), priv->texture, NULL); clutter_actor_show_all(stage); } else { - GtkWidget *drawarea = priv->drawarea; - g_signal_connect(drawarea, "unrealize", G_CALLBACK(on_drawarea_unrealize), preview); - GdkWindow *w = gtk_widget_get_window(drawarea); - priv->cairo = gdk_cairo_create(w); + priv->cairo = gdk_cairo_create(gtk_widget_get_window(priv->drawarea)); } /* frames are read and saved here */