annotate src/image.c @ 3:c0e337a01cb7

0.8.0
author gqview
date Thu, 13 Apr 2000 12:55:19 +0000
parents b3e0e515fabf
children e149abcda4eb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
1 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
2 * GQview image viewer
3
gqview
parents: 1
diff changeset
3 * (C)2000 John Ellis
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
4 *
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
5 * Author: John Ellis
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
6 *
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
7 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
8
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
9 #include "gqview.h"
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
10 #include "image.h"
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
11 #include "icons/img_unknown.xpm"
3
gqview
parents: 1
diff changeset
12 #include <gdk/gdkx.h>
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
13
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
14 static gchar *zoom_as_text(gint zoom, gfloat scale);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
15 static void set_zoom_label(GtkWidget *label, gint zoom, gfloat scale);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
16 static void set_info_label(GtkWidget *label, gint width, gint height, gint size, gint unknown);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
17 static void set_window_title(ImageWindow *imd, gchar *text);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
18
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
19 static gint image_area_size_top_window(ImageWindow *imd, gint w, gint h);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
20
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
21 static void image_area_recalc_size(ImageWindow *imd, GtkAllocation *allocation);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
22
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
23 static void image_area_redraw(ImageWindow *imd);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
24 static gint image_area_size_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
25 static gint image_area_update_cb(GtkWidget *widget, GdkEventConfigure *event, gpointer data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
26
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
27 static void set_mouse_cursor (GdkWindow *window, gint icon);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
28 static void image_area_mouse_moved(GtkWidget *widget, GdkEventButton *bevent, gpointer data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
29 static void image_area_mouse_pressed(GtkWidget *widget, GdkEventButton *bevent, gpointer data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
30 static void image_area_mouse_released(GtkWidget *widget, GdkEventButton *bevent, gpointer data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
31 static void image_area_mouse_drag(GtkWidget *widget, GdkDragContext *context, gpointer data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
32
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
33 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
34 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
35 * image status widget update routines (private)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
36 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
37 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
38
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
39 static gchar *zoom_as_text(gint zoom, gfloat scale)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
40 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
41 gint l = 1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
42 gint r = 1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
43 gchar *approx = " ";
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
44 if (zoom > 1) l = zoom;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
45 if (zoom < -1) r = -zoom;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
46 if (zoom == 0 && scale != 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
47 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
48 if (scale < 1) r = 1 / scale + 0.5;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
49 approx = " ~";
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
50 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
51 return g_strdup_printf("%d :%s%d", l, approx, r);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
52 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
53
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
54 static void set_zoom_label(GtkWidget *label, gint zoom, gfloat scale)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
55 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
56 gchar *buf;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
57 buf = zoom_as_text(zoom, scale);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
58 gtk_label_set(GTK_LABEL(label), buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
59 g_free(buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
60 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
61
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
62 static void set_info_label(GtkWidget *label, gint width, gint height, gint size, gint unknown)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
63 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
64 gchar buf[64];
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
65 if (unknown)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
66 sprintf(buf, _("( ? x ? ) %d bytes"), size);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
67 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
68 sprintf(buf, _("( %d x %d ) %d bytes"), width, height, size);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
69 gtk_label_set(GTK_LABEL(label), buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
70 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
71
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
72 static void set_window_title(ImageWindow *imd, gchar *text)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
73 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
74 gchar *title = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
75 if (!imd->top_window) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
76
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
77 if (imd->title)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
78 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
79 title = g_strconcat(imd->title, imd->image_name, text, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
80 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
81 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
82 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
83 title = g_strconcat(imd->image_name, text, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
84 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
85
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
86 gtk_window_set_title(GTK_WINDOW(imd->top_window), title);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
87 g_free(title);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
88 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
89
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
90 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
91 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
92 * fit window to image utility (private)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
93 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
94 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
95
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
96 static gint image_area_size_top_window(ImageWindow *imd, gint w, gint h)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
97 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
98 if (!imd->top_window) return FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
99 if (imd == full_screen_image) return FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
100 if (imd == normal_image && !toolwindow) return FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
101 if (!fit_window) return FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
102
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
103 if (imd == normal_image)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
104 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
105 /* account for border frame */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
106 w += 4;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
107 h += 4;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
108 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
109
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
110 if (limit_window_size)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
111 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
112 gint sw = gdk_screen_width() * max_window_size / 100;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
113 gint sh = gdk_screen_height() * max_window_size / 100;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
114
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
115 if (w > sw) w = sw;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
116 if (h > sh) h = sh;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
117 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
118
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
119 /* to cheat on a prob a little, don't resize if within 1 either way...
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
120 ...dumb off by 1 errors! ;) */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
121
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
122 /* if (w >= (imd->top_window)->allocation.width - 1 &&
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
123 w <= (imd->top_window)->allocation.width + 1 &&
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
124 h >= (imd->top_window)->allocation.height - 1 &&
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
125 h <= (imd->top_window)->allocation.height + 1)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
126 return FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
127 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
128 if (debug) printf("auto sized to %d x %d\n", w, h);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
129
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
130 gdk_window_resize(imd->top_window->window, w, h);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
131 gtk_widget_set_usize(imd->top_window, w, h);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
132
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
133 return TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
134 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
135
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
136 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
137 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
138 * image widget zoom/recalc routines
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
139 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
140 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
141
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
142 void image_area_scroll(ImageWindow *imd, gint x, gint y)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
143 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
144 if (x != 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
145 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
146 GtkAdjustment *h = gtk_viewport_get_hadjustment(GTK_VIEWPORT(imd->viewport));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
147 gfloat val = h->value + x;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
148 if (val < h->lower) val = h->lower;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
149 if (val > h->upper - h->page_size) val = h->upper - h->page_size;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
150 gtk_adjustment_set_value(GTK_ADJUSTMENT(h), val);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
151 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
152
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
153 if (y != 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
154 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
155 GtkAdjustment *v = gtk_viewport_get_vadjustment(GTK_VIEWPORT(imd->viewport));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
156 gfloat val = v->value + y;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
157 if (val < v->lower) val = v->lower;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
158 if (val > v->upper - v->page_size) val = v->upper - v->page_size;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
159 gtk_adjustment_set_value(GTK_ADJUSTMENT(v), val);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
160 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
161 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
162
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
163 gint image_area_get_zoom(ImageWindow *imd)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
164 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
165 return imd->zoom;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
166 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
167
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
168 void image_area_adjust_zoom(ImageWindow *imd, gint increment)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
169 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
170 gint zoom = imd->zoom;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
171 if (increment < 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
172 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
173 while (increment < 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
174 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
175 zoom--;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
176 if (zoom == 0 || zoom == -1) zoom = -2;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
177 increment++;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
178 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
179 if (zoom < -8) zoom = -8;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
180 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
181 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
182 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
183 while (increment > 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
184 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
185 zoom++;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
186 if (zoom == -1) zoom = 1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
187 increment--;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
188 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
189 if (zoom > 3) zoom = 3;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
190 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
191 if (zoom != imd->zoom)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
192 image_area_set_zoom(imd, zoom);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
193 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
194
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
195 void image_area_set_zoom(ImageWindow *imd, gint zoom)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
196 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
197 if (zoom == imd->zoom && imd->width > 0 && imd->height > 0) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
198
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
199 imd->zoom = zoom;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
200 image_area_recalc_size(imd, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
201
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
202 gtk_widget_set_usize (imd->table, imd->width, imd->height);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
203 gtk_drawing_area_size(GTK_DRAWING_AREA(imd->image), imd->width, imd->height);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
204 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
205
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
206 static void image_area_recalc_size(ImageWindow *imd, GtkAllocation *allocation)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
207 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
208 gint w, h, ww, wh;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
209 gfloat scale_factor = 1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
210
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
211 w = imd->image_data->rgb_width;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
212 h = imd->image_data->rgb_height;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
213 if (allocation)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
214 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
215 ww = allocation->width;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
216 wh = allocation->height;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
217 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
218 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
219 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
220 ww = (imd->eventbox)->allocation.width;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
221 wh = (imd->eventbox)->allocation.height;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
222 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
223
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
224 if (imd == normal_image)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
225 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
226 /* account for frame */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
227 ww -= 4;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
228 wh -= 4;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
229 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
230
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
231 if (imd->zoom == 0) /* zoom to fit */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
232 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
233 if (imd == normal_image && imd->width == 0 && imd->height == 0 &&
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
234 fit_window && toolwindow)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
235 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
236 if (limit_window_size)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
237 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
238 ww = (gdk_screen_width() * max_window_size / 100) - 4;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
239 wh = (gdk_screen_height() * max_window_size / 100) - 4;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
240 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
241 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
242 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
243 ww = w;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
244 wh = h;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
245 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
246 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
247 if (w > ww || h > wh)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
248 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
249 if ((gfloat)ww / w > (gfloat)wh / h)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
250 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
251 scale_factor = (gfloat) wh / h;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
252 h = wh;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
253 w = w * scale_factor + 0.5;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
254 if (w > ww) w = ww;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
255 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
256 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
257 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
258 scale_factor = (gfloat)ww / w;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
259 w = ww;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
260 h = h * scale_factor + 0.5;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
261 if (h > wh) h = wh;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
262 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
263 if (w < 1) w = 1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
264 if (h < 1) h = 1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
265 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
266 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
267 else if (imd->zoom > 0) /* zoom orig, in */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
268 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
269 scale_factor = imd->zoom;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
270 w = w * scale_factor;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
271 h = h * scale_factor;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
272 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
273 else if (imd->zoom < -1) /* zoom out */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
274 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
275 scale_factor = (- imd->zoom);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
276 w = w / scale_factor;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
277 h = h / scale_factor;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
278 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
279
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
280 imd->width = w;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
281 imd->height = h;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
282
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
283 if (debug) printf("recalc %d x %d @ %f\n", w, h, scale_factor);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
284
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
285 if (imd->zoom_label)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
286 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
287 set_zoom_label(imd->zoom_label, imd->zoom, scale_factor);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
288 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
289
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
290 /* this is causing problems with resizing
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
291 if (imd->top_window && imd->show_title_zoom)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
292 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
293 gchar *buf = zoom_as_text(imd->zoom, scale_factor);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
294 gchar *zbuf = g_strconcat(" [ ", buf, "]", NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
295 g_free(buf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
296 set_window_title(imd, zbuf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
297 g_free(zbuf);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
298 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
299 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
300
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
301 if (image_area_size_top_window(imd, w, h))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
302 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
303 /* this is hacky */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
304 imd->artificial_size = TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
305 gtk_grab_add (info_zoom);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
306 while(gtk_events_pending()) gtk_main_iteration();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
307 gtk_grab_remove(info_zoom);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
308 imd->artificial_size = FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
309 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
310 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
311
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
312 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
313 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
314 * image widget set/get image information
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
315 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
316 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
317
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
318 void image_area_set_path(ImageWindow *imd, gchar *newpath)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
319 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
320 if (!imd->image_path || !newpath) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
321
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
322 g_free(imd->image_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
323 imd->image_path = g_strdup(newpath);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
324 imd->image_name = filename_from_path(imd->image_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
325
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
326 if (imd->top_window)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
327 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
328 set_window_title(imd, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
329 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
330 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
331
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
332 gchar *image_area_get_path(ImageWindow *imd)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
333 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
334 return imd->image_path;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
335 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
336
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
337 gchar *image_area_get_name(ImageWindow *imd)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
338 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
339 return imd->image_name;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
340 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
341
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
342 void image_area_set_image(ImageWindow *imd, gchar *path, gint zoom)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
343 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
344 if (path && imd->image_path && !strcmp(path, imd->image_path)) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
345
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
346 g_free(imd->image_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
347 if (path)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
348 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
349 imd->image_path = g_strdup(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
350 imd->image_name = filename_from_path(imd->image_path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
351 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
352 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
353 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
354 imd->image_path = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
355 imd->image_name = " ";
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
356 zoom = 1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
357 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
358
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
359 if (imd->image_data) gdk_imlib_destroy_image(imd->image_data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
360 if (path && isfile(path))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
361 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
362 imd->image_data = gdk_imlib_load_image(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
363 if (!imd->image_data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
364 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
365 imd->image_data = gdk_imlib_create_image_from_xpm_data((gchar **)img_unknown_xpm);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
366 imd->unknown = TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
367 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
368 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
369 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
370 imd->unknown = FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
371 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
372 imd->size = filesize(path);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
373 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
374 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
375 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
376 if (path)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
377 imd->image_data = gdk_imlib_create_image_from_xpm_data((gchar **)img_unknown_xpm);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
378 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
379 imd->image_data = gdk_imlib_create_image_from_data((char *)logo, NULL, logo_width, logo_height);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
380 imd->unknown = TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
381 imd->size = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
382 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
383
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
384 imd->width = imd->old_width = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
385 imd->height = imd->old_height = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
386
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
387 if (imd->top_window)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
388 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
389 set_window_title(imd, NULL);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
390 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
391 if (imd->info_label)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
392 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
393 set_info_label(imd->info_label, imd->image_data->rgb_width, imd->image_data->rgb_height, imd->size, imd->unknown);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
394 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
395
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
396 /* do info area updates here */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
397
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
398 imd->new_img = TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
399 image_area_set_zoom(imd, zoom);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
400 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
401
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
402 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
403 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
404 * image widget redraw/callbacks (private)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
405 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
406 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
407
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
408 static void image_area_redraw(ImageWindow *imd)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
409 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
410 GdkBitmap *mask = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
411
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
412 if (debug) printf("redrawn %d x %d\n", imd->width, imd->height);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
413
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
414 if (!imd->image_data) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
415
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
416 if (imd->width == imd->old_width && imd->height == imd->old_height)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
417 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
418 if (debug) printf("redraw cancelled\n");
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
419 return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
420 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
421
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
422 if (imd->image_pixmap) gdk_imlib_free_pixmap(imd->image_pixmap);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
423 imd->image_pixmap = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
424
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
425 gdk_imlib_render(imd->image_data, imd->width, imd->height);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
426 imd->image_pixmap = gdk_imlib_move_image(imd->image_data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
427 mask = gdk_imlib_move_mask(imd->image_data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
428
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
429 gdk_window_set_back_pixmap(imd->image->window, imd->image_pixmap, FALSE);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
430 gdk_window_shape_combine_mask (imd->image->window, mask, 0, 0);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
431 gdk_window_clear(imd->image->window);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
432 gdk_flush();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
433
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
434 imd->old_width = imd->width;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
435 imd->old_height = imd->height;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
436 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
437
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
438 static gint image_area_size_cb(GtkWidget *widget, GtkAllocation *allocation, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
439 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
440 ImageWindow *imd = data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
441 gint old_w, old_h;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
442 GtkAdjustment *h;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
443 GtkAdjustment *v;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
444 gfloat h_pos;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
445 gfloat v_pos;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
446 gfloat h_max;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
447 gfloat v_max;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
448
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
449 if (imd->artificial_size) return FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
450
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
451 h = gtk_viewport_get_hadjustment(GTK_VIEWPORT(imd->viewport));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
452 v = gtk_viewport_get_vadjustment(GTK_VIEWPORT(imd->viewport));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
453
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
454 h_pos = h->value;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
455 h_max = allocation->width;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
456 v_pos = v->value;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
457 v_max = allocation->height;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
458
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
459 if (imd == normal_image)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
460 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
461 h_max -= 4.0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
462 v_max -= 4.0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
463 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
464
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
465 if (h_pos > h->upper - h_max) h_pos = h->upper - h_max;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
466 if (v_pos > v->upper - v_max) v_pos = v->upper - v_max;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
467
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
468 if (imd->new_img)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
469 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
470 imd->new_img = FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
471 gtk_adjustment_clamp_page(h, 0.0, h_max);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
472 gtk_adjustment_clamp_page(v, 0.0, v_max);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
473 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
474 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
475 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
476 gtk_adjustment_clamp_page(h, h_pos, h_max);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
477 gtk_adjustment_clamp_page(v, v_pos, v_max);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
478 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
479
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
480 gtk_adjustment_changed(h);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
481 gtk_adjustment_changed(v);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
482
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
483 if (!imd->image_data || imd->zoom != 0) return FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
484
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
485 old_w = imd->width;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
486 old_h = imd->height;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
487 image_area_recalc_size(imd, allocation);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
488 if (old_w != imd->width || old_h != imd->height)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
489 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
490 gtk_widget_set_usize (imd->table, imd->width, imd->height);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
491 gtk_drawing_area_size(GTK_DRAWING_AREA(imd->image), imd->width, imd->height);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
492 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
493
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
494 if (debug) printf("sized %d x %d (%d x %d)\n", allocation->width, allocation->height, imd->width, imd->height);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
495
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
496 return FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
497 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
498
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
499 static gint image_area_update_cb(GtkWidget *widget, GdkEventConfigure *event, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
500 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
501 ImageWindow *imd = data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
502
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
503 if (imd->artificial_size) return FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
504
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
505 image_area_redraw(imd);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
506
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
507 return FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
508 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
509
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
510 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
511 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
512 * image widget mouse routines (private)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
513 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
514 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
515
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
516 static void set_mouse_cursor (GdkWindow *window, gint icon)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
517 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
518 GdkCursor *cursor;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
519
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
520 if (icon == -1)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
521 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
522 cursor = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
523 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
524 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
525 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
526 cursor = gdk_cursor_new (icon);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
527 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
528
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
529 gdk_window_set_cursor (window, cursor);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
530
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
531 if (cursor) gdk_cursor_destroy (cursor);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
532 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
533
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
534 static void image_area_mouse_moved(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
535 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
536 ImageWindow *imd = data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
537 GtkAdjustment* h;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
538 GtkAdjustment* v;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
539 gfloat x, y;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
540 gfloat val;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
541
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
542 if (!imd->in_drag || !gdk_pointer_is_grabbed()) return;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
543
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
544 if (imd->drag_moved < 4)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
545 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
546 imd->drag_moved++;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
547 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
548 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
549 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
550 set_mouse_cursor (imd->eventbox->window, GDK_FLEUR);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
551 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
552
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
553 h = gtk_viewport_get_hadjustment(GTK_VIEWPORT(imd->viewport));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
554 v = gtk_viewport_get_vadjustment(GTK_VIEWPORT(imd->viewport));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
555
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
556 x = imd->drag_last_x - bevent->x;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
557 y = imd->drag_last_y - bevent->y;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
558
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
559 /* x */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
560 if (h->upper - h->page_size > 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
561 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
562 val = (float)h->value + x;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
563 if (val < 0 ) val = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
564 if (val > h->upper - h->page_size) val = h->upper - h->page_size;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
565 h->value = val;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
566 gtk_adjustment_set_value (GTK_ADJUSTMENT(h), val);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
567 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
568
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
569 /* y */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
570 if (v->upper - v->page_size > 0)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
571 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
572 val = v->value + y;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
573 if (val < 0 ) val = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
574 if (val > v->upper - v->page_size) val = v->upper - v->page_size;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
575 v->value = val;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
576 gtk_adjustment_set_value (GTK_ADJUSTMENT(v), val);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
577 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
578
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
579 gtk_adjustment_value_changed(h);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
580 gtk_adjustment_value_changed(v);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
581
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
582 imd->drag_last_x = bevent->x;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
583 imd->drag_last_y = bevent->y;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
584 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
585
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
586 static void image_area_mouse_pressed(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
587 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
588 ImageWindow *imd = data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
589 switch (bevent->button)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
590 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
591 case 1:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
592 imd->in_drag = TRUE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
593 imd->drag_last_x = bevent->x;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
594 imd->drag_last_y = bevent->y;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
595 imd->drag_moved = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
596 gdk_pointer_grab (imd->eventbox->window, FALSE,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
597 GDK_POINTER_MOTION_MASK |
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
598 GDK_BUTTON_RELEASE_MASK,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
599 NULL, NULL, bevent->time);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
600 gtk_grab_add (imd->eventbox);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
601 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
602 case 2:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
603 imd->drag_moved = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
604 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
605 case 3:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
606 if (imd->func_btn3)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
607 imd->func_btn3(imd, bevent, imd->data_btn3);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
608 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
609 default:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
610 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
611 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
612 gtk_widget_grab_focus(imd->viewport);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
613 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
614
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
615 static void image_area_mouse_released(GtkWidget *widget, GdkEventButton *bevent, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
616 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
617 ImageWindow *imd = data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
618 if (gdk_pointer_is_grabbed() && GTK_WIDGET_HAS_GRAB (imd->eventbox))
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
619 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
620 gtk_grab_remove (imd->eventbox);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
621 gdk_pointer_ungrab (bevent->time);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
622 set_mouse_cursor (imd->eventbox->window, -1);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
623 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
624
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
625 if (bevent->button == 1)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
626 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
627 if (imd->drag_moved < 4 && imd->func_btn1)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
628 imd->func_btn1(imd, bevent, imd->data_btn1);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
629 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
630
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
631 if (bevent->button == 2)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
632 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
633 if (imd->drag_moved < 4 && imd->func_btn2)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
634 imd->func_btn2(imd, bevent, imd->data_btn2);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
635 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
636
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
637 imd->in_drag = FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
638 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
639
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
640 static void image_area_mouse_drag(GtkWidget *widget, GdkDragContext *context, gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
641 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
642 ImageWindow *imd = data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
643 imd->drag_moved = 4;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
644 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
645
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
646 /*
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
647 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
648 * image widget setup routines
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
649 *-----------------------------------------------------------------------------
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
650 */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
651
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
652 void image_area_set_topwindow(ImageWindow *imd, GtkWidget *window, gchar *title, gint show_zoom)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
653 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
654 imd->top_window = window;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
655 imd->show_title_zoom = show_zoom;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
656
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
657 g_free(imd->title);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
658 if (title)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
659 imd->title = g_strdup(title);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
660 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
661 imd->title = NULL;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
662 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
663
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
664 void image_area_set_labels(ImageWindow *imd, GtkWidget *info, GtkWidget *zoom)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
665 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
666 imd->info_label = info;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
667 imd->zoom_label = zoom;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
668 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
669
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
670 void image_area_set_button(ImageWindow *imd, gint button,
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
671 void (*func)(ImageWindow *, GdkEventButton *, gpointer), gpointer data)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
672 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
673 switch (button)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
674 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
675 case 1:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
676 imd->func_btn1 = func;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
677 imd->data_btn1 = data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
678 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
679 case 2:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
680 imd->func_btn2 = func;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
681 imd->data_btn2 = data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
682 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
683 case 3:
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
684 imd->func_btn3 = func;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
685 imd->data_btn3 = data;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
686 break;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
687 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
688 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
689
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
690 ImageWindow *image_area_new(GtkWidget *top_window)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
691 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
692 GtkObject *h_adj;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
693 GtkObject *v_adj;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
694 ImageWindow *imd;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
695
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
696 imd = g_new0(ImageWindow, 1);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
697 imd->zoom = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
698
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
699 imd->top_window = top_window;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
700 imd->title = g_strdup("GQview - ");
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
701 imd->show_title_zoom = FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
702 imd->new_img = FALSE;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
703
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
704 imd->eventbox = gtk_event_box_new();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
705
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
706 gtk_signal_connect(GTK_OBJECT(imd->eventbox),"motion_notify_event",
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
707 GTK_SIGNAL_FUNC(image_area_mouse_moved), imd);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
708 gtk_signal_connect(GTK_OBJECT(imd->eventbox),"button_press_event",
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
709 GTK_SIGNAL_FUNC(image_area_mouse_pressed), imd);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
710 gtk_signal_connect(GTK_OBJECT(imd->eventbox),"button_release_event",
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
711 GTK_SIGNAL_FUNC(image_area_mouse_released), imd);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
712 gtk_widget_set_events(imd->eventbox, GDK_POINTER_MOTION_MASK | GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_PRESS_MASK);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
713
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
714 /* viewer */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
715 h_adj = gtk_adjustment_new(0.0,0.0,0.0,1.0,1.0,1.0);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
716 v_adj = gtk_adjustment_new(0.0,0.0,0.0,1.0,1.0,1.0);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
717
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
718 imd->viewport = gtk_viewport_new (GTK_ADJUSTMENT(h_adj), GTK_ADJUSTMENT(v_adj));
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
719 gtk_container_add(GTK_CONTAINER(imd->eventbox), imd->viewport);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
720
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
721 /* table for resize */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
722 imd->table = gtk_table_new (1,1,TRUE);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
723 gtk_container_add(GTK_CONTAINER (imd->viewport), imd->table);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
724
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
725 /* imagewindow */
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
726 imd->image = gtk_drawing_area_new();
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
727 gtk_table_attach(GTK_TABLE (imd->table),imd->image,0,1,0,1,GTK_EXPAND,GTK_EXPAND,0,0);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
728
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
729 gtk_signal_connect(GTK_OBJECT(imd->eventbox),"size_allocate",GTK_SIGNAL_FUNC(image_area_size_cb), imd);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
730 gtk_signal_connect(GTK_OBJECT(imd->image),"configure_event",GTK_SIGNAL_FUNC(image_area_update_cb), imd);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
731
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
732 gtk_signal_connect(GTK_OBJECT(imd->viewport),"drag_begin",
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
733 GTK_SIGNAL_FUNC(image_area_mouse_drag), imd);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
734
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
735 return imd;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
736 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
737
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
738 void image_area_free(ImageWindow *imd)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
739 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
740 g_free(imd->image_path);
3
gqview
parents: 1
diff changeset
741 g_free(imd->title);
1
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
742
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
743 if (imd->image_pixmap) gdk_imlib_free_pixmap(imd->image_pixmap);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
744 if (imd->image_data) gdk_imlib_destroy_image(imd->image_data);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
745
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
746 g_free(imd);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
747 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
748
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
749 gint get_default_zoom(ImageWindow *imd)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
750 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
751 gint zoom;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
752
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
753 if (zoom_mode == ZOOM_RESET_ORIGINAL)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
754 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
755 zoom = 1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
756 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
757 else if (zoom_mode == ZOOM_RESET_FIT_WINDOW)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
758 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
759 zoom = 0;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
760 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
761 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
762 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
763 if (imd)
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
764 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
765 zoom = image_area_get_zoom(imd);
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
766 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
767 else
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
768 {
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
769 zoom = 1;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
770 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
771 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
772
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
773 return zoom;
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
774 }
b3e0e515fabf Initial revision
gqview
parents:
diff changeset
775
3
gqview
parents: 1
diff changeset
776 /*
gqview
parents: 1
diff changeset
777 *-----------------------------------------------------------------------------
gqview
parents: 1
diff changeset
778 * image widget misc utils
gqview
parents: 1
diff changeset
779 *-----------------------------------------------------------------------------
gqview
parents: 1
diff changeset
780 */
gqview
parents: 1
diff changeset
781
gqview
parents: 1
diff changeset
782 void image_area_to_root(ImageWindow *imd, gint scaled)
gqview
parents: 1
diff changeset
783 {
gqview
parents: 1
diff changeset
784 GdkVisual *gdkvisual;
gqview
parents: 1
diff changeset
785 GdkWindow *rootwindow;
gqview
parents: 1
diff changeset
786 GdkPixmap *pixmap;
gqview
parents: 1
diff changeset
787
gqview
parents: 1
diff changeset
788 if (!imd || !imd->image_data) return;
gqview
parents: 1
diff changeset
789
gqview
parents: 1
diff changeset
790
gqview
parents: 1
diff changeset
791 rootwindow = (GdkWindow *) &gdk_root_parent; /* hmm, don't know, correct? */
gqview
parents: 1
diff changeset
792 gdkvisual = gdk_window_get_visual(rootwindow);
gqview
parents: 1
diff changeset
793 if (gdkvisual != gdk_imlib_get_visual()) return;
gqview
parents: 1
diff changeset
794
gqview
parents: 1
diff changeset
795 if (scaled)
gqview
parents: 1
diff changeset
796 {
gqview
parents: 1
diff changeset
797 gdk_imlib_render(imd->image_data, gdk_screen_width(), gdk_screen_height());
gqview
parents: 1
diff changeset
798 }
gqview
parents: 1
diff changeset
799 else
gqview
parents: 1
diff changeset
800 {
gqview
parents: 1
diff changeset
801 gdk_imlib_render(imd->image_data, imd->width, imd->height);
gqview
parents: 1
diff changeset
802 }
gqview
parents: 1
diff changeset
803
gqview
parents: 1
diff changeset
804 pixmap = gdk_imlib_move_image(imd->image_data);
gqview
parents: 1
diff changeset
805 gdk_window_set_back_pixmap(rootwindow, pixmap, FALSE);
gqview
parents: 1
diff changeset
806 gdk_window_clear(rootwindow);
gqview
parents: 1
diff changeset
807 gdk_imlib_free_pixmap(pixmap);
gqview
parents: 1
diff changeset
808
gqview
parents: 1
diff changeset
809 gdk_flush();
gqview
parents: 1
diff changeset
810 }
gqview
parents: 1
diff changeset
811
gqview
parents: 1
diff changeset
812