1 /* -*- Mode: C; indent-tabs-mode: f; c-basic-offset: 4; tab-width: 4 -*- */
2 
3 /* nemo-global-preferences.c - Nemo specific preference keys and
4                                    functions.
5 
6    Copyright (C) 1999, 2000, 2001 Eazel, Inc.
7 
8    The Gnome Library is free software; you can redistribute it and/or
9    modify it under the terms of the GNU Library General Public License as
10    published by the Free Software Foundation; either version 2 of the
11    License, or (at your option) any later version.
12 
13    The Gnome Library is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    Library General Public License for more details.
17 
18    You should have received a copy of the GNU Library General Public
19    License along with the Gnome Library; see the file COPYING.LIB.  If not,
20    write to the Free Software Foundation, Inc., 51 Franklin Street - Suite 500,
21    Boston, MA 02110-1335, USA.
22 
23    Authors: Ramiro Estrugo <ramiro@eazel.com>
24 */
25 
26 #include <config.h>
27 #include "nemo-global-preferences.h"
28 
29 #include "nemo-file-utilities.h"
30 #include "nemo-file.h"
31 #include <eel/eel-glib-extensions.h>
32 #include <eel/eel-gtk-extensions.h>
33 #include <eel/eel-stock-dialogs.h>
34 #include <eel/eel-string.h>
35 #include <eel/eel-debug.h>
36 #include <glib/gi18n.h>
37 #include <gio/gdesktopappinfo.h>
38 
39 GSettings *nemo_preferences;
40 GSettings *nemo_icon_view_preferences;
41 GSettings *nemo_list_view_preferences;
42 GSettings *nemo_compact_view_preferences;
43 GSettings *nemo_desktop_preferences;
44 GSettings *nemo_tree_sidebar_preferences;
45 GSettings *nemo_window_state;
46 GSettings *nemo_plugin_preferences;
47 GSettings *nemo_menu_config_preferences;
48 GSettings *gnome_lockdown_preferences;
49 GSettings *gnome_background_preferences;
50 GSettings *gnome_media_handling_preferences;
51 GSettings *gnome_terminal_preferences;
52 GSettings *cinnamon_privacy_preferences;
53 GSettings *cinnamon_interface_preferences;
54 
55 GTimeZone      *prefs_current_timezone;
56 gboolean        prefs_current_24h_time_format;
57 NemoDateFormat  prefs_current_date_format;
58 
59 GTimer    *nemo_startup_timer;
60 
61 static gboolean ignore_view_metadata = FALSE;
62 static gboolean inherit_folder_view_preference = FALSE;
63 static gboolean inherit_show_thumbnails_preference = FALSE;
64 static int      size_prefixes_preference = 0;
65 
66 static gchar **file_roller_mimetypes = NULL;
67 
68 
69 GFileMonitor *tz_mon;
70 
71 /*
72  * Public functions
73  */
74 char *
nemo_global_preferences_get_default_folder_viewer_preference_as_iid(void)75 nemo_global_preferences_get_default_folder_viewer_preference_as_iid (void)
76 {
77 	int preference_value;
78 	const char *viewer_iid;
79 
80 	preference_value =
81 		g_settings_get_enum (nemo_preferences, NEMO_PREFERENCES_DEFAULT_FOLDER_VIEWER);
82 
83 	if (preference_value == NEMO_DEFAULT_FOLDER_VIEWER_LIST_VIEW) {
84 		viewer_iid = NEMO_LIST_VIEW_IID;
85 	} else if (preference_value == NEMO_DEFAULT_FOLDER_VIEWER_COMPACT_VIEW) {
86 		viewer_iid = NEMO_COMPACT_VIEW_IID;
87 	} else {
88 		viewer_iid = NEMO_ICON_VIEW_IID;
89 	}
90 
91 	return g_strdup (viewer_iid);
92 }
93 
94 gboolean
nemo_global_preferences_get_inherit_folder_viewer_preference(void)95 nemo_global_preferences_get_inherit_folder_viewer_preference (void)
96 {
97     return inherit_folder_view_preference;
98 }
99 
100 gboolean
nemo_global_preferences_get_ignore_view_metadata(void)101 nemo_global_preferences_get_ignore_view_metadata (void)
102 {
103     return ignore_view_metadata;
104 }
105 
106 gboolean
nemo_global_preferences_get_inherit_show_thumbnails_preference(void)107 nemo_global_preferences_get_inherit_show_thumbnails_preference (void)
108 {
109     return inherit_show_thumbnails_preference;
110 }
111 
112 int
nemo_global_preferences_get_size_prefix_preference(void)113 nemo_global_preferences_get_size_prefix_preference (void)
114 {
115     switch (size_prefixes_preference) {
116         case 0: // base-10
117             return G_FORMAT_SIZE_DEFAULT;
118         case 1: // base-10 full
119             return G_FORMAT_SIZE_DEFAULT |                           G_FORMAT_SIZE_LONG_FORMAT;
120         case 2: // base-2
121             return G_FORMAT_SIZE_DEFAULT | G_FORMAT_SIZE_IEC_UNITS;
122         case 3: // base-2 full
123             return G_FORMAT_SIZE_DEFAULT | G_FORMAT_SIZE_IEC_UNITS | G_FORMAT_SIZE_LONG_FORMAT;
124     }
125 
126     return 0;
127 }
128 
129 char *
nemo_global_preferences_get_desktop_iid(void)130 nemo_global_preferences_get_desktop_iid (void)
131 {
132     gboolean use_grid;
133     const char *viewer_iid;
134 
135     use_grid = g_settings_get_boolean (nemo_desktop_preferences, NEMO_PREFERENCES_USE_DESKTOP_GRID);
136 
137     if (use_grid) {
138         viewer_iid = NEMO_DESKTOP_ICON_GRID_VIEW_IID;
139     } else {
140         viewer_iid = NEMO_DESKTOP_ICON_VIEW_IID;
141     }
142 
143     return g_strdup (viewer_iid);
144 }
145 
146 gint
nemo_global_preferences_get_tooltip_flags(void)147 nemo_global_preferences_get_tooltip_flags (void)
148 {
149     NemoFileTooltipFlags flags = NEMO_FILE_TOOLTIP_FLAGS_NONE;
150 
151     if (g_settings_get_boolean (nemo_preferences, NEMO_PREFERENCES_TOOLTIP_FILE_TYPE))
152         flags |= NEMO_FILE_TOOLTIP_FLAGS_FILE_TYPE;
153     if (g_settings_get_boolean (nemo_preferences, NEMO_PREFERENCES_TOOLTIP_MOD_DATE))
154         flags |= NEMO_FILE_TOOLTIP_FLAGS_MOD_DATE;
155     if (g_settings_get_boolean (nemo_preferences, NEMO_PREFERENCES_TOOLTIP_ACCESS_DATE))
156         flags |= NEMO_FILE_TOOLTIP_FLAGS_ACCESS_DATE;
157     if (g_settings_get_boolean (nemo_preferences, NEMO_PREFERENCES_TOOLTIP_FULL_PATH))
158         flags |= NEMO_FILE_TOOLTIP_FLAGS_PATH;
159     if (g_settings_get_boolean (nemo_preferences, NEMO_PREFERENCES_TOOLTIP_CREATED_DATE))
160         flags |= NEMO_FILE_TOOLTIP_FLAGS_CREATED_DATE;
161     return flags;
162 }
163 
164 gboolean
nemo_global_preferences_should_load_plugin(const gchar * name,const gchar * key)165 nemo_global_preferences_should_load_plugin (const gchar *name, const gchar *key)
166 {
167     gchar **disabled_list = g_settings_get_strv (nemo_plugin_preferences, key);
168 
169     gboolean ret = TRUE;
170     guint i = 0;
171 
172     for (i = 0; i < g_strv_length (disabled_list); i++) {
173         if (g_strcmp0 (disabled_list[i], name) == 0)
174             ret = FALSE;
175     }
176 
177     g_strfreev (disabled_list);
178     return ret;
179 }
180 
181 static void
boolean_changed_cb(GSettings * settings,gchar * key,gboolean * user_data)182 boolean_changed_cb (GSettings *settings,
183                     gchar     *key,
184                     gboolean  *user_data)
185 {
186     *user_data = g_settings_get_boolean (settings, key);
187 }
188 
189 static void
enum_changed_cb(GSettings * settings,gchar * key,int * user_data)190 enum_changed_cb (GSettings *settings,
191                  gchar     *key,
192                  int       *user_data)
193 {
194     *user_data = g_settings_get_enum (settings, key);
195 }
196 
197 static void
setup_cached_pref_keys(void)198 setup_cached_pref_keys (void)
199 {
200     g_signal_connect (nemo_preferences,
201                       "changed::" NEMO_PREFERENCES_IGNORE_VIEW_METADATA,
202                       G_CALLBACK (boolean_changed_cb), &ignore_view_metadata);
203 
204     boolean_changed_cb (nemo_preferences, NEMO_PREFERENCES_IGNORE_VIEW_METADATA, &ignore_view_metadata);
205 
206     g_signal_connect (nemo_preferences,
207                       "changed::" NEMO_PREFERENCES_INHERIT_FOLDER_VIEWER,
208                       G_CALLBACK (boolean_changed_cb), &inherit_folder_view_preference);
209 
210     boolean_changed_cb (nemo_preferences, NEMO_PREFERENCES_INHERIT_FOLDER_VIEWER, &inherit_folder_view_preference);
211 
212     g_signal_connect (nemo_preferences,
213                       "changed::" NEMO_PREFERENCES_INHERIT_SHOW_THUMBNAILS,
214                       G_CALLBACK (boolean_changed_cb), &inherit_show_thumbnails_preference);
215 
216     boolean_changed_cb (nemo_preferences, NEMO_PREFERENCES_INHERIT_SHOW_THUMBNAILS, &inherit_show_thumbnails_preference);
217 
218     g_signal_connect (nemo_preferences,
219                       "changed::" NEMO_PREFERENCES_SIZE_PREFIXES,
220                       G_CALLBACK (enum_changed_cb), &size_prefixes_preference);
221 
222     enum_changed_cb (nemo_preferences, NEMO_PREFERENCES_SIZE_PREFIXES, &size_prefixes_preference);
223 }
224 
225 
226 gchar **
nemo_global_preferences_get_fileroller_mimetypes(void)227 nemo_global_preferences_get_fileroller_mimetypes (void)
228 {
229     static gsize once_init = 0;
230 
231     if (g_once_init_enter (&once_init)) {
232         if (nemo_is_file_roller_installed ()) {
233             GAppInfo *app_info;
234             gchar ***results;
235             gchar **result;
236             gint i;
237 
238             results = g_desktop_app_info_search ("file-roller");
239 
240             if (results != NULL && results[0] != NULL) {
241                 const gchar *best;
242 
243                 best = results[0][0];
244 
245                 app_info = G_APP_INFO (g_desktop_app_info_new (best));
246 
247                 if (app_info) {
248                     file_roller_mimetypes = g_strdupv ((gchar **) g_app_info_get_supported_types (app_info));
249                     g_object_unref (app_info);
250                 }
251 
252                 if (app_info == NULL) {
253                     g_warning ("Unable to retrieve list of file-roller mimetypes");
254                 }
255 
256                 i = 0;
257                 result = results[i];
258 
259                 while (result != NULL) {
260                     g_strfreev (result);
261                     result = results[++i];
262                 }
263 
264                 g_free (results);
265             }
266         }
267 
268         g_once_init_leave (&once_init, 1);
269     }
270 
271     return file_roller_mimetypes;
272 }
273 
274 static void
on_time_data_changed(gpointer user_data)275 on_time_data_changed (gpointer user_data)
276 {
277     prefs_current_date_format = g_settings_get_enum (nemo_preferences, NEMO_PREFERENCES_DATE_FORMAT);
278     prefs_current_24h_time_format = g_settings_get_boolean (cinnamon_interface_preferences, "clock-use-24h");
279 
280     if (prefs_current_timezone != NULL) {
281         g_time_zone_unref (prefs_current_timezone);
282     }
283 
284     prefs_current_timezone = g_time_zone_new_local ();
285 }
286 
287 static void
setup_cached_time_data(void)288 setup_cached_time_data (void)
289 {
290     GFile *tz;
291 
292     prefs_current_timezone = NULL;
293 
294     g_signal_connect_swapped (nemo_preferences,
295                               "changed::" NEMO_PREFERENCES_DATE_FORMAT,
296                               G_CALLBACK (on_time_data_changed), NULL);
297 
298     g_signal_connect_swapped (cinnamon_interface_preferences,
299                               "changed::clock-use-24h",
300                               G_CALLBACK (on_time_data_changed), NULL);
301 
302 
303     tz = g_file_new_for_path ("/etc/localtime");
304 
305     tz_mon = g_file_monitor_file (tz, 0, NULL, NULL);
306     g_object_unref (tz);
307 
308     g_signal_connect_swapped (tz_mon,
309                               "changed",
310                               G_CALLBACK (on_time_data_changed), NULL);
311 
312     on_time_data_changed (NULL);
313 }
314 
315 void
nemo_global_preferences_init(void)316 nemo_global_preferences_init (void)
317 {
318 	static gboolean initialized = FALSE;
319 
320 	if (initialized) {
321 		return;
322 	}
323 
324 	initialized = TRUE;
325 
326 	nemo_preferences = g_settings_new("org.nemo.preferences");
327 	nemo_window_state = g_settings_new("org.nemo.window-state");
328 	nemo_icon_view_preferences = g_settings_new("org.nemo.icon-view");
329 	nemo_list_view_preferences = g_settings_new("org.nemo.list-view");
330 	nemo_compact_view_preferences = g_settings_new("org.nemo.compact-view");
331 	nemo_desktop_preferences = g_settings_new("org.nemo.desktop");
332 	nemo_tree_sidebar_preferences = g_settings_new("org.nemo.sidebar-panels.tree");
333     nemo_plugin_preferences = g_settings_new("org.nemo.plugins");
334     nemo_menu_config_preferences = g_settings_new("org.nemo.preferences.menu-config");
335 	gnome_lockdown_preferences = g_settings_new("org.cinnamon.desktop.lockdown");
336 	gnome_background_preferences = g_settings_new("org.cinnamon.desktop.background");
337 	gnome_media_handling_preferences = g_settings_new("org.cinnamon.desktop.media-handling");
338 	gnome_terminal_preferences = g_settings_new("org.cinnamon.desktop.default-applications.terminal");
339     cinnamon_privacy_preferences = g_settings_new("org.cinnamon.desktop.privacy");
340 	cinnamon_interface_preferences = g_settings_new ("org.cinnamon.desktop.interface");
341 
342     setup_cached_pref_keys ();
343     setup_cached_time_data ();
344 
345     eel_debug_call_at_shutdown (nemo_global_preferences_finalize);
346 }
347 
348 void
nemo_global_preferences_finalize(void)349 nemo_global_preferences_finalize (void)
350 {
351     g_strfreev (file_roller_mimetypes);
352     g_object_unref (tz_mon);
353 
354     g_object_unref (nemo_preferences);
355     g_object_unref (nemo_window_state);
356     g_object_unref (nemo_icon_view_preferences);
357     g_object_unref (nemo_list_view_preferences);
358     g_object_unref (nemo_compact_view_preferences);
359     g_object_unref (nemo_desktop_preferences);
360     g_object_unref (nemo_tree_sidebar_preferences);
361     g_object_unref (nemo_plugin_preferences);
362     g_object_unref (nemo_menu_config_preferences);
363     g_object_unref (gnome_lockdown_preferences);
364     g_object_unref (gnome_background_preferences);
365     g_object_unref (gnome_media_handling_preferences);
366     g_object_unref (gnome_terminal_preferences);
367     g_object_unref (cinnamon_privacy_preferences);
368     g_object_unref (cinnamon_interface_preferences);
369 }
370