changeset 1313:1ffa5222dc61

enabled commandline again
author nadvornik
date Mon, 23 Feb 2009 21:21:15 +0000
parents fcf0e7a6143e
children 8cca18bce950
files src/layout.c src/layout.h src/main.c src/options.c src/options.h src/rcfile.c src/rcfile.h src/typedefs.h
diffstat 8 files changed, 178 insertions(+), 144 deletions(-) [+]
line wrap: on
line diff
--- 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;
 }
--- 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);
--- 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);
--- 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: */
--- 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);
--- 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);
--- 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
--- 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: */