Updating branch refs/heads/master to f0b084486e981518b19eaa978df3615e3c250738 (commit) from 6196070242a05a7f208f2b59fb7b5b5b3e4441ae (commit)
commit f0b084486e981518b19eaa978df3615e3c250738 Author: Nick Schermer <n...@xfce.org> Date: Thu Dec 29 17:32:45 2011 +0100 Panel: Only save what is required. Also remove auto save from the session mananger and improve what is saved. panel/main.c | 22 ----- panel/panel-application.c | 210 +++++++++++++++++++++++++++----------------- panel/panel-application.h | 12 +++- panel/panel-dbus-service.c | 2 +- 4 files changed, 143 insertions(+), 103 deletions(-) diff --git a/panel/main.c b/panel/main.c index e5d7839..44ebf3c 100644 --- a/panel/main.c +++ b/panel/main.c @@ -61,7 +61,6 @@ static gboolean opt_version = FALSE; static gboolean opt_disable_wm_check = FALSE; static gchar *opt_plugin_event = NULL; static gchar **opt_arguments = NULL; -static gboolean sm_client_saved_state = FALSE; @@ -156,23 +155,6 @@ panel_sm_client_quit (XfceSMClient *sm_client) static void -panel_sm_client_save_state (XfceSMClient *sm_client, - PanelApplication *application) -{ - panel_return_if_fail (XFCE_IS_SM_CLIENT (sm_client)); - panel_return_if_fail (PANEL_IS_APPLICATION (application)); - - panel_debug (PANEL_DEBUG_MAIN, - "save configuration for session manager"); - - panel_application_save (application, TRUE); - - sm_client_saved_state = TRUE; -} - - - -static void panel_debug_notify_proxy (void) { gchar *path; @@ -349,10 +331,6 @@ main (gint argc, gchar **argv) application = panel_application_get (); panel_application_load (application, opt_disable_wm_check); - /* save the state before the quit signal if we can, this is a bit safer */ - g_signal_connect (G_OBJECT (sm_client), "save-state", - G_CALLBACK (panel_sm_client_save_state), application); - /* open dialog if we started from launch_panel */ if (opt_preferences >= 0) panel_preferences_dialog_show_from_id (opt_preferences); diff --git a/panel/panel-application.c b/panel/panel-application.c index 4ea4074..c064a6d 100644 --- a/panel/panel-application.c +++ b/panel/panel-application.c @@ -96,6 +96,9 @@ static void panel_application_drag_leave (GtkWidget *w GdkDragContext *context, guint drag_time, PanelApplication *application); +static void panel_application_save_window (PanelApplication *application, + PanelWindow *window, + PanelSaveTypes save_types); @@ -828,8 +831,8 @@ panel_application_window_destroyed (GtkWidget *window, xfconf_channel_reset_property (application->xfconf, property, TRUE); g_free (property); - /* schedule a save to store the new number of panels */ - panel_application_save (application, FALSE); + /* save updated panel ids */ + panel_application_save (application, SAVE_PANEL_IDS); /* quit if there are no windows */ /* TODO, allow removing all windows and ask user what to do */ @@ -889,6 +892,7 @@ panel_application_drag_data_received (PanelWindow *window, PanelApplication *application; GtkWidget *provider; gboolean succeed = FALSE; + gboolean save_application = FALSE; const gchar *name; guint old_position; gchar **uris; @@ -979,6 +983,9 @@ panel_application_drag_data_received (PanelWindow *window, /* send all the needed panel information to the plugin */ panel_window_set_povider_info (window, provider, TRUE); + + /* moved between panels, save everything */ + save_application = TRUE; } /* everything went fine */ @@ -1008,9 +1015,11 @@ panel_application_drag_data_received (PanelWindow *window, break; } - /* save the panel configuration if we succeeded */ - if (G_LIKELY (succeed)) - panel_application_save (application, FALSE); + /* save the new plugin ids */ + if (G_LIKELY (save_application)) + panel_application_save (application, SAVE_PLUGIN_IDS); + else if (succeed) + panel_application_save_window (application, window, SAVE_PLUGIN_IDS); /* tell the peer that we handled the drop */ gtk_drag_finish (context, succeed, FALSE, drag_time); @@ -1166,6 +1175,89 @@ panel_application_window_id_exists (PanelApplication *application, +static void +panel_application_save_window (PanelApplication *application, + PanelWindow *window, + PanelSaveTypes save_types) +{ + GList *children, *lp; + GtkWidget *itembar; + XfcePanelPluginProvider *provider; + gchar buf[50]; + XfconfChannel *channel = application->xfconf; + GPtrArray *array = NULL; + GValue *value; + gint plugin_id; + gint panel_id; + + /* skip this window if it is locked */ + if (panel_window_get_locked (window) + || !PANEL_HAS_FLAG (save_types, SAVE_PLUGIN_IDS | SAVE_PLUGIN_PROVIDERS)) + return; + + panel_id = panel_window_get_id (window); + panel_debug (PANEL_DEBUG_APPLICATION, + "saving /panels/panel-%d: ids=%s, providers=%s", + panel_id, + PANEL_DEBUG_BOOL (PANEL_HAS_FLAG (save_types, SAVE_PLUGIN_IDS)), + PANEL_DEBUG_BOOL (PANEL_HAS_FLAG (save_types, SAVE_PLUGIN_PROVIDERS))); + + /* get the itembar children */ + itembar = gtk_bin_get_child (GTK_BIN (window)); + children = gtk_container_get_children (GTK_CONTAINER (itembar)); + + /* only cleanup and continue if there are no children */ + if (PANEL_HAS_FLAG (save_types, SAVE_PLUGIN_IDS)) + { + if (G_UNLIKELY (children == NULL)) + { + g_snprintf (buf, sizeof (buf), "/panels/panel-%d/plugin-ids", panel_id); + if (xfconf_channel_has_property (channel, buf)) + xfconf_channel_reset_property (channel, buf, FALSE); + return; + } + + array = g_ptr_array_new (); + } + + /* walk all the plugin children */ + for (lp = children; lp != NULL; lp = lp->next) + { + provider = XFCE_PANEL_PLUGIN_PROVIDER (lp->data); + + if (array != NULL) + { + plugin_id = xfce_panel_plugin_provider_get_unique_id (provider); + + /* add plugin id to the array */ + value = g_new0 (GValue, 1); + g_value_init (value, G_TYPE_INT); + g_value_set_int (value, plugin_id); + g_ptr_array_add (array, value); + + /* make sure the plugin type-name is store in the plugin item */ + g_snprintf (buf, sizeof (buf), "/plugins/plugin-%d", plugin_id); + xfconf_channel_set_string (channel, buf, xfce_panel_plugin_provider_get_name (provider)); + } + + /* ask the plugin to save */ + if (PANEL_HAS_FLAG (save_types, SAVE_PLUGIN_PROVIDERS)) + xfce_panel_plugin_provider_save (provider); + } + + if (array != NULL) + { + /* store the plugin ids for this panel */ + g_snprintf (buf, sizeof (buf), "/panels/panel-%d/plugin-ids", panel_id); + xfconf_channel_set_arrayv (channel, buf, array); + xfconf_array_free (array); + } + + g_list_free (children); +} + + + PanelApplication * panel_application_get (void) { @@ -1237,95 +1329,47 @@ panel_application_load (PanelApplication *application, void panel_application_save (PanelApplication *application, - gboolean save_plugin_providers) + PanelSaveTypes save_types) { - GSList *li; - GList *children, *lp; - GtkWidget *itembar; - XfcePanelPluginProvider *provider; - guint i; - gchar buf[50]; - XfconfChannel *channel = application->xfconf; - GPtrArray *array; - GValue *value; - GPtrArray *panels; - gint panel_id; + GSList *li; + XfconfChannel *channel = application->xfconf; + GValue *value; + GPtrArray *panels = NULL; + gint panel_id; panel_return_if_fail (PANEL_IS_APPLICATION (application)); panel_return_if_fail (XFCONF_IS_CHANNEL (channel)); - panels = g_ptr_array_new (); - - for (li = application->windows, i = 0; li != NULL; li = li->next, i++) - { - /* store the panel id */ - value = g_new0 (GValue, 1); - panel_id = panel_window_get_id (li->data); - g_value_init (value, G_TYPE_INT); - g_value_set_int (value, panel_id); - g_ptr_array_add (panels, value); - - /* skip this window if it is locked */ - if (panel_window_get_locked (li->data)) - continue; - - panel_debug (PANEL_DEBUG_APPLICATION, - "saving /panels/panel-%d, save-plugins=%s", - panel_id, PANEL_DEBUG_BOOL (save_plugin_providers)); - - /* get the itembar children */ - itembar = gtk_bin_get_child (GTK_BIN (li->data)); - children = gtk_container_get_children (GTK_CONTAINER (itembar)); - - /* only cleanup and continue if there are no children */ - if (G_UNLIKELY (children == NULL)) - { - g_snprintf (buf, sizeof (buf), "/panels/panel-%d/plugin-ids", panel_id); - if (xfconf_channel_has_property (channel, buf)) - xfconf_channel_reset_property (channel, buf, FALSE); - continue; - } + /* leave if the whole application is locked */ + if (xfconf_channel_is_property_locked (channel, "/panels")) + return; - /* create empty pointer array */ - array = g_ptr_array_new (); + if (PANEL_HAS_FLAG (save_types, SAVE_PANEL_IDS)) + panels = g_ptr_array_new (); - /* walk all the plugin children */ - for (lp = children; lp != NULL; lp = lp->next) + for (li = application->windows; li != NULL; li = li->next) + { + if (panels != NULL) { - provider = XFCE_PANEL_PLUGIN_PROVIDER (lp->data); - - /* add plugin id to the array */ + /* store the panel id */ value = g_new0 (GValue, 1); + panel_id = panel_window_get_id (li->data); g_value_init (value, G_TYPE_INT); - g_value_set_int (value, - xfce_panel_plugin_provider_get_unique_id (provider)); - g_ptr_array_add (array, value); - - /* make sure the plugin type is store in the plugin item */ - g_snprintf (buf, sizeof (buf), "/plugins/plugin-%d", g_value_get_int (value)); - xfconf_channel_set_string (channel, buf, xfce_panel_plugin_provider_get_name (provider)); - - /* ask the plugin to save */ - if (save_plugin_providers) - xfce_panel_plugin_provider_save (provider); + g_value_set_int (value, panel_id); + g_ptr_array_add (panels, value); } - /* store the plugins for this panel */ - g_snprintf (buf, sizeof (buf), "/panels/panel-%d/plugin-ids", panel_id); - xfconf_channel_set_arrayv (channel, buf, array); - - g_list_free (children); - xfconf_array_free (array); + /* save the panel settings */ + panel_application_save_window (application, li->data, save_types); } - /* store the panel ids */ - if (!xfconf_channel_is_property_locked (channel, "/panels")) + if (panels != NULL) { + /* store the panel ids */ if (!xfconf_channel_set_arrayv (channel, "/panels", panels)) g_warning ("Failed to store the number of panels"); + xfconf_array_free (panels); } - - xfconf_array_free (panels); } @@ -1411,9 +1455,13 @@ panel_application_add_new_item (PanelApplication *application, if (window != NULL && !panel_window_get_locked (window)) { /* insert plugin at the end of the panel */ - panel_application_plugin_insert (application, window, - plugin_name, -1, - arguments, -1); + if (panel_application_plugin_insert (application, window, + plugin_name, -1, + arguments, -1)) + { + /* save the new plugin ids */ + panel_application_save_window (application, window, SAVE_PLUGIN_IDS); + } } } else @@ -1509,6 +1557,10 @@ panel_application_new_window (PanelApplication *application, g_free (position); } + /* save the new panel layout */ + if (new_window) + panel_application_save (application, SAVE_PANEL_IDS); + return PANEL_WINDOW (window); } diff --git a/panel/panel-application.h b/panel/panel-application.h index ee1d719..3dcf1b6 100644 --- a/panel/panel-application.h +++ b/panel/panel-application.h @@ -34,6 +34,16 @@ typedef struct _PanelApplication PanelApplication; #define PANEL_IS_APPLICATION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANEL_TYPE_APPLICATION)) #define PANEL_APPLICATION_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PANEL_TYPE_APPLICATION, PanelApplicationClass)) +typedef enum +{ + SAVE_PLUGIN_PROVIDERS = 1 << 1, + SAVE_PLUGIN_IDS = 1 << 2, + SAVE_PANEL_IDS = 1 << 3, +} +PanelSaveTypes; +#define SAVE_EVERYTHING (SAVE_PLUGIN_PROVIDERS | SAVE_PLUGIN_IDS | SAVE_PANEL_IDS) + + GType panel_application_get_type (void) G_GNUC_CONST; PanelApplication *panel_application_get (void); @@ -42,7 +52,7 @@ void panel_application_load (PanelApplication *applic gboolean disable_wm_check); void panel_application_save (PanelApplication *application, - gboolean save_plugin_providers); + PanelSaveTypes save_types); void panel_application_take_dialog (PanelApplication *application, GtkWindow *dialog); diff --git a/panel/panel-dbus-service.c b/panel/panel-dbus-service.c index 955e466..3947c43 100644 --- a/panel/panel-dbus-service.c +++ b/panel/panel-dbus-service.c @@ -230,7 +230,7 @@ panel_dbus_service_save (PanelDBusService *service, /* save the configuration */ application = panel_application_get (); - panel_application_save (application, TRUE); + panel_application_save (application, SAVE_EVERYTHING); g_object_unref (G_OBJECT (application)); return TRUE; _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org https://mail.xfce.org/mailman/listinfo/xfce4-commits