1
|
1 /*
|
|
2 * GQview image viewer
|
3
|
3 * (C)2000 John Ellis
|
1
|
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 /*
|
|
14 *-----------------------------------------------------------------------------
|
|
15 * view window keyboard
|
|
16 *-----------------------------------------------------------------------------
|
|
17 */
|
|
18
|
|
19 static gint view_window_key_press_cb(GtkWidget *widget, GdkEventKey *event, gpointer data)
|
|
20 {
|
|
21 ImageWindow *imd = data;
|
|
22 gint stop_signal = FALSE;
|
|
23 gint x = 0;
|
|
24 gint y = 0;
|
|
25
|
|
26 switch (event->keyval)
|
|
27 {
|
|
28 case GDK_Left:
|
|
29 x -= 1;
|
|
30 stop_signal = TRUE;
|
|
31 break;
|
|
32 case GDK_Right:
|
|
33 x += 1;
|
|
34 stop_signal = TRUE;
|
|
35 break;
|
|
36 case GDK_Up:
|
|
37 y -= 1;
|
|
38 stop_signal = TRUE;
|
|
39 break;
|
|
40 case GDK_Down:
|
|
41 y += 1;
|
|
42 stop_signal = TRUE;
|
|
43 break;
|
|
44 case '+': case '=':
|
|
45 image_area_adjust_zoom(imd, 1);
|
|
46 break;
|
|
47 case '-':
|
|
48 image_area_adjust_zoom(imd, -1);
|
|
49 break;
|
|
50 case 'x':
|
|
51 image_area_set_zoom(imd, 0);
|
|
52 break;
|
|
53 case 'z':
|
|
54 image_area_set_zoom(imd, 1);
|
|
55 break;
|
|
56 case GDK_Delete:
|
|
57 file_util_delete(image_area_get_path(imd), NULL);
|
|
58 stop_signal = TRUE;
|
|
59 break;
|
|
60 case GDK_Escape:
|
|
61 gtk_widget_destroy(imd->top_window);
|
|
62 stop_signal = TRUE;
|
|
63 break;
|
|
64 }
|
|
65
|
|
66 if (event->state & GDK_CONTROL_MASK)
|
|
67 {
|
|
68 gint n = -1;
|
|
69 switch (event->keyval)
|
|
70 {
|
|
71 case '1':
|
|
72 n = 0;
|
|
73 break;
|
|
74 case '2':
|
|
75 n = 1;
|
|
76 break;
|
|
77 case '3':
|
|
78 n = 2;
|
|
79 break;
|
|
80 case '4':
|
|
81 n = 3;
|
|
82 break;
|
|
83 case '5':
|
|
84 n = 4;
|
|
85 break;
|
|
86 case '6':
|
|
87 n = 5;
|
|
88 break;
|
|
89 case '7':
|
|
90 n = 6;
|
|
91 break;
|
|
92 case '8':
|
|
93 n = 7;
|
|
94 break;
|
|
95 }
|
|
96 if (n != -1)
|
|
97 {
|
|
98 start_editor_from_file(n, image_area_get_path(imd));
|
|
99 }
|
|
100 }
|
|
101
|
|
102 if (event->state & GDK_SHIFT_MASK)
|
|
103 {
|
|
104 x *= 3;
|
|
105 y *= 3;
|
|
106 }
|
|
107
|
|
108 if (x != 0 || y!= 0)
|
|
109 {
|
|
110 keyboard_scroll_calc(&x, &y, event);
|
|
111 image_area_scroll(imd, x, y);
|
|
112 }
|
|
113
|
|
114 return stop_signal;
|
|
115 }
|
|
116
|
|
117 /*
|
|
118 *-----------------------------------------------------------------------------
|
|
119 * view window main routines
|
|
120 *-----------------------------------------------------------------------------
|
|
121 */
|
|
122
|
|
123 static void button3_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
|
|
124 {
|
|
125 gtk_object_set_data(GTK_OBJECT(menu_window_view), "view_active", imd);
|
|
126 gtk_menu_popup (GTK_MENU(menu_window_view), NULL, NULL, NULL, NULL,
|
|
127 bevent->button, bevent->time);
|
|
128 }
|
|
129
|
4
|
130 static void button4_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
|
|
131 {
|
|
132 if (mousewheel_scrolls)
|
|
133 image_area_scroll(imd, 0, -MOUSEWHEEL_SCROLL_SIZE);
|
|
134 }
|
|
135
|
|
136 static void button5_cb(ImageWindow *imd, GdkEventButton *bevent, gpointer data)
|
|
137 {
|
|
138 if (mousewheel_scrolls)
|
|
139 image_area_scroll(imd, 0, MOUSEWHEEL_SCROLL_SIZE);
|
|
140 }
|
|
141
|
1
|
142 static gint view_window_delete_cb(GtkWidget *w, GdkEventAny *event, gpointer data)
|
|
143 {
|
|
144 gtk_widget_destroy(w);
|
|
145 return TRUE;
|
|
146 }
|
|
147
|
|
148 static gint view_window_destroy_cb(GtkWidget *w, GdkEventAny *event, gpointer data)
|
|
149 {
|
|
150 ImageWindow *imd = data;
|
|
151 image_area_free(imd);
|
|
152 return FALSE;
|
|
153 }
|
|
154
|
|
155 void view_window_new(gchar *path)
|
|
156 {
|
|
157 GtkWidget *window;
|
|
158 ImageWindow *imd;
|
|
159 GtkAllocation req_size;
|
|
160 gint w, h;
|
|
161 if (!path) return;
|
|
162
|
|
163 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
|
164 gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE);
|
|
165 gtk_window_set_title (GTK_WINDOW (window), "GQview");
|
|
166 gtk_window_set_wmclass(GTK_WINDOW (window), "view", "GQview");
|
|
167 gtk_container_border_width (GTK_CONTAINER (window), 0);
|
|
168
|
|
169 imd = image_area_new(NULL);
|
|
170 image_area_set_topwindow(imd, window, NULL, TRUE);
|
|
171 gtk_container_add(GTK_CONTAINER(window), imd->eventbox);
|
|
172 gtk_viewport_set_shadow_type (GTK_VIEWPORT(imd->viewport), GTK_SHADOW_NONE);
|
|
173 gtk_container_border_width (GTK_CONTAINER (imd->viewport), 0);
|
|
174 gtk_widget_show_all(imd->eventbox);
|
|
175
|
|
176 image_dnd_init(imd);
|
|
177
|
|
178 image_area_set_button(imd, 3, button3_cb, NULL);
|
4
|
179 /* for wheel mice */
|
|
180 image_area_set_button(imd, 4, button4_cb, NULL);
|
|
181 image_area_set_button(imd, 5, button5_cb, NULL);
|
|
182
|
1
|
183
|
|
184 gtk_signal_connect(GTK_OBJECT(window), "delete_event", (GtkSignalFunc) view_window_delete_cb, NULL);
|
|
185 gtk_signal_connect(GTK_OBJECT(window), "destroy_event", (GtkSignalFunc) view_window_destroy_cb, imd);
|
|
186 gtk_signal_connect(GTK_OBJECT(window), "key_press_event", GTK_SIGNAL_FUNC(view_window_key_press_cb), imd);
|
|
187
|
|
188 image_area_set_image(imd, path, get_default_zoom(NULL));
|
|
189
|
|
190 w = imd->width;
|
|
191 h = imd->height;
|
|
192 if (limit_window_size)
|
|
193 {
|
|
194 gint mw = gdk_screen_width() * max_window_size / 100;
|
|
195 gint mh = gdk_screen_height() * max_window_size / 100;
|
|
196
|
|
197 if (w > mw) w = mw;
|
|
198 if (h > mh) h = mh;
|
|
199 }
|
|
200
|
|
201 gtk_window_set_default_size (GTK_WINDOW(window), w, h);
|
|
202 req_size.x = req_size.y = 0;
|
|
203 req_size.width = w;
|
|
204 req_size.height = h;
|
|
205 gtk_widget_size_allocate(GTK_WIDGET(window), &req_size);
|
|
206
|
|
207 gtk_widget_set_usize(imd->eventbox, w, h);
|
|
208
|
|
209 gtk_widget_show(window);
|
|
210 }
|
|
211
|
|
212 /*
|
|
213 *-----------------------------------------------------------------------------
|
|
214 * view window menu routines and callbacks
|
|
215 *-----------------------------------------------------------------------------
|
|
216 */
|
|
217
|
|
218 static ImageWindow *view_window_get_active()
|
|
219 {
|
|
220 return gtk_object_get_data(GTK_OBJECT(menu_window_view), "view_active");
|
|
221 }
|
|
222
|
|
223 void view_window_active_edit(gint n)
|
|
224 {
|
|
225 ImageWindow *imd = view_window_get_active();
|
|
226 if (!imd) return;
|
|
227 start_editor_from_file(n, image_area_get_path(imd));
|
|
228 }
|
|
229
|
3
|
230 void view_window_active_to_root(gint n)
|
|
231 {
|
|
232 ImageWindow *imd = view_window_get_active();
|
|
233 if (!imd) return;
|
|
234 image_area_to_root(imd, (image_area_get_zoom(imd) == 0));
|
|
235 }
|
|
236
|
1
|
237 static void view_zoom_in_cb(GtkWidget *widget, gpointer data)
|
|
238 {
|
|
239 ImageWindow *imd = view_window_get_active();
|
|
240 if (!imd) return;
|
|
241 image_area_adjust_zoom(imd, 1);
|
|
242 }
|
|
243
|
|
244 static void view_zoom_out_cb(GtkWidget *widget, gpointer data)
|
|
245 {
|
|
246 ImageWindow *imd = view_window_get_active();
|
|
247 if (!imd) return;
|
|
248 image_area_adjust_zoom(imd, -1);
|
|
249 }
|
|
250
|
|
251 static void view_zoom_1_1_cb(GtkWidget *widget, gpointer data)
|
|
252 {
|
|
253 ImageWindow *imd = view_window_get_active();
|
|
254 if (!imd) return;
|
|
255 image_area_set_zoom(imd, 1);
|
|
256 }
|
|
257
|
|
258 static void view_zoom_fit_cb(GtkWidget *widget, gpointer data)
|
|
259 {
|
|
260 ImageWindow *imd = view_window_get_active();
|
|
261 if (!imd) return;
|
|
262 image_area_set_zoom(imd, 0);
|
|
263 }
|
|
264
|
|
265 static void view_copy_cb(GtkWidget *widget, gpointer data)
|
|
266 {
|
|
267 ImageWindow *imd = view_window_get_active();
|
|
268 if (!imd) return;
|
|
269 file_util_copy(image_area_get_path(imd), NULL, current_path);
|
|
270 }
|
|
271
|
|
272 static void view_move_cb(GtkWidget *widget, gpointer data)
|
|
273 {
|
|
274 ImageWindow *imd = view_window_get_active();
|
|
275 if (!imd) return;
|
|
276 file_util_move(image_area_get_path(imd), NULL, current_path);
|
|
277 }
|
|
278
|
|
279 static void view_rename_cb(GtkWidget *widget, gpointer data)
|
|
280 {
|
|
281 ImageWindow *imd = view_window_get_active();
|
|
282 if (!imd) return;
|
|
283 file_util_rename(image_area_get_path(imd), NULL);
|
|
284 }
|
|
285
|
|
286 static void view_delete_cb(GtkWidget *widget, gpointer data)
|
|
287 {
|
|
288 ImageWindow *imd = view_window_get_active();
|
|
289 if (!imd) return;
|
|
290 file_util_delete(image_area_get_path(imd), NULL);
|
|
291 }
|
|
292
|
|
293 static void view_close_cb(GtkWidget *widget, gpointer data)
|
|
294 {
|
|
295 ImageWindow *imd = view_window_get_active();
|
|
296 if (!imd) return;
|
|
297 gtk_widget_destroy(imd->top_window);
|
|
298 }
|
|
299
|
|
300 void create_menu_view_popup()
|
|
301 {
|
|
302 menu_window_view = gtk_menu_new();
|
|
303 add_menu_popup_item(menu_window_view, _("Zoom in"), view_zoom_in_cb, NULL);
|
|
304 add_menu_popup_item(menu_window_view, _("Zoom out"), view_zoom_out_cb, NULL);
|
|
305 add_menu_popup_item(menu_window_view, _("Zoom 1:1"), view_zoom_1_1_cb, NULL);
|
|
306 add_menu_popup_item(menu_window_view, _("Fit image to window"), view_zoom_fit_cb, NULL);
|
|
307 add_menu_divider(menu_window_view);
|
|
308
|
|
309 menu_window_view_edit = gtk_menu_item_new_with_label(_("Edit"));
|
|
310 gtk_menu_append(GTK_MENU(menu_window_view), menu_window_view_edit);
|
|
311 gtk_widget_show(menu_window_view_edit);
|
|
312
|
|
313 add_menu_divider(menu_window_view);
|
|
314 add_menu_popup_item(menu_window_view, _("Copy..."), view_copy_cb, NULL);
|
|
315 add_menu_popup_item(menu_window_view, _("Move..."), view_move_cb, NULL);
|
|
316 add_menu_popup_item(menu_window_view, _("Rename..."), view_rename_cb, NULL);
|
|
317 add_menu_popup_item(menu_window_view, _("Delete..."), view_delete_cb, NULL);
|
|
318
|
|
319 add_menu_divider(menu_window_view);
|
|
320 add_menu_popup_item(menu_window_view, _("Close window"), view_close_cb, NULL);
|
|
321 }
|
|
322
|
|
323
|