summaryrefslogtreecommitdiff
path: root/src/screenshot-area-selection.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/screenshot-area-selection.c')
-rw-r--r--src/screenshot-area-selection.c231
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 (&region_rect);
- region_rect.x++;
- region_rect.y++;
- region_rect.width -= 2;
- region_rect.height -= 2;
- cairo_region_subtract_rectangle (region, &region_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;
}