Blame src/profile-editor.c

Packit d370c2
/*
Packit d370c2
 * Copyright © 2002 Havoc Pennington
Packit d370c2
 * Copyright © 2002 Mathias Hasselmann
Packit d370c2
 * Copyright © 2008, 2011, 2017 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 <string.h>
Packit d370c2
#include <math.h>
Packit d370c2
Packit d370c2
#include <glib.h>
Packit d370c2
#include <glib/gi18n.h>
Packit d370c2
#include <gio/gio.h>
Packit d370c2
Packit d370c2
#include "terminal-app.h"
Packit d370c2
#include "terminal-encoding.h"
Packit d370c2
#include "terminal-enums.h"
Packit d370c2
#include "profile-editor.h"
Packit d370c2
#include "terminal-prefs.h"
Packit d370c2
#include "terminal-schemas.h"
Packit d370c2
#include "terminal-type-builtins.h"
Packit d370c2
#include "terminal-util.h"
Packit d370c2
#include "terminal-profiles-list.h"
Packit d370c2
#include "terminal-libgsystem.h"
Packit d370c2
Packit d370c2
Packit d370c2
/* Wrapper around g_signal_connect that maintains a list of the
Packit d370c2
 * handlers installed, and can disconnect them all. */
Packit d370c2
typedef struct {
Packit d370c2
  gpointer instance;
Packit d370c2
  gulong handler_id;
Packit d370c2
} ProfilePrefsSignal;
Packit d370c2
Packit d370c2
static void
Packit d370c2
profile_prefs_register_signal_handler (gpointer instance,
Packit d370c2
                                       gulong handler_id)
Packit d370c2
{
Packit d370c2
  ProfilePrefsSignal sig;
Packit d370c2
  sig.instance = instance;
Packit d370c2
  sig.handler_id = handler_id;
Packit d370c2
  g_array_append_val (the_pref_data->profile_signals, sig);
Packit d370c2
}
Packit d370c2
Packit d370c2
static gulong
Packit d370c2
profile_prefs_signal_connect (gpointer instance,
Packit d370c2
                              const gchar *detailed_signal,
Packit d370c2
                              GCallback c_handler,
Packit d370c2
                              gpointer data)
