[Xfce4-commits] <xfce4-panel:xfce-4.8> Tasklist: Properly initialize the monitor geometry on startup (bug #7340).
Nick Schermer
noreply at xfce.org
Wed Apr 6 19:08:02 CEST 2011
Updating branch refs/heads/xfce-4.8
to b3d77e48f8c207bcb8bbf96907bf6448e4f3509d (commit)
from dce84548f4c2143417cc8baa46cf1db4012d0cea (commit)
commit b3d77e48f8c207bcb8bbf96907bf6448e4f3509d
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.
(cherry picked from commit fb48ad974dfca6a2bc00abf4d065b39b12828be6)
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