summaryrefslogtreecommitdiff
path: root/pluma/pluma-settings.c
diff options
context:
space:
mode:
Diffstat (limited to 'pluma/pluma-settings.c')
-rw-r--r--pluma/pluma-settings.c1110
1 files changed, 1110 insertions, 0 deletions
diff --git a/pluma/pluma-settings.c b/pluma/pluma-settings.c
new file mode 100644
index 00000000..1cfb7ea3
--- /dev/null
+++ b/pluma/pluma-settings.c
@@ -0,0 +1,1110 @@
+/*
+ * pluma-settings.c
+ * This file is part of pluma
+ *
+ * Copyright (C) 2002-2005 - Paolo Maggi
+ * Copyright (C) 2009 - Ignacio Casal Quinteiro
+ * Copyright (C) 2020 - MATE Desktop Team
+ *
+ * pluma 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.
+ *
+ * pluma 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 pluma; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ */
+
+#include <string.h>
+
+#include "pluma-settings.h"
+#include "pluma-debug.h"
+#include "pluma-view.h"
+#include "pluma-window.h"
+#include "pluma-style-scheme-manager.h"
+#include "pluma-window-private.h"
+
+#define PLUMA_SETTINGS_LOCKDOWN_COMMAND_LINE "disable-command-line"
+#define PLUMA_SETTINGS_LOCKDOWN_PRINTING "disable-printing"
+#define PLUMA_SETTINGS_LOCKDOWN_PRINT_SETUP "disable-print-setup"
+#define PLUMA_SETTINGS_LOCKDOWN_SAVE_TO_DISK "disable-save-to-disk"
+
+#define PLUMA_SETTINGS_SYSTEM_FONT "monospace-font-name"
+
+struct _PlumaSettingsPrivate
+{
+ GSettings *editor_settings;
+ GSettings *lockdown_settings;
+ GSettings *interface_settings;
+
+ gchar *old_scheme;
+};
+
+/* PlumaSettings is a singleton. */
+static PlumaSettings *singleton = NULL;
+
+G_DEFINE_TYPE_WITH_PRIVATE (PlumaSettings, pluma_settings, G_TYPE_OBJECT)
+
+static void
+pluma_settings_dispose (GObject *object)
+{
+ PlumaSettingsPrivate *priv = pluma_settings_get_instance_private (PLUMA_SETTINGS(object));
+
+ g_clear_object (&priv->lockdown_settings);
+ g_clear_object (&priv->interface_settings);
+ g_clear_object (&priv->editor_settings);
+
+ G_OBJECT_CLASS (pluma_settings_parent_class)->dispose (object);
+}
+
+static void
+pluma_settings_finalize (GObject *object)
+{
+ PlumaSettings *self = PLUMA_SETTINGS (object);
+
+ g_free (self->priv->old_scheme);
+
+ if (singleton == self)
+ {
+ singleton = NULL;
+ }
+
+ G_OBJECT_CLASS (pluma_settings_parent_class)->finalize (object);
+}
+
+#ifdef GTK_SOURCE_VERSION_3_24
+static void
+pluma_settings_space_drawer_generic (GSettings *settings,
+ gint level,
+ GtkSourceSpaceTypeFlags type)
+{
+ GList *views;
+ GList *l;
+
+ pluma_debug (DEBUG_PREFS);
+
+ views = pluma_app_get_views (pluma_app_get_default ());
+ l = views;
+
+ while (l != NULL)
+ {
+ pluma_set_source_space_drawer_by_level (GTK_SOURCE_VIEW (l->data),
+ level, type);
+ l = l->next;
+ }
+
+ g_list_free (views);
+}
+#else
+static void
+pluma_settings_draw_generic (GSettings *settings,
+ gint level,
+ GtkSourceSpaceTypeFlags type)
+{
+ GList *views;
+ GList *l;
+
+ pluma_debug (DEBUG_PREFS);
+
+ views = pluma_app_get_views (pluma_app_get_default ());
+ l = views;
+
+ while (l != NULL)
+ {
+ GtkSourceSpaceTypeFlags value;
+
+ value = gtk_source_view_get_draw_spaces (GTK_SOURCE_VIEW (l->data));
+ if (level > 0)
+ value |= type;
+ else
+ value &= ~type;
+ gtk_source_view_set_draw_spaces (GTK_SOURCE_VIEW (l->data),
+ value);
+ l = l->next;
+ }
+
+ g_list_free (views);
+}
+#endif
+
+static void
+on_lockdown_changed (GSettings *settings,
+ const gchar *key,
+ gpointer useless)
+{
+ gboolean locked;
+ PlumaApp *app;
+
+ locked = g_settings_get_boolean (settings, key);
+ app = pluma_app_get_default ();
+
+ if (strcmp (key, PLUMA_SETTINGS_LOCKDOWN_COMMAND_LINE) == 0)
+ _pluma_app_set_lockdown_bit (app,
+ PLUMA_LOCKDOWN_COMMAND_LINE,
+ locked);
+ else if (strcmp (key, PLUMA_SETTINGS_LOCKDOWN_PRINTING) == 0)
+ _pluma_app_set_lockdown_bit (app,
+ PLUMA_LOCKDOWN_PRINTING,
+ locked);
+ else if (strcmp (key, PLUMA_SETTINGS_LOCKDOWN_PRINT_SETUP) == 0)
+ _pluma_app_set_lockdown_bit (app,
+ PLUMA_LOCKDOWN_PRINT_SETUP,
+ locked);
+ else if (strcmp (key, PLUMA_SETTINGS_LOCKDOWN_SAVE_TO_DISK) == 0)
+ _pluma_app_set_lockdown_bit (app,
+ PLUMA_LOCKDOWN_SAVE_TO_DISK,
+ locked);
+}
+
+static void
+set_font (PlumaSettings *self,
+ const gchar *font)
+{
+ GList *views, *l;
+ guint ts;
+
+ ts = g_settings_get_uint (self->priv->editor_settings, PLUMA_SETTINGS_TABS_SIZE);
+
+ views = pluma_app_get_views (pluma_app_get_default ());
+
+ for (l = views; l != NULL; l = g_list_next (l))
+ {
+ /* Note: we use def=FALSE to avoid PlumaView to query gconf */
+ pluma_view_set_font (PLUMA_VIEW (l->data), FALSE, font);
+
+ gtk_source_view_set_tab_width (GTK_SOURCE_VIEW (l->data), ts);
+ }
+
+ g_list_free (views);
+}
+
+static void
+on_system_font_changed (GSettings *settings,
+ const gchar *key,
+ PlumaSettings *self)
+{
+ gboolean use_default_font;
+ gchar *font;
+
+ use_default_font = g_settings_get_boolean (self->priv->editor_settings,
+ PLUMA_SETTINGS_USE_DEFAULT_FONT);
+ if (!use_default_font)
+ return;
+
+ font = g_settings_get_string (settings, key);
+
+ set_font (self, font);
+
+ g_free (font);
+}
+
+static void
+on_use_default_font_changed (GSettings *settings,
+ const gchar *key,
+ PlumaSettings *self)
+{
+ gboolean def;
+ gchar *font;
+
+ def = g_settings_get_boolean (settings, key);
+
+ if (def)
+ {
+ font = g_settings_get_string (self->priv->interface_settings,
+ PLUMA_SETTINGS_SYSTEM_FONT);
+ }
+ else
+ {
+ font = g_settings_get_string (self->priv->editor_settings,
+ PLUMA_SETTINGS_EDITOR_FONT);
+ }
+
+ set_font (self, font);
+
+ g_free (font);
+}
+
+static void
+on_editor_font_changed (GSettings *settings,
+ const gchar *key,
+ PlumaSettings *self)
+{
+ gboolean use_default_font;
+ gchar *font;
+
+ use_default_font = g_settings_get_boolean (self->priv->editor_settings,
+ PLUMA_SETTINGS_USE_DEFAULT_FONT);
+ if (use_default_font)
+ return;
+
+ font = g_settings_get_string (settings, key);
+
+ set_font (self, font);
+
+ g_free (font);
+}
+
+static void
+on_scheme_changed (GSettings *settings,
+ const gchar *key,
+ PlumaSettings *self)
+{
+ GtkSourceStyleScheme *style;
+ gchar *scheme;
+ GList *docs;
+ GList *l;
+
+ scheme = g_settings_get_string (settings, key);
+
+ if (self->priv->old_scheme != NULL && (strcmp (scheme, self->priv->old_scheme) == 0))
+ {
+ g_free (scheme);
+ return;
+ }
+
+ g_free (self->priv->old_scheme);
+ self->priv->old_scheme = scheme;
+
+ style = gtk_source_style_scheme_manager_get_scheme (pluma_get_style_scheme_manager (),
+ scheme);
+
+ if (style == NULL)
+ {
+ g_warning ("Default style scheme '%s' not found, falling back to 'classic'", scheme);
+
+ style = gtk_source_style_scheme_manager_get_scheme (pluma_get_style_scheme_manager (),
+ "classic");
+
+ if (style == NULL)
+ {
+ g_warning ("Style scheme 'classic' cannot be found, check your GtkSourceView installation.");
+ return;
+ }
+ }
+
+ docs = pluma_app_get_documents (pluma_app_get_default ());
+ for (l = docs; l != NULL; l = g_list_next (l))
+ {
+ g_return_if_fail (GTK_SOURCE_IS_BUFFER (l->data));
+
+ gtk_source_buffer_set_style_scheme (GTK_SOURCE_BUFFER (l->data), style);
+ }
+
+ g_list_free (docs);
+}
+
+static void
+on_auto_save_changed (GSettings *settings,
+ const gchar *key,
+ PlumaSettings *self)
+{
+ GList *docs, *l;
+ gboolean auto_save;
+
+ auto_save = g_settings_get_boolean (settings, key);
+
+ docs = pluma_app_get_documents (pluma_app_get_default ());
+
+ for (l = docs; l != NULL; l = g_list_next (l))
+ {
+ PlumaTab *tab = pluma_tab_get_from_document (PLUMA_DOCUMENT (l->data));
+
+ pluma_tab_set_auto_save_enabled (tab, auto_save);
+ }
+
+ g_list_free (docs);
+}
+
+static void
+on_auto_save_interval_changed (GSettings *settings,
+ const gchar *key,
+ PlumaSettings *self)
+{
+ GList *docs, *l;
+ guint auto_save_interval;
+
+ auto_save_interval = g_settings_get_uint (settings, key);
+
+ docs = pluma_app_get_documents (pluma_app_get_default ());
+
+ for (l = docs; l != NULL; l = g_list_next (l))
+ {
+ PlumaTab *tab = pluma_tab_get_from_document (PLUMA_DOCUMENT (l->data));
+
+ pluma_tab_set_auto_save_interval (tab, auto_save_interval);
+ }
+
+ g_list_free (docs);
+}
+
+static void
+on_undo_actions_limit_changed (GSettings *settings,
+ const gchar *key,
+ PlumaSettings *self)
+{
+ GList *docs, *l;
+ gint ul;
+
+ ul = g_settings_get_int (settings, key);
+
+ ul = CLAMP (ul, -1, 250);
+
+ docs = pluma_app_get_documents (pluma_app_get_default ());
+
+ for (l = docs; l != NULL; l = g_list_next (l))
+ {
+ gtk_source_buffer_set_max_undo_levels (GTK_SOURCE_BUFFER (l->data), ul);
+ }
+
+ g_list_free (docs);
+}
+
+static void
+on_wrap_mode_changed (GSettings *settings,
+ const gchar *key,
+ PlumaSettings *self)
+{
+ GtkWrapMode wrap_mode;
+ GList *views, *l;
+
+ wrap_mode = pluma_settings_get_wrap_mode (settings, key);
+
+ views = pluma_app_get_views (pluma_app_get_default ());
+
+ for (l = views; l != NULL; l = g_list_next (l))
+ {
+ gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (l->data), wrap_mode);
+ }
+
+ g_list_free (views);
+}
+
+static void
+on_tabs_size_changed (GSettings *settings,
+ const gchar *key,
+ PlumaSettings *self)
+{
+ GList *views, *l;
+ guint ts;
+
+ ts = g_settings_get_uint (settings, key);
+
+ ts = CLAMP (ts, 1, 24);
+
+ views = pluma_app_get_views (pluma_app_get_default ());
+
+ for (l = views; l != NULL; l = g_list_next (l))
+ {
+ gtk_source_view_set_tab_width (GTK_SOURCE_VIEW (l->data), ts);
+ }
+
+ g_list_free (views);
+}
+
+static void
+on_insert_spaces_changed (GSettings *settings,
+ const gchar *key,
+ PlumaSettings *self)
+{
+ GList *views, *l;
+ gboolean spaces;
+
+ spaces = g_settings_get_boolean (settings, key);
+
+ views = pluma_app_get_views (pluma_app_get_default ());
+
+ for (l = views; l != NULL; l = g_list_next (l))
+ {
+ gtk_source_view_set_insert_spaces_instead_of_tabs (GTK_SOURCE_VIEW (l->data),
+ spaces);
+ }
+
+ g_list_free (views);
+}
+
+static void
+on_auto_indent_changed (GSettings *settings,
+ const gchar *key,
+ PlumaSettings *self)
+{
+ GList *views, *l;
+ gboolean enable;
+
+ enable = g_settings_get_boolean (settings, key);
+
+ views = pluma_app_get_views (pluma_app_get_default ());
+
+ for (l = views; l != NULL; l = g_list_next (l))
+ {
+ gtk_source_view_set_auto_indent (GTK_SOURCE_VIEW (l->data), enable);
+ }
+
+ g_list_free (views);
+}
+
+static void
+on_display_line_numbers_changed (GSettings *settings,
+ const gchar *key,
+ PlumaSettings *self)
+{
+ GList *views, *l;
+ gboolean line_numbers;
+
+ line_numbers = g_settings_get_boolean (settings, key);
+
+ views = pluma_app_get_views (pluma_app_get_default ());
+
+ for (l = views; l != NULL; l = g_list_next (l))
+ {
+ gtk_source_view_set_show_line_numbers (GTK_SOURCE_VIEW (l->data), line_numbers);
+ }
+
+ g_list_free (views);
+}
+
+static void
+on_hl_current_line_changed (GSettings *settings,
+ const gchar *key,
+ PlumaSettings *self)
+{
+ GList *views, *l;
+ gboolean hl;
+
+ hl = g_settings_get_boolean (settings, key);
+
+ views = pluma_app_get_views (pluma_app_get_default ());
+
+ for (l = views; l != NULL; l = g_list_next (l))
+ {
+ gtk_source_view_set_highlight_current_line (GTK_SOURCE_VIEW (l->data), hl);
+ }
+
+ g_list_free (views);
+}
+
+static void
+on_bracket_matching_changed (GSettings *settings,
+ const gchar *key,
+ PlumaSettings *self)
+{
+ GList *docs, *l;
+ gboolean enable;
+
+ enable = g_settings_get_boolean (settings, key);
+
+ docs = pluma_app_get_documents (pluma_app_get_default ());
+
+ for (l = docs; l != NULL; l = g_list_next (l))
+ {
+ gtk_source_buffer_set_highlight_matching_brackets (GTK_SOURCE_BUFFER (l->data),
+ enable);
+ }
+
+ g_list_free (docs);
+}
+
+static void
+on_display_right_margin_changed (GSettings *settings,
+ const gchar *key,
+ PlumaSettings *self)
+{
+ GList *views, *l;
+ gboolean display;
+
+ display = g_settings_get_boolean (settings, key);
+
+ views = pluma_app_get_views (pluma_app_get_default ());
+
+ for (l = views; l != NULL; l = g_list_next (l))
+ {
+ gtk_source_view_set_show_right_margin (GTK_SOURCE_VIEW (l->data), display);
+ }
+
+ g_list_free (views);
+}
+
+static void
+on_right_margin_position_changed (GSettings *settings,
+ const gchar *key,
+ PlumaSettings *self)
+{
+ GList *views, *l;
+ guint pos;
+
+ pos = g_settings_get_uint (settings, key);
+
+ pos = CLAMP (pos, 1, 160);
+
+ views = pluma_app_get_views (pluma_app_get_default ());
+
+ for (l = views; l != NULL; l = g_list_next (l))
+ {
+ gtk_source_view_set_right_margin_position (GTK_SOURCE_VIEW (l->data), pos);
+ }
+
+ g_list_free (views);
+}
+
+static void
+on_smart_home_end_changed (GSettings *settings,
+ const gchar *key,
+ PlumaSettings *self)
+{
+ GtkSourceSmartHomeEndType smart_he;
+ GList *views, *l;
+
+ smart_he = pluma_settings_get_smart_home_end (self);
+
+ views = pluma_app_get_views (pluma_app_get_default ());
+
+ for (l = views; l != NULL; l = g_list_next (l))
+ {
+ gtk_source_view_set_smart_home_end (GTK_SOURCE_VIEW (l->data), smart_he);
+ }
+
+ g_list_free (views);
+}
+
+static void
+on_syntax_highlighting_changed (GSettings *settings,
+ const gchar *key,
+ PlumaSettings *self)
+{
+ const GList *windows;
+ GList *docs, *l;
+ gboolean enable;
+
+ enable = g_settings_get_boolean (settings, key);
+
+ docs = pluma_app_get_documents (pluma_app_get_default ());
+
+ for (l = docs; l != NULL; l = g_list_next (l))
+ {
+ gtk_source_buffer_set_highlight_syntax (GTK_SOURCE_BUFFER (l->data), enable);
+ }
+
+ g_list_free (docs);
+
+ /* update the sensitivity of the Higlight Mode menu item */
+ windows = pluma_app_get_windows (pluma_app_get_default ());
+ while (windows != NULL)
+ {
+ GtkUIManager *ui;
+ GtkAction *a;
+
+ ui = pluma_window_get_ui_manager (PLUMA_WINDOW (windows->data));
+
+ a = gtk_ui_manager_get_action (ui, "/MenuBar/ViewMenu/ViewHighlightModeMenu");
+
+ gtk_action_set_sensitive (a, enable);
+
+ windows = g_list_next (windows);
+ }
+}
+
+static void
+on_search_highlighting_changed (GSettings *settings,
+ const gchar *key,
+ PlumaSettings *self)
+{
+ GList *docs, *l;
+ gboolean enable;
+
+ enable = g_settings_get_boolean (settings, key);
+
+ docs = pluma_app_get_documents (pluma_app_get_default ());
+
+ for (l = docs; l != NULL; l = g_list_next (l))
+ {
+ pluma_document_set_enable_search_highlighting (PLUMA_DOCUMENT (l->data),
+ enable);
+ }
+
+ g_list_free (docs);
+}
+
+static void
+on_max_recents_changed (GSettings *settings,
+ const gchar *key,
+ PlumaSettings *self)
+{
+ const GList *windows;
+ guint max;
+
+ max = g_settings_get_uint (settings, key);
+
+ windows = pluma_app_get_windows (pluma_app_get_default ());
+ while (windows != NULL)
+ {
+ PlumaWindow *w = PLUMA_WINDOW (windows->data);
+
+ gtk_recent_chooser_set_limit (GTK_RECENT_CHOOSER (w->priv->toolbar_recent_menu),
+ max);
+
+ windows = g_list_next (windows);
+ }
+
+ /* FIXME: we have no way at the moment to trigger the
+ * update of the inline recents in the File menu */
+}
+
+static void
+on_draw_spaces_changed (GSettings *settings,
+ gchar *key,
+ gpointer user_data)
+{
+ pluma_debug (DEBUG_PREFS);
+
+ if (strcmp (key, PLUMA_SETTINGS_DRAWER_SPACE))
+ return;
+
+#ifdef GTK_SOURCE_VERSION_3_24
+ pluma_settings_space_drawer_generic (settings,
+ g_settings_get_enum (settings, key),
+ GTK_SOURCE_SPACE_TYPE_SPACE);
+#else
+ pluma_settings_draw_generic (settings,
+ g_settings_get_enum (settings, key),
+ GTK_SOURCE_DRAW_SPACES_SPACE);
+#endif
+}
+
+static void
+on_draw_tabs_changed (GSettings *settings,
+ gchar *key,
+ gpointer user_data)
+{
+ pluma_debug (DEBUG_PREFS);
+
+ if (strcmp (key, PLUMA_SETTINGS_DRAWER_TAB))
+ return;
+
+#ifdef GTK_SOURCE_VERSION_3_24
+ pluma_settings_space_drawer_generic (settings,
+ g_settings_get_enum (settings, key),
+ GTK_SOURCE_SPACE_TYPE_TAB);
+#else
+ pluma_settings_draw_generic (settings,
+ g_settings_get_enum (settings, key),
+ GTK_SOURCE_DRAW_SPACES_TAB);
+#endif
+}
+
+static void
+on_draw_newlines_changed (GSettings *settings,
+ gchar *key,
+ gpointer user_data)
+{
+ pluma_debug (DEBUG_PREFS);
+
+ if (strcmp (key, PLUMA_SETTINGS_DRAWER_NEWLINE))
+ return;
+
+#ifdef GTK_SOURCE_VERSION_3_24
+ pluma_settings_space_drawer_generic (settings,
+ g_settings_get_boolean (settings, key) ? 1 : 0,
+ GTK_SOURCE_SPACE_TYPE_NEWLINE);
+#else
+ pluma_settings_draw_generic (settings,
+ g_settings_get_boolean (settings, key) ? 1 : 0,
+ GTK_SOURCE_DRAW_SPACES_NEWLINE);
+#endif
+}
+
+static void
+on_draw_nbsp_changed (GSettings *settings,
+ gchar *key,
+ gpointer user_data)
+{
+ pluma_debug (DEBUG_PREFS);
+
+ if (strcmp (key, PLUMA_SETTINGS_DRAWER_NBSP))
+ return;
+
+#ifdef GTK_SOURCE_VERSION_3_24
+ pluma_settings_space_drawer_generic (settings,
+ g_settings_get_enum (settings, key),
+ GTK_SOURCE_SPACE_TYPE_NBSP);
+#else
+ pluma_settings_draw_generic (settings,
+ g_settings_get_enum (settings, key),
+ GTK_SOURCE_DRAW_SPACES_NBSP);
+#endif
+}
+
+static void
+pluma_settings_class_init (PlumaSettingsClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->finalize = pluma_settings_finalize;
+ object_class->dispose = pluma_settings_dispose;
+}
+
+static void
+pluma_settings_init (PlumaSettings *self)
+{
+ self->priv = pluma_settings_get_instance_private (self);
+
+ self->priv->old_scheme = NULL;
+
+ self->priv->editor_settings = g_settings_new (PLUMA_SCHEMA_ID);
+
+ /* Load settings */
+ self->priv->lockdown_settings = g_settings_new ("org.mate.lockdown");
+
+ g_signal_connect (self->priv->lockdown_settings,
+ "changed",
+ G_CALLBACK (on_lockdown_changed),
+ NULL);
+
+ self->priv->interface_settings = g_settings_new ("org.mate.interface");
+
+ g_signal_connect (self->priv->interface_settings,
+ "changed::monospace-font-name",
+ G_CALLBACK (on_system_font_changed),
+ self);
+
+ /* editor changes */
+ g_signal_connect (self->priv->editor_settings,
+ "changed::use-default-font",
+ G_CALLBACK (on_use_default_font_changed),
+ self);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::editor-font",
+ G_CALLBACK (on_editor_font_changed),
+ self);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::color-scheme",
+ G_CALLBACK (on_scheme_changed),
+ self);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::auto-save",
+ G_CALLBACK (on_auto_save_changed),
+ self);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::auto-save-interval",
+ G_CALLBACK (on_auto_save_interval_changed),
+ self);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::undo-actions-limit",
+ G_CALLBACK (on_undo_actions_limit_changed),
+ self);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::wrap-mode",
+ G_CALLBACK (on_wrap_mode_changed),
+ self);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::tabs-size",
+ G_CALLBACK (on_tabs_size_changed),
+ self);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::insert-spaces",
+ G_CALLBACK (on_insert_spaces_changed),
+ self);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::auto-indent",
+ G_CALLBACK (on_auto_indent_changed),
+ self);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::display-line-numbers",
+ G_CALLBACK (on_display_line_numbers_changed),
+ self);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::highlight-current-line",
+ G_CALLBACK (on_hl_current_line_changed),
+ self);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::bracket-matching",
+ G_CALLBACK (on_bracket_matching_changed),
+ self);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::display-right-margin",
+ G_CALLBACK (on_display_right_margin_changed),
+ self);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::right-margin-position",
+ G_CALLBACK (on_right_margin_position_changed),
+ self);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::smart-home-end",
+ G_CALLBACK (on_smart_home_end_changed),
+ self);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::syntax-highlighting",
+ G_CALLBACK (on_syntax_highlighting_changed),
+ self);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::search-highlighting",
+ G_CALLBACK (on_search_highlighting_changed),
+ self);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::max-recents",
+ G_CALLBACK (on_max_recents_changed),
+ self);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::enable-space-drawer-space",
+ G_CALLBACK (on_draw_spaces_changed),
+ NULL);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::enable-space-drawer-tab",
+ G_CALLBACK (on_draw_tabs_changed),
+ NULL);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::enable-space-drawer-newline",
+ G_CALLBACK (on_draw_newlines_changed),
+ NULL);
+ g_signal_connect (self->priv->editor_settings,
+ "changed::enable-space-drawer-nbsp",
+ G_CALLBACK (on_draw_nbsp_changed),
+ NULL);
+}
+
+PlumaSettings *
+_pluma_settings_get_singleton (void)
+{
+ if (singleton == NULL)
+ {
+ singleton = g_object_new (PLUMA_TYPE_SETTINGS, NULL);
+ }
+
+ return singleton;
+}
+
+void
+pluma_settings_unref_singleton (void)
+{
+ if (singleton != NULL)
+ {
+ g_object_unref (singleton);
+ }
+
+ /* singleton is not set to NULL here, it is set to NULL in
+ * pluma_settings_finalize() (i.e. when we are sure that the ref count
+ * reaches 0).
+ */
+}
+
+PlumaLockdownMask
+pluma_settings_get_lockdown (PlumaSettings *self)
+{
+ guint lockdown = 0;
+ gboolean command_line, printing, print_setup, save_to_disk;
+
+ command_line = g_settings_get_boolean (self->priv->lockdown_settings,
+ PLUMA_SETTINGS_LOCKDOWN_COMMAND_LINE);
+ printing = g_settings_get_boolean (self->priv->lockdown_settings,
+ PLUMA_SETTINGS_LOCKDOWN_PRINTING);
+ print_setup = g_settings_get_boolean (self->priv->lockdown_settings,
+ PLUMA_SETTINGS_LOCKDOWN_PRINT_SETUP);
+ save_to_disk = g_settings_get_boolean (self->priv->lockdown_settings,
+ PLUMA_SETTINGS_LOCKDOWN_SAVE_TO_DISK);
+
+ if (command_line)
+ lockdown |= PLUMA_LOCKDOWN_COMMAND_LINE;
+
+ if (printing)
+ lockdown |= PLUMA_LOCKDOWN_PRINTING;
+
+ if (print_setup)
+ lockdown |= PLUMA_LOCKDOWN_PRINT_SETUP;
+
+ if (save_to_disk)
+ lockdown |= PLUMA_LOCKDOWN_SAVE_TO_DISK;
+
+ return lockdown;
+}
+
+gchar *
+pluma_settings_get_system_font (PlumaSettings *self)
+{
+ gchar *system_font;
+
+ g_return_val_if_fail (PLUMA_IS_SETTINGS (self), NULL);
+
+ system_font = g_settings_get_string (self->priv->interface_settings,
+ "monospace-font-name");
+
+ return system_font;
+}
+
+PlumaToolbarSetting
+pluma_settings_get_toolbar_style (PlumaSettings *self)
+{
+ PlumaToolbarSetting res;
+ gchar *str;
+
+ g_return_val_if_fail (PLUMA_IS_SETTINGS (self), 0);
+
+ str = g_settings_get_string (self->priv->editor_settings,
+ "toolbar-buttons-style");
+
+ g_return_val_if_fail (str != NULL, 0);
+
+ if (strcmp (str, "PLUMA_TOOLBAR_ICONS") == 0)
+ res = PLUMA_TOOLBAR_ICONS;
+ else
+ {
+ if (strcmp (str, "PLUMA_TOOLBAR_ICONS_AND_TEXT") == 0)
+ res = PLUMA_TOOLBAR_ICONS_AND_TEXT;
+ else
+ {
+ if (strcmp (str, "PLUMA_TOOLBAR_ICONS_BOTH_HORIZ") == 0)
+ res = PLUMA_TOOLBAR_ICONS_BOTH_HORIZ;
+ else
+ res = PLUMA_TOOLBAR_SYSTEM;
+ }
+ }
+
+ g_free (str);
+
+ return res;
+}
+
+GtkSourceSmartHomeEndType
+pluma_settings_get_smart_home_end (PlumaSettings *self)
+{
+ GtkSourceSmartHomeEndType res;
+ gchar *str;
+
+ g_return_val_if_fail (PLUMA_IS_SETTINGS (self), GTK_SOURCE_SMART_HOME_END_AFTER);
+
+ str = g_settings_get_string (self->priv->editor_settings, "smart-home-end");
+
+ g_return_val_if_fail (str != NULL, GTK_SOURCE_SMART_HOME_END_AFTER);
+
+ if (strcmp (str, "DISABLED") == 0)
+ res = GTK_SOURCE_SMART_HOME_END_DISABLED;
+ else if (strcmp (str, "BEFORE") == 0)
+ res = GTK_SOURCE_SMART_HOME_END_BEFORE;
+ else if (strcmp (str, "ALWAYS") == 0)
+ res = GTK_SOURCE_SMART_HOME_END_ALWAYS;
+ else
+ res = GTK_SOURCE_SMART_HOME_END_AFTER;
+
+ g_free (str);
+
+ return res;
+}
+
+static gchar *
+get_wrap_str (guint mode)
+{
+ gchar *str;
+
+ switch (mode)
+ {
+ case GTK_WRAP_NONE:
+ str = g_strdup ("GTK_WRAP_NONE");
+ break;
+
+ case GTK_WRAP_CHAR:
+ str = g_strdup ("GTK_WRAP_CHAR");
+ break;
+
+ default: /* GTK_WRAP_WORD */
+ str = g_strdup ("GTK_WRAP_WORD");
+ }
+
+ return str;
+}
+
+GtkWrapMode
+pluma_settings_get_wrap_mode (GSettings *settings,
+ const gchar *key)
+{
+ GtkWrapMode res;
+ gchar *str;
+
+ g_return_val_if_fail (G_IS_SETTINGS (settings), GTK_WRAP_WORD);
+ g_return_val_if_fail (key != NULL, GTK_WRAP_WORD);
+
+ str = g_settings_get_string (settings, key);
+
+ g_return_val_if_fail (str != NULL, GTK_WRAP_WORD);
+
+ if (strcmp (str, "GTK_WRAP_NONE") == 0)
+ res = GTK_WRAP_NONE;
+ else
+ {
+ if (strcmp (str, "GTK_WRAP_CHAR") == 0)
+ res = GTK_WRAP_CHAR;
+ else
+ res = GTK_WRAP_WORD;
+ }
+
+ g_free (str);
+
+ return res;
+}
+
+void
+pluma_settings_set_wrap_mode (GSettings *settings,
+ const gchar *key,
+ GtkWrapMode mode)
+{
+ gchar *str;
+
+ g_return_if_fail (G_IS_SETTINGS (settings));
+ g_return_if_fail (key != NULL);
+
+ str = get_wrap_str (mode);
+
+ g_settings_set_string (settings, key, str);
+}
+
+/* GSettings/GSList utility functions from mate-panel */
+
+GSList*
+pluma_settings_get_list (GSettings *settings, const gchar *key)
+{
+ gchar **array;
+ GSList *list = NULL;
+ gint i;
+ array = g_settings_get_strv (settings, key);
+ if (array != NULL) {
+ for (i = 0; array[i]; i++) {
+ list = g_slist_append (list, g_strdup (array[i]));
+ }
+ }
+ g_strfreev (array);
+ return list;
+}
+
+void
+pluma_settings_set_list (GSettings *settings, const gchar *key, GSList *list)
+{
+ GArray *array;
+ GSList *l;
+ array = g_array_new (TRUE, TRUE, sizeof (gchar *));
+ for (l = list; l; l = l->next) {
+ array = g_array_append_val (array, l->data);
+ }
+ g_settings_set_strv (settings, key, (const gchar **) array->data);
+ g_array_free (array, TRUE);
+}
+
+GSList *
+pluma_settings_get_writable_vfs_schemes (GSettings *settings)
+{
+ GSList *strings;
+
+ pluma_debug (DEBUG_PREFS);
+
+ strings = pluma_settings_get_list (settings, PLUMA_SETTINGS_WRITABLE_VFS_SCHEMES);
+
+ /* The 'file' scheme is writable by default. */
+ strings = g_slist_prepend (strings, g_strdup ("file"));
+
+ pluma_debug_message (DEBUG_PREFS, "Done");
+
+ return strings;
+}
+