diff options
Diffstat (limited to 'src/screenshot-area-selection.c')
-rw-r--r-- | src/screenshot-area-selection.c | 231 |
1 files changed, 1 insertions, 230 deletions
diff --git a/src/screenshot-area-selection.c b/src/screenshot-area-selection.c index 224d93d..eae754f 100644 --- a/src/screenshot-area-selection.c +++ b/src/screenshot-area-selection.c @@ -25,183 +25,6 @@ #include "screenshot-area-selection.h" typedef struct { - GdkRectangle rect; - gboolean button_pressed; - GtkWidget *window; - - gboolean aborted; -} select_area_filter_data; - -static gboolean -select_area_button_press (GtkWidget *window, - GdkEventButton *event, - select_area_filter_data *data) -{ - if (data->button_pressed) - return TRUE; - - data->button_pressed = TRUE; - data->rect.x = event->x_root; - data->rect.y = event->y_root; - - return TRUE; -} - -static gboolean -select_area_motion_notify (GtkWidget *window, - GdkEventMotion *event, - select_area_filter_data *data) -{ - GdkRectangle draw_rect; - - if (!data->button_pressed) - return TRUE; - - draw_rect.width = ABS (data->rect.x - event->x_root); - draw_rect.height = ABS (data->rect.y - event->y_root); - draw_rect.x = MIN (data->rect.x, event->x_root); - draw_rect.y = MIN (data->rect.y, event->y_root); - - if (draw_rect.width <= 0 || draw_rect.height <= 0) - { - gtk_window_move (GTK_WINDOW (window), -100, -100); - gtk_window_resize (GTK_WINDOW (window), 10, 10); - return TRUE; - } - - gtk_window_move (GTK_WINDOW (window), draw_rect.x, draw_rect.y); - gtk_window_resize (GTK_WINDOW (window), draw_rect.width, draw_rect.height); - - /* We (ab)use app-paintable to indicate if we have an RGBA window */ - if (!gtk_widget_get_app_paintable (window)) - { - GdkWindow *gdkwindow = gtk_widget_get_window (window); - - /* Shape the window to make only the outline visible */ - if (draw_rect.width > 2 && draw_rect.height > 2) - { - cairo_region_t *region; - cairo_rectangle_int_t region_rect = { - 0, 0, - draw_rect.width, draw_rect.height - }; - - region = cairo_region_create_rectangle (®ion_rect); - region_rect.x++; - region_rect.y++; - region_rect.width -= 2; - region_rect.height -= 2; - cairo_region_subtract_rectangle (region, ®ion_rect); - - gdk_window_shape_combine_region (gdkwindow, region, 0, 0); - - cairo_region_destroy (region); - } - else - gdk_window_shape_combine_region (gdkwindow, NULL, 0, 0); - } - - return TRUE; -} - -static gboolean -select_area_button_release (GtkWidget *window, - GdkEventButton *event, - select_area_filter_data *data) -{ - if (!data->button_pressed) - return TRUE; - - data->rect.width = ABS (data->rect.x - event->x_root); - data->rect.height = ABS (data->rect.y - event->y_root); - data->rect.x = MIN (data->rect.x, event->x_root); - data->rect.y = MIN (data->rect.y, event->y_root); - - if (data->rect.width == 0 || data->rect.height == 0) - data->aborted = TRUE; - - gtk_main_quit (); - - return TRUE; -} - -static gboolean -select_area_key_press (GtkWidget *window, - GdkEventKey *event, - select_area_filter_data *data) -{ - if (event->keyval == GDK_KEY_Escape) - { - data->rect.x = 0; - data->rect.y = 0; - data->rect.width = 0; - data->rect.height = 0; - data->aborted = TRUE; - - gtk_main_quit (); - } - - return TRUE; -} - -static gboolean -select_window_draw (GtkWidget *window, cairo_t *cr, gpointer unused) -{ - GtkStyleContext *style; - - style = gtk_widget_get_style_context (window); - - if (gtk_widget_get_app_paintable (window)) - { - cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); - cairo_set_source_rgba (cr, 0, 0, 0, 0); - cairo_paint (cr); - - gtk_style_context_save (style); - gtk_style_context_add_class (style, GTK_STYLE_CLASS_RUBBERBAND); - - gtk_render_background (style, cr, - 0, 0, - gtk_widget_get_allocated_width (window), - gtk_widget_get_allocated_height (window)); - gtk_render_frame (style, cr, - 0, 0, - gtk_widget_get_allocated_width (window), - gtk_widget_get_allocated_height (window)); - - gtk_style_context_restore (style); - } - - return TRUE; -} - -static GtkWidget * -create_select_window (void) -{ - GtkWidget *window; - GdkScreen *screen; - GdkVisual *visual; - - screen = gdk_screen_get_default (); - visual = gdk_screen_get_rgba_visual (screen); - - window = gtk_window_new (GTK_WINDOW_POPUP); - if (gdk_screen_is_composited (screen) && visual) - { - gtk_widget_set_visual (window, visual); - gtk_widget_set_app_paintable (window, TRUE); - } - - g_signal_connect (window, "draw", G_CALLBACK (select_window_draw), NULL); - - gtk_window_move (GTK_WINDOW (window), -100, -100); - gtk_window_resize (GTK_WINDOW (window), 10, 10); - gtk_widget_show (window); - - return window; -} - -typedef struct { GdkRectangle rectangle; SelectAreaCallback callback; gpointer callback_data; @@ -224,56 +47,6 @@ emit_select_callback_in_idle (gpointer user_data) } static void -screenshot_select_area_x11_async (CallbackData *cb_data) -{ - g_autoptr(GdkCursor) cursor = NULL; - GdkDisplay *display; - select_area_filter_data data; - GdkSeat *seat; - - data.rect.x = 0; - data.rect.y = 0; - data.rect.width = 0; - data.rect.height = 0; - data.button_pressed = FALSE; - data.aborted = FALSE; - data.window = create_select_window(); - - g_signal_connect (data.window, "key-press-event", G_CALLBACK (select_area_key_press), &data); - g_signal_connect (data.window, "button-press-event", G_CALLBACK (select_area_button_press), &data); - g_signal_connect (data.window, "button-release-event", G_CALLBACK (select_area_button_release), &data); - g_signal_connect (data.window, "motion-notify-event", G_CALLBACK (select_area_motion_notify), &data); - - display = gtk_widget_get_display (data.window); - cursor = gdk_cursor_new_for_display (display, GDK_CROSSHAIR); - seat = gdk_display_get_default_seat (display); - - gdk_seat_grab (seat, - gtk_widget_get_window (data.window), - GDK_SEAT_CAPABILITY_ALL, - FALSE, - cursor, - NULL, - NULL, - NULL); - - gtk_main (); - - gdk_seat_ungrab (seat); - - gtk_widget_destroy (data.window); - - cb_data->aborted = data.aborted; - cb_data->rectangle = data.rect; - - /* FIXME: we should actually be emitting the callback When - * the compositor has finished re-drawing, but there seems to be no easy - * way to know that. - */ - g_timeout_add (200, emit_select_callback_in_idle, cb_data); -} - -static void select_area_done (GObject *source_object, GAsyncResult *res, gpointer user_data) @@ -292,10 +65,8 @@ select_area_done (GObject *source_object, return; } - g_message ("Unable to select area using GNOME Shell's builtin screenshot " - "interface, resorting to fallback X11."); + g_message ("Unable to select area."); - screenshot_select_area_x11_async (cb_data); return; } |