enabled commandline again
authorVladimir Nadvornik <nadvornik@suse.cz>
Mon, 23 Feb 2009 21:21:15 +0000 (21:21 +0000)
committerVladimir Nadvornik <nadvornik@suse.cz>
Mon, 23 Feb 2009 21:21:15 +0000 (21:21 +0000)
src/layout.c
src/layout.h
src/main.c
src/options.c
src/options.h
src/rcfile.c
src/rcfile.h
src/typedefs.h

index 2b985c1..d451999 100644 (file)
@@ -2108,6 +2108,8 @@ LayoutWindow *layout_new_with_geometry(FileData *dir_fd, LayoutOptions *lop,
        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 @@ void layout_load_attributes(LayoutOptions *layout, const gchar **attribute_names
 
 }
 
+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)
+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;
 }
index 8a0c909..1ce668d 100644 (file)
@@ -20,7 +20,7 @@ extern GList *layout_window_list;
 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);
index 1c4af3d..129df4a 100644 (file)
@@ -102,12 +102,6 @@ void keyboard_scroll_calc(gint *x, gint *y, GdkEventKey *event)
  *-----------------------------------------------------------------------------
  */
 
-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 @@ static void parse_command_line_process_file(const gchar *file_path, gchar **path
        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 @@ static void parse_command_line(gint argc, gchar *argv[], gchar **path, gchar **f
 
                        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 @@ static void parse_command_line(gint argc, gchar *argv[], gchar **path, gchar **f
                        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 @@ static void parse_command_line(gint argc, gchar *argv[], gchar **path, gchar **f
                                }
                        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 @@ static void parse_command_line(gint argc, gchar *argv[], gchar **path, gchar **f
                        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 @@ static void parse_command_line(gint argc, gchar *argv[], gchar **path, gchar **f
                        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 exit_program(void)
 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 @@ static void setup_sigbus_handler(void)
 
 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 @@ gint main(gint argc, gchar *argv[])
        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;
+               /* broken or no config file */
+               layout_new_from_config(NULL, NULL, TRUE);
                }
-       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();
-               }
-
-       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 @@ gint main(gint argc, gchar *argv[])
                        }
                }
 
-       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 @@ gint main(gint argc, gchar *argv[])
 
                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 @@ gint main(gint argc, gchar *argv[])
                 */
 
                }
-       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);
index ed7786e..38175de 100644 (file)
@@ -258,7 +258,7 @@ void save_options(ConfOptions *options)
        g_free(rc_path);
 }
 
-void load_options(ConfOptions *options)
+gboolean load_options(ConfOptions *options)
 {
        gboolean success;
        gchar *rc_path;
@@ -266,14 +266,15 @@ void load_options(ConfOptions *options)
        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: */
index 0396035..4ac6572 100644 (file)
@@ -209,11 +209,12 @@ struct _ConfOptions
 };
 
 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);
index 6afaddd..f563fa9 100644 (file)
@@ -773,6 +773,12 @@ static void options_load_profile(GQParserData *parser_data, GMarkupParseContext
  * 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(GQParserData *parser_data, GMarkupParseContext
                }
 }
 
-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 @@ static void options_parse_toplevel(GQParserData *parser_data, GMarkupParseContex
        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 @@ struct _GQParserFuncData
        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 @@ static GMarkupParser parser = {
  *-----------------------------------------------------------------------------
  */
 
-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 @@ gboolean load_options_from(const gchar *utf8_path, ConfOptions *options)
                }
        
        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);
index 4d57c52..a46f6ca 100644 (file)
@@ -73,7 +73,7 @@ void options_parse_func_set_data(GQParserData *parser_data, gpointer data);
 
 
 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
index 6b2042d..100db05 100644 (file)
@@ -209,6 +209,8 @@ typedef struct _ExifData ExifData;
 
 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 @@ struct _SecureSaveInfo {
        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: */