[Xfce4-commits] <xfce4-panel:master> Tasklist: Properly initialize the monitor geometry on startup (bug #7340).

Nick Schermer noreply at xfce.org
Thu Mar 31 16:18:01 CEST 2011


Updating branch refs/heads/master
         to fb48ad974dfca6a2bc00abf4d065b39b12828be6 (commit)
       from e9e68f51386ef6dd063b922437db79a1bde69546 (commit)

commit fb48ad974dfca6a2bc00abf4d065b39b12828be6
Author: Nick Schermer <nick at xfce.org>
Date:   Thu Mar 31 16:14:31 2011 +0200

    Tasklist: Properly initialize the monitor geometry on startup (bug #7340).
    
    The geometry was not loaded from the correct screen and when the panel was
    moved to another screen, so idle (to give the plugin time to move to
    the correct screen) the geometry load during login.

 plugins/tasklist/tasklist-widget.c |  112 +++++++++++++++++++++++-------------
 plugins/tasklist/tasklist-widget.h |   12 ++--
 plugins/tasklist/tasklist.c        |   34 ++++++++---
 3 files changed, 103 insertions(+), 55 deletions(-)

diff --git a/plugins/tasklist/tasklist-widget.c b/plugins/tasklist/tasklist-widget.c
index 286a0b6..9d63815 100644
--- a/plugins/tasklist/tasklist-widget.c
+++ b/plugins/tasklist/tasklist-widget.c
@@ -162,6 +162,9 @@ struct _XfceTasklist
   /* icon geometries update timeout */
   guint                 update_icon_geometries_id;
 
+  /* idle monitor geometry update */
+  guint                 update_monitor_geometry_id;
+
   /* button grouping mode */
   XfceTasklistGrouping  grouping;
 
@@ -289,7 +292,6 @@ static void               xfce_tasklist_skipped_windows_state_changed    (WnckWi
                                                                           WnckWindowState       new_state,
                                                                           XfceTasklist         *tasklist);
 static void               xfce_tasklist_sort                             (XfceTasklist         *tasklist);
-static void               xfce_tasklist_update_monitor_geometry          (XfceTasklist         *tasklist);
 static gboolean           xfce_tasklist_update_icon_geometries           (gpointer              data);
 static void               xfce_tasklist_update_icon_geometries_destroyed (gpointer              data);
 
@@ -536,6 +538,7 @@ xfce_tasklist_init (XfceTasklist *tasklist)
   tasklist->wireframe_window = 0;
 #endif
   tasklist->update_icon_geometries_id = 0;
+  tasklist->update_monitor_geometry_id = 0;
   tasklist->max_button_length = DEFAULT_MAX_BUTTON_LENGTH;
   tasklist->min_button_length = DEFAULT_MIN_BUTTON_LENGTH;
   tasklist->max_button_size = DEFAULT_BUTTON_SIZE;
@@ -704,9 +707,11 @@ xfce_tasklist_finalize (GObject *object)
   panel_return_if_fail (tasklist->skipped_windows == NULL);
   panel_return_if_fail (tasklist->screen == NULL);
 
-  /* stop icon geometry update timeout */
+  /* stop pending timeouts */
   if (tasklist->update_icon_geometries_id != 0)
     g_source_remove (tasklist->update_icon_geometries_id);
+  if (tasklist->update_monitor_geometry_id != 0)
+    g_source_remove (tasklist->update_monitor_geometry_id);
 
   /* free the class group hash table */
   g_hash_table_destroy (tasklist->class_groups);
@@ -1448,10 +1453,6 @@ xfce_tasklist_gdk_screen_changed (GdkScreen    *gdk_screen,
     {
       /* update the monitor geometry */
       xfce_tasklist_update_monitor_geometry (tasklist);
-
-      /* update visibility of buttons */
-      xfce_tasklist_active_workspace_changed (tasklist->screen,
-                                              NULL, tasklist);
     }
 }
 
@@ -1753,41 +1754,6 @@ xfce_tasklist_sort (XfceTasklist *tasklist)
 
 
 
-static void
-xfce_tasklist_update_monitor_geometry (XfceTasklist *tasklist)
-{
-  GdkScreen *screen;
-  gboolean   geometry_set = FALSE;
-  GdkWindow *window;
-
-  panel_return_if_fail (XFCE_IS_TASKLIST (tasklist));
-
-  if (!tasklist->all_monitors)
-    {
-      screen = gtk_widget_get_screen (GTK_WIDGET (tasklist));
-      window = gtk_widget_get_window (GTK_WIDGET (tasklist));
-
-      if (G_LIKELY (screen != NULL
-          && window != NULL
-          && gdk_screen_get_n_monitors (screen) > 1))
-        {
-          /* set the monitor geometry */
-          gdk_screen_get_monitor_geometry (screen,
-              gdk_screen_get_monitor_at_window (screen, window),
-              &tasklist->monitor_geometry);
-
-          geometry_set = TRUE;
-        }
-    }
-
-  /* make sure we never poke the window geometry unneeded
-   * in the visibility function */
-  if (!geometry_set)
-    xfce_tasklist_geometry_set_invalid (tasklist);
-}
-
-
-
 static gboolean
 xfce_tasklist_update_icon_geometries (gpointer data)
 {
@@ -1858,6 +1824,57 @@ xfce_tasklist_update_icon_geometries_destroyed (gpointer data)
 
 
 static gboolean
+xfce_tasklist_update_monitor_geometry_idle (gpointer data)
+{
+  XfceTasklist *tasklist = XFCE_TASKLIST (data);
+  GdkScreen    *screen;
+  gboolean      geometry_set = FALSE;
+  GdkWindow    *window;
+
+  panel_return_val_if_fail (XFCE_IS_TASKLIST (tasklist), FALSE);
+
+  if (!tasklist->all_monitors)
+    {
+      screen = gtk_widget_get_screen (GTK_WIDGET (tasklist));
+      window = gtk_widget_get_window (GTK_WIDGET (tasklist));
+
+      if (G_LIKELY (screen != NULL
+          && window != NULL
+          && gdk_screen_get_n_monitors (screen) > 1))
+        {
+          /* set the monitor geometry */
+          gdk_screen_get_monitor_geometry (screen,
+              gdk_screen_get_monitor_at_window (screen, window),
+              &tasklist->monitor_geometry);
+
+          geometry_set = TRUE;
+        }
+    }
+
+  /* make sure we never poke the window geometry unneeded
+   * in the visibility function */
+  if (!geometry_set)
+    xfce_tasklist_geometry_set_invalid (tasklist);
+
+  /* update visibility of buttons */
+  if (tasklist->screen != NULL)
+    xfce_tasklist_active_workspace_changed (tasklist->screen,
+                                            NULL, tasklist);
+
+  return FALSE;
+}
+
+
+
+static void
+xfce_tasklist_update_monitor_geometry_idle_destroy (gpointer data)
+{
+  XFCE_TASKLIST (data)->update_monitor_geometry_id = 0;
+}
+
+
+
+static gboolean
 xfce_tasklist_child_drag_motion_timeout (gpointer data)
 {
   XfceTasklistChild *child = data;
@@ -3738,3 +3755,16 @@ xfce_tasklist_set_size (XfceTasklist *tasklist,
       gtk_widget_queue_resize (GTK_WIDGET (tasklist));
     }
 }
+
+
+
+void
+xfce_tasklist_update_monitor_geometry (XfceTasklist *tasklist)
+{
+  if (tasklist->update_monitor_geometry_id == 0)
+    {
+      tasklist->update_monitor_geometry_id = g_idle_add_full (G_PRIORITY_LOW, xfce_tasklist_update_monitor_geometry_idle,
+                                                              tasklist, xfce_tasklist_update_monitor_geometry_idle_destroy);
+    }
+}
+
diff --git a/plugins/tasklist/tasklist-widget.h b/plugins/tasklist/tasklist-widget.h
index 20c5345..f1f6b11 100644
--- a/plugins/tasklist/tasklist-widget.h
+++ b/plugins/tasklist/tasklist-widget.h
@@ -62,13 +62,15 @@ enum _XfceTasklistSortOrder
 
 
 
-GType xfce_tasklist_get_type        (void) G_GNUC_CONST;
+GType xfce_tasklist_get_type                (void) G_GNUC_CONST;
 
-void  xfce_tasklist_set_orientation (XfceTasklist   *tasklist,
-                                     GtkOrientation  orientation);
+void  xfce_tasklist_set_orientation         (XfceTasklist   *tasklist,
+                                             GtkOrientation  orientation);
 
-void  xfce_tasklist_set_size        (XfceTasklist   *tasklist,
-                                     gint            size);
+void  xfce_tasklist_set_size                (XfceTasklist   *tasklist,
+                                             gint            size);
+
+void  xfce_tasklist_update_monitor_geometry (XfceTasklist   *tasklist);
 
 G_END_DECLS
 
diff --git a/plugins/tasklist/tasklist.c b/plugins/tasklist/tasklist.c
index 0a235fb..73741b3 100644
--- a/plugins/tasklist/tasklist.c
+++ b/plugins/tasklist/tasklist.c
@@ -59,15 +59,17 @@ struct _TasklistPlugin
 
 
 
-static void     tasklist_plugin_construct           (XfcePanelPlugin *panel_plugin);
-static void     tasklist_plugin_orientation_changed (XfcePanelPlugin *panel_plugin,
-                                                     GtkOrientation   orientation);
-static gboolean tasklist_plugin_size_changed        (XfcePanelPlugin *panel_plugin,
-                                                     gint             size);
-static void     tasklist_plugin_configure_plugin    (XfcePanelPlugin *panel_plugin);
-static gboolean tasklist_plugin_handle_expose_event (GtkWidget       *widget,
-                                                     GdkEventExpose  *event,
-                                                     TasklistPlugin  *plugin);
+static void     tasklist_plugin_construct               (XfcePanelPlugin    *panel_plugin);
+static void     tasklist_plugin_orientation_changed     (XfcePanelPlugin    *panel_plugin,
+                                                         GtkOrientation      orientation);
+static gboolean tasklist_plugin_size_changed            (XfcePanelPlugin    *panel_plugin,
+                                                         gint                size);
+static void     tasklist_plugin_screen_position_changed (XfcePanelPlugin    *panel_plugin,
+                                                         XfceScreenPosition  position);
+static void     tasklist_plugin_configure_plugin        (XfcePanelPlugin    *panel_plugin);
+static gboolean tasklist_plugin_handle_expose_event     (GtkWidget          *widget,
+                                                         GdkEventExpose     *event,
+                                                         TasklistPlugin     *plugin);
 
 
 
@@ -85,6 +87,7 @@ tasklist_plugin_class_init (TasklistPluginClass *klass)
   plugin_class->construct = tasklist_plugin_construct;
   plugin_class->orientation_changed = tasklist_plugin_orientation_changed;
   plugin_class->size_changed = tasklist_plugin_size_changed;
+  plugin_class->screen_position_changed = tasklist_plugin_screen_position_changed;
   plugin_class->configure_plugin = tasklist_plugin_configure_plugin;
 }
 
@@ -181,6 +184,19 @@ tasklist_plugin_size_changed (XfcePanelPlugin *panel_plugin,
 
 
 static void
+tasklist_plugin_screen_position_changed (XfcePanelPlugin    *panel_plugin,
+                                         XfceScreenPosition  position)
+{
+  TasklistPlugin *plugin = XFCE_TASKLIST_PLUGIN (panel_plugin);
+
+  /* update monitor geometry; this function is also triggered when
+   * the panel is moved to another monitor during runtime */
+  xfce_tasklist_update_monitor_geometry (XFCE_TASKLIST (plugin->tasklist));
+}
+
+
+
+static void
 tasklist_plugin_configure_plugin (XfcePanelPlugin *panel_plugin)
 {
   TasklistPlugin *plugin = XFCE_TASKLIST_PLUGIN (panel_plugin);



More information about the Xfce4-commits mailing list