view src/img-main.c @ 8:e0d0593d519e

Sync to GQview 1.5.9 release. ######## DO NOT BASE ENHANCEMENTS OR TRANSLATION UPDATES ON CODE IN THIS CVS! This CVS is never up to date with current development and is provided solely for reference purposes, please use the latest official release package when making any changes or translation updates. ########
author gqview
date Sat, 26 Feb 2005 00:07:07 +0000
parents e149abcda4eb
children
line wrap: on
line source

/*
 * GQview image viewer
 * (C)2000 John Ellis
 *
 * Author: John Ellis
 *
 */

#include "gqview.h"
#include "image.h"
#include <gdk/gdkkeysyms.h> /* for keyboard values */

#define BLACK_BACKGROUND 1

/*
 *-----------------------------------------------------------------------------
 * full screen keyboard
 *-----------------------------------------------------------------------------
 */

static gint full_screen_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
{
	ImageWindow *imd = data;
	gint stop_signal = FALSE;
	gint x = 0;
	gint y = 0;

	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 '+': case '=':
			image_area_adjust_zoom(imd, 1);
			break;
		case '-':
			image_area_adjust_zoom(imd, -1);
			break;
		case 'x':
			image_area_set_zoom(imd, 0);
			break;
		case 'z':
			image_area_set_zoom(imd, 1);
			break;
		case GDK_Page_Up:
		case GDK_BackSpace:
			file_prev_image();
			stop_signal = TRUE;
			break;
		case GDK_Page_Down:
		case GDK_space:
			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:
			full_screen_stop();
			file_util_delete(image_area_get_path(imd), NULL);
			stop_signal = TRUE;
			break;
		case GDK_Escape:
			full_screen_stop();
			stop_signal = TRUE;
			break;
		case 'Q': case 'q':
			exit_gqview();
			return FALSE;
                        break;
		case 'S': case 's':
			slideshow_toggle();
			break;
		case 'V': case 'v':
			full_screen_stop();
			break;
		}

	if (event->state & GDK_CONTROL_MASK)
		{
		gint n = -1;
		switch (event->keyval)
			{
			case '1':
				n = 0;
				break;
			case '2':
				n = 1;
				break;
			case '3':
				n = 2;
				break;
			case '4':
				n = 3;
				break;
			case '5':
				n = 4;
				break;
			case '6':
				n = 5;
				break;
			case '7':
				n = 6;
				break;
			case '8':
				n = 7;
				break;
			case 'C': case 'c':
				full_screen_stop();
				file_util_copy(image_area_get_path(imd), NULL, current_path);
				break;
			case 'M': case 'm':
				full_screen_stop();
				file_util_move(image_area_get_path(imd), NULL, current_path);
				break;
			case 'R': case 'r':
				full_screen_stop();
				file_util_rename(image_area_get_path(imd), NULL);
				break;
			case 'D': case 'd':
				full_screen_stop();
				file_util_delete(image_area_get_path(imd), NULL);
				break;
			}
		if (n != -1)
			{
			full_screen_stop();
			start_editor_from_file(n, image_area_get_path(imd));
			}
		}

	if (event->state & GDK_SHIFT_MASK)
		{
		x *= 3;
		y *= 3;
		}

	if (x != 0 || y!= 0)
		{
		keyboard_scroll_calc(&x, &y, event);
		image_area_scroll(imd, x, y);
		}

	return stop_signal;
}

/*
 *----------------------------------------------------------------------------
 * mouse button callbacks
 *----------------------------------------------------------------------------
 */

static void button1_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
{
	file_next_image();
}

static void button2_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
{
	file_prev_image();
}

static void button3_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
{
	if (main_image == normal_image)
		{
		gtk_menu_popup (GTK_MENU(menu_image_popup), NULL, NULL, NULL, NULL,
			bevent->button, bevent->time);
		}
	else
		{
		gtk_menu_popup (GTK_MENU(menu_window_full), NULL, NULL, NULL, NULL,
			bevent->button, bevent->time);
		}
}

static void button4_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
{
	if (mousewheel_scrolls)
		image_area_scroll(imd, 0, -MOUSEWHEEL_SCROLL_SIZE);
	else
		file_prev_image();
}

static void button5_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
{
	if (mousewheel_scrolls)
		image_area_scroll(imd, 0, MOUSEWHEEL_SCROLL_SIZE);
	else
		file_next_image();
}

/*
 *----------------------------------------------------------------------------
 * full screen functions
 *----------------------------------------------------------------------------
 */

static gint full_screen_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
{
	full_screen_stop();
	return TRUE;
}

static gint full_screen_destroy_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
{
	image_area_free(full_screen_image);
	full_screen_image = NULL;

	return FALSE;
}

void full_screen_start()
{
	GtkWidget *window;
	gint w;
	gint h;

	if (full_screen_window) return;

	w = gdk_screen_width();
	h = gdk_screen_height();

	window = gtk_window_new(GTK_WINDOW_POPUP);
	gtk_container_border_width(GTK_CONTAINER(window), 0);
	gtk_signal_connect(GTK_OBJECT(window), "delete_event", (GtkSignalFunc)full_screen_delete_cb, NULL);
	gtk_signal_connect(GTK_OBJECT(window), "destroy_event", (GtkSignalFunc)full_screen_destroy_cb, NULL);

	gtk_window_set_title(GTK_WINDOW(window), _("GQview full screen"));
	gtk_widget_set_usize(window, w, h);

	full_screen_image = image_area_new(NULL);

	gtk_viewport_set_shadow_type (GTK_VIEWPORT(full_screen_image->viewport), GTK_SHADOW_NONE);
	gtk_container_add(GTK_CONTAINER(window), full_screen_image->eventbox);

	/* set background to black */
	if (BLACK_BACKGROUND)
		{
		GtkStyle *style;
		style = gtk_style_copy(gtk_widget_get_style(full_screen_image->eventbox));
		gtk_style_ref(style);
		style->bg[GTK_STATE_NORMAL] = style->black;
		gtk_widget_set_style(full_screen_image->viewport, style);
		gtk_style_unref(style);
		}

	gtk_widget_show_all(full_screen_image->eventbox);

	gtk_signal_connect(GTK_OBJECT(window), "key_press_event", GTK_SIGNAL_FUNC(full_screen_key_press_cb), full_screen_image);

	image_area_set_image(full_screen_image, image_get_path(), image_area_get_zoom(normal_image));

	gtk_widget_show(window);
	gdk_keyboard_grab(window->window, TRUE, GDK_CURRENT_TIME);

	/* hide normal window
	 * FIXME: properly restore this window on show
	 */
	gtk_widget_hide(mainwindow);
	image_area_set_image(normal_image, NULL, image_area_get_zoom(normal_image));

	full_screen_window = window;

	image_area_set_button(full_screen_image, 1, button1_cb, NULL);
	image_area_set_button(full_screen_image, 2, button2_cb, NULL);
	image_area_set_button(full_screen_image, 3, button3_cb, NULL);
	/* for wheel mice */
	image_area_set_button(full_screen_image, 4, button4_cb, NULL);
	image_area_set_button(full_screen_image, 5, button5_cb, NULL);

	main_image = full_screen_image;
}

void full_screen_stop()
{
	if (!full_screen_window) return;

	gdk_keyboard_ungrab (GDK_CURRENT_TIME);

	image_area_set_image(normal_image, image_get_path(), image_area_get_zoom(full_screen_image));
	main_image = normal_image;

	gtk_widget_destroy(full_screen_window);
	full_screen_window = NULL;

	image_area_free(full_screen_image);
	full_screen_image = NULL;

	gtk_widget_show(mainwindow);

}

void full_screen_toggle()
{
	if (full_screen_window)
		{
		full_screen_stop();
		}
	else
		{
		full_screen_start();
		}
}

/*
 *----------------------------------------------------------------------------
 * main image manipulation
 *----------------------------------------------------------------------------
 */

void image_scroll(gint x, gint y)
{
	image_area_scroll(main_image, x, y);
}

void image_adjust_zoom(gint increment)
{
	image_area_adjust_zoom(main_image, increment);
}

void image_set_zoom(gint zoom)
{
	image_area_set_zoom(main_image, zoom);
}

void image_set_path(gchar *path)
{
	image_area_set_path(main_image, path);
}

gchar *image_get_path()
{
	return image_area_get_path(main_image);
}

gchar *image_get_name()
{
	return image_area_get_name(main_image);
}

void image_change_to(gchar *path)
{
	image_area_set_image(main_image, path, get_default_zoom(main_image));
}

void image_set_labels(GtkWidget *info, GtkWidget *zoom)
{
	image_area_set_labels(normal_image, info, zoom);
}

GtkWidget *image_create()
{
	normal_image = image_area_new(mainwindow);

	main_image = normal_image;

	image_area_set_button(main_image, 1, button1_cb, NULL);
	image_area_set_button(main_image, 2, button2_cb, NULL);
	image_area_set_button(main_image, 3, button3_cb, NULL);
	/* for wheel mice */
	image_area_set_button(main_image, 4, button4_cb, NULL);
	image_area_set_button(main_image, 5, button5_cb, NULL);

	return main_image->eventbox;
}

void image_to_root()
{
	image_area_to_root(main_image, (image_area_get_zoom(main_image) == 0));
}