Blame src/terminal-profiles-list.c

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
}