[ekiga/ds-gsettings3] X11: Fixed black window problem when displaying video.



commit e97f13bfecec16edb7368e3bfd46df35befdea04
Author: Damien Sandras <dsandras beip be>
Date:   Sat Nov 23 12:02:42 2013 +0100

    X11: Fixed black window problem when displaying video.

 lib/engine/gui/gtk-frontend/call-window.cpp  |   17 ++++++++++-------
 lib/engine/gui/gtk-frontend/ext-window.cpp   |   17 ++++++++++-------
 lib/engine/gui/gtk-frontend/gtk-frontend.cpp |   10 +++++++---
 3 files changed, 27 insertions(+), 17 deletions(-)
---
diff --git a/lib/engine/gui/gtk-frontend/call-window.cpp b/lib/engine/gui/gtk-frontend/call-window.cpp
index a94ed12..d914d0d 100644
--- a/lib/engine/gui/gtk-frontend/call-window.cpp
+++ b/lib/engine/gui/gtk-frontend/call-window.cpp
@@ -103,6 +103,7 @@ struct _EkigaCallWindowPrivate
   unsigned calling_state;
 
   GtkWidget *ext_video_win;
+  GtkWidget *event_box;
   GtkWidget *main_video_image;
   GtkWidget *spinner;
   GtkWidget *info_text;
@@ -813,13 +814,13 @@ ekiga_call_window_set_video_size (EkigaCallWindow *cw,
     zoom_in_changed_cb (NULL, (gpointer) cw);
   }
 
-  gtk_widget_get_size_request (cw->priv->main_video_image, &pw, &ph);
+  gtk_widget_get_size_request (cw->priv->event_box, &pw, &ph);
 
   /* No size requisition yet
    * It's our first call so we silently set the new requisition and exit...
    */
   if (pw == -1) {
-    gtk_widget_set_size_request (cw->priv->main_video_image, width, height);
+    gtk_widget_set_size_request (cw->priv->event_box, width, height);
     return;
   }
 
@@ -829,7 +830,7 @@ ekiga_call_window_set_video_size (EkigaCallWindow *cw,
   if (pw == width)
     return;
 
-  gtk_widget_set_size_request (cw->priv->main_video_image, width, height);
+  gtk_widget_set_size_request (cw->priv->event_box, width, height);
 
   gtk_widget_get_allocation (GTK_WIDGET (cw), &a);
   gdk_window_invalidate_rect (gtk_widget_get_window (GTK_WIDGET (cw)), &a, true);
@@ -1212,7 +1213,7 @@ static void on_missed_call_cb (boost::shared_ptr<Ekiga::CallManager>  /*manager*
 {
   EkigaCallWindow *cw = EKIGA_CALL_WINDOW (self);
 
-  if (cw->priv->current_call && cw->priv->current_call->get_id () != call->get_id ()) {
+  if (cw->priv->current_call && call && cw->priv->current_call->get_id () != call->get_id ()) {
     return; // Trying to clear another call than the current active one
   }
 
@@ -2348,9 +2349,11 @@ ekiga_call_window_init_gui (EkigaCallWindow *cw)
   gtk_widget_show_all (alignment);
 
   /* The frame that contains the video */
+  cw->priv->event_box = gtk_event_box_new ();
   cw->priv->main_video_image = gtk_image_new ();
-  gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (cw->priv->main_video_image), true, true, 0);
-  gtk_widget_show (cw->priv->main_video_image);
+  gtk_container_add (GTK_CONTAINER (cw->priv->event_box), cw->priv->main_video_image);
+  gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (cw->priv->event_box), true, true, 0);
+  gtk_widget_show (cw->priv->event_box);
 
   /* The frame that contains information about the call */
   cw->priv->call_frame = gtk_frame_new (NULL);
@@ -2587,7 +2590,7 @@ ekiga_call_window_draw (GtkWidget *widget,
 
   if (!cw->priv->gc) {
     Display *display;
-    display = GDK_WINDOW_XDISPLAY (gtk_widget_get_window (video_widget));
+    display = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (video_widget));
     cw->priv->gc = XCreateGC(display, display_info.window, 0, 0);
     g_return_val_if_fail (cw->priv->gc != NULL, handled);
   }
diff --git a/lib/engine/gui/gtk-frontend/ext-window.cpp b/lib/engine/gui/gtk-frontend/ext-window.cpp
index 9c26ffe..b56c820 100644
--- a/lib/engine/gui/gtk-frontend/ext-window.cpp
+++ b/lib/engine/gui/gtk-frontend/ext-window.cpp
@@ -42,7 +42,7 @@ struct _EkigaExtWindowPrivate {
 #ifndef WIN32
   GC gc;
 #endif
-  GtkWidget *video, *zin, *zout;
+  GtkWidget *video, *zin, *zout, *event_box;
   boost::shared_ptr<Ekiga::VideoOutputCore> vocore;
   boost::shared_ptr<Ekiga::Settings> video_display_settings;
 };
