1
|
1 /*
|
|
2 * GQview image viewer
|
|
3 * (C)1999 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 /*
|
|
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
|
|
130 static gint view_window_delete_cb(GtkWidget *w, GdkEventAny *event, gpointer data)
|
|
131 {
|
|
132 gtk_widget_destroy(w);
|
|
133 return TRUE;
|
|
134 }
|
|
135
|
|
136 static gint view_window_destroy_cb(GtkWidget *w, GdkEventAny *event, gpointer data)
|
|
137 {
|
|
138 ImageWindow *imd = data;
|
|
139 image_area_free(imd);
|
|
140 return FALSE;
|
|
141 }
|
|
142
|
|
143 void view_window_new(gchar *path)
|
|
144 {
|
|
145 GtkWidget *window;
|
|
146 ImageWindow *imd;
|
|
147 GtkAllocation req_size;
|
|
148 gint w, h;
|
|
149 if (!path) return;
|
|
150
|
|
151 window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
|
152 gtk_window_set_policy(GTK_WINDOW(window), TRUE, TRUE, FALSE);
|
|
153 gtk_window_set_title (GTK_WINDOW (window), "GQview");
|
|
154 gtk_window_set_wmclass(GTK_WINDOW (window), "view", "GQview");
|
|
155 gtk_container_border_width (GTK_CONTAINER (window), 0);
|
|
156
|
|
157 imd = image_area_new(NULL);
|
|
158 image_area_set_topwindow(imd, window, NULL, TRUE);
|
|
159 gtk_container_add(GTK_CONTAINER(window), imd->eventbox);
|
|
160 gtk_viewport_set_shadow_type (GTK_VIEWPORT(imd->viewport), GTK_SHADOW_NONE);
|
|
161 gtk_container_border_width (GTK_CONTAINER (imd->viewport), 0);
|
|
162 gtk_widget_show_all(imd->eventbox);
|
|
163
|
|
164 image_dnd_init(imd);
|
|
165
|
|
166 image_area_set_button(imd, 3, button3_cb, NULL);
|
|
167
|
|
168 gtk_signal_connect(GTK_OBJECT(window), "delete_event", (GtkSignalFunc) view_window_delete_cb, NULL);
|
|
169 gtk_signal_connect(GTK_OBJECT(window), "destroy_event", (GtkSignalFunc) view_window_destroy_cb, imd);
|
|
170 gtk_signal_connect(GTK_OBJECT(window), "key_press_event", GTK_SIGNAL_FUNC(view_window_key_press_cb), imd);
|
|
171
|
|
172 image_area_set_image(imd, path, get_default_zoom(NULL));
|
|
173
|
|
174 w = imd->width;
|
|
175 h = imd->height;
|
|
176 if (limit_window_size)
|
|
177 {
|
|
178 gint mw = gdk_screen_width() * max_window_size / 100;
|
|
179 gint mh = gdk_screen_height() * max_window_size / 100;
|
|
180
|
|
181 if (w > mw) w = mw;
|
|
182 if (h > mh) h = mh;
|
|
183 }
|
|
184
|
|
185 gtk_window_set_default_size (GTK_WINDOW(window), w, h);
|
|
186 req_size.x = req_size.y = 0;
|
|
187 req_size.width = w;
|
|
188 req_size.height = h;
|
|
189 gtk_widget_size_allocate(GTK_WIDGET(window), &req_size);
|
|
190
|
|
191 gtk_widget_set_usize(imd->eventbox, w, h);
|
|
192
|
|
193 gtk_widget_show(window);
|
|
194 }
|
|
195
|
|
196 /*
|
|
197 *-----------------------------------------------------------------------------
|
|
198 * view window menu routines and callbacks
|
|
199 *-----------------------------------------------------------------------------
|
|
200 */
|
|
201
|
|
202 static ImageWindow *view_window_get_active()
|
|
203 {
|
|
204 return gtk_object_get_data(GTK_OBJECT(menu_window_view), "view_active");
|
|
205 }
|
|
206
|
|
207 void view_window_active_edit(gint n)
|
|
208 {
|
|
209 ImageWindow *imd = view_window_get_active();
|
|
210 if (!imd) return;
|
|
211 start_editor_from_file(n, image_area_get_path(imd));
|
|
212 }
|
|
213
|
|
214 static void view_zoom_in_cb(GtkWidget *widget, gpointer data)
|
|
215 {
|
|
216 ImageWindow *imd = view_window_get_active();
|
|
217 if (!imd) return;
|
|
218 image_area_adjust_zoom(imd, 1);
|
|
219 }
|
|
220
|
|
221 static void view_zoom_out_cb(GtkWidget *widget, gpointer data)
|
|
222 {
|
|
223 ImageWindow *imd = view_window_get_active();
|
|
224 if (!imd) return;
|
|
225 image_area_adjust_zoom(imd, -1);
|
|
226 }
|
|
227
|
|
228 static void view_zoom_1_1_cb(GtkWidget *widget, gpointer data)
|
|
229 {
|
|
230 ImageWindow *imd = view_window_get_active();
|
|
231 if (!imd) return;
|
|
232 image_area_set_zoom(imd, 1);
|
|
233 }
|
|
234
|
|
235 static void view_zoom_fit_cb(GtkWidget *widget, gpointer data)
|
|
236 {
|
|
237 ImageWindow *imd = view_window_get_active();
|
|
238 if (!imd) return;
|
|
239 image_area_set_zoom(imd, 0);
|
|
240 }
|
|
241
|
|
242 static void view_copy_cb(GtkWidget *widget, gpointer data)
|
|
243 {
|
|
244 ImageWindow *imd = view_window_get_active();
|
|
245 if (!imd) return;
|
|
246 file_util_copy(image_area_get_path(imd), NULL, current_path);
|
|
247 }
|
|
248
|
|
249 static void view_move_cb(GtkWidget *widget, gpointer data)
|
|
250 {
|
|
251 ImageWindow *imd = view_window_get_active();
|
|
252 if (!imd) return;
|
|
253 file_util_move(image_area_get_path(imd), NULL, current_path);
|
|
254 }
|
|
255
|
|
256 static void view_rename_cb(GtkWidget *widget, gpointer data)
|
|
257 {
|
|
258 ImageWindow *imd = view_window_get_active();
|
|
259 if (!imd) return;
|
|
260 file_util_rename(image_area_get_path(imd), NULL);
|
|
261 }
|
|
262
|
|
263 static void view_delete_cb(GtkWidget *widget, gpointer data)
|
|
264 {
|
|
265 ImageWindow *imd = view_window_get_active();
|
|
266 if (!imd) return;
|
|
267 file_util_delete(image_area_get_path(imd), NULL);
|
|
268 }
|
|
269
|
|
270 static void view_close_cb(GtkWidget *widget, gpointer data)
|
|
271 {
|
|
272 ImageWindow *imd = view_window_get_active();
|
|
273 if (!imd) return;
|
|
274 gtk_widget_destroy(imd->top_window);
|
|
275 }
|
|
276
|
|
277 void create_menu_view_popup()
|
|
278 {
|
|
279 menu_window_view = gtk_menu_new();
|
|
280 add_menu_popup_item(menu_window_view, _("Zoom in"), view_zoom_in_cb, NULL);
|
|
281 add_menu_popup_item(menu_window_view, _("Zoom out"), view_zoom_out_cb, NULL);
|
|
282 add_menu_popup_item(menu_window_view, _("Zoom 1:1"), view_zoom_1_1_cb, NULL);
|
|
283 add_menu_popup_item(menu_window_view, _("Fit image to window"), view_zoom_fit_cb, NULL);
|
|
284 add_menu_divider(menu_window_view);
|
|
285
|
|
286 menu_window_view_edit = gtk_menu_item_new_with_label(_("Edit"));
|
|
287 gtk_menu_append(GTK_MENU(menu_window_view), menu_window_view_edit);
|
|
288 gtk_widget_show(menu_window_view_edit);
|
|
289
|
|
290 add_menu_divider(menu_window_view);
|
|
291 add_menu_popup_item(menu_window_view, _("Copy..."), view_copy_cb, NULL);
|
|
292 add_menu_popup_item(menu_window_view, _("Move..."), view_move_cb, NULL);
|
|
293 add_menu_popup_item(menu_window_view, _("Rename..."), view_rename_cb, NULL);
|
|
294 add_menu_popup_item(menu_window_view, _("Delete..."), view_delete_cb, NULL);
|
|
295
|
|
296 add_menu_divider(menu_window_view);
|
|
297 add_menu_popup_item(menu_window_view, _("Close window"), view_close_cb, NULL);
|
|
298 }
|
|
299
|
|
300
|