1 /*
2  * pluma-settings.c
3  * This file is part of pluma
4  *
5  * Copyright (C) 2002-2005 - Paolo Maggi
6  * Copyright (C) 2009 - Ignacio Casal Quinteiro
7  * Copyright (C) 2012-2021 MATE Developers
8  *
9  * pluma is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * (at your option) any later version.
13  *
14  * pluma is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with pluma; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin St, Fifth Floor,
22  * Boston, MA  02110-1301  USA
23  */
24 
25 #include <string.h>
26 
27 #include "pluma-settings.h"
28 #include "pluma-debug.h"
29 #include "pluma-view.h"
30 #include "pluma-window.h"
31 #include "pluma-style-scheme-manager.h"
32 #include "pluma-window-private.h"
33 
34 #define PLUMA_SETTINGS_LOCKDOWN_COMMAND_LINE "disable-command-line"
35 #define PLUMA_SETTINGS_LOCKDOWN_PRINTING "disable-printing"
36 #define PLUMA_SETTINGS_LOCKDOWN_PRINT_SETUP "disable-print-setup"
37 #define PLUMA_SETTINGS_LOCKDOWN_SAVE_TO_DISK "disable-save-to-disk"
38 
39 #define PLUMA_SETTINGS_SYSTEM_FONT "monospace-font-name"
40 
41 struct _PlumaSettingsPrivate
42 {
43     GSettings *editor_settings;
44     GSettings *lockdown_settings;
45     GSettings *interface_settings;
46 
47     gchar *old_scheme;
48 };
49 
50 /* PlumaSettings is a singleton. */
51 static PlumaSettings *singleton = NULL;
52 
G_DEFINE_TYPE_WITH_PRIVATE(PlumaSettings,pluma_settings,G_TYPE_OBJECT)53 G_DEFINE_TYPE_WITH_PRIVATE (PlumaSettings, pluma_settings, G_TYPE_OBJECT)
54 
55 static void
56 pluma_settings_dispose (GObject *object)
57 {
58     PlumaSettingsPrivate *priv = pluma_settings_get_instance_private (PLUMA_SETTINGS(object));
59 
60     g_clear_object (&priv->lockdown_settings);
61     g_clear_object (&priv->interface_settings);
62     g_clear_object (&priv->editor_settings);
63 
64     G_OBJECT_CLASS (pluma_settings_parent_class)->dispose (object);
65 }
66 
67 static void
pluma_settings_finalize(GObject * object)68 pluma_settings_finalize (GObject *object)
69 {
70     PlumaSettings *self = PLUMA_SETTINGS (object);
71 
72     g_free (self->priv->old_scheme);
73 
74     if (singleton == self)
75     {
76         singleton = NULL;
77     }
78 
79     G_OBJECT_CLASS (pluma_settings_parent_class)->finalize (object);
80 }
81 
82 #ifdef GTK_SOURCE_VERSION_3_24
83 static void
pluma_settings_space_drawer_generic(GSettings * settings,gint level,GtkSourceSpaceTypeFlags type)84 pluma_settings_space_drawer_generic (GSettings              *settings,
85                                      gint                    level,
86                                      GtkSourceSpaceTypeFlags type)
87 {
88     GList *views;
89     GList *l;
90 
91     pluma_debug (DEBUG_PREFS);
92 
93     views = pluma_app_get_views (pluma_app_get_default ());
94     l = views;
95 
96     while (l != NULL)
97     {
98         pluma_set_source_space_drawer_by_level (GTK_SOURCE_VIEW (l->data),
99                                                 level, type);
100         l = l->next;
101     }
102 
103     g_list_free (views);
104 }
105 #else
106 static void
pluma_settings_draw_generic(GSettings * settings,gint level,GtkSourceSpaceTypeFlags type)107 pluma_settings_draw_generic (GSettings              *settings,
108                              gint                    level,
109                              GtkSourceSpaceTypeFlags type)
110 {
111     GList *views;
112     GList *l;
113 
114     pluma_debug (DEBUG_PREFS);
115 
116     views = pluma_app_get_views (pluma_app_get_default ());
117     l = views;
118 
119     while (l != NULL)
120     {
121         GtkSourceSpaceTypeFlags value;
122 
123         value = gtk_source_view_get_draw_spaces (GTK_SOURCE_VIEW (l->data));
124         if (level > 0)
125             value |= type;
126         else
127             value &= ~type;
128         gtk_source_view_set_draw_spaces (GTK_SOURCE_VIEW (l->data),
129                                          value);
130         l = l->next;
131     }
132 
133     g_list_free (views);
134 }
135 #endif
136 
137 static void
on_lockdown_changed(GSettings * settings,const gchar * key,gpointer useless)138 on_lockdown_changed (GSettings   *settings,
139                      const gchar *key,
140                      gpointer     useless)
141 {
142     gboolean locked;
143     PlumaApp *app;
144 
145     locked = g_settings_get_boolean (settings, key);
146     app = pluma_app_get_default ();
147 
148     if (strcmp (key, PLUMA_SETTINGS_LOCKDOWN_COMMAND_LINE) == 0)
149         _pluma_app_set_lockdown_bit (app,
150                                      PLUMA_LOCKDOWN_COMMAND_LINE,
151                                      locked);
152     else if (strcmp (key, PLUMA_SETTINGS_LOCKDOWN_PRINTING) == 0)
153         _pluma_app_set_lockdown_bit (app,
154                                      PLUMA_LOCKDOWN_PRINTING,
155                                      locked);
156     else if (strcmp (key, PLUMA_SETTINGS_LOCKDOWN_PRINT_SETUP) == 0)
157         _pluma_app_set_lockdown_bit (app,
158                                      PLUMA_LOCKDOWN_PRINT_SETUP,
159                                      locked);
160     else if (strcmp (key, PLUMA_SETTINGS_LOCKDOWN_SAVE_TO_DISK) == 0)
161         _pluma_app_set_lockdown_bit (app,
162                                      PLUMA_LOCKDOWN_SAVE_TO_DISK,
163                                      locked);
164 }
165 
166 static void
set_font(PlumaSettings * self,const gchar * font)167 set_font (PlumaSettings *self,
168           const gchar   *font)
169 {
170     GList *views, *l;
171     guint ts;
172 
173     ts = g_settings_get_uint (self->priv->editor_settings, PLUMA_SETTINGS_TABS_SIZE);
174 
175     views = pluma_app_get_views (pluma_app_get_default ());
176 
177     for (l = views; l != NULL; l = g_list_next (l))
178     {
179         /* Note: we use def=FALSE to avoid PlumaView to query gconf */
180         pluma_view_set_font (PLUMA_VIEW (l->data), FALSE, font);
181 
182         gtk_source_view_set_tab_width (GTK_SOURCE_VIEW (l->data), ts);
183     }
184 
185     g_list_free (views);
186 }
187 
188 static void
on_system_font_changed(GSettings * settings,const gchar * key,PlumaSettings * self)189 on_system_font_changed (GSettings     *settings,
190                         const gchar   *key,
191                         PlumaSettings *self)
192 {
193     gboolean use_default_font;
194     gchar *font;
195 
196     use_default_font = g_settings_get_boolean (self->priv->editor_settings,
197                                                PLUMA_SETTINGS_USE_DEFAULT_FONT);
198     if (!use_default_font)
199         return;
200 
201     font = g_settings_get_string (settings, key);
202 
203     set_font (self, font);
204 
205     g_free (font);
206 }
207 
208 static void
on_use_default_font_changed(GSettings * settings,const gchar * key,PlumaSettings * self)209 on_use_default_font_changed (GSettings     *settings,
210                              const gchar   *key,
211                              PlumaSettings *self)
212 {
213     gboolean def;
214     gchar *font;
215 
216     def = g_settings_get_boolean (settings, key);
217 
218     if (def)
219     {
220         font = g_settings_get_string (self->priv->interface_settings,
221                                       PLUMA_SETTINGS_SYSTEM_FONT);
222     }
223     else
224     {
225         font = g_settings_get_string (self->priv->editor_settings,
226                                       PLUMA_SETTINGS_EDITOR_FONT);
227     }
228 
229     set_font (self, font);
230 
231     g_free (font);
232 }
233 
234 static void
on_editor_font_changed(GSettings * settings,const gchar * key,PlumaSettings * self)235 on_editor_font_changed (GSettings     *settings,
236                         const gchar   *key,
237                         PlumaSettings *self)
238 {
239     gboolean use_default_font;
240     gchar *font;
241 
242     use_default_font = g_settings_get_boolean (self->priv->editor_settings,
243                                                PLUMA_SETTINGS_USE_DEFAULT_FONT);
244     if (use_default_font)
245         return;
246 
247     font = g_settings_get_string (settings, key);
248 
249     set_font (self, font);
250 
251     g_free (font);
252 }
253 
254 static void
on_scheme_changed(GSettings * settings,const gchar * key,PlumaSettings * self)255 on_scheme_changed (GSettings     *settings,
256                    const gchar   *key,
257                    PlumaSettings *self)
258 {
259     GtkSourceStyleScheme *style;
260     gchar *scheme;
261     GList *docs;
262     GList *l;
263 
264     scheme = g_settings_get_string (settings, key);
265 
266     if (self->priv->old_scheme != NULL && (strcmp (scheme, self->priv->old_scheme) == 0))
267     {
268         g_free (scheme);
269         return;
270     }
271 
272     g_free (self->priv->old_scheme);
273     self->priv->old_scheme = scheme;
274 
275     style = gtk_source_style_scheme_manager_get_scheme (pluma_get_style_scheme_manager (),
276                                                         scheme);
277 
278     if (style == NULL)
279     {
280         g_warning ("Default style scheme '%s' not found, falling back to 'classic'", scheme);
281 
282         style = gtk_source_style_scheme_manager_get_scheme (pluma_get_style_scheme_manager (),
283                                                             "classic");
284 
285         if (style == NULL)
286         {
287             g_warning ("Style scheme 'classic' cannot be found, check your GtkSourceView installation.");
288             return;
289         }
290     }
291 
292     docs = pluma_app_get_documents (pluma_app_get_default ());
293     for (l = docs; l != NULL; l = g_list_next (l))
294     {
295         g_return_if_fail (GTK_SOURCE_IS_BUFFER (l->data));
296 
297         gtk_source_buffer_set_style_scheme (GTK_SOURCE_BUFFER (l->data), style);
298     }
299 
300     g_list_free (docs);
301 }
302 
303 static void
on_auto_save_changed(GSettings * settings,const gchar * key,PlumaSettings * self)304 on_auto_save_changed (GSettings     *settings,
305                       const gchar   *key,
306                       PlumaSettings *self)
307 {
308     GList *docs, *l;
309     gboolean auto_save;
310 
311     auto_save = g_settings_get_boolean (settings, key);
312 
313     docs = pluma_app_get_documents (pluma_app_get_default ());
314 
315     for (l = docs; l != NULL; l = g_list_next (l))
316     {
317         PlumaTab *tab = pluma_tab_get_from_document (PLUMA_DOCUMENT (l->data));
318 
319         pluma_tab_set_auto_save_enabled (tab, auto_save);
320     }
321 
322     g_list_free (docs);
323 }
324 
325 static void
on_auto_save_interval_changed(GSettings * settings,const gchar * key,PlumaSettings * self)326 on_auto_save_interval_changed (GSettings     *settings,
327                                const gchar   *key,
328                                PlumaSettings *self)
329 {
330     GList *docs, *l;
331     guint auto_save_interval;
332 
333     auto_save_interval = g_settings_get_uint (settings, key);
334 
335     docs = pluma_app_get_documents (pluma_app_get_default ());
336 
337     for (l = docs; l != NULL; l = g_list_next (l))
338     {
339         PlumaTab *tab = pluma_tab_get_from_document (PLUMA_DOCUMENT (l->data));
340 
341         pluma_tab_set_auto_save_interval (tab, auto_save_interval);
342     }
343 
344     g_list_free (docs);
345 }
346 
347 static void
on_undo_actions_limit_changed(GSettings * settings,const gchar * key,PlumaSettings * self)348 on_undo_actions_limit_changed (GSettings     *settings,
349                                const gchar   *key,
350                                PlumaSettings *self)
351 {
352     GList *docs, *l;
353     gint ul;
354 
355     ul = g_settings_get_int (settings, key);
356 
357     ul = CLAMP (ul, -1, 250);
358 
359     docs = pluma_app_get_documents (pluma_app_get_default ());
360 
361     for (l = docs; l != NULL; l = g_list_next (l))
362     {
363         gtk_source_buffer_set_max_undo_levels (GTK_SOURCE_BUFFER (l->data), ul);
364     }
365 
366     g_list_free (docs);
367 }
368 
369 static void
on_wrap_mode_changed(GSettings * settings,const gchar * key,PlumaSettings * self)370 on_wrap_mode_changed (GSettings     *settings,
371                       const gchar   *key,
372                       PlumaSettings *self)
373 {
374     GtkWrapMode wrap_mode;
375     GList *views, *l;
376 
377     wrap_mode = pluma_settings_get_wrap_mode (settings, key);
378 
379     views = pluma_app_get_views (pluma_app_get_default ());
380 
381     for (l = views; l != NULL; l = g_list_next (l))
382     {
383         gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (l->data), wrap_mode);
384     }
385 
386     g_list_free (views);
387 }
388 
389 static void
on_tabs_size_changed(GSettings * settings,const gchar * key,PlumaSettings * self)390 on_tabs_size_changed (GSettings     *settings,
391                       const gchar   *key,
392                       PlumaSettings *self)
393 {
394     GList *views, *l;
395     guint ts;
396 
397     ts = g_settings_get_uint (settings, key);
398 
399     ts = CLAMP (ts, 1, 24);
400 
401     views = pluma_app_get_views (pluma_app_get_default ());
402 
403     for (l = views; l != NULL; l = g_list_next (l))
404     {
405         gtk_source_view_set_tab_width (GTK_SOURCE_VIEW (l->data), ts);
406     }
407 
408     g_list_free (views);
409 }
410 
411 static void
on_insert_spaces_changed(GSettings * settings,const gchar * key,PlumaSettings * self)412 on_insert_spaces_changed (GSettings     *settings,
413                           const gchar   *key,
414                           PlumaSettings *self)
415 {
416     GList *views, *l;
417     gboolean spaces;
418 
419     spaces = g_settings_get_boolean (settings, key);
420 
421     views = pluma_app_get_views (pluma_app_get_default ());
422 
423     for (l = views; l != NULL; l = g_list_next (l))
424     {
425         gtk_source_view_set_insert_spaces_instead_of_tabs (GTK_SOURCE_VIEW (l->data),
426                                                            spaces);
427     }
428 
429     g_list_free (views);
430 }
431 
432 static void
on_auto_indent_changed(GSettings * settings,const gchar * key,PlumaSettings * self)433 on_auto_indent_changed (GSettings     *settings,
434                         const gchar   *key,
435                         PlumaSettings *self)
436 {
437     GList *views, *l;
438     gboolean enable;
439 
440     enable = g_settings_get_boolean (settings, key);
441 
442     views = pluma_app_get_views (pluma_app_get_default ());
443 
444     for (l = views; l != NULL; l = g_list_next (l))
445     {
446         gtk_source_view_set_auto_indent (GTK_SOURCE_VIEW (l->data), enable);
447     }
448 
449     g_list_free (views);
450 }
451 
452 static void
on_display_line_numbers_changed(GSettings * settings,const gchar * key,PlumaSettings * self)453 on_display_line_numbers_changed (GSettings     *settings,
454                                  const gchar   *key,
455                                  PlumaSettings *self)
456 {
457     GList *views, *l;
458     gboolean line_numbers;
459 
460     line_numbers = g_settings_get_boolean (settings, key);
461 
462     views = pluma_app_get_views (pluma_app_get_default ());
463 
464     for (l = views; l != NULL; l = g_list_next (l))
465     {
466         gtk_source_view_set_show_line_numbers (GTK_SOURCE_VIEW (l->data), line_numbers);
467     }
468 
469     g_list_free (views);
470 }
471 
472 static void
on_hl_current_line_changed(GSettings * settings,const gchar * key,PlumaSettings * self)473 on_hl_current_line_changed (GSettings     *settings,
474                             const gchar   *key,
475                             PlumaSettings *self)
476 {
477     GList *views, *l;
478     gboolean hl;
479 
480     hl = g_settings_get_boolean (settings, key);
481 
482     views = pluma_app_get_views (pluma_app_get_default ());
483 
484     for (l = views; l != NULL; l = g_list_next (l))
485     {
486         gtk_source_view_set_highlight_current_line (GTK_SOURCE_VIEW (l->data), hl);
487     }
488 
489     g_list_free (views);
490 }
491 
492 static void
on_bracket_matching_changed(GSettings * settings,const gchar * key,PlumaSettings * self)493 on_bracket_matching_changed (GSettings     *settings,
494                              const gchar   *key,
495                              PlumaSettings *self)
496 {
497     GList *docs, *l;
498     gboolean enable;
499 
500     enable = g_settings_get_boolean (settings, key);
501 
502     docs = pluma_app_get_documents (pluma_app_get_default ());
503 
504     for (l = docs; l != NULL; l = g_list_next (l))
505     {
506         gtk_source_buffer_set_highlight_matching_brackets (GTK_SOURCE_BUFFER (l->data),
507                                                            enable);
508     }
509 
510     g_list_free (docs);
511 }
512 
513 static void
on_display_right_margin_changed(GSettings * settings,const gchar * key,PlumaSettings * self)514 on_display_right_margin_changed (GSettings     *settings,
515                                  const gchar   *key,
516                                  PlumaSettings *self)
517 {
518     GList *views, *l;
519     gboolean display;
520 
521     display = g_settings_get_boolean (settings, key);
522 
523     views = pluma_app_get_views (pluma_app_get_default ());
524 
525     for (l = views; l != NULL; l = g_list_next (l))
526     {
527         gtk_source_view_set_show_right_margin (GTK_SOURCE_VIEW (l->data), display);
528     }
529 
530     g_list_free (views);
531 }
532 
533 static void
on_right_margin_position_changed(GSettings * settings,const gchar * key,PlumaSettings * self)534 on_right_margin_position_changed (GSettings     *settings,
535                                   const gchar   *key,
536                                   PlumaSettings *self)
537 {
538     GList *views, *l;
539     guint pos;
540 
541     pos = g_settings_get_uint (settings, key);
542 
543     pos = CLAMP (pos, 1, 160);
544 
545     views = pluma_app_get_views (pluma_app_get_default ());
546 
547     for (l = views; l != NULL; l = g_list_next (l))
548     {
549         gtk_source_view_set_right_margin_position (GTK_SOURCE_VIEW (l->data), pos);
550     }
551 
552     g_list_free (views);
553 }
554 
555 static void
on_smart_home_end_changed(GSettings * settings,const gchar * key,PlumaSettings * self)556 on_smart_home_end_changed (GSettings     *settings,
557                            const gchar   *key,
558                            PlumaSettings *self)
559 {
560     GtkSourceSmartHomeEndType smart_he;
561     GList *views, *l;
562 
563     smart_he = pluma_settings_get_smart_home_end (self);
564 
565     views = pluma_app_get_views (pluma_app_get_default ());
566 
567     for (l = views; l != NULL; l = g_list_next (l))
568     {
569         gtk_source_view_set_smart_home_end (GTK_SOURCE_VIEW (l->data), smart_he);
570     }
571 
572     g_list_free (views);
573 }
574 
575 static void
on_syntax_highlighting_changed(GSettings * settings,const gchar * key,PlumaSettings * self)576 on_syntax_highlighting_changed (GSettings     *settings,
577                                 const gchar   *key,
578                                 PlumaSettings *self)
579 {
580     const GList *windows;
581     GList *docs, *l;
582     gboolean enable;
583 
584     enable = g_settings_get_boolean (settings, key);
585 
586     docs = pluma_app_get_documents (pluma_app_get_default ());
587 
588     for (l = docs; l != NULL; l = g_list_next (l))
589     {
590         gtk_source_buffer_set_highlight_syntax (GTK_SOURCE_BUFFER (l->data), enable);
591     }
592 
593     g_list_free (docs);
594 
595     /* update the sensitivity of the Higlight Mode menu item */
596     windows = pluma_app_get_windows (pluma_app_get_default ());
597     while (windows != NULL)
598     {
599         GtkUIManager *ui;
600         GtkAction *a;
601 
602         ui = pluma_window_get_ui_manager (PLUMA_WINDOW (windows->data));
603 
604         a = gtk_ui_manager_get_action (ui, "/MenuBar/ViewMenu/ViewHighlightModeMenu");
605 
606         gtk_action_set_sensitive (a, enable);
607 
608         windows = g_list_next (windows);
609     }
610 }
611 
612 static void
on_search_highlighting_changed(GSettings * settings,const gchar * key,PlumaSettings * self)613 on_search_highlighting_changed (GSettings     *settings,
614                                 const gchar   *key,
615                                 PlumaSettings *self)
616 {
617     GList *docs, *l;
618     gboolean enable;
619 
620     enable = g_settings_get_boolean (settings, key);
621 
622     docs = pluma_app_get_documents (pluma_app_get_default ());
623 
624     for (l = docs; l != NULL; l = g_list_next (l))
625     {
626         pluma_document_set_enable_search_highlighting (PLUMA_DOCUMENT (l->data),
627                                                        enable);
628     }
629 
630     g_list_free (docs);
631 }
632 
633 static void
on_max_recents_changed(GSettings * settings,const gchar * key,PlumaSettings * self)634 on_max_recents_changed (GSettings     *settings,
635                         const gchar   *key,
636                         PlumaSettings *self)
637 {
638     const GList *windows;
639     guint max;
640 
641     max = g_settings_get_uint (settings, key);
642 
643     windows = pluma_app_get_windows (pluma_app_get_default ());
644     while (windows != NULL)
645     {
646         PlumaWindow *w = PLUMA_WINDOW (windows->data);
647 
648         gtk_recent_chooser_set_limit (GTK_RECENT_CHOOSER (w->priv->toolbar_recent_menu),
649                                       max);
650 
651         windows = g_list_next (windows);
652     }
653 
654     /* FIXME: we have no way at the moment to trigger the
655      * update of the inline recents in the File menu */
656 }
657 
658 static void
on_draw_spaces_changed(GSettings * settings,gchar * key,gpointer user_data)659 on_draw_spaces_changed (GSettings *settings,
660                         gchar     *key,
661                         gpointer   user_data)
662 {
663     pluma_debug (DEBUG_PREFS);
664 
665     if (strcmp (key, PLUMA_SETTINGS_DRAWER_SPACE))
666         return;
667 
668 #ifdef GTK_SOURCE_VERSION_3_24
669     pluma_settings_space_drawer_generic (settings,
670                                          g_settings_get_enum (settings, key),
671                                          GTK_SOURCE_SPACE_TYPE_SPACE);
672 #else
673     pluma_settings_draw_generic (settings,
674                                  g_settings_get_enum (settings, key),
675                                  GTK_SOURCE_DRAW_SPACES_SPACE);
676 #endif
677 }
678 
679 static void
on_draw_tabs_changed(GSettings * settings,gchar * key,gpointer user_data)680 on_draw_tabs_changed (GSettings *settings,
681                       gchar     *key,
682                       gpointer   user_data)
683 {
684     pluma_debug (DEBUG_PREFS);
685 
686     if (strcmp (key, PLUMA_SETTINGS_DRAWER_TAB))
687         return;
688 
689 #ifdef GTK_SOURCE_VERSION_3_24
690     pluma_settings_space_drawer_generic (settings,
691                                          g_settings_get_enum (settings, key),
692                                          GTK_SOURCE_SPACE_TYPE_TAB);
693 #else
694     pluma_settings_draw_generic (settings,
695                                  g_settings_get_enum (settings, key),
696                                  GTK_SOURCE_DRAW_SPACES_TAB);
697 #endif
698 }
699 
700 static void
on_draw_newlines_changed(GSettings * settings,gchar * key,gpointer user_data)701 on_draw_newlines_changed (GSettings *settings,
702                           gchar     *key,
703                           gpointer   user_data)
704 {
705     pluma_debug (DEBUG_PREFS);
706 
707     if (strcmp (key, PLUMA_SETTINGS_DRAWER_NEWLINE))
708         return;
709 
710 #ifdef GTK_SOURCE_VERSION_3_24
711     pluma_settings_space_drawer_generic (settings,
712                                          g_settings_get_boolean (settings, key) ? 1 : 0,
713                                          GTK_SOURCE_SPACE_TYPE_NEWLINE);
714 #else
715     pluma_settings_draw_generic (settings,
716                                  g_settings_get_boolean (settings, key) ? 1 : 0,
717                                  GTK_SOURCE_DRAW_SPACES_NEWLINE);
718 #endif
719 }
720 
721 static void
on_draw_nbsp_changed(GSettings * settings,gchar * key,gpointer user_data)722 on_draw_nbsp_changed (GSettings *settings,
723                       gchar     *key,
724                       gpointer   user_data)
725 {
726     pluma_debug (DEBUG_PREFS);
727 
728     if (strcmp (key, PLUMA_SETTINGS_DRAWER_NBSP))
729         return;
730 
731 #ifdef GTK_SOURCE_VERSION_3_24
732     pluma_settings_space_drawer_generic (settings,
733                                          g_settings_get_enum (settings, key),
734                                          GTK_SOURCE_SPACE_TYPE_NBSP);
735 #else
736     pluma_settings_draw_generic (settings,
737                                  g_settings_get_enum (settings, key),
738                                  GTK_SOURCE_DRAW_SPACES_NBSP);
739 #endif
740 }
741 
742 static void
pluma_settings_class_init(PlumaSettingsClass * klass)743 pluma_settings_class_init (PlumaSettingsClass *klass)
744 {
745     GObjectClass *object_class = G_OBJECT_CLASS (klass);
746 
747     object_class->finalize = pluma_settings_finalize;
748     object_class->dispose = pluma_settings_dispose;
749 }
750 
751 static void
pluma_settings_init(PlumaSettings * self)752 pluma_settings_init (PlumaSettings *self)
753 {
754     self->priv = pluma_settings_get_instance_private (self);
755 
756     self->priv->old_scheme = NULL;
757 
758     self->priv->editor_settings = g_settings_new (PLUMA_SCHEMA_ID);
759 
760     /* Load settings */
761     self->priv->lockdown_settings = g_settings_new ("org.mate.lockdown");
762 
763     g_signal_connect (self->priv->lockdown_settings,
764                       "changed",
765                       G_CALLBACK (on_lockdown_changed),
766                       NULL);
767 
768     self->priv->interface_settings = g_settings_new ("org.mate.interface");
769 
770     g_signal_connect (self->priv->interface_settings,
771                       "changed::monospace-font-name",
772                       G_CALLBACK (on_system_font_changed),
773                       self);
774 
775     /* editor changes */
776     g_signal_connect (self->priv->editor_settings,
777                       "changed::use-default-font",
778                       G_CALLBACK (on_use_default_font_changed),
779                       self);
780     g_signal_connect (self->priv->editor_settings,
781                       "changed::editor-font",
782                       G_CALLBACK (on_editor_font_changed),
783                       self);
784     g_signal_connect (self->priv->editor_settings,
785                       "changed::color-scheme",
786                       G_CALLBACK (on_scheme_changed),
787                       self);
788     g_signal_connect (self->priv->editor_settings,
789                       "changed::auto-save",
790                       G_CALLBACK (on_auto_save_changed),
791                       self);
792     g_signal_connect (self->priv->editor_settings,
793                       "changed::auto-save-interval",
794                       G_CALLBACK (on_auto_save_interval_changed),
795                       self);
796     g_signal_connect (self->priv->editor_settings,
797                       "changed::undo-actions-limit",
798                       G_CALLBACK (on_undo_actions_limit_changed),
799                       self);
800     g_signal_connect (self->priv->editor_settings,
801                       "changed::wrap-mode",
802                       G_CALLBACK (on_wrap_mode_changed),
803                       self);
804     g_signal_connect (self->priv->editor_settings,
805                       "changed::tabs-size",
806                       G_CALLBACK (on_tabs_size_changed),
807                       self);
808     g_signal_connect (self->priv->editor_settings,
809                       "changed::insert-spaces",
810                       G_CALLBACK (on_insert_spaces_changed),
811                       self);
812     g_signal_connect (self->priv->editor_settings,
813                       "changed::auto-indent",
814                       G_CALLBACK (on_auto_indent_changed),
815                       self);
816     g_signal_connect (self->priv->editor_settings,
817                       "changed::display-line-numbers",
818                       G_CALLBACK (on_display_line_numbers_changed),
819                       self);
820     g_signal_connect (self->priv->editor_settings,
821                       "changed::highlight-current-line",
822                       G_CALLBACK (on_hl_current_line_changed),
823                       self);
824     g_signal_connect (self->priv->editor_settings,
825                       "changed::bracket-matching",
826                       G_CALLBACK (on_bracket_matching_changed),
827                       self);
828     g_signal_connect (self->priv->editor_settings,
829                       "changed::display-right-margin",
830                       G_CALLBACK (on_display_right_margin_changed),
831                       self);
832     g_signal_connect (self->priv->editor_settings,
833                       "changed::right-margin-position",
834                       G_CALLBACK (on_right_margin_position_changed),
835                       self);
836     g_signal_connect (self->priv->editor_settings,
837                       "changed::smart-home-end",
838                       G_CALLBACK (on_smart_home_end_changed),
839                       self);
840     g_signal_connect (self->priv->editor_settings,
841                       "changed::syntax-highlighting",
842                       G_CALLBACK (on_syntax_highlighting_changed),
843                       self);
844     g_signal_connect (self->priv->editor_settings,
845                       "changed::search-highlighting",
846                       G_CALLBACK (on_search_highlighting_changed),
847                       self);
848     g_signal_connect (self->priv->editor_settings,
849                       "changed::max-recents",
850                       G_CALLBACK (on_max_recents_changed),
851                       self);
852     g_signal_connect (self->priv->editor_settings,
853                       "changed::enable-space-drawer-space",
854                       G_CALLBACK (on_draw_spaces_changed),
855                       NULL);
856     g_signal_connect (self->priv->editor_settings,
857                       "changed::enable-space-drawer-tab",
858                       G_CALLBACK (on_draw_tabs_changed),
859                       NULL);
860     g_signal_connect (self->priv->editor_settings,
861                       "changed::enable-space-drawer-newline",
862                       G_CALLBACK (on_draw_newlines_changed),
863                       NULL);
864     g_signal_connect (self->priv->editor_settings,
865                       "changed::enable-space-drawer-nbsp",
866                       G_CALLBACK (on_draw_nbsp_changed),
867                       NULL);
868 }
869 
870 PlumaSettings *
_pluma_settings_get_singleton(void)871 _pluma_settings_get_singleton (void)
872 {
873     if (singleton == NULL)
874     {
875         singleton = g_object_new (PLUMA_TYPE_SETTINGS, NULL);
876     }
877 
878     return singleton;
879 }
880 
881 void
pluma_settings_unref_singleton(void)882 pluma_settings_unref_singleton (void)
883 {
884     if (singleton != NULL)
885     {
886         g_object_unref (singleton);
887     }
888 
889     /* singleton is not set to NULL here, it is set to NULL in
890      * pluma_settings_finalize() (i.e. when we are sure that the ref count
891      * reaches 0).
892      */
893 }
894 
895 PlumaLockdownMask
pluma_settings_get_lockdown(PlumaSettings * self)896 pluma_settings_get_lockdown (PlumaSettings *self)
897 {
898     guint lockdown = 0;
899     gboolean command_line, printing, print_setup, save_to_disk;
900 
901     command_line = g_settings_get_boolean (self->priv->lockdown_settings,
902                                            PLUMA_SETTINGS_LOCKDOWN_COMMAND_LINE);
903     printing = g_settings_get_boolean (self->priv->lockdown_settings,
904                                        PLUMA_SETTINGS_LOCKDOWN_PRINTING);
905     print_setup = g_settings_get_boolean (self->priv->lockdown_settings,
906                                           PLUMA_SETTINGS_LOCKDOWN_PRINT_SETUP);
907     save_to_disk = g_settings_get_boolean (self->priv->lockdown_settings,
908                                            PLUMA_SETTINGS_LOCKDOWN_SAVE_TO_DISK);
909 
910     if (command_line)
911         lockdown |= PLUMA_LOCKDOWN_COMMAND_LINE;
912 
913     if (printing)
914         lockdown |= PLUMA_LOCKDOWN_PRINTING;
915 
916     if (print_setup)
917         lockdown |= PLUMA_LOCKDOWN_PRINT_SETUP;
918 
919     if (save_to_disk)
920         lockdown |= PLUMA_LOCKDOWN_SAVE_TO_DISK;
921 
922     return lockdown;
923 }
924 
925 gchar *
pluma_settings_get_system_font(PlumaSettings * self)926 pluma_settings_get_system_font (PlumaSettings *self)
927 {
928     gchar *system_font;
929 
930     g_return_val_if_fail (PLUMA_IS_SETTINGS (self), NULL);
931 
932     system_font = g_settings_get_string (self->priv->interface_settings,
933                                          "monospace-font-name");
934 
935     return system_font;
936 }
937 
938 PlumaToolbarSetting
pluma_settings_get_toolbar_style(PlumaSettings * self)939 pluma_settings_get_toolbar_style (PlumaSettings *self)
940 {
941     PlumaToolbarSetting res;
942     gchar *str;
943 
944     g_return_val_if_fail (PLUMA_IS_SETTINGS (self), 0);
945 
946     str = g_settings_get_string (self->priv->editor_settings,
947                                  "toolbar-buttons-style");
948 
949     g_return_val_if_fail (str != NULL, 0);
950 
951     if (strcmp (str, "PLUMA_TOOLBAR_ICONS") == 0)
952         res = PLUMA_TOOLBAR_ICONS;
953     else
954     {
955         if (strcmp (str, "PLUMA_TOOLBAR_ICONS_AND_TEXT") == 0)
956             res = PLUMA_TOOLBAR_ICONS_AND_TEXT;
957         else
958         {
959             if (strcmp (str, "PLUMA_TOOLBAR_ICONS_BOTH_HORIZ") == 0)
960                 res = PLUMA_TOOLBAR_ICONS_BOTH_HORIZ;
961             else
962                 res = PLUMA_TOOLBAR_SYSTEM;
963         }
964     }
965 
966     g_free (str);
967 
968     return res;
969 }
970 
971 GtkSourceSmartHomeEndType
pluma_settings_get_smart_home_end(PlumaSettings * self)972 pluma_settings_get_smart_home_end (PlumaSettings *self)
973 {
974     GtkSourceSmartHomeEndType res;
975     gchar *str;
976 
977     g_return_val_if_fail (PLUMA_IS_SETTINGS (self), GTK_SOURCE_SMART_HOME_END_AFTER);
978 
979     str = g_settings_get_string (self->priv->editor_settings, "smart-home-end");
980 
981     g_return_val_if_fail (str != NULL, GTK_SOURCE_SMART_HOME_END_AFTER);
982 
983     if (strcmp (str, "DISABLED") == 0)
984         res = GTK_SOURCE_SMART_HOME_END_DISABLED;
985     else if (strcmp (str, "BEFORE") == 0)
986         res = GTK_SOURCE_SMART_HOME_END_BEFORE;
987     else if (strcmp (str, "ALWAYS") == 0)
988         res = GTK_SOURCE_SMART_HOME_END_ALWAYS;
989     else
990         res = GTK_SOURCE_SMART_HOME_END_AFTER;
991 
992     g_free (str);
993 
994     return res;
995 }
996 
997 static gchar *
get_wrap_str(guint mode)998 get_wrap_str (guint mode)
999 {
1000     gchar *str;
1001 
1002     switch (mode)
1003     {
1004         case GTK_WRAP_NONE:
1005             str = g_strdup ("GTK_WRAP_NONE");
1006             break;
1007 
1008         case GTK_WRAP_CHAR:
1009             str = g_strdup ("GTK_WRAP_CHAR");
1010             break;
1011 
1012         default: /* GTK_WRAP_WORD */
1013             str = g_strdup ("GTK_WRAP_WORD");
1014     }
1015 
1016     return str;
1017 }
1018 
1019 GtkWrapMode
pluma_settings_get_wrap_mode(GSettings * settings,const gchar * key)1020 pluma_settings_get_wrap_mode (GSettings   *settings,
1021                               const gchar *key)
1022 {
1023     GtkWrapMode res;
1024     gchar *str;
1025 
1026     g_return_val_if_fail (G_IS_SETTINGS (settings), GTK_WRAP_WORD);
1027     g_return_val_if_fail (key != NULL, GTK_WRAP_WORD);
1028 
1029     str = g_settings_get_string (settings, key);
1030 
1031     g_return_val_if_fail (str != NULL, GTK_WRAP_WORD);
1032 
1033     if (strcmp (str, "GTK_WRAP_NONE") == 0)
1034         res = GTK_WRAP_NONE;
1035     else
1036     {
1037         if (strcmp (str, "GTK_WRAP_CHAR") == 0)
1038             res = GTK_WRAP_CHAR;
1039         else
1040             res = GTK_WRAP_WORD;
1041     }
1042 
1043     g_free (str);
1044 
1045     return res;
1046 }
1047 
1048 void
pluma_settings_set_wrap_mode(GSettings * settings,const gchar * key,GtkWrapMode mode)1049 pluma_settings_set_wrap_mode (GSettings   *settings,
1050                               const gchar *key,
1051                               GtkWrapMode  mode)
1052 {
1053     gchar *str;
1054 
1055     g_return_if_fail (G_IS_SETTINGS (settings));
1056     g_return_if_fail (key != NULL);
1057 
1058     str = get_wrap_str (mode);
1059 
1060     g_settings_set_string (settings, key, str);
1061 }
1062 
1063 /* GSettings/GSList utility functions from mate-panel */
1064 
1065 GSList*
pluma_settings_get_list(GSettings * settings,const gchar * key)1066 pluma_settings_get_list (GSettings *settings, const gchar *key)
1067 {
1068     gchar **array;
1069     GSList *list = NULL;
1070     gint i;
1071     array = g_settings_get_strv (settings, key);
1072     if (array != NULL) {
1073         for (i = 0; array[i]; i++) {
1074             list = g_slist_append (list, g_strdup (array[i]));
1075         }
1076     }
1077     g_strfreev (array);
1078     return list;
1079 }
1080 
1081 void
pluma_settings_set_list(GSettings * settings,const gchar * key,GSList * list)1082 pluma_settings_set_list (GSettings *settings, const gchar *key, GSList *list)
1083 {
1084     GArray *array;
1085     GSList *l;
1086     array = g_array_new (TRUE, TRUE, sizeof (gchar *));
1087     for (l = list; l; l = l->next) {
1088         array = g_array_append_val (array, l->data);
1089     }
1090     g_settings_set_strv (settings, key, (const gchar **) array->data);
1091     g_array_free (array, TRUE);
1092 }
1093 
1094 GSList *
pluma_settings_get_writable_vfs_schemes(GSettings * settings)1095 pluma_settings_get_writable_vfs_schemes (GSettings *settings)
1096 {
1097     GSList *strings;
1098 
1099     pluma_debug (DEBUG_PREFS);
1100 
1101     strings = pluma_settings_get_list (settings, PLUMA_SETTINGS_WRITABLE_VFS_SCHEMES);
1102 
1103     /* The 'file' scheme is writable by default. */
1104     strings = g_slist_prepend (strings, g_strdup ("file"));
1105 
1106     pluma_debug_message (DEBUG_PREFS, "Done");
1107 
1108     return strings;
1109 }
1110 
1111