]> git.0d.be Git - empathy.git/blobdiff - libempathy-gtk/empathy-video-widget.c
add myself to AUTHORS
[empathy.git] / libempathy-gtk / empathy-video-widget.c
index 79f27814f81955934b2013482c5e650d78a92558..902e5cd7f37e8502eed889b00d8ac0f0478aa803 100644 (file)
@@ -96,7 +96,17 @@ empathy_video_widget_init (EmpathyVideoWidget *obj)
     gtk_widget_modify_bg (GTK_WIDGET (obj), GTK_STATE_NORMAL,
       &black);
 
-  GTK_WIDGET_UNSET_FLAGS (GTK_WIDGET (obj), GTK_DOUBLE_BUFFERED);
+  gtk_widget_set_double_buffered (GTK_WIDGET (obj), FALSE);
+}
+
+static void
+empathy_video_widget_realized (GtkWidget *widget, gpointer user_data)
+{
+  /* requesting the XID forces the GdkWindow to be native in GTK+ 2.18
+   * onwards, requesting the native window in a thread causes a BadWindowID,
+   * so we need to request it now. We could call gdk_window_ensure_native(),
+   * but that would mean we require GTK+ 2.18, so instead we call this */
+  GDK_WINDOW_XID (gtk_widget_get_window (GTK_WIDGET (widget)));
 }
 
 static void
@@ -106,6 +116,9 @@ empathy_video_widget_constructed (GObject *object)
   GstElement *colorspace, *videoscale, *sink;
   GstPad *pad;
 
+  g_signal_connect (object, "realize",
+      G_CALLBACK (empathy_video_widget_realized), NULL);
+
   priv->videosink = gst_bin_new (NULL);
 
   gst_object_ref (priv->videosink);
@@ -403,7 +416,7 @@ empathy_video_widget_sync_message_cb (GstBus *bus, GstMessage *message,
     {
       g_assert (GTK_WIDGET_REALIZED (GTK_WIDGET (self)));
       gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (priv->overlay),
-        GDK_WINDOW_XID (GTK_WIDGET (self)->window));
+        GDK_WINDOW_XID (gtk_widget_get_window (GTK_WIDGET (self))));
     }
 }
 
@@ -412,19 +425,21 @@ empathy_video_widget_expose_event (GtkWidget *widget, GdkEventExpose *event)
 {
   EmpathyVideoWidget *self = EMPATHY_VIDEO_WIDGET (widget);
   EmpathyVideoWidgetPriv *priv = GET_PRIV (self);
+  GtkAllocation allocation;
 
   if (event != NULL && event->count > 0)
     return TRUE;
 
   if (priv->overlay == NULL)
     {
-      gdk_window_clear_area (widget->window, 0, 0,
-        widget->allocation.width, widget->allocation.height);
+      gtk_widget_get_allocation (widget, &allocation);
+      gdk_window_clear_area (gtk_widget_get_window (widget), 0, 0,
+                             allocation.width, allocation.height);
       return TRUE;
     }
 
   gst_x_overlay_set_xwindow_id (GST_X_OVERLAY (priv->overlay),
-    GDK_WINDOW_XID (widget->window));
+    GDK_WINDOW_XID (gtk_widget_get_window (widget)));
 
   gst_x_overlay_expose (GST_X_OVERLAY (priv->overlay));