|
Packit |
d370c2 |
/*
|
|
Packit |
d370c2 |
* Copyright © 2001, 2002 Havoc Pennington
|
|
Packit |
d370c2 |
* Copyright © 2002 Red Hat, Inc.
|
|
Packit |
d370c2 |
* Copyright © 2002 Sun Microsystems
|
|
Packit |
d370c2 |
* Copyright © 2003 Mariano Suarez-Alvarez
|
|
Packit |
d370c2 |
* Copyright © 2011, 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-profiles-list.h"
|
|
Packit |
d370c2 |
#include "terminal-schemas.h"
|
|
Packit |
d370c2 |
#include "terminal-libgsystem.h"
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
#include <string.h>
|
|
Packit |
d370c2 |
#include <uuid.h>
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/* Counts occurrences of @str in @strv */
|
|
Packit |
d370c2 |
static guint
|
|
Packit |
d370c2 |
strv_contains (char **strv,
|
|
Packit |
d370c2 |
const char *str,
|
|
Packit |
d370c2 |
guint *idx)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
guint n, i;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (strv == NULL)
|
|
Packit |
d370c2 |
return 0;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
n = 0;
|
|
Packit |
d370c2 |
for (i = 0; strv[i]; i++) {
|
|
Packit |
d370c2 |
if (strcmp (strv[i], str) == 0) {
|
|
Packit |
d370c2 |
n++;
|
|
Packit |
d370c2 |
if (idx)
|
|
Packit |
d370c2 |
*idx = i;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return n;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static gboolean
|
|
Packit |
d370c2 |
valid_uuid (const char *str,
|
|
Packit |
d370c2 |
GError **error)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
if (terminal_settings_list_valid_uuid (str))
|
|
Packit |
d370c2 |
return TRUE;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
|
|
Packit |
d370c2 |
"\"%s\" is not a valid UUID", str);
|
|
Packit |
d370c2 |
return FALSE;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* terminal_profiles_list_new:
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Returns: (transfer full): a new #TerminalSettingsList for the profiles list
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
TerminalSettingsList *
|
|
Packit |
d370c2 |
terminal_profiles_list_new (void)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
return terminal_settings_list_new (TERMINAL_PROFILES_PATH_PREFIX,
|
|
Packit |
d370c2 |
TERMINAL_PROFILES_LIST_SCHEMA,
|
|
Packit |
d370c2 |
TERMINAL_PROFILE_SCHEMA,
|
|
Packit |
d370c2 |
TERMINAL_SETTINGS_LIST_FLAG_HAS_DEFAULT);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
static void
|
|
Packit |
d370c2 |
get_profile_names (TerminalSettingsList *list,
|
|
Packit |
d370c2 |
char ***profilesp,
|
|
Packit |
d370c2 |
char ***namesp)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
char **profiles, **names;
|
|
Packit |
d370c2 |
guint i, n;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
*profilesp = profiles = terminal_settings_list_dupv_children (list);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
n = g_strv_length (profiles);
|
|
Packit |
d370c2 |
*namesp = names = g_new0 (char *, n + 1);
|
|
Packit |
d370c2 |
for (i = 0; i < n; i++) {
|
|
Packit |
d370c2 |
gs_unref_object GSettings *profile;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
profile = terminal_settings_list_ref_child (list, profiles[i]);
|
|
Packit |
d370c2 |
names[i] = g_settings_get_string (profile, TERMINAL_PROFILE_VISIBLE_NAME_KEY);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
names[n] = NULL;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* terminal_profiles_list_ref_children_sorted:
|
|
Packit |
d370c2 |
* @list:
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Returns: (transfer full):
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
GList *
|
|
Packit |
d370c2 |
terminal_profiles_list_ref_children_sorted (TerminalSettingsList *list)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
return g_list_sort (terminal_settings_list_ref_children (list),
|
|
Packit |
d370c2 |
terminal_profiles_compare);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* terminal_profiles_list_dup_uuid:
|
|
Packit |
d370c2 |
* @list:
|
|
Packit |
d370c2 |
* @uuid: (allow-none):
|
|
Packit |
d370c2 |
* @error:
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Returns: (transfer full): the UUID of the profile specified by @uuid, or %NULL
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
char *
|
|
Packit |
d370c2 |
terminal_profiles_list_dup_uuid (TerminalSettingsList *list,
|
|
Packit |
d370c2 |
const char *uuid,
|
|
Packit |
d370c2 |
GError **error)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
char *rv;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (uuid == NULL) {
|
|
Packit |
d370c2 |
rv = terminal_settings_list_dup_default_child (list);
|
|
Packit |
d370c2 |
if (rv == NULL)
|
|
Packit |
d370c2 |
goto err;
|
|
Packit |
d370c2 |
return rv;
|
|
Packit |
d370c2 |
} else if (!valid_uuid (uuid, error))
|
|
Packit |
d370c2 |
return NULL;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (terminal_settings_list_has_child (list, uuid))
|
|
Packit |
d370c2 |
return g_strdup (uuid);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
err:
|
|
Packit |
d370c2 |
g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
|
|
Packit |
d370c2 |
"No profile with UUID \"%s\" exists", uuid);
|
|
Packit |
d370c2 |
return NULL;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* terminal_profiles_list_ref_profile_by_uuid_or_name:
|
|
Packit |
d370c2 |
* @list:
|
|
Packit |
d370c2 |
* @uuid:
|
|
Packit |
d370c2 |
* @error:
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Returns: (transfer full): the profile #GSettings specified by @uuid, or %NULL
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
GSettings *
|
|
Packit |
d370c2 |
terminal_profiles_list_ref_profile_by_uuid (TerminalSettingsList *list,
|
|
Packit |
d370c2 |
const char *uuid,
|
|
Packit |
d370c2 |
GError **error)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
gs_free char *profile_uuid;
|
|
Packit |
d370c2 |
GSettings *profile;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
profile_uuid = terminal_profiles_list_dup_uuid (list, uuid, error);
|
|
Packit |
d370c2 |
if (profile_uuid == NULL)
|
|
Packit |
d370c2 |
return NULL;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
profile = terminal_settings_list_ref_child (list, profile_uuid);
|
|
Packit |
d370c2 |
return profile;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* terminal_profiles_list_get_profile_by_uuid:
|
|
Packit |
d370c2 |
* @list:
|
|
Packit |
d370c2 |
* @uuid: (allow-none):
|
|
Packit |
d370c2 |
* @error:
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Returns: (transfer full): the UUID of the profile specified by @uuid, or %NULL
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
char *
|
|
Packit |
d370c2 |
terminal_profiles_list_dup_uuid_or_name (TerminalSettingsList *list,
|
|
Packit |
d370c2 |
const char *uuid_or_name,
|
|
Packit |
d370c2 |
GError **error)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
char **profiles, **profile_names;
|
|
Packit |
d370c2 |
char *rv;
|
|
Packit |
d370c2 |
guint n, i;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
rv = terminal_profiles_list_dup_uuid (list, uuid_or_name, NULL);
|
|
Packit |
d370c2 |
if (rv != NULL)
|
|
Packit |
d370c2 |
return rv;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/* Not found as UUID; try finding a profile with this string as 'visible-name' */
|
|
Packit |
d370c2 |
get_profile_names (list, &profiles, &profile_names);
|
|
Packit |
d370c2 |
n = strv_contains (profile_names, uuid_or_name, &i);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (n == 0) {
|
|
Packit |
d370c2 |
g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
|
|
Packit |
d370c2 |
"No profile with UUID or name \"%s\" exists", uuid_or_name);
|
|
Packit |
d370c2 |
rv = NULL;
|
|
Packit |
d370c2 |
} else if (n != 1) {
|
|
Packit |
d370c2 |
g_set_error (error, G_OPTION_ERROR, G_OPTION_ERROR_BAD_VALUE,
|
|
Packit |
d370c2 |
"No profile with UUID \"%s\" found and name is ambiguous", uuid_or_name);
|
|
Packit |
d370c2 |
rv = NULL;
|
|
Packit |
d370c2 |
} else {
|
|
Packit |
d370c2 |
rv = g_strdup (profiles[i]);
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
g_strfreev (profiles);
|
|
Packit |
d370c2 |
g_strfreev (profile_names);
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
return rv;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
/**
|
|
Packit |
d370c2 |
* terminal_profiles_list_ref_profile_by_uuid_or_name:
|
|
Packit |
d370c2 |
* @list:
|
|
Packit |
d370c2 |
* @uuid:
|
|
Packit |
d370c2 |
* @error:
|
|
Packit |
d370c2 |
*
|
|
Packit |
d370c2 |
* Returns: (transfer full): the profile #GSettings specified by @uuid, or %NULL
|
|
Packit |
d370c2 |
*/
|
|
Packit |
d370c2 |
GSettings *
|
|
Packit |
d370c2 |
terminal_profiles_list_ref_profile_by_uuid_or_name (TerminalSettingsList *list,
|
|
Packit |
d370c2 |
const char *uuid_or_name,
|
|
Packit |
d370c2 |
GError **error)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
gs_free char *uuid;
|
|
Packit |
d370c2 |
GSettings *profile;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
uuid = terminal_profiles_list_dup_uuid_or_name (list, uuid_or_name, error);
|
|
Packit |
d370c2 |
if (uuid == NULL)
|
|
Packit |
d370c2 |
return NULL;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
profile = terminal_settings_list_ref_child (list, uuid);
|
|
Packit |
d370c2 |
g_assert (profile != NULL);
|
|
Packit |
d370c2 |
return profile;
|
|
Packit |
d370c2 |
}
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
int
|
|
Packit |
d370c2 |
terminal_profiles_compare (gconstpointer pa,
|
|
Packit |
d370c2 |
gconstpointer pb)
|
|
Packit |
d370c2 |
{
|
|
Packit |
d370c2 |
GSettings *a = (GSettings *) pa;
|
|
Packit |
d370c2 |
GSettings *b = (GSettings *) pb;
|
|
Packit |
d370c2 |
gs_free char *na = NULL;
|
|
Packit |
d370c2 |
gs_free char *nb = NULL;
|
|
Packit |
d370c2 |
gs_free char *patha = NULL;
|
|
Packit |
d370c2 |
gs_free char *pathb = NULL;
|
|
Packit |
d370c2 |
int result;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
if (pa == pb)
|
|
Packit |
d370c2 |
return 0;
|
|
Packit |
d370c2 |
if (pa == NULL)
|
|
Packit |
d370c2 |
return 1;
|
|
Packit |
d370c2 |
if (pb == NULL)
|
|
Packit |
d370c2 |
return -1;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
na = g_settings_get_string (a, TERMINAL_PROFILE_VISIBLE_NAME_KEY);
|
|
Packit |
d370c2 |
nb = g_settings_get_string (b, TERMINAL_PROFILE_VISIBLE_NAME_KEY);
|
|
Packit |
d370c2 |
result = g_utf8_collate (na, nb);
|
|
Packit |
d370c2 |
if (result != 0)
|
|
Packit |
d370c2 |
return result;
|
|
Packit |
d370c2 |
|
|
Packit |
d370c2 |
g_object_get (a, "path", &patha, NULL);
|
|
Packit |
d370c2 |
g_object_get (b, "path", &pathb, NULL);
|
|
Packit |
d370c2 |
return strcmp (patha, pathb);
|
|
Packit |
d370c2 |
}
|