Mercurial > geeqie
diff src/rcfile.c @ 1:b3e0e515fabf
Initial revision
author | gqview |
---|---|
date | Mon, 03 Apr 2000 18:24:05 +0000 |
parents | |
children | c0e337a01cb7 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/rcfile.c Mon Apr 03 18:24:05 2000 +0000 @@ -0,0 +1,434 @@ +/* + * GQview image viewer + * (C)1999 John Ellis + * + * Author: John Ellis + * + */ + +#include "gqview.h" + +static gchar *quoted_value(gchar *text); +static void write_char_option(FILE *f, gchar *label, gchar *text); +static gchar *read_char_option(FILE *f, gchar *option, gchar *label, gchar *value, gchar *text); +static void write_int_option(FILE *f, gchar *label, gint n); +static gint read_int_option(FILE *f, gchar *option, gchar *label, gchar *value, gint n); +static void write_bool_option(FILE *f, gchar *label, gint n); +static gint read_bool_option(FILE *f, gchar *option, gchar *label, gchar *value, gint n); + +/* + *----------------------------------------------------------------------------- + * line write/parse routines (private) + *----------------------------------------------------------------------------- + */ + +static gchar *quoted_value(gchar *text) +{ + gchar *ptr; + gint c = 0; + gint l = strlen(text); + + if (l == 0) return NULL; + + while (c < l && text[c] !='"') c++; + if (text[c] == '"') + { + c++; + ptr = text + c; + while (c < l && text[c] !='"') c++; + if (text[c] == '"') + { + text[c] = '\0'; + if (strlen(ptr) > 0) + { + return g_strdup(ptr); + } + } + } + else + /* for compatibility with older formats (<0.3.7) + * read a line without quotes too */ + { + c = 0; + while (c < l && text[c] !=' ' && text[c] !=8 && text[c] != '\n') c++; + if (c != 0) + { + text[c] = '\0'; + return g_strdup(text); + } + } + + return NULL; +} + +static void write_char_option(FILE *f, gchar *label, gchar *text) +{ + if (text) + fprintf(f,"%s: \"%s\"\n", label, text); + else + fprintf(f,"%s: \n", label); +} + +static gchar *read_char_option(FILE *f, gchar *option, gchar *label, gchar *value, gchar *text) +{ + if (!strcasecmp(option, label)) + { + g_free(text); + text = quoted_value(value); + } + return text; +} + +static void write_int_option(FILE *f, gchar *label, gint n) +{ + fprintf(f,"%s: %d\n\n", label, n); +} + +static gint read_int_option(FILE *f, gchar *option, gchar *label, gchar *value, gint n) +{ + if (!strcasecmp(option, label)) + { + n = strtol(value,NULL,0); + } + return n; +} + +static void write_bool_option(FILE *f, gchar *label, gint n) +{ + fprintf(f,"%s: ", label); + if (n) fprintf(f,"true\n"); else fprintf(f,"false\n"); + fprintf(f,"\n"); +} + +static gint read_bool_option(FILE *f, gchar *option, gchar *label, gchar *value, gint n) +{ + if (!strcasecmp(option, label)) + { + if (!strcasecmp(value, "true")) + n = TRUE; + else + n = FALSE; + } + return n; +} + +/* + *----------------------------------------------------------------------------- + * save configuration (public) + *----------------------------------------------------------------------------- + */ + +void save_options() +{ + FILE *f; + gchar *rc_path; + gint i; + + rc_path = g_strconcat(homedir(), "/", RC_FILE_NAME, NULL); + + f = fopen(rc_path,"w"); + if (!f) + { + printf(_("error saving config file: %s\n"), rc_path); + g_free(rc_path); + return; + } + + fprintf(f,"######################################################################\n"); + fprintf(f,"# GQview config file version %7s #\n", VERSION); + fprintf(f,"# #\n"); + fprintf(f,"# Everything in this file can be changed in the option dialogs. #\n"); + fprintf(f,"# (so there should be no need to edit this file by hand) #\n"); + fprintf(f,"# #\n"); + fprintf(f,"######################################################################\n"); + fprintf(f,"\n"); + fprintf(f,"##### General Options #####\n\n"); + + write_bool_option(f, "enable_startup_path", startup_path_enable); + write_char_option(f, "startup_path", startup_path); + fprintf(f,"\n"); + + fprintf(f,"zoom_mode: "); + if (zoom_mode == ZOOM_RESET_ORIGINAL) fprintf(f,"original\n"); + if (zoom_mode == ZOOM_RESET_FIT_WINDOW) fprintf(f,"fit\n"); + if (zoom_mode == ZOOM_RESET_NONE) fprintf(f,"dont_change\n"); + fprintf(f,"\n"); + + write_bool_option(f, "fit_window_to_image", fit_window); + write_bool_option(f, "limit_window_size", limit_window_size); + write_int_option(f, "max_window_size", max_window_size); + fprintf(f,"\n"); + + write_bool_option(f, "progressive_keyboard_scrolling", progressive_key_scrolling); + fprintf(f,"\n"); + + write_int_option(f, "thumbnail_width", thumb_max_width); + write_int_option(f, "thumbnail_height", thumb_max_height); + write_bool_option(f, "cache_thumbnails", enable_thumb_caching); + write_bool_option(f, "use_xvpics_thumbnails", use_xvpics_thumbnails); + fprintf(f,"\n"); + + write_bool_option(f, "confirm_delete", confirm_delete); + fprintf(f,"\n"); + write_bool_option(f, "tools_float", tools_float); + write_bool_option(f, "tools_hidden", tools_hidden); + write_bool_option(f, "restore_tool_state", restore_tool); + + fprintf(f,"\n##### Slideshow Options #####\n\n"); + + write_int_option(f, "slideshow_delay", slideshow_delay); + + write_bool_option(f, "slideshow_random", slideshow_random); + write_bool_option(f, "slideshow_repeat", slideshow_repeat); + + fprintf(f,"\n##### Filtering Options #####\n\n"); + + write_bool_option(f, "show_dotfiles", show_dot_files); + write_bool_option(f, "disable_filtering", file_filter_disable); + fprintf(f,"\n"); + write_bool_option(f, "filter_ppm", filter_include_ppm); + write_bool_option(f, "filter_png", filter_include_png); + write_bool_option(f, "filter_jpg", filter_include_jpg); + write_bool_option(f, "filter_tif", filter_include_tif); + write_bool_option(f, "filter_pgm", filter_include_pgm); + write_bool_option(f, "filter_xpm", filter_include_xpm); + write_bool_option(f, "filter_gif", filter_include_gif); + write_bool_option(f, "filter_pcx", filter_include_pcx); + write_bool_option(f, "filter_bmp", filter_include_bmp); + fprintf(f,"\n"); + write_char_option(f, "custom_filter", custom_filter); + + fprintf(f,"\n##### External Programs #####\n"); + fprintf(f,"# Maximum of 8 programs (external_1 through external 8)\n"); + fprintf(f,"# format: external_n: \"menu name\" \"command line\"\n\n"); + + for (i=0; i<8; i++) + { + fprintf(f,"external_%d: \"", i+1); + if (editor_name[i]) fprintf(f, editor_name[i]); + fprintf(f, "\" \""); + if (editor_command[i]) fprintf(f, editor_command[i]); + fprintf(f, "\"\n"); + } + + fprintf(f,"\n##### Window Positions #####\n\n"); + + write_bool_option(f, "restore_window_positions", save_window_positions); + fprintf(f,"\n"); + write_int_option(f, "main_window_x", main_window_x); + write_int_option(f, "main_window_y", main_window_y); + write_int_option(f, "main_window_width", main_window_w); + write_int_option(f, "main_window_height", main_window_h); + write_int_option(f, "float_window_x", float_window_x); + write_int_option(f, "float_window_y", float_window_y); + write_int_option(f, "float_window_width", float_window_w); + write_int_option(f, "float_window_height", float_window_h); + + fprintf(f,"######################################################################\n"); + fprintf(f,"# end of GQview config file #\n"); + fprintf(f,"######################################################################\n"); + + fclose(f); + + g_free(rc_path); +} + +/* + *----------------------------------------------------------------------------- + * load configuration (public) + *----------------------------------------------------------------------------- + */ + +void load_options() +{ + FILE *f; + gchar *rc_path; + gchar s_buf[1024]; + gchar *s_buf_ptr; + gchar option[1024]; + gchar value[1024]; + gchar value_all[1024]; + gint c,l,i; + rc_path = g_strconcat(homedir(), "/", RC_FILE_NAME, NULL); + + f = fopen(rc_path,"r"); + if (!f) + { + g_free(rc_path); + return; + } + + while (fgets(s_buf,1024,f)) + { + if (s_buf[0]=='#') continue; + if (s_buf[0]=='\n') continue; + c = 0; + l = strlen(s_buf); + while (s_buf[c] != ':' && c < l) c++; + if (c >= l) continue; + s_buf[c] = '\0'; + c++; + while (s_buf[c] == ' ' && c < l) c++; + while (s_buf[c] == 8 && c < l) c++; + while (s_buf[c] == ' ' && c < l) c++; + s_buf_ptr = s_buf + c; + strcpy(value_all,s_buf_ptr); + while (s_buf[c] != 8 && s_buf[c] != ' ' && s_buf[c] != '\n' && c < l) c++; + s_buf[c] = '\0'; + strcpy(option,s_buf); + strcpy(value,s_buf_ptr); + + /* general options */ + + startup_path_enable = read_bool_option(f, option, + "enable_startup_path", value, startup_path_enable); + startup_path = read_char_option(f, option, + "startup_path", value_all, startup_path); + + if (!strcasecmp(option,"zoom_mode")) + { + if (!strcasecmp(value,"original")) zoom_mode = ZOOM_RESET_ORIGINAL; + if (!strcasecmp(value,"fit")) zoom_mode = ZOOM_RESET_FIT_WINDOW; + if (!strcasecmp(value,"dont_change")) zoom_mode = ZOOM_RESET_NONE; + } + + fit_window = read_bool_option(f, option, + "fit_window_to_image", value, fit_window); + limit_window_size = read_bool_option(f, option, + "limit_window_size", value, limit_window_size); + max_window_size = read_int_option(f, option, + "max_window_size", value, max_window_size); + progressive_key_scrolling = read_bool_option(f, option, + "progressive_keyboard_scrolling", value, progressive_key_scrolling); + + thumb_max_width = read_int_option(f, option, + "thumbnail_width", value, thumb_max_width); + thumb_max_height = read_int_option(f, option, + "thumbnail_height", value, thumb_max_height); + enable_thumb_caching = read_bool_option(f, option, + "cache_thumbnails", value, enable_thumb_caching); + use_xvpics_thumbnails = read_bool_option(f, option, + "use_xvpics_thumbnails", value, use_xvpics_thumbnails); + + confirm_delete = read_bool_option(f, option, + "confirm_delete", value, confirm_delete); + + tools_float = read_bool_option(f, option, + "tools_float", value, tools_float); + tools_hidden = read_bool_option(f, option, + "tools_hidden", value, tools_hidden); + restore_tool = read_bool_option(f, option, + "restore_tool_state", value, restore_tool); + + /* slideshow opitons */ + + slideshow_delay = read_int_option(f, option, + "slideshow_delay", value, slideshow_delay); + slideshow_random = read_bool_option(f, option, + "slideshow_random", value, slideshow_random); + slideshow_repeat = read_bool_option(f, option, + "slideshow_repeat", value, slideshow_repeat); + + /* filtering options */ + + show_dot_files = read_bool_option(f, option, + "show_dotfiles", value, show_dot_files); + file_filter_disable = read_bool_option(f, option, + "disable_filtering", value, file_filter_disable); + + filter_include_ppm = read_bool_option(f, option, + "filter_ppm", value, filter_include_ppm); + filter_include_png = read_bool_option(f, option, + "filter_png", value, filter_include_png); + filter_include_jpg = read_bool_option(f, option, + "filter_jpg", value, filter_include_jpg); + filter_include_tif = read_bool_option(f, option, + "filter_tif", value, filter_include_tif); + filter_include_pgm = read_bool_option(f, option, + "filter_pgm", value, filter_include_pgm); + filter_include_xpm = read_bool_option(f, option, + "filter_xpm", value, filter_include_xpm); + filter_include_gif = read_bool_option(f, option, + "filter_gif", value, filter_include_gif); + filter_include_pcx = read_bool_option(f, option, + "filter_pcx", value, filter_include_pcx); + filter_include_bmp = read_bool_option(f, option, + "filter_bmp", value, filter_include_bmp); + + custom_filter = read_char_option(f, option, + "custom_filter", value_all, custom_filter); + + /* External Programs */ + + if (!strncasecmp(option,"external_",9)) + { + i = strtol(option + 9, NULL, 0); + if (i>0 && i<9) + { + gchar *ptr1, *ptr2; + i--; + c = 0; + l = strlen(value_all); + ptr1 = value_all; + + g_free(editor_name[i]); + editor_name[i] = NULL; + g_free(editor_command[i]); + editor_command[i] = NULL; + + while (c<l && value_all[c] !='"') c++; + if (ptr1[c] == '"') + { + c++; + ptr2 = ptr1 + c; + while (c<l && value_all[c] !='"') c++; + if (ptr1[c] == '"') + { + ptr1[c] = '\0'; + if (ptr1 + c - 1 != ptr2) + editor_name[i] = g_strdup(ptr2); + c++; + while (c<l && value_all[c] !='"') c++; + if (ptr1[c] == '"') + { + c++; + ptr2 = ptr1 + c; + while (c<l && value_all[c] !='"') c++; + if (ptr1[c] == '"' && ptr1 + c - 1 != ptr2) + { + ptr1[c] = '\0'; + editor_command[i] = g_strdup(ptr2); + } + } + } + } + } + } + + /* window positions */ + + save_window_positions = read_bool_option(f, option, + "restore_window_positions", value, save_window_positions); + + main_window_x = read_int_option(f, option, + "main_window_x", value, main_window_x); + main_window_y = read_int_option(f, option, + "main_window_y", value, main_window_y); + main_window_w = read_int_option(f, option, + "main_window_width", value, main_window_w); + main_window_h = read_int_option(f, option, + "main_window_height", value, main_window_h); + float_window_x = read_int_option(f, option, + "float_window_x", value, float_window_x); + float_window_y = read_int_option(f, option, + "float_window_y", value, float_window_y); + float_window_w = read_int_option(f, option, + "float_window_width", value, float_window_w); + float_window_h = read_int_option(f, option, + "float_window_height", value, float_window_h); + } + + fclose(f); + g_free(rc_path); +} +