4 * Copyright (C) 2008 The Geeqie Team
8 * This software is released under the GNU General Public License (GNU GPL).
9 * Please read the included file COPYING for more information.
10 * This software comes with no warranty of any kind, use at your own risk!
13 #include <glib/gstdio.h>
20 #include "filefilter.h"
21 #include "secure_save.h"
22 #include "slideshow.h"
23 #include "ui_fileops.h"
27 *-----------------------------------------------------------------------------
28 * line write/parse routines (private)
29 *-----------------------------------------------------------------------------
33 returns text without quotes or NULL for empty or broken string
34 any text up to first '"' is skipped
35 tail is set to point at the char after the second '"'
40 gchar *quoted_value(const gchar *text, const gchar **tail)
44 gint l = strlen(text);
47 if (tail) *tail = text;
49 if (l == 0) return retval;
51 while (c < l && text[c] !='"') c++;
60 if (text[e-1] != '\\' && text[e] == '"') break;
67 gchar *substring = g_strndup(ptr, e - c);
71 retval = g_strcompress(substring);
76 if (tail) *tail = text + e + 1;
79 /* for compatibility with older formats (<0.3.7)
80 * read a line without quotes too */
83 while (c < l && text[c] !=' ' && text[c] !=8 && text[c] != '\n') c++;
86 retval = g_strndup(text, c);
88 if (tail) *tail = text + c;
94 gchar *escquote_value(const gchar *text)
98 if (!text) return g_strdup("\"\"");
100 e = g_strescape(text, "");
103 gchar *retval = g_strdup_printf("\"%s\"", e);
107 return g_strdup("\"\"");
110 static void write_char_option(SecureSaveInfo *ssi, gchar *label, gchar *text)
112 gchar *escval = escquote_value(text);
114 secure_fprintf(ssi, "%s: %s\n", label, escval);
118 static void read_char_option(FILE *f, gchar *option, gchar *label, gchar *value, gchar **text)
120 if (text && g_ascii_strcasecmp(option, label) == 0)
123 *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 void read_color_option(FILE *f, gchar *option, gchar *label, gchar *value, GdkColor *color)
149 if (color && g_ascii_strcasecmp(option, label) == 0)
151 gchar *colorstr = quoted_value(value, NULL);
152 if (colorstr) gdk_color_parse(colorstr, color);
158 static void write_int_option(SecureSaveInfo *ssi, gchar *label, gint n)
160 secure_fprintf(ssi, "%s: %d\n", label, n);
163 static void read_int_option(FILE *f, gchar *option, gchar *label, gchar *value, gint *n)
165 if (n && g_ascii_strcasecmp(option, label) == 0)
167 *n = strtol(value, NULL, 10);
171 static void write_uint_option(SecureSaveInfo *ssi, gchar *label, guint n)
173 secure_fprintf(ssi, "%s: %u\n", label, n);
176 static void read_uint_option(FILE *f, gchar *option, gchar *label, gchar *value, guint *n)
178 if (n && g_ascii_strcasecmp(option, label) == 0)
180 *n = strtoul(value, NULL, 10);
186 static void read_int_option_clamp(FILE *f, gchar *option, gchar *label, gchar *value, gint *n, gint min, gint max)
188 if (n && g_ascii_strcasecmp(option, label) == 0)
190 *n = CLAMP(strtol(value, NULL, 10), min, max);
195 static void write_int_unit_option(SecureSaveInfo *ssi, gchar *label, gint n, gint subunits)
210 secure_fprintf(ssi, "%s: %d.%d\n", label, l, r);
213 static void read_int_unit_option(FILE *f, gchar *option, gchar *label, gchar *value, gint *n, gint subunits)
215 if (n && g_ascii_strcasecmp(option, label) == 0)
221 while (*ptr != '\0' && *ptr != '.') ptr++;
225 l = strtol(value, NULL, 10);
228 r = strtol(ptr, NULL, 10);
232 l = strtol(value, NULL, 10);
236 *n = l * subunits + r;
240 static void write_bool_option(SecureSaveInfo *ssi, gchar *label, gint n)
242 secure_fprintf(ssi, "%s: ", label);
243 if (n) secure_fprintf(ssi, "true\n"); else secure_fprintf(ssi, "false\n");
246 static void read_bool_option(FILE *f, gchar *option, gchar *label, gchar *value, gint *n)
248 if (n && g_ascii_strcasecmp(option, label) == 0)
250 if (g_ascii_strcasecmp(value, "true") == 0 || strcmp(value, "1") == 0)
258 *-----------------------------------------------------------------------------
259 * save configuration (public)
260 *-----------------------------------------------------------------------------
263 void save_options(void)
270 rc_path = g_strconcat(homedir(), "/", GQ_RC_DIR, "/", RC_FILE_NAME, NULL);
272 rc_pathl = path_from_utf8(rc_path);
273 ssi = secure_open(rc_pathl);
277 printf_term(_("error saving config file: %s\n"), rc_path);
282 #define WRITE_BOOL(_name_) write_bool_option(ssi, #_name_, options->_name_)
283 #define WRITE_INT(_name_) write_int_option(ssi, #_name_, options->_name_)
284 #define WRITE_UINT(_name_) write_uint_option(ssi, #_name_, options->_name_)
285 #define WRITE_INT_UNIT(_name_, _unit_) write_int_unit_option(ssi, #_name_, options->_name_, _unit_)
286 #define WRITE_CHAR(_name_) write_char_option(ssi, #_name_, options->_name_)
287 #define WRITE_COLOR(_name_) write_color_option(ssi, #_name_, &options->_name_)
289 #define WRITE_SEPARATOR() secure_fputc(ssi, '\n')
290 #define WRITE_SUBTITLE(_title_) secure_fprintf(ssi, "\n\n##### "_title_" #####\n\n")
292 secure_fprintf(ssi, "######################################################################\n");
293 secure_fprintf(ssi, "# %30s config file version %7s #\n", GQ_APPNAME, VERSION);
294 secure_fprintf(ssi, "######################################################################\n");
297 secure_fprintf(ssi, "# Note: This file is autogenerated. Options can be changed here,\n");
298 secure_fprintf(ssi, "# but user comments and formatting will be lost.\n");
301 WRITE_SUBTITLE("General Options");
303 WRITE_BOOL(show_icon_names);
304 WRITE_BOOL(show_copy_path);
307 WRITE_BOOL(tree_descend_subdirs);
308 WRITE_BOOL(lazy_image_sync);
309 WRITE_BOOL(update_on_time_change);
312 WRITE_BOOL(progressive_key_scrolling);
313 WRITE_BOOL(enable_metadata_dirs);
314 WRITE_BOOL(save_metadata_in_image_file);
316 WRITE_INT(duplicates_similarity_threshold);
319 WRITE_BOOL(mousewheel_scrolls);
320 WRITE_INT(open_recent_list_maxsize);
321 WRITE_INT(dnd_icon_size);
322 WRITE_BOOL(place_dialogs_under_mouse);
325 WRITE_SUBTITLE("Startup Options");
327 WRITE_BOOL(startup.restore_path);
328 WRITE_BOOL(startup.use_last_path);
329 WRITE_CHAR(startup.path);
332 WRITE_SUBTITLE("File operations Options");
334 WRITE_BOOL(file_ops.enable_in_place_rename);
335 WRITE_BOOL(file_ops.confirm_delete);
336 WRITE_BOOL(file_ops.enable_delete_key);
337 WRITE_BOOL(file_ops.safe_delete_enable);
338 WRITE_CHAR(file_ops.safe_delete_path);
339 WRITE_INT(file_ops.safe_delete_folder_maxsize);
342 WRITE_SUBTITLE("Layout Options");
344 WRITE_INT(layout.style);
345 WRITE_CHAR(layout.order);
346 WRITE_UINT(layout.dir_view_type);
347 WRITE_UINT(layout.file_view_type);
348 WRITE_BOOL(layout.show_marks);
349 WRITE_BOOL(layout.show_thumbnails);
352 WRITE_BOOL(layout.save_window_positions);
355 WRITE_INT(layout.main_window.x);
356 WRITE_INT(layout.main_window.y);
357 WRITE_INT(layout.main_window.w);
358 WRITE_INT(layout.main_window.h);
359 WRITE_BOOL(layout.main_window.maximized);
360 WRITE_INT(layout.main_window.hdivider_pos);
361 WRITE_INT(layout.main_window.vdivider_pos);
364 WRITE_INT(layout.float_window.x);
365 WRITE_INT(layout.float_window.y);
366 WRITE_INT(layout.float_window.w);
367 WRITE_INT(layout.float_window.h);
368 WRITE_INT(layout.float_window.vdivider_pos);
371 WRITE_BOOL(layout.tools_float);
372 WRITE_BOOL(layout.tools_hidden);
373 WRITE_BOOL(layout.tools_restore_state);
376 WRITE_BOOL(layout.toolbar_hidden);
378 WRITE_SUBTITLE("Panels Options");
380 WRITE_BOOL(panels.exif.enabled);
381 WRITE_INT(panels.exif.width);
382 WRITE_BOOL(panels.info.enabled);
383 WRITE_INT(panels.info.width);
384 WRITE_BOOL(panels.sort.enabled);
385 WRITE_INT(panels.sort.action_state);
386 WRITE_INT(panels.sort.mode_state);
387 WRITE_INT(panels.sort.selection_state);
389 WRITE_SUBTITLE("Image Options");
391 secure_fprintf(ssi, "# image.zoom_mode possible values are:\n"
395 secure_fprintf(ssi, "image.zoom_mode: ");
396 if (options->image.zoom_mode == ZOOM_RESET_ORIGINAL)
397 secure_fprintf(ssi, "original\n");
398 else if (options->image.zoom_mode == ZOOM_RESET_FIT_WINDOW)
399 secure_fprintf(ssi, "fit\n");
400 else if (options->image.zoom_mode == ZOOM_RESET_NONE)
401 secure_fprintf(ssi, "dont_change\n");
403 WRITE_BOOL(image.zoom_2pass);
404 WRITE_BOOL(image.zoom_to_fit_allow_expand);
405 WRITE_INT(image.zoom_quality);
406 WRITE_INT(image.zoom_increment);
407 WRITE_BOOL(image.fit_window_to_image);
408 WRITE_BOOL(image.limit_window_size);
409 WRITE_INT(image.max_window_size);
410 WRITE_BOOL(image.limit_autofit_size);
411 WRITE_INT(image.max_autofit_size);
412 WRITE_INT(image.scroll_reset_method);
413 WRITE_INT(image.tile_cache_max);
414 WRITE_INT(image.dither_quality);
415 WRITE_BOOL(image.enable_read_ahead);
416 WRITE_BOOL(image.exif_rotate_enable);
417 WRITE_BOOL(image.use_custom_border_color);
418 WRITE_COLOR(image.border_color);
419 WRITE_INT(image.read_buffer_size);
420 WRITE_INT(image.idle_read_loop_count);
422 WRITE_SUBTITLE("Thumbnails Options");
424 WRITE_INT(thumbnails.max_width);
425 WRITE_INT(thumbnails.max_height);
426 WRITE_BOOL(thumbnails.enable_caching);
427 WRITE_BOOL(thumbnails.cache_into_dirs);
428 WRITE_BOOL(thumbnails.fast);
429 WRITE_BOOL(thumbnails.use_xvpics);
430 WRITE_BOOL(thumbnails.spec_standard);
431 WRITE_INT(thumbnails.quality);
434 WRITE_SUBTITLE("File sorting Options");
436 WRITE_INT(file_sort.method);
437 WRITE_BOOL(file_sort.ascending);
438 WRITE_BOOL(file_sort.case_sensitive);
441 WRITE_SUBTITLE("Fullscreen Options");
443 WRITE_INT(fullscreen.screen);
444 WRITE_BOOL(fullscreen.clean_flip);
445 WRITE_BOOL(fullscreen.disable_saver);
446 WRITE_BOOL(fullscreen.above);
449 WRITE_SUBTITLE("Histogram Options");
450 WRITE_UINT(histogram.last_channel_mode);
451 WRITE_UINT(histogram.last_log_mode);
454 WRITE_SUBTITLE("Image Overlay Options");
455 WRITE_UINT(image_overlay.common.enabled);
456 WRITE_BOOL(image_overlay.common.show_at_startup);
457 WRITE_CHAR(image_overlay.common.template_string);
460 WRITE_SUBTITLE("Slideshow Options");
462 WRITE_INT_UNIT(slideshow.delay, SLIDESHOW_SUBSECOND_PRECISION);
463 WRITE_BOOL(slideshow.random);
464 WRITE_BOOL(slideshow.repeat);
467 WRITE_SUBTITLE("Collection Options");
469 WRITE_BOOL(collections.rectangular_selection);
472 WRITE_SUBTITLE("Filtering Options");
474 WRITE_BOOL(file_filter.show_hidden_files);
475 WRITE_BOOL(file_filter.show_dot_directory);
476 WRITE_BOOL(file_filter.disable);
479 filter_write_list(ssi);
482 WRITE_SUBTITLE("Sidecars Options");
484 sidecar_ext_write(ssi);
487 WRITE_SUBTITLE("Color Profiles");
490 secure_fprintf(ssi, "# NOTICE: %s was not built with support for color profiles,\n"
491 "# color profile options will have no effect.\n\n", GQ_APPNAME);
494 WRITE_BOOL(color_profile.enabled);
495 WRITE_BOOL(color_profile.use_image);
496 WRITE_INT(color_profile.input_type);
499 for (i = 0; i < COLOR_PROFILE_INPUTS; i++)
503 buf = g_strdup_printf("color_profile.input_file_%d", i + 1);
504 write_char_option(ssi, buf, options->color_profile.input_file[i]);
507 buf = g_strdup_printf("color_profile.input_name_%d", i + 1);
508 write_char_option(ssi, buf, options->color_profile.input_name[i]);
513 WRITE_INT(color_profile.screen_type);
514 WRITE_CHAR(color_profile.screen_file);
516 WRITE_SUBTITLE("External Programs");
517 secure_fprintf(ssi, "# Maximum of %d programs (external_1 through external_%d)\n", GQ_EDITOR_GENERIC_SLOTS, GQ_EDITOR_GENERIC_SLOTS);
518 secure_fprintf(ssi, "# external_%d through external_%d are used for file ops\n", GQ_EDITOR_GENERIC_SLOTS + 1, GQ_EDITOR_SLOTS);
519 secure_fprintf(ssi, "# format: external_n: \"menu name\" \"command line\"\n\n");
521 for (i = 0; i < GQ_EDITOR_SLOTS; i++)
523 if (i == GQ_EDITOR_GENERIC_SLOTS) secure_fputc(ssi, '\n');
524 gchar *qname = escquote_value(options->editor_name[i]);
525 gchar *qcommand = escquote_value(options->editor_command[i]);
526 secure_fprintf(ssi, "external_%d: %s %s\n", i+1, qname, qcommand);
532 WRITE_SUBTITLE("Exif Options");
533 secure_fprintf(ssi, "# Display: 0: never\n"
536 for (i = 0; ExifUIList[i].key; i++)
538 secure_fprintf(ssi, "exif.display.");
539 write_int_option(ssi, (gchar *)ExifUIList[i].key, ExifUIList[i].current);
545 secure_fprintf(ssi, "######################################################################\n");
546 secure_fprintf(ssi, "# end of config file #\n");
547 secure_fprintf(ssi, "######################################################################\n");
550 if (secure_close(ssi))
551 printf_term(_("error saving config file: %s\nerror: %s\n"), rc_path,
552 secsave_strerror(secsave_errno));
558 *-----------------------------------------------------------------------------
559 * load configuration (public)
560 *-----------------------------------------------------------------------------
563 void load_options(void)
571 gchar value_all[1024];
574 for (i = 0; ExifUIList[i].key; i++)
575 ExifUIList[i].current = ExifUIList[i].default_value;
577 rc_path = g_strconcat(homedir(), "/", GQ_RC_DIR, "/", RC_FILE_NAME, NULL);
579 rc_pathl = path_from_utf8(rc_path);
580 f = fopen(rc_pathl,"r");
588 while (fgets(s_buf, sizeof(s_buf), f))
590 gchar *option_start, *value_start;
593 while (g_ascii_isspace(*p)) p++;
594 if (!*p || *p == '\n' || *p == '#') continue;
596 while (*p && *p != ':') p++;
600 strncpy(option, option_start, sizeof(option));
601 while (g_ascii_isspace(*p)) p++;
603 strncpy(value_all, value_start, sizeof(value_all));
604 while (*p && !g_ascii_isspace(*p) && *p != '\n') p++;
606 strncpy(value, value_start, sizeof(value));
608 #define READ_BOOL(_name_) read_bool_option(f, option, #_name_, value, &options->_name_)
609 #define READ_INT(_name_) read_int_option(f, option, #_name_, value, &options->_name_)
610 #define READ_UINT(_name_) read_uint_option(f, option, #_name_, value, &options->_name_)
611 #define READ_INT_CLAMP(_name_, _min_, _max_) read_int_option_clamp(f, option, #_name_, value, &options->_name_, _min_, _max_)
612 #define READ_INT_UNIT(_name_, _unit_) read_int_unit_option(f, option, #_name_, value, &options->_name_, _unit_)
613 #define READ_CHAR(_name_) read_char_option(f, option, #_name_, value_all, &options->_name_)
614 #define READ_COLOR(_name_) read_color_option(f, option, #_name_, value, &options->_name_)
616 #define COMPAT_READ_BOOL(_oldname_, _name_) read_bool_option(f, option, #_oldname_, value, &options->_name_)
617 #define COMPAT_READ_INT(_oldname_, _name_) read_int_option(f, option, #_oldname_, value, &options->_name_)
618 #define COMPAT_READ_UINT(_oldname_, _name_) read_uint_option(f, option, #_oldname_, value, &options->_name_)
619 #define COMPAT_READ_INT_CLAMP(_oldname_, _name_, _min_, _max_) read_int_option_clamp(f, option, #_oldname_, value, &options->_name_, _min_, _max_)
620 #define COMPAT_READ_INT_UNIT(_oldname_, _name_, _unit_) read_int_unit_option(f, option, #_oldname_, value, &options->_name_, _unit_)
621 #define COMPAT_READ_CHAR(_oldname_, _name_) read_char_option(f, option, #_oldname_, value_all, &options->_name_)
622 #define COMPAT_READ_COLOR(_oldname_, _name_) read_color_option(f, option, #_oldname_, value, &options->_name_)
624 /* general options */
625 READ_BOOL(show_icon_names);
626 READ_BOOL(show_copy_path);
628 READ_BOOL(tree_descend_subdirs);
629 READ_BOOL(lazy_image_sync);
630 READ_BOOL(update_on_time_change);
632 READ_INT(duplicates_similarity_threshold);
634 READ_BOOL(progressive_key_scrolling);
636 READ_BOOL(enable_metadata_dirs);
637 READ_BOOL(save_metadata_in_image_file);
639 READ_BOOL(mousewheel_scrolls);
641 READ_INT(open_recent_list_maxsize);
642 READ_INT(dnd_icon_size);
643 READ_BOOL(place_dialogs_under_mouse);
645 /* startup options */
647 COMPAT_READ_BOOL(startup_path_enable, startup.restore_path); /* 2008/05/11 */
648 READ_BOOL(startup.restore_path);
650 READ_BOOL(startup.use_last_path);
652 COMPAT_READ_CHAR(startup_path, startup.path); /* 2008/05/11 */
653 READ_CHAR(startup.path);
657 READ_INT(layout.style);
658 READ_CHAR(layout.order);
660 COMPAT_READ_UINT(layout.view_as_icons, layout.file_view_type); /* 2008/05/03 */
662 READ_UINT(layout.dir_view_type);
663 READ_UINT(layout.file_view_type);
664 READ_BOOL(layout.show_marks);
665 READ_BOOL(layout.show_thumbnails);
667 /* window positions */
669 READ_BOOL(layout.save_window_positions);
671 READ_INT(layout.main_window.x);
672 READ_INT(layout.main_window.y);
673 READ_INT(layout.main_window.w);
674 READ_INT(layout.main_window.h);
675 READ_BOOL(layout.main_window.maximized);
676 READ_INT(layout.float_window.x);
677 READ_INT(layout.float_window.y);
678 READ_INT(layout.float_window.w);
679 READ_INT(layout.float_window.h);
680 READ_INT(layout.float_window.vdivider_pos);
681 READ_INT(layout.main_window.hdivider_pos);
682 READ_INT(layout.main_window.vdivider_pos);
683 READ_BOOL(layout.tools_float);
684 READ_BOOL(layout.tools_hidden);
685 READ_BOOL(layout.tools_restore_state);
686 READ_BOOL(layout.toolbar_hidden);
689 READ_BOOL(panels.exif.enabled);
690 READ_INT_CLAMP(panels.exif.width, PANEL_MIN_WIDTH, PANEL_MAX_WIDTH);
691 READ_BOOL(panels.info.enabled);
692 READ_INT_CLAMP(panels.info.width, PANEL_MIN_WIDTH, PANEL_MAX_WIDTH);
693 READ_BOOL(panels.sort.enabled);
694 READ_INT(panels.sort.action_state);
695 READ_INT(panels.sort.mode_state);
696 READ_INT(panels.sort.selection_state);
699 if (g_ascii_strcasecmp(option, "image.zoom_mode") == 0)
701 if (g_ascii_strcasecmp(value, "original") == 0)
702 options->image.zoom_mode = ZOOM_RESET_ORIGINAL;
703 else if (g_ascii_strcasecmp(value, "fit") == 0)
704 options->image.zoom_mode = ZOOM_RESET_FIT_WINDOW;
705 else if (g_ascii_strcasecmp(value, "dont_change") == 0)
706 options->image.zoom_mode = ZOOM_RESET_NONE;
708 READ_BOOL(image.zoom_2pass);
709 READ_BOOL(image.zoom_to_fit_allow_expand);
710 READ_BOOL(image.fit_window_to_image);
711 READ_BOOL(image.limit_window_size);
712 READ_INT(image.max_window_size);
713 READ_BOOL(image.limit_autofit_size);
714 READ_INT(image.max_autofit_size);
715 READ_INT(image.scroll_reset_method);
716 READ_INT(image.tile_cache_max);
717 READ_INT_CLAMP(image.zoom_quality, GDK_INTERP_NEAREST, GDK_INTERP_HYPER);
718 READ_INT_CLAMP(image.dither_quality, GDK_RGB_DITHER_NONE, GDK_RGB_DITHER_MAX);
719 READ_INT(image.zoom_increment);
720 READ_BOOL(image.enable_read_ahead);
721 READ_BOOL(image.exif_rotate_enable);
722 READ_BOOL(image.use_custom_border_color);
723 READ_COLOR(image.border_color);
724 READ_INT_CLAMP(image.read_buffer_size, IMAGE_LOADER_READ_BUFFER_SIZE_MIN, IMAGE_LOADER_READ_BUFFER_SIZE_MAX);
725 READ_INT_CLAMP(image.idle_read_loop_count, IMAGE_LOADER_IDLE_READ_LOOP_COUNT_MIN, IMAGE_LOADER_IDLE_READ_LOOP_COUNT_MAX);
728 /* thumbnails options */
729 READ_INT_CLAMP(thumbnails.max_width, 16, 512);
730 READ_INT_CLAMP(thumbnails.max_height, 16, 512);
732 READ_BOOL(thumbnails.enable_caching);
733 READ_BOOL(thumbnails.cache_into_dirs);
734 READ_BOOL(thumbnails.fast);
735 READ_BOOL(thumbnails.use_xvpics);
736 READ_BOOL(thumbnails.spec_standard);
737 READ_INT_CLAMP(thumbnails.quality, GDK_INTERP_NEAREST, GDK_INTERP_HYPER);
739 /* file sorting options */
740 READ_UINT(file_sort.method);
741 READ_BOOL(file_sort.ascending);
742 READ_BOOL(file_sort.case_sensitive);
744 /* file operations options */
745 READ_BOOL(file_ops.enable_in_place_rename);
746 READ_BOOL(file_ops.confirm_delete);
747 READ_BOOL(file_ops.enable_delete_key);
748 READ_BOOL(file_ops.safe_delete_enable);
749 READ_CHAR(file_ops.safe_delete_path);
750 READ_INT(file_ops.safe_delete_folder_maxsize);
752 /* fullscreen options */
753 READ_INT(fullscreen.screen);
754 READ_BOOL(fullscreen.clean_flip);
755 READ_BOOL(fullscreen.disable_saver);
756 READ_BOOL(fullscreen.above);
759 READ_UINT(histogram.last_channel_mode);
760 READ_UINT(histogram.last_log_mode);
763 COMPAT_READ_BOOL(fullscreen.show_info, image_overlay.common.show_at_startup);
764 COMPAT_READ_CHAR(fullscreen.info, image_overlay.common.template_string);
765 READ_UINT(image_overlay.common.enabled);
766 READ_BOOL(image_overlay.common.show_at_startup);
767 READ_CHAR(image_overlay.common.template_string);
769 /* slideshow options */
770 READ_INT_UNIT(slideshow.delay, SLIDESHOW_SUBSECOND_PRECISION);
771 READ_BOOL(slideshow.random);
772 READ_BOOL(slideshow.repeat);
774 /* collection options */
776 READ_BOOL(collections.rectangular_selection);
778 /* filtering options */
780 READ_BOOL(file_filter.show_hidden_files);
781 READ_BOOL(file_filter.show_dot_directory);
782 READ_BOOL(file_filter.disable);
784 if (g_ascii_strcasecmp(option, "file_filter.ext") == 0)
786 filter_parse(value_all);
789 if (g_ascii_strcasecmp(option, "sidecar.ext") == 0)
791 sidecar_ext_parse(value_all, TRUE);
796 READ_BOOL(color_profile.enabled);
797 READ_BOOL(color_profile.use_image);
798 READ_INT(color_profile.input_type);
800 if (g_ascii_strncasecmp(option, "color_profile.input_file_", 25) == 0)
802 i = strtol(option + 25, NULL, 0) - 1;
803 if (i >= 0 && i < COLOR_PROFILE_INPUTS)
805 read_char_option(f, option, option, value, &options->color_profile.input_file[i]);
808 if (g_ascii_strncasecmp(option, "color_profile.input_name_", 25) == 0)
810 i = strtol(option + 25, NULL, 0) - 1;
811 if (i >= 0 && i < COLOR_PROFILE_INPUTS)
813 read_char_option(f, option, option, value, &options->color_profile.input_name[i]);
817 READ_INT(color_profile.screen_type);
818 READ_CHAR(color_profile.screen_file);
820 /* External Programs */
822 if (g_ascii_strncasecmp(option, "external_", 9) == 0)
824 i = strtol(option + 9, NULL, 0);
825 if (i > 0 && i <= GQ_EDITOR_SLOTS)
829 g_free(options->editor_name[i]);
830 g_free(options->editor_command[i]);
832 options->editor_name[i] = quoted_value(value_all, &ptr);
833 options->editor_command[i] = quoted_value(ptr, NULL);
838 if (0 == g_ascii_strncasecmp(option, "exif.display.", 13))
840 for (i = 0; ExifUIList[i].key; i++)
841 if (0 == g_ascii_strcasecmp(option + 13, ExifUIList[i].key))
842 ExifUIList[i].current = strtol(value, NULL, 10);