static void panel_layout_append_from_file_real (const char *layout_file, int screen_for_toplevels) { GError *error = NULL; GKeyFile *keyfile = NULL; char **groups = NULL; gboolean found_one = FALSE; int i; panel_layout_init (); keyfile = g_key_file_new (); error = NULL; if (!g_key_file_load_from_file (keyfile, layout_file, G_KEY_FILE_NONE, &error)) goto out; groups = g_key_file_get_groups (keyfile, NULL); /* First pass to validate: we don't want to add only a subset of the * layout; the whole layout has to be valid */ for (i = 0; groups[i] != NULL; i++) { if (!panel_layout_append_group (keyfile, groups[i], screen_for_toplevels, TRUE, &error)) goto out; else found_one = TRUE; } if (!found_one) { error = g_error_new (PANEL_LAYOUT_ERROR, 0, "No defined toplevel or object"); goto out; } /* Second pass to really add the layout. We know there'll be no error * since the first pass worked. */ for (i = 0; groups[i] != NULL; i++) panel_layout_append_group (keyfile, groups[i], screen_for_toplevels, FALSE, NULL); out: if (error) { g_printerr ("Error while parsing default layout from '%s': %s\n", layout_file, error->message); g_error_free (error); } if (groups) g_strfreev (groups); if (keyfile) g_key_file_free (keyfile); }
gboolean panel_layout_load (void) { char **toplevels; char **objects; int i; panel_layout_init (); toplevels = g_settings_get_strv (layout_settings, PANEL_LAYOUT_TOPLEVEL_ID_LIST_KEY); if (!toplevels[0]) { g_strfreev (toplevels); toplevels = panel_layout_load_default (); if (!toplevels) return FALSE; } for (i = 0; toplevels[i] != NULL; i++) panel_layout_load_toplevel (toplevels[i]); g_strfreev (toplevels); objects = g_settings_get_strv (layout_settings, PANEL_LAYOUT_OBJECT_ID_LIST_KEY); for (i = 0; objects[i] != NULL; i++) panel_layout_load_object (objects[i]); g_strfreev (objects); g_signal_connect (layout_settings, "changed", G_CALLBACK (panel_layout_changed), NULL); panel_object_loader_do_load (TRUE); return TRUE; }
gboolean panel_layout_load (void) { char **toplevels; char **objects; int i; panel_layout_init (); toplevels = g_settings_get_strv (layout_settings, PANEL_LAYOUT_TOPLEVEL_ID_LIST_KEY); if (!toplevels[0]) { char *default_layout_file; g_strfreev (toplevels); if (!g_settings_is_writable (layout_settings, PANEL_LAYOUT_TOPLEVEL_ID_LIST_KEY) || !g_settings_is_writable (layout_settings, PANEL_LAYOUT_OBJECT_ID_LIST_KEY)) { g_printerr (_("Cannot create initial panel layout.\n")); return FALSE; } default_layout_file = panel_layout_get_default_layout_file (); panel_layout_append_from_file (default_layout_file); g_free (default_layout_file); toplevels = g_settings_get_strv (layout_settings, PANEL_LAYOUT_TOPLEVEL_ID_LIST_KEY); if (!toplevels[0]) { g_strfreev (toplevels); g_printerr (_("Cannot create initial panel layout.\n")); return FALSE; } } for (i = 0; toplevels[i] != NULL; i++) panel_layout_load_toplevel (toplevels[i]); g_strfreev (toplevels); objects = g_settings_get_strv (layout_settings, PANEL_LAYOUT_OBJECT_ID_LIST_KEY); for (i = 0; objects[i] != NULL; i++) panel_layout_load_object (objects[i]); g_strfreev (objects); g_signal_connect (layout_settings, "changed", G_CALLBACK (panel_layout_changed), NULL); /* This needs to happen after we've loaded the current toplevels (to * know if we have toplevels on all screens), and after we've connected * to the settings changed notifications (to automatically load created * toplevels) */ panel_layout_ensure_toplevel_per_screen (); panel_object_loader_do_load (TRUE); return TRUE; }