@@ -113,8 +113,11 @@ gui_layout (EkigaExtWindow *ew)
   zout = gtk_button_new_from_stock (GTK_STOCK_ZOOM_OUT);
   gtk_box_pack_start (GTK_BOX (hbox), zout, FALSE, FALSE, 0);
 
+  ew->priv->event_box = gtk_event_box_new ();
   ew->priv->video = gtk_image_new ();
-  gtk_box_pack_start (GTK_BOX (vbox), ew->priv->video, FALSE, FALSE, 0);
+  gtk_container_add (GTK_CONTAINER (ew->priv->event_box), ew->priv->video);
+  gtk_box_pack_start (GTK_BOX (vbox), GTK_WIDGET (ew->priv->event_box), FALSE, FALSE, 0);
+  gtk_widget_show (ew->priv->event_box);
 
   ew->priv->zin = zin;
   ew->priv->zout = zout;
@@ -220,7 +223,7 @@ draw_event (GtkWidget *widget,
 
   if (!ew->priv->gc) {
     Display *display;
-    display = GDK_WINDOW_XDISPLAY (gtk_widget_get_window (ew->priv->video));
+    display = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (ew->priv->video));
     ew->priv->gc = XCreateGC(display, info.window, 0, 0);
     g_return_val_if_fail (ew->priv->gc != NULL, handled);
   }
@@ -287,23 +290,23 @@ ekiga_ext_window_set_size (EkigaExtWindow *ew, int width, int height)
 
   g_return_if_fail (width > 0 && height > 0);
 
-  gtk_widget_get_size_request (ew->priv->video, &pw, &ph);
+  gtk_widget_get_size_request (ew->priv->event_box, &pw, &ph);
 
   /* No size requisition yet
    * It's our first call so we silently set the new requisition and exit...
    */
   if (pw == -1) {
-    gtk_widget_set_size_request (ew->priv->video, width, height);
+    gtk_widget_set_size_request (ew->priv->event_box, width, height);
     return;
   }
 
   /* Do some kind of filtering here. We often get duplicate "size-changed" events...
-   * Note that we currently only bother about the width of the video.
+   * Note that we currently only bother about the width of the event_box.
    */
   if (pw == width)
     return;
 
-  gtk_widget_set_size_request (ew->priv->video, width, height);
+  gtk_widget_set_size_request (ew->priv->event_box, width, height);
   gdk_window_invalidate_rect (gtk_widget_get_window (GTK_WIDGET (ew)), NULL, TRUE);
 }
 
diff --git a/lib/engine/gui/gtk-frontend/gtk-frontend.cpp b/lib/engine/gui/gtk-frontend/gtk-frontend.cpp
index 5fe97e3..dcce8ef 100644
--- a/lib/engine/gui/gtk-frontend/gtk-frontend.cpp
+++ b/lib/engine/gui/gtk-frontend/gtk-frontend.cpp
@@ -144,6 +144,8 @@ GtkFrontend::~GtkFrontend ()
 void
 GtkFrontend::build ()
 {
+  StatusIcon *s = NULL;
+
   boost::shared_ptr<Ekiga::ContactCore> contact_core = core.get<Ekiga::ContactCore> ("contact-core");
   boost::shared_ptr<Ekiga::PersonalDetails> details = core.get<Ekiga::PersonalDetails> ("personal-details");
   boost::shared_ptr<Ekiga::ChatCore> chat_core = core.get<Ekiga::ChatCore> ("chat-core");
@@ -184,11 +186,13 @@ GtkFrontend::build ()
   // BEWARE: the status icon needs the chat window at startup
   // FIXME: the above BEWARE is related to a FIXME in the main window code,
   // FIXME: hence should disappear with it
-  status_icon =
-    boost::shared_ptr<StatusIcon> (status_icon_new (core), g_object_unref);
-  if (status_icon)
+  s = status_icon_new (core);
+  if (s) {
+    status_icon =
+      boost::shared_ptr<StatusIcon> (status_icon_new (core), g_object_unref);
     g_signal_connect (status_icon.get (), "clicked",
                      G_CALLBACK (on_status_icon_clicked), this);
+  }
 
   // BEWARE: the main window uses the chat window at startup already,
   // and later on needs the call window, addressbook window,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]