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 gboolean read_char_option(FILE *f, gchar *option, gchar *label, gchar *value, gchar **text)
120 if (g_ascii_strcasecmp(option, label) != 0) return FALSE;
121 if (!text) return FALSE;
124 *text = quoted_value(value, NULL);
128 /* Since gdk_color_to_string() is only available since gtk 2.12
129 * here is an equivalent stub function. */
130 static gchar *color_to_string(GdkColor *color)
132 return g_strdup_printf("#%04X%04X%04X", color->red, color->green, color->blue);
135 static void write_color_option(SecureSaveInfo *ssi, gchar *label, GdkColor *color)
139 gchar *colorstring = color_to_string(color);
141 write_char_option(ssi, label, colorstring);
145 secure_fprintf(ssi, "%s: \n", label);
148 static gboolean read_color_option(FILE *f, gchar *option, gchar *label, gchar *value, GdkColor *color)
152 if (g_ascii_strcasecmp(option, label) != 0) return FALSE;
153 if (!color) return FALSE;
155 colorstr = quoted_value(value, NULL);
156 if (!colorstr) return FALSE;
157 gdk_color_parse(colorstr, color);
162 static void write_int_option(SecureSaveInfo *ssi, gchar *label, gint n)
164 secure_fprintf(ssi, "%s: %d\n", label, n);
167 static gboolean read_int_option(FILE *f, gchar *option, gchar *label, gchar *value, gint *n)
169 if (g_ascii_strcasecmp(option, label) != 0) return FALSE;
170 if (!n) return FALSE;
172 if (g_ascii_isdigit(value[0]) || (value[0] == '-' && g_ascii_isdigit(value[1])))
174 *n = strtol(value, NULL, 10);
178 if (g_ascii_strcasecmp(value, "true") == 0)
187 static void write_uint_option(SecureSaveInfo *ssi, gchar *label, guint n)
189 secure_fprintf(ssi, "%s: %u\n", label, n);
192 static gboolean read_uint_option(FILE *f, gchar *option, gchar *label, gchar *value, guint *n)
194 if (g_ascii_strcasecmp(option, label) != 0) return FALSE;
195 if (!n) return FALSE;
197 if (g_ascii_isdigit(value[0]))
199 *n = strtoul(value, NULL, 10);
203 if (g_ascii_strcasecmp(value, "true") == 0)
212 static gboolean read_int_option_clamp(FILE *f, gchar *option, gchar *label, gchar *value, gint *n, gint min, gint max)
216 ret = read_int_option(f, option, label, value, n);
217 if (ret) *n = CLAMP(*n, min, max);
222 static void write_int_unit_option(SecureSaveInfo *ssi, gchar *label, gint n, gint subunits)
237 secure_fprintf(ssi, "%s: %d.%d\n", label, l, r);
240 static gboolean read_int_unit_option(FILE *f, gchar *option, gchar *label, gchar *value, gint *n, gint subunits)
245 if (g_ascii_strcasecmp(option, label) != 0) return FALSE;
246 if (!n) return FALSE;
249 while (*ptr != '\0' && *ptr != '.') ptr++;
253 l = strtol(value, NULL, 10);
256 r = strtol(ptr, NULL, 10);
260 l = strtol(value, NULL, 10);
264 *n = l * subunits + r;
269 static void write_bool_option(SecureSaveInfo *ssi, gchar *label, gint n)
271 secure_fprintf(ssi, "%s: ", label);
272 if (n) secure_fprintf(ssi, "true\n"); else secure_fprintf(ssi, "false\n");
275 static gboolean read_bool_option(FILE *f, gchar *option, gchar *label, gchar *value, gint *n)
277 if (g_ascii_strcasecmp(option, label) != 0) return FALSE;
278 if (!n) return FALSE;
280 if (g_ascii_strcasecmp(value, "true") == 0 || atoi(value) != 0)
290 *-----------------------------------------------------------------------------
291 * save configuration (public)
292 *-----------------------------------------------------------------------------
295 void save_options(void)
302 rc_path = g_strconcat(homedir(), "/", GQ_RC_DIR, "/", RC_FILE_NAME, NULL);
304 rc_pathl = path_from_utf8(rc_path);
305 ssi = secure_open(rc_pathl);
309 printf_term(_("error saving config file: %s\n"), rc_path);
314 #define WRITE_BOOL(_name_) write_bool_option(ssi, #_name_, options->_name_)
315 #define WRITE_INT(_name_) write_int_option(ssi, #_name_, options->_name_)
316 #define WRITE_UINT(_name_) write_uint_option(ssi, #_name_, options->_name_)
317 #define WRITE_INT_UNIT(_name_, _unit_) write_int_unit_option(ssi, #_name_, options->_name_, _unit_)
318 #define WRITE_CHAR(_name_) write_char_option(ssi, #_name_, options->_name_)
319 #define WRITE_COLOR(_name_) write_color_option(ssi, #_name_, &options->_name_)
321 #define WRITE_SEPARATOR() secure_fputc(ssi, '\n')
322 #define WRITE_SUBTITLE(_title_) secure_fprintf(ssi, "\n\n##### "_title_" #####\n\n")
324 secure_fprintf(ssi, "######################################################################\n");
325 secure_fprintf(ssi, "# %30s config file version %7s #\n", GQ_APPNAME, VERSION);
326 secure_fprintf(ssi, "######################################################################\n");
329 secure_fprintf(ssi, "# Note: This file is autogenerated. Options can be changed here,\n");
330 secure_fprintf(ssi, "# but user comments and formatting will be lost.\n");
333 WRITE_SUBTITLE("General Options");
335 WRITE_BOOL(show_icon_names);
336 WRITE_BOOL(show_copy_path);
339 WRITE_BOOL(tree_descend_subdirs);
340 WRITE_BOOL(lazy_image_sync);
341 WRITE_BOOL(update_on_time_change);
344 WRITE_BOOL(progressive_key_scrolling);
345 WRITE_BOOL(enable_metadata_dirs);
346 WRITE_BOOL(save_metadata_in_image_file);
348 WRITE_INT(duplicates_similarity_threshold);
351 WRITE_BOOL(mousewheel_scrolls);
352 WRITE_INT(open_recent_list_maxsize);
353 WRITE_INT(dnd_icon_size);
354 WRITE_BOOL(place_dialogs_under_mouse);
357 WRITE_SUBTITLE("Startup Options");
359 WRITE_BOOL(startup.restore_path);
360 WRITE_BOOL(startup.use_last_path);
361 WRITE_CHAR(startup.path);
364 WRITE_SUBTITLE("File operations Options");
366 WRITE_BOOL(file_ops.enable_in_place_rename);
367 WRITE_BOOL(file_ops.confirm_delete);
368 WRITE_BOOL(file_ops.enable_delete_key);
369 WRITE_BOOL(file_ops.safe_delete_enable);
370 WRITE_CHAR(file_ops.safe_delete_path);
371 WRITE_INT(file_ops.safe_delete_folder_maxsize);
374 WRITE_SUBTITLE("Layout Options");
376 WRITE_INT(layout.style);
377 WRITE_CHAR(layout.order);
378 WRITE_UINT(layout.dir_view_type);
379 WRITE_UINT(layout.file_view_type);
380 WRITE_BOOL(layout.show_marks);
381 WRITE_BOOL(layout.show_thumbnails);
384 WRITE_BOOL(layout.save_window_positions);
387 WRITE_INT(layout.main_window.x);
388 WRITE_INT(layout.main_window.y);
389 WRITE_INT(layout.main_window.w);
390 WRITE_INT(layout.main_window.h);
391 WRITE_BOOL(layout.main_window.maximized);
392 WRITE_INT(layout.main_window.hdivider_pos);
393 WRITE_INT(layout.main_window.vdivider_pos);
396 WRITE_INT(layout.float_window.x);
397 WRITE_INT(layout.float_window.y);
398 WRITE_INT(layout.float_window.w);
399 WRITE_INT(layout.float_window.h);
400 WRITE_INT(layout.float_window.vdivider_pos);
403 WRITE_BOOL(layout.tools_float);
404 WRITE_BOOL(layout.tools_hidden);
405 WRITE_BOOL(layout.tools_restore_state);
408 WRITE_BOOL(layout.toolbar_hidden);
410 WRITE_SUBTITLE("Panels Options");
412 WRITE_BOOL(panels.exif.enabled);
413 WRITE_INT(panels.exif.width);
414 WRITE_BOOL(panels.info.enabled);
415 WRITE_INT(panels.info.width);
416 WRITE_BOOL(panels.sort.enabled);
417 WRITE_INT(panels.sort.action_state);
418 WRITE_INT(panels.sort.mode_state);
419 WRITE_INT(panels.sort.selection_state);
421 WRITE_SUBTITLE("Image Options");
423 secure_fprintf(ssi, "# image.zoom_mode possible values are:\n"
427 secure_fprintf(ssi, "image.zoom_mode: ");
428 if (options->image.zoom_mode == ZOOM_RESET_ORIGINAL)
429 secure_fprintf(ssi, "original\n");
430 else if (options->image.zoom_mode == ZOOM_RESET_FIT_WINDOW)
431 secure_fprintf(ssi, "fit\n");
432 else if (options->image.zoom_mode == ZOOM_RESET_NONE)
433 secure_fprintf(ssi, "dont_change\n");
435 WRITE_BOOL(image.zoom_2pass);
436 WRITE_BOOL(image.zoom_to_fit_allow_expand);
437 WRITE_INT(image.zoom_quality);
438 WRITE_INT(image.zoom_increment);
439 WRITE_BOOL(image.fit_window_to_image);
440 WRITE_BOOL(image.limit_window_size);
441 WRITE_INT(image.max_window_size);
442 WRITE_BOOL(image.limit_autofit_size);
443 WRITE_INT(image.max_autofit_size);
444 WRITE_INT(image.scroll_reset_method);
445 WRITE_INT(image.tile_cache_max);
446 WRITE_INT(image.dither_quality);
447 WRITE_BOOL(image.enable_read_ahead);
448 WRITE_BOOL(image.exif_rotate_enable);
449 WRITE_BOOL(image.use_custom_border_color);
450 WRITE_COLOR(image.border_color);
451 WRITE_INT(image.read_buffer_size);
452 WRITE_INT(image.idle_read_loop_count);
454 WRITE_SUBTITLE("Thumbnails Options");
456 WRITE_INT(thumbnails.max_width);
457 WRITE_INT(thumbnails.max_height);
458 WRITE_BOOL(thumbnails.enable_caching);
459 WRITE_BOOL(thumbnails.cache_into_dirs);
460 WRITE_BOOL(thumbnails.fast);
461 WRITE_BOOL(thumbnails.use_xvpics);
462 WRITE_BOOL(thumbnails.spec_standard);
463 WRITE_INT(thumbnails.quality);
466 WRITE_SUBTITLE("File sorting Options");
468 WRITE_INT(file_sort.method);
469 WRITE_BOOL(file_sort.ascending);
470 WRITE_BOOL(file_sort.case_sensitive);
473 WRITE_SUBTITLE("Fullscreen Options");
475 WRITE_INT(fullscreen.screen);
476 WRITE_BOOL(fullscreen.clean_flip);
477 WRITE_BOOL(fullscreen.disable_saver);
478 WRITE_BOOL(fullscreen.above);
481 WRITE_SUBTITLE("Histogram Options");
482 WRITE_UINT(histogram.last_channel_mode);
483 WRITE_UINT(histogram.last_log_mode);
486 WRITE_SUBTITLE("Image Overlay Options");
487 WRITE_UINT(image_overlay.common.state);
488 WRITE_BOOL(image_overlay.common.show_at_startup);
489 WRITE_CHAR(image_overlay.common.template_string);
492 WRITE_SUBTITLE("Slideshow Options");
494 WRITE_INT_UNIT(slideshow.delay, SLIDESHOW_SUBSECOND_PRECISION);
495 WRITE_BOOL(slideshow.random);
496 WRITE_BOOL(slideshow.repeat);
499 WRITE_SUBTITLE("Collection Options");
501 WRITE_BOOL(collections.rectangular_selection);
504 WRITE_SUBTITLE("Filtering Options");
506 WRITE_BOOL(file_filter.show_hidden_files);
507 WRITE_BOOL(file_filter.show_dot_directory);
508 WRITE_BOOL(file_filter.disable);
511 filter_write_list(ssi);
514 WRITE_SUBTITLE("Sidecars Options");
516 sidecar_ext_write(ssi);
519 WRITE_SUBTITLE("Color Profiles");
522 secure_fprintf(ssi, "# NOTICE: %s was not built with support for color profiles,\n"
523 "# color profile options will have no effect.\n\n", GQ_APPNAME);
526 WRITE_BOOL(color_profile.enabled);
527 WRITE_BOOL(color_profile.use_image);
528 WRITE_INT(color_profile.input_type);
531 for (i = 0; i < COLOR_PROFILE_INPUTS; i++)
535 buf = g_strdup_printf("color_profile.input_file_%d", i + 1);
536 write_char_option(ssi, buf, options->color_profile.input_file[i]);
539 buf = g_strdup_printf("color_profile.input_name_%d", i + 1);
540 write_char_option(ssi, buf, options->color_profile.input_name[i]);
545 WRITE_INT(color_profile.screen_type);
546 WRITE_CHAR(color_profile.screen_file);
548 WRITE_SUBTITLE("External Programs");
549 secure_fprintf(ssi, "# Maximum of %d programs (external_1 through external_%d)\n", GQ_EDITOR_GENERIC_SLOTS, GQ_EDITOR_GENERIC_SLOTS);
550 secure_fprintf(ssi, "# external_%d through external_%d are used for file ops\n", GQ_EDITOR_GENERIC_SLOTS + 1, GQ_EDITOR_SLOTS);
551 secure_fprintf(ssi, "# format: external_n: \"menu name\" \"command line\"\n\n");
553 for (i = 0; i < GQ_EDITOR_SLOTS; i++)
555 if (i == GQ_EDITOR_GENERIC_SLOTS) secure_fputc(ssi, '\n');
556 gchar *qname = escquote_value(options->editor_name[i]);
557 gchar *qcommand = escquote_value(options->editor_command[i]);
558 secure_fprintf(ssi, "external_%d: %s %s\n", i+1, qname, qcommand);
564 WRITE_SUBTITLE("Exif Options");
565 secure_fprintf(ssi, "# Display: 0: never\n"
568 for (i = 0; ExifUIList[i].key; i++)
570 secure_fprintf(ssi, "exif.display.");
571 write_int_option(ssi, (gchar *)ExifUIList[i].key, ExifUIList[i].current);
577 secure_fprintf(ssi, "######################################################################\n");
578 secure_fprintf(ssi, "# end of config file #\n");
579 secure_fprintf(ssi, "######################################################################\n");
582 if (secure_close(ssi))
583 printf_term(_("error saving config file: %s\nerror: %s\n"), rc_path,
584 secsave_strerror(secsave_errno));
590 *-----------------------------------------------------------------------------
591 * load configuration (public)
592 *-----------------------------------------------------------------------------
595 void load_options(void)
603 gchar value_all[1024];
606 for (i = 0; ExifUIList[i].key; i++)
607 ExifUIList[i].current = ExifUIList[i].default_value;
609 rc_path = g_strconcat(homedir(), "/", GQ_RC_DIR, "/", RC_FILE_NAME, NULL);
611 rc_pathl = path_from_utf8(rc_path);
612 f = fopen(rc_pathl,"r");
620 while (fgets(s_buf, sizeof(s_buf), f))
622 gchar *option_start, *value_start;
625 while (g_ascii_isspace(*p)) p++;
626 if (!*p || *p == '\n' || *p == '#') continue;
628 while (*p && *p != ':') p++;
632 strncpy(option, option_start, sizeof(option));
633 while (g_ascii_isspace(*p)) p++;
635 strncpy(value_all, value_start, sizeof(value_all));
636 while (*p && !g_ascii_isspace(*p) && *p != '\n') p++;
638 strncpy(value, value_start, sizeof(value));
640 #define READ_BOOL(_name_) read_bool_option(f, option, #_name_, value, &options->_name_)
641 #define READ_INT(_name_) read_int_option(f, option, #_name_, value, &options->_name_)
642 #define READ_UINT(_name_) read_uint_option(f, option, #_name_, value, &options->_name_)
643 #define READ_INT_CLAMP(_name_, _min_, _max_) read_int_option_clamp(f, option, #_name_, value, &options->_name_, _min_, _max_)
644 #define READ_INT_UNIT(_name_, _unit_) read_int_unit_option(f, option, #_name_, value, &options->_name_, _unit_)
645 #define READ_CHAR(_name_) read_char_option(f, option, #_name_, value_all, &options->_name_)
646 #define READ_COLOR(_name_) read_color_option(f, option, #_name_, value, &options->_name_)
648 #define COMPAT_READ_BOOL(_oldname_, _name_) read_bool_option(f, option, #_oldname_, value, &options->_name_)
649 #define COMPAT_READ_INT(_oldname_, _name_) read_int_option(f, option, #_oldname_, value, &options->_name_)
650 #define COMPAT_READ_UINT(_oldname_, _name_) read_uint_option(f, option, #_oldname_, value, &options->_name_)
651 #define COMPAT_READ_INT_CLAMP(_oldname_, _name_, _min_, _max_) read_int_option_clamp(f, option, #_oldname_, value, &options->_name_, _min_, _max_)
652 #define COMPAT_READ_INT_UNIT(_oldname_, _name_, _unit_) read_int_unit_option(f, option, #_oldname_, value, &options->_name_, _unit_)
653 #define COMPAT_READ_CHAR(_oldname_, _name_) read_char_option(f, option, #_oldname_, value_all, &options->_name_)
654 #define COMPAT_READ_COLOR(_oldname_, _name_) read_color_option(f, option, #_oldname_, value, &options->_name_)
656 /* general options */
657 READ_BOOL(show_icon_names);
658 READ_BOOL(show_copy_path);
660 READ_BOOL(tree_descend_subdirs);
661 READ_BOOL(lazy_image_sync);
662 READ_BOOL(update_on_time_change);
664 READ_INT(duplicates_similarity_threshold);
666 READ_BOOL(progressive_key_scrolling);
668 READ_BOOL(enable_metadata_dirs);
669 READ_BOOL(save_metadata_in_image_file);
671 READ_BOOL(mousewheel_scrolls);
673 READ_INT(open_recent_list_maxsize);
674 READ_INT(dnd_icon_size);
675 READ_BOOL(place_dialogs_under_mouse);
677 /* startup options */
679 COMPAT_READ_BOOL(startup_path_enable, startup.restore_path); /* 2008/05/11 */
680 READ_BOOL(startup.restore_path);
682 READ_BOOL(startup.use_last_path);
684 COMPAT_READ_CHAR(startup_path, startup.path); /* 2008/05/11 */
685 READ_CHAR(startup.path);
689 READ_INT(layout.style);
690 READ_CHAR(layout.order);
692 COMPAT_READ_UINT(layout.view_as_icons, layout.file_view_type); /* 2008/05/03 */
694 READ_UINT(layout.dir_view_type);
695 READ_UINT(layout.file_view_type);
696 READ_BOOL(layout.show_marks);
697 READ_BOOL(layout.show_thumbnails);
699 /* window positions */
701 READ_BOOL(layout.save_window_positions);
703 READ_INT(layout.main_window.x);
704 READ_INT(layout.main_window.y);
705 READ_INT(layout.main_window.w);
706 READ_INT(layout.main_window.h);
707 READ_BOOL(layout.main_window.maximized);
708 READ_INT(layout.float_window.x);
709 READ_INT(layout.float_window.y);
710 READ_INT(layout.float_window.w);
711 READ_INT(layout.float_window.h);
712 READ_INT(layout.float_window.vdivider_pos);
713 READ_INT(layout.main_window.hdivider_pos);
714 READ_INT(layout.main_window.vdivider_pos);
715 READ_BOOL(layout.tools_float);
716 READ_BOOL(layout.tools_hidden);
717 READ_BOOL(layout.tools_restore_state);
718 READ_BOOL(layout.toolbar_hidden);
721 READ_BOOL(panels.exif.enabled);
722 READ_INT_CLAMP(panels.exif.width, PANEL_MIN_WIDTH, PANEL_MAX_WIDTH);
723 READ_BOOL(panels.info.enabled);
724 READ_INT_CLAMP(panels.info.width, PANEL_MIN_WIDTH, PANEL_MAX_WIDTH);
725 READ_BOOL(panels.sort.enabled);
726 READ_INT(panels.sort.action_state);
727 READ_INT(panels.sort.mode_state);
728 READ_INT(panels.sort.selection_state);
731 if (g_ascii_strcasecmp(option, "image.zoom_mode") == 0)
733 if (g_ascii_strcasecmp(value, "original") == 0)
734 options->image.zoom_mode = ZOOM_RESET_ORIGINAL;
735 else if (g_ascii_strcasecmp(value, "fit") == 0)
736 options->image.zoom_mode = ZOOM_RESET_FIT_WINDOW;
737 else if (g_ascii_strcasecmp(value, "dont_change") == 0)
738 options->image.zoom_mode = ZOOM_RESET_NONE;
740 READ_BOOL(image.zoom_2pass);
741 READ_BOOL(image.zoom_to_fit_allow_expand);
742 READ_BOOL(image.fit_window_to_image);
743 READ_BOOL(image.limit_window_size);
744 READ_INT(image.max_window_size);
745 READ_BOOL(image.limit_autofit_size);
746 READ_INT(image.max_autofit_size);
747 READ_INT(image.scroll_reset_method);
748 READ_INT(image.tile_cache_max);
749 READ_INT_CLAMP(image.zoom_quality, GDK_INTERP_NEAREST, GDK_INTERP_HYPER);
750 READ_INT_CLAMP(image.dither_quality, GDK_RGB_DITHER_NONE, GDK_RGB_DITHER_MAX);
751 READ_INT(image.zoom_increment);
752 READ_BOOL(image.enable_read_ahead);
753 READ_BOOL(image.exif_rotate_enable);
754 READ_BOOL(image.use_custom_border_color);
755 READ_COLOR(image.border_color);
756 READ_INT_CLAMP(image.read_buffer_size, IMAGE_LOADER_READ_BUFFER_SIZE_MIN, IMAGE_LOADER_READ_BUFFER_SIZE_MAX);
757 READ_INT_CLAMP(image.idle_read_loop_count, IMAGE_LOADER_IDLE_READ_LOOP_COUNT_MIN, IMAGE_LOADER_IDLE_READ_LOOP_COUNT_MAX);
760 /* thumbnails options */
761 READ_INT_CLAMP(thumbnails.max_width, 16, 512);
762 READ_INT_CLAMP(thumbnails.max_height, 16, 512);
764 READ_BOOL(thumbnails.enable_caching);
765 READ_BOOL(thumbnails.cache_into_dirs);
766 READ_BOOL(thumbnails.fast);
767 READ_BOOL(thumbnails.use_xvpics);
768 READ_BOOL(thumbnails.spec_standard);
769 READ_INT_CLAMP(thumbnails.quality, GDK_INTERP_NEAREST, GDK_INTERP_HYPER);
771 /* file sorting options */
772 READ_UINT(file_sort.method);
773 READ_BOOL(file_sort.ascending);
774 READ_BOOL(file_sort.case_sensitive);
776 /* file operations options */
777 READ_BOOL(file_ops.enable_in_place_rename);
778 READ_BOOL(file_ops.confirm_delete);
779 READ_BOOL(file_ops.enable_delete_key);
780 READ_BOOL(file_ops.safe_delete_enable);
781 READ_CHAR(file_ops.safe_delete_path);
782 READ_INT(file_ops.safe_delete_folder_maxsize);
784 /* fullscreen options */
785 READ_INT(fullscreen.screen);
786 READ_BOOL(fullscreen.clean_flip);
787 READ_BOOL(fullscreen.disable_saver);
788 READ_BOOL(fullscreen.above);
791 READ_UINT(histogram.last_channel_mode);
792 READ_UINT(histogram.last_log_mode);
795 COMPAT_READ_UINT(image_overlay.common.enabled, image_overlay.common.state); /* 2008-05-12 */
796 READ_UINT(image_overlay.common.state);
797 COMPAT_READ_BOOL(fullscreen.show_info, image_overlay.common.show_at_startup); /* 2008-04-21 */
798 READ_BOOL(image_overlay.common.show_at_startup);
799 COMPAT_READ_CHAR(fullscreen.info, image_overlay.common.template_string); /* 2008-04-21 */
800 READ_CHAR(image_overlay.common.template_string);
802 /* slideshow options */
803 READ_INT_UNIT(slideshow.delay, SLIDESHOW_SUBSECOND_PRECISION);
804 READ_BOOL(slideshow.random);
805 READ_BOOL(slideshow.repeat);
807 /* collection options */
809 READ_BOOL(collections.rectangular_selection);
811 /* filtering options */
813 READ_BOOL(file_filter.show_hidden_files);
814 READ_BOOL(file_filter.show_dot_directory);
815 READ_BOOL(file_filter.disable);
817 if (g_ascii_strcasecmp(option, "file_filter.ext") == 0)
819 filter_parse(value_all);
822 if (g_ascii_strcasecmp(option, "sidecar.ext") == 0)
824 sidecar_ext_parse(value_all, TRUE);
829 READ_BOOL(color_profile.enabled);
830 READ_BOOL(color_profile.use_image);
831 READ_INT(color_profile.input_type);
833 if (g_ascii_strncasecmp(option, "color_profile.input_file_", 25) == 0)
835 i = strtol(option + 25, NULL, 0) - 1;
836 if (i >= 0 && i < COLOR_PROFILE_INPUTS)
838 read_char_option(f, option, option, value, &options->color_profile.input_file[i]);
841 if (g_ascii_strncasecmp(option, "color_profile.input_name_", 25) == 0)
843 i = strtol(option + 25, NULL, 0) - 1;
844 if (i >= 0 && i < COLOR_PROFILE_INPUTS)
846 read_char_option(f, option, option, value, &options->color_profile.input_name[i]);
850 READ_INT(color_profile.screen_type);
851 READ_CHAR(color_profile.screen_file);
853 /* External Programs */
855 if (g_ascii_strncasecmp(option, "external_", 9) == 0)
857 i = strtol(option + 9, NULL, 0);
858 if (i > 0 && i <= GQ_EDITOR_SLOTS)
862 g_free(options->editor_name[i]);
863 g_free(options->editor_command[i]);
865 options->editor_name[i] = quoted_value(value_all, &ptr);
866 options->editor_command[i] = quoted_value(ptr, NULL);
871 if (0 == g_ascii_strncasecmp(option, "exif.display.", 13))
873 for (i = 0; ExifUIList[i].key; i++)
874 if (0 == g_ascii_strcasecmp(option + 13, ExifUIList[i].key))
875 ExifUIList[i].current = strtol(value, NULL, 10);