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