[Xfce4-commits] <xfce4-panel:xfce-4.8> Don't crash on a wrong colormap when changing screens.

Nick Schermer noreply at xfce.org
Fri Feb 25 21:08:07 CET 2011


Updating branch refs/heads/xfce-4.8
         to 4d2403b021ee03a18aff24e733481afe4b7edc1a (commit)
       from 803905f515cc424c66f1d80fac07f6fd82738644 (commit)

commit 4d2403b021ee03a18aff24e733481afe4b7edc1a
Author: Nick Schermer <nick at xfce.org>
Date:   Sat Feb 19 15:45:08 2011 +0100

    Don't crash on a wrong colormap when changing screens.

 panel/panel-base-window.c |   48 ++++++++++++++++++++++++++++++---------------
 panel/panel-window.c      |    3 ++
 2 files changed, 35 insertions(+), 16 deletions(-)

diff --git a/panel/panel-base-window.c b/panel/panel-base-window.c
index 8b08ed5..7025621 100644
--- a/panel/panel-base-window.c
+++ b/panel/panel-base-window.c
@@ -45,6 +45,8 @@ static void     panel_base_window_set_property                (GObject
                                                                const GValue         *value,
                                                                GParamSpec           *pspec);
 static void     panel_base_window_finalize                    (GObject              *object);
+static void     panel_base_window_screen_changed              (GtkWidget            *widget,
+                                                               GdkScreen            *previous_screen);
 static gboolean panel_base_window_expose_event                (GtkWidget            *widget,
                                                                GdkEventExpose       *event);
 static gboolean panel_base_window_enter_notify_event          (GtkWidget            *widget,
@@ -119,6 +121,7 @@ panel_base_window_class_init (PanelBaseWindowClass *klass)
   gtkwidget_class->enter_notify_event = panel_base_window_enter_notify_event;
   gtkwidget_class->leave_notify_event = panel_base_window_leave_notify_event;
   gtkwidget_class->composited_changed = panel_base_window_composited_changed;
+  gtkwidget_class->screen_changed = panel_base_window_screen_changed;
 
   g_object_class_install_property (gobject_class,
                                    PROP_ENTER_OPACITY,
@@ -192,9 +195,6 @@ panel_base_window_class_init (PanelBaseWindowClass *klass)
 static void
 panel_base_window_init (PanelBaseWindow *window)
 {
-  GdkColormap *colormap;
-  GdkScreen   *screen;
-
   window->priv = G_TYPE_INSTANCE_GET_PRIVATE (window, PANEL_TYPE_BASE_WINDOW, PanelBaseWindowPrivate);
 
   window->is_composited = FALSE;
@@ -212,19 +212,6 @@ panel_base_window_init (PanelBaseWindow *window)
   /* some wm require stick to show the window on all workspaces, on xfwm4
    * the type-hint already takes care of that */
   gtk_window_stick (GTK_WINDOW (window));
-
-  /* set the rgba colormap if supported by the screen */
-  screen = gtk_window_get_screen (GTK_WINDOW (window));
-  colormap = gdk_screen_get_rgba_colormap (screen);
-  if (colormap != NULL)
-    {
-      gtk_widget_set_colormap (GTK_WIDGET (window), colormap);
-      window->is_composited = gtk_widget_is_composited (GTK_WIDGET (window));
-    }
-
-   panel_debug (PANEL_DEBUG_BASE_WINDOW,
-               "%p: rgba colormap=%p, compositing=%s", window,
-               colormap, PANEL_DEBUG_BOOL (window->is_composited));
 }
 
 
@@ -447,6 +434,32 @@ panel_base_window_finalize (GObject *object)
 
 
 
+static void
+panel_base_window_screen_changed (GtkWidget *widget, GdkScreen *previous_screen)
+{
+  PanelBaseWindow *window = PANEL_BASE_WINDOW (widget);
+  GdkColormap     *colormap;
+  GdkScreen       *screen;
+
+  if (GTK_WIDGET_CLASS (panel_base_window_parent_class)->screen_changed != NULL)
+    GTK_WIDGET_CLASS (panel_base_window_parent_class)->screen_changed (widget, previous_screen);
+
+  /* set the rgba colormap if supported by the screen */
+  screen = gtk_window_get_screen (GTK_WINDOW (window));
+  colormap = gdk_screen_get_rgba_colormap (screen);
+  if (colormap != NULL)
+    {
+      gtk_widget_set_colormap (widget, colormap);
+      window->is_composited = gtk_widget_is_composited (widget);
+    }
+
+   panel_debug (PANEL_DEBUG_BASE_WINDOW,
+               "%p: rgba colormap=%p, compositing=%s", window,
+               colormap, PANEL_DEBUG_BOOL (window->is_composited));
+}
+
+
+
 static gboolean
 panel_base_window_expose_event (GtkWidget      *widget,
                                 GdkEventExpose *event)
@@ -660,6 +673,9 @@ panel_base_window_composited_changed (GtkWidget *widget)
 
   /* set new compositing state */
   window->is_composited = gtk_widget_is_composited (widget);
+  if (window->is_composited ==  was_composited)
+    return;
+
   if (window->is_composited)
     gtk_window_set_opacity (GTK_WINDOW (widget), window->priv->leave_opacity);
 
diff --git a/panel/panel-window.c b/panel/panel-window.c
index 2866a72..c3f1347 100644
--- a/panel/panel-window.c
+++ b/panel/panel-window.c
@@ -1341,6 +1341,9 @@ panel_window_screen_changed (GtkWidget *widget,
   PanelWindow *window = PANEL_WINDOW (widget);
   GdkScreen   *screen;
 
+  if (G_LIKELY (GTK_WIDGET_CLASS (panel_window_parent_class)->screen_changed != NULL))
+    GTK_WIDGET_CLASS (panel_window_parent_class)->screen_changed (widget, previous_screen);
+
   /* get the new screen */
   screen = gtk_window_get_screen (GTK_WINDOW (widget));
   panel_return_if_fail (GDK_IS_SCREEN (screen));



More information about the Xfce4-commits mailing list