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>
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 && 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 && 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 && 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 && 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 && 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 && 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 && strcasecmp(option, label) == 0)
250 if (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(startup_path_enable);
313 WRITE_CHAR(startup_path);
315 WRITE_BOOL(progressive_key_scrolling);
316 WRITE_BOOL(enable_metadata_dirs);
318 WRITE_INT(duplicates_similarity_threshold);
321 WRITE_BOOL(mousewheel_scrolls);
322 WRITE_INT(open_recent_list_maxsize);
323 WRITE_INT(dnd_icon_size);
324 WRITE_BOOL(place_dialogs_under_mouse);
327 WRITE_SUBTITLE("File operations Options");
329 WRITE_BOOL(file_ops.enable_in_place_rename);
330 WRITE_BOOL(file_ops.confirm_delete);
331 WRITE_BOOL(file_ops.enable_delete_key);
332 WRITE_BOOL(file_ops.safe_delete_enable);
333 WRITE_CHAR(file_ops.safe_delete_path);
334 WRITE_INT(file_ops.safe_delete_folder_maxsize);
337 WRITE_SUBTITLE("Layout Options");
339 WRITE_INT(layout.style);
340 WRITE_CHAR(layout.order);
341 WRITE_UINT(layout.dir_view_type);
342 WRITE_UINT(layout.file_view_type);
343 WRITE_BOOL(layout.show_marks);
344 WRITE_BOOL(layout.show_thumbnails);
347 WRITE_BOOL(layout.save_window_positions);
350 WRITE_INT(layout.main_window.x);
351 WRITE_INT(layout.main_window.y);
352 WRITE_INT(layout.main_window.w);
353 WRITE_INT(layout.main_window.h);
354 WRITE_BOOL(layout.main_window.maximized);
355 WRITE_INT(layout.main_window.hdivider_pos);
356 WRITE_INT(layout.main_window.vdivider_pos);
359 WRITE_INT(layout.float_window.x);
360 WRITE_INT(layout.float_window.y);
361 WRITE_INT(layout.float_window.w);
362 WRITE_INT(layout.float_window.h);
363 WRITE_INT(layout.float_window.vdivider_pos);
366 WRITE_BOOL(layout.tools_float);
367 WRITE_BOOL(layout.tools_hidden);
368 WRITE_BOOL(layout.tools_restore_state);
371 WRITE_BOOL(layout.toolbar_hidden);
373 WRITE_SUBTITLE("Panels Options");
375 WRITE_BOOL(panels.exif.enabled);
376 WRITE_INT(panels.exif.width);
377 WRITE_BOOL(panels.info.enabled);
378 WRITE_INT(panels.info.width);
379 WRITE_BOOL(panels.sort.enabled);
380 WRITE_INT(panels.sort.action_state);
381 WRITE_INT(panels.sort.mode_state);
382 WRITE_INT(panels.sort.selection_state);
384 WRITE_SUBTITLE("Image Options");
386 secure_fprintf(ssi, "# image.zoom_mode possible values are:\n"
390 secure_fprintf(ssi, "image.zoom_mode: ");
391 if (options->image.zoom_mode == ZOOM_RESET_ORIGINAL)
392 secure_fprintf(ssi, "original\n");
393 else if (options->image.zoom_mode == ZOOM_RESET_FIT_WINDOW)
394 secure_fprintf(ssi, "fit\n");
395 else if (options->image.zoom_mode == ZOOM_RESET_NONE)
396 secure_fprintf(ssi, "dont_change\n");
398 WRITE_BOOL(image.zoom_2pass);
399 WRITE_BOOL(image.zoom_to_fit_allow_expand);
400 WRITE_INT(image.zoom_quality);
401 WRITE_INT(image.zoom_increment);
402 WRITE_BOOL(image.fit_window_to_image);
403 WRITE_BOOL(image.limit_window_size);
404 WRITE_INT(image.max_window_size);
405 WRITE_BOOL(image.limit_autofit_size);
406 WRITE_INT(image.max_autofit_size);
407 WRITE_INT(image.scroll_reset_method);
408 WRITE_INT(image.tile_cache_max);
409 WRITE_INT(image.dither_quality);
410 WRITE_BOOL(image.enable_read_ahead);
411 WRITE_BOOL(image.exif_rotate_enable);
412 WRITE_BOOL(image.use_custom_border_color);
413 WRITE_COLOR(image.border_color);
414 WRITE_INT(image.read_buffer_size);
415 WRITE_INT(image.idle_read_loop_count);
417 WRITE_SUBTITLE("Thumbnails Options");
419 WRITE_INT(thumbnails.max_width);
420 WRITE_INT(thumbnails.max_height);
421 WRITE_BOOL(thumbnails.enable_caching);
422 WRITE_BOOL(thumbnails.cache_into_dirs);
423 WRITE_BOOL(thumbnails.fast);
424 WRITE_BOOL(thumbnails.use_xvpics);
425 WRITE_BOOL(thumbnails.spec_standard);
426 WRITE_INT(thumbnails.quality);
429 WRITE_SUBTITLE("File sorting Options");
431 WRITE_INT(file_sort.method);
432 WRITE_BOOL(file_sort.ascending);
433 WRITE_BOOL(file_sort.case_sensitive);
436 WRITE_SUBTITLE("Fullscreen Options");
438 WRITE_INT(fullscreen.screen);
439 WRITE_BOOL(fullscreen.clean_flip);
440 WRITE_BOOL(fullscreen.disable_saver);
441 WRITE_BOOL(fullscreen.above);
443 WRITE_SUBTITLE("Image Overlay Options");
444 WRITE_BOOL(image_overlay.common.enabled);
445 WRITE_BOOL(image_overlay.common.show_at_startup);
446 WRITE_CHAR(image_overlay.common.template_string);
448 WRITE_SUBTITLE("Slideshow Options");
450 WRITE_INT_UNIT(slideshow.delay, SLIDESHOW_SUBSECOND_PRECISION);
451 WRITE_BOOL(slideshow.random);
452 WRITE_BOOL(slideshow.repeat);
455 WRITE_SUBTITLE("Collection Options");
457 WRITE_BOOL(collections.rectangular_selection);
460 WRITE_SUBTITLE("Filtering Options");
462 WRITE_BOOL(file_filter.show_hidden_files);
463 WRITE_BOOL(file_filter.show_dot_directory);
464 WRITE_BOOL(file_filter.disable);
467 filter_write_list(ssi);
470 WRITE_SUBTITLE("Sidecars Options");
472 sidecar_ext_write(ssi);
475 WRITE_SUBTITLE("Color Profiles");
478 secure_fprintf(ssi, "# NOTICE: %s was not built with support for color profiles,\n"
479 "# color profile options will have no effect.\n\n", GQ_APPNAME);
482 WRITE_BOOL(color_profile.enabled);
483 WRITE_BOOL(color_profile.use_image);
484 WRITE_INT(color_profile.input_type);
487 for (i = 0; i < COLOR_PROFILE_INPUTS; i++)
491 buf = g_strdup_printf("color_profile.input_file_%d", i + 1);
492 write_char_option(ssi, buf, options->color_profile.input_file[i]);
495 buf = g_strdup_printf("color_profile.input_name_%d", i + 1);
496 write_char_option(ssi, buf, options->color_profile.input_name[i]);
501 WRITE_INT(color_profile.screen_type);
502 WRITE_CHAR(color_profile.screen_file);
504 WRITE_SUBTITLE("External Programs");
505 secure_fprintf(ssi, "# Maximum of %d programs (external_1 through external_%d)\n", GQ_EDITOR_GENERIC_SLOTS, GQ_EDITOR_GENERIC_SLOTS);
506 secure_fprintf(ssi, "# external_%d through external_%d are used for file ops\n", GQ_EDITOR_GENERIC_SLOTS + 1, GQ_EDITOR_SLOTS);
507 secure_fprintf(ssi, "# format: external_n: \"menu name\" \"command line\"\n\n");
509 for (i = 0; i < GQ_EDITOR_SLOTS; i++)
511 if (i == GQ_EDITOR_GENERIC_SLOTS) secure_fputc(ssi, '\n');
512 gchar *qname = escquote_value(options->editor_name[i]);
513 gchar *qcommand = escquote_value(options->editor_command[i]);
514 secure_fprintf(ssi, "external_%d: %s %s\n", i+1, qname, qcommand);
520 WRITE_SUBTITLE("Exif Options");
521 secure_fprintf(ssi, "# Display: 0: never\n"
524 for (i = 0; ExifUIList[i].key; i++)
526 secure_fprintf(ssi, "exif.display.");
527 write_int_option(ssi, (gchar *)ExifUIList[i].key, ExifUIList[i].current);
533 secure_fprintf(ssi, "######################################################################\n");
534 secure_fprintf(ssi, "# end of config file #\n");
535 secure_fprintf(ssi, "######################################################################\n");
538 if (secure_close(ssi))
539 printf_term(_("error saving config file: %s\nerror: %s\n"), rc_path,
540 secsave_strerror(secsave_errno));
546 *-----------------------------------------------------------------------------
547 * load configuration (public)
548 *-----------------------------------------------------------------------------
551 void load_options(void)
559 gchar value_all[1024];
562 for (i = 0; ExifUIList[i].key; i++)
563 ExifUIList[i].current = ExifUIList[i].default_value;
565 rc_path = g_strconcat(homedir(), "/", GQ_RC_DIR, "/", RC_FILE_NAME, NULL);
567 rc_pathl = path_from_utf8(rc_path);
568 f = fopen(rc_pathl,"r");
576 while (fgets(s_buf, sizeof(s_buf), f))
578 gchar *option_start, *value_start;
581 while (g_ascii_isspace(*p)) p++;
582 if (!*p || *p == '\n' || *p == '#') continue;
584 while (*p && *p != ':') p++;
588 strncpy(option, option_start, sizeof(option));
589 while (g_ascii_isspace(*p)) p++;
591 strncpy(value_all, value_start, sizeof(value_all));
592 while (*p && !g_ascii_isspace(*p) && *p != '\n') p++;
594 strncpy(value, value_start, sizeof(value));
596 #define READ_BOOL(_name_) read_bool_option(f, option, #_name_, value, &options->_name_)
597 #define READ_INT(_name_) read_int_option(f, option, #_name_, value, &options->_name_)
598 #define READ_UINT(_name_) read_uint_option(f, option, #_name_, value, &options->_name_)
599 #define READ_INT_CLAMP(_name_, _min_, _max_) read_int_option_clamp(f, option, #_name_, value, &options->_name_, _min_, _max_)
600 #define READ_INT_UNIT(_name_, _unit_) read_int_unit_option(f, option, #_name_, value, &options->_name_, _unit_)
601 #define READ_CHAR(_name_) read_char_option(f, option, #_name_, value_all, &options->_name_)
602 #define READ_COLOR(_name_) read_color_option(f, option, #_name_, value, &options->_name_)
604 #define COMPAT_READ_BOOL(_oldname_, _name_) read_bool_option(f, option, #_oldname_, value, &options->_name_)
605 #define COMPAT_READ_INT(_oldname_, _name_) read_int_option(f, option, #_oldname_, value, &options->_name_)
606 #define COMPAT_READ_UINT(_oldname_, _name_) read_uint_option(f, option, #_oldname_, value, &options->_name_)
607 #define COMPAT_READ_INT_CLAMP(_oldname_, _name_, _min_, _max_) read_int_option_clamp(f, option, #_oldname_, value, &options->_name_, _min_, _max_)
608 #define COMPAT_READ_INT_UNIT(_oldname_, _name_, _unit_) read_int_unit_option(f, option, #_oldname_, value, &options->_name_, _unit_)
609 #define COMPAT_READ_CHAR(_oldname_, _name_) read_char_option(f, option, #_oldname_, value_all, &options->_name_)
610 #define COMPAT_READ_COLOR(_oldname_, _name_) read_color_option(f, option, #_oldname_, value, &options->_name_)
612 /* general options */
613 READ_BOOL(show_icon_names);
614 READ_BOOL(show_copy_path);
616 READ_BOOL(tree_descend_subdirs);
617 READ_BOOL(lazy_image_sync);
618 READ_BOOL(update_on_time_change);
620 READ_BOOL(startup_path_enable);
621 READ_CHAR(startup_path);
623 READ_INT(duplicates_similarity_threshold);
625 READ_BOOL(progressive_key_scrolling);
627 READ_BOOL(enable_metadata_dirs);
629 READ_BOOL(mousewheel_scrolls);
631 READ_INT(open_recent_list_maxsize);
632 READ_INT(dnd_icon_size);
633 READ_BOOL(place_dialogs_under_mouse);
638 READ_INT(layout.style);
639 READ_CHAR(layout.order);
641 COMPAT_READ_UINT(layout.view_as_icons, layout.file_view_type); /* 2008/05/03 */
643 READ_UINT(layout.dir_view_type);
644 READ_UINT(layout.file_view_type);
645 READ_BOOL(layout.show_marks);
646 READ_BOOL(layout.show_thumbnails);
648 /* window positions */
650 READ_BOOL(layout.save_window_positions);
652 READ_INT(layout.main_window.x);
653 READ_INT(layout.main_window.y);
654 READ_INT(layout.main_window.w);
655 READ_INT(layout.main_window.h);
656 READ_BOOL(layout.main_window.maximized);
657 READ_INT(layout.float_window.x);
658 READ_INT(layout.float_window.y);
659 READ_INT(layout.float_window.w);
660 READ_INT(layout.float_window.h);
661 READ_INT(layout.float_window.vdivider_pos);
662 READ_INT(layout.main_window.hdivider_pos);
663 READ_INT(layout.main_window.vdivider_pos);
664 READ_BOOL(layout.tools_float);
665 READ_BOOL(layout.tools_hidden);
666 READ_BOOL(layout.tools_restore_state);
667 READ_BOOL(layout.toolbar_hidden);
670 READ_BOOL(panels.exif.enabled);
671 READ_INT_CLAMP(panels.exif.width, PANEL_MIN_WIDTH, PANEL_MAX_WIDTH);
672 READ_BOOL(panels.info.enabled);
673 READ_INT_CLAMP(panels.info.width, PANEL_MIN_WIDTH, PANEL_MAX_WIDTH);
674 READ_BOOL(panels.sort.enabled);
675 READ_INT(panels.sort.action_state);
676 READ_INT(panels.sort.mode_state);
677 READ_INT(panels.sort.selection_state);
680 if (strcasecmp(option, "image.zoom_mode") == 0)
682 if (strcasecmp(value, "original") == 0)
683 options->image.zoom_mode = ZOOM_RESET_ORIGINAL;
684 else if (strcasecmp(value, "fit") == 0)
685 options->image.zoom_mode = ZOOM_RESET_FIT_WINDOW;
686 else if (strcasecmp(value, "dont_change") == 0)
687 options->image.zoom_mode = ZOOM_RESET_NONE;
689 READ_BOOL(image.zoom_2pass);
690 READ_BOOL(image.zoom_to_fit_allow_expand);
691 READ_BOOL(image.fit_window_to_image);
692 READ_BOOL(image.limit_window_size);
693 READ_INT(image.max_window_size);
694 READ_BOOL(image.limit_autofit_size);
695 READ_INT(image.max_autofit_size);
696 READ_INT(image.scroll_reset_method);
697 READ_INT(image.tile_cache_max);
698 READ_INT_CLAMP(image.zoom_quality, GDK_INTERP_NEAREST, GDK_INTERP_HYPER);
699 READ_INT_CLAMP(image.dither_quality, GDK_RGB_DITHER_NONE, GDK_RGB_DITHER_MAX);
700 READ_INT(image.zoom_increment);
701 READ_BOOL(image.enable_read_ahead);
702 READ_BOOL(image.exif_rotate_enable);
703 READ_BOOL(image.use_custom_border_color);
704 READ_COLOR(image.border_color);
705 READ_INT_CLAMP(image.read_buffer_size, IMAGE_LOADER_READ_BUFFER_SIZE_MIN, IMAGE_LOADER_READ_BUFFER_SIZE_MAX);
706 READ_INT_CLAMP(image.idle_read_loop_count, IMAGE_LOADER_IDLE_READ_LOOP_COUNT_MIN, IMAGE_LOADER_IDLE_READ_LOOP_COUNT_MAX);
709 /* thumbnails options */
710 READ_INT_CLAMP(thumbnails.max_width, 16, 512);
711 READ_INT_CLAMP(thumbnails.max_height, 16, 512);
713 READ_BOOL(thumbnails.enable_caching);
714 READ_BOOL(thumbnails.cache_into_dirs);
715 READ_BOOL(thumbnails.fast);
716 READ_BOOL(thumbnails.use_xvpics);
717 READ_BOOL(thumbnails.spec_standard);
718 READ_INT_CLAMP(thumbnails.quality, GDK_INTERP_NEAREST, GDK_INTERP_HYPER);
720 /* file sorting options */
721 READ_UINT(file_sort.method);
722 READ_BOOL(file_sort.ascending);
723 READ_BOOL(file_sort.case_sensitive);
725 /* file operations options */
726 READ_BOOL(file_ops.enable_in_place_rename);
727 READ_BOOL(file_ops.confirm_delete);
728 READ_BOOL(file_ops.enable_delete_key);
729 READ_BOOL(file_ops.safe_delete_enable);
730 READ_CHAR(file_ops.safe_delete_path);
731 READ_INT(file_ops.safe_delete_folder_maxsize);
733 /* fullscreen options */
734 READ_INT(fullscreen.screen);
735 READ_BOOL(fullscreen.clean_flip);
736 READ_BOOL(fullscreen.disable_saver);
737 READ_BOOL(fullscreen.above);
740 COMPAT_READ_BOOL(fullscreen.show_info, image_overlay.common.show_at_startup);
741 COMPAT_READ_CHAR(fullscreen.info, image_overlay.common.template_string);
742 READ_BOOL(image_overlay.common.enabled);
743 READ_BOOL(image_overlay.common.show_at_startup);
744 READ_CHAR(image_overlay.common.template_string);
746 /* slideshow options */
747 READ_INT_UNIT(slideshow.delay, SLIDESHOW_SUBSECOND_PRECISION);
748 READ_BOOL(slideshow.random);
749 READ_BOOL(slideshow.repeat);
751 /* collection options */
753 READ_BOOL(collections.rectangular_selection);
755 /* filtering options */
757 READ_BOOL(file_filter.show_hidden_files);
758 READ_BOOL(file_filter.show_dot_directory);
759 READ_BOOL(file_filter.disable);
761 if (strcasecmp(option, "file_filter.ext") == 0)
763 filter_parse(value_all);
766 if (strcasecmp(option, "sidecar.ext") == 0)
768 sidecar_ext_parse(value_all, TRUE);
773 READ_BOOL(color_profile.enabled);
774 READ_BOOL(color_profile.use_image);
775 READ_INT(color_profile.input_type);
777 if (strncasecmp(option, "color_profile.input_file_", 25) == 0)
779 i = strtol(option + 25, NULL, 0) - 1;
780 if (i >= 0 && i < COLOR_PROFILE_INPUTS)
782 read_char_option(f, option, option, value, &options->color_profile.input_file[i]);
785 if (strncasecmp(option, "color_profile.input_name_", 25) == 0)
787 i = strtol(option + 25, NULL, 0) - 1;
788 if (i >= 0 && i < COLOR_PROFILE_INPUTS)
790 read_char_option(f, option, option, value, &options->color_profile.input_name[i]);
794 READ_INT(color_profile.screen_type);
795 READ_CHAR(color_profile.screen_file);
797 /* External Programs */
799 if (strncasecmp(option, "external_", 9) == 0)
801 i = strtol(option + 9, NULL, 0);
802 if (i > 0 && i <= GQ_EDITOR_SLOTS)
806 g_free(options->editor_name[i]);
807 g_free(options->editor_command[i]);
809 options->editor_name[i] = quoted_value(value_all, &ptr);
810 options->editor_command[i] = quoted_value(ptr, NULL);
815 if (0 == strncasecmp(option, "exif.display.", 13))
817 for (i = 0; ExifUIList[i].key; i++)
818 if (0 == strcasecmp(option + 13, ExifUIList[i].key))
819 ExifUIList[i].current = strtol(value, NULL, 10);