| 110 |
115 |
| 111 /****************************************************************************** |
116 /****************************************************************************** |
| 112 * Draw window |
117 * Draw window |
| 113 ******************************************************************************/ |
118 ******************************************************************************/ |
| 114 |
119 |
| |
120 static gboolean |
| |
121 scrncap_drawing_area_btnpress(GtkWidget *draw_area, GdkEventButton *event, |
| |
122 gpointer _unused) |
| |
123 { |
| |
124 g_return_val_if_fail(!draw_active, TRUE); |
| |
125 |
| |
126 draw_origin_x = event->x; |
| |
127 draw_origin_y = event->y; |
| |
128 draw_active = TRUE; |
| |
129 |
| |
130 return TRUE; |
| |
131 } |
| |
132 |
| |
133 static gboolean |
| |
134 scrncap_drawing_area_btnrelease(GtkWidget *draw_area, GdkEvent *event, |
| |
135 gpointer _unused) |
| |
136 { |
| |
137 g_return_val_if_fail(draw_active, TRUE); |
| |
138 |
| |
139 draw_active = FALSE; |
| |
140 |
| |
141 return TRUE; |
| |
142 } |
| |
143 |
| |
144 static gboolean |
| |
145 scrncap_drawing_area_motion(GtkWidget *draw_area, GdkEventButton *event, |
| |
146 gpointer _cr) |
| |
147 { |
| |
148 cairo_t *cr = _cr; |
| |
149 int x, y; |
| |
150 int redraw_x, redraw_y, redraw_w, redraw_h; |
| |
151 |
| |
152 g_return_val_if_fail(draw_active, FALSE); |
| |
153 |
| |
154 x = event->x; |
| |
155 y = event->y; |
| |
156 |
| |
157 cairo_move_to(cr, draw_origin_x, draw_origin_y); |
| |
158 cairo_line_to(cr, x, y); |
| |
159 cairo_set_line_width(cr, line_width); |
| |
160 cairo_stroke(cr); |
| |
161 |
| |
162 redraw_x = MIN(draw_origin_x, x) - line_width - 1; |
| |
163 redraw_y = MIN(draw_origin_y, y) - line_width - 1; |
| |
164 redraw_w = MAX(draw_origin_x, x) - redraw_x + line_width + 1; |
| |
165 redraw_h = MAX(draw_origin_y, y) - redraw_y + line_width + 1; |
| |
166 |
| |
167 draw_origin_x = x; |
| |
168 draw_origin_y = y; |
| |
169 |
| |
170 gtk_widget_queue_draw_area(draw_area, |
| |
171 redraw_x, redraw_y, redraw_w, redraw_h); |
| |
172 |
| |
173 return FALSE; |
| |
174 } |
| |
175 |
| 115 static void |
176 static void |
| 116 scrncap_draw_window_close(GtkWidget *window, gpointer _unused) |
177 scrncap_draw_window_close(GtkWidget *window, gpointer _unused) |
| 117 { |
178 { |
| 118 if (current_window != window) |
179 if (current_window != window) |
| 119 return; |
180 return; |
| 120 |
181 |
| 121 is_shooting = FALSE; |
182 is_shooting = FALSE; |
| 122 current_window = NULL; |
183 current_window = NULL; |
| 123 } |
184 } |
| 124 |
185 |
| |
186 static gboolean |
| |
187 scrncap_draw_window_paint(GtkWidget *widget, cairo_t *cr, gpointer _surface) |
| |
188 { |
| |
189 cairo_surface_t *surface = _surface; |
| |
190 |
| |
191 cairo_set_source_surface(cr, surface, 0, 0); |
| |
192 cairo_paint(cr); |
| |
193 |
| |
194 return FALSE; |
| |
195 } |
| |
196 |
| |
197 #if !GTK_CHECK_VERSION(3,0,0) |
| |
198 static gboolean |
| |
199 scrncap_draw_window_expose(GtkWidget *widget, GdkEventExpose *event, |
| |
200 gpointer _surface) |
| |
201 { |
| |
202 cairo_t *cr = gdk_cairo_create(GDK_DRAWABLE(widget->window)); |
| |
203 |
| |
204 scrncap_draw_window_paint(widget, cr, _surface); |
| |
205 |
| |
206 cairo_destroy(cr); |
| |
207 |
| |
208 return FALSE; |
| |
209 } |
| |
210 #endif |
| |
211 |
| 125 static void |
212 static void |
| 126 scrncap_draw_window(GdkPixbuf *screen) |
213 scrncap_draw_window(GdkPixbuf *screen) |
| 127 { |
214 { |
| 128 GtkWidget *draw_window; |
215 GtkWidget *draw_window; |
| 129 GtkWidget *image; |
216 GtkWidget *drawing_area; |
| |
217 GtkWidget *scroll_area; |
| |
218 int width, height; |
| |
219 cairo_t *cr; |
| |
220 cairo_surface_t *surface; |
| 130 |
221 |
| 131 is_shooting = TRUE; |
222 is_shooting = TRUE; |
| 132 |
223 |
| 133 current_window = draw_window = pidgin_create_window( |
224 current_window = draw_window = pidgin_create_window( |
| 134 _("Insert screenshot"), 0, "insert-screenshot", TRUE); |
225 _("Insert screenshot"), 0, "insert-screenshot", TRUE); |
| 135 gtk_widget_set_size_request(draw_window, 400, 300); |
226 gtk_widget_set_size_request(draw_window, 400, 300); |
| 136 gtk_window_set_position(GTK_WINDOW(draw_window), GTK_WIN_POS_CENTER); |
227 gtk_window_set_position(GTK_WINDOW(draw_window), GTK_WIN_POS_CENTER); |
| 137 g_signal_connect(G_OBJECT(draw_window), "destroy", |
228 g_signal_connect(G_OBJECT(draw_window), "destroy", |
| 138 G_CALLBACK(scrncap_draw_window_close), NULL); |
229 G_CALLBACK(scrncap_draw_window_close), NULL); |
| 139 |
230 |
| 140 image = gtk_image_new_from_pixbuf(screen); |
231 width = gdk_pixbuf_get_width(screen); |
| |
232 height = gdk_pixbuf_get_height(screen); |
| |
233 |
| |
234 surface = cairo_image_surface_create(CAIRO_FORMAT_RGB24, width, height); |
| |
235 cr = cairo_create(surface); |
| |
236 |
| |
237 gdk_cairo_set_source_pixbuf(cr, screen, 0, 0); |
| |
238 cairo_rectangle(cr, 0, 0, width, height); |
| |
239 cairo_fill(cr); |
| 141 g_object_unref(screen); |
240 g_object_unref(screen); |
| 142 gtk_container_add(GTK_CONTAINER(draw_window), |
241 |
| 143 pidgin_make_scrollable(image, |
242 cairo_set_source_rgb(cr, 1, 0, 0); |
| 144 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC, |
243 |
| 145 GTK_SHADOW_IN, -1, -1)); |
244 drawing_area = gtk_drawing_area_new(); |
| |
245 gtk_widget_set_size_request(drawing_area, width, height); |
| |
246 #if GTK_CHECK_VERSION(3,0,0) |
| |
247 g_signal_connect(G_OBJECT(drawing_area), "draw", |
| |
248 G_CALLBACK(scrncap_draw_window_paint), surface); |
| |
249 #else |
| |
250 g_signal_connect(G_OBJECT(drawing_area), "expose_event", |
| |
251 G_CALLBACK(scrncap_draw_window_expose), surface); |
| |
252 #endif |
| |
253 gtk_widget_add_events(drawing_area, GDK_BUTTON_PRESS_MASK | |
| |
254 GDK_BUTTON_RELEASE_MASK | GDK_BUTTON_MOTION_MASK); |
| |
255 g_signal_connect(G_OBJECT(drawing_area), "button-press-event", |
| |
256 G_CALLBACK(scrncap_drawing_area_btnpress), NULL); |
| |
257 g_signal_connect(G_OBJECT(drawing_area), "button-release-event", |
| |
258 G_CALLBACK(scrncap_drawing_area_btnrelease), NULL); |
| |
259 g_signal_connect(G_OBJECT(drawing_area), "motion-notify-event", |
| |
260 G_CALLBACK(scrncap_drawing_area_motion), cr); |
| |
261 |
| |
262 scroll_area = pidgin_make_scrollable(drawing_area, |
| |
263 GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC, |
| |
264 GTK_SHADOW_IN, -1, -1); |
| |
265 gtk_container_add(GTK_CONTAINER(draw_window), scroll_area); |
| 146 |
266 |
| 147 gtk_widget_show_all(GTK_WIDGET(draw_window)); |
267 gtk_widget_show_all(GTK_WIDGET(draw_window)); |
| 148 } |
268 } |
| 149 |
269 |
| 150 /****************************************************************************** |
270 /****************************************************************************** |