/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
/*
* gedit-preferences-dialog.c
* This file is part of gedit
*
* Copyright (C) 2001-2005 Paolo Maggi
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see .
*/
#include "config.h"
#include "gedit-preferences-dialog.h"
#include
#include
#include
#include
#include "gedit-debug.h"
#include "gedit-dirs.h"
#include "gedit-settings.h"
/*
* gedit-preferences dialog is a singleton since we don't
* want two dialogs showing an inconsistent state of the
* preferences.
* When gedit_show_preferences_dialog is called and there
* is already a prefs dialog dialog open, it is reparented
* and shown.
*/
static GtkWidget *preferences_dialog = NULL;
#define GEDIT_SCHEME_ROW_ID_KEY "gedit-scheme-row-id"
#define GEDIT_TYPE_PREFERENCES_DIALOG (gedit_preferences_dialog_get_type())
G_DECLARE_FINAL_TYPE (GeditPreferencesDialog, gedit_preferences_dialog, GEDIT, PREFERENCES_DIALOG, GtkWindow)
enum
{
ID_COLUMN = 0,
NAME_COLUMN,
DESC_COLUMN,
NUM_COLUMNS
};
enum
{
CLOSE,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL];
struct _GeditPreferencesDialog
{
GtkWindow parent_instance;
GSettings *editor;
GSettings *uisettings; /* unfortunately our settings are split for historical reasons */
GtkWidget *notebook;
/* Style Scheme */
GtkWidget *schemes_list;
GtkWidget *install_scheme_button;
GtkWidget *uninstall_scheme_button;
GtkWidget *schemes_toolbar;
GtkFileChooserNative *
install_scheme_file_chooser;
/* Tabs */
GtkWidget *tabs_width_spinbutton;
GtkWidget *insert_spaces_checkbutton;
/* Auto indentation */
GtkWidget *auto_indent_checkbutton;
/* Text Wrapping */
GtkWidget *wrap_text_checkbutton;
GtkWidget *split_checkbutton;
/* File Saving */
GtkWidget *backup_copy_checkbutton;
GtkWidget *auto_save_checkbutton;
GtkWidget *auto_save_spinbutton;
GtkWidget *display_line_numbers_checkbutton;
GtkWidget *display_statusbar_checkbutton;
GtkWidget *display_grid_checkbutton;
/* Right margin */
GtkWidget *right_margin_checkbutton;
GtkWidget *right_margin_position_grid;
GtkWidget *right_margin_position_spinbutton;
/* Highlighting */
GtkWidget *highlight_current_line_checkbutton;
GtkWidget *bracket_matching_checkbutton;
/* Plugin manager */
GtkWidget *plugin_manager;
/* Placeholders */
GtkGrid *font_component_placeholder;
};
G_DEFINE_TYPE (GeditPreferencesDialog, gedit_preferences_dialog, GTK_TYPE_WINDOW)
static void
gedit_preferences_dialog_dispose (GObject *object)
{
GeditPreferencesDialog *dlg = GEDIT_PREFERENCES_DIALOG (object);
g_clear_object (&dlg->editor);
g_clear_object (&dlg->uisettings);
G_OBJECT_CLASS (gedit_preferences_dialog_parent_class)->dispose (object);
}
static void
gedit_preferences_dialog_close (GeditPreferencesDialog *dialog)
{
gtk_window_close (GTK_WINDOW (dialog));
}
static void
gedit_preferences_dialog_class_init (GeditPreferencesDialogClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
GtkBindingSet *binding_set;
/* Otherwise libpeas-gtk might not be linked */
g_type_ensure (PEAS_GTK_TYPE_PLUGIN_MANAGER);
object_class->dispose = gedit_preferences_dialog_dispose;
signals[CLOSE] =
g_signal_new_class_handler ("close",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
G_CALLBACK (gedit_preferences_dialog_close),
NULL, NULL, NULL,
G_TYPE_NONE,
0);
binding_set = gtk_binding_set_by_class (klass);
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0, "close", 0);
/* Bind class to template */
gtk_widget_class_set_template_from_resource (widget_class,
"/org/gnome/gedit/ui/gedit-preferences-dialog.ui");
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, notebook);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, display_line_numbers_checkbutton);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, display_statusbar_checkbutton);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, display_grid_checkbutton);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, right_margin_checkbutton);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, right_margin_position_grid);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, right_margin_position_spinbutton);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, highlight_current_line_checkbutton);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, bracket_matching_checkbutton);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, wrap_text_checkbutton);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, split_checkbutton);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, tabs_width_spinbutton);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, insert_spaces_checkbutton);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, auto_indent_checkbutton);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, backup_copy_checkbutton);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, auto_save_checkbutton);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, auto_save_spinbutton);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, schemes_list);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, install_scheme_button);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, uninstall_scheme_button);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, schemes_toolbar);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, plugin_manager);
gtk_widget_class_bind_template_child (widget_class, GeditPreferencesDialog, font_component_placeholder);
}
static void
setup_editor_page (GeditPreferencesDialog *dlg)
{
gedit_debug (DEBUG_PREFS);
/* Connect signal */
g_settings_bind (dlg->editor,
GEDIT_SETTINGS_TABS_SIZE,
dlg->tabs_width_spinbutton,
"value",
G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
g_settings_bind (dlg->editor,
GEDIT_SETTINGS_INSERT_SPACES,
dlg->insert_spaces_checkbutton,
"active",
G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
g_settings_bind (dlg->editor,
GEDIT_SETTINGS_AUTO_INDENT,
dlg->auto_indent_checkbutton,
"active",
G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
g_settings_bind (dlg->editor,
GEDIT_SETTINGS_CREATE_BACKUP_COPY,
dlg->backup_copy_checkbutton,
"active",
G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
g_settings_bind (dlg->editor,
GEDIT_SETTINGS_BRACKET_MATCHING,
dlg->bracket_matching_checkbutton,
"active",
G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
g_settings_bind (dlg->editor,
GEDIT_SETTINGS_AUTO_SAVE_INTERVAL,
dlg->auto_save_spinbutton,
"value",
G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
g_settings_bind (dlg->editor,
GEDIT_SETTINGS_AUTO_SAVE,
dlg->auto_save_spinbutton,
"sensitive",
G_SETTINGS_BIND_GET);
g_settings_bind (dlg->editor,
GEDIT_SETTINGS_AUTO_SAVE,
dlg->auto_save_checkbutton,
"active",
G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
}
static void
wrap_mode_checkbutton_toggled (GtkToggleButton *button,
GeditPreferencesDialog *dlg)
{
GtkWrapMode mode;
if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dlg->wrap_text_checkbutton)))
{
mode = GTK_WRAP_NONE;
gtk_widget_set_sensitive (dlg->split_checkbutton,
FALSE);
gtk_toggle_button_set_inconsistent (
GTK_TOGGLE_BUTTON (dlg->split_checkbutton), TRUE);
}
else
{
gtk_widget_set_sensitive (dlg->split_checkbutton,
TRUE);
gtk_toggle_button_set_inconsistent (
GTK_TOGGLE_BUTTON (dlg->split_checkbutton), FALSE);
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dlg->split_checkbutton)))
{
g_settings_set_enum (dlg->editor,
GEDIT_SETTINGS_WRAP_LAST_SPLIT_MODE,
GTK_WRAP_WORD);
mode = GTK_WRAP_WORD;
}
else
{
g_settings_set_enum (dlg->editor,
GEDIT_SETTINGS_WRAP_LAST_SPLIT_MODE,
GTK_WRAP_CHAR);
mode = GTK_WRAP_CHAR;
}
}
g_settings_set_enum (dlg->editor,
GEDIT_SETTINGS_WRAP_MODE,
mode);
}
static void
grid_checkbutton_toggled (GtkToggleButton *button,
GeditPreferencesDialog *dlg)
{
GtkSourceBackgroundPatternType background_type;
background_type = gtk_toggle_button_get_active (button) ?
GTK_SOURCE_BACKGROUND_PATTERN_TYPE_GRID :
GTK_SOURCE_BACKGROUND_PATTERN_TYPE_NONE;
g_settings_set_enum (dlg->editor,
GEDIT_SETTINGS_BACKGROUND_PATTERN,
background_type);
}
static void
setup_view_page (GeditPreferencesDialog *dlg)
{
GtkWrapMode wrap_mode;
GtkWrapMode last_split_mode;
GtkSourceBackgroundPatternType background_pattern;
gboolean display_right_margin;
guint right_margin_position;
gedit_debug (DEBUG_PREFS);
/* Get values */
display_right_margin = g_settings_get_boolean (dlg->editor,
GEDIT_SETTINGS_DISPLAY_RIGHT_MARGIN);
g_settings_get (dlg->editor, GEDIT_SETTINGS_RIGHT_MARGIN_POSITION,
"u", &right_margin_position);
background_pattern = g_settings_get_enum (dlg->editor,
GEDIT_SETTINGS_BACKGROUND_PATTERN);
wrap_mode = g_settings_get_enum (dlg->editor,
GEDIT_SETTINGS_WRAP_MODE);
/* Set initial state */
switch (wrap_mode)
{
case GTK_WRAP_WORD:
gtk_toggle_button_set_active (
GTK_TOGGLE_BUTTON (dlg->wrap_text_checkbutton), TRUE);
gtk_toggle_button_set_active (
GTK_TOGGLE_BUTTON (dlg->split_checkbutton), TRUE);
g_settings_set_enum (dlg->editor,
GEDIT_SETTINGS_WRAP_LAST_SPLIT_MODE,
GTK_WRAP_WORD);
break;
case GTK_WRAP_CHAR:
gtk_toggle_button_set_active (
GTK_TOGGLE_BUTTON (dlg->wrap_text_checkbutton), TRUE);
gtk_toggle_button_set_active (
GTK_TOGGLE_BUTTON (dlg->split_checkbutton), FALSE);
g_settings_set_enum (dlg->editor,
GEDIT_SETTINGS_WRAP_LAST_SPLIT_MODE,
GTK_WRAP_CHAR);
break;
default:
gtk_toggle_button_set_active (
GTK_TOGGLE_BUTTON (dlg->wrap_text_checkbutton), FALSE);
last_split_mode = g_settings_get_enum (dlg->editor,
GEDIT_SETTINGS_WRAP_LAST_SPLIT_MODE);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dlg->split_checkbutton),
last_split_mode == GTK_WRAP_WORD);
gtk_toggle_button_set_inconsistent (
GTK_TOGGLE_BUTTON (dlg->split_checkbutton), TRUE);
}
gtk_toggle_button_set_active (
GTK_TOGGLE_BUTTON (dlg->right_margin_checkbutton),
display_right_margin);
gtk_toggle_button_set_active (
GTK_TOGGLE_BUTTON (dlg->display_grid_checkbutton),
background_pattern == GTK_SOURCE_BACKGROUND_PATTERN_TYPE_GRID);
/* Set widgets sensitivity */
gtk_widget_set_sensitive (dlg->split_checkbutton,
(wrap_mode != GTK_WRAP_NONE));
g_settings_bind (dlg->editor,
GEDIT_SETTINGS_DISPLAY_LINE_NUMBERS,
dlg->display_line_numbers_checkbutton,
"active",
G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
g_settings_bind (dlg->editor,
GEDIT_SETTINGS_HIGHLIGHT_CURRENT_LINE,
dlg->highlight_current_line_checkbutton,
"active",
G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
g_settings_bind (dlg->uisettings,
GEDIT_SETTINGS_STATUSBAR_VISIBLE,
dlg->display_statusbar_checkbutton,
"active",
G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
g_settings_bind (dlg->editor,
GEDIT_SETTINGS_DISPLAY_RIGHT_MARGIN,
dlg->right_margin_checkbutton,
"active",
G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
g_settings_bind (dlg->editor,
GEDIT_SETTINGS_DISPLAY_RIGHT_MARGIN,
dlg->right_margin_position_grid,
"sensitive",
G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
g_settings_bind (dlg->editor,
GEDIT_SETTINGS_RIGHT_MARGIN_POSITION,
dlg->right_margin_position_spinbutton,
"value",
G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
g_settings_bind (dlg->editor,
GEDIT_SETTINGS_AUTO_SAVE_INTERVAL,
dlg->auto_save_spinbutton,
"value",
G_SETTINGS_BIND_GET | G_SETTINGS_BIND_SET);
g_signal_connect (dlg->wrap_text_checkbutton,
"toggled",
G_CALLBACK (wrap_mode_checkbutton_toggled),
dlg);
g_signal_connect (dlg->split_checkbutton,
"toggled",
G_CALLBACK (wrap_mode_checkbutton_toggled),
dlg);
g_signal_connect (dlg->display_grid_checkbutton,
"toggled",
G_CALLBACK (grid_checkbutton_toggled),
dlg);
}
static void
setup_font_colors_page_font_section (GeditPreferencesDialog *dlg)
{
GtkWidget *font_component;
font_component = tepl_prefs_create_font_component (dlg->editor,
GEDIT_SETTINGS_USE_DEFAULT_FONT,
GEDIT_SETTINGS_EDITOR_FONT);
gtk_container_add (GTK_CONTAINER (dlg->font_component_placeholder),
font_component);
}
static void
update_style_scheme_buttons_sensisitivity (GeditPreferencesDialog *dlg)
{
GtkSourceStyleScheme *selected_style_scheme;
gboolean editable = FALSE;
selected_style_scheme = gtk_source_style_scheme_chooser_get_style_scheme (GTK_SOURCE_STYLE_SCHEME_CHOOSER (dlg->schemes_list));
if (selected_style_scheme != NULL)
{
const gchar *filename;
filename = gtk_source_style_scheme_get_filename (selected_style_scheme);
if (filename != NULL)
{
editable = g_str_has_prefix (filename, gedit_dirs_get_user_styles_dir ());
}
}
gtk_widget_set_sensitive (dlg->uninstall_scheme_button, editable);
}
static void
style_scheme_notify_cb (GtkSourceStyleSchemeChooser *chooser,
GParamSpec *pspec,
GeditPreferencesDialog *dlg)
{
update_style_scheme_buttons_sensisitivity (dlg);
}
static GFile *
get_user_style_scheme_destination_file (GFile *src_file)
{
gchar *basename;
const gchar *styles_dir;
GFile *dest_file;
basename = g_file_get_basename (src_file);
g_return_val_if_fail (basename != NULL, NULL);
styles_dir = gedit_dirs_get_user_styles_dir ();
dest_file = g_file_new_build_filename (styles_dir, basename, NULL);
g_free (basename);
return dest_file;
}
/* Returns: whether @src_file has been correctly copied to @dest_file. */
static gboolean
copy_file (GFile *src_file,
GFile *dest_file,
GError **error)
{
if (g_file_equal (src_file, dest_file))
{
return FALSE;
}
if (!tepl_utils_create_parent_directories (dest_file, NULL, error))
{
return FALSE;
}
return g_file_copy (src_file,
dest_file,
G_FILE_COPY_OVERWRITE | G_FILE_COPY_TARGET_DEFAULT_PERMS,
NULL, /* cancellable */
NULL, NULL, /* progress callback */
error);
}
/* Get the style scheme ID of @user_style_scheme_file if it has been correctly
* installed and @user_style_scheme_file is a valid style scheme file.
*/
static const gchar *
get_style_scheme_id_after_installing_user_style_scheme (GFile *user_style_scheme_file)
{
GtkSourceStyleSchemeManager *manager;
const gchar * const *scheme_ids;
gint i;
manager = gtk_source_style_scheme_manager_get_default ();
gtk_source_style_scheme_manager_force_rescan (manager);
scheme_ids = gtk_source_style_scheme_manager_get_scheme_ids (manager);
for (i = 0; scheme_ids != NULL && scheme_ids[i] != NULL; i++)
{
const gchar *cur_scheme_id = scheme_ids[i];
GtkSourceStyleScheme *scheme;
const gchar *filename;
GFile *scheme_file;
scheme = gtk_source_style_scheme_manager_get_scheme (manager, cur_scheme_id);
filename = gtk_source_style_scheme_get_filename (scheme);
if (filename == NULL)
{
continue;
}
scheme_file = g_file_new_for_path (filename);
if (g_file_equal (scheme_file, user_style_scheme_file))
{
g_object_unref (scheme_file);
return cur_scheme_id;
}
g_object_unref (scheme_file);
}
return NULL;
}
/* Returns: (nullable): the installed style scheme ID, or %NULL on failure. */
static const gchar *
install_style_scheme (GFile *src_file,
GError **error)
{
GFile *dest_file;
gboolean copied;
const gchar *installed_style_scheme_id = NULL;
GError *my_error = NULL;
g_return_val_if_fail (G_IS_FILE (src_file), NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
dest_file = get_user_style_scheme_destination_file (src_file);
g_return_val_if_fail (dest_file != NULL, NULL);
copied = copy_file (src_file, dest_file, &my_error);
if (my_error != NULL)
{
g_propagate_error (error, my_error);
g_object_unref (dest_file);
return NULL;
}
installed_style_scheme_id = get_style_scheme_id_after_installing_user_style_scheme (dest_file);
if (installed_style_scheme_id == NULL && copied)
{
/* The style scheme has not been correctly installed. */
g_file_delete (dest_file, NULL, &my_error);
if (my_error != NULL)
{
gchar *dest_file_parse_name = g_file_get_parse_name (dest_file);
g_warning ("Failed to delete the file ā%sā: %s",
dest_file_parse_name,
my_error->message);
g_free (dest_file_parse_name);
g_clear_error (&my_error);
}
}
g_object_unref (dest_file);
return installed_style_scheme_id;
}
/*
* uninstall_style_scheme:
* @scheme: a #GtkSourceStyleScheme
*
* Uninstall a user scheme.
*
* Returns: %TRUE on success, %FALSE otherwise.
*/
static gboolean
uninstall_style_scheme (GtkSourceStyleScheme *scheme)
{
GtkSourceStyleSchemeManager *manager;
const gchar *filename;
g_return_val_if_fail (GTK_SOURCE_IS_STYLE_SCHEME (scheme), FALSE);
manager = gtk_source_style_scheme_manager_get_default ();
filename = gtk_source_style_scheme_get_filename (scheme);
if (filename == NULL)
return FALSE;
if (g_unlink (filename) == -1)
return FALSE;
/* Reload the available style schemes */
gtk_source_style_scheme_manager_force_rescan (manager);
return TRUE;
}
static void
add_scheme_chooser_response_cb (GtkFileChooserNative *chooser,
gint response_id,
GeditPreferencesDialog *dialog)
{
GFile *file;
const gchar *scheme_id;
GeditSettings *settings;
GSettings *editor_settings;
GError *error = NULL;
if (response_id != GTK_RESPONSE_ACCEPT)
{
return;
}
file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (chooser));
if (file == NULL)
{
return;
}
scheme_id = install_style_scheme (file, &error);
g_object_unref (file);
if (scheme_id == NULL)
{
if (error != NULL)
{
tepl_utils_show_warning_dialog (GTK_WINDOW (dialog),
_("The selected color scheme cannot be installed: %s"),
error->message);
}
else
{
tepl_utils_show_warning_dialog (GTK_WINDOW (dialog),
_("The selected color scheme cannot be installed."));
}
g_clear_error (&error);
return;
}
settings = _gedit_settings_get_singleton ();
editor_settings = _gedit_settings_peek_editor_settings (settings);
g_settings_set_string (editor_settings, GEDIT_SETTINGS_SCHEME, scheme_id);
}
static void
install_scheme_clicked (GtkButton *button,
GeditPreferencesDialog *dialog)
{
GtkFileChooserNative *chooser;
GtkFileFilter *scheme_filter;
GtkFileFilter *all_filter;
if (dialog->install_scheme_file_chooser != NULL)
{
gtk_native_dialog_show (GTK_NATIVE_DIALOG (dialog->install_scheme_file_chooser));
return;
}
chooser = gtk_file_chooser_native_new (_("Add Color Scheme"),
GTK_WINDOW (dialog),
GTK_FILE_CHOOSER_ACTION_OPEN,
_("_Add Scheme"),
_("_Cancel"));
/* Filters */
scheme_filter = gtk_file_filter_new ();
gtk_file_filter_set_name (scheme_filter, _("Color Scheme Files"));
gtk_file_filter_add_pattern (scheme_filter, "*.xml");
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), scheme_filter);
all_filter = gtk_file_filter_new ();
gtk_file_filter_set_name (all_filter, _("All Files"));
gtk_file_filter_add_pattern (all_filter, "*");
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (chooser), all_filter);
gtk_file_chooser_set_filter (GTK_FILE_CHOOSER (chooser), scheme_filter);
g_signal_connect (chooser,
"response",
G_CALLBACK (add_scheme_chooser_response_cb),
dialog);
g_set_weak_pointer (&dialog->install_scheme_file_chooser, chooser);
gtk_native_dialog_show (GTK_NATIVE_DIALOG (chooser));
}
static void
uninstall_scheme_clicked (GtkButton *button,
GeditPreferencesDialog *dlg)
{
GtkSourceStyleScheme *scheme;
GtkSourceStyleScheme *new_selected_scheme;
scheme = gtk_source_style_scheme_chooser_get_style_scheme (GTK_SOURCE_STYLE_SCHEME_CHOOSER (dlg->schemes_list));
if (scheme == NULL)
{
return;
}
if (!uninstall_style_scheme (scheme))
{
tepl_utils_show_warning_dialog (GTK_WINDOW (dlg),
_("Could not remove color scheme ā%sā."),
gtk_source_style_scheme_get_name (scheme));
return;
}
new_selected_scheme = gtk_source_style_scheme_chooser_get_style_scheme (GTK_SOURCE_STYLE_SCHEME_CHOOSER (dlg->schemes_list));
if (new_selected_scheme == NULL)
{
GeditSettings *settings;
GSettings *editor_settings;
settings = _gedit_settings_get_singleton ();
editor_settings = _gedit_settings_peek_editor_settings (settings);
g_settings_reset (editor_settings, GEDIT_SETTINGS_SCHEME);
}
}
static void
setup_font_colors_page_style_scheme_section (GeditPreferencesDialog *dlg)
{
GtkStyleContext *context;
GeditSettings *settings;
GSettings *editor_settings;
gedit_debug (DEBUG_PREFS);
/* junction between the schemes list and the toolbar */
context = gtk_widget_get_style_context (dlg->schemes_list);
gtk_style_context_set_junction_sides (context, GTK_JUNCTION_BOTTOM);
context = gtk_widget_get_style_context (dlg->schemes_toolbar);
gtk_style_context_set_junction_sides (context, GTK_JUNCTION_TOP);
/* Connect signals */
g_signal_connect (dlg->schemes_list,
"notify::style-scheme",
G_CALLBACK (style_scheme_notify_cb),
dlg);
g_signal_connect (dlg->install_scheme_button,
"clicked",
G_CALLBACK (install_scheme_clicked),
dlg);
g_signal_connect (dlg->uninstall_scheme_button,
"clicked",
G_CALLBACK (uninstall_scheme_clicked),
dlg);
settings = _gedit_settings_get_singleton ();
editor_settings = _gedit_settings_peek_editor_settings (settings);
g_settings_bind (editor_settings, GEDIT_SETTINGS_SCHEME,
dlg->schemes_list, "tepl-style-scheme-id",
G_SETTINGS_BIND_DEFAULT);
update_style_scheme_buttons_sensisitivity (dlg);
}
static void
setup_font_colors_page (GeditPreferencesDialog *dlg)
{
setup_font_colors_page_font_section (dlg);
setup_font_colors_page_style_scheme_section (dlg);
}
static void
setup_plugins_page (GeditPreferencesDialog *dlg)
{
gtk_widget_show_all (dlg->plugin_manager);
}
static void
gedit_preferences_dialog_init (GeditPreferencesDialog *dlg)
{
gedit_debug (DEBUG_PREFS);
dlg->editor = g_settings_new ("org.gnome.gedit.preferences.editor");
dlg->uisettings = g_settings_new ("org.gnome.gedit.preferences.ui");
gtk_widget_init_template (GTK_WIDGET (dlg));
setup_editor_page (dlg);
setup_view_page (dlg);
setup_font_colors_page (dlg);
setup_plugins_page (dlg);
}
void
gedit_show_preferences_dialog (GeditWindow *parent)
{
gedit_debug (DEBUG_PREFS);
if (preferences_dialog == NULL)
{
preferences_dialog = GTK_WIDGET (g_object_new (GEDIT_TYPE_PREFERENCES_DIALOG,
"application", g_application_get_default (),
NULL));
g_signal_connect (preferences_dialog,
"destroy",
G_CALLBACK (gtk_widget_destroyed),
&preferences_dialog);
}
if (GTK_WINDOW (parent) != gtk_window_get_transient_for (GTK_WINDOW (preferences_dialog)))
{
gtk_window_set_transient_for (GTK_WINDOW (preferences_dialog),
GTK_WINDOW (parent));
}
gtk_window_present (GTK_WINDOW (preferences_dialog));
}
/* ex:set ts=8 noet: */