Blame src/migration.c

Packit d370c2
/*
Packit d370c2
 * Copyright © 2011, 2012, 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 <stdlib.h>
Packit d370c2
#include <unistd.h>
Packit d370c2
#include <locale.h>
Packit d370c2
Packit d370c2
#include <glib.h>
Packit d370c2
#include <glib/gi18n.h>
Packit d370c2
#include <gconf/gconf-client.h>
Packit d370c2
#include <dconf.h>
Packit d370c2
#include <vte/vte.h>
Packit d370c2
Packit d370c2
#define G_SETTINGS_ENABLE_BACKEND
Packit d370c2
#include <gio/gsettingsbackend.h>
Packit d370c2
Packit d370c2
#include "terminal-schemas.h"
Packit d370c2
#include "terminal-profiles-list.h"
Packit d370c2
#include "terminal-type-builtins.h"
Packit d370c2
#include "terminal-debug.h"
Packit d370c2
#include "terminal-libgsystem.h"
Packit d370c2
Packit d370c2
static gboolean clean = FALSE;
Packit d370c2
static gboolean dry_run = FALSE;
Packit d370c2
static gboolean force = FALSE;
Packit d370c2
static gboolean verbose = FALSE;
Packit d370c2
Packit d370c2
static const GOptionEntry options[] = {
Packit d370c2
  { "clean", 0, 0, G_OPTION_ARG_NONE, &clean, NULL, NULL },
Packit d370c2
  { "dry-run", 0, 0, G_OPTION_ARG_NONE, &dry_run, NULL, NULL },
Packit d370c2
  { "force", 0, 0, G_OPTION_ARG_NONE, &force, NULL, NULL },
Packit d370c2
  { "verbose", 0, 0, G_OPTION_ARG_NONE, &verbose, NULL, NULL },
Packit d370c2
  { NULL }
Packit d370c2
};
Packit d370c2
Packit d370c2
#define ERROR_DOMAIN (g_intern_static_string ("gnome-terminal-migration-error"))
Packit d370c2
Packit d370c2
#define TERMINAL_PATH_PREFIX "/org/gnome/terminal/"
Packit d370c2
Packit d370c2
enum {
Packit d370c2
  ERROR_GENERIC
Packit d370c2
};
Packit d370c2
Packit d370c2
#define GCONF_PREFIX           "/apps/gnome-terminal"
Packit d370c2
#define GCONF_GLOBAL_PREFIX    GCONF_PREFIX "/global"
Packit d370c2
#define GCONF_PROFILES_PREFIX  GCONF_PREFIX "/profiles"
Packit d370c2
Packit d370c2
#define KEY_ALLOW_BOLD "allow_bold"
Packit d370c2
#define KEY_BACKGROUND_COLOR "background_color"
Packit d370c2
#define KEY_BACKGROUND_DARKNESS "background_darkness"
Packit d370c2
#define KEY_BACKGROUND_IMAGE_FILE "background_image"
Packit d370c2
#define KEY_BACKGROUND_TYPE "background_type"
Packit d370c2
#define KEY_BACKSPACE_BINDING "backspace_binding"
Packit d370c2
#define KEY_BOLD_COLOR "bold_color"
Packit d370c2
#define KEY_BOLD_COLOR_SAME_AS_FG "bold_color_same_as_fg"
Packit d370c2
#define KEY_CURSOR_BLINK_MODE "cursor_blink_mode"
Packit d370c2
#define KEY_CURSOR_SHAPE "cursor_shape"
Packit d370c2
#define KEY_CUSTOM_COMMAND "custom_command"
Packit d370c2
#define KEY_DEFAULT_SHOW_MENUBAR "default_show_menubar"
Packit d370c2
#define KEY_DEFAULT_SIZE_COLUMNS "default_size_columns"
Packit d370c2
#define KEY_DEFAULT_SIZE_ROWS "default_size_rows"
Packit d370c2
#define KEY_DELETE_BINDING "delete_binding"
Packit d370c2
#define KEY_ENCODING "encoding"
Packit d370c2
#define KEY_EXIT_ACTION "exit_action"
Packit d370c2
#define KEY_FONT "font"
Packit d370c2
#define KEY_FOREGROUND_COLOR "foreground_color"
Packit d370c2
#define KEY_LOGIN_SHELL "login_shell"
Packit d370c2
#define KEY_PALETTE "palette"
Packit d370c2
#define KEY_SCROLL_BACKGROUND "scroll_background"
Packit d370c2
#define KEY_SCROLLBACK_LINES "scrollback_lines"
Packit d370c2
#define KEY_SCROLLBACK_UNLIMITED "scrollback_unlimited"
Packit d370c2
#define KEY_SCROLLBAR_POSITION "scrollbar_position"
Packit d370c2
#define KEY_SCROLL_ON_KEYSTROKE "scroll_on_keystroke"
Packit d370c2
#define KEY_SCROLL_ON_OUTPUT "scroll_on_output"
Packit d370c2
#define KEY_SILENT_BELL "silent_bell"
Packit 9982d0
#define KEY_TITLE_MODE "title_mode"
Packit 9982d0
#define KEY_TITLE "title"
Packit d370c2
#define KEY_USE_CUSTOM_COMMAND "use_custom_command"
Packit d370c2
#define KEY_USE_SYSTEM_FONT "use_system_font"
Packit d370c2
#define KEY_USE_THEME_COLORS "use_theme_colors"
Packit d370c2
#define KEY_VISIBLE_NAME "visible_name"
Packit d370c2
Packit d370c2
static const GConfEnumStringPair erase_binding_pairs[] = {
Packit d370c2
  { VTE_ERASE_AUTO, "auto" },
Packit d370c2
  { VTE_ERASE_ASCII_BACKSPACE, "control-h" },
Packit d370c2
  { VTE_ERASE_ASCII_DELETE, "ascii-del" },
Packit d370c2
  { VTE_ERASE_DELETE_SEQUENCE, "escape-sequence" },
Packit d370c2
  { VTE_ERASE_TTY, "tty" },
Packit d370c2
  { -1, NULL }
Packit d370c2
};
Packit d370c2
Packit d370c2
static const GConfEnumStringPair scrollbar_position_pairs[] = {
Packit d370c2
  { GTK_POLICY_ALWAYS, "left" },
Packit d370c2
  { GTK_POLICY_ALWAYS, "right" },
Packit d370c2
  { GTK_POLICY_NEVER,  "hidden" },
Packit d370c2
  { -1, NULL }
Packit d370c2
};
Packit d370c2
Packit d370c2
static gboolean
Packit d370c2
string_to_enum (GType type,
Packit d370c2
                const char *s,
Packit d370c2
                int *val)
Packit d370c2
{
Packit d370c2
  GEnumClass *klass;
Packit d370c2
  GEnumValue *eval = NULL;
Packit d370c2
  guint i;
Packit d370c2
Packit d370c2
  klass = g_type_class_ref (type);
Packit d370c2
  for (i = 0; i < klass->n_values; ++i) {
Packit d370c2
    if (strcmp (klass->values[i].value_nick, s) != 0)
Packit d370c2
      continue;
Packit d370c2
Packit d370c2
    eval = &klass->values[i];
Packit d370c2
    break;
Packit d370c2
  }
Packit d370c2
Packit d370c2
  if (eval)
Packit d370c2
    *val = eval->value;
Packit d370c2
Packit d370c2
  g_type_class_unref (klass);
Packit d370c2
Packit d370c2
  return eval != NULL;
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
migrate_bool (GConfClient *client,
Packit d370c2
              const char *gconf_path,
Packit d370c2
              const char *gconf_key,
Packit d370c2
              GSettings *settings,
Packit d370c2
              const char *settings_key,
Packit d370c2
              gboolean invert)
Packit d370c2
{
Packit d370c2
  GConfValue *value;
Packit d370c2
  char *key;
Packit d370c2
Packit d370c2
  key = gconf_concat_dir_and_key (gconf_path, gconf_key);
Packit d370c2
  value = gconf_client_get_without_default (client, key, NULL);
Packit d370c2
  g_free (key);
Packit d370c2
Packit d370c2
  if (value != NULL &&
Packit d370c2
      value->type == GCONF_VALUE_BOOL)
Packit d370c2
    g_settings_set_boolean (settings, settings_key,
Packit d370c2
                            invert ? !gconf_value_get_bool (value)
Packit d370c2
                                   : gconf_value_get_bool (value));
Packit d370c2
Packit d370c2
  if (value)
Packit d370c2
    gconf_value_free (value);
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
migrate_int (GConfClient *client,
Packit d370c2
             const char *gconf_path,
Packit d370c2
             const char *gconf_key,
Packit d370c2
             GSettings *settings,
Packit d370c2
             const char *settings_key)
Packit d370c2
{
Packit d370c2
  GConfValue *value;
Packit d370c2
  char *key;
Packit d370c2
Packit d370c2
  key = gconf_concat_dir_and_key (gconf_path, gconf_key);
Packit d370c2
  value = gconf_client_get_without_default (client, key, NULL);
Packit d370c2
  g_free (key);
Packit d370c2
Packit d370c2
  if (value != NULL &&
Packit d370c2
      value->type == GCONF_VALUE_INT)
Packit d370c2
    g_settings_set_int (settings, settings_key, gconf_value_get_int (value));
Packit d370c2
Packit d370c2
  if (value)
Packit d370c2
    gconf_value_free (value);
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
migrate_string (GConfClient *client,
Packit d370c2
                const char *gconf_path,
Packit d370c2
                const char *gconf_key,
Packit d370c2
                GSettings *settings,
Packit d370c2
                const char *settings_key)
Packit d370c2
{
Packit d370c2
  GConfValue *value;
Packit d370c2
  char *key;
Packit d370c2
Packit d370c2
  key = gconf_concat_dir_and_key (gconf_path, gconf_key);
Packit d370c2
  value = gconf_client_get_without_default (client, key, NULL);
Packit d370c2
  g_free (key);
Packit d370c2
Packit d370c2
  if (value != NULL &&
Packit d370c2
      value->type == GCONF_VALUE_STRING)
Packit d370c2
    g_settings_set_string (settings, settings_key, gconf_value_get_string (value));
Packit d370c2
Packit d370c2
  if (value)
Packit d370c2
    gconf_value_free (value);
Packit d370c2
}
Packit d370c2
Packit d370c2
#if 0
Packit d370c2
static void
Packit d370c2
migrate_string_list (GConfClient *client,
Packit d370c2
                     const char *gconf_path,
Packit d370c2
                     const char *gconf_key,
Packit d370c2
                     GSettings *settings,
Packit d370c2
                     const char *settings_key)
Packit d370c2
{
Packit d370c2
  GConfValue *value;
Packit d370c2
  GVariantBuilder builder;
Packit d370c2
  GSList *l;
Packit d370c2
  char *key;
Packit d370c2
Packit d370c2
  key = gconf_concat_dir_and_key (gconf_path, gconf_key);
Packit d370c2
  value = gconf_client_get_without_default (client, key, NULL);
Packit d370c2
  g_free (key);
Packit d370c2
Packit d370c2
  if (value != NULL &&
Packit d370c2
      value->type == GCONF_VALUE_LIST &&
Packit d370c2
      gconf_value_get_list_type (value) == GCONF_VALUE_STRING) {
Packit d370c2
    g_variant_builder_init (&builder, G_VARIANT_TYPE ("as"));
Packit d370c2
Packit d370c2
    for (l = gconf_value_get_list (value); l != NULL; l = l->next)
Packit d370c2
      g_variant_builder_add (&builder, "s", gconf_value_get_string (l->data));
Packit d370c2
Packit d370c2
    g_settings_set (settings, settings_key, "as", &builder);
Packit d370c2
  }
Packit d370c2
Packit d370c2
  if (value)
Packit d370c2
    gconf_value_free (value);
Packit d370c2
}
Packit d370c2
#endif
Packit d370c2
Packit d370c2
static void
Packit d370c2
migrate_enum (GConfClient *client,
Packit d370c2
              const char *gconf_path,
Packit d370c2
              const char *gconf_key,
Packit d370c2
              const GConfEnumStringPair *pairs,
Packit d370c2
              GSettings *settings,
Packit d370c2
              const char *settings_key)
Packit d370c2
{
Packit d370c2
  GConfValue *value;
Packit d370c2
  int val;
Packit d370c2
  char *key;
Packit d370c2
Packit d370c2
  key = gconf_concat_dir_and_key (gconf_path, gconf_key);
Packit d370c2
  value = gconf_client_get_without_default (client, key, NULL);
Packit d370c2
  g_free (key);
Packit d370c2
Packit d370c2
  if (value != NULL &&
Packit d370c2
      value->type == GCONF_VALUE_STRING &&
Packit d370c2
      gconf_string_to_enum ((GConfEnumStringPair*) pairs, gconf_value_get_string (value), &val))
Packit d370c2
    g_settings_set_enum (settings, settings_key, val);
Packit d370c2
Packit d370c2
  if (value)
Packit d370c2
    gconf_value_free (value);
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
migrate_genum (GConfClient *client,
Packit d370c2
               const char *gconf_path,
Packit d370c2
               const char *gconf_key,
Packit d370c2
               GSettings *settings,
Packit d370c2
               const char *settings_key,
Packit d370c2
               GType enum_type)
Packit d370c2
{
Packit d370c2
  GConfValue *value;
Packit d370c2
  int val;
Packit d370c2
  char *key;
Packit d370c2
Packit d370c2
  key = gconf_concat_dir_and_key (gconf_path, gconf_key);
Packit d370c2
  value = gconf_client_get_without_default (client, key, NULL);
Packit d370c2
  g_free (key);
Packit d370c2
Packit d370c2
  if (value != NULL &&
Packit d370c2
      value->type == GCONF_VALUE_STRING &&
Packit d370c2
      string_to_enum (enum_type, gconf_value_get_string (value), &val))
Packit d370c2
    g_settings_set_enum (settings, settings_key, val);
Packit d370c2
Packit d370c2
  if (value)
Packit d370c2
    gconf_value_free (value);
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
migrate_palette (GConfClient *client,
Packit d370c2
                 const char *gconf_path,
Packit d370c2
                 GSettings *settings)
Packit d370c2
{
Packit d370c2
  GConfValue *value;
Packit d370c2
  char *key;
Packit d370c2
  char **strv;
Packit d370c2
Packit d370c2
  key = gconf_concat_dir_and_key (gconf_path, KEY_PALETTE);
Packit d370c2
  value = gconf_client_get_without_default (client, key, NULL);
Packit d370c2
  g_free (key);
Packit d370c2
Packit d370c2
  if (value != NULL &&
Packit d370c2
      value->type == GCONF_VALUE_STRING) {
Packit d370c2
    strv = g_strsplit (gconf_value_get_string (value), ":", -1);
Packit d370c2
    g_settings_set_strv (settings, TERMINAL_PROFILE_PALETTE_KEY,
Packit d370c2
                         (const char * const *) strv);
Packit d370c2
    g_strfreev (strv);
Packit d370c2
  }
Packit d370c2
Packit d370c2
  if (value)
Packit d370c2
    gconf_value_free (value);
Packit d370c2
}
Packit d370c2
Packit d370c2
static gboolean
Packit d370c2
migrate_global_prefs (GSettings *settings,
Packit d370c2
                      GError **error)
Packit d370c2
{
Packit d370c2
  GConfClient *client;
Packit d370c2
Packit d370c2
  client = gconf_client_get_default ();
Packit d370c2
Packit d370c2
  migrate_bool (client, GCONF_GLOBAL_PREFIX, "confirm_window_close",
Packit d370c2
                settings, TERMINAL_SETTING_CONFIRM_CLOSE_KEY,
Packit d370c2
                FALSE);
Packit d370c2
  migrate_bool (client, GCONF_GLOBAL_PREFIX, "use_mnemonics",
Packit d370c2
                settings, TERMINAL_SETTING_ENABLE_MNEMONICS_KEY,
Packit d370c2
                FALSE);
Packit d370c2
  migrate_bool (client, GCONF_GLOBAL_PREFIX, "use_menu_accelerator",
Packit d370c2
                settings, TERMINAL_SETTING_ENABLE_MENU_BAR_ACCEL_KEY,
Packit d370c2
                FALSE);
Packit d370c2
Packit d370c2
  g_object_unref (client);
Packit d370c2
Packit d370c2
  return TRUE;
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 void
Packit d370c2
do_clean (void)
Packit d370c2
{
Packit d370c2
  DConfClient *client;
Packit d370c2
Packit d370c2
  if (!settings_backend_is_dconf ()) {
Packit d370c2
    if (verbose)
Packit d370c2
      g_printerr ("Not using DConf settings backend; not cleaning.\n");
Packit d370c2
    return;
Packit d370c2
  }
Packit d370c2
Packit d370c2
  if (verbose)
Packit d370c2
    g_printerr ("Cleaning…\n");
Packit d370c2
Packit d370c2
#ifdef HAVE_DCONF_1_2
Packit d370c2
  client = dconf_client_new (NULL, NULL, NULL, NULL);
Packit d370c2
  dconf_client_write (client, TERMINAL_PATH_PREFIX, NULL, NULL, NULL, NULL);
Packit d370c2
#else /* modern DConf */
Packit d370c2
  client = dconf_client_new ();
