Syncing to 0.8.1
[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 static void button4_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
196 {
197         if (mousewheel_scrolls)
198                 image_area_scroll(imd, 0, -MOUSEWHEEL_SCROLL_SIZE);
199         else
200                 file_prev_image();
201 }
202
203 static void button5_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
204 {
205         if (mousewheel_scrolls)
206                 image_area_scroll(imd, 0, MOUSEWHEEL_SCROLL_SIZE);
207         else
208                 file_next_image();
209 }
210
211 /*
212  *----------------------------------------------------------------------------
213  * full screen functions
214  *----------------------------------------------------------------------------
215  */
216
217 static gint full_screen_delete_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
218 {
219         full_screen_stop();
220         return TRUE;
221 }
222
223 static gint full_screen_destroy_cb(GtkWidget *widget, GdkEventAny *event, gpointer data)
224 {
225         image_area_free(full_screen_image);
226         full_screen_image = NULL;
227
228         return FALSE;
229 }
230
231 void full_screen_start()
232 {
233         GtkWidget *window;
234         gint w;
235         gint h;
236
237         if (full_screen_window) return;
238
239         w = gdk_screen_width();
240         h = gdk_screen_height();
241
242         window = gtk_window_new(GTK_WINDOW_POPUP);
243         gtk_container_border_width(GTK_CONTAINER(window), 0);
244         gtk_signal_connect(GTK_OBJECT(window), "delete_event", (GtkSignalFunc)full_screen_delete_cb, NULL);
245         gtk_signal_connect(GTK_OBJECT(window), "destroy_event", (GtkSignalFunc)full_screen_destroy_cb, NULL);
246
247         gtk_window_set_title(GTK_WINDOW(window), _("GQview full screen"));
248         gtk_widget_set_usize(window, w, h);
249
250         full_screen_image = image_area_new(NULL);
251
252         gtk_viewport_set_shadow_type (GTK_VIEWPORT(full_screen_image->viewport), GTK_SHADOW_NONE);
253         gtk_container_add(GTK_CONTAINER(window), full_screen_image->eventbox);
254
255         /* set background to black */
256         if (BLACK_BACKGROUND)
257                 {
258                 GtkStyle *style;
259                 style = gtk_style_copy(gtk_widget_get_style(full_screen_image->eventbox));
260                 gtk_style_ref(style);
261                 style->bg[GTK_STATE_NORMAL] = style->black;
262                 gtk_widget_set_style(full_screen_image->viewport, style);
263                 gtk_style_unref(style);
264                 }
265
266         gtk_widget_show_all(full_screen_image->eventbox);
267
268         gtk_signal_connect(GTK_OBJECT(window), "key_press_event", GTK_SIGNAL_FUNC(full_screen_key_press_cb), full_screen_image);
269
270         image_area_set_image(full_screen_image, image_get_path(), image_area_get_zoom(normal_image));
271
272         gtk_widget_show(window);
273         gdk_keyboard_grab(window->window, TRUE, GDK_CURRENT_TIME);
274
275         /* hide normal window
276          * FIXME: properly restore this window on show
277          */
278         gtk_widget_hide(mainwindow);
279         image_area_set_image(normal_image, NULL, image_area_get_zoom(normal_image));
280
281         full_screen_window = window;
282
283         image_area_set_button(full_screen_image, 1, button1_cb, NULL);
284         image_area_set_button(full_screen_image, 2, button2_cb, NULL);
285         image_area_set_button(full_screen_image, 3, button3_cb, NULL);
286         /* for wheel mice */
287         image_area_set_button(full_screen_image, 4, button4_cb, NULL);
288         image_area_set_button(full_screen_image, 5, button5_cb, NULL);
289
290         main_image = full_screen_image;
291 }
292
293 void full_screen_stop()
294 {
295         if (!full_screen_window) return;
296
297         gdk_keyboard_ungrab (GDK_CURRENT_TIME);
298
299         image_area_set_image(normal_image, image_get_path(), image_area_get_zoom(full_screen_image));
300         main_image = normal_image;
301
302         gtk_widget_destroy(full_screen_window);
303         full_screen_window = NULL;
304
305         image_area_free(full_screen_image);
306         full_screen_image = NULL;
307
308         gtk_widget_show(mainwindow);
309
310 }
311
312 void full_screen_toggle()
313 {
314         if (full_screen_window)
315                 {
316                 full_screen_stop();
317                 }
318         else
319                 {
320                 full_screen_start();
321                 }
322 }
323
324 /*
325  *----------------------------------------------------------------------------
326  * main image manipulation
327  *----------------------------------------------------------------------------
328  */
329
330 void image_scroll(gint x, gint y)
331 {
332         image_area_scroll(main_image, x, y);
333 }
334
335 void image_adjust_zoom(gint increment)
336 {
337         image_area_adjust_zoom(main_image, increment);
338 }
339
340 void image_set_zoom(gint zoom)
341 {
342         image_area_set_zoom(main_image, zoom);
343 }
344
345 void image_set_path(gchar *path)
346 {
347         image_area_set_path(main_image, path);
348 }
349
350 gchar *image_get_path()
351 {
352         return image_area_get_path(main_image);
353 }
354
355 gchar *image_get_name()
356 {
357         return image_area_get_name(main_image);
358 }
359
360 void image_change_to(gchar *path)
361 {
362         image_area_set_image(main_image, path, get_default_zoom(main_image));
363 }
364
365 void image_set_labels(GtkWidget *info, GtkWidget *zoom)
366 {
367         image_area_set_labels(normal_image, info, zoom);
368 }
369
370 GtkWidget *image_create()
371 {
372         normal_image = image_area_new(mainwindow);
373
374         main_image = normal_image;
375
376         image_area_set_button(main_image, 1, button1_cb, NULL);
377         image_area_set_button(main_image, 2, button2_cb, NULL);
378         image_area_set_button(main_image, 3, button3_cb, NULL);
379         /* for wheel mice */
380         image_area_set_button(main_image, 4, button4_cb, NULL);
381         image_area_set_button(main_image, 5, button5_cb, NULL);
382
383         return main_image->eventbox;
384 }
385
386 void image_to_root()
387 {
388         image_area_to_root(main_image, (image_area_get_zoom(main_image) == 0));
389 }
390