diff src/main.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/main.c	Mon Apr 03 18:24:05 2000 +0000
@@ -0,0 +1,436 @@
+/*
+ * GQview image viewer
+ * (C)1999 John Ellis
+ *
+ * Author: John Ellis
+ *
+ */
+
+#include "gqview.h"
+#include <gdk/gdkkeysyms.h> /* for keyboard values */
+
+static void parse_command_line(int argc, char *argv[], gchar **path, gchar **file);
+static void setup_default_options();
+
+/*
+ *-----------------------------------------------------------------------------
+ * path manipulation routines (public)
+ *-----------------------------------------------------------------------------
+ */ 
+
+gchar *filename_from_path(char *t)
+{
+	char *p;
+
+	p = t + strlen(t);
+	while(p > t && p[0] != '/') p--;
+	if (p[0] == '/') p++;
+	return p;
+}
+
+gchar *remove_level_from_path(gchar *path)
+{
+	gchar *new_path;
+	gchar *ptr = path;
+	gint p;
+
+	if (!path) return NULL;
+
+	p = strlen(path) - 1;
+	if (p < 0) return NULL;
+	while(ptr[p] != '/' && p > 0) p--;
+	if (p == 0 && ptr[p] == '/') p++;
+	new_path = g_strndup(path, (guint)p);
+	return new_path;
+}
+
+void parse_out_relatives(gchar *path)
+{
+	gint s, t;
+
+	if (!path) return;
+
+	s = t = 0;
+
+	while (path[s] != '\0')
+		{
+		if (path[s] == '/' && path[s+1] == '.' && (path[s+2] == '/' || path[s+2] == '\0') )
+			{
+			s += 2;
+			}
+		else if (path[s] == '/' && path[s+1] == '.' && path[s+2] == '.' && (path[s+3] == '/' || path[s+3] == '\0') )
+			{
+			s += 3;
+			if (t > 0) t--;
+			while (path[t] != '/' && t > 0) t--;
+			}
+		else
+			{
+			if (s != t) path[t] = path[s];
+			t++;
+			s++;
+			}
+		}
+	if (t == 0 && path[t] == '/') t++;
+	if (t > 1 && path[t-1] == '/') t--;
+	path[t] = '\0';
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * external editor start routines (public)
+ *-----------------------------------------------------------------------------
+ */ 
+
+void start_editor_from_file(gint n, gchar *path)
+{
+	gchar *cmd;
+	if (!path) return;
+	cmd = g_strdup_printf("%s \"%s\" &", editor_command[n], path);
+	printf(_("GQview running: %s\n"),cmd);
+	system(cmd);
+	g_free(cmd);
+}
+
+void start_editor_from_image(gint n)
+{
+	start_editor_from_file(n, image_get_path());
+}
+
+void start_editor_from_list(gint n)
+{
+	gchar *cmd;
+	gchar *buf;
+	GList *list = file_get_selected_list();
+	GList *work;
+	if (!list) return;
+	work = list;
+	cmd = g_strconcat(editor_command[n], " ", NULL);
+	while(work)
+		{
+		buf = cmd;
+		cmd = g_strconcat(buf, "\"", work->data, "\" ", NULL);
+		g_free(buf);
+		work = work->next;
+		}
+	buf = cmd;
+	cmd = g_strconcat(buf, "&", NULL);
+	g_free(buf);
+	printf(_("GQview running: %s\n"),cmd);
+	system(cmd);
+	g_free(cmd);
+	free_selected_list(list);
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * keyboard functions
+ *-----------------------------------------------------------------------------
+ */
+
+void keyboard_scroll_calc(gint *x, gint *y, GdkEventKey *event)
+{
+	static gint delta = 0;
+	static guint32 time_old = 0;
+	static guint keyval_old = 0;
+
+	if (progressive_key_scrolling)
+		{
+		guint32 time_diff;
+
+		time_diff = event->time - time_old;
+
+		/* key pressed within 125ms ? (1/8 second) */
+		if (time_diff > 125 || event->keyval != keyval_old) delta = 0;
+
+		time_old = event->time;
+		keyval_old = event->keyval;
+
+		delta += 2;
+		}
+	else
+		{
+		delta = 8;
+		}
+
+	*x = *x * delta;
+	*y = *y * delta;
+}
+
+gint key_press_cb(GtkWidget *widget, GdkEventKey *event)
+{
+	gint stop_signal = FALSE;
+	gint x = 0;
+	gint y = 0;
+
+	if (GTK_WIDGET_HAS_FOCUS(path_entry))
+		{
+		if (event->keyval == GDK_Escape)
+			gtk_entry_set_text(GTK_ENTRY(path_entry), current_path);
+		return stop_signal;
+		}
+
+	if (full_screen_window || GTK_WIDGET_HAS_FOCUS(main_image->viewport))
+		{
+		switch (event->keyval)
+			{
+			case GDK_Left:
+				x -= 1;
+				stop_signal = TRUE;
+				break;
+			case GDK_Right:
+				x += 1;
+				stop_signal = TRUE;
+				break;
+			case GDK_Up:
+				y -= 1;
+				stop_signal = TRUE;
+				break;
+			case GDK_Down:
+				y += 1;
+				stop_signal = TRUE;
+				break;
+			case GDK_BackSpace:
+				file_prev_image();
+				stop_signal = TRUE;
+				break;
+			case GDK_space:
+				file_next_image();
+				stop_signal = TRUE;
+				break;
+			}
+		}
+
+	switch (event->keyval)
+		{
+		case '+':
+			image_adjust_zoom(1);
+			break;
+		case GDK_Page_Up:
+			file_prev_image();
+			stop_signal = TRUE;
+			break;
+		case GDK_Page_Down:
+			file_next_image();
+			stop_signal = TRUE;
+			break;
+		case GDK_Home:
+			file_first_image();
+			stop_signal = TRUE;
+			break;
+		case GDK_End:
+			file_last_image();
+			stop_signal = TRUE;
+			break;
+		case GDK_Delete:
+			file_util_delete(image_get_path(), NULL);
+			stop_signal = TRUE;
+			break;
+		case GDK_Escape:
+			interrupt_thumbs();
+			stop_signal = TRUE;
+			break;
+		case 'Q': case 'q':
+			if (event->state == 0 || (event->state & GDK_MODIFIER_MASK) == GDK_LOCK_MASK)
+				{
+				exit_gqview();
+				return FALSE;
+				}
+			break;
+		}
+
+	if (event->state & GDK_SHIFT_MASK)
+		{
+		x *= 3;
+		y *= 3;
+		}
+
+	if (x != 0 || y!= 0)
+		{
+		keyboard_scroll_calc(&x, &y, event);
+		image_scroll(x, y);
+		}
+
+	if (stop_signal) gtk_signal_emit_stop_by_name(GTK_OBJECT(widget), "key_press_event");
+
+	return stop_signal;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * command line parser (private)
+ *-----------------------------------------------------------------------------
+ */ 
+
+static void parse_command_line(int argc, char *argv[], gchar **path, gchar **file)
+{
+	if (argc > 1)
+		{
+		gint i;
+		gchar *base_dir = get_current_dir();
+		i = 1;
+		while (i < argc)
+			{
+			gchar *cmd_line = argv[i];
+			gchar *cmd_all = g_strconcat(base_dir, "/", cmd_line, NULL);
+
+			if (!*path && cmd_line[0] == '/' && isdir(cmd_line))
+				{
+				*path = g_strdup(cmd_line);
+				}
+			else if (!*path && isdir(cmd_all))
+				{
+				*path = g_strdup(cmd_all);
+				}
+			else if (!*file && cmd_line[0] == '/' && isfile(cmd_line))
+				{
+				g_free(*path);
+				*path = remove_level_from_path(cmd_line);
+				*file = g_strdup(cmd_line);
+				}
+			else if (!*file && isfile(cmd_all))
+				{
+				g_free(*path);
+				*path = remove_level_from_path(cmd_all);
+				*file = g_strdup(cmd_all);
+				}
+			else if (strcmp(cmd_line, "-debug") == 0)
+				{
+				debug = TRUE;
+				printf("debugging output enabled\n");
+				}
+			else if (strcmp(cmd_line, "+t") == 0 ||
+				 strcmp(cmd_line, "+tools") == 0)
+				{
+				tools_float = FALSE;
+				tools_hidden = FALSE;
+				}
+			else if (strcmp(cmd_line, "-t") == 0 ||
+				 strcmp(cmd_line, "-tools") == 0)
+				{
+				tools_hidden = TRUE;
+				}
+			else if (strcmp(cmd_line, "-help") == 0)
+				{
+				printf("GQview version %s\n", VERSION);
+				printf(_("Usage: gqview [options] [path]\n\n"));
+				printf(_("valid options are:\n"));
+				printf(_("  +t, +tools                 force show of tools\n"));
+				printf(_("  -t, -tools                 force hide of tools\n"));
+				printf(_("  -debug                     turn on debug output\n"));
+				printf(_("  -help                      this message\n\n"));
+				exit (0);
+				}
+			else 
+				{
+				printf(_("invalid or ignored: %s\nUse -help for options\n"), cmd_line);
+				}
+			g_free(cmd_all);
+			i++;
+			}
+		g_free(base_dir);
+		parse_out_relatives(*path);
+		parse_out_relatives(*file);
+		}
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ * startup, init, and exit
+ *-----------------------------------------------------------------------------
+ */ 
+
+static void setup_default_options()
+{
+	gint i;
+
+	for(i=0; i<8; i++)
+		{
+		editor_name[i] = NULL;
+		editor_command[i] = NULL;
+		}
+
+	editor_name[0] = g_strdup(_("The Gimp"));
+	editor_command[0] = g_strdup("gimp");
+
+	editor_name[1] = g_strdup(_("Electric Eyes"));
+	editor_command[1] = g_strdup("ee");
+
+	editor_name[2] = g_strdup(_("XV"));
+	editor_command[2] = g_strdup("xv");
+
+	editor_name[3] = g_strdup(_("Xpaint"));
+	editor_command[3] = g_strdup("xpaint");
+
+	custom_filter = g_strdup(".eim;");
+}
+
+void exit_gqview()
+{
+	full_screen_stop();
+
+	gdk_window_get_position (mainwindow->window, &main_window_x, &main_window_y);
+	gdk_window_get_size(mainwindow->window, &main_window_w, &main_window_h);
+
+	if (toolwindow)
+		{
+		gdk_window_get_position (toolwindow->window, &float_window_x, &float_window_y);
+		gdk_window_get_size(toolwindow->window, &float_window_w, &float_window_h);
+		}
+	save_options();
+
+	gtk_main_quit();
+}
+
+int main (int argc, char *argv[])
+{
+	gchar *cmd_path = NULL;
+	gchar *cmd_file = NULL;
+
+	/* setup locale, i18n */
+	gtk_set_locale();
+	bindtextdomain (PACKAGE, LOCALEDIR);
+	textdomain (PACKAGE);
+
+	/* setup random seed for random slideshow */
+        srand (time (0));
+
+	gtk_init (&argc, &argv);
+	gdk_imlib_init();
+
+	/* push the correct color depths to gtk, (for 8-bit psuedo color displays)
+	 * they should be popped, too, I guess...
+	 */
+	gtk_widget_push_visual(gdk_imlib_get_visual());
+	gtk_widget_push_colormap(gdk_imlib_get_colormap());
+
+	setup_default_options();
+	load_options();
+
+	parse_command_line(argc, argv, &cmd_path, &cmd_file);
+
+	if (cmd_path)
+		current_path = g_strdup(cmd_path);
+	else if (startup_path_enable && startup_path && isdir(startup_path))
+		current_path = g_strdup(startup_path);
+	else
+		current_path = get_current_dir();
+
+	create_main_window();
+	update_edit_menus(mainwindow_accel_grp);
+	rebuild_file_filter();
+	filelist_refresh();
+
+	init_dnd();
+
+	while(gtk_events_pending()) gtk_main_iteration();
+	image_change_to(cmd_file);
+
+	g_free(cmd_path);
+	g_free(cmd_file);
+
+	gtk_main ();
+	return 0;
+}
+
+