Packit d370c2
  dconf_client_write_sync (client, TERMINAL_PATH_PREFIX, NULL, NULL, NULL, NULL);
Packit d370c2
#endif
Packit d370c2
  g_object_unref (client);
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
migrate_profile (TerminalSettingsList *list,
Packit d370c2
                 GConfClient *client,
Packit d370c2
                 const char *gconf_id,
Packit d370c2
                 const char *default_gconf_id)
Packit d370c2
{
Packit d370c2
  GSettings *settings;
Packit d370c2
  char *child_name, *path;
Packit d370c2
  gs_free char *name;
Packit d370c2
  gboolean is_default;
Packit d370c2
Packit d370c2
  if (g_strcmp0 (gconf_id, default_gconf_id) == 0) {
Packit d370c2
    /* Re-use the default list child */
Packit d370c2
    settings = terminal_settings_list_ref_default_child (list);
Packit d370c2
    is_default = TRUE;
Packit d370c2
  } else {
Packit d370c2
    child_name = terminal_settings_list_add_child (list, NULL);
Packit d370c2
    settings = terminal_settings_list_ref_child (list, child_name);
Packit d370c2
    g_free (child_name);
Packit d370c2
    is_default = FALSE;
Packit d370c2
  }
Packit d370c2
Packit d370c2
  path = gconf_concat_dir_and_key (GCONF_PROFILES_PREFIX, gconf_id);
Packit d370c2
Packit d370c2
  migrate_string (client, path, KEY_VISIBLE_NAME,
Packit d370c2
                  settings, TERMINAL_PROFILE_VISIBLE_NAME_KEY);
Packit d370c2
Packit d370c2
  g_settings_get (settings, TERMINAL_PROFILE_VISIBLE_NAME_KEY, "s", &name);
Packit d370c2
  if (name[0] == '\0')
Packit d370c2
    g_settings_set_string (settings, TERMINAL_PROFILE_VISIBLE_NAME_KEY,
Packit d370c2
                           is_default ? _("Default") : _("Unnamed"));
Packit d370c2
Packit d370c2
  migrate_string (client, path, KEY_FOREGROUND_COLOR,
Packit d370c2
                  settings, TERMINAL_PROFILE_FOREGROUND_COLOR_KEY);
Packit d370c2
  migrate_string (client, path, KEY_BACKGROUND_COLOR,
Packit d370c2
                  settings, TERMINAL_PROFILE_BACKGROUND_COLOR_KEY);
Packit d370c2
  migrate_string (client, path, KEY_BOLD_COLOR,
Packit d370c2
                 settings, TERMINAL_PROFILE_BOLD_COLOR_KEY);
Packit d370c2
  migrate_bool (client, path, KEY_BOLD_COLOR_SAME_AS_FG,
Packit d370c2
                settings, TERMINAL_PROFILE_BOLD_COLOR_SAME_AS_FG_KEY,
Packit d370c2
                FALSE);
Packit 9982d0
  migrate_genum (client, path, KEY_TITLE_MODE,
Packit 9982d0
                 settings, TERMINAL_PROFILE_TITLE_MODE_KEY,
Packit 9982d0
                 TERMINAL_TYPE_TITLE_MODE);
Packit 9982d0
  migrate_string (client, path, KEY_TITLE,
Packit 9982d0
                  settings, TERMINAL_PROFILE_TITLE_KEY);
Packit d370c2
  migrate_bool (client, path, KEY_ALLOW_BOLD,
Packit d370c2
                settings, TERMINAL_PROFILE_ALLOW_BOLD_KEY,
Packit d370c2
                FALSE);
Packit d370c2
  migrate_bool (client, path, KEY_SILENT_BELL,
Packit d370c2
                settings, TERMINAL_PROFILE_AUDIBLE_BELL_KEY,
Packit d370c2
                TRUE);
Packit d370c2
  migrate_int (client, path, KEY_DEFAULT_SIZE_COLUMNS,
Packit d370c2
               settings, TERMINAL_PROFILE_DEFAULT_SIZE_COLUMNS_KEY);
Packit d370c2
  migrate_int (client, path, KEY_DEFAULT_SIZE_ROWS,
Packit d370c2
               settings, TERMINAL_PROFILE_DEFAULT_SIZE_ROWS_KEY);
Packit d370c2
  migrate_enum (client, path, KEY_SCROLLBAR_POSITION,
Packit d370c2
                scrollbar_position_pairs,
Packit d370c2
                settings, TERMINAL_PROFILE_SCROLLBAR_POLICY_KEY);
Packit d370c2
  { // FIX these as -1 == unlimited? 
Packit d370c2
  migrate_int (client, path, KEY_SCROLLBACK_LINES,
Packit d370c2
               settings, TERMINAL_PROFILE_SCROLLBACK_LINES_KEY);
Packit d370c2
  migrate_bool (client, path, KEY_SCROLLBACK_UNLIMITED,
Packit d370c2
                settings, TERMINAL_PROFILE_SCROLLBACK_UNLIMITED_KEY,
Packit d370c2
                FALSE);
Packit d370c2
  }
Packit d370c2
  migrate_bool (client, path, KEY_SCROLL_ON_KEYSTROKE,
Packit d370c2
                settings, TERMINAL_PROFILE_SCROLL_ON_KEYSTROKE_KEY,
Packit d370c2
                FALSE);
Packit d370c2
  migrate_bool (client, path, KEY_SCROLL_ON_OUTPUT,
Packit d370c2
                settings, TERMINAL_PROFILE_SCROLL_ON_OUTPUT_KEY,
Packit d370c2
                FALSE);
Packit d370c2
  migrate_genum (client, path, KEY_EXIT_ACTION,
Packit d370c2
                settings, TERMINAL_PROFILE_EXIT_ACTION_KEY,
Packit d370c2
                TERMINAL_TYPE_EXIT_ACTION);
Packit d370c2
  migrate_bool (client, path, KEY_LOGIN_SHELL,
Packit d370c2
                settings, TERMINAL_PROFILE_LOGIN_SHELL_KEY,
Packit d370c2
                FALSE);
Packit d370c2
  migrate_bool (client, path, KEY_USE_CUSTOM_COMMAND,
Packit d370c2
                settings, TERMINAL_PROFILE_USE_CUSTOM_COMMAND_KEY,
Packit d370c2
                FALSE);
Packit d370c2
  migrate_string (client, path, KEY_CUSTOM_COMMAND,
Packit d370c2
                  settings, TERMINAL_PROFILE_CUSTOM_COMMAND_KEY);
Packit d370c2
  migrate_genum (client, path, KEY_CURSOR_BLINK_MODE,
Packit d370c2
                 settings, TERMINAL_PROFILE_CURSOR_BLINK_MODE_KEY,
Packit d370c2
                 VTE_TYPE_CURSOR_BLINK_MODE);
Packit d370c2
  migrate_genum (client, path, KEY_CURSOR_SHAPE,
Packit d370c2
                 settings, TERMINAL_PROFILE_CURSOR_SHAPE_KEY,
Packit d370c2
                 VTE_TYPE_CURSOR_SHAPE);
Packit d370c2
  migrate_palette (client, path, settings);
Packit d370c2
  migrate_string (client, path, KEY_FONT,
Packit d370c2
                  settings, TERMINAL_PROFILE_FONT_KEY);
Packit d370c2
  migrate_enum (client, path, KEY_BACKSPACE_BINDING, erase_binding_pairs,
Packit d370c2
                settings, TERMINAL_PROFILE_BACKSPACE_BINDING_KEY);
Packit d370c2
  migrate_enum (client, path, KEY_DELETE_BINDING, erase_binding_pairs,
Packit d370c2
                settings, TERMINAL_PROFILE_DELETE_BINDING_KEY);
Packit d370c2
  migrate_bool (client, path, KEY_USE_THEME_COLORS,
Packit d370c2
                settings, TERMINAL_PROFILE_USE_THEME_COLORS_KEY,
Packit d370c2
                FALSE);
Packit d370c2
  migrate_bool (client, path, KEY_USE_SYSTEM_FONT,
Packit d370c2
                settings, TERMINAL_PROFILE_USE_SYSTEM_FONT_KEY,
Packit d370c2
                FALSE);
Packit d370c2
  migrate_string (client, path, KEY_ENCODING,
Packit d370c2
                  settings, TERMINAL_PROFILE_ENCODING_KEY);
Packit d370c2
Packit d370c2
  g_free (path);
Packit d370c2
  g_object_unref (settings);
Packit d370c2
}
Packit d370c2
Packit d370c2
static gboolean
Packit d370c2
migrate_profiles (GSettings *global_settings,
Packit d370c2
                  GError **error)
Packit d370c2
{
Packit d370c2
  TerminalSettingsList *list;
Packit d370c2
  GConfClient *client;
Packit d370c2
  GConfValue *value, *dvalue;
Packit d370c2
  GSList *l;
Packit d370c2
  const char *default_profile;
Packit d370c2
Packit d370c2
  client = gconf_client_get_default ();
Packit d370c2
Packit d370c2
  dvalue = gconf_client_get (client, GCONF_GLOBAL_PREFIX "/default_profile", NULL);
Packit d370c2
  if (dvalue != NULL &&
Packit d370c2
      dvalue->type == GCONF_VALUE_STRING)
Packit d370c2
    default_profile = gconf_value_get_string (dvalue);
Packit d370c2
  else
Packit d370c2
    default_profile = NULL;
Packit d370c2
Packit d370c2
  list = terminal_profiles_list_new ();
Packit d370c2
Packit d370c2
  value = gconf_client_get (client, GCONF_GLOBAL_PREFIX "/profile_list", NULL);
Packit d370c2
  if (value != NULL &&
Packit d370c2
      value->type == GCONF_VALUE_LIST &&
Packit d370c2
      gconf_value_get_list_type (value) == GCONF_VALUE_STRING) {
Packit d370c2
    for (l = gconf_value_get_list (value); l != NULL; l = l->next) {
Packit d370c2
      migrate_profile (list, client,
Packit d370c2
                       gconf_value_get_string (l->data),
Packit d370c2
                       default_profile);
Packit d370c2
    }
Packit d370c2
  }
Packit d370c2
Packit d370c2
  /* Some settings used to be per-profile but are now global;
Packit d370c2
   * take these from the default profile.
Packit d370c2
   */
Packit d370c2
  if (default_profile) {
Packit d370c2
    char *path;
Packit d370c2
Packit d370c2
    path = gconf_concat_dir_and_key (GCONF_PROFILES_PREFIX, default_profile);
Packit d370c2
Packit d370c2
    migrate_bool (client, path, KEY_DEFAULT_SHOW_MENUBAR,
Packit d370c2
                  global_settings, TERMINAL_SETTING_DEFAULT_SHOW_MENUBAR_KEY,
Packit d370c2
                  FALSE);
Packit d370c2
Packit d370c2
    g_free (path);
Packit d370c2
  }
Packit d370c2
Packit d370c2
  if (value)
Packit d370c2
    gconf_value_free (value);
Packit d370c2
  if (dvalue)
Packit d370c2
    gconf_value_free (dvalue);
Packit d370c2
  g_object_unref (client);
Packit d370c2
Packit d370c2
  g_object_unref (list);
Packit d370c2
Packit d370c2
  return TRUE;
Packit d370c2
}
Packit d370c2
Packit d370c2
static gboolean
Packit d370c2
migrate_accels (GSettings *global_settings,
Packit d370c2
                GError **error)
Packit d370c2
{
Packit d370c2
  static const const struct { const char *gconf_key; const char *settings_key; } const data[] = {
Packit d370c2
    { "new_tab",          "new-tab"            },
Packit d370c2
    { "new_window",       "new-window"         },
Packit d370c2
    { "close_tab",        "close-tab"          },
Packit d370c2
    { "close_window",     "close-window"       },
Packit d370c2
    { "copy",             "copy"               },
Packit d370c2
    { "paste",            "paste"              },
Packit d370c2
    { "toggle_menubar",   "toggle-menubar"     },
Packit d370c2
    { "full_screen",      "full-screen"        },
Packit d370c2
    { "zoom_in",          "zoom-in"            },
Packit d370c2
    { "zoom_out",         "zoom-out"           },
Packit d370c2
    { "zoom_normal",      "zoom-normal"        },
Packit 9982d0
    { "set_window_title", "set-terminal-title" },
Packit d370c2
    { "reset",            "reset"              },
Packit d370c2
    { "reset_and_clear",  "reset-and-clear"    },
Packit d370c2
    { "prev_tab",         "prev-tab"           },
Packit d370c2
    { "next_tab",         "next-tab"           },
Packit d370c2
    { "move_tab_left",    "move-tab-left"      },
Packit d370c2
    { "move_tab_right",   "move-tab-right"     },
Packit d370c2
    { "detach_tab",       "detach-tab"         },
Packit d370c2
    { "switch_to_tab_1",  "switch-to-tab-1"    },
Packit d370c2
    { "switch_to_tab_2",  "switch-to-tab-2"    },
Packit d370c2
    { "switch_to_tab_3",  "switch-to-tab-3"    },
Packit d370c2
    { "switch_to_tab_4",  "switch-to-tab-4"    },
Packit d370c2
    { "switch_to_tab_5",  "switch-to-tab-5"    },
Packit d370c2
    { "switch_to_tab_6",  "switch-to-tab-6"    },
Packit d370c2
    { "switch_to_tab_7",  "switch-to-tab-7"    },
Packit d370c2
    { "switch_to_tab_8",  "switch-to-tab-8"    },
Packit d370c2
    { "switch_to_tab_9",  "switch-to-tab-9"    },
Packit d370c2
    { "switch_to_tab_10", "switch-to-tab-10"   },
Packit d370c2
    { "switch_to_tab_11", "switch-to-tab-11"   },
Packit d370c2
    { "switch_to_tab_12", "switch-to-tab-12"   },
Packit d370c2
    { "help",             "help"               }
Packit d370c2
  };
Packit d370c2
  GConfClient *client;
Packit d370c2
  GSettings *settings;
Packit d370c2
  guint i;
Packit d370c2
  char *gconf_path;
Packit d370c2
  GConfValue *value;
Packit d370c2
Packit d370c2
  client = gconf_client_get_default ();
Packit d370c2
  settings = g_settings_get_child (global_settings, "keybindings");
Packit d370c2
Packit d370c2
  for (i = 0; i < G_N_ELEMENTS (data); ++i) {
Packit d370c2
    gconf_path = g_strdup_printf ("/apps/gnome-terminal/keybindings/%s", data[i].gconf_key);
Packit d370c2
Packit d370c2
    value = gconf_client_get_without_default (client, gconf_path, NULL);
Packit d370c2
    g_free (gconf_path);
Packit d370c2
    if (value == NULL)
Packit d370c2
      continue;
Packit d370c2
Packit d370c2
    if (value->type == GCONF_VALUE_STRING)
Packit d370c2
      g_settings_set_string (settings, data[i].settings_key, gconf_value_get_string (value));
Packit d370c2
Packit d370c2
    gconf_value_free (value);
Packit d370c2
  }
Packit d370c2
Packit d370c2
  g_object_unref (settings);
Packit d370c2
  g_object_unref (client);
Packit d370c2
Packit d370c2
  return TRUE;
Packit d370c2
}
Packit d370c2
Packit d370c2
static gboolean
Packit d370c2
migrate (GSettings *global_settings,
Packit d370c2
         GError **error)
Packit d370c2
{
Packit d370c2
  return migrate_global_prefs (global_settings, error) &&
Packit d370c2
    migrate_profiles (global_settings, error) &&
Packit d370c2
    migrate_accels (global_settings, error);
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
update_schema_version (void)
Packit d370c2
{
Packit d370c2
  GSettings *settings;
Packit d370c2
Packit d370c2
  if (verbose)
Packit d370c2
    g_printerr ("Updating schema version\n");
Packit d370c2
Packit d370c2
  settings = g_settings_new (TERMINAL_SETTING_SCHEMA);
Packit d370c2
  g_settings_set_uint (settings, TERMINAL_SETTING_SCHEMA_VERSION, TERMINAL_SCHEMA_VERSION);
Packit d370c2
  g_object_unref (settings);
Packit d370c2
}
Packit d370c2
Packit d370c2
int
Packit d370c2
main (int argc,
Packit d370c2
      char *argv[])
Packit d370c2
{
Packit d370c2
  GOptionContext *context;
Packit d370c2
  GError *error = NULL;
Packit d370c2
  GSettings *global_settings;
Packit d370c2
  int rv = EXIT_SUCCESS;
Packit d370c2
Packit d370c2
  setlocale (LC_ALL, "");
Packit d370c2
Packit d370c2
  _terminal_debug_init ();
Packit d370c2
Packit d370c2
  context = g_option_context_new ("");
Packit d370c2
  g_option_context_add_main_entries (context, options, NULL);
Packit d370c2
Packit d370c2
  if (!g_option_context_parse (context, &argc, &argv, &error)) {
Packit d370c2
    g_option_context_free (context);
Packit d370c2
    g_printerr ("Error parsing arguments: %s\n", error->message);
Packit d370c2
    g_error_free (error);
Packit d370c2
    return EXIT_FAILURE;
Packit d370c2
  }
Packit d370c2
  g_option_context_free (context);
Packit d370c2
Packit d370c2
  global_settings = g_settings_new (TERMINAL_SETTING_SCHEMA);
Packit d370c2
Packit d370c2
  if (clean) {
Packit d370c2
    if (!force) {
Packit d370c2
      g_printerr ("--clean requires --force\n");
Packit d370c2
      rv = EXIT_FAILURE;
Packit d370c2
      goto out;
Packit d370c2
    }
Packit d370c2
Packit d370c2
    do_clean ();
Packit d370c2
  }
Packit d370c2
 
Packit d370c2
  if (g_settings_get_uint (global_settings, TERMINAL_SETTING_SCHEMA_VERSION) >= TERMINAL_SCHEMA_VERSION) {
Packit d370c2
    if (verbose)
Packit d370c2
      g_printerr ("Already migrated.\n");
Packit d370c2
    if (!force)
Packit d370c2
      goto out;
Packit d370c2
  }
Packit d370c2
Packit d370c2
  if (!migrate (global_settings, &error)) {
Packit d370c2
    g_printerr ("Error: %s\n", error->message);
Packit d370c2
    g_error_free (error);
Packit d370c2
    goto out;
Packit d370c2
  }
Packit d370c2
Packit d370c2
  update_schema_version ();
Packit d370c2
Packit d370c2
  if (verbose)
Packit d370c2
    g_printerr ("Syncing gsettings…\n");
Packit d370c2
Packit d370c2
  g_settings_sync ();
Packit d370c2
Packit d370c2
  if (verbose)
Packit d370c2
    g_printerr ("Migration successful!\n");
Packit d370c2
Packit d370c2
 out:
Packit d370c2
  g_object_unref (global_settings);
Packit d370c2
Packit d370c2
  return rv;
Packit d370c2
}