void panel_layout_toplevel_create (GdkScreen *screen) { char *unique_id; char *path; GSettings *settings; PanelOrientation orientation; int monitor; unique_id = panel_layout_find_free_id (PANEL_LAYOUT_TOPLEVEL_ID_LIST_KEY, PANEL_TOPLEVEL_SCHEMA, PANEL_LAYOUT_TOPLEVEL_PATH, NULL); path = g_strdup_printf ("%s%s/", PANEL_LAYOUT_TOPLEVEL_PATH, unique_id); settings = g_settings_new_with_path (PANEL_TOPLEVEL_SCHEMA, path); g_free (path); if (panel_toplevel_find_empty_spot (screen, &orientation, &monitor)) { g_settings_set_enum (settings, PANEL_TOPLEVEL_ORIENTATION_KEY, orientation); g_settings_set_int (settings, PANEL_TOPLEVEL_MONITOR_KEY, monitor); } g_object_unref (settings); panel_gsettings_append_strv (layout_settings, PANEL_LAYOUT_TOPLEVEL_ID_LIST_KEY, unique_id); g_free (unique_id); }
char * panel_layout_object_create_start (PanelObjectType type, const char *type_detail, const char *toplevel_id, PanelObjectPackType pack_type, int pack_index, GSettings **settings) { char *unique_id; char *path; GSettings *settings_object; char *iid; if (settings) *settings = NULL; iid = panel_object_type_to_iid (type, type_detail); if (!iid) return NULL; unique_id = panel_layout_find_free_id (PANEL_LAYOUT_OBJECT_ID_LIST_KEY, PANEL_OBJECT_SCHEMA, PANEL_LAYOUT_OBJECT_PATH, NULL, -1); path = g_strdup_printf ("%s%s/", PANEL_LAYOUT_OBJECT_PATH, unique_id); settings_object = g_settings_new_with_path (PANEL_OBJECT_SCHEMA, path); g_free (path); g_settings_set_string (settings_object, PANEL_OBJECT_IID_KEY, iid); g_settings_set_string (settings_object, PANEL_OBJECT_TOPLEVEL_ID_KEY, toplevel_id); g_settings_set_enum (settings_object, PANEL_OBJECT_PACK_TYPE_KEY, pack_type); g_settings_set_int (settings_object, PANEL_OBJECT_PACK_INDEX_KEY, pack_index); g_free (iid); if (settings) *settings = settings_object; else g_object_unref (settings_object); return unique_id; }
static gboolean panel_layout_append_group_helper (GKeyFile *keyfile, const char *group, int set_screen_to, const char *group_prefix, const char *id_list_key, const char *schema, const char *path_prefix, const char *default_prefix, PanelLayoutKeyDefinition *key_definitions, int key_definitions_len, gboolean dry_run, GError **error, const char *type_for_error_message) { gboolean retval = FALSE; gboolean appending_object; const char *id; char *unique_id = NULL; char *path = NULL; GSettings *settings = NULL; char **keyfile_keys = NULL; char *value_str; int value_int; gboolean value_boolean; int i, j; g_return_val_if_fail (error == NULL || *error == NULL, FALSE); appending_object = (g_strcmp0 (schema, PANEL_OBJECT_SCHEMA) == 0); /* Try to extract an id from the group, by stripping the prefix, * and create a unique id out of that */ id = group + strlen (group_prefix); while (g_ascii_isspace (*id)) id++; if (!*id) id = NULL; if (id && !panel_gsettings_is_valid_keyname (id, error)) return FALSE; unique_id = panel_layout_find_free_id (id_list_key, schema, path_prefix, id, set_screen_to); path = g_strdup_printf ("%s%s/", path_prefix, unique_id); settings = g_settings_new_with_path (schema, path); g_free (path); /* Check that what the code knows matches what the schemas say */ if (!panel_layout_append_self_check (settings, key_definitions, key_definitions_len, error)) goto out; keyfile_keys = g_key_file_get_keys (keyfile, group, NULL, error); if (!keyfile_keys) goto out; /* Now do the real work: we validate/add keys from the keyfile */ for (i = 0; keyfile_keys[i] != NULL; i++) { gboolean found = FALSE; /* special case keys of the instance config of an object */ if (appending_object) { gboolean handled; if (!panel_layout_maybe_append_object_instance_config ( keyfile, group, keyfile_keys[i], path_prefix, unique_id, dry_run, &handled, error)) goto out; if (handled) continue; } for (j = 0; j < key_definitions_len; j++) { if (g_strcmp0 (keyfile_keys[i], key_definitions[j].name) == 0) { found = TRUE; break; } } if (!found) { g_set_error (error, PANEL_LAYOUT_ERROR, 0, "Unknown key '%s' for %s", keyfile_keys[i], type_for_error_message); return FALSE; } switch (key_definitions[j].type) { case G_TYPE_STRING: value_str = g_key_file_get_string ( keyfile, group, keyfile_keys[i], error); if (!value_str) goto out; if (!dry_run) g_settings_set_string (settings, key_definitions[j].name, value_str); g_free (value_str); break; case G_TYPE_INT: value_int = g_key_file_get_integer ( keyfile, group, keyfile_keys[i], error); if (error && *error) goto out; if (!dry_run) g_settings_set_int (settings, key_definitions[j].name, value_int); break; case G_TYPE_BOOLEAN: value_boolean = g_key_file_get_boolean ( keyfile, group, keyfile_keys[i], error); if (error && *error) goto out; if (!dry_run) g_settings_set_boolean (settings, key_definitions[j].name, value_boolean); break; default: g_assert_not_reached (); break; } } if (!dry_run) { if (set_screen_to != -1 && g_strcmp0 (schema, PANEL_TOPLEVEL_SCHEMA) == 0) g_settings_set_int (settings, PANEL_TOPLEVEL_SCREEN_KEY, set_screen_to); panel_gsettings_append_strv (layout_settings, id_list_key, unique_id); } retval = TRUE; out: if (keyfile_keys) g_strfreev (keyfile_keys); if (settings) g_object_unref (settings); if (unique_id) g_free (unique_id); return retval; }
char * panel_layout_object_create_start (PanelObjectType type, const char *type_detail, const char *toplevel_id, PanelObjectPackType pack_type, int pack_index, GVariant *initial_settings, GSettings **settings) { char *unique_id; char *path; GSettings *settings_object; char *iid; char *try_id; if (settings) *settings = NULL; iid = panel_object_type_to_iid (type, type_detail); if (!iid) return NULL; try_id = panel_layout_object_generate_id (iid); unique_id = panel_layout_find_free_id (PANEL_LAYOUT_OBJECT_ID_LIST_KEY, PANEL_OBJECT_SCHEMA, PANEL_LAYOUT_OBJECT_PATH, try_id); path = g_strdup_printf ("%s%s/", PANEL_LAYOUT_OBJECT_PATH, unique_id); settings_object = g_settings_new_with_path (PANEL_OBJECT_SCHEMA, path); g_free (path); g_settings_set_string (settings_object, PANEL_OBJECT_IID_KEY, iid); g_settings_set_string (settings_object, PANEL_OBJECT_TOPLEVEL_ID_KEY, toplevel_id); g_settings_set_enum (settings_object, PANEL_OBJECT_PACK_TYPE_KEY, pack_type); g_settings_set_int (settings_object, PANEL_OBJECT_PACK_INDEX_KEY, pack_index); if (initial_settings != NULL) { GSettings *tmp; path = g_strdup_printf ("%s%s/initial-settings/", PANEL_LAYOUT_OBJECT_PATH, unique_id); tmp = g_settings_new_with_path ("org.gnome.gnome-panel.applet.initial-settings", path); g_free (path); g_settings_set_value (tmp, "settings", initial_settings); g_object_unref (tmp); } g_free (try_id); g_free (iid); if (settings) *settings = settings_object; else g_object_unref (settings_object); return unique_id; }