|
Packit |
d370c2 |
/*
|
|
Packit |
d370c2 |
* Copyright © 2013 Christian Persch
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* This program is free software: you can redistribute it and/or modify
|
|
Packit |
d370c2 |
* it under the terms of the GNU General Public License as published by
|
|
Packit |
d370c2 |
* the Free Software Foundation, either version 3 of the License, or
|
|
Packit |
d370c2 |
* (at your option) any later version.
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
d370c2 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
d370c2 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
d370c2 |
* GNU General Public License for more details.
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
d370c2 |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
#include "config.h"
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
#include "terminal-settings-list.h"
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
#include <string.h>
|
|
Packit |
d370c2 |
#include <uuid.h>
|
|
Packit |
d370c2 |
#include <dconf.h>
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
#define G_SETTINGS_ENABLE_BACKEND
|
|
Packit |
d370c2 |
#include <gio/gsettingsbackend.h>
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
#include "terminal-type-builtins.h"
|
|
Packit |
d370c2 |
#include "terminal-schemas.h"
|
|
Packit |
d370c2 |
#include "terminal-debug.h"
|
|
Packit |
d370c2 |
#include "terminal-libgsystem.h"
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
struct _TerminalSettingsList {
|
|
Packit |
d370c2 |
GSettings parent;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
char *path;
|
|
Packit |
d370c2 |
char *child_schema_id;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
char **uuids;
|
|
Packit |
d370c2 |
char *default_uuid;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
GHashTable *children;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
TerminalSettingsListFlags flags;
|
|
Packit |
d370c2 |
};
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
struct _TerminalSettingsListClass {
|
|
Packit |
d370c2 |
GSettingsClass parent;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
void (* children_changed) (TerminalSettingsList *list);
|
|
Packit |
d370c2 |
void (* default_changed) (TerminalSettingsList *list);
|
|
Packit |
d370c2 |
};
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
enum {
|
|
Packit |
d370c2 |
PROP_CHILD_SCHEMA_ID = 1,
|
|
Packit |
d370c2 |
PROP_FLAGS
|
|
Packit |
d370c2 |
};
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
enum {
|
|
Packit |
d370c2 |
SIGNAL_CHILDREN_CHANGED,
|
|
Packit |
d370c2 |
SIGNAL_DEFAULT_CHANGED,
|
|
Packit |
d370c2 |
N_SIGNALS
|
|
Packit |
d370c2 |
};
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static guint signals[N_SIGNALS];
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static void
|
|
Packit |
d370c2 |
strv_printerr (char **strv)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
char **p;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (strv == NULL) {
|
|
Packit |
d370c2 |
g_printerr ("(null)");
|
|
Packit |
d370c2 |
return;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
for (p = strv; *p; p++)
|
|
Packit |
d370c2 |
g_printerr ("%s'%s'", p != strv ? ", " : "", *p);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static char **
|
|
Packit |
d370c2 |
strv_sort (char **strv)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
// FIXMEchpe
|
|
Packit |
d370c2 |
return strv;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static gboolean
|
|
Packit |
d370c2 |
strv_equal (char **a,
|
|
Packit |
d370c2 |
char **b)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
char **e, **f;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (a == NULL || b == NULL)
|
|
Packit |
d370c2 |
return a == b;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
for (e = a, f = b; *e && *f; e++, f++) {
|
|
Packit |
d370c2 |
if (!g_str_equal (*e, *f))
|
|
Packit |
d370c2 |
return FALSE;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return *e == *f;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static int
|
|
Packit |
d370c2 |
strv_find (char **strv,
|
|
Packit |
d370c2 |
const char *str)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
int i;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (strv == NULL || str == NULL)
|
|
Packit |
d370c2 |
return -1;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
for (i = 0; strv[i]; i++) {
|
|
Packit |
d370c2 |
if (!g_str_equal (strv[i], str))
|
|
Packit |
d370c2 |
continue;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return i;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return -1;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static char **
|
|
Packit |
d370c2 |
strv_dupv_insert (char **strv,
|
|
Packit |
d370c2 |
const char *str)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
char **nstrv, **p, **q;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (strv == NULL) {
|
|
Packit |
d370c2 |
char *s[2] = { (char *) str, NULL };
|
|
Packit |
d370c2 |
return g_strdupv (s);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/* Is it already in the list? */
|
|
Packit |
d370c2 |
for (p = strv; *p; p++)
|
|
Packit |
d370c2 |
if (g_str_equal (*p, str))
|
|
Packit |
d370c2 |
return g_strdupv (strv);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/* Not found; append */
|
|
Packit |
d370c2 |
nstrv = g_new (char *, (p - strv) + 2);
|
|
Packit |
d370c2 |
for (p = strv, q = nstrv; *p; p++, q++)
|
|
Packit |
d370c2 |
*q = g_strdup (*p);
|
|
Packit |
d370c2 |
*q++ = g_strdup (str);
|
|
Packit |
d370c2 |
*q = NULL;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return strv_sort (nstrv);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static char **
|
|
Packit |
d370c2 |
strv_dupv_remove (char **strv,
|
|
Packit |
d370c2 |
const char *str)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
char **nstrv, **p, **q;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (strv == NULL)
|
|
Packit |
d370c2 |
return NULL;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
nstrv = g_strdupv (strv);
|
|
Packit |
d370c2 |
for (p = q = nstrv; *p; p++) {
|
|
Packit |
d370c2 |
if (!g_str_equal (*p, str))
|
|
Packit |
d370c2 |
*q++ = *p;
|
|
Packit |
d370c2 |
else
|
|
Packit |
d370c2 |
g_free (*p);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
*q = NULL;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return nstrv;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
gboolean
|
|
Packit |
d370c2 |
terminal_settings_list_valid_uuid (const char *str)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
uuid_t u;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (str == NULL)
|
|
Packit |
d370c2 |
return FALSE;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return uuid_parse ((char *) str, u) == 0;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static gboolean
|
|
Packit |
d370c2 |
settings_backend_is_dconf (void)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
gs_unref_object GSettingsBackend *backend;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
backend = g_settings_backend_get_default ();
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return g_str_equal (G_OBJECT_TYPE_NAME (backend), "DConfSettingsBackend");
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static char *
|
|
Packit |
d370c2 |
new_list_entry (void)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
uuid_t u;
|
|
Packit |
d370c2 |
char name[37];
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
uuid_generate (u);
|
|
Packit |
d370c2 |
uuid_unparse (u, name);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return g_strdup (name);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static gboolean
|
|
Packit |
d370c2 |
validate_list (TerminalSettingsList *list,
|
|
Packit |
d370c2 |
char **entries)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
gboolean allow_empty = (list->flags & TERMINAL_SETTINGS_LIST_FLAG_ALLOW_EMPTY) != 0;
|
|
Packit |
d370c2 |
guint i;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (entries == NULL)
|
|
Packit |
d370c2 |
return allow_empty;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
for (i = 0; entries[i]; i++) {
|
|
Packit |
d370c2 |
if (!terminal_settings_list_valid_uuid (entries[i]))
|
|
Packit |
d370c2 |
return FALSE;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return (i > 0) || allow_empty;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static gboolean
|
|
Packit |
d370c2 |
list_map_func (GVariant *value,
|
|
Packit |
d370c2 |
gpointer *result,
|
|
Packit |
d370c2 |
gpointer user_data)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
TerminalSettingsList *list = user_data;
|
|
Packit |
d370c2 |
gs_strfreev char **entries;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
entries = strv_sort (g_variant_dup_strv (value, NULL));
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (validate_list (list, entries)) {
|
|
Packit |
d370c2 |
gs_transfer_out_value(result, &entries);
|
|
Packit |
d370c2 |
return TRUE;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return FALSE;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static char *
|
|
Packit |
d370c2 |
path_new (TerminalSettingsList *list,
|
|
Packit |
d370c2 |
const char *uuid)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
return g_strdup_printf ("%s:%s/", list->path, uuid);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static GSettings *
|
|
Packit |
d370c2 |
terminal_settings_list_ref_child_internal (TerminalSettingsList *list,
|
|
Packit |
d370c2 |
const char *uuid)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
GSettings *child;
|
|
Packit |
d370c2 |
gs_free char *path = NULL;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (strv_find (list->uuids, uuid) == -1)
|
|
Packit |
d370c2 |
return NULL;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
_terminal_debug_print (TERMINAL_DEBUG_SETTINGS_LIST,
|
|
Packit |
d370c2 |
"%s UUID %s\n", G_STRFUNC, uuid);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
child = g_hash_table_lookup (list->children, uuid);
|
|
Packit |
d370c2 |
if (child)
|
|
Packit |
d370c2 |
goto done;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
path = path_new (list, uuid);
|
|
Packit |
d370c2 |
child = g_settings_new_with_path (list->child_schema_id, path);
|
|
Packit |
d370c2 |
g_hash_table_insert (list->children, g_strdup (uuid), child /* adopted */);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
done:
|
|
Packit |
d370c2 |
return g_object_ref (child);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static char *
|
|
Packit |
d370c2 |
new_child (TerminalSettingsList *list,
|
|
Packit |
d370c2 |
const char *name)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
char *new_uuid = new_list_entry ();
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (name != NULL) {
|
|
Packit |
d370c2 |
gs_free char *new_path = path_new (list, new_uuid);
|
|
Packit |
d370c2 |
gs_unref_object GSettings *child = g_settings_new_with_path (list->child_schema_id, new_path);
|
|
Packit |
d370c2 |
g_settings_set_string (child, TERMINAL_PROFILE_VISIBLE_NAME_KEY, name);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return new_uuid;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static char *
|
|
Packit |
d370c2 |
clone_child (TerminalSettingsList *list,
|
|
Packit |
d370c2 |
const char *uuid,
|
|
Packit |
d370c2 |
const char *name)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
char *new_uuid;
|
|
Packit |
d370c2 |
gs_free char *path;
|
|
Packit |
d370c2 |
gs_free char *new_path;
|
|
Packit |
d370c2 |
char **keys;
|
|
Packit |
d370c2 |
guint i;
|
|
Packit |
d370c2 |
gs_unref_object DConfClient *client;
|
|
Packit |
d370c2 |
DConfChangeset *changeset;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
new_uuid = new_list_entry ();
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
_terminal_debug_print (TERMINAL_DEBUG_SETTINGS_LIST,
|
|
Packit |
d370c2 |
"%s UUID %s NEW UUID %s \n", G_STRFUNC, uuid ? uuid : "(null)", new_uuid);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
path = path_new (list, uuid);
|
|
Packit |
d370c2 |
new_path = path_new (list, new_uuid);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
client = dconf_client_new ();
|
|
Packit |
d370c2 |
changeset = dconf_changeset_new ();
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/* FIXME: this is beyond ugly. Need API on GSettingsSchema to list all the keys! */
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
gs_unref_object GSettings *dummy = g_settings_new_with_path (list->child_schema_id, "/foo/");
|
|
Packit |
d370c2 |
keys = g_settings_list_keys (dummy);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
for (i = 0; keys[i]; i++) {
|
|
Packit |
d370c2 |
gs_free char *rkey;
|
|
Packit |
d370c2 |
gs_unref_variant GVariant *value;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
rkey = g_strconcat (path, keys[i], NULL);
|
|
Packit |
d370c2 |
value = dconf_client_read (client, rkey);
|
|
Packit |
d370c2 |
if (value) {
|
|
Packit |
d370c2 |
gs_free char *wkey;
|
|
Packit |
d370c2 |
wkey = g_strconcat (new_path, keys[i], NULL);
|
|
Packit |
d370c2 |
dconf_changeset_set (changeset, wkey, value);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (name != NULL) {
|
|
Packit |
d370c2 |
GVariant *value;
|
|
Packit |
d370c2 |
value = g_variant_new_string (name);
|
|
Packit |
d370c2 |
if (value) {
|
|
Packit |
d370c2 |
gs_free char *wkey;
|
|
Packit |
d370c2 |
wkey = g_strconcat (new_path, TERMINAL_PROFILE_VISIBLE_NAME_KEY, NULL);
|
|
Packit |
d370c2 |
dconf_changeset_set (changeset, wkey, value);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
dconf_client_change_sync (client, changeset, NULL, NULL, NULL);
|
|
Packit |
d370c2 |
dconf_changeset_unref (changeset);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return new_uuid;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static char *
|
|
Packit |
d370c2 |
terminal_settings_list_add_child_internal (TerminalSettingsList *list,
|
|
Packit |
d370c2 |
const char *uuid,
|
|
Packit |
d370c2 |
const char *name)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
char *new_uuid;
|
|
Packit |
d370c2 |
gs_strfreev char **new_uuids;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (uuid && settings_backend_is_dconf ())
|
|
Packit |
d370c2 |
new_uuid = clone_child (list, uuid, name);
|
|
Packit |
d370c2 |
else
|
|
Packit |
d370c2 |
new_uuid = new_child (list, name);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
_terminal_debug_print (TERMINAL_DEBUG_SETTINGS_LIST,
|
|
Packit |
d370c2 |
"%s NEW UUID %s\n", G_STRFUNC, new_uuid);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
new_uuids = strv_dupv_insert (list->uuids, new_uuid);
|
|
Packit |
d370c2 |
g_settings_set_strv (&list->parent, TERMINAL_SETTINGS_LIST_LIST_KEY,
|
|
Packit |
d370c2 |
(const char * const *) new_uuids);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return new_uuid;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static void
|
|
Packit |
d370c2 |
terminal_settings_list_remove_child_internal (TerminalSettingsList *list,
|
|
Packit |
d370c2 |
const char *uuid)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
gs_strfreev char **new_uuids;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
_terminal_debug_print (TERMINAL_DEBUG_SETTINGS_LIST,
|
|
Packit |
d370c2 |
"%s UUID %s\n", G_STRFUNC, uuid);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
new_uuids = strv_dupv_remove (list->uuids, uuid);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if ((new_uuids == NULL || new_uuids[0] == NULL) &&
|
|
Packit |
d370c2 |
(list->flags & TERMINAL_SETTINGS_LIST_FLAG_ALLOW_EMPTY) == 0)
|
|
Packit |
d370c2 |
return;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
g_settings_set_strv (&list->parent, TERMINAL_SETTINGS_LIST_LIST_KEY, (const char * const *) new_uuids);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (list->default_uuid != NULL &&
|
|
Packit |
d370c2 |
g_str_equal (list->default_uuid, uuid))
|
|
Packit |
d370c2 |
g_settings_set_string (&list->parent, TERMINAL_SETTINGS_LIST_DEFAULT_KEY, "");
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/* Now we unset all keys under the child */
|
|
Packit |
d370c2 |
if (settings_backend_is_dconf ()) {
|
|
Packit |
d370c2 |
gs_free char *path;
|
|
Packit |
d370c2 |
gs_unref_object DConfClient *client;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
path = path_new (list, uuid);
|
|
Packit |
d370c2 |
client = dconf_client_new ();
|
|
Packit |
d370c2 |
dconf_client_write_sync (client, path, NULL, NULL, NULL, NULL);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static void
|
|
Packit |
d370c2 |
terminal_settings_list_update_list (TerminalSettingsList *list)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
char **uuids, *uuid;
|
|
Packit |
d370c2 |
GSettings *child;
|
|
Packit |
d370c2 |
GHashTable *new_children;
|
|
Packit |
d370c2 |
guint i;
|
|
Packit |
d370c2 |
gboolean changed;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
uuids = g_settings_get_mapped (&list->parent,
|
|
Packit |
d370c2 |
TERMINAL_SETTINGS_LIST_LIST_KEY,
|
|
Packit |
d370c2 |
list_map_func, list);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
_TERMINAL_DEBUG_IF (TERMINAL_DEBUG_SETTINGS_LIST) {
|
|
Packit |
d370c2 |
g_printerr ("%s: current UUIDs [", G_STRFUNC);
|
|
Packit |
d370c2 |
strv_printerr (list->uuids);
|
|
Packit |
d370c2 |
g_printerr ("]\n new UUIDs [");
|
|
Packit |
d370c2 |
strv_printerr (uuids);
|
|
Packit |
d370c2 |
g_printerr ("]\n");
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (strv_equal (uuids, list->uuids) &&
|
|
Packit |
d370c2 |
((list->flags & TERMINAL_SETTINGS_LIST_FLAG_HAS_DEFAULT) == 0 ||
|
|
Packit |
d370c2 |
strv_find (list->uuids, list->default_uuid) != -1)) {
|
|
Packit |
d370c2 |
g_strfreev (uuids);
|
|
Packit |
d370c2 |
return;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
new_children = g_hash_table_new_full (g_str_hash, g_str_equal,
|
|
Packit |
d370c2 |
(GDestroyNotify) g_free,
|
|
Packit |
d370c2 |
(GDestroyNotify) g_object_unref);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (uuids) {
|
|
Packit |
d370c2 |
for (i = 0; uuids[i] != NULL; i++) {
|
|
Packit |
d370c2 |
uuid = uuids[i];
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
child = g_hash_table_lookup (list->children, uuid);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (child) {
|
|
Packit |
d370c2 |
g_object_ref (child);
|
|
Packit |
d370c2 |
g_hash_table_remove (list->children, uuid);
|
|
Packit |
d370c2 |
g_hash_table_insert (new_children, g_strdup (uuid), child /* adopted */);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
changed = !strv_equal (uuids, list->uuids);
|
|
Packit |
d370c2 |
} else {
|
|
Packit |
d370c2 |
changed = g_strv_length (list->uuids) != 0;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
g_hash_table_unref (list->children);
|
|
Packit |
d370c2 |
list->children = new_children;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
g_strfreev (list->uuids);
|
|
Packit |
d370c2 |
list->uuids = uuids; /* adopts */
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (changed)
|
|
Packit |
d370c2 |
g_signal_emit (list, signals[SIGNAL_CHILDREN_CHANGED], 0);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static void
|
|
Packit |
d370c2 |
terminal_settings_list_update_default (TerminalSettingsList *list)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
if ((list->flags & TERMINAL_SETTINGS_LIST_FLAG_HAS_DEFAULT) == 0)
|
|
Packit |
d370c2 |
return;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
g_free (list->default_uuid);
|
|
Packit |
d370c2 |
list->default_uuid = g_settings_get_string (&list->parent,
|
|
Packit |
d370c2 |
TERMINAL_SETTINGS_LIST_DEFAULT_KEY);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
_terminal_debug_print (TERMINAL_DEBUG_SETTINGS_LIST,
|
|
Packit |
d370c2 |
"%s new default UUID %s\n", G_STRFUNC, list->default_uuid);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
g_signal_emit (list, signals[SIGNAL_DEFAULT_CHANGED], 0);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
G_DEFINE_TYPE (TerminalSettingsList, terminal_settings_list, G_TYPE_SETTINGS);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static void
|
|
Packit |
d370c2 |
terminal_settings_list_changed (GSettings *list_settings,
|
|
Packit |
d370c2 |
const char *key)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
TerminalSettingsList *list = TERMINAL_SETTINGS_LIST (list_settings);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
_terminal_debug_print (TERMINAL_DEBUG_SETTINGS_LIST,
|
|
Packit |
d370c2 |
"%s key %s", G_STRFUNC, key ? key : "(null)");
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (key == NULL ||
|
|
Packit |
d370c2 |
g_str_equal (key, TERMINAL_SETTINGS_LIST_LIST_KEY)) {
|
|
Packit |
d370c2 |
terminal_settings_list_update_list (list);
|
|
Packit |
d370c2 |
terminal_settings_list_update_default (list);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (key == NULL)
|
|
Packit |
d370c2 |
return;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (g_str_equal (key, TERMINAL_SETTINGS_LIST_DEFAULT_KEY)) {
|
|
Packit |
d370c2 |
terminal_settings_list_update_default (list);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static void
|
|
Packit |
d370c2 |
terminal_settings_list_init (TerminalSettingsList *list)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
list->flags = TERMINAL_SETTINGS_LIST_FLAG_NONE;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static void
|
|
Packit |
d370c2 |
terminal_settings_list_constructed (GObject *object)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
TerminalSettingsList *list = TERMINAL_SETTINGS_LIST (object);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
G_OBJECT_CLASS (terminal_settings_list_parent_class)->constructed (object);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
g_assert (list->child_schema_id != NULL);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
g_object_get (object, "path", &list->path, NULL);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
list->children = g_hash_table_new_full (g_str_hash, g_str_equal,
|
|
Packit |
d370c2 |
(GDestroyNotify) g_free,
|
|
Packit |
d370c2 |
(GDestroyNotify) g_object_unref);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
terminal_settings_list_changed (&list->parent, NULL);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static void
|
|
Packit |
d370c2 |
terminal_settings_list_finalize (GObject *object)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
TerminalSettingsList *list = TERMINAL_SETTINGS_LIST (object);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
g_free (list->path);
|
|
Packit |
d370c2 |
g_free (list->child_schema_id);
|
|
Packit |
d370c2 |
g_strfreev (list->uuids);
|
|
Packit |
d370c2 |
g_free (list->default_uuid);
|
|
Packit |
d370c2 |
g_hash_table_unref (list->children);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
G_OBJECT_CLASS (terminal_settings_list_parent_class)->finalize (object);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static void
|
|
Packit |
d370c2 |
terminal_settings_list_set_property (GObject *object,
|
|
Packit |
d370c2 |
guint prop_id,
|
|
Packit |
d370c2 |
const GValue *value,
|
|
Packit |
d370c2 |
GParamSpec *pspec)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
TerminalSettingsList *list = TERMINAL_SETTINGS_LIST (object);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
switch (prop_id) {
|
|
Packit |
d370c2 |
case PROP_CHILD_SCHEMA_ID:
|
|
Packit |
d370c2 |
list->child_schema_id = g_value_dup_string (value);
|
|
Packit |
d370c2 |
break;
|
|
Packit |
d370c2 |
case PROP_FLAGS:
|
|
Packit |
d370c2 |
list->flags = g_value_get_flags (value);
|
|
Packit |
d370c2 |
break;
|
|
Packit |
d370c2 |
default:
|
|
Packit |
d370c2 |
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
Packit |
d370c2 |
break;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static void
|
|
Packit |
d370c2 |
terminal_settings_list_class_init (TerminalSettingsListClass *klass)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
|
Packit |
d370c2 |
GSettingsClass *settings_class = G_SETTINGS_CLASS (klass);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
object_class->set_property = terminal_settings_list_set_property;
|
|
Packit |
d370c2 |
object_class->constructed = terminal_settings_list_constructed;
|
|
Packit |
d370c2 |
object_class->finalize = terminal_settings_list_finalize;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* TerminalSettingsList:child-schema-id:
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* The name of the schema of the children of this list.
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
g_object_class_install_property (object_class, PROP_CHILD_SCHEMA_ID,
|
|
Packit |
d370c2 |
g_param_spec_string ("child-schema-id", NULL,NULL,
|
|
Packit |
d370c2 |
NULL,
|
|
Packit |
d370c2 |
G_PARAM_CONSTRUCT_ONLY |
|
|
Packit |
d370c2 |
G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* TerminalSettingsList:flags:
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Flags from #TerminalSettingsListFlags.
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
g_object_class_install_property (object_class, PROP_FLAGS,
|
|
Packit |
d370c2 |
g_param_spec_flags ("flags", NULL,NULL,
|
|
Packit |
d370c2 |
TERMINAL_TYPE_SETTINGS_LIST_FLAGS,
|
|
Packit |
d370c2 |
TERMINAL_SETTINGS_LIST_FLAG_NONE,
|
|
Packit |
d370c2 |
G_PARAM_CONSTRUCT_ONLY |
|
|
Packit |
d370c2 |
G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* TerminalSettingsList::children-changed:
|
|
Packit |
d370c2 |
* @list: the object on which the signal was emitted
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* The "children-changed" signal is emitted when the list of children
|
|
Packit |
d370c2 |
* has potentially changed.
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
signals[SIGNAL_CHILDREN_CHANGED] =
|
|
Packit |
d370c2 |
g_signal_new ("children-changed", TERMINAL_TYPE_SETTINGS_LIST,
|
|
Packit |
d370c2 |
G_SIGNAL_RUN_LAST,
|
|
Packit |
d370c2 |
G_STRUCT_OFFSET (TerminalSettingsListClass, children_changed),
|
|
Packit |
d370c2 |
NULL, NULL,
|
|
Packit |
d370c2 |
g_cclosure_marshal_VOID__VOID,
|
|
Packit |
d370c2 |
G_TYPE_NONE,
|
|
Packit |
d370c2 |
0);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* TerminalSettingsList::default-changed:
|
|
Packit |
d370c2 |
* @list: the object on which the signal was emitted
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* The "default-changed" signal is emitted when the default child
|
|
Packit |
d370c2 |
* has potentially changed.
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
signals[SIGNAL_DEFAULT_CHANGED] =
|
|
Packit |
d370c2 |
g_signal_new ("default-changed", TERMINAL_TYPE_SETTINGS_LIST,
|
|
Packit |
d370c2 |
G_SIGNAL_RUN_LAST,
|
|
Packit |
d370c2 |
G_STRUCT_OFFSET (TerminalSettingsListClass, default_changed),
|
|
Packit |
d370c2 |
NULL, NULL,
|
|
Packit |
d370c2 |
g_cclosure_marshal_VOID__VOID,
|
|
Packit |
d370c2 |
G_TYPE_NONE,
|
|
Packit |
d370c2 |
0);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
settings_class->changed = terminal_settings_list_changed;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* terminal_settings_list_new:
|
|
Packit |
d370c2 |
* @path: the settings path for the list
|
|
Packit |
d370c2 |
* @schema_id: the schema of the list, equal to or derived from "org.gnome.Terminal.SettingsList"
|
|
Packit |
d370c2 |
* @child_schema_id: the schema of the list children
|
|
Packit |
d370c2 |
* @flags: list flags
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Returns: (transfer full): the newly created #TerminalSettingsList
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
TerminalSettingsList *
|
|
Packit |
d370c2 |
terminal_settings_list_new (const char *path,
|
|
Packit |
d370c2 |
const char *schema_id,
|
|
Packit |
d370c2 |
const char *child_schema_id,
|
|
Packit |
d370c2 |
TerminalSettingsListFlags flags)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
g_return_val_if_fail (path != NULL, NULL);
|
|
Packit |
d370c2 |
g_return_val_if_fail (schema_id != NULL, NULL);
|
|
Packit |
d370c2 |
g_return_val_if_fail (child_schema_id != NULL, NULL);
|
|
Packit |
d370c2 |
g_return_val_if_fail (g_str_has_suffix (path, ":/"), NULL);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return g_object_new (TERMINAL_TYPE_SETTINGS_LIST,
|
|
Packit |
d370c2 |
"schema-id", schema_id,
|
|
Packit |
d370c2 |
"child-schema-id", child_schema_id,
|
|
Packit |
d370c2 |
"path", path,
|
|
Packit |
d370c2 |
"flags", flags,
|
|
Packit |
d370c2 |
NULL);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* terminal_settings_list_dupv_children:
|
|
Packit |
d370c2 |
* @list: a #TerminalSettingsList
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Returns: (transfer full): the UUIDs of the children in the settings list, or %NULL
|
|
Packit |
d370c2 |
* if the list is empty
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
char **
|
|
Packit |
d370c2 |
terminal_settings_list_dupv_children (TerminalSettingsList *list)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
g_return_val_if_fail (TERMINAL_IS_SETTINGS_LIST (list), NULL);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return g_strdupv (list->uuids);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* terminal_settings_list_dup_default_child:
|
|
Packit |
d370c2 |
* @list: a #TerminalSettingsList
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Returns: (transfer full): the UUID of the default child in the settings list
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
char *
|
|
Packit |
d370c2 |
terminal_settings_list_dup_default_child (TerminalSettingsList *list)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
g_return_val_if_fail (TERMINAL_IS_SETTINGS_LIST (list), NULL);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if ((list->flags & TERMINAL_SETTINGS_LIST_FLAG_HAS_DEFAULT) == 0)
|
|
Packit |
d370c2 |
return NULL;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if ((strv_find (list->uuids, list->default_uuid)) != -1)
|
|
Packit |
d370c2 |
return g_strdup (list->default_uuid);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/* Just randomly designate the first child as default, but don't write that
|
|
Packit |
d370c2 |
* to dconf.
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
if (list->uuids == NULL || list->uuids[0] == NULL) {
|
|
Packit |
d370c2 |
g_warn_if_fail ((list->flags & TERMINAL_SETTINGS_LIST_FLAG_ALLOW_EMPTY));
|
|
Packit |
d370c2 |
return NULL;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return g_strdup (list->uuids[0]);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* terminal_settings_list_has_child:
|
|
Packit |
d370c2 |
* @list: a #TerminalSettingsList
|
|
Packit |
d370c2 |
* @uuid: the UUID of a list child
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Returns: %TRUE iff the child with @uuid exists
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
gboolean
|
|
Packit |
d370c2 |
terminal_settings_list_has_child (TerminalSettingsList *list,
|
|
Packit |
d370c2 |
const char *uuid)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
g_return_val_if_fail (TERMINAL_IS_SETTINGS_LIST (list), FALSE);
|
|
Packit |
d370c2 |
g_return_val_if_fail (terminal_settings_list_valid_uuid (uuid), FALSE);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return strv_find (list->uuids, uuid) != -1;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* terminal_settings_list_ref_child:
|
|
Packit |
d370c2 |
* @list: a #TerminalSettingsList
|
|
Packit |
d370c2 |
* @uuid: the UUID of a list child
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Returns the child #GSettings for the list child with UUID @uuid, or %NULL
|
|
Packit |
d370c2 |
* if @list has no such child.
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Returns: (transfer full): a reference to the #GSettings for the child, or %NULL
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
GSettings *
|
|
Packit |
d370c2 |
terminal_settings_list_ref_child (TerminalSettingsList *list,
|
|
Packit |
d370c2 |
const char *uuid)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
g_return_val_if_fail (TERMINAL_IS_SETTINGS_LIST (list), NULL);
|
|
Packit |
d370c2 |
g_return_val_if_fail (terminal_settings_list_valid_uuid (uuid), NULL);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return terminal_settings_list_ref_child_internal (list, uuid);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* terminal_settings_list_ref_children:
|
|
Packit |
d370c2 |
* @list: a #TerminalSettingsList
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Returns the list of children #GSettings or @list.
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Returns: (transfer full): a list of child #GSettings of @list
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
GList *
|
|
Packit |
d370c2 |
terminal_settings_list_ref_children (TerminalSettingsList *list)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
GList *l;
|
|
Packit |
d370c2 |
guint i;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
g_return_val_if_fail (TERMINAL_IS_SETTINGS_LIST (list), NULL);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (list->uuids == NULL)
|
|
Packit |
d370c2 |
return NULL;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
l = NULL;
|
|
Packit |
d370c2 |
for (i = 0; list->uuids[i]; i++)
|
|
Packit |
d370c2 |
l = g_list_prepend (l, terminal_settings_list_ref_child (list, list->uuids[i]));
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return g_list_reverse (l);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* terminal_settings_list_ref_default_child:
|
|
Packit |
d370c2 |
* @list: a #TerminalSettingsList
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Returns the default child #GSettings for the list, or %NULL if @list has no
|
|
Packit |
d370c2 |
* children.
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Returns: (transfer full): a reference to the #GSettings for the default child, or %NULL
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
GSettings *
|
|
Packit |
d370c2 |
terminal_settings_list_ref_default_child (TerminalSettingsList *list)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
gs_free char *uuid = NULL;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
g_return_val_if_fail (TERMINAL_IS_SETTINGS_LIST (list), NULL);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
uuid = terminal_settings_list_dup_default_child (list);
|
|
Packit |
d370c2 |
if (uuid == NULL)
|
|
Packit |
d370c2 |
return NULL;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return terminal_settings_list_ref_child_internal (list, uuid);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* terminal_settings_list_add_child:
|
|
Packit |
d370c2 |
* @list: a #TerminalSettingsList
|
|
Packit |
d370c2 |
* @name: the name of the new profile
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Adds a new child to the list, and returns a reference to its #GSettings.
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Returns: (transfer full): the UUID of new child
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
char *
|
|
Packit |
d370c2 |
terminal_settings_list_add_child (TerminalSettingsList *list,
|
|
Packit |
d370c2 |
const char *name)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
g_return_val_if_fail (TERMINAL_IS_SETTINGS_LIST (list), NULL);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return terminal_settings_list_add_child_internal (list, NULL, name);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* terminal_settings_list_clone_child:
|
|
Packit |
d370c2 |
* @list: a #TerminalSettingsList
|
|
Packit |
d370c2 |
* @uuid: the UUID of the child to clone
|
|
Packit |
d370c2 |
* @name: the name of the new child
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Adds a new child to the list, and returns a reference to its #GSettings.
|
|
Packit |
d370c2 |
* All keys of the new child will have the same value as @uuid's.
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Returns: (transfer full): the UUID of new child
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
char *
|
|
Packit |
d370c2 |
terminal_settings_list_clone_child (TerminalSettingsList *list,
|
|
Packit |
d370c2 |
const char *uuid,
|
|
Packit |
d370c2 |
const char *name)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
g_return_val_if_fail (TERMINAL_IS_SETTINGS_LIST (list), NULL);
|
|
Packit |
d370c2 |
g_return_val_if_fail (terminal_settings_list_valid_uuid (uuid), NULL);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return terminal_settings_list_add_child_internal (list, uuid, name);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* terminal_settings_list_remove_child:
|
|
Packit |
d370c2 |
* @list: a #TerminalSettingsList
|
|
Packit |
d370c2 |
* @uuid: the UUID of a list child
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Removes the child with UUID @uuid from the list.
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
void
|
|
Packit |
d370c2 |
terminal_settings_list_remove_child (TerminalSettingsList *list,
|
|
Packit |
d370c2 |
const char *uuid)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
g_return_if_fail (TERMINAL_IS_SETTINGS_LIST (list));
|
|
Packit |
d370c2 |
g_return_if_fail (terminal_settings_list_valid_uuid (uuid));
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
terminal_settings_list_remove_child_internal (list, uuid);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* terminal_settings_list_dup_uuid_from_child:
|
|
Packit |
d370c2 |
* @list: a #TerminalSettingsList
|
|
Packit |
d370c2 |
* @child: a #GSettings of a child in the list
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Returns the UUID of @child in the list, or %NULL if @child is not in the list.
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Returns: (transfer full): the UUID of the child in the settings list, or %NULL
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
char *
|
|
Packit |
d370c2 |
terminal_settings_list_dup_uuid_from_child (TerminalSettingsList *list,
|
|
Packit |
d370c2 |
GSettings *child)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
gs_free char *path;
|
|
Packit |
d370c2 |
char *p;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
g_return_val_if_fail (TERMINAL_IS_SETTINGS_LIST (list), NULL);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
g_object_get (child, "path", &path, NULL);
|
|
Packit |
d370c2 |
g_return_val_if_fail (g_str_has_prefix (path, list->path), NULL);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
p = path + strlen (list->path);
|
|
Packit |
d370c2 |
g_return_val_if_fail (p[0] == ':', NULL);
|
|
Packit |
d370c2 |
p++;
|
|
Packit |
d370c2 |
g_return_val_if_fail (strlen (p) == 37, NULL);
|
|
Packit |
d370c2 |
g_return_val_if_fail (p[36] == '/', NULL);
|
|
Packit |
d370c2 |
p[36] = '\0';
|
|
Packit |
d370c2 |
g_assert (terminal_settings_list_valid_uuid (p));
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return g_strdup (p);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* terminal_settings_list_get_set_default_child:
|
|
Packit |
d370c2 |
* @list: a #TerminalSettingsList
|
|
Packit |
d370c2 |
* @uuid: the UUID of a child in the list
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Sets @uuid as the default child.
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
void
|
|
Packit |
d370c2 |
terminal_settings_list_set_default_child (TerminalSettingsList *list,
|
|
Packit |
d370c2 |
const char *uuid)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
g_return_if_fail (TERMINAL_IS_SETTINGS_LIST (list));
|
|
Packit |
d370c2 |
g_return_if_fail (terminal_settings_list_valid_uuid (uuid));
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (!terminal_settings_list_has_child (list, uuid))
|
|
Packit |
d370c2 |
return;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
g_settings_set_string (&list->parent, TERMINAL_SETTINGS_LIST_DEFAULT_KEY, uuid);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* terminal_settings_list_foreach_child:
|
|
Packit |
d370c2 |
* @list: a #TerminalSettingsList
|
|
Packit |
d370c2 |
* @callback: a #TerminalSettingsListForeachFunc
|
|
Packit |
d370c2 |
* @user_data: user data for @callback
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Calls @callback for each child of @list.
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* NOTE: No changes to @list must be made from @callback.
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
void
|
|
Packit |
d370c2 |
terminal_settings_list_foreach_child (TerminalSettingsList *list,
|
|
Packit |
d370c2 |
TerminalSettingsListForeachFunc callback,
|
|
Packit |
d370c2 |
gpointer user_data)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
g_return_if_fail (TERMINAL_IS_SETTINGS_LIST (list));
|
|
Packit |
d370c2 |
g_return_if_fail (callback);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
for (char **p = list->uuids; *p; p++) {
|
|
Packit |
d370c2 |
const char *uuid = *p;
|
|
Packit |
d370c2 |
gs_unref_object GSettings *child = terminal_settings_list_ref_child_internal (list, uuid);
|
|
Packit |
d370c2 |
if (child != NULL)
|
|
Packit |
d370c2 |
callback (list, uuid, child, user_data);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* terminal_settings_list_foreach_child:
|
|
Packit |
d370c2 |
* @list: a #TerminalSettingsList
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Returns: the number of children of @list.
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
guint
|
|
Packit |
d370c2 |
terminal_settings_list_get_n_children (TerminalSettingsList *list)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
g_return_val_if_fail (TERMINAL_IS_SETTINGS_LIST (list), 0);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return g_hash_table_size (list->children);
|
|
Packit |
d370c2 |
}
|