Updating branch refs/heads/devel to 7b93d102afc2f10ef9ec3cdbab496806b05185f6 (commit) from c40dc8230c48095a9ee95ee6cdd84229f3777626 (commit)
commit 7b93d102afc2f10ef9ec3cdbab496806b05185f6 Author: Nick Schermer <n...@xfce.org> Date: Wed Jan 20 17:01:49 2010 +0100 Review PanelApplication. panel/panel-application.c | 150 ++++++++++++++----------------------- panel/panel-application.h | 4 +- panel/panel-dbus-service.c | 5 +- panel/panel-dialogs.c | 10 ++- panel/panel-item-dialog.c | 24 +++++- panel/panel-item-dialog.h | 2 +- panel/panel-preferences-dialog.c | 10 +- panel/panel-window.c | 10 +-- 8 files changed, 94 insertions(+), 121 deletions(-) diff --git a/panel/panel-application.c b/panel/panel-application.c index 6a096d6..5b330a4 100644 --- a/panel/panel-application.c +++ b/panel/panel-application.c @@ -62,7 +62,6 @@ static gboolean panel_application_plugin_insert (PanelApplication *a gchar **arguments, gint position); static gboolean panel_application_save_timeout (gpointer user_data); -static void panel_application_save_reschedule (PanelApplication *application); static void panel_application_window_destroyed (GtkWidget *window, PanelApplication *application); static void panel_application_dialog_destroyed (GtkWindow *dialog, @@ -116,18 +115,18 @@ struct _PanelApplication XfconfChannel *xfconf; /* internal list of all the panel windows */ - GSList *windows; + GSList *windows; /* internal list of opened dialogs */ - GSList *dialogs; + GSList *dialogs; /* autosave timeout */ - guint autosave_timeout_id; + guint autosave_timeout_id; /* drag and drop data */ - guint drop_data_ready : 1; - guint drop_occurred : 1; - guint drop_desktop_files : 1; + guint drop_data_ready : 1; + guint drop_occurred : 1; + guint drop_desktop_files : 1; }; enum @@ -176,7 +175,6 @@ panel_application_init (PanelApplication *application) PanelWindow *window; GError *error = NULL; - /* initialize */ application->windows = NULL; application->dialogs = NULL; application->autosave_timeout_id = 0; @@ -187,7 +185,7 @@ panel_application_init (PanelApplication *application) /* get the xfconf channel (singleton) */ application->xfconf = panel_properties_get_channel (G_OBJECT (application)); - /* check for any configuration */ + /* check if we need to launch the migration application */ if (!xfconf_channel_has_property (application->xfconf, "/panels")) { if (!g_spawn_command_line_sync (MIGRATE_BIN, NULL, NULL, NULL, &error)) @@ -208,9 +206,12 @@ panel_application_init (PanelApplication *application) panel_application_load (application); /* start the autosave timeout */ - panel_application_save_reschedule (application); + application->autosave_timeout_id = + g_timeout_add_seconds (AUTOSAVE_INTERVAL, + panel_application_save_timeout, + application); - /* create empty window */ + /* create empty window if everything else failed */ if (G_UNLIKELY (application->windows == NULL)) window = panel_application_new_window (application, NULL, TRUE); } @@ -228,18 +229,15 @@ panel_application_finalize (GObject *object) /* stop the autosave timeout */ g_source_remove (application->autosave_timeout_id); - /* destroy the windows if they are still opened */ + /* free all windows */ for (li = application->windows; li != NULL; li = li->next) { g_signal_handlers_disconnect_by_func (G_OBJECT (li->data), G_CALLBACK (panel_application_window_destroyed), application); gtk_widget_destroy (GTK_WIDGET (li->data)); } - - /* cleanup the list of windows */ g_slist_free (application->windows); - /* release the factory */ g_object_unref (G_OBJECT (application->factory)); (*G_OBJECT_CLASS (panel_application_parent_class)->finalize) (object); @@ -281,7 +279,6 @@ panel_application_xfconf_window_bindings (PanelApplication *application, panel_properties_bind (application->xfconf, G_OBJECT (window), property_base, properties, save_properties); - /* cleanup */ g_free (property_base); } @@ -339,8 +336,8 @@ panel_application_load (PanelApplication *application) xfconf_channel_reset_property (application->xfconf, buf, TRUE); /* show warnings */ - g_message (_("Plugin \"%s-%d\" was not found and has been " - "removed from the configuration"), name, unique_id); + g_message ("Plugin \"%s-%d\" was not found and has been " + "removed from the configuration", name, unique_id); } g_free (name); @@ -364,7 +361,7 @@ panel_application_plugin_move_drag_end (GtkWidget *item, g_signal_handlers_disconnect_by_func (G_OBJECT (item), G_CALLBACK (panel_application_plugin_move_drag_end), application); - /* make the window insensitive */ + /* make the window sensitive again */ panel_application_windows_sensitive (application, TRUE); } @@ -385,11 +382,10 @@ panel_application_plugin_move (GtkWidget *item, /* make the window insensitive */ panel_application_windows_sensitive (application, FALSE); - /* create a target list */ + /* create drag context */ target_list = gtk_target_list_new (drag_targets, G_N_ELEMENTS (drag_targets)); - - /* begin a drag */ context = gtk_drag_begin (item, target_list, GDK_ACTION_MOVE, 1, NULL); + gtk_target_list_unref (target_list); /* set the drag context icon name */ module = panel_module_get_from_plugin_provider (XFCE_PANEL_PLUGIN_PROVIDER (item)); @@ -399,9 +395,6 @@ panel_application_plugin_move (GtkWidget *item, else gtk_drag_set_icon_default (context); - /* release the drag list */ - gtk_target_list_unref (target_list); - /* signal to make the window sensitive again on a drag end */ g_signal_connect (G_OBJECT (item), "drag-end", G_CALLBACK (panel_application_plugin_move_drag_end), application); @@ -446,6 +439,7 @@ panel_application_plugin_remove (GtkWidget *widget, { panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (widget)); + /* ask the plugin to cleanup when we destroy a panel window */ xfce_panel_plugin_provider_emit_signal (XFCE_PANEL_PLUGIN_PROVIDER (widget), PROVIDER_SIGNAL_REMOVE_PLUGIN); } @@ -461,44 +455,47 @@ panel_application_plugin_provider_signal (XfcePanelPluginProvider *provide PanelWindow *window; gint unique_id; gchar *name; - gint nth; panel_return_if_fail (PANEL_IS_APPLICATION (application)); panel_return_if_fail (XFCE_IS_PANEL_PLUGIN_PROVIDER (provider)); - /* get the panel of the plugin */ window = PANEL_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (provider))); panel_return_if_fail (PANEL_IS_WINDOW (window)); - /* handle the signal emitted from the plugin provider */ switch (provider_signal) { case PROVIDER_SIGNAL_MOVE_PLUGIN: - /* invoke the move function */ + /* start plugin drag */ panel_application_plugin_move (GTK_WIDGET (provider), application); break; case PROVIDER_SIGNAL_EXPAND_PLUGIN: case PROVIDER_SIGNAL_COLLAPSE_PLUGIN: itembar = gtk_bin_get_child (GTK_BIN (window)); - gtk_container_child_set (GTK_CONTAINER (itembar), GTK_WIDGET (provider), - "expand", provider_signal == PROVIDER_SIGNAL_EXPAND_PLUGIN, NULL); + gtk_container_child_set (GTK_CONTAINER (itembar), + GTK_WIDGET (provider), + "expand", + provider_signal == PROVIDER_SIGNAL_EXPAND_PLUGIN, + NULL); break; case PROVIDER_SIGNAL_WRAP_PLUGIN: case PROVIDER_SIGNAL_UNWRAP_PLUGIN: itembar = gtk_bin_get_child (GTK_BIN (window)); - gtk_container_child_set (GTK_CONTAINER (itembar), GTK_WIDGET (provider), - "wrap", provider_signal == PROVIDER_SIGNAL_WRAP_PLUGIN, NULL); + gtk_container_child_set (GTK_CONTAINER (itembar), + GTK_WIDGET (provider), + "wrap", + provider_signal == PROVIDER_SIGNAL_WRAP_PLUGIN, + NULL); break; case PROVIDER_SIGNAL_LOCK_PANEL: - /* block autohide */ + /* increase window's autohide counter */ panel_window_freeze_autohide (window); break; case PROVIDER_SIGNAL_UNLOCK_PANEL: - /* unblock autohide */ + /* decrease window's autohide counter */ panel_window_thaw_autohide (window); break; @@ -506,7 +503,7 @@ panel_application_plugin_provider_signal (XfcePanelPluginProvider *provide /* give plugin the opportunity to cleanup special configuration */ xfce_panel_plugin_provider_remove (provider); - /* store the provider's unique id and name */ + /* store the provider's unique id and name (lost after destroy) */ unique_id = xfce_panel_plugin_provider_get_unique_id (provider); name = g_strdup (xfce_panel_plugin_provider_get_name (provider)); @@ -520,12 +517,8 @@ panel_application_plugin_provider_signal (XfcePanelPluginProvider *provide break; case PROVIDER_SIGNAL_ADD_NEW_ITEMS: - /* select active window */ - nth = panel_application_get_window_index (application, window); - panel_application_window_select (application, nth); - /* open the items dialog */ - panel_item_dialog_show (gtk_widget_get_screen (GTK_WIDGET (window))); + panel_item_dialog_show (window); break; case PROVIDER_SIGNAL_PANEL_PREFERENCES: @@ -535,17 +528,17 @@ panel_application_plugin_provider_signal (XfcePanelPluginProvider *provide case PROVIDER_SIGNAL_PANEL_QUIT: case PROVIDER_SIGNAL_PANEL_RESTART: - /* quit of restart the entire panel */ + /* quit or restart */ panel_dbus_service_exit_panel (provider_signal == PROVIDER_SIGNAL_PANEL_RESTART); break; case PROVIDER_SIGNAL_PANEL_ABOUT: - /* show the panel about dialog */ + /* show the about dialog */ panel_dialogs_show_about (); break; case PROVIDER_SIGNAL_FOCUS_PLUGIN: - /* focus the panel window */ + /* focus the panel window (as part of focusing a widget within the plugin) */ gtk_window_present_with_time (GTK_WINDOW (window), GDK_CURRENT_TIME); break; @@ -591,14 +584,12 @@ panel_application_plugin_insert (PanelApplication *application, if (G_UNLIKELY (unique_id == -1)) panel_application_plugin_delete_config (application, name, new_unique_id); - /* get the panel itembar */ - itembar = gtk_bin_get_child (GTK_BIN (window)); - /* add signal to monitor provider signals */ g_signal_connect (G_OBJECT (provider), "provider-signal", G_CALLBACK (panel_application_plugin_provider_signal), application); /* add the item to the panel */ + itembar = gtk_bin_get_child (GTK_BIN (window)); panel_itembar_insert (PANEL_ITEMBAR (itembar), GTK_WIDGET (provider), position); @@ -620,7 +611,6 @@ panel_application_save_timeout (gpointer user_data) GDK_THREADS_ENTER (); - /* save */ panel_application_save (PANEL_APPLICATION (user_data), TRUE); GDK_THREADS_LEAVE (); @@ -631,23 +621,6 @@ panel_application_save_timeout (gpointer user_data) static void -panel_application_save_reschedule (PanelApplication *application) -{ - panel_return_if_fail (PANEL_IS_APPLICATION (application)); - - /* stop a running timeout */ - if (G_UNLIKELY (application->autosave_timeout_id != 0)) - g_source_remove (application->autosave_timeout_id); - - /* start a new timeout */ - application->autosave_timeout_id = - g_timeout_add_seconds (AUTOSAVE_INTERVAL, panel_application_save_timeout, - application); -} - - - -static void panel_application_window_destroyed (GtkWidget *window, PanelApplication *application) { @@ -701,7 +674,8 @@ panel_application_window_destroyed (GtkWidget *window, /* schedule a save to store the new number of panels */ panel_application_save (application, FALSE); - /* quit if there are no windows opened */ + /* quit if there are no windows */ + /* TODO, allow removing all windows and ask user what to do */ if (application->windows == NULL) gtk_main_quit (); } @@ -870,7 +844,6 @@ panel_application_drag_data_received (PanelWindow *window, gdk_drag_status (context, 0, drag_time); } - /* release the application */ g_object_unref (G_OBJECT (application)); } @@ -891,7 +864,7 @@ panel_application_drag_motion (GtkWidget *window, panel_return_val_if_fail (PANEL_IS_WINDOW (window), FALSE); panel_return_val_if_fail (GDK_IS_DRAG_CONTEXT (context), FALSE); panel_return_val_if_fail (PANEL_IS_APPLICATION (application), FALSE); - panel_return_val_if_fail (application->drop_occurred == FALSE, FALSE); + panel_return_val_if_fail (!application->drop_occurred, FALSE); /* determine the drag target */ target = gtk_drag_dest_find_target (window, context, NULL); @@ -1033,7 +1006,6 @@ panel_application_save (PanelApplication *application, panel_return_if_fail (PANEL_IS_APPLICATION (application)); panel_return_if_fail (XFCONF_IS_CHANNEL (channel)); - /* save the settings of all plugins */ for (li = application->windows, i = 0; li != NULL; li = li->next, i++) { /* get the itembar children */ @@ -1077,7 +1049,6 @@ panel_application_save (PanelApplication *application, g_snprintf (buf, sizeof (buf), "/panels/panel-%u/plugin-ids", i); xfconf_channel_set_arrayv (channel, buf, array); - /* cleanup */ g_list_free (children); xfconf_array_free (array); } @@ -1115,14 +1086,10 @@ panel_application_destroy_dialogs (PanelApplication *application) /* destroy all dialogs */ for (li = application->dialogs; li != NULL; li = lnext) { - /* get next element */ lnext = li->next; - - /* destroy the window */ gtk_widget_destroy (GTK_WIDGET (li->data)); } - /* check */ panel_return_if_fail (application->dialogs == NULL); } @@ -1133,10 +1100,10 @@ panel_application_add_new_item (PanelApplication *application, const gchar *plugin_name, gchar **arguments) { - PanelWindow *window; gint nth = 0; GSList *li; gboolean active; + PanelWindow *window; panel_return_if_fail (PANEL_IS_APPLICATION (application)); panel_return_if_fail (plugin_name != NULL); @@ -1144,9 +1111,10 @@ panel_application_add_new_item (PanelApplication *application, if (panel_module_factory_has_module (application->factory, plugin_name)) { - /* look for an active panel or ask the user */ + /* find a suitable window if there are 2 or more windows */ if (LIST_HAS_TWO_OR_MORE_ENTRIES (application->windows)) { + /* try to find an avtive panel */ for (li = application->windows, nth = 0; li != NULL; li = li->next, nth++) { g_object_get (G_OBJECT (li->data), "active", &active, NULL); @@ -1154,24 +1122,23 @@ panel_application_add_new_item (PanelApplication *application, break; } + /* no active panel found, ask user to select a panel, leave when + * the cancel button is pressed */ if (li == NULL && (nth = panel_dialogs_choose_panel (application)) == -1) return; } - /* get the window */ - window = g_slist_nth_data (application->windows, nth); - /* add the plugin to the end of the choosen window */ + window = g_slist_nth_data (application->windows, nth); panel_application_plugin_insert (application, window, gtk_widget_get_screen (GTK_WIDGET (window)), plugin_name, -1, arguments, -1); } else { - /* print warning */ - g_warning (_("The plugin (%s) you want to add is not " - "recognized by the panel."), plugin_name); + g_warning ("The plugin \"%s\" you want to add is not " + "known by the panel", plugin_name); } } @@ -1194,12 +1161,12 @@ panel_application_new_window (PanelApplication *application, /* create panel window */ window = panel_window_new (); - /* realize */ + /* realize, else some properties do not apply */ gtk_widget_realize (window); /* monitor window destruction */ g_signal_connect (G_OBJECT (window), "destroy", - G_CALLBACK (panel_application_window_destroyed), application); + G_CALLBACK (panel_application_window_destroyed), application); /* put on the correct screen */ gtk_window_set_screen (GTK_WINDOW (window), screen ? screen : gdk_screen_get_default ()); @@ -1278,8 +1245,8 @@ panel_application_get_window_index (PanelApplication *application, PanelWindow * -panel_application_get_window (PanelApplication *application, - guint idx) +panel_application_get_nth_window (PanelApplication *application, + guint idx) { panel_return_val_if_fail (PANEL_IS_APPLICATION (application), 0); @@ -1290,16 +1257,15 @@ panel_application_get_window (PanelApplication *application, void panel_application_window_select (PanelApplication *application, - gint nth) + PanelWindow *window) { GSList *li; - gint n; panel_return_if_fail (PANEL_IS_APPLICATION (application)); /* update state for all windows */ - for (li = application->windows, n = 0; li != NULL; li = li->next, n++) - g_object_set (G_OBJECT (li->data), "active", !!(n == nth), NULL); + for (li = application->windows; li != NULL; li = li->next) + g_object_set (G_OBJECT (li->data), "active", window == li->data, NULL); } @@ -1316,10 +1282,8 @@ panel_application_windows_sensitive (PanelApplication *application, /* walk the windows */ for (li = application->windows; li != NULL; li = li->next) { - /* get the window itembar */ - itembar = gtk_bin_get_child (GTK_BIN (li->data)); - /* set sensitivity of the itembar (and the plugins) */ + itembar = gtk_bin_get_child (GTK_BIN (li->data)); gtk_widget_set_sensitive (itembar, sensitive); /* block autohide for all windows */ diff --git a/panel/panel-application.h b/panel/panel-application.h index d8f85aa..ffb7b39 100644 --- a/panel/panel-application.h +++ b/panel/panel-application.h @@ -63,11 +63,11 @@ guint panel_application_get_n_windows (PanelApplication *applic gint panel_application_get_window_index (PanelApplication *application, PanelWindow *window); -PanelWindow *panel_application_get_window (PanelApplication *application, +PanelWindow *panel_application_get_nth_window (PanelApplication *application, guint idx); void panel_application_window_select (PanelApplication *application, - gint nth); + PanelWindow *window); void panel_application_windows_sensitive (PanelApplication *application, gboolean sensitive); diff --git a/panel/panel-dbus-service.c b/panel/panel-dbus-service.c index fd65121..9fd85e5 100644 --- a/panel/panel-dbus-service.c +++ b/panel/panel-dbus-service.c @@ -171,7 +171,7 @@ panel_dbus_service_display_preferences_dialog (PanelDBusService *service, /* show the preferences dialog */ application = panel_application_get (); - panel_preferences_dialog_show (panel_application_get_window (application, active)); + panel_preferences_dialog_show (panel_application_get_nth_window (application, active)); g_object_unref (G_OBJECT (application)); return TRUE; @@ -191,8 +191,7 @@ panel_dbus_service_display_items_dialog (PanelDBusService *service, /* show the items dialog */ application = panel_application_get (); - panel_application_window_select (application, (gint) active); - panel_item_dialog_show (NULL); + panel_item_dialog_show (panel_application_get_nth_window (application, active)); g_object_unref (G_OBJECT (application)); return TRUE; diff --git a/panel/panel-dialogs.c b/panel/panel-dialogs.c index 68d677a..694cf48 100644 --- a/panel/panel-dialogs.c +++ b/panel/panel-dialogs.c @@ -73,14 +73,16 @@ static void panel_dialogs_choose_panel_combo_changed (GtkComboBox *combo, PanelApplication *application) { - gint active; + gint idx; + PanelWindow *window; panel_return_if_fail (PANEL_IS_APPLICATION (application)); panel_return_if_fail (GTK_IS_COMBO_BOX (combo)); /* select active panel */ - active = gtk_combo_box_get_active (combo); - panel_application_window_select (application, active); + idx = gtk_combo_box_get_active (combo); + window = panel_application_get_nth_window (application, idx); + panel_application_window_select (application, window); } @@ -143,7 +145,7 @@ panel_dialogs_choose_panel (PanelApplication *application) gtk_widget_destroy (dialog); /* remove the panel selection */ - panel_application_window_select (application, -1); + panel_application_window_select (application, NULL); return response; } diff --git a/panel/panel-item-dialog.c b/panel/panel-item-dialog.c index 7f0d3e9..e0393d3 100644 --- a/panel/panel-item-dialog.c +++ b/panel/panel-item-dialog.c @@ -310,7 +310,7 @@ panel_item_dialog_response (GtkDialog *gtk_dialog, else { if (!panel_preferences_dialog_visible ()) - panel_application_window_select (dialog->application, -1); + panel_application_window_select (dialog->application, NULL); gtk_widget_destroy (GTK_WIDGET (gtk_dialog)); } @@ -714,9 +714,12 @@ panel_item_dialog_text_renderer (GtkTreeViewColumn *column, void -panel_item_dialog_show (GdkScreen *screen) +panel_item_dialog_show (PanelWindow *window) { - panel_return_if_fail (screen == NULL || GDK_IS_SCREEN (screen)); + GdkScreen *screen; + PanelApplication *application; + + panel_return_if_fail (window == NULL || PANEL_IS_WINDOW (window)); if (G_LIKELY (dialog_singleton == NULL)) { @@ -726,8 +729,19 @@ panel_item_dialog_show (GdkScreen *screen) } /* show the dialog on the same screen as the panel */ - if (G_UNLIKELY (screen == NULL)) - screen = gdk_screen_get_default (); + if (G_UNLIKELY (window != NULL)) + { + /* set the active panel */ + application = panel_application_get (); + panel_application_window_select (application, window); + g_object_unref (G_OBJECT (application)); + + screen = gtk_window_get_screen (GTK_WINDOW (window)); + } + else + { + screen = gdk_screen_get_default (); + } gtk_window_set_screen (GTK_WINDOW (dialog_singleton), screen); /* show the dialog */ diff --git a/panel/panel-item-dialog.h b/panel/panel-item-dialog.h index f8209e9..526be18 100644 --- a/panel/panel-item-dialog.h +++ b/panel/panel-item-dialog.h @@ -35,7 +35,7 @@ typedef struct _PanelItemDialog PanelItemDialog; GType panel_item_dialog_get_type (void) G_GNUC_CONST; -void panel_item_dialog_show (GdkScreen *screen); +void panel_item_dialog_show (PanelWindow *window); gboolean panel_item_dialog_visible (void); diff --git a/panel/panel-preferences-dialog.c b/panel/panel-preferences-dialog.c index 0977c08..8fdeaf5 100644 --- a/panel/panel-preferences-dialog.c +++ b/panel/panel-preferences-dialog.c @@ -241,7 +241,7 @@ panel_preferences_dialog_finalize (GObject *object) /* deselect all windows */ if (!panel_item_dialog_visible ()) - panel_application_window_select (dialog->application, -1); + panel_application_window_select (dialog->application, NULL); /* release the application */ g_object_unref (G_OBJECT (dialog->application)); @@ -531,8 +531,8 @@ panel_preferences_dialog_panel_combobox_changed (GtkComboBox *combobo /* set the selected window */ nth = gtk_combo_box_get_active (combobox); - dialog->active = panel_application_get_window (dialog->application, nth); - panel_application_window_select (dialog->application, nth); + dialog->active = panel_application_get_nth_window (dialog->application, nth); + panel_application_window_select (dialog->application, dialog->active); if (G_LIKELY (dialog->active != NULL)) { @@ -882,7 +882,7 @@ panel_preferences_dialog_item_add (GtkWidget *button, panel_return_if_fail (PANEL_IS_PREFERENCES_DIALOG (dialog)); /* show the items dialog */ - panel_item_dialog_show (gtk_widget_get_screen (button)); + panel_item_dialog_show (dialog->active); } @@ -1009,7 +1009,7 @@ panel_preferences_dialog_show (PanelWindow *active) if (G_LIKELY (active)) idx = panel_application_get_window_index (dialog_singleton->application, active); else - active = panel_application_get_window (dialog_singleton->application, idx); + active = panel_application_get_nth_window (dialog_singleton->application, idx); /* get the active screen */ if (active != NULL) diff --git a/panel/panel-window.c b/panel/panel-window.c index cbf13d3..26189fc 100644 --- a/panel/panel-window.c +++ b/panel/panel-window.c @@ -1982,16 +1982,10 @@ panel_window_menu_deactivate (GtkMenu *menu, static void panel_window_menu_add_items (PanelWindow *window) { - gint nth; - PanelApplication *application; - panel_return_if_fail (PANEL_IS_WINDOW (window)); - application = panel_application_get (); - nth = panel_application_get_window_index (application, window); - panel_application_window_select (application, nth); - g_object_unref (G_OBJECT (application)); - panel_item_dialog_show (gtk_widget_get_screen (GTK_WIDGET (window))); + /* show the item dialog */ + panel_item_dialog_show (window); } _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits