# HG changeset patch # User nadvornik # Date 1235424075 0 # Node ID 1ffa5222dc6100127c7f7fc814ee6131e7aacac7 # Parent fcf0e7a6143ea8965682f1eddaa74c8ec5c6a912 enabled commandline again diff -r fcf0e7a6143e -r 1ffa5222dc61 src/layout.c --- a/src/layout.c Mon Feb 23 17:20:40 2009 +0000 +++ b/src/layout.c Mon Feb 23 21:21:15 2009 +0000 @@ -2108,6 +2108,8 @@ gtk_widget_show(lw->window); layout_tools_hide(lw, lw->options.tools_hidden); + image_osd_set(lw->image, options->image_overlay.common.state | (options->image_overlay.common.show_at_startup ? OSD_SHOW_INFO : OSD_SHOW_NOTHING)); + layout_window_list = g_list_append(layout_window_list, lw); file_data_register_notify_func(layout_image_notify_cb, lw, NOTIFY_PRIORITY_LOW); @@ -2247,19 +2249,73 @@ } - -LayoutWindow *layout_new_from_config(const gchar **attribute_names, const gchar **attribute_values) +static void layout_config_commandline(LayoutOptions *lop, gchar **path) +{ + if (command_line->startup_blank) + { + *path = NULL; + } + else if (command_line->file) + { + *path = g_strdup(command_line->file); + } + else if (command_line->path) + { + *path = g_strdup(command_line->path); + } + else if (options->startup.restore_path && options->startup.path && isdir(options->startup.path)) + { + *path = g_strdup(options->startup.path); + } + else + { + *path = get_current_dir(); + } + + if (command_line->tools_show) + { + lop->tools_float = FALSE; + lop->tools_hidden = FALSE; + } + else if (command_line->tools_hide) + { + lop->tools_hidden = TRUE; + } +} + +LayoutWindow *layout_new_from_config(const gchar **attribute_names, const gchar **attribute_values, gboolean use_commandline) { LayoutOptions lop; LayoutWindow *lw; + gchar *path = NULL; + memset(&lop, 0, sizeof(LayoutOptions)); copy_layout_options(&lop, &options->layout); - layout_load_attributes(&lop, attribute_names, attribute_values); - lw = layout_new(NULL, &lop); + if (attribute_names) layout_load_attributes(&lop, attribute_names, attribute_values); + + if (use_commandline) + { + layout_config_commandline(&lop, &path); + } + else if (options->startup.restore_path && options->startup.path && isdir(options->startup.path)) + { + path = g_strdup(options->startup.path); + } + else + { + path = get_current_dir(); + } + + lw = layout_new_with_geometry(NULL, &lop, use_commandline ? command_line->geometry : NULL); layout_sort_set(lw, options->file_sort.method, options->file_sort.ascending); - layout_set_path(lw, get_current_dir()); // FIXME: use options / cmdline - + layout_set_path(lw, path); + + if (use_commandline && command_line->startup_full_screen) layout_image_full_screen_start(lw); + if (use_commandline && command_line->startup_in_slideshow) layout_image_slideshow_start(lw); + + + g_free(path); free_layout_options_content(&lop); return lw; } diff -r fcf0e7a6143e -r 1ffa5222dc61 src/layout.h --- a/src/layout.h Mon Feb 23 17:20:40 2009 +0000 +++ b/src/layout.h Mon Feb 23 21:21:15 2009 +0000 @@ -20,7 +20,7 @@ LayoutWindow *layout_new(FileData *dir_fd, LayoutOptions *lop); LayoutWindow *layout_new_with_geometry(FileData *dir_fd, LayoutOptions *lop, const gchar *geometry); -LayoutWindow *layout_new_from_config(const gchar **attribute_names, const gchar **attribute_values); +LayoutWindow *layout_new_from_config(const gchar **attribute_names, const gchar **attribute_values, gboolean use_commandline); void layout_close(LayoutWindow *lw); void layout_free(LayoutWindow *lw); diff -r fcf0e7a6143e -r 1ffa5222dc61 src/main.c --- a/src/main.c Mon Feb 23 17:20:40 2009 +0000 +++ b/src/main.c Mon Feb 23 21:21:15 2009 +0000 @@ -102,12 +102,6 @@ *----------------------------------------------------------------------------- */ -static gint startup_blank = FALSE; -static gint startup_full_screen = FALSE; -static gint startup_in_slideshow = FALSE; -static gint startup_command_line_collection = FALSE; - - static void parse_command_line_add_file(const gchar *file_path, gchar **path, gchar **file, GList **list, GList **collection_list) { @@ -198,15 +192,18 @@ parse_command_line_add_file(file_path, path, file, list, collection_list); } -static void parse_command_line(gint argc, gchar *argv[], gchar **path, gchar **file, - GList **cmd_list, GList **collection_list, - gchar **geometry) +static void parse_command_line(gint argc, gchar *argv[]) { GList *list = NULL; GList *remote_list = NULL; GList *remote_errors = NULL; gint remote_do = FALSE; gchar *first_dir = NULL; + + command_line = g_new0(CommandLine, 1); + + command_line->argc = argc; + command_line->argv = argv; if (argc > 1) { @@ -220,21 +217,21 @@ if (cmd_line[0] == G_DIR_SEPARATOR && isdir(cmd_line)) { - parse_command_line_process_dir(cmd_line, path, file, &list, &first_dir); + parse_command_line_process_dir(cmd_line, &command_line->path, &command_line->file, &list, &first_dir); } else if (isdir(cmd_all)) { - parse_command_line_process_dir(cmd_all, path, file, &list, &first_dir); + parse_command_line_process_dir(cmd_all, &command_line->path, &command_line->file, &list, &first_dir); } else if (cmd_line[0] == G_DIR_SEPARATOR && isfile(cmd_line)) { - parse_command_line_process_file(cmd_line, path, file, - &list, collection_list, &first_dir); + parse_command_line_process_file(cmd_line, &command_line->path, &command_line->file, + &list, &command_line->collection_list, &first_dir); } else if (isfile(cmd_all)) { - parse_command_line_process_file(cmd_all, path, file, - &list, collection_list, &first_dir); + parse_command_line_process_file(cmd_all, &command_line->path, &command_line->file, + &list, &command_line->collection_list, &first_dir); } else if (strncmp(cmd_line, "--debug", 7) == 0 && (cmd_line[7] == '\0' || cmd_line[7] == '=')) { @@ -243,36 +240,35 @@ else if (strcmp(cmd_line, "+t") == 0 || strcmp(cmd_line, "--with-tools") == 0) { - options->layout.tools_float = FALSE; - options->layout.tools_hidden = FALSE; + command_line->tools_show = TRUE; remote_list = g_list_append(remote_list, "+t"); } else if (strcmp(cmd_line, "-t") == 0 || strcmp(cmd_line, "--without-tools") == 0) { - options->layout.tools_hidden = TRUE; + command_line->tools_hide = TRUE; remote_list = g_list_append(remote_list, "-t"); } else if (strcmp(cmd_line, "-f") == 0 || strcmp(cmd_line, "--fullscreen") == 0) { - startup_full_screen = TRUE; + command_line->startup_full_screen = TRUE; } else if (strcmp(cmd_line, "-s") == 0 || strcmp(cmd_line, "--slideshow") == 0) { - startup_in_slideshow = TRUE; + command_line->startup_in_slideshow = TRUE; } else if (strcmp(cmd_line, "-l") == 0 || strcmp(cmd_line, "--list") == 0) { - startup_command_line_collection = TRUE; + command_line->startup_command_line_collection = TRUE; } else if (strncmp(cmd_line, "--geometry=", 11) == 0) { - if (!*geometry) *geometry = g_strdup(cmd_line + 11); + if (!command_line->geometry) command_line->geometry = g_strdup(cmd_line + 11); } else if (strcmp(cmd_line, "-r") == 0 || strcmp(cmd_line, "--remote") == 0) @@ -291,7 +287,7 @@ } else if (strcmp(cmd_line, "--blank") == 0) { - startup_blank = TRUE; + command_line->startup_blank = TRUE; } else if (strcmp(cmd_line, "-v") == 0 || strcmp(cmd_line, "--version") == 0) @@ -342,18 +338,18 @@ i++; } g_free(base_dir); - parse_out_relatives(*path); - parse_out_relatives(*file); + parse_out_relatives(command_line->path); + parse_out_relatives(command_line->file); } list = g_list_reverse(list); - if (!*path && first_dir) + if (!command_line->path && first_dir) { - *path = first_dir; + command_line->path = first_dir; first_dir = NULL; - parse_out_relatives(*path); + parse_out_relatives(command_line->path); } g_free(first_dir); @@ -375,18 +371,30 @@ printf_term(_("\nUse --remote-help for valid remote options.\n")); } - remote_control(argv[0], remote_list, *path, list, *collection_list); + remote_control(argv[0], remote_list, command_line->path, list, command_line->collection_list); } g_list_free(remote_list); if (list && list->next) { - *cmd_list = list; + command_line->cmd_list = list; } else { filelist_free(list); - *cmd_list = NULL; + command_line->cmd_list = NULL; + } + + if (command_line->startup_blank) + { + g_free(command_line->path); + command_line->path = NULL; + g_free(command_line->file); + command_line->file = NULL; + filelist_free(command_line->cmd_list); + command_line->cmd_list = NULL; + string_list_free(command_line->collection_list); + command_line->collection_list = NULL; } } @@ -669,16 +677,6 @@ void init_after_global_options(void) { - if (gtk_major_version < GTK_MAJOR_VERSION || - (gtk_major_version == GTK_MAJOR_VERSION && gtk_minor_version < GTK_MINOR_VERSION) ) - { - log_printf("!!! This is a friendly warning.\n"); - log_printf("!!! The version of GTK+ in use now is older than when %s was compiled.\n", GQ_APPNAME); - log_printf("!!! compiled with GTK+-%d.%d\n", GTK_MAJOR_VERSION, GTK_MINOR_VERSION); - log_printf("!!! running with GTK+-%d.%d\n", gtk_major_version, gtk_minor_version); - log_printf("!!! %s may quit unexpectedly with a relocation error.\n", GQ_APPNAME); - } - mkdir_if_not_exists(get_rc_dir()); mkdir_if_not_exists(get_collections_dir()); mkdir_if_not_exists(get_thumbnails_cache_dir()); @@ -725,14 +723,7 @@ gint main(gint argc, gchar *argv[]) { - LayoutWindow *lw; - gchar *path = NULL; - gchar *cmd_path = NULL; - gchar *cmd_file = NULL; - GList *cmd_list = NULL; - GList *collection_list = NULL; CollectionData *first_collection = NULL; - gchar *geometry = NULL; gchar *buf; CollectionData *cd = NULL; @@ -771,58 +762,41 @@ file_data_register_notify_func(histogram_notify_cb, NULL, NOTIFY_PRIORITY_HIGH); file_data_register_notify_func(collect_manager_notify_cb, NULL, NOTIFY_PRIORITY_LOW); + gtkrc_load(); + gtk_init(&argc, &argv); + + if (gtk_major_version < GTK_MAJOR_VERSION || + (gtk_major_version == GTK_MAJOR_VERSION && gtk_minor_version < GTK_MINOR_VERSION) ) + { + log_printf("!!! This is a friendly warning.\n"); + log_printf("!!! The version of GTK+ in use now is older than when %s was compiled.\n", GQ_APPNAME); + log_printf("!!! compiled with GTK+-%d.%d\n", GTK_MAJOR_VERSION, GTK_MINOR_VERSION); + log_printf("!!! running with GTK+-%d.%d\n", gtk_major_version, gtk_minor_version); + log_printf("!!! %s may quit unexpectedly with a relocation error.\n", GQ_APPNAME); + } + parse_command_line_for_debug_option(argc, argv); + parse_command_line(argc, argv); options = init_options(NULL); setup_default_options(options); - gtkrc_load(); //FIXME: move to init_after_global_options() - gtk_init(&argc, &argv); - load_options(options); - /* ^^^ this calls init_after_global_options(); at the right moment*/ + /* load_options calls init_after_global_options() after it parses global options, we have to call it here if it fails*/ + if (!load_options(options)) init_after_global_options(); if (!layout_window_list) - { // FIXME: commandline handling does not work at all, this is a quick workaround for missing rc file - - init_after_global_options(); - parse_command_line(argc, argv, &cmd_path, &cmd_file, &cmd_list, &collection_list, &geometry); - - if (startup_blank) { - g_free(cmd_path); - cmd_path = NULL; - g_free(cmd_file); - cmd_file = NULL; - filelist_free(cmd_list); - cmd_list = NULL; - string_list_free(collection_list); - collection_list = NULL; - - path = NULL; - } - else if (cmd_path) - { - path = g_strdup(cmd_path); - } - else if (options->startup.restore_path && options->startup.path && isdir(options->startup.path)) - { - path = g_strdup(options->startup.path); - } - else - { - path = get_current_dir(); + /* broken or no config file */ + layout_new_from_config(NULL, NULL, TRUE); } - lw = layout_new_with_geometry(NULL, NULL, geometry); - layout_sort_set(lw, options->file_sort.method, options->file_sort.ascending); - - if (collection_list && !startup_command_line_collection) + if (command_line->collection_list && !command_line->startup_command_line_collection) { GList *work; - work = collection_list; + work = command_line->collection_list; while (work) { CollectWindow *cw; @@ -836,12 +810,12 @@ } } - if (cmd_list || - (startup_command_line_collection && collection_list)) + if (command_line->cmd_list || + (command_line->startup_command_line_collection && command_line->collection_list)) { GList *work; - if (startup_command_line_collection) + if (command_line->startup_command_line_collection) { CollectWindow *cw; @@ -860,22 +834,21 @@ collection_path_changed(cd); - work = cmd_list; + work = command_line->cmd_list; while (work) { collection_add(cd, file_data_new_simple((gchar *)work->data), FALSE); work = work->next; } - work = collection_list; + work = command_line->collection_list; while (work) { collection_load(cd, (gchar *)work->data, COLLECTION_LOAD_APPEND); work = work->next; } - layout_set_path(lw, path); - if (cd->list) layout_image_set_collection(lw, cd, cd->list->data); + if (cd->list) layout_image_set_collection(NULL, cd, cd->list->data); /* mem leak, we never unref this collection when !startup_command_line_collection * (the image view of the main window does not hold a ref to the collection) @@ -886,34 +859,12 @@ */ } - else if (cmd_file) - { - layout_set_path(lw, cmd_file); - } - else + else if (first_collection) { - layout_set_path(lw, path); - if (first_collection) - { - layout_image_set_collection(lw, first_collection, - collection_get_first(first_collection)); - } + layout_image_set_collection(NULL, first_collection, + collection_get_first(first_collection)); } - image_osd_set(lw->image, options->image_overlay.common.state | (options->image_overlay.common.show_at_startup ? OSD_SHOW_INFO : OSD_SHOW_NOTHING)); - - } - - g_free(geometry); - g_free(cmd_path); - g_free(cmd_file); - filelist_free(cmd_list); - string_list_free(collection_list); - g_free(path); - - if (startup_full_screen) layout_image_full_screen_start(lw); - if (startup_in_slideshow) layout_image_slideshow_start(lw); - buf = g_build_filename(get_rc_dir(), ".command", NULL); remote_connection = remote_server_init(buf, cd); g_free(buf); diff -r fcf0e7a6143e -r 1ffa5222dc61 src/options.c --- a/src/options.c Mon Feb 23 17:20:40 2009 +0000 +++ b/src/options.c Mon Feb 23 21:21:15 2009 +0000 @@ -258,7 +258,7 @@ g_free(rc_path); } -void load_options(ConfOptions *options) +gboolean load_options(ConfOptions *options) { gboolean success; gchar *rc_path; @@ -266,14 +266,15 @@ if (isdir(GQ_SYSTEM_WIDE_DIR)) { rc_path = g_build_filename(GQ_SYSTEM_WIDE_DIR, RC_FILE_NAME, NULL); - success = load_options_from(rc_path, options); + success = load_options_from(rc_path, options, TRUE); DEBUG_1("Loading options from %s ... %s", rc_path, success ? "done" : "failed"); g_free(rc_path); } rc_path = g_build_filename(get_rc_dir(), RC_FILE_NAME, NULL); - success = load_options_from(rc_path, options); + success = load_options_from(rc_path, options, TRUE); DEBUG_1("Loading options from %s ... %s", rc_path, success ? "done" : "failed"); g_free(rc_path); + return(success); } /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */ diff -r fcf0e7a6143e -r 1ffa5222dc61 src/options.h --- a/src/options.h Mon Feb 23 17:20:40 2009 +0000 +++ b/src/options.h Mon Feb 23 21:21:15 2009 +0000 @@ -209,11 +209,12 @@ }; ConfOptions *options; +CommandLine *command_line; ConfOptions *init_options(ConfOptions *options); void setup_default_options(ConfOptions *options); void save_options(ConfOptions *options); -void load_options(ConfOptions *options); +gboolean load_options(ConfOptions *options); void copy_layout_options(LayoutOptions *dest, const LayoutOptions *src); void free_layout_options_content(LayoutOptions *dest); diff -r fcf0e7a6143e -r 1ffa5222dc61 src/rcfile.c --- a/src/rcfile.c Mon Feb 23 17:20:40 2009 +0000 +++ b/src/rcfile.c Mon Feb 23 21:21:15 2009 +0000 @@ -773,6 +773,12 @@ * xml file structure (private) *----------------------------------------------------------------------------- */ +struct _GQParserData +{ + GList *parse_func_stack; + gboolean startup; /* reading config for the first time - add commandline and call init_after_global_options() */ + gboolean global_found; +}; void options_parse_leaf(GQParserData *parser_data, GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer data, GError **error) @@ -839,12 +845,6 @@ } } -static void options_parse_global_end(GQParserData *parser_data, GMarkupParseContext *context, const gchar *element_name, gpointer data, GError **error) -{ - DEBUG_1(" global end"); - init_after_global_options(); -} - static void options_parse_bar(GQParserData *parser_data, GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer data, GError **error) { GtkWidget *bar = data; @@ -901,12 +901,21 @@ if (g_ascii_strcasecmp(element_name, "global") == 0) { load_global_params(attribute_names, attribute_values); - options_parse_func_push(parser_data, options_parse_global, options_parse_global_end, NULL); + options_parse_func_push(parser_data, options_parse_global, NULL, NULL); + return; } - else if (g_ascii_strcasecmp(element_name, "layout") == 0) + + if (parser_data->startup && !parser_data->global_found) + { + DEBUG_1(" global end"); + parser_data->global_found = TRUE; + init_after_global_options(); + } + + if (g_ascii_strcasecmp(element_name, "layout") == 0) { LayoutWindow *lw; - lw = layout_new_from_config(attribute_names, attribute_values); + lw = layout_new_from_config(attribute_names, attribute_values, parser_data->startup); options_parse_func_push(parser_data, options_parse_layout, NULL, lw); } else @@ -935,11 +944,6 @@ gpointer data; }; -struct _GQParserData -{ - GList *parse_func_stack; -}; - void options_parse_func_push(GQParserData *parser_data, GQParserStartFunc start_func, GQParserEndFunc end_func, gpointer data) { GQParserFuncData *func_data = g_new0(GQParserFuncData, 1); @@ -1007,7 +1011,7 @@ *----------------------------------------------------------------------------- */ -gboolean load_options_from(const gchar *utf8_path, ConfOptions *options) +gboolean load_options_from(const gchar *utf8_path, ConfOptions *options, gboolean startup) { gsize size; gchar *buf; @@ -1021,6 +1025,8 @@ } parser_data = g_new0(GQParserData, 1); + + parser_data->startup = startup; options_parse_func_push(parser_data, options_parse_toplevel, NULL, NULL); context = g_markup_parse_context_new(&parser, 0, parser_data, NULL); diff -r fcf0e7a6143e -r 1ffa5222dc61 src/rcfile.h --- a/src/rcfile.h Mon Feb 23 17:20:40 2009 +0000 +++ b/src/rcfile.h Mon Feb 23 21:21:15 2009 +0000 @@ -73,7 +73,7 @@ gboolean save_options_to(const gchar *utf8_path, ConfOptions *options); -gboolean load_options_from(const gchar *utf8_path, ConfOptions *options); +gboolean load_options_from(const gchar *utf8_path, ConfOptions *options, gboolean startup); #endif diff -r fcf0e7a6143e -r 1ffa5222dc61 src/typedefs.h --- a/src/typedefs.h Mon Feb 23 17:20:40 2009 +0000 +++ b/src/typedefs.h Mon Feb 23 21:21:15 2009 +0000 @@ -209,6 +209,8 @@ typedef struct _EditorDescription EditorDescription; +typedef struct _CommandLine CommandLine; + struct _EditorDescription { gchar *key; /* desktop file name, not including path, including extension */ gchar *name; /* Name, localized name presented to user */ @@ -831,5 +833,22 @@ gint unlink_on_error; /**< whether to remove temporary file on save failure, TRUE by default */ }; +struct _CommandLine +{ + int argc; + gchar **argv; + gboolean startup_blank; + gboolean startup_full_screen; + gboolean startup_in_slideshow; + gboolean startup_command_line_collection; + gboolean tools_hide; + gboolean tools_show; + gchar *path; + gchar *file; + GList *cmd_list; + GList *collection_list; + gchar *geometry; +}; + #endif /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */