1 /*
2  * Copyright © 2009-2018 Siyan Panayotov <contact@siyanpanayotov.com>
3  *
4  * This file is part of Viewnior.
5  *
6  * Viewnior is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * Viewnior is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with Viewnior.  If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #include <libintl.h>
21 #include <glib/gi18n.h>
22 #define _(String) gettext (String)
23 
24 #include "config.h"
25 #include "vnr-prefs.h"
26 #include "vnr-window.h"
27 
28 #define UI_PATH PACKAGE_DATA_DIR"/viewnior/vnr-preferences-dialog.ui"
29 
30 G_DEFINE_TYPE (VnrPrefs, vnr_prefs, G_TYPE_OBJECT);
31 
32 /*************************************************************/
33 /***** Private signal handlers *******************************/
34 /*************************************************************/
35 
36 static void
toggle_show_hidden_cb(GtkToggleButton * togglebutton,gpointer user_data)37 toggle_show_hidden_cb (GtkToggleButton *togglebutton, gpointer user_data)
38 {
39     VNR_PREFS(user_data)->show_hidden = gtk_toggle_button_get_active(togglebutton);
40     vnr_prefs_save(VNR_PREFS(user_data));
41 }
42 
43 static void
toggle_fit_on_fullscreen_cb(GtkToggleButton * togglebutton,gpointer user_data)44 toggle_fit_on_fullscreen_cb (GtkToggleButton *togglebutton, gpointer user_data)
45 {
46     VNR_PREFS(user_data)->fit_on_fullscreen = gtk_toggle_button_get_active(togglebutton);
47     vnr_prefs_save(VNR_PREFS(user_data));
48 }
49 
50 static void
toggle_smooth_images_cb(GtkToggleButton * togglebutton,gpointer user_data)51 toggle_smooth_images_cb (GtkToggleButton *togglebutton, gpointer user_data)
52 {
53     VNR_PREFS(user_data)->smooth_images = gtk_toggle_button_get_active(togglebutton);
54     vnr_prefs_save(VNR_PREFS(user_data));
55     vnr_window_apply_preferences(VNR_WINDOW(VNR_PREFS(user_data)->vnr_win));
56 }
57 
58 static void
toggle_confirm_delete_cb(GtkToggleButton * togglebutton,gpointer user_data)59 toggle_confirm_delete_cb (GtkToggleButton *togglebutton, gpointer user_data)
60 {
61     VNR_PREFS(user_data)->confirm_delete = gtk_toggle_button_get_active(togglebutton);
62     vnr_prefs_save(VNR_PREFS(user_data));
63 }
64 
65 static void
toggle_reload_on_save_cb(GtkToggleButton * togglebutton,gpointer user_data)66 toggle_reload_on_save_cb (GtkToggleButton *togglebutton, gpointer user_data)
67 {
68     VNR_PREFS(user_data)->reload_on_save = gtk_toggle_button_get_active(togglebutton);
69     vnr_prefs_save(VNR_PREFS(user_data));
70 }
71 
72 static void
change_zoom_mode_cb(GtkComboBox * widget,gpointer user_data)73 change_zoom_mode_cb (GtkComboBox *widget, gpointer user_data)
74 {
75     VNR_PREFS(user_data)->zoom = gtk_combo_box_get_active(widget);
76     vnr_prefs_save(VNR_PREFS(user_data));
77 }
78 
79 static void
change_desktop_env_cb(GtkComboBox * widget,gpointer user_data)80 change_desktop_env_cb (GtkComboBox *widget, gpointer user_data)
81 {
82     VNR_PREFS(user_data)->desktop = gtk_combo_box_get_active(widget);
83     vnr_prefs_save(VNR_PREFS(user_data));
84 }
85 
86 static void
change_jpeg_quality_cb(GtkRange * range,gpointer user_data)87 change_jpeg_quality_cb (GtkRange *range, gpointer user_data)
88 {
89     VNR_PREFS(user_data)->jpeg_quality = (int) gtk_range_get_value(range);
90     vnr_prefs_save(VNR_PREFS(user_data));
91 }
92 
93 static void
change_png_compression_cb(GtkRange * range,gpointer user_data)94 change_png_compression_cb (GtkRange *range, gpointer user_data)
95 {
96     VNR_PREFS(user_data)->png_compression = (int) gtk_range_get_value(range);
97     vnr_prefs_save(VNR_PREFS(user_data));
98 }
99 
100 static void
change_action_wheel_cb(GtkComboBox * widget,gpointer user_data)101 change_action_wheel_cb (GtkComboBox *widget, gpointer user_data)
102 {
103     VNR_PREFS(user_data)->behavior_wheel = gtk_combo_box_get_active(widget);
104     vnr_prefs_save(VNR_PREFS(user_data));
105 }
106 
107 static void
change_action_click_cb(GtkComboBox * widget,gpointer user_data)108 change_action_click_cb (GtkComboBox *widget, gpointer user_data)
109 {
110     VNR_PREFS(user_data)->behavior_click = gtk_combo_box_get_active(widget);
111     vnr_prefs_save(VNR_PREFS(user_data));
112 }
113 
114 static void
change_action_modify_cb(GtkComboBox * widget,gpointer user_data)115 change_action_modify_cb (GtkComboBox *widget, gpointer user_data)
116 {
117     VNR_PREFS(user_data)->behavior_modify = gtk_combo_box_get_active(widget);
118     vnr_prefs_save(VNR_PREFS(user_data));
119 }
120 
121 static void
change_spin_value_cb(GtkSpinButton * spinbutton,gpointer user_data)122 change_spin_value_cb (GtkSpinButton *spinbutton, gpointer user_data)
123 {
124     int new_value;
125 
126     new_value = gtk_spin_button_get_value_as_int (spinbutton);
127 
128     VNR_PREFS(user_data)->slideshow_timeout = new_value;
129     vnr_prefs_save(VNR_PREFS(user_data));
130     vnr_window_apply_preferences(VNR_WINDOW(VNR_PREFS(user_data)->vnr_win));
131 }
132 
133 static gboolean
key_press_cb(GtkWidget * widget,GdkEventKey * event,gpointer user_data)134 key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer user_data)
135 {
136     if(event->keyval == GDK_KEY_Escape)
137     {
138         gtk_widget_hide(widget);
139         return TRUE;
140     }
141     else
142         return FALSE;
143 }
144 
145 /*************************************************************/
146 /***** Private actions ***************************************/
147 /*************************************************************/
148 
149 static void
vnr_prefs_set_default(VnrPrefs * prefs)150 vnr_prefs_set_default(VnrPrefs *prefs)
151 {
152     prefs->zoom = VNR_PREFS_ZOOM_SMART;
153     prefs->show_hidden = FALSE;
154     prefs->fit_on_fullscreen = TRUE;
155     prefs->smooth_images = TRUE;
156     prefs->confirm_delete = TRUE;
157     prefs->slideshow_timeout = 5;
158     prefs->behavior_wheel = VNR_PREFS_WHEEL_ZOOM;
159     prefs->behavior_click = VNR_PREFS_CLICK_ZOOM;
160     prefs->behavior_modify = VNR_PREFS_MODIFY_ASK;
161     prefs->jpeg_quality = 90;
162     prefs->png_compression = 9;
163     prefs->reload_on_save = FALSE;
164     prefs->show_menu_bar = FALSE;
165     prefs->show_toolbar = TRUE;
166     prefs->show_scrollbar = TRUE;
167     prefs->start_maximized = FALSE;
168     prefs->start_slideshow = FALSE;
169     prefs->start_fullscreen = FALSE;
170     prefs->auto_resize = FALSE;
171     prefs->desktop = VNR_PREFS_DESKTOP_AUTO;
172 }
173 
174 static GtkWidget *
build_dialog(VnrPrefs * prefs)175 build_dialog (VnrPrefs *prefs)
176 {
177     GtkBuilder *builder;
178     GtkWidget *window;
179     GError *error = NULL;
180 
181     GObject *close_button;
182     GtkToggleButton *show_hidden;
183     GtkToggleButton *fit_on_fullscreen;
184     GtkBox *zoom_mode_box;
185     GtkComboBox *zoom_mode;
186     GtkToggleButton *smooth_images;
187     GtkToggleButton *confirm_delete;
188     GtkToggleButton *reload_on_save;
189     GtkSpinButton *slideshow_timeout;
190     GtkTable *behavior_table;
191     GtkComboBox *action_wheel;
192     GtkComboBox *action_click;
193     GtkComboBox *action_modify;
194     GtkRange *jpeg_scale;
195     GtkRange *png_scale;
196 
197     GtkBox *desktop_box;
198     GtkComboBox *desktop_env;
199 
200     builder = gtk_builder_new ();
201     gtk_builder_add_from_file (builder, UI_PATH, &error);
202 
203     if (error != NULL)
204     {
205         g_warning ("%s\n", error->message);
206         g_object_unref(builder);
207         return NULL;
208     }
209 
210     window = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
211 
212     /* Close button */
213     close_button = gtk_builder_get_object (builder, "close_button");
214     g_signal_connect_swapped(close_button, "clicked",
215                              G_CALLBACK(gtk_widget_hide_on_delete), window);
216 
217     /* Show hidden files checkbox */
218     show_hidden = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "show_hidden"));
219     gtk_toggle_button_set_active( show_hidden, prefs->show_hidden );
220     g_signal_connect(G_OBJECT(show_hidden), "toggled", G_CALLBACK(toggle_show_hidden_cb), prefs);
221 
222     /* Fit on fullscreen checkbox */
223     fit_on_fullscreen = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "fit_on_fullscreen"));
224     gtk_toggle_button_set_active( fit_on_fullscreen, prefs->fit_on_fullscreen );
225     g_signal_connect(G_OBJECT(fit_on_fullscreen), "toggled", G_CALLBACK(toggle_fit_on_fullscreen_cb), prefs);
226 
227     /* Smooth images checkbox */
228     smooth_images = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "smooth_images"));
229     gtk_toggle_button_set_active( smooth_images, prefs->smooth_images );
230     g_signal_connect(G_OBJECT(smooth_images), "toggled", G_CALLBACK(toggle_smooth_images_cb), prefs);
231 
232     /* Confirm delete checkbox */
233     confirm_delete = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "confirm_delete"));
234     gtk_toggle_button_set_active( confirm_delete, prefs->confirm_delete );
235     g_signal_connect(G_OBJECT(confirm_delete), "toggled", G_CALLBACK(toggle_confirm_delete_cb), prefs);
236 
237     /* Reload image after save checkbox */
238     reload_on_save = GTK_TOGGLE_BUTTON (gtk_builder_get_object (builder, "reload"));
239     gtk_toggle_button_set_active( reload_on_save, prefs->reload_on_save );
240     g_signal_connect(G_OBJECT(reload_on_save), "toggled", G_CALLBACK(toggle_reload_on_save_cb), prefs);
241 
242     /* Slideshow timeout spin button */
243     slideshow_timeout = GTK_SPIN_BUTTON (gtk_builder_get_object (builder, "slideshow_timeout"));
244     gtk_spin_button_set_value( slideshow_timeout, (gdouble)prefs->slideshow_timeout);
245     prefs->slideshow_timeout_widget = slideshow_timeout;
246     g_signal_connect(G_OBJECT(slideshow_timeout), "value-changed", G_CALLBACK(change_spin_value_cb), prefs);
247 
248     /* JPEG quality scale */
249     jpeg_scale = GTK_RANGE (gtk_builder_get_object (builder, "jpeg_scale"));
250     gtk_range_set_value(jpeg_scale, (gdouble)prefs->jpeg_quality);
251     g_signal_connect(G_OBJECT(jpeg_scale), "value-changed", G_CALLBACK(change_jpeg_quality_cb), prefs);
252 
253     /* PNG compression scale */
254     png_scale = GTK_RANGE (gtk_builder_get_object (builder, "png_scale"));
255     gtk_range_set_value(png_scale, (gdouble)prefs->png_compression);
256     g_signal_connect(G_OBJECT(png_scale), "value-changed", G_CALLBACK(change_png_compression_cb), prefs);
257 
258     /* Zoom mode combo box */
259     zoom_mode_box = GTK_BOX (gtk_builder_get_object (builder, "zoom_mode_box"));
260 
261     zoom_mode = (GtkComboBox*) gtk_combo_box_new_text();
262     gtk_combo_box_append_text(zoom_mode, _("Smart Mode"));
263     gtk_combo_box_append_text(zoom_mode, _("1:1 Mode"));
264     gtk_combo_box_append_text(zoom_mode, _("Fit To Window Mode"));
265     gtk_combo_box_append_text(zoom_mode, _("Last Used Mode"));
266     gtk_combo_box_set_active(zoom_mode, prefs->zoom);
267 
268     gtk_box_pack_end (zoom_mode_box, GTK_WIDGET(zoom_mode), FALSE, FALSE, 0);
269     gtk_widget_show(GTK_WIDGET(zoom_mode));
270 
271     g_signal_connect(G_OBJECT(zoom_mode), "changed", G_CALLBACK(change_zoom_mode_cb), prefs);
272 
273     /* Desktop combo box */
274     desktop_box = GTK_BOX (gtk_builder_get_object (builder, "desktop_box"));
275 
276     desktop_env = (GtkComboBox*) gtk_combo_box_new_text();
277     gtk_combo_box_append_text(desktop_env, "GNOME 2");
278     gtk_combo_box_append_text(desktop_env, "GNOME 3");
279     gtk_combo_box_append_text(desktop_env, "XFCE");
280     gtk_combo_box_append_text(desktop_env, "LXDE");
281     gtk_combo_box_append_text(desktop_env, "PUPPY");
282     gtk_combo_box_append_text(desktop_env, "FluxBox");
283     gtk_combo_box_append_text(desktop_env, "Nitrogen");
284     gtk_combo_box_append_text(desktop_env, "MATE");
285     gtk_combo_box_append_text(desktop_env, "Cinnamon");
286     gtk_combo_box_append_text(desktop_env, _("Autodetect"));
287     gtk_combo_box_set_active(desktop_env, prefs->desktop);
288 
289     gtk_box_pack_end (desktop_box, GTK_WIDGET(desktop_env), FALSE, FALSE, 0);
290     gtk_widget_show(GTK_WIDGET(desktop_env));
291 
292     g_signal_connect(G_OBJECT(desktop_env), "changed", G_CALLBACK(change_desktop_env_cb), prefs);
293 
294     /* Behavior combo boxes */
295     behavior_table = GTK_TABLE (gtk_builder_get_object (builder, "behavior_table"));
296 
297     action_wheel = (GtkComboBox*) gtk_combo_box_new_text();
298     gtk_combo_box_append_text(action_wheel, _("Navigate images"));
299     gtk_combo_box_append_text(action_wheel, _("Zoom image"));
300     gtk_combo_box_append_text(action_wheel, _("Scroll image up/down"));
301     gtk_combo_box_set_active(action_wheel, prefs->behavior_wheel);
302 
303     gtk_table_attach (behavior_table, GTK_WIDGET(action_wheel), 1,2,0,1, GTK_FILL,0, 0,0);
304     gtk_widget_show(GTK_WIDGET(action_wheel));
305     g_signal_connect(G_OBJECT(action_wheel), "changed", G_CALLBACK(change_action_wheel_cb), prefs);
306 
307     action_click = (GtkComboBox*) gtk_combo_box_new_text();
308     gtk_combo_box_append_text(action_click, _("Switch zoom modes"));
309     gtk_combo_box_append_text(action_click, _("Enter fullscreen mode"));
310     gtk_combo_box_append_text(action_click, _("Navigate images"));
311     gtk_combo_box_set_active(action_click, prefs->behavior_click);
312 
313     gtk_table_attach (behavior_table, GTK_WIDGET(action_click), 1,2,1,2, GTK_FILL,0, 0,0);
314     gtk_widget_show(GTK_WIDGET(action_click));
315     g_signal_connect(G_OBJECT(action_click), "changed", G_CALLBACK(change_action_click_cb), prefs);
316 
317     action_modify = (GtkComboBox*) gtk_combo_box_new_text();
318     gtk_combo_box_append_text(action_modify, _("Ask every time"));
319     gtk_combo_box_append_text(action_modify, _("Autosave"));
320     gtk_combo_box_append_text(action_modify, _("Ignore changes"));
321     gtk_combo_box_set_active(action_modify, prefs->behavior_modify);
322 
323     gtk_table_attach (behavior_table, GTK_WIDGET(action_modify), 1,2,2,3, GTK_FILL,0, 0,0);
324     gtk_widget_show(GTK_WIDGET(action_modify));
325     g_signal_connect(G_OBJECT(action_modify), "changed", G_CALLBACK(change_action_modify_cb), prefs);
326 
327     /* Window signals */
328     g_signal_connect(G_OBJECT(window), "delete-event",
329                      G_CALLBACK(gtk_widget_hide_on_delete), NULL);
330     g_signal_connect(G_OBJECT(window), "key-press-event", G_CALLBACK(key_press_cb), NULL);
331 
332 
333     g_object_unref (G_OBJECT (builder));
334 
335     return window;
336 }
337 
338 static gboolean
vnr_prefs_load(VnrPrefs * prefs)339 vnr_prefs_load (VnrPrefs *prefs)
340 {
341     GKeyFile *conf;
342     GError *error = NULL;
343     const gchar *path;
344 
345     path = g_build_filename (g_get_user_config_dir(), PACKAGE, "viewnior.conf", NULL);
346 
347     conf = g_key_file_new();
348     g_key_file_load_from_file (conf, path, G_KEY_FILE_NONE, &error);
349 
350     g_free((char*)path);
351 
352     if(error != NULL)
353     {
354         g_warning("Loading config file: %s. All preferences are set to their default values. Saving ...", error->message);
355         g_key_file_free (conf);
356         return FALSE;
357     }
358 
359     prefs->zoom = g_key_file_get_integer (conf, "prefs", "zoom-mode", &error);
360     prefs->fit_on_fullscreen = g_key_file_get_boolean (conf, "prefs", "fit-on-fullscreen", &error);
361     prefs->show_hidden = g_key_file_get_boolean (conf, "prefs", "show-hidden", &error);
362     prefs->smooth_images = g_key_file_get_boolean (conf, "prefs", "smooth-images", &error);
363     prefs->confirm_delete = g_key_file_get_boolean (conf, "prefs", "confirm-delete", &error);
364     prefs->reload_on_save = g_key_file_get_boolean (conf, "prefs", "reload-on-save", &error);
365     prefs->show_menu_bar = g_key_file_get_boolean (conf, "prefs", "show-menu-bar", &error);
366     prefs->show_toolbar = g_key_file_get_boolean (conf, "prefs", "show-toolbar", &error);
367     prefs->show_scrollbar = g_key_file_get_boolean (conf, "prefs", "show-scrollbar", &error);
368     prefs->start_maximized = g_key_file_get_boolean (conf, "prefs", "start-maximized", &error);
369     prefs->slideshow_timeout = g_key_file_get_integer (conf, "prefs", "slideshow-timeout", &error);
370     prefs->auto_resize = g_key_file_get_boolean (conf, "prefs", "auto-resize", &error);
371     prefs->behavior_wheel = g_key_file_get_integer (conf, "prefs", "behavior-wheel", &error);
372     prefs->behavior_click = g_key_file_get_integer (conf, "prefs", "behavior-click", &error);
373     prefs->behavior_modify = g_key_file_get_integer (conf, "prefs", "behavior-modify", &error);
374     prefs->jpeg_quality = g_key_file_get_integer (conf, "prefs", "jpeg-quality", &error);
375     prefs->png_compression = g_key_file_get_integer (conf, "prefs", "png-compression", &error);
376     prefs->desktop = g_key_file_get_integer (conf, "prefs", "desktop", &error);
377 
378     if(error != NULL)
379     {
380         g_warning("Parsing config file: %s. All preferences are set to their default values.", error->message);
381         g_key_file_free (conf);
382         return FALSE;
383     }
384 
385     g_key_file_free (conf);
386 
387     return TRUE;
388 }
389 
390 /*************************************************************/
391 /***** Stuff that deals with the type ************************/
392 /*************************************************************/
393 
394 static void
vnr_prefs_class_init(VnrPrefsClass * klass)395 vnr_prefs_class_init (VnrPrefsClass * klass) {}
396 
397 GObject *
vnr_prefs_new(GtkWidget * vnr_win)398 vnr_prefs_new (GtkWidget *vnr_win)
399 {
400     VnrPrefs *prefs;
401 
402     prefs = g_object_new (VNR_TYPE_PREFS, NULL);
403 
404     prefs->vnr_win = vnr_win;
405 
406     return (GObject *) prefs;
407 }
408 
409 static void
vnr_prefs_init(VnrPrefs * prefs)410 vnr_prefs_init (VnrPrefs * prefs)
411 {
412     if ( !vnr_prefs_load (prefs) )
413     {
414         vnr_prefs_set_default(prefs);
415         vnr_prefs_save (prefs);
416     }
417 
418     prefs->dialog = NULL;
419 }
420 
421 /*************************************************************/
422 /***** Actions ***********************************************/
423 /*************************************************************/
424 
425 void
vnr_prefs_show_dialog(VnrPrefs * prefs)426 vnr_prefs_show_dialog(VnrPrefs *prefs)
427 {
428     if (prefs->dialog == NULL)
429     {
430         prefs->dialog = build_dialog (prefs);
431         if (prefs->dialog == NULL)
432             return;
433     }
434     gtk_window_present(GTK_WINDOW(prefs->dialog));
435 }
436 
437 gboolean
vnr_prefs_save(VnrPrefs * prefs)438 vnr_prefs_save (VnrPrefs *prefs)
439 {
440     GKeyFile *conf;
441     FILE *rcfile;
442     const gchar *dir;
443     const gchar *path;
444 
445     dir = g_build_filename (g_get_user_config_dir(), PACKAGE, NULL);
446     path = g_build_filename (dir, "viewnior.conf", NULL);
447 
448     conf = g_key_file_new();
449     g_key_file_set_integer (conf, "prefs", "zoom-mode", prefs->zoom);
450     g_key_file_set_boolean (conf, "prefs", "fit-on-fullscreen", prefs->fit_on_fullscreen);
451     g_key_file_set_boolean (conf, "prefs", "show-hidden", prefs->show_hidden);
452     g_key_file_set_boolean (conf, "prefs", "smooth-images", prefs->smooth_images);
453     g_key_file_set_boolean (conf, "prefs", "confirm-delete", prefs->confirm_delete);
454     g_key_file_set_boolean (conf, "prefs", "reload-on-save", prefs->reload_on_save);
455     g_key_file_set_boolean (conf, "prefs", "show-menu-bar", prefs->show_menu_bar);
456     g_key_file_set_boolean (conf, "prefs", "show-toolbar", prefs->show_toolbar);
457     g_key_file_set_boolean (conf, "prefs", "show-scrollbar", prefs->show_scrollbar);
458     g_key_file_set_boolean (conf, "prefs", "start-maximized", prefs->start_maximized);
459     g_key_file_set_integer (conf, "prefs", "slideshow-timeout", prefs->slideshow_timeout);
460     g_key_file_set_boolean (conf, "prefs", "auto-resize", prefs->auto_resize);
461     g_key_file_set_integer (conf, "prefs", "behavior-wheel", prefs->behavior_wheel);
462     g_key_file_set_integer (conf, "prefs", "behavior-click", prefs->behavior_click);
463     g_key_file_set_integer (conf, "prefs", "behavior-modify", prefs->behavior_modify);
464     g_key_file_set_integer (conf, "prefs", "jpeg-quality", prefs->jpeg_quality);
465     g_key_file_set_integer (conf, "prefs", "png-compression", prefs->png_compression);
466     g_key_file_set_integer (conf, "prefs", "desktop", prefs->desktop);
467 
468     if(g_mkdir_with_parents (dir, 0700) != 0)
469         g_warning("Error creating config file's parent directory (%s)\n", dir);
470 
471     rcfile = fopen(path , "w");
472 
473     if(rcfile != NULL)
474     {
475         fputs(g_key_file_to_data (conf, NULL, NULL), rcfile);
476         fclose(rcfile);
477     }
478     else
479         g_warning("Saving config file: Unable to open the configuration file for writing!\n");
480 
481     g_key_file_free (conf);
482     g_free((char*)dir);
483     g_free((char*)path);
484 
485     return TRUE;
486 }
487 
488 void
vnr_prefs_set_slideshow_timeout(VnrPrefs * prefs,int value)489 vnr_prefs_set_slideshow_timeout (VnrPrefs *prefs, int value)
490 {
491     if (prefs->dialog != NULL)
492         gtk_spin_button_set_value(prefs->slideshow_timeout_widget, (gdouble)value);
493 }
494 
495 void
vnr_prefs_set_show_toolbar(VnrPrefs * prefs,gboolean show_toolbar)496 vnr_prefs_set_show_toolbar (VnrPrefs *prefs, gboolean show_toolbar)
497 {
498     if(prefs->show_toolbar != show_toolbar)
499     {
500         prefs->show_toolbar = show_toolbar;
501         vnr_prefs_save(prefs);
502     }
503 }
504 
505 void
vnr_prefs_set_show_scrollbar(VnrPrefs * prefs,gboolean show_scrollbar)506 vnr_prefs_set_show_scrollbar (VnrPrefs *prefs, gboolean show_scrollbar)
507 {
508     if(prefs->show_scrollbar != show_scrollbar)
509     {
510         prefs->show_scrollbar = show_scrollbar;
511         vnr_prefs_save(prefs);
512     }
513 }
514 
515 void
vnr_prefs_set_show_menu_bar(VnrPrefs * prefs,gboolean show_menu_bar)516 vnr_prefs_set_show_menu_bar (VnrPrefs *prefs, gboolean show_menu_bar)
517 {
518     if(prefs->show_menu_bar != show_menu_bar)
519     {
520         prefs->show_menu_bar = show_menu_bar;
521         vnr_prefs_save(prefs);
522     }
523 }
524