Packit d370c2
{
Packit d370c2
  gulong handler_id = g_signal_connect(instance, detailed_signal, c_handler, data);
Packit d370c2
  profile_prefs_register_signal_handler (instance, handler_id);
Packit d370c2
  return handler_id;
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
profile_prefs_signal_handlers_disconnect_all (void)
Packit d370c2
{
Packit d370c2
  for (guint i = 0; i < the_pref_data->profile_signals->len; i++) {
Packit d370c2
    ProfilePrefsSignal *sig = &g_array_index (the_pref_data->profile_signals, ProfilePrefsSignal, i);
Packit d370c2
    g_signal_handler_disconnect (sig->instance, sig->handler_id);
Packit d370c2
  }
Packit d370c2
  g_array_set_size (the_pref_data->profile_signals, 0);
Packit d370c2
}
Packit d370c2
Packit d370c2
Packit d370c2
/* Wrappers around g_settings_bind and friends that maintain a list of the
Packit d370c2
 * bindings installed, and can unbind them all. */
Packit d370c2
typedef struct {
Packit d370c2
  gpointer object;
Packit d370c2
  char *property;
Packit d370c2
} ProfilePrefsBinding;
Packit d370c2
Packit d370c2
static void
Packit d370c2
profile_prefs_register_settings_binding (gpointer object,
Packit d370c2
                                         const char *property)
Packit d370c2
{
Packit d370c2
  ProfilePrefsBinding bind;
Packit d370c2
  bind.object = object;
Packit d370c2
  bind.property = g_strdup (property);
Packit d370c2
  g_array_append_val (the_pref_data->profile_bindings, bind);
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
profile_prefs_settings_bind (GSettings *settings,
Packit d370c2
                             const gchar *key,
Packit d370c2
                             gpointer object,
Packit d370c2
                             const gchar *property,
Packit d370c2
                             GSettingsBindFlags flags)
Packit d370c2
{
Packit d370c2
  profile_prefs_register_settings_binding (object, property);
Packit d370c2
  g_settings_bind (settings, key, object, property, flags);
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
profile_prefs_settings_bind_with_mapping (GSettings *settings,
Packit d370c2
                                          const gchar *key,
Packit d370c2
                                          gpointer object,
Packit d370c2
                                          const gchar *property,
Packit d370c2
                                          GSettingsBindFlags flags,
Packit d370c2
                                          GSettingsBindGetMapping get_mapping,
Packit d370c2
                                          GSettingsBindSetMapping set_mapping,
Packit d370c2
                                          gpointer user_data,
Packit d370c2
                                          GDestroyNotify destroy)
Packit d370c2
{
Packit d370c2
  profile_prefs_register_settings_binding (object, property);
Packit d370c2
  g_settings_bind_with_mapping (settings, key, object, property, flags, get_mapping, set_mapping, user_data, destroy);
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
profile_prefs_settings_bind_writable (GSettings *settings,
Packit d370c2
                                      const gchar *key,
Packit d370c2
                                      gpointer object,
Packit d370c2
                                      const gchar *property,
Packit d370c2
                                      gboolean inverted)
Packit d370c2
{
Packit d370c2
  profile_prefs_register_settings_binding (object, property);
Packit d370c2
  g_settings_bind_writable (settings, key, object, property, inverted);
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
profile_prefs_settings_unbind_all (void)
Packit d370c2
{
Packit d370c2
  for (guint i = 0; i < the_pref_data->profile_bindings->len; i++) {
Packit d370c2
    ProfilePrefsBinding *bind = &g_array_index (the_pref_data->profile_bindings, ProfilePrefsBinding, i);
Packit d370c2
    g_settings_unbind (bind->object, bind->property);
Packit d370c2
    g_free (bind->property);
Packit d370c2
  }
Packit d370c2
  g_array_set_size (the_pref_data->profile_bindings, 0);
Packit d370c2
}
Packit d370c2
Packit d370c2
Packit d370c2
typedef struct _TerminalColorScheme TerminalColorScheme;
Packit d370c2
Packit d370c2
struct _TerminalColorScheme
Packit d370c2
{
Packit d370c2
  const char *name;
Packit d370c2
  const GdkRGBA foreground;
Packit d370c2
  const GdkRGBA background;
Packit d370c2
};
Packit d370c2
Packit d370c2
#define COLOR(r, g, b) { .red = (r) / 255.0, .green = (g) / 255.0, .blue = (b) / 255.0, .alpha = 1.0 }
Packit d370c2
Packit d370c2
static const TerminalColorScheme color_schemes[] = {
Packit d370c2
  { N_("Black on light yellow"),
Packit d370c2
    COLOR (0x00, 0x00, 0x00),
Packit d370c2
    COLOR (0xff, 0xff, 0xdd)
Packit d370c2
  },
Packit d370c2
  { N_("Black on white"),
Packit d370c2
    COLOR (0x00, 0x00, 0x00),
Packit d370c2
    COLOR (0xff, 0xff, 0xff)
Packit d370c2
  },
Packit d370c2
  { N_("Gray on black"),
Packit d370c2
    COLOR (0xaa, 0xaa, 0xaa),
Packit d370c2
    COLOR (0x00, 0x00, 0x00)
Packit d370c2
  },
Packit d370c2
  { N_("Green on black"),
Packit d370c2
    COLOR (0x00, 0xff, 0x00),
Packit d370c2
    COLOR (0x00, 0x00, 0x00)
Packit d370c2
  },
Packit d370c2
  { N_("White on black"),
Packit d370c2
    COLOR (0xff, 0xff, 0xff),
Packit d370c2
    COLOR (0x00, 0x00, 0x00)
Packit d370c2
  },
Packit d370c2
  /* Translators: "Tango" is the name of a colour scheme, "light" can be translated */
Packit d370c2
  { N_("Tango light"),
Packit d370c2
    COLOR (0x2e, 0x34, 0x36),
Packit d370c2
    COLOR (0xee, 0xee, 0xec)
Packit d370c2
  },
Packit d370c2
  /* Translators: "Tango" is the name of a colour scheme, "dark" can be translated */
Packit d370c2
  { N_("Tango dark"),
Packit d370c2
    COLOR (0xd3, 0xd7, 0xcf),
Packit d370c2
    COLOR (0x2e, 0x34, 0x36)
Packit d370c2
  },
Packit d370c2
  /* Translators: "Solarized" is the name of a colour scheme, "light" can be translated */
Packit d370c2
  { N_("Solarized light"),
Packit d370c2
    COLOR (0x65, 0x7B, 0x83),
Packit d370c2
    COLOR (0xfd, 0xf6, 0xe3)
Packit d370c2
  },
Packit d370c2
  /* Translators: "Solarized" is the name of a colour scheme, "dark" can be translated */
Packit d370c2
  { N_("Solarized dark"),
Packit d370c2
    COLOR (0x83, 0x94, 0x96),
Packit d370c2
    COLOR (0x00, 0x2b, 0x36)
Packit d370c2
  },
Packit d370c2
};
Packit d370c2
Packit d370c2
#define TERMINAL_PALETTE_SIZE (16)
Packit d370c2
Packit d370c2
enum
Packit d370c2
{
Packit d370c2
  TERMINAL_PALETTE_TANGO     = 0,
Packit d370c2
  TERMINAL_PALETTE_LINUX     = 1,
Packit d370c2
  TERMINAL_PALETTE_XTERM     = 2,
Packit d370c2
  TERMINAL_PALETTE_RXVT      = 3,
Packit d370c2
  TERMINAL_PALETTE_SOLARIZED = 4,
Packit d370c2
  TERMINAL_PALETTE_N_BUILTINS
Packit d370c2
};
Packit d370c2
Packit d370c2
static const GdkRGBA terminal_palettes[TERMINAL_PALETTE_N_BUILTINS][TERMINAL_PALETTE_SIZE] =
Packit d370c2
{
Packit d370c2
  /* Tango palette */
Packit d370c2
  {
Packit d370c2
    COLOR (0x2e, 0x34, 0x36),
Packit d370c2
    COLOR (0xcc, 0x00, 0x00),
Packit d370c2
    COLOR (0x4e, 0x9a, 0x06),
Packit d370c2
    COLOR (0xc4, 0xa0, 0x00),
Packit d370c2
    COLOR (0x34, 0x65, 0xa4),
Packit d370c2
    COLOR (0x75, 0x50, 0x7b),
Packit d370c2
    COLOR (0x06, 0x98, 0x9a),
Packit d370c2
    COLOR (0xd3, 0xd7, 0xcf),
Packit d370c2
    COLOR (0x55, 0x57, 0x53),
Packit d370c2
    COLOR (0xef, 0x29, 0x29),
Packit d370c2
    COLOR (0x8a, 0xe2, 0x34),
Packit d370c2
    COLOR (0xfc, 0xe9, 0x4f),
Packit d370c2
    COLOR (0x72, 0x9f, 0xcf),
Packit d370c2
    COLOR (0xad, 0x7f, 0xa8),
Packit d370c2
    COLOR (0x34, 0xe2, 0xe2),
Packit d370c2
    COLOR (0xee, 0xee, 0xec)
Packit d370c2
  },
Packit d370c2
Packit d370c2
  /* Linux palette */
Packit d370c2
  {
Packit d370c2
    COLOR (0x00, 0x00, 0x00),
Packit d370c2
    COLOR (0xaa, 0x00, 0x00),
Packit d370c2
    COLOR (0x00, 0xaa, 0x00),
Packit d370c2
    COLOR (0xaa, 0x55, 0x00),
Packit d370c2
    COLOR (0x00, 0x00, 0xaa),
Packit d370c2
    COLOR (0xaa, 0x00, 0xaa),
Packit d370c2
    COLOR (0x00, 0xaa, 0xaa),
Packit d370c2
    COLOR (0xaa, 0xaa, 0xaa),
Packit d370c2
    COLOR (0x55, 0x55, 0x55),
Packit d370c2
    COLOR (0xff, 0x55, 0x55),
Packit d370c2
    COLOR (0x55, 0xff, 0x55),
Packit d370c2
    COLOR (0xff, 0xff, 0x55),
Packit d370c2
    COLOR (0x55, 0x55, 0xff),
Packit d370c2
    COLOR (0xff, 0x55, 0xff),
Packit d370c2
    COLOR (0x55, 0xff, 0xff),
Packit d370c2
    COLOR (0xff, 0xff, 0xff)
Packit d370c2
  },
Packit d370c2
Packit d370c2
  /* XTerm palette */
Packit d370c2
  {
Packit d370c2
    COLOR (0x00, 0x00, 0x00),
Packit d370c2
    COLOR (0xcd, 0x00, 0x00),
Packit d370c2
    COLOR (0x00, 0xcd, 0x00),
Packit d370c2
    COLOR (0xcd, 0xcd, 0x00),
Packit d370c2
    COLOR (0x00, 0x00, 0xee),
Packit d370c2
    COLOR (0xcd, 0x00, 0xcd),
Packit d370c2
    COLOR (0x00, 0xcd, 0xcd),
Packit d370c2
    COLOR (0xe5, 0xe5, 0xe5),
Packit d370c2
    COLOR (0x7f, 0x7f, 0x7f),
Packit d370c2
    COLOR (0xff, 0x00, 0x00),
Packit d370c2
    COLOR (0x00, 0xff, 0x00),
Packit d370c2
    COLOR (0xff, 0xff, 0x00),
Packit d370c2
    COLOR (0x5c, 0x5c, 0xff),
Packit d370c2
    COLOR (0xff, 0x00, 0xff),
Packit d370c2
    COLOR (0x00, 0xff, 0xff),
Packit d370c2
    COLOR (0xff, 0xff, 0xff)
Packit d370c2
  },
Packit d370c2
Packit d370c2
  /* RXVT palette */
Packit d370c2
  {
Packit d370c2
    COLOR (0x00, 0x00, 0x00),
Packit d370c2
    COLOR (0xcd, 0x00, 0x00),
Packit d370c2
    COLOR (0x00, 0xcd, 0x00),
Packit d370c2
    COLOR (0xcd, 0xcd, 0x00),
Packit d370c2
    COLOR (0x00, 0x00, 0xcd),
Packit d370c2
    COLOR (0xcd, 0x00, 0xcd),
Packit d370c2
    COLOR (0x00, 0xcd, 0xcd),
Packit d370c2
    COLOR (0xfa, 0xeb, 0xd7),
Packit d370c2
    COLOR (0x40, 0x40, 0x40),
Packit d370c2
    COLOR (0xff, 0x00, 0x00),
Packit d370c2
    COLOR (0x00, 0xff, 0x00),
Packit d370c2
    COLOR (0xff, 0xff, 0x00),
Packit d370c2
    COLOR (0x00, 0x00, 0xff),
Packit d370c2
    COLOR (0xff, 0x00, 0xff),
Packit d370c2
    COLOR (0x00, 0xff, 0xff),
Packit d370c2
    COLOR (0xff, 0xff, 0xff)
Packit d370c2
  },
Packit d370c2
Packit d370c2
  /* Solarized palette (1.0.0beta2): http://ethanschoonover.com/solarized */
Packit d370c2
  {
Packit d370c2
    COLOR (0x07, 0x36, 0x42),
Packit d370c2
    COLOR (0xdc, 0x32, 0x2f),
Packit d370c2
    COLOR (0x85, 0x99, 0x00),
Packit d370c2
    COLOR (0xb5, 0x89, 0x00),
Packit d370c2
    COLOR (0x26, 0x8b, 0xd2),
Packit d370c2
    COLOR (0xd3, 0x36, 0x82),
Packit d370c2
    COLOR (0x2a, 0xa1, 0x98),
Packit d370c2
    COLOR (0xee, 0xe8, 0xd5),
Packit d370c2
    COLOR (0x00, 0x2b, 0x36),
Packit d370c2
    COLOR (0xcb, 0x4b, 0x16),
Packit d370c2
    COLOR (0x58, 0x6e, 0x75),
Packit d370c2
    COLOR (0x65, 0x7b, 0x83),
Packit d370c2
    COLOR (0x83, 0x94, 0x96),
Packit d370c2
    COLOR (0x6c, 0x71, 0xc4),
Packit d370c2
    COLOR (0x93, 0xa1, 0xa1),
Packit d370c2
    COLOR (0xfd, 0xf6, 0xe3)
Packit d370c2
  },
Packit d370c2
};
Packit d370c2
Packit d370c2
#undef COLOR
Packit d370c2
Packit d370c2
static void profile_colors_notify_scheme_combo_cb (GSettings *profile,
Packit d370c2
                                                   const char *key,
Packit d370c2
                                                   GtkComboBox *combo);
Packit d370c2
Packit d370c2
static void profile_palette_notify_scheme_combo_cb (GSettings *profile,
Packit d370c2
                                                    const char *key,
Packit d370c2
                                                    GtkComboBox *combo);
Packit d370c2
Packit d370c2
static void profile_palette_notify_colorpickers_cb (GSettings *profile,
Packit d370c2
                                                    const char *key,
Packit d370c2
                                                    gpointer user_data);
Packit d370c2
Packit d370c2
Packit d370c2
/* gdk_rgba_equal is too strict! */
Packit d370c2
static gboolean
Packit d370c2
rgba_equal (const GdkRGBA *a,
Packit d370c2
            const GdkRGBA *b)
Packit d370c2
{
Packit d370c2
  gdouble dr, dg, db;
Packit d370c2
Packit d370c2
  dr = a->red - b->red;
Packit d370c2
  dg = a->green - b->green;
Packit d370c2
  db = a->blue - b->blue;
Packit d370c2
Packit d370c2
  return (dr * dr + dg * dg + db * db) < 1e-4;
Packit d370c2
}
Packit d370c2
Packit d370c2
static gboolean
Packit d370c2
palette_cmp (const GdkRGBA *ca,
Packit d370c2
             const GdkRGBA *cb)
Packit d370c2
{
Packit d370c2
  guint i;
Packit d370c2
Packit d370c2
  for (i = 0; i < TERMINAL_PALETTE_SIZE; ++i)
Packit d370c2
    if (!rgba_equal (&ca[i], &cb[i]))
Packit d370c2
      return FALSE;
Packit d370c2
Packit d370c2
  return TRUE;
Packit d370c2
}
Packit d370c2
Packit d370c2
static gboolean
Packit d370c2
palette_is_builtin (const GdkRGBA *colors,
Packit d370c2
                    gsize n_colors,
Packit d370c2
                    guint *n)
Packit d370c2
{
Packit d370c2
  guint i;
Packit d370c2
Packit d370c2
  if (n_colors != TERMINAL_PALETTE_SIZE)
Packit d370c2
    return FALSE;
Packit d370c2
Packit d370c2
  for (i = 0; i < TERMINAL_PALETTE_N_BUILTINS; ++i)
Packit d370c2
    {
Packit d370c2
      if (palette_cmp (colors, terminal_palettes[i]))
Packit d370c2
        {
Packit d370c2
          *n = i;
Packit d370c2
          return TRUE;
Packit d370c2
        }
Packit d370c2
    }
Packit d370c2
Packit d370c2
  return FALSE;
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
modify_palette_entry (GSettings       *profile,
Packit d370c2
                      guint            i,
Packit d370c2
                      const GdkRGBA   *color)
Packit d370c2
{
Packit d370c2
  gs_free GdkRGBA *colors;
Packit d370c2
  gsize n_colors;
Packit d370c2
Packit d370c2
  /* FIXMEchpe: this can be optimised, don't really need to parse the colours! */
Packit d370c2
Packit d370c2
  colors = terminal_g_settings_get_rgba_palette (profile, TERMINAL_PROFILE_PALETTE_KEY, &n_colors);
Packit d370c2
Packit d370c2
  if (i < n_colors)
Packit d370c2
    {
Packit d370c2
      colors[i] = *color;
Packit d370c2
      terminal_g_settings_set_rgba_palette (profile, TERMINAL_PROFILE_PALETTE_KEY,
Packit d370c2
                                            colors, n_colors);
Packit d370c2
    }
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
color_scheme_combo_changed_cb (GtkWidget *combo,
Packit d370c2
                               GParamSpec *pspec,
Packit d370c2
                               GSettings *profile)
Packit d370c2
{
Packit d370c2
  guint i;
Packit d370c2
Packit d370c2
  i = gtk_combo_box_get_active (GTK_COMBO_BOX (combo));
Packit d370c2
Packit d370c2
  if (i < G_N_ELEMENTS (color_schemes))
Packit d370c2
    {
Packit d370c2
      g_signal_handlers_block_by_func (profile, G_CALLBACK (profile_colors_notify_scheme_combo_cb), combo);
Packit d370c2
      terminal_g_settings_set_rgba (profile, TERMINAL_PROFILE_FOREGROUND_COLOR_KEY, &color_schemes[i].foreground);
Packit d370c2
      terminal_g_settings_set_rgba (profile, TERMINAL_PROFILE_BACKGROUND_COLOR_KEY, &color_schemes[i].background);
Packit d370c2
      g_signal_handlers_unblock_by_func (profile, G_CALLBACK (profile_colors_notify_scheme_combo_cb), combo);
Packit d370c2
    }
Packit d370c2
  else
Packit d370c2
    {
Packit d370c2
      /* "custom" selected, no change */
Packit d370c2
    }
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
profile_colors_notify_scheme_combo_cb (GSettings *profile,
Packit d370c2
                                       const char *key,
Packit d370c2
                                       GtkComboBox *combo)
Packit d370c2
{
Packit d370c2
  GdkRGBA fg, bg;
Packit d370c2
  guint i;
Packit d370c2
Packit d370c2
  terminal_g_settings_get_rgba (profile, TERMINAL_PROFILE_FOREGROUND_COLOR_KEY, &fg;;
Packit d370c2
  terminal_g_settings_get_rgba (profile, TERMINAL_PROFILE_BACKGROUND_COLOR_KEY, &bg;;
Packit d370c2
Packit d370c2
  for (i = 0; i < G_N_ELEMENTS (color_schemes); ++i)
Packit d370c2
    {
Packit d370c2
      if (rgba_equal (&fg, &color_schemes[i].foreground) &&
Packit d370c2
          rgba_equal (&bg, &color_schemes[i].background))
Packit d370c2
        break;
Packit d370c2
    }
Packit d370c2
  /* If we didn't find a match, then we get the last combo box item which is "custom" */
Packit d370c2
Packit d370c2
  g_signal_handlers_block_by_func (combo, G_CALLBACK (color_scheme_combo_changed_cb), profile);
Packit d370c2
  gtk_combo_box_set_active (GTK_COMBO_BOX (combo), i);
Packit d370c2
  g_signal_handlers_unblock_by_func (combo, G_CALLBACK (color_scheme_combo_changed_cb), profile);
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
palette_scheme_combo_changed_cb (GtkComboBox *combo,
Packit d370c2
                                 GParamSpec *pspec,
Packit d370c2
                                 GSettings *profile)
Packit d370c2
{
Packit d370c2
  int i;
Packit d370c2
Packit d370c2
  i = gtk_combo_box_get_active (GTK_COMBO_BOX (combo));
Packit d370c2
Packit d370c2
  g_signal_handlers_block_by_func (profile, G_CALLBACK (profile_colors_notify_scheme_combo_cb), combo);
Packit d370c2
  if (i < TERMINAL_PALETTE_N_BUILTINS)
Packit d370c2
    terminal_g_settings_set_rgba_palette (profile, TERMINAL_PROFILE_PALETTE_KEY,
Packit d370c2
                                          terminal_palettes[i], TERMINAL_PALETTE_SIZE);
Packit d370c2
  else
Packit d370c2
    {
Packit d370c2
      /* "custom" selected, no change */
Packit d370c2
    }
Packit d370c2
  g_signal_handlers_unblock_by_func (profile, G_CALLBACK (profile_colors_notify_scheme_combo_cb), combo);
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
profile_palette_notify_scheme_combo_cb (GSettings *profile,
Packit d370c2
                                        const char *key,
Packit d370c2
                                        GtkComboBox *combo)
Packit d370c2
{
Packit d370c2
  gs_free GdkRGBA *colors;
Packit d370c2
  gsize n_colors;
Packit d370c2
  guint i;
Packit d370c2
Packit d370c2
  colors = terminal_g_settings_get_rgba_palette (profile, TERMINAL_PROFILE_PALETTE_KEY, &n_colors);
Packit d370c2
  if (!palette_is_builtin (colors, n_colors, &i))
Packit d370c2
    /* If we didn't find a match, then we want the last combo
Packit d370c2
     * box item which is "custom"
Packit d370c2
     */
Packit d370c2
    i = TERMINAL_PALETTE_N_BUILTINS;
Packit d370c2
Packit d370c2
  g_signal_handlers_block_by_func (combo, G_CALLBACK (palette_scheme_combo_changed_cb), profile);
Packit d370c2
  gtk_combo_box_set_active (combo, i);
Packit d370c2
  g_signal_handlers_unblock_by_func (combo, G_CALLBACK (palette_scheme_combo_changed_cb), profile);
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
palette_color_notify_cb (GtkColorButton *button,
Packit d370c2
                         GParamSpec *pspec,
Packit d370c2
                         GSettings *profile)
Packit d370c2
{
Packit d370c2
  GdkRGBA color;
Packit d370c2
  guint i;
Packit d370c2
Packit d370c2
  gtk_color_chooser_get_rgba (GTK_COLOR_CHOOSER (button), &color;;
Packit d370c2
  i = GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (button), "palette-entry-index"));
Packit d370c2
Packit d370c2
  g_signal_handlers_block_by_func (profile, G_CALLBACK (profile_palette_notify_colorpickers_cb), NULL);
Packit d370c2
  modify_palette_entry (profile, i, &color;;
Packit d370c2
  g_signal_handlers_unblock_by_func (profile, G_CALLBACK (profile_palette_notify_colorpickers_cb), NULL);
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
profile_palette_notify_colorpickers_cb (GSettings *profile,
Packit d370c2
                                        const char *key,
Packit d370c2
                                        gpointer user_data)
Packit d370c2
{
Packit d370c2
  GtkWidget *w;
Packit d370c2
  GtkBuilder *builder = the_pref_data->builder;
Packit d370c2
  gs_free GdkRGBA *colors;
Packit d370c2
  gsize n_colors, i;
Packit d370c2
Packit d370c2
  g_assert (strcmp (key, TERMINAL_PROFILE_PALETTE_KEY) == 0);
Packit d370c2
Packit d370c2
  colors = terminal_g_settings_get_rgba_palette (profile, TERMINAL_PROFILE_PALETTE_KEY, &n_colors);
Packit d370c2
Packit d370c2
  n_colors = MIN (n_colors, TERMINAL_PALETTE_SIZE);
Packit d370c2
  for (i = 0; i < n_colors; i++)
Packit d370c2
    {
Packit d370c2
      char name[32];
Packit d370c2
Packit d370c2
      g_snprintf (name, sizeof (name), "palette-colorpicker-%" G_GSIZE_FORMAT, i);
Packit d370c2
      w = (GtkWidget *) gtk_builder_get_object (builder, name);
Packit d370c2
Packit d370c2
      g_signal_handlers_block_by_func (w, G_CALLBACK (palette_color_notify_cb), profile);
Packit d370c2
      gtk_color_chooser_set_rgba (GTK_COLOR_CHOOSER (w), &colors[i]);
Packit d370c2
      g_signal_handlers_unblock_by_func (w, G_CALLBACK (palette_color_notify_cb), profile);
Packit d370c2
    }
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
custom_command_entry_changed_cb (GtkEntry *entry)
Packit d370c2
{
Packit d370c2
  const char *command;
Packit d370c2
  gs_free_error GError *error = NULL;
Packit d370c2
Packit d370c2
  command = gtk_entry_get_text (entry);
Packit d370c2
Packit d370c2
  if (command[0] == '\0' ||
Packit d370c2
      g_shell_parse_argv (command, NULL, NULL, &error))
Packit d370c2
    {
Packit d370c2
      gtk_entry_set_icon_from_icon_name (entry, GTK_PACK_END, NULL);
Packit d370c2
    }
Packit d370c2
  else
Packit d370c2
    {
Packit d370c2
      gs_free char *tooltip;
Packit d370c2
Packit d370c2
      gtk_entry_set_icon_from_icon_name (entry, GTK_PACK_END, "dialog-warning");
Packit d370c2
Packit d370c2
      tooltip = g_strdup_printf (_("Error parsing command: %s"), error->message);
Packit d370c2
      gtk_entry_set_icon_tooltip_text (entry, GTK_PACK_END, tooltip);
Packit d370c2
    }
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
default_size_reset_cb (GtkWidget *button,
Packit d370c2
                       GSettings *profile)
Packit d370c2
{
Packit d370c2
  g_settings_reset (profile, TERMINAL_PROFILE_DEFAULT_SIZE_COLUMNS_KEY);
Packit d370c2
  g_settings_reset (profile, TERMINAL_PROFILE_DEFAULT_SIZE_ROWS_KEY);
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
cell_scale_reset_cb (GtkWidget *button,
Packit d370c2
                     GSettings *profile)
Packit d370c2
{
Packit d370c2
  g_settings_reset (profile, TERMINAL_PROFILE_CELL_HEIGHT_SCALE_KEY);
Packit d370c2
  g_settings_reset (profile, TERMINAL_PROFILE_CELL_WIDTH_SCALE_KEY);
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
reset_compat_defaults_cb (GtkWidget *button,
Packit d370c2
                          GSettings *profile)
Packit d370c2
{
Packit d370c2
  g_settings_reset (profile, TERMINAL_PROFILE_DELETE_BINDING_KEY);
Packit d370c2
  g_settings_reset (profile, TERMINAL_PROFILE_BACKSPACE_BINDING_KEY);
Packit d370c2
  g_settings_reset (profile, TERMINAL_PROFILE_ENCODING_KEY);
Packit d370c2
  g_settings_reset (profile, TERMINAL_PROFILE_CJK_UTF8_AMBIGUOUS_WIDTH_KEY);
Packit d370c2
}
Packit d370c2
Packit d370c2
/*
Packit d370c2
 * initialize widgets
Packit d370c2
 */
Packit d370c2
Packit d370c2
static void
Packit d370c2
set_input_hints(GtkWidget *entry)
Packit d370c2
{
Packit d370c2
#if GTK_CHECK_VERSION (3, 22, 20)
Packit d370c2
  gtk_entry_set_input_hints (GTK_ENTRY (entry), GTK_INPUT_HINT_NO_EMOJI);
Packit d370c2
#endif
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
init_color_scheme_menu (GtkWidget *widget)
Packit d370c2
{
Packit d370c2
  GtkCellRenderer *renderer;
Packit d370c2
  GtkTreeIter iter;
Packit d370c2
  gs_unref_object GtkListStore *store;
Packit d370c2
  guint i;
Packit d370c2
Packit d370c2
  store = gtk_list_store_new (1, G_TYPE_STRING);
Packit d370c2
  for (i = 0; i < G_N_ELEMENTS (color_schemes); ++i)
Packit d370c2
    gtk_list_store_insert_with_values (store, &iter, -1,
Packit d370c2
                                       0, _(color_schemes[i].name),
Packit d370c2
                                       -1);
Packit d370c2
  gtk_list_store_insert_with_values (store, &iter, -1,
Packit d370c2
                                      0, _("Custom"),
Packit d370c2
                                      -1);
Packit d370c2
Packit d370c2
  gtk_combo_box_set_model (GTK_COMBO_BOX (widget), GTK_TREE_MODEL (store));
Packit d370c2
Packit d370c2
  renderer = gtk_cell_renderer_text_new ();
Packit d370c2
  gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (widget), renderer, TRUE);
Packit d370c2
  gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (widget), renderer, "text", 0, NULL);
Packit d370c2
}
Packit d370c2
Packit d370c2
enum {
Packit d370c2
  ENCODINGS_COLUMN_ID = 0,
Packit d370c2
  ENCODINGS_COLUMN_TEXT = 1
Packit d370c2
};
Packit d370c2
Packit d370c2
static void
Packit d370c2
init_encodings_combo (GtkWidget *widget)
Packit d370c2
{
Packit d370c2
  gs_unref_object GtkListStore *store = terminal_encodings_list_store_new (ENCODINGS_COLUMN_ID,
Packit d370c2
                                                                           ENCODINGS_COLUMN_TEXT);
Packit d370c2
Packit d370c2
  /* Now turn on sorting */
Packit d370c2
  gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
Packit d370c2
                                        ENCODINGS_COLUMN_TEXT,
Packit d370c2
                                        GTK_SORT_ASCENDING);
Packit d370c2
Packit d370c2
  gtk_combo_box_set_id_column (GTK_COMBO_BOX (widget), ENCODINGS_COLUMN_ID);
Packit d370c2
  gtk_combo_box_set_model (GTK_COMBO_BOX (widget), GTK_TREE_MODEL (store));
Packit d370c2
Packit d370c2
  /* Cell renderer */
Packit d370c2
  GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
Packit d370c2
  gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (widget), renderer, TRUE);
Packit d370c2
  gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (widget), renderer,
Packit d370c2
                                  "text", ENCODINGS_COLUMN_TEXT, NULL);
Packit d370c2
}
Packit d370c2
Packit d370c2
/* Tab scrolling was removed from GtkNotebook in gtk 3, so reimplement it here */
Packit d370c2
static gboolean
Packit d370c2
scroll_event_cb (GtkWidget      *widget,
Packit d370c2
                 GdkEventScroll *event,
Packit d370c2
                 gpointer        user_data)
Packit d370c2
{
Packit d370c2
  GtkNotebook *notebook = GTK_NOTEBOOK (widget);
Packit d370c2
  GtkWidget *child, *event_widget, *action_widget;
Packit d370c2
Packit d370c2
  if ((event->state & gtk_accelerator_get_default_mod_mask ()) != 0)
Packit d370c2
    return FALSE;
Packit d370c2
Packit d370c2
  child = gtk_notebook_get_nth_page (notebook, gtk_notebook_get_current_page (notebook));
Packit d370c2
  if (child == NULL)
Packit d370c2
    return FALSE;
Packit d370c2
Packit d370c2
  event_widget = gtk_get_event_widget ((GdkEvent *) event);
Packit d370c2
Packit d370c2
  /* Ignore scroll events from the content of the page */
Packit d370c2
  if (event_widget == NULL ||
Packit d370c2
      event_widget == child ||
Packit d370c2
      gtk_widget_is_ancestor (event_widget, child))
Packit d370c2
    return FALSE;
Packit d370c2
Packit d370c2
  /* And also from the action widgets */
Packit d370c2
  action_widget = gtk_notebook_get_action_widget (notebook, GTK_PACK_START);
Packit d370c2
  if (event_widget == action_widget ||
Packit d370c2
      (action_widget != NULL && gtk_widget_is_ancestor (event_widget, action_widget)))
Packit d370c2
    return FALSE;
Packit d370c2
  action_widget = gtk_notebook_get_action_widget (notebook, GTK_PACK_END);
Packit d370c2
  if (event_widget == action_widget ||
Packit d370c2
      (action_widget != NULL && gtk_widget_is_ancestor (event_widget, action_widget)))
Packit d370c2
    return FALSE;
Packit d370c2
Packit d370c2
  switch (event->direction) {
Packit d370c2
    case GDK_SCROLL_RIGHT:
Packit d370c2
    case GDK_SCROLL_DOWN:
Packit d370c2
      gtk_notebook_next_page (notebook);
Packit d370c2
      return TRUE;
Packit d370c2
    case GDK_SCROLL_LEFT:
Packit d370c2
    case GDK_SCROLL_UP:
Packit d370c2
      gtk_notebook_prev_page (notebook);
Packit d370c2
      return TRUE;
Packit d370c2
    case GDK_SCROLL_SMOOTH:
Packit d370c2
      switch (gtk_notebook_get_tab_pos (notebook)) {
Packit d370c2
        case GTK_POS_LEFT:
Packit d370c2
        case GTK_POS_RIGHT:
Packit d370c2
          if (event->delta_y > 0)
Packit d370c2
            gtk_notebook_next_page (notebook);
Packit d370c2
          else if (event->delta_y < 0)
Packit d370c2
            gtk_notebook_prev_page (notebook);
Packit d370c2
          break;
Packit d370c2
        case GTK_POS_TOP:
Packit d370c2
        case GTK_POS_BOTTOM:
Packit d370c2
          if (event->delta_x > 0)
Packit d370c2
            gtk_notebook_next_page (notebook);
Packit d370c2
          else if (event->delta_x < 0)
Packit d370c2
            gtk_notebook_prev_page (notebook);
Packit d370c2
          break;
Packit d370c2
      }
Packit d370c2
      return TRUE;
Packit d370c2
  }
Packit d370c2
Packit d370c2
  return FALSE;
Packit d370c2
}
Packit d370c2
Packit d370c2
Packit d370c2
static gboolean
Packit d370c2
s_to_rgba (GValue *value,
Packit d370c2
           GVariant *variant,
Packit d370c2
           gpointer user_data)
Packit d370c2
{
Packit d370c2
  const char *s;
Packit d370c2
  GdkRGBA color;
Packit d370c2
Packit d370c2
  g_variant_get (variant, "&s", &s);
Packit d370c2
  if (!gdk_rgba_parse (&color, s))
Packit d370c2
    return FALSE;
Packit d370c2
Packit d370c2
  color.alpha = 1.0;
Packit d370c2
  g_value_set_boxed (value, &color;;
Packit d370c2
  return TRUE;
Packit d370c2
}
Packit d370c2
Packit d370c2
static GVariant *
Packit d370c2
rgba_to_s (const GValue *value,
Packit d370c2
           const GVariantType *expected_type,
Packit d370c2
           gpointer user_data)
Packit d370c2
{
Packit d370c2
  GdkRGBA *color;
Packit d370c2
  gs_free char *s = NULL;
Packit d370c2
Packit d370c2
  color = g_value_get_boxed (value);
Packit d370c2
  if (color == NULL)
Packit d370c2
    return NULL;
Packit d370c2
Packit d370c2
  s = gdk_rgba_to_string (color);
Packit d370c2
  return g_variant_new_string (s);
Packit d370c2
}
Packit d370c2
Packit d370c2
static gboolean
Packit d370c2
string_to_enum (GValue *value,
Packit d370c2
                GVariant *variant,
Packit d370c2
                gpointer user_data)
Packit d370c2
{
Packit d370c2
  GType (* get_type) (void) = user_data;
Packit d370c2
  GEnumClass *klass;
Packit d370c2
  GEnumValue *eval = NULL;
Packit d370c2
  const char *s;
Packit d370c2
  guint i;
Packit d370c2
Packit d370c2
  g_variant_get (variant, "&s", &s);
Packit d370c2
Packit d370c2
  klass = g_type_class_ref (get_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
    g_value_set_int (value, 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 GVariant *
Packit d370c2
enum_to_string (const GValue *value,
Packit d370c2
                const GVariantType *expected_type,
Packit d370c2
                gpointer user_data)
Packit d370c2
{
Packit d370c2
  GType (* get_type) (void) = user_data;
Packit d370c2
  GEnumClass *klass;
Packit d370c2
  GEnumValue *eval = NULL;
Packit d370c2
  int val;
Packit d370c2
  guint i;
Packit d370c2
  GVariant *variant = NULL;
Packit d370c2
Packit d370c2
  val = g_value_get_int (value);
Packit d370c2
Packit d370c2
  klass = g_type_class_ref (get_type ());
Packit d370c2
  for (i = 0; i < klass->n_values; ++i) {
Packit d370c2
    if (klass->values[i].value != val)
Packit d370c2
      continue;
Packit d370c2
Packit d370c2
    eval = &klass->values[i];
Packit d370c2
    break;
Packit d370c2
  }
Packit d370c2
Packit d370c2
  if (eval)
Packit d370c2
    variant = g_variant_new_string (eval->value_nick);
Packit d370c2
Packit d370c2
  g_type_class_unref (klass);
Packit d370c2
Packit d370c2
  return variant;
Packit d370c2
}
Packit d370c2
Packit d370c2
static gboolean
Packit d370c2
scrollbar_policy_to_bool (GValue *value,
Packit d370c2
                          GVariant *variant,
Packit d370c2
                          gpointer user_data)
Packit d370c2
{
Packit d370c2
  const char *str;
Packit d370c2
Packit d370c2
  g_variant_get (variant, "&s", &str);
Packit d370c2
  g_value_set_boolean (value, g_str_equal (str, "always"));
Packit d370c2
Packit d370c2
  return TRUE;
Packit d370c2
}
Packit d370c2
Packit d370c2
static GVariant *
Packit d370c2
bool_to_scrollbar_policy (const GValue *value,
Packit d370c2
                          const GVariantType *expected_type,
Packit d370c2
                          gpointer user_data)
Packit d370c2
{
Packit d370c2
  return g_variant_new_string (g_value_get_boolean (value) ? "always" : "never");
Packit d370c2
}
Packit d370c2
Packit d370c2
#if !GTK_CHECK_VERSION (3, 19, 8)
Packit d370c2
Packit d370c2
/* ATTENTION: HACK HACK HACK!
Packit d370c2
 * GtkColorButton usability is broken. It always pops up the
Packit d370c2
 * GtkColorChooserDialog with show-editor=FALSE, which brings
Packit d370c2
 * up the dialogue in palette mode, when all we want is pick
Packit d370c2
 * a colour. Since there is no way to get to the colour
Packit d370c2
 * dialogue of the button, and the dialogue always sets
Packit d370c2
 * show-editor=FALSE in its map anyway, we need to override
Packit d370c2
 * the map implementation, set show-editor=TRUE and chain to
Packit d370c2
 * the parent's map. This is reasonably safe to do since that's
Packit d370c2
 * all the map functiondoes, and we can change this for _all_
Packit d370c2
 * colour chooser buttons, since they are used only in our
Packit d370c2
 * profile preferences dialogue.
Packit d370c2
 */
Packit d370c2
Packit d370c2
static void
Packit d370c2
fixup_color_chooser_dialog_map (GtkWidget *widget)
Packit d370c2
{
Packit d370c2
  g_object_set (GTK_COLOR_CHOOSER_DIALOG (widget), "show-editor", TRUE, NULL);
Packit d370c2
Packit d370c2
  GTK_WIDGET_CLASS (g_type_class_peek_parent (GTK_COLOR_CHOOSER_DIALOG_GET_CLASS (widget)))->map (widget);
Packit d370c2
}
Packit d370c2
Packit d370c2
static void
Packit d370c2
fixup_color_chooser_button (void)
Packit d370c2
{
Packit d370c2
  static gboolean done = FALSE;
Packit d370c2
Packit d370c2
  if (!done) {
Packit d370c2
    GtkColorChooserDialogClass *klass;
Packit d370c2
    klass = g_type_class_ref (GTK_TYPE_COLOR_CHOOSER_DIALOG);
Packit d370c2
    g_assert (klass != NULL);
Packit d370c2
    GTK_WIDGET_CLASS (klass)->map = fixup_color_chooser_dialog_map;
Packit d370c2
    g_type_class_unref (klass);
Packit d370c2
    done = TRUE;
Packit d370c2
  }
Packit d370c2
}
Packit d370c2
Packit d370c2
#endif /* GTK+ < 3.19.8 HACK */
Packit d370c2
Packit d370c2
static gboolean
Packit d370c2
monospace_filter (const PangoFontFamily *family,
Packit d370c2
                  const PangoFontFace   *face,
Packit d370c2
                  gpointer data)
Packit d370c2
{
Packit d370c2
  return pango_font_family_is_monospace ((PangoFontFamily *) family);
Packit d370c2
}
Packit d370c2
Packit d370c2
/* Called once per Preferences window, to initialize stuff that doesn't depend on the profile being edited */
Packit d370c2
void
Packit d370c2
profile_prefs_init (void)
Packit d370c2
{
Packit d370c2
  GtkWidget *w;
Packit d370c2
  GtkBuilder *builder = the_pref_data->builder;
Packit d370c2
  char *text;
Packit d370c2
Packit d370c2
  the_pref_data->profile_signals = g_array_new (FALSE, FALSE, sizeof (ProfilePrefsSignal));
Packit d370c2
  the_pref_data->profile_bindings = g_array_new (FALSE, FALSE, sizeof (ProfilePrefsBinding));
Packit d370c2
Packit d370c2
#if !GTK_CHECK_VERSION (3, 19, 8)
Packit d370c2
  fixup_color_chooser_button ();
Packit d370c2
#endif
Packit d370c2
Packit d370c2
  w = (GtkWidget *) gtk_builder_get_object (builder, "profile-editor-notebook");
Packit d370c2
  gtk_widget_add_events (w, GDK_BUTTON_PRESS_MASK | GDK_SCROLL_MASK);
Packit d370c2
  g_signal_connect (w, "scroll-event", G_CALLBACK (scroll_event_cb), NULL);
Packit d370c2
Packit d370c2
  w = (GtkWidget *) gtk_builder_get_object (builder, "color-scheme-combobox");
Packit d370c2
  init_color_scheme_menu (w);
Packit d370c2
Packit d370c2
  w = (GtkWidget *) gtk_builder_get_object (builder, "encoding-combobox");
Packit d370c2
  init_encodings_combo (w);
Packit d370c2
Packit d370c2
  /* Translators: Appears as: [numeric entry] × width */
Packit d370c2
  text = g_strdup_printf ("× %s", _("width"));
Packit d370c2
  gtk_label_set_text ((GtkLabel *) gtk_builder_get_object (builder, "cell-width-scale-label"),
Packit d370c2
                      text);
Packit d370c2
  g_free (text);
Packit d370c2
  /* Translators: Appears as: [numeric entry] × height */
Packit d370c2
  text = g_strdup_printf ("× %s", _("height"));
Packit d370c2
  gtk_label_set_text ((GtkLabel *) gtk_builder_get_object (builder, "cell-height-scale-label"),
Packit d370c2
                      text);
Packit d370c2
  g_free (text);
Packit d370c2
}
Packit d370c2
Packit d370c2
/* Called each time the user switches away from a profile, so it's no longer being edited */
Packit d370c2
void
Packit d370c2
profile_prefs_unload (void)
Packit d370c2
{
Packit d370c2
  profile_prefs_signal_handlers_disconnect_all ();
Packit d370c2
  profile_prefs_settings_unbind_all ();
Packit d370c2
}
Packit d370c2
Packit d370c2
/* Called each time the user selects a new profile to edit */
Packit d370c2
void
Packit d370c2
profile_prefs_load (const char *uuid, GSettings *profile)
Packit d370c2
{
Packit d370c2
  GtkWidget *w;
Packit d370c2
  GtkBuilder *builder = the_pref_data->builder;
Packit d370c2
  guint i;
Packit d370c2
Packit d370c2
  profile_prefs_unload ();
Packit d370c2
Packit d370c2
  gtk_label_set_text (GTK_LABEL (gtk_builder_get_object (builder, "profile-uuid")),
Packit d370c2
                      uuid);
Packit d370c2
Packit d370c2
  profile_prefs_signal_connect (gtk_builder_get_object (builder, "default-size-reset-button"),
Packit d370c2
                                "clicked",
Packit d370c2
                                G_CALLBACK (default_size_reset_cb),
Packit d370c2
                                profile);
Packit d370c2
  profile_prefs_signal_connect (gtk_builder_get_object (builder, "cell-scale-reset-button"),
Packit d370c2
                                "clicked",
Packit d370c2
                                G_CALLBACK (cell_scale_reset_cb),
Packit d370c2
                                profile);
Packit d370c2
Packit d370c2
  /* Hook up the palette colorpickers and combo box */
Packit d370c2
Packit d370c2
  for (i = 0; i < TERMINAL_PALETTE_SIZE; ++i)
Packit d370c2
    {
Packit d370c2
      char name[32];
Packit d370c2
      char *text;
Packit d370c2
Packit d370c2
      g_snprintf (name, sizeof (name), "palette-colorpicker-%u", i);
Packit d370c2
      w = (GtkWidget *) gtk_builder_get_object (builder, name);
Packit d370c2
Packit d370c2
#if GTK_CHECK_VERSION (3, 19, 8)
Packit d370c2
      g_object_set (w, "show-editor", TRUE, NULL);
Packit d370c2
#endif
Packit d370c2
Packit d370c2
      g_object_set_data (G_OBJECT (w), "palette-entry-index", GUINT_TO_POINTER (i));
Packit d370c2
Packit d370c2
      text = g_strdup_printf (_("Choose Palette Color %u"), i);
Packit d370c2
      gtk_color_button_set_title (GTK_COLOR_BUTTON (w), text);
Packit d370c2
      g_free (text);
Packit d370c2
Packit d370c2
      text = g_strdup_printf (_("Palette entry %u"), i);
Packit d370c2
      gtk_widget_set_tooltip_text (w, text);
Packit d370c2
      g_free (text);
Packit d370c2
Packit d370c2
      profile_prefs_signal_connect (w, "notify::rgba",
Packit d370c2
                                    G_CALLBACK (palette_color_notify_cb),
Packit d370c2
                                    profile);
Packit d370c2
    }
Packit d370c2
Packit d370c2
  profile_palette_notify_colorpickers_cb (profile, TERMINAL_PROFILE_PALETTE_KEY, NULL);
Packit d370c2
  profile_prefs_signal_connect (profile, "changed::" TERMINAL_PROFILE_PALETTE_KEY,
Packit d370c2
                                G_CALLBACK (profile_palette_notify_colorpickers_cb),
Packit d370c2
                                NULL);
Packit d370c2
Packit d370c2
  w = (GtkWidget *) gtk_builder_get_object (builder, "palette-combobox");
Packit d370c2
  profile_prefs_signal_connect (w, "notify::active",
Packit d370c2
                                G_CALLBACK (palette_scheme_combo_changed_cb),
Packit d370c2
                                profile);
Packit d370c2
Packit d370c2
  profile_palette_notify_scheme_combo_cb (profile, TERMINAL_PROFILE_PALETTE_KEY, GTK_COMBO_BOX (w));
Packit d370c2
  profile_prefs_signal_connect (profile, "changed::" TERMINAL_PROFILE_PALETTE_KEY,
Packit d370c2
                                G_CALLBACK (profile_palette_notify_scheme_combo_cb),
Packit d370c2
                                w);
Packit d370c2
Packit d370c2
  /* Hook up the color scheme pickers and combo box */
Packit d370c2
  w = (GtkWidget *) gtk_builder_get_object (builder, "color-scheme-combobox");
Packit d370c2
  profile_prefs_signal_connect (w, "notify::active",
Packit d370c2
                                G_CALLBACK (color_scheme_combo_changed_cb),
Packit d370c2
                                profile);
Packit d370c2
Packit d370c2
  profile_colors_notify_scheme_combo_cb (profile, NULL, GTK_COMBO_BOX (w));
Packit d370c2
  profile_prefs_signal_connect (profile, "changed::" TERMINAL_PROFILE_FOREGROUND_COLOR_KEY,
Packit d370c2
                                G_CALLBACK (profile_colors_notify_scheme_combo_cb),
Packit d370c2
                                w);
Packit d370c2
  profile_prefs_signal_connect (profile, "changed::" TERMINAL_PROFILE_BACKGROUND_COLOR_KEY,
Packit d370c2
                                G_CALLBACK (profile_colors_notify_scheme_combo_cb),
Packit d370c2
                                w);
Packit d370c2
Packit d370c2
  w = GTK_WIDGET (gtk_builder_get_object (builder, "custom-command-entry"));
Packit d370c2
  custom_command_entry_changed_cb (GTK_ENTRY (w));
Packit d370c2
  profile_prefs_signal_connect (w, "changed",
Packit d370c2
                                G_CALLBACK (custom_command_entry_changed_cb), NULL);
Packit d370c2
Packit d370c2
  profile_prefs_signal_connect (gtk_builder_get_object (builder, "reset-compat-defaults-button"),
Packit d370c2
                                "clicked",
Packit d370c2
                                G_CALLBACK (reset_compat_defaults_cb),
Packit d370c2
                                profile);
Packit d370c2
Packit d370c2
  w = GTK_WIDGET (gtk_builder_get_object (builder, "background-colorpicker"));
Packit d370c2
#if GTK_CHECK_VERSION (3, 19, 8)
Packit d370c2
  g_object_set (w, "show-editor", TRUE, NULL);
Packit d370c2
#endif
Packit d370c2
  profile_prefs_settings_bind_with_mapping (profile,
Packit d370c2
                                            TERMINAL_PROFILE_BACKGROUND_COLOR_KEY,
Packit d370c2
                                            w,
Packit d370c2
                                            "rgba",
Packit d370c2
                                            G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET,
Packit d370c2
                                            (GSettingsBindGetMapping) s_to_rgba,
Packit d370c2
                                            (GSettingsBindSetMapping) rgba_to_s,
Packit d370c2
                                            NULL, NULL);
Packit d370c2
Packit d370c2
  profile_prefs_settings_bind_with_mapping (profile,
Packit d370c2
                                            TERMINAL_PROFILE_BACKSPACE_BINDING_KEY,
Packit d370c2
                                            gtk_builder_get_object (builder,
Packit d370c2
                                                                    "backspace-binding-combobox"),
Packit d370c2
                                            "active",
Packit d370c2
                                            G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET,
Packit d370c2
                                            (GSettingsBindGetMapping) string_to_enum,
Packit d370c2
                                            (GSettingsBindSetMapping) enum_to_string,
Packit d370c2
                                            vte_erase_binding_get_type, NULL);
Packit d370c2
  profile_prefs_settings_bind (profile,
Packit d370c2
                               TERMINAL_PROFILE_BOLD_IS_BRIGHT_KEY,
Packit d370c2
                               gtk_builder_get_object (builder, "bold-is-bright-checkbutton"),
Packit d370c2
                               "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_BOLD_COLOR_SAME_AS_FG_KEY,
Packit d370c2
                               gtk_builder_get_object (builder,
Packit d370c2
                                                       "bold-color-checkbutton"),
Packit d370c2
                               "active",
Packit d370c2
                               G_SETTINGS_BIND_GET |
Packit d370c2
                               G_SETTINGS_BIND_INVERT_BOOLEAN |
Packit d370c2
                               G_SETTINGS_BIND_SET);
Packit d370c2
Packit d370c2
  w = GTK_WIDGET (gtk_builder_get_object (builder, "bold-colorpicker"));
Packit d370c2
#if GTK_CHECK_VERSION (3, 19, 8)
Packit d370c2
  g_object_set (w, "show-editor", TRUE, NULL);
Packit d370c2
#endif
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_BOLD_COLOR_SAME_AS_FG_KEY,
Packit d370c2
                               w,
Packit d370c2
                               "sensitive",
Packit d370c2
                               G_SETTINGS_BIND_GET |
Packit d370c2
                               G_SETTINGS_BIND_INVERT_BOOLEAN |
Packit d370c2
                               G_SETTINGS_BIND_NO_SENSITIVITY);
Packit d370c2
  profile_prefs_settings_bind_with_mapping (profile, TERMINAL_PROFILE_BOLD_COLOR_KEY,
Packit d370c2
                                            w,
Packit d370c2
                                            "rgba",
Packit d370c2
                                            G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET | G_SETTINGS_BIND_NO_SENSITIVITY,
Packit d370c2
                                            (GSettingsBindGetMapping) s_to_rgba,
Packit d370c2
                                            (GSettingsBindSetMapping) rgba_to_s,
Packit d370c2
                                            NULL, NULL);
Packit d370c2
Packit d370c2
  w = GTK_WIDGET (gtk_builder_get_object (builder, "cell-height-scale-spinbutton"));
Packit d370c2
  set_input_hints (w);
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_CELL_HEIGHT_SCALE_KEY,
Packit d370c2
                               gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (w)),
Packit d370c2
                               "value", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
Packit d370c2
Packit d370c2
  w = GTK_WIDGET (gtk_builder_get_object (builder, "cell-width-scale-spinbutton"));
Packit d370c2
  set_input_hints (w);
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_CELL_WIDTH_SCALE_KEY,
Packit d370c2
                               gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (w)),
Packit d370c2
                               "value", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
Packit d370c2
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_CURSOR_COLORS_SET_KEY,
Packit d370c2
                               gtk_builder_get_object (builder,
Packit d370c2
                                                       "cursor-colors-checkbutton"),
Packit d370c2
                               "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
Packit d370c2
Packit d370c2
  w = GTK_WIDGET (gtk_builder_get_object (builder, "cursor-foreground-colorpicker"));
Packit d370c2
#if GTK_CHECK_VERSION (3, 19, 8)
Packit d370c2
  g_object_set (w, "show-editor", TRUE, NULL);
Packit d370c2
#endif
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_CURSOR_COLORS_SET_KEY,
Packit d370c2
                               w,
Packit d370c2
                               "sensitive",
Packit d370c2
                               G_SETTINGS_BIND_GET |
Packit d370c2
                               G_SETTINGS_BIND_NO_SENSITIVITY);
Packit d370c2
  profile_prefs_settings_bind_with_mapping (profile, TERMINAL_PROFILE_CURSOR_FOREGROUND_COLOR_KEY,
Packit d370c2
                                            w,
Packit d370c2
                                            "rgba",
Packit d370c2
                                            G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET | G_SETTINGS_BIND_NO_SENSITIVITY,
Packit d370c2
                                            (GSettingsBindGetMapping) s_to_rgba,
Packit d370c2
                                            (GSettingsBindSetMapping) rgba_to_s,
Packit d370c2
                                            NULL, NULL);
Packit d370c2
Packit d370c2
  w = GTK_WIDGET (gtk_builder_get_object (builder, "cursor-background-colorpicker"));
Packit d370c2
#if GTK_CHECK_VERSION (3, 19, 8)
Packit d370c2
  g_object_set (w, "show-editor", TRUE, NULL);
Packit d370c2
#endif
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_CURSOR_COLORS_SET_KEY,
Packit d370c2
                               w,
Packit d370c2
                               "sensitive",
Packit d370c2
                               G_SETTINGS_BIND_GET |
Packit d370c2
                               G_SETTINGS_BIND_NO_SENSITIVITY);
Packit d370c2
  profile_prefs_settings_bind_with_mapping (profile, TERMINAL_PROFILE_CURSOR_BACKGROUND_COLOR_KEY,
Packit d370c2
                                            w,
Packit d370c2
                                            "rgba",
Packit d370c2
                                            G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET | G_SETTINGS_BIND_NO_SENSITIVITY,
Packit d370c2
                                            (GSettingsBindGetMapping) s_to_rgba,
Packit d370c2
                                            (GSettingsBindSetMapping) rgba_to_s,
Packit d370c2
                                            NULL, NULL);
Packit d370c2
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_HIGHLIGHT_COLORS_SET_KEY,
Packit d370c2
                               gtk_builder_get_object (builder,
Packit d370c2
                                                       "highlight-colors-checkbutton"),
Packit d370c2
                               "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
Packit d370c2
Packit d370c2
  w = GTK_WIDGET (gtk_builder_get_object (builder, "highlight-foreground-colorpicker"));
Packit d370c2
#if GTK_CHECK_VERSION (3, 19, 8)
Packit d370c2
  g_object_set (w, "show-editor", TRUE, NULL);
Packit d370c2
#endif
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_HIGHLIGHT_COLORS_SET_KEY,
Packit d370c2
                               w,
Packit d370c2
                               "sensitive",
Packit d370c2
                               G_SETTINGS_BIND_GET |
Packit d370c2
                               G_SETTINGS_BIND_NO_SENSITIVITY);
Packit d370c2
  profile_prefs_settings_bind_with_mapping (profile, TERMINAL_PROFILE_HIGHLIGHT_FOREGROUND_COLOR_KEY,
Packit d370c2
                                            w,
Packit d370c2
                                            "rgba",
Packit d370c2
                                            G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET | G_SETTINGS_BIND_NO_SENSITIVITY,
Packit d370c2
                                            (GSettingsBindGetMapping) s_to_rgba,
Packit d370c2
                                            (GSettingsBindSetMapping) rgba_to_s,
Packit d370c2
                                            NULL, NULL);
Packit d370c2
Packit d370c2
  w = GTK_WIDGET (gtk_builder_get_object (builder, "highlight-background-colorpicker"));
Packit d370c2
#if GTK_CHECK_VERSION (3, 19, 8)
Packit d370c2
  g_object_set (w, "show-editor", TRUE, NULL);
Packit d370c2
#endif
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_HIGHLIGHT_COLORS_SET_KEY,
Packit d370c2
                               w,
Packit d370c2
                               "sensitive",
Packit d370c2
                               G_SETTINGS_BIND_GET |
Packit d370c2
                               G_SETTINGS_BIND_NO_SENSITIVITY);
Packit d370c2
  profile_prefs_settings_bind_with_mapping (profile, TERMINAL_PROFILE_HIGHLIGHT_BACKGROUND_COLOR_KEY,
Packit d370c2
                                            w,
Packit d370c2
                                            "rgba",
Packit d370c2
                                            G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET | G_SETTINGS_BIND_NO_SENSITIVITY,
Packit d370c2
                                            (GSettingsBindGetMapping) s_to_rgba,
Packit d370c2
                                            (GSettingsBindSetMapping) rgba_to_s,
Packit d370c2
                                            NULL, NULL);
Packit d370c2
Packit d370c2
  profile_prefs_settings_bind_with_mapping (profile, TERMINAL_PROFILE_CURSOR_SHAPE_KEY,
Packit d370c2
                                            gtk_builder_get_object (builder,
Packit d370c2
                                                                    "cursor-shape-combobox"),
Packit d370c2
                                            "active",
Packit d370c2
                                            G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET,
Packit d370c2
                                            (GSettingsBindGetMapping) string_to_enum,
Packit d370c2
                                            (GSettingsBindSetMapping) enum_to_string,
Packit d370c2
                                            vte_cursor_shape_get_type, NULL);
Packit d370c2
  profile_prefs_settings_bind_with_mapping (profile, TERMINAL_PROFILE_CURSOR_BLINK_MODE_KEY,
Packit d370c2
                                            gtk_builder_get_object (builder,
Packit d370c2
                                                                    "cursor-blink-mode-combobox"),
Packit d370c2
                                            "active",
Packit d370c2
                                            G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET,
Packit d370c2
                                            (GSettingsBindGetMapping) string_to_enum,
Packit d370c2
                                            (GSettingsBindSetMapping) enum_to_string,
Packit d370c2
                                            vte_cursor_blink_mode_get_type, NULL);
Packit d370c2
  profile_prefs_settings_bind_with_mapping (profile, TERMINAL_PROFILE_TEXT_BLINK_MODE_KEY,
Packit d370c2
                                            gtk_builder_get_object (builder,
Packit d370c2
                                                                    "text-blink-mode-combobox"),
Packit d370c2
                                            "active",
Packit d370c2
                                            G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET,
Packit d370c2
                                            (GSettingsBindGetMapping) string_to_enum,
Packit d370c2
                                            (GSettingsBindSetMapping) enum_to_string,
Packit d370c2
                                            vte_text_blink_mode_get_type, NULL);
Packit d370c2
Packit d370c2
  w = GTK_WIDGET (gtk_builder_get_object (builder, "custom-command-entry"));
Packit d370c2
  set_input_hints (w);
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_CUSTOM_COMMAND_KEY,
Packit d370c2
                               w,
Packit d370c2
                               "text", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
Packit d370c2
Packit d370c2
  w = GTK_WIDGET (gtk_builder_get_object (builder, "default-size-columns-spinbutton"));
Packit d370c2
  set_input_hints (w);
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_DEFAULT_SIZE_COLUMNS_KEY,
Packit d370c2
                               gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (w)),
Packit d370c2
                               "value", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
Packit d370c2
Packit d370c2
  w = GTK_WIDGET (gtk_builder_get_object (builder, "default-size-rows-spinbutton"));
Packit d370c2
  set_input_hints (w);
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_DEFAULT_SIZE_ROWS_KEY,
Packit d370c2
                               gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (w)),
Packit d370c2
                               "value", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
Packit d370c2
Packit d370c2
  profile_prefs_settings_bind_with_mapping (profile, TERMINAL_PROFILE_DELETE_BINDING_KEY,
Packit d370c2
                                            gtk_builder_get_object (builder,
Packit d370c2
                                                                    "delete-binding-combobox"),
Packit d370c2
                                            "active",
Packit d370c2
                                            G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET,
Packit d370c2
                                            (GSettingsBindGetMapping) string_to_enum,
Packit d370c2
                                            (GSettingsBindSetMapping) enum_to_string,
Packit d370c2
                                            vte_erase_binding_get_type, NULL);
Packit d370c2
  profile_prefs_settings_bind_with_mapping (profile, TERMINAL_PROFILE_EXIT_ACTION_KEY,
Packit d370c2
                                            gtk_builder_get_object (builder,
Packit d370c2
                                                                    "exit-action-combobox"),
Packit d370c2
                                            "active",
Packit d370c2
                                            G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET,
Packit d370c2
                                            (GSettingsBindGetMapping) string_to_enum,
Packit d370c2
                                            (GSettingsBindSetMapping) enum_to_string,
Packit d370c2
                                            terminal_exit_action_get_type, NULL);
Packit d370c2
  w = (GtkWidget*) gtk_builder_get_object (builder, "font-selector");
Packit d370c2
  gtk_font_chooser_set_filter_func (GTK_FONT_CHOOSER (w), monospace_filter, NULL, NULL);
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_FONT_KEY,
Packit d370c2
                               w,
Packit d370c2
                               "font-name", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
Packit d370c2
Packit d370c2
  w = GTK_WIDGET (gtk_builder_get_object (builder, "foreground-colorpicker"));
Packit d370c2
#if GTK_CHECK_VERSION (3, 19, 8)
Packit d370c2
      g_object_set (w, "show-editor", TRUE, NULL);
Packit d370c2
#endif
Packit d370c2
  profile_prefs_settings_bind_with_mapping (profile,
Packit d370c2
                                            TERMINAL_PROFILE_FOREGROUND_COLOR_KEY,
Packit d370c2
                                            w,
Packit d370c2
                                            "rgba",
Packit d370c2
                                            G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET,
Packit d370c2
                                            (GSettingsBindGetMapping) s_to_rgba,
Packit d370c2
                                            (GSettingsBindSetMapping) rgba_to_s,
Packit d370c2
                                            NULL, NULL);
Packit d370c2
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_LOGIN_SHELL_KEY,
Packit d370c2
                               gtk_builder_get_object (builder,
Packit d370c2
                                                       "login-shell-checkbutton"),
Packit d370c2
                               "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
Packit d370c2
Packit d370c2
  w = GTK_WIDGET (gtk_builder_get_object (builder, "scrollback-lines-spinbutton"));
Packit d370c2
  set_input_hints (w);
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_SCROLLBACK_LINES_KEY,
Packit d370c2
                               gtk_spin_button_get_adjustment (GTK_SPIN_BUTTON (w)),
Packit d370c2
                               "value", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
Packit d370c2
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_SCROLLBACK_UNLIMITED_KEY,
Packit d370c2
                               gtk_builder_get_object (builder,
Packit d370c2
                                                       "scrollback-limited-checkbutton"),
Packit d370c2
                               "active",
Packit d370c2
                               G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET |
Packit d370c2
                               G_SETTINGS_BIND_INVERT_BOOLEAN);
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_SCROLLBACK_UNLIMITED_KEY,
Packit d370c2
                               gtk_builder_get_object (builder,
Packit d370c2
                                                       "scrollback-box"),
Packit d370c2
                               "sensitive",
Packit d370c2
                               G_SETTINGS_BIND_GET |
Packit d370c2
                               G_SETTINGS_BIND_INVERT_BOOLEAN |
Packit d370c2
                               G_SETTINGS_BIND_NO_SENSITIVITY);
Packit d370c2
  profile_prefs_settings_bind_with_mapping (profile,
Packit d370c2
                                            TERMINAL_PROFILE_SCROLLBAR_POLICY_KEY,
Packit d370c2
                                            gtk_builder_get_object (builder,
Packit d370c2
                                                                    "scrollbar-checkbutton"),
Packit d370c2
                                            "active",
Packit d370c2
                                            G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET,
Packit d370c2
                                            (GSettingsBindGetMapping) scrollbar_policy_to_bool,
Packit d370c2
                                            (GSettingsBindSetMapping) bool_to_scrollbar_policy,
Packit d370c2
                                            NULL, NULL);
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_SCROLL_ON_KEYSTROKE_KEY,
Packit d370c2
                               gtk_builder_get_object (builder,
Packit d370c2
                                                       "scroll-on-keystroke-checkbutton"),
Packit d370c2
                               "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_SCROLL_ON_OUTPUT_KEY,
Packit d370c2
                               gtk_builder_get_object (builder,
Packit d370c2
                                                       "scroll-on-output-checkbutton"),
Packit d370c2
                               "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_USE_SYSTEM_FONT_KEY,
Packit d370c2
                               gtk_builder_get_object (builder,
Packit d370c2
                                                       "custom-font-checkbutton"),
Packit d370c2
                               "active",
Packit d370c2
                               G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET |
Packit d370c2
                               G_SETTINGS_BIND_INVERT_BOOLEAN);
Packit 9982d0
  profile_prefs_settings_bind (profile,
Packit 9982d0
                               TERMINAL_PROFILE_TITLE_KEY,
Packit 9982d0
                               gtk_builder_get_object (builder, "title-entry"),
Packit 9982d0
                               "text",
Packit 9982d0
                               G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
Packit 9982d0
  profile_prefs_settings_bind_with_mapping (profile,
Packit 9982d0
                                            TERMINAL_PROFILE_TITLE_MODE_KEY,
Packit 9982d0
                                            gtk_builder_get_object (builder,
Packit 9982d0
                                                                    "title-mode-combobox"),
Packit 9982d0
                                            "active",
Packit 9982d0
                                            G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET,
Packit 9982d0
                                            (GSettingsBindGetMapping) string_to_enum,
Packit 9982d0
                                            (GSettingsBindSetMapping) enum_to_string,
Packit 9982d0
                                            terminal_title_mode_get_type, NULL);
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_USE_CUSTOM_COMMAND_KEY,
Packit d370c2
                               gtk_builder_get_object (builder,
Packit d370c2
                                                       "use-custom-command-checkbutton"),
Packit d370c2
                               "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_USE_THEME_COLORS_KEY,
Packit d370c2
                               gtk_builder_get_object (builder,
Packit d370c2
                                                       "use-theme-colors-checkbutton"),
Packit d370c2
                               "active", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_AUDIBLE_BELL_KEY,
Packit d370c2
                               gtk_builder_get_object (builder, "bell-checkbutton"),
Packit d370c2
                               "active",
Packit d370c2
                               G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
Packit d370c2
Packit d370c2
  profile_prefs_settings_bind (profile,
Packit d370c2
                               TERMINAL_PROFILE_USE_CUSTOM_COMMAND_KEY,
Packit d370c2
                               gtk_builder_get_object (builder, "custom-command-entry-label"),
Packit d370c2
                               "sensitive",
Packit d370c2
                               G_SETTINGS_BIND_GET | G_SETTINGS_BIND_NO_SENSITIVITY);
Packit d370c2
  profile_prefs_settings_bind (profile,
Packit d370c2
                               TERMINAL_PROFILE_USE_CUSTOM_COMMAND_KEY,
Packit d370c2
                               gtk_builder_get_object (builder, "custom-command-entry"),
Packit d370c2
                               "sensitive",
Packit d370c2
                               G_SETTINGS_BIND_GET | G_SETTINGS_BIND_NO_SENSITIVITY);
Packit d370c2
  profile_prefs_settings_bind (profile,
Packit d370c2
                               TERMINAL_PROFILE_USE_SYSTEM_FONT_KEY,
Packit d370c2
                               gtk_builder_get_object (builder, "font-selector"),
Packit d370c2
                               "sensitive",
Packit d370c2
                               G_SETTINGS_BIND_GET | G_SETTINGS_BIND_INVERT_BOOLEAN |
Packit d370c2
                               G_SETTINGS_BIND_NO_SENSITIVITY);
Packit d370c2
  profile_prefs_settings_bind (profile,
Packit d370c2
                               TERMINAL_PROFILE_USE_THEME_COLORS_KEY,
Packit d370c2
                               gtk_builder_get_object (builder, "colors-box"),
Packit d370c2
                               "sensitive",
Packit d370c2
                               G_SETTINGS_BIND_GET | G_SETTINGS_BIND_INVERT_BOOLEAN |
Packit d370c2
                               G_SETTINGS_BIND_NO_SENSITIVITY);
Packit d370c2
  profile_prefs_settings_bind_writable (profile,
Packit d370c2
                                        TERMINAL_PROFILE_PALETTE_KEY,
Packit d370c2
                                        gtk_builder_get_object (builder, "palette-box"),
Packit d370c2
                                        "sensitive",
Packit d370c2
                                        FALSE);
Packit d370c2
Packit d370c2
  /* Compatibility options */
Packit d370c2
  w = (GtkWidget *) gtk_builder_get_object (builder, "encoding-combobox");
Packit d370c2
  profile_prefs_settings_bind (profile,
Packit d370c2
                               TERMINAL_PROFILE_ENCODING_KEY,
Packit d370c2
                               w,
Packit d370c2
                               "active-id", G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
Packit d370c2
Packit d370c2
  w = (GtkWidget *) gtk_builder_get_object (builder, "cjk-ambiguous-width-combobox");
Packit d370c2
  profile_prefs_settings_bind (profile, TERMINAL_PROFILE_CJK_UTF8_AMBIGUOUS_WIDTH_KEY,
Packit d370c2
                               w,
Packit d370c2
                               "active-id",
Packit d370c2
                               G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
Packit 9982d0
Packit 9982d0
  profile_prefs_settings_bind (profile,
Packit 9982d0
                               TERMINAL_PROFILE_USE_TRANSPARENT_BACKGROUND,
Packit 9982d0
                               gtk_builder_get_object (builder, "use-transparent-background"),
Packit 9982d0
                               "active",
Packit 9982d0
                               G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
Packit 9982d0
  profile_prefs_settings_bind (profile,
Packit 9982d0
                               TERMINAL_PROFILE_USE_TRANSPARENT_BACKGROUND,
Packit 9982d0
                               gtk_builder_get_object (builder, "background-transparent-scale"),
Packit 9982d0
                               "sensitive",
Packit 9982d0
                               G_SETTINGS_BIND_GET | G_SETTINGS_BIND_NO_SENSITIVITY);
Packit 9982d0
  profile_prefs_settings_bind (profile,
Packit 9982d0
                               TERMINAL_PROFILE_BACKGROUND_TRANSPARENCY_PERCENT,
Packit 9982d0
                               gtk_builder_get_object (builder, "background-transparent-adjustment"),
Packit 9982d0
                               "value",
Packit 9982d0
                               G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
Packit d370c2
}
Packit d370c2
Packit d370c2
/* Called once per Preferences window, to destroy stuff that doesn't depend on the profile being edited */
Packit d370c2
void
Packit d370c2
profile_prefs_destroy (void)
Packit d370c2
{
Packit d370c2
  profile_prefs_unload ();
Packit d370c2
Packit d370c2
  g_array_free (the_pref_data->profile_signals, TRUE);
Packit d370c2
  g_array_free (the_pref_data->profile_bindings, TRUE);
Packit d370c2
}