871fe06942eb1764916fa898c1e2ed7e641adc8e
[geeqie.git] / src / img-main.c
1 /*
2  * GQview image viewer
3  * (C)2000 John Ellis
4  *
5  * Author: John Ellis
6  *
7  */
8
9 #include "gqview.h"
10 #include "image.h"
11 #include <gdk/gdkkeysyms.h> /* for keyboard values */
12
13 #define BLACK_BACKGROUND 1
14
15 /*
16  *-----------------------------------------------------------------------------
17  * full screen keyboard
18  *-----------------------------------------------------------------------------
19  */
20
21 static gint full_screen_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
22 {
23         ImageWindow *imd = data;
24         gint stop_signal = FALSE;
25         gint x = 0;
26         gint y = 0;
27
28         switch (event->keyval)
29                 {
30                 case GDK_Left:
31                         x -= 1;
32                         stop_signal = TRUE;
33                         break;
34                 case GDK_Right:
35                         x += 1;
36                         stop_signal = TRUE;
37                         break;
38                 case GDK_Up:
39                         y -= 1;
40                         stop_signal = TRUE;
41                         break;
42                 case GDK_Down:
43                         y += 1;
44                         stop_signal = TRUE;
45                         break;
46                 case '+': case '=':
47                         image_area_adjust_zoom(imd, 1);
48                         break;
49                 case '-':
50                         image_area_adjust_zoom(imd, -1);
51                         break;
52                 case 'x':
53                         image_area_set_zoom(imd, 0);
54                         break;
55                 case 'z':
56                         image_area_set_zoom(imd, 1);
57                         break;
58                 case GDK_Page_Up:
59                 case GDK_BackSpace:
60                         file_prev_image();
61                         stop_signal = TRUE;
62                         break;
63                 case GDK_Page_Down:
64                 case GDK_space:
65                         file_next_image();
66                         stop_signal = TRUE;
67                         break;
68                 case GDK_Home:
69                         file_first_image();
70                         stop_signal = TRUE;
71                         break;
72                 case GDK_End:
73                         file_last_image();
74                         stop_signal = TRUE;
75                         break;
76                 case GDK_Delete:
77                         full_screen_stop();
78                         file_util_delete(image_area_get_path(imd), NULL);
79                         stop_signal = TRUE;
80                         break;
81                 case GDK_Escape:
82                         full_screen_stop();
83                         stop_signal = TRUE;
84                         break;
85                 case 'Q': case 'q':
86                         exit_gqview();
87                         return FALSE;
88                         break;
89                 case 'S': case 's':
90                         slideshow_toggle();
91                         break;
92                 case 'V': case 'v':
93                         full_screen_stop();
94                         break;
95                 }
96
97         if (event->state & GDK_CONTROL_MASK)
98                 {
99                 gint n = -1;
100                 switch (event->keyval)
101                         {
102                         case '1':
103                                 n = 0;
104                                 break;
105                         case '2':
106                                 n = 1;
107                                 break;
108                         case '3':
109                                 n = 2;
110                                 break;
111                         case '4':
112                                 n = 3;
113                                 break;
114                         case '5':
115                                 n = 4;
116                                 break;
117                         case '6':
118                                 n = 5;
119                                 break;
120                         case '7':
121                                 n = 6;
122                                 break;
123                         case '8':
124                                 n = 7;
125                                 break;
126                         case 'C': case 'c':
127                                 full_screen_stop();
128                                 file_util_copy(image_area_get_path(imd), NULL, current_path);
129                                 break;
130                         case 'M': case 'm':
131                                 full_screen_stop();
132                                 file_util_move(image_area_get_path(imd), NULL, current_path);
133                                 break;
134                         case 'R': case 'r':
135                                 full_screen_stop();
136                                 file_util_rename(image_area_get_path(imd), NULL);
137                                 break;
138                         case 'D': case 'd':
139                                 full_screen_stop();
140                                 file_util_delete(image_area_get_path(imd), NULL);
141                                 break;
142                         }
143                 if (n != -1)
144                         {
145                         full_screen_stop();
146                         start_editor_from_file(n, image_area_get_path(imd));
147                         }
148                 }
149
150         if (event->state & GDK_SHIFT_MASK)
151                 {
152                 x *= 3;
153                 y *= 3;
154                 }
155
156         if (x != 0 || y!= 0)
157                 {
158                 keyboard_scroll_calc(&x, &y, event);
159                 image_area_scroll(imd, x, y);
160                 }
161
162         return stop_signal;
163 }
164
165 /*
166  *----------------------------------------------------------------------------
167  * mouse button callbacks
168  *----------------------------------------------------------------------------
169  */
170
171 static void button1_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
172 {
173         file_next_image();
174 }
175
176 static void button2_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
177 {
178         file_prev_image();
179 }
180
181 static void button3_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
182 {
183         if (main_image == normal_image)
184                 {
185                 gtk_menu_popup (GTK_MENU(menu_image_popup), NULL, NULL, NULL, NULL,
186                         bevent->button, bevent->time);
187                 }
188         else
189                 {
190                 gtk_menu_popup (GTK_MENU(menu_window_full), NULL, NULL, NULL, NULL,
191                         bevent->button, bevent->time);
192                 }
193 }
194
195 /*
196  *----------------------------------------------------------------------------
197  * full screen functions
198  *----------------------------------------------------------------------------
199  */
200
201 static gint full_screen_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
202 {
203         full_screen_stop();
204         return TRUE;
205 }
206
207 static gint full_screen_destroy_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
208 {
209         image_area_free(full_screen_image);
210         full_screen_image = NULL;
211
212         return FALSE;
213 }
214
215 void full_screen_start()
216 {
217         GtkWidget *window;
218         gint w;
219         gint h;
220
221         if (full_screen_window) return;
222
223         w = gdk_screen_width();
224         h = gdk_screen_height();
225
226         window = gtk_window_new(GTK_WINDOW_POPUP);
227         gtk_container_border_width(GTK_CONTAINER(window), 0);
228         gtk_signal_connect(GTK_OBJECT(window), "delete_event", (GtkSignalFunc)full_screen_delete_cb, NULL);
229         gtk_signal_connect(GTK_OBJECT(window), "destroy_event", (GtkSignalFunc)full_screen_destroy_cb, NULL);
230
231         gtk_window_set_title(GTK_WINDOW(window), _("GQview full screen"));
232         gtk_widget_set_usize(window, w, h);
233
234         full_screen_image = image_area_new(NULL);
235
236         gtk_viewport_set_shadow_type (GTK_VIEWPORT(full_screen_image->viewport), GTK_SHADOW_NONE);
237         gtk_container_add(GTK_CONTAINER(window), full_screen_image->eventbox);
238
239         /* set background to black */
240         if (BLACK_BACKGROUND)
241                 {
242                 GtkStyle *style;
243                 style = gtk_style_copy(gtk_widget_get_style(full_screen_image->eventbox));
244                 gtk_style_ref(style);
245                 style->bg[GTK_STATE_NORMAL] = style->black;
246                 gtk_widget_set_style(full_screen_image->viewport, style);
247                 gtk_style_unref(style);
248                 }
249
250         gtk_widget_show_all(full_screen_image->eventbox);
251
252         gtk_signal_connect(GTK_OBJECT(window), "key_press_event", GTK_SIGNAL_FUNC(full_screen_key_press_cb), full_screen_image);
253
254         image_area_set_image(full_screen_image, image_get_path(), image_area_get_zoom(normal_image));
255
256 /*
257         if (!GTK_WIDGET_REALIZED(window)) gtk_widget_realize(window);
258         gdk_window_set_override_redirect(window->window, TRUE);
259 */
260         gtk_widget_show(window);
261         gdk_keyboard_grab(window->window, TRUE, GDK_CURRENT_TIME);
262
263         /* hide normal window */
264         gtk_widget_hide(mainwindow);
265         image_area_set_image(normal_image, NULL, image_area_get_zoom(normal_image));
266
267         full_screen_window = window;
268
269         image_area_set_button(full_screen_image, 1, button1_cb, NULL);
270         image_area_set_button(full_screen_image, 2, button2_cb, NULL);
271         image_area_set_button(full_screen_image, 3, button3_cb, NULL);
272
273         main_image = full_screen_image;
274 }
275
276 void full_screen_stop()
277 {
278         if (!full_screen_window) return;
279
280         gdk_keyboard_ungrab (GDK_CURRENT_TIME);
281
282         image_area_set_image(normal_image, image_get_path(), image_area_get_zoom(full_screen_image));
283         main_image = normal_image;
284
285         gtk_widget_destroy(full_screen_window);
286         full_screen_window = NULL;
287
288         image_area_free(full_screen_image);
289         full_screen_image = NULL;
290
291         gtk_widget_show(mainwindow);
292 }
293
294 void full_screen_toggle()
295 {
296         if (full_screen_window)
297                 {
298                 full_screen_stop();
299                 }
300         else
301                 {
302                 full_screen_start();
303                 }
304 }
305
306 /*
307  *----------------------------------------------------------------------------
308  * main image manipulation
309  *----------------------------------------------------------------------------
310  */
311
312 void image_scroll(gint x, gint y)
313 {
314         image_area_scroll(main_image, x, y);
315 }
316
317 void image_adjust_zoom(gint increment)
318 {
319         image_area_adjust_zoom(main_image, increment);
320 }
321
322 void image_set_zoom(gint zoom)
323 {
324         image_area_set_zoom(main_image, zoom);
325 }
326
327 void image_set_path(gchar *path)
328 {
329         image_area_set_path(main_image, path);
330 }
331
332 gchar *image_get_path()
333 {
334         return image_area_get_path(main_image);
335 }
336
337 gchar *image_get_name()
338 {
339         return image_area_get_name(main_image);
340 }
341
342 void image_change_to(gchar *path)
343 {
344         image_area_set_image(main_image, path, get_default_zoom(main_image));
345 }
346
347 void image_set_labels(GtkWidget *info, GtkWidget *zoom)
348 {
349         image_area_set_labels(normal_image, info, zoom);
350 }
351
352 GtkWidget *image_create()
353 {
354         normal_image = image_area_new(mainwindow);
355
356         main_image = normal_image;
357
358         image_area_set_button(main_image, 1, button1_cb, NULL);
359         image_area_set_button(main_image, 2, button2_cb, NULL);
360         image_area_set_button(main_image, 3, button3_cb, NULL);
361
362         return main_image->eventbox;
363 }
364
365 void image_to_root()
366 {
367         image_area_to_root(main_image, (image_area_get_zoom(main_image) == 0));
368 }
369