7 * This software is released under the GNU General Public License (GNU GPL).
8 * Please read the included file COPYING for more information.
9 * This software comes with no warranty of any kind, use at your own risk!
12 #include <glib/gstdio.h>
20 #include "secure_save.h"
21 #include "slideshow.h"
22 #include "ui_fileops.h"
26 *-----------------------------------------------------------------------------
27 * line write/parse routines (private)
28 *-----------------------------------------------------------------------------
32 returns text without quotes or NULL for empty or broken string
33 any text up to first '"' is skipped
34 tail is set to point at the char after the second '"'
39 gchar *quoted_value(const gchar *text, const gchar **tail)
43 gint l = strlen(text);
46 if (tail) *tail = text;
48 if (l == 0) return retval;
50 while (c < l && text[c] !='"') c++;
59 if (text[e-1] != '\\' && text[e] == '"') break;
66 gchar *substring = g_strndup(ptr, e - c);
70 retval = g_strcompress(substring);
75 if (tail) *tail = text + e + 1;
78 /* for compatibility with older formats (<0.3.7)
79 * read a line without quotes too */
82 while (c < l && text[c] !=' ' && text[c] !=8 && text[c] != '\n') c++;
85 retval = g_strndup(text, c);
87 if (tail) *tail = text + c;
93 gchar *escquote_value(const gchar *text)
97 if (!text) return g_strdup("\"\"");
99 e = g_strescape(text, "");
102 gchar *retval = g_strdup_printf("\"%s\"", e);
106 return g_strdup("\"\"");
109 static void write_char_option(SecureSaveInfo *ssi, gchar *label, gchar *text)
111 gchar *escval = escquote_value(text);
113 secure_fprintf(ssi, "%s: %s\n", label, escval);
117 static gchar *read_char_option(FILE *f, gchar *option, gchar *label, gchar *value, gchar *text)
119 if (strcasecmp(option, label) == 0)
122 text = quoted_value(value, NULL);
127 /* Since gdk_color_to_string() is only available since gtk 2.12
128 * here is an equivalent stub function. */
129 static gchar *color_to_string(GdkColor *color)
131 return g_strdup_printf("#%04X%04X%04X", color->red, color->green, color->blue);
134 static void write_color_option(SecureSaveInfo *ssi, gchar *label, GdkColor *color)
138 gchar *colorstring = color_to_string(color);
140 write_char_option(ssi, label, colorstring);
144 secure_fprintf(ssi, "%s: \n", label);
147 static GdkColor *read_color_option(FILE *f, gchar *option, gchar *label, gchar *value, GdkColor *color)
149 if (strcasecmp(option, label) == 0)
151 gchar *colorstr = quoted_value(value, NULL);
152 if (colorstr) gdk_color_parse(colorstr, color);
159 static void write_int_option(SecureSaveInfo *ssi, gchar *label, gint n)
161 secure_fprintf(ssi, "%s: %d\n", label, n);
164 static gint read_int_option(FILE *f, gchar *option, gchar *label, gchar *value, gint n)
166 if (strcasecmp(option, label) == 0)
168 n = strtol(value, NULL, 10);
173 static void write_int_unit_option(SecureSaveInfo *ssi, gchar *label, gint n, gint subunits)
188 secure_fprintf(ssi, "%s: %d.%d\n", label, l, r);
191 static gint read_int_unit_option(FILE *f, gchar *option, gchar *label, gchar *value, gint n, gint subunits)
193 if (strcasecmp(option, label) == 0)
199 while (*ptr != '\0' && *ptr != '.') ptr++;
203 l = strtol(value, NULL, 10);
206 r = strtol(ptr, NULL, 10);
210 l = strtol(value, NULL, 10);
214 n = l * subunits + r;
219 static void write_bool_option(SecureSaveInfo *ssi, gchar *label, gint n)
221 secure_fprintf(ssi, "%s: ", label);
222 if (n) secure_fprintf(ssi, "true\n"); else secure_fprintf(ssi, "false\n");
225 static gint read_bool_option(FILE *f, gchar *option, gchar *label, gchar *value, gint n)
227 if (strcasecmp(option, label) == 0)
229 if (strcasecmp(value, "true") == 0)
238 *-----------------------------------------------------------------------------
239 * save configuration (public)
240 *-----------------------------------------------------------------------------
243 void save_options(void)
250 rc_path = g_strconcat(homedir(), "/", GQ_RC_DIR, "/", RC_FILE_NAME, NULL);
252 rc_pathl = path_from_utf8(rc_path);
253 ssi = secure_open(rc_pathl);
259 buf = g_strdup_printf(_("error saving config file: %s\n"), rc_path);
267 secure_fprintf(ssi, "######################################################################\n");
268 secure_fprintf(ssi, "# %30s config file version %7s #\n", GQ_APPNAME, VERSION);
269 secure_fprintf(ssi, "######################################################################\n");
270 secure_fputc(ssi, '\n');
272 secure_fprintf(ssi, "# Note: This file is autogenerated. Options can be changed here,\n");
273 secure_fprintf(ssi, "# but user comments and formatting will be lost.\n");
274 secure_fputc(ssi, '\n');
276 secure_fprintf(ssi, "##### General Options #####\n\n");
278 write_bool_option(ssi, "show_icon_names", options->show_icon_names);
279 secure_fputc(ssi, '\n');
281 write_bool_option(ssi, "tree_descend_subdirs", options->tree_descend_subdirs);
282 write_bool_option(ssi, "lazy_image_sync", options->lazy_image_sync);
283 write_bool_option(ssi, "update_on_time_change", options->update_on_time_change);
284 secure_fputc(ssi, '\n');
286 write_bool_option(ssi, "startup_path_enable", options->startup_path_enable);
287 write_char_option(ssi, "startup_path", options->startup_path);
289 write_bool_option(ssi, "progressive_key_scrolling", options->progressive_key_scrolling);
290 write_bool_option(ssi, "enable_metadata_dirs", options->enable_metadata_dirs);
292 write_int_option(ssi, "duplicates_similarity_threshold", options->duplicates_similarity_threshold);
293 secure_fputc(ssi, '\n');
295 write_bool_option(ssi, "mousewheel_scrolls", options->mousewheel_scrolls);
296 write_int_option(ssi, "open_recent_list_maxsize", options->open_recent_list_maxsize);
297 write_bool_option(ssi, "place_dialogs_under_mouse", options->place_dialogs_under_mouse);
300 secure_fprintf(ssi, "\n##### File operations Options #####\n\n");
302 write_bool_option(ssi, "file_ops.enable_in_place_rename", options->file_ops.enable_in_place_rename);
303 write_bool_option(ssi, "file_ops.confirm_delete", options->file_ops.confirm_delete);
304 write_bool_option(ssi, "file_ops.enable_delete_key", options->file_ops.enable_delete_key);
305 write_bool_option(ssi, "file_ops.safe_delete_enable", options->file_ops.safe_delete_enable);
306 write_char_option(ssi, "file_ops.safe_delete_path", options->file_ops.safe_delete_path);
307 write_int_option(ssi, "file_ops.safe_delete_folder_maxsize", options->file_ops.safe_delete_folder_maxsize);
310 secure_fprintf(ssi, "\n##### Layout Options #####\n\n");
312 write_int_option(ssi, "layout.style", options->layout.style);
313 write_char_option(ssi, "layout.order", options->layout.order);
314 write_bool_option(ssi, "layout.view_as_icons", options->layout.view_as_icons);
315 write_bool_option(ssi, "layout.view_as_tree", options->layout.view_as_tree);
316 write_bool_option(ssi, "layout.show_thumbnails", options->layout.show_thumbnails);
317 secure_fputc(ssi, '\n');
319 write_bool_option(ssi, "layout.save_window_positions", options->layout.save_window_positions);
320 secure_fputc(ssi, '\n');
322 write_int_option(ssi, "layout.main_window.x", options->layout.main_window.x);
323 write_int_option(ssi, "layout.main_window.y", options->layout.main_window.y);
324 write_int_option(ssi, "layout.main_window.w", options->layout.main_window.w);
325 write_int_option(ssi, "layout.main_window.h", options->layout.main_window.h);
326 write_bool_option(ssi, "layout.main_window.maximized", options->layout.main_window.maximized);
327 write_int_option(ssi, "layout.main_window.hdivider_pos", options->layout.main_window.hdivider_pos);
328 write_int_option(ssi, "layout.main_window.vdivider_pos", options->layout.main_window.vdivider_pos);
329 secure_fputc(ssi, '\n');
331 write_int_option(ssi, "layout.float_window.x", options->layout.float_window.x);
332 write_int_option(ssi, "layout.float_window.y", options->layout.float_window.y);
333 write_int_option(ssi, "layout.float_window.w", options->layout.float_window.w);
334 write_int_option(ssi, "layout.float_window.h", options->layout.float_window.h);
335 write_int_option(ssi, "layout.float_window.vdivider_pos", options->layout.float_window.vdivider_pos);
336 secure_fputc(ssi, '\n');
338 write_bool_option(ssi, "layout.tools_float", options->layout.tools_float);
339 write_bool_option(ssi, "layout.tools_hidden", options->layout.tools_hidden);
340 write_bool_option(ssi, "layout.tools_restore_state", options->layout.tools_restore_state);
341 secure_fputc(ssi, '\n');
343 write_bool_option(ssi, "layout.toolbar_hidden", options->layout.toolbar_hidden);
346 secure_fprintf(ssi, "\n##### Image Options #####\n\n");
348 secure_fprintf(ssi, "image.zoom_mode: ");
349 if (options->image.zoom_mode == ZOOM_RESET_ORIGINAL) secure_fprintf(ssi, "original\n");
350 if (options->image.zoom_mode == ZOOM_RESET_FIT_WINDOW) secure_fprintf(ssi, "fit\n");
351 if (options->image.zoom_mode == ZOOM_RESET_NONE) secure_fprintf(ssi, "dont_change\n");
352 write_bool_option(ssi, "image.zoom_2pass", options->image.zoom_2pass);
353 write_bool_option(ssi, "image.zoom_to_fit_allow_expand", options->image.zoom_to_fit_allow_expand);
354 write_int_option(ssi, "image.zoom_quality", options->image.zoom_quality);
355 write_int_option(ssi, "image.zoom_increment", options->image.zoom_increment);
356 write_bool_option(ssi, "image.fit_window_to_image", options->image.fit_window_to_image);
357 write_bool_option(ssi, "image.limit_window_size", options->image.limit_window_size);
358 write_int_option(ssi, "image.max_window_size", options->image.max_window_size);
359 write_bool_option(ssi, "image.limit_autofit_size", options->image.limit_autofit_size);
360 write_int_option(ssi, "image.max_autofit_size", options->image.max_autofit_size);
361 write_int_option(ssi, "image.scroll_reset_method", options->image.scroll_reset_method);
362 write_int_option(ssi, "image.tile_cache_max", options->image.tile_cache_max);
363 write_int_option(ssi, "image.dither_quality", options->image.dither_quality);
364 write_bool_option(ssi, "image.enable_read_ahead", options->image.enable_read_ahead);
365 write_bool_option(ssi, "image.exif_rotate_enable", options->image.exif_rotate_enable);
366 write_bool_option(ssi, "image.use_custom_border_color", options->image.use_custom_border_color);
367 write_color_option(ssi, "image.border_color", &options->image.border_color);
370 secure_fprintf(ssi, "\n##### Thumbnails Options #####\n\n");
372 write_int_option(ssi, "thumbnails.max_width", options->thumbnails.max_width);
373 write_int_option(ssi, "thumbnails.max_height", options->thumbnails.max_height);
374 write_bool_option(ssi, "thumbnails.enable_caching", options->thumbnails.enable_caching);
375 write_bool_option(ssi, "thumbnails.cache_into_dirs", options->thumbnails.cache_into_dirs);
376 write_bool_option(ssi, "thumbnails.fast", options->thumbnails.fast);
377 write_bool_option(ssi, "thumbnails.use_xvpics", options->thumbnails.use_xvpics);
378 write_bool_option(ssi, "thumbnails.spec_standard", options->thumbnails.spec_standard);
379 write_int_option(ssi, "thumbnails.quality", options->thumbnails.quality);
382 secure_fprintf(ssi, "\n##### File sorting Options #####\n\n");
384 write_int_option(ssi, "file_sort.method", (gint)options->file_sort.method);
385 write_bool_option(ssi, "file_sort.ascending", options->file_sort.ascending);
386 write_bool_option(ssi, "file_sort.case_sensitive", options->file_sort.case_sensitive);
389 secure_fprintf(ssi, "\n##### Fullscreen Options #####\n\n");
391 write_int_option(ssi, "fullscreen.screen", options->fullscreen.screen);
392 write_bool_option(ssi, "fullscreen.clean_flip", options->fullscreen.clean_flip);
393 write_bool_option(ssi, "fullscreen.disable_saver", options->fullscreen.disable_saver);
394 write_bool_option(ssi, "fullscreen.above", options->fullscreen.above);
395 write_bool_option(ssi, "fullscreen.show_info", options->fullscreen.show_info);
396 write_char_option(ssi, "fullscreen.info", options->fullscreen.info);
398 secure_fprintf(ssi, "\n##### Slideshow Options #####\n\n");
400 write_int_unit_option(ssi, "slideshow.delay", options->slideshow.delay, SLIDESHOW_SUBSECOND_PRECISION);
401 write_bool_option(ssi, "slideshow.random", options->slideshow.random);
402 write_bool_option(ssi, "slideshow.repeat", options->slideshow.repeat);
405 secure_fprintf(ssi, "\n##### Collection Options #####\n\n");
407 write_bool_option(ssi, "collections.rectangular_selection", options->collections.rectangular_selection);
410 secure_fprintf(ssi, "\n##### Filtering Options #####\n\n");
412 write_bool_option(ssi, "file_filter.show_dot_files", options->file_filter.show_dot_files);
413 write_bool_option(ssi, "file_filter.disable", options->file_filter.disable);
414 secure_fputc(ssi, '\n');
416 filter_write_list(ssi);
419 secure_fprintf(ssi, "\n##### Sidecars Options #####\n\n");
421 sidecar_ext_write(ssi);
424 secure_fprintf(ssi, "\n##### Color Profiles #####\n\n");
427 secure_fprintf(ssi, "# NOTICE: %s was not built with support for color profiles,\n"
428 "# color profile options will have no effect.\n\n", GQ_APPNAME);
431 write_bool_option(ssi, "color_profile.enabled", options->color_profile.enabled);
432 write_bool_option(ssi, "color_profile.use_image", options->color_profile.use_image);
433 write_int_option(ssi, "color_profile.input_type", options->color_profile.input_type);
434 secure_fputc(ssi, '\n');
436 for (i = 0; i < COLOR_PROFILE_INPUTS; i++)
440 buf = g_strdup_printf("color_profile.input_file_%d", i + 1);
441 write_char_option(ssi, buf, options->color_profile.input_file[i]);
444 buf = g_strdup_printf("color_profile.input_name_%d", i + 1);
445 write_char_option(ssi, buf, options->color_profile.input_name[i]);
448 secure_fputc(ssi, '\n');
449 write_int_option(ssi, "color_profile.screen_type", options->color_profile.screen_type);
450 write_char_option(ssi, "color_profile.screen_file", options->color_profile.screen_file);
452 secure_fprintf(ssi, "\n##### External Programs #####\n");
453 secure_fprintf(ssi, "# Maximum of %d programs (external_1 through external_%d)\n", GQ_EDITOR_GENERIC_SLOTS, GQ_EDITOR_GENERIC_SLOTS);
454 secure_fprintf(ssi, "# external_%d through external_%d are used for file ops\n", GQ_EDITOR_GENERIC_SLOTS + 1, GQ_EDITOR_SLOTS);
455 secure_fprintf(ssi, "# format: external_n: \"menu name\" \"command line\"\n\n");
457 for (i = 0; i < GQ_EDITOR_SLOTS; i++)
459 if (i == GQ_EDITOR_GENERIC_SLOTS) secure_fputc(ssi, '\n');
460 gchar *qname = escquote_value(options->editor_name[i]);
461 gchar *qcommand = escquote_value(options->editor_command[i]);
462 secure_fprintf(ssi, "external_%d: %s %s\n", i+1, qname, qcommand);
468 secure_fprintf(ssi, "\n##### Exif #####\n# 0: never\n# 1: if set\n# 2: always\n\n");
469 for (i = 0; ExifUIList[i].key; i++)
471 secure_fprintf(ssi, "exif_");
472 write_int_option(ssi, (gchar *)ExifUIList[i].key, ExifUIList[i].current);
475 secure_fputc(ssi, '\n');
476 secure_fprintf(ssi, "######################################################################\n");
477 secure_fprintf(ssi, "# end of config file #\n");
478 secure_fprintf(ssi, "######################################################################\n");
481 if (secure_close(ssi))
485 buf = g_strdup_printf(_("error saving config file: %s\nerror: %s\n"), rc_path,
486 secsave_strerror(secsave_errno));
498 *-----------------------------------------------------------------------------
499 * load configuration (public)
500 *-----------------------------------------------------------------------------
503 void load_options(void)
512 gchar value_all[1024];
515 for (i = 0; ExifUIList[i].key; i++)
516 ExifUIList[i].current = ExifUIList[i].default_value;
518 rc_path = g_strconcat(homedir(), "/", GQ_RC_DIR, "/", RC_FILE_NAME, NULL);
520 rc_pathl = path_from_utf8(rc_path);
521 f = fopen(rc_pathl,"r");
529 while (fgets(s_buf,1024,f))
531 if (s_buf[0]=='#') continue;
532 if (s_buf[0]=='\n') continue;
535 while (s_buf[c] != ':' && c < l) c++;
536 if (c >= l) continue;
539 while ((s_buf[c] == ' ' || s_buf[c] == 8) && c < l) c++;
540 s_buf_ptr = s_buf + c;
541 strncpy(value_all, s_buf_ptr, sizeof(value_all));
542 while (s_buf[c] != 8 && s_buf[c] != ' ' && s_buf[c] != '\n' && c < l) c++;
544 strncpy(option, s_buf, sizeof(option));
545 strncpy(value, s_buf_ptr, sizeof(value));
548 /* general options */
549 options->show_icon_names = read_bool_option(f, option,
550 "show_icon_names", value, options->show_icon_names);
552 options->tree_descend_subdirs = read_bool_option(f, option,
553 "tree_descend_subdirs", value, options->tree_descend_subdirs);
554 options->lazy_image_sync = read_bool_option(f, option,
555 "lazy_image_sync", value, options->lazy_image_sync);
556 options->update_on_time_change = read_bool_option(f, option,
557 "update_on_time_change", value, options->update_on_time_change);
559 options->startup_path_enable = read_bool_option(f, option,
560 "startup_path_enable", value, options->startup_path_enable);
561 options->startup_path = read_char_option(f, option,
562 "startup_path", value_all, options->startup_path);
564 options->duplicates_similarity_threshold = read_int_option(f, option,
565 "duplicates_similarity_threshold", value, options->duplicates_similarity_threshold);
567 options->progressive_key_scrolling = read_bool_option(f, option,
568 "progressive_key_scrolling", value, options->progressive_key_scrolling);
570 options->enable_metadata_dirs = read_bool_option(f, option,
571 "enable_metadata_dirs", value, options->enable_metadata_dirs);
573 options->mousewheel_scrolls = read_bool_option(f, option,
574 "mousewheel_scrolls", value, options->mousewheel_scrolls);
576 options->open_recent_list_maxsize = read_int_option(f, option,
577 "open_recent_list_maxsize", value, options->open_recent_list_maxsize);
579 options->place_dialogs_under_mouse = read_bool_option(f, option,
580 "place_dialogs_under_mouse", value, options->place_dialogs_under_mouse);
585 options->layout.style = read_int_option(f, option,
586 "layout.style", value, options->layout.style);
587 options->layout.order = read_char_option(f, option,
588 "layout.order", value, options->layout.order);
589 options->layout.view_as_icons = read_bool_option(f, option,
590 "layout.view_as_icons", value, options->layout.view_as_icons);
591 options->layout.view_as_tree = read_bool_option(f, option,
592 "layout.view_as_tree", value, options->layout.view_as_tree);
593 options->layout.show_thumbnails = read_bool_option(f, option,
594 "layout.show_thumbnails", value, options->layout.show_thumbnails);
596 /* window positions */
598 options->layout.save_window_positions = read_bool_option(f, option,
599 "layout.save_window_positions", value, options->layout.save_window_positions);
601 options->layout.main_window.x = read_int_option(f, option,
602 "layout.main_window.x", value, options->layout.main_window.x);
603 options->layout.main_window.y = read_int_option(f, option,
604 "layout.main_window.y", value, options->layout.main_window.y);
605 options->layout.main_window.w = read_int_option(f, option,
606 "layout.main_window.w", value, options->layout.main_window.w);
607 options->layout.main_window.h = read_int_option(f, option,
608 "layout.main_window.h", value, options->layout.main_window.h);
609 options->layout.main_window.maximized = read_bool_option(f, option,
610 "layout.main_window.maximized", value, options->layout.main_window.maximized);
611 options->layout.float_window.x = read_int_option(f, option,
612 "layout.float_window.x", value, options->layout.float_window.x);
613 options->layout.float_window.y = read_int_option(f, option,
614 "layout.float_window.y", value, options->layout.float_window.y);
615 options->layout.float_window.w = read_int_option(f, option,
616 "layout.float_window.w", value, options->layout.float_window.w);
617 options->layout.float_window.h = read_int_option(f, option,
618 "layout.float_window.h", value, options->layout.float_window.h);
619 options->layout.float_window.vdivider_pos = read_int_option(f, option,
620 "layout.float_window.vdivider_pos", value, options->layout.float_window.vdivider_pos);
621 options->layout.main_window.hdivider_pos = read_int_option(f, option,
622 "layout.main_window.hdivider_pos", value,options->layout.main_window.hdivider_pos);
623 options->layout.main_window.vdivider_pos = read_int_option(f, option,
624 "layout.main_window.vdivider_pos", value, options->layout.main_window.vdivider_pos);
625 options->layout.tools_float = read_bool_option(f, option,
626 "layout.tools_float", value, options->layout.tools_float);
627 options->layout.tools_hidden = read_bool_option(f, option,
628 "layout.tools_hidden", value, options->layout.tools_hidden);
629 options->layout.tools_restore_state = read_bool_option(f, option,
630 "layout.tools_restore_state", value, options->layout.tools_restore_state);
631 options->layout.toolbar_hidden = read_bool_option(f, option,
632 "layout.toolbar_hidden", value, options->layout.toolbar_hidden);
636 if (strcasecmp(option, "image.zoom_mode") == 0)
638 if (strcasecmp(value, "original") == 0) options->image.zoom_mode = ZOOM_RESET_ORIGINAL;
639 if (strcasecmp(value, "fit") == 0) options->image.zoom_mode = ZOOM_RESET_FIT_WINDOW;
640 if (strcasecmp(value, "dont_change") == 0) options->image.zoom_mode = ZOOM_RESET_NONE;
642 options->image.zoom_2pass = read_bool_option(f, option,
643 "image.zoom_2pass", value, options->image.zoom_2pass);
644 options->image.zoom_to_fit_allow_expand = read_bool_option(f, option,
645 "image.zoom_to_fit_allow_expand", value, options->image.zoom_to_fit_allow_expand);
646 options->image.fit_window_to_image = read_bool_option(f, option,
647 "image.fit_window_to_image", value, options->image.fit_window_to_image);
648 options->image.limit_window_size = read_bool_option(f, option,
649 "image.limit_window_size", value, options->image.limit_window_size);
650 options->image.max_window_size = read_int_option(f, option,
651 "image.max_window_size", value, options->image.max_window_size);
652 options->image.limit_autofit_size = read_bool_option(f, option,
653 "image.limit_autofit_size", value, options->image.limit_autofit_size);
654 options->image.max_autofit_size = read_int_option(f, option,
655 "image.max_autofit_size", value, options->image.max_autofit_size);
656 options->image.scroll_reset_method = read_int_option(f, option,
657 "image.scroll_reset_method", value, options->image.scroll_reset_method);
658 options->image.tile_cache_max = read_int_option(f, option,
659 "image.tile_cache_max", value, options->image.tile_cache_max);
660 options->image.zoom_quality = CLAMP(read_int_option(f, option,
661 "image.zoom_quality", value, options->image.zoom_quality), GDK_INTERP_NEAREST, GDK_INTERP_HYPER);
662 options->image.dither_quality = CLAMP(read_int_option(f, option,
663 "image.dither_quality", value, options->image.dither_quality), GDK_RGB_DITHER_NONE, GDK_RGB_DITHER_MAX);
664 options->image.zoom_increment = read_int_option(f, option,
665 "image.zoom_increment", value, options->image.zoom_increment);
666 options->image.enable_read_ahead = read_bool_option(f, option,
667 "image.enable_read_ahead", value, options->image.enable_read_ahead);
668 options->image.exif_rotate_enable = read_bool_option(f, option,
669 "image.exif_rotate_enable", value, options->image.exif_rotate_enable);
670 options->image.use_custom_border_color = read_bool_option(f, option,
671 "image.use_custom_border_color", value, options->image.use_custom_border_color);
672 read_color_option(f, option,
673 "image.border_color", value, &options->image.border_color);
676 /* thumbnails options */
677 options->thumbnails.max_width = read_int_option(f, option,
678 "thumbnails.max_width", value, options->thumbnails.max_width);
679 if (options->thumbnails.max_width < 16) options->thumbnails.max_width = 16;
680 options->thumbnails.max_height = read_int_option(f, option,
681 "thumbnails.max_height", value, options->thumbnails.max_height);
682 if (options->thumbnails.max_height < 16) options->thumbnails.max_height = 16;
683 options->thumbnails.enable_caching = read_bool_option(f, option,
684 "thumbnails.enable_caching", value, options->thumbnails.enable_caching);
685 options->thumbnails.cache_into_dirs = read_bool_option(f, option,
686 "thumbnails.cache_into_dirs", value, options->thumbnails.cache_into_dirs);
687 options->thumbnails.fast = read_bool_option(f, option,
688 "thumbnails.fast", value, options->thumbnails.fast);
689 options->thumbnails.use_xvpics = read_bool_option(f, option,
690 "thumbnails.use_xvpics", value, options->thumbnails.use_xvpics);
691 options->thumbnails.spec_standard = read_bool_option(f, option,
692 "thumbnails.spec_standard", value, options->thumbnails.spec_standard);
693 options->thumbnails.quality = CLAMP(read_int_option(f, option,
694 "thumbnails.quality", value, options->thumbnails.quality), GDK_INTERP_NEAREST, GDK_INTERP_HYPER);
696 /* file sorting options */
697 options->file_sort.method = (SortType)read_int_option(f, option,
698 "file_sort.method", value, (gint)options->file_sort.method);
699 options->file_sort.ascending = read_bool_option(f, option,
700 "file_sort.ascending", value, options->file_sort.ascending);
701 options->file_sort.case_sensitive = read_bool_option(f, option,
702 "file_sort.case_sensitive", value, options->file_sort.case_sensitive);
704 /* file operations options */
705 options->file_ops.enable_in_place_rename = read_bool_option(f, option,
706 "file_ops.enable_in_place_rename", value, options->file_ops.enable_in_place_rename);
707 options->file_ops.confirm_delete = read_bool_option(f, option,
708 "file_ops.confirm_delete", value, options->file_ops.confirm_delete);
709 options->file_ops.enable_delete_key = read_bool_option(f, option,
710 "file_ops.enable_delete_key", value, options->file_ops.enable_delete_key);
711 options->file_ops.safe_delete_enable = read_bool_option(f, option,
712 "file_ops.safe_delete_enable", value, options->file_ops.safe_delete_enable);
713 options->file_ops.safe_delete_path = read_char_option(f, option,
714 "file_ops.safe_delete_path", value, options->file_ops.safe_delete_path);
715 options->file_ops.safe_delete_folder_maxsize = read_int_option(f, option,
716 "file_ops.safe_delete_folder_maxsize", value,options->file_ops.safe_delete_folder_maxsize);
718 /* fullscreen options */
719 options->fullscreen.screen = read_int_option(f, option,
720 "fullscreen.screen", value, options->fullscreen.screen);
721 options->fullscreen.clean_flip = read_bool_option(f, option,
722 "fullscreen.clean_flip", value, options->fullscreen.clean_flip);
723 options->fullscreen.disable_saver = read_bool_option(f, option,
724 "fullscreen.disable_saver", value, options->fullscreen.disable_saver);
725 options->fullscreen.above = read_bool_option(f, option,
726 "fullscreen.above", value, options->fullscreen.above);
727 options->fullscreen.show_info = read_bool_option(f, option,
728 "fullscreen.show_info", value, options->fullscreen.show_info);
729 options->fullscreen.info = read_char_option(f, option,
730 "fullscreen.info", value_all, options->fullscreen.info);
732 /* slideshow options */
734 options->slideshow.delay = read_int_unit_option(f, option,
735 "slideshow.delay", value, options->slideshow.delay, SLIDESHOW_SUBSECOND_PRECISION);
736 options->slideshow.random = read_bool_option(f, option,
737 "slideshow.random", value, options->slideshow.random);
738 options->slideshow.repeat = read_bool_option(f, option,
739 "slideshow.repeat", value, options->slideshow.repeat);
741 /* filtering options */
743 options->file_filter.show_dot_files = read_bool_option(f, option,
744 "file_filter.show_dot_files", value, options->file_filter.show_dot_files);
745 options->file_filter.disable = read_bool_option(f, option,
746 "file_filter.disable", value, options->file_filter.disable);
748 if (strcasecmp(option, "file_filter.ext") == 0)
750 filter_parse(value_all);
753 if (strcasecmp(option, "sidecar.ext") == 0)
755 sidecar_ext_parse(value_all, TRUE);
760 options->color_profile.enabled = read_bool_option(f, option,
761 "color_profile.enabled", value, options->color_profile.enabled);
762 options->color_profile.use_image = read_bool_option(f, option,
763 "color_profile.use_image", value, options->color_profile.use_image);
764 options->color_profile.input_type = read_int_option(f, option,
765 "color_profile.input_type", value, options->color_profile.input_type);
767 if (strncasecmp(option, "color_profile.input_file_", 25) == 0)
769 i = strtol(option + 25, NULL, 0) - 1;
770 if (i >= 0 && i < COLOR_PROFILE_INPUTS)
772 options->color_profile.input_file[i] = read_char_option(f, option,
773 option, value, options->color_profile.input_file[i]);
776 if (strncasecmp(option, "color_profile.input_name_", 25) == 0)
778 i = strtol(option + 25, NULL, 0) - 1;
779 if (i >= 0 && i < COLOR_PROFILE_INPUTS)
781 options->color_profile.input_name[i] = read_char_option(f, option,
782 option, value, options->color_profile.input_name[i]);
786 options->color_profile.screen_type = read_int_option(f, option,
787 "color_profile.screen_type", value, options->color_profile.screen_type);
788 options->color_profile.screen_file = read_char_option(f, option,
789 "color_profile.screen_file", value, options->color_profile.screen_file);
791 /* External Programs */
793 if (strncasecmp(option, "external_", 9) == 0)
795 i = strtol(option + 9, NULL, 0);
796 if (i > 0 && i <= GQ_EDITOR_SLOTS)
800 g_free(options->editor_name[i]);
801 g_free(options->editor_command[i]);
803 options->editor_name[i] = quoted_value(value_all, &ptr);
804 options->editor_command[i] = quoted_value(ptr, NULL);
808 /* collection options */
810 options->collections.rectangular_selection = read_bool_option(f, option,
811 "collections.rectangular_selection", value, options->collections.rectangular_selection);
813 if (0 == strncasecmp(option, "exif_", 5))
815 for (i = 0; ExifUIList[i].key; i++)
816 if (0 == strcasecmp(option+5, ExifUIList[i].key))
817 ExifUIList[i].current = strtol(value, NULL, 10);