pidgin/plugins/screencap.c

changeset 35944
06a7dd03173c
parent 35943
f8e57179a70a
child 35945
8d17d321e66c
equal deleted inserted replaced
35943:f8e57179a70a 35944:06a7dd03173c
42 42
43 static gint crop_origin_x, crop_origin_y; 43 static gint crop_origin_x, crop_origin_y;
44 static gboolean crop_active; 44 static gboolean crop_active;
45 static gint crop_x, crop_y, crop_w, crop_h; 45 static gint crop_x, crop_y, crop_w, crop_h;
46 46
47 static gint draw_origin_x, draw_origin_y;
48 static gboolean draw_active;
49
50 static gint line_width = 2;
51
47 /****************************************************************************** 52 /******************************************************************************
48 * libpidgin helper functions 53 * libpidgin helper functions
49 ******************************************************************************/ 54 ******************************************************************************/
50 55
51 static inline void 56 static inline void
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 /******************************************************************************

mercurial