diff --git a/docs/manual b/docs/manual --- a/docs/manual +++ b/docs/manual @@ -1 +1 @@ -Subproject commit a940d1a505af78ff80de167fdb375a3fbc8a04f3 +Subproject commit a940d1a505af78ff80de167fdb375a3fbc8a04f3-dirty diff --git a/plugins/tasklist/tasklist-widget.c b/plugins/tasklist/tasklist-widget.c index 286a0b6..940fa18 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,61 @@ 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); + + g_message ("%p: geometry is %d,%d %dx%d", tasklist, + tasklist->monitor_geometry.x, tasklist->monitor_geometry.y, + tasklist->monitor_geometry.width, tasklist->monitor_geometry.height); + + 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 +3759,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..e3c4f26 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 because this function is triggered on + * position changes of the panel, so also when moved to another screen */ + 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);