From c373e57025a7ee48bbb0e9d69cf12e84ec059fc4 Mon Sep 17 00:00:00 2001 From: Simon Steinbeiss Date: Mon, 30 Apr 2018 22:36:41 +0200 Subject: [PATCH] Show width and height of the screenshot selection (Bug #12664) --- lib/screenshooter-capture.c | 84 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 79 insertions(+), 5 deletions(-) diff --git a/lib/screenshooter-capture.c b/lib/screenshooter-capture.c index 1e39fca..3fde3a6 100644 --- a/lib/screenshooter-capture.c +++ b/lib/screenshooter-capture.c @@ -21,6 +21,8 @@ #define BACKGROUND_TRANSPARENCY 0.4 +GtkWidget *screenshot_size_window, *screenshot_size_label; + enum { ANCHOR_UNSET = 0, ANCHOR_NONE = 1, @@ -272,7 +274,7 @@ fallback: return NULL; TRACE ("Get the coordinates of the cursor"); - + seat = gdk_display_get_default_seat (gdk_display_get_default ()); pointer = gdk_seat_get_pointer (seat); gdk_window_get_device_position (root, pointer, cursorx, cursory, NULL); @@ -642,6 +644,7 @@ static gboolean cb_button_released (GtkWidget *widget, if (rbdata->rubber_banding) { gtk_dialog_response (GTK_DIALOG (widget), GTK_RESPONSE_NONE); + gtk_widget_destroy (screenshot_size_window); return TRUE; } else @@ -652,11 +655,43 @@ static gboolean cb_button_released (GtkWidget *widget, } +static gboolean +screenshot_size_window_composited (GtkWidget *widget) { + GdkScreen *screen = gtk_widget_get_screen (widget); + GdkVisual *visual = gdk_screen_get_rgba_visual (screen); + gboolean composited; + + if (gdk_screen_is_composited (screen)) + composited = TRUE; + else + { + visual = gdk_screen_get_system_visual (screen); + composited = FALSE; + } + + gtk_widget_set_visual (widget, visual); + return composited; +} + + + +static gboolean +screenshot_size_window_draw (GtkWidget *widget, + cairo_t *cr, + gpointer user_data) { + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0); + cairo_paint (cr); + + return FALSE; +} static gboolean cb_motion_notify (GtkWidget *widget, GdkEventMotion *event, RubberBandData *rbdata) { + const gchar *coords; + if (rbdata->left_pressed) { cairo_rectangle_int_t *new_rect, *new_rect_root; @@ -683,6 +718,9 @@ static gboolean cb_motion_notify (GtkWidget *widget, old_rect.y = new_rect->y; old_rect.width = new_rect->width; old_rect.height = new_rect->height; + coords = g_strdup_printf ("%d\n%d", old_rect.width, old_rect.height); + gtk_window_move (GTK_WINDOW (screenshot_size_window), event->x_root, event->y_root); + gtk_label_set_text (GTK_LABEL (screenshot_size_label), coords); } if (rbdata->move_rectangle) @@ -795,6 +833,9 @@ static GdkPixbuf GdkGrabStatus res; GdkSeat *seat; GdkCursor *xhair_cursor; + GtkCssProvider *css_provider; + GtkStyleContext *context; + gchar *css_string; /* Initialize the rubber band data */ rbdata.left_pressed = FALSE; @@ -847,8 +888,41 @@ static GdkPixbuf gtk_widget_grab_focus (window); gdk_flush (); + /* set up the window showing the screenshot size */ + screenshot_size_window = gtk_window_new (GTK_WINDOW_POPUP); + gtk_container_set_border_width (GTK_CONTAINER (screenshot_size_window), 0); + gtk_window_set_resizable (GTK_WINDOW (screenshot_size_window), FALSE); + gtk_window_set_default_size (GTK_WINDOW (screenshot_size_window), 100, 50); + gtk_widget_set_size_request (GTK_WIDGET (screenshot_size_window), 100, 50); + gtk_window_set_decorated (GTK_WINDOW (screenshot_size_window), FALSE); + gtk_widget_set_app_paintable (GTK_WIDGET (screenshot_size_window), TRUE); + gtk_window_set_skip_taskbar_hint (GTK_WINDOW (screenshot_size_window), FALSE); + + + screenshot_size_label = gtk_label_new (""); + gtk_label_set_xalign (GTK_LABEL (screenshot_size_label), 0.0); + gtk_widget_set_valign (screenshot_size_label, GTK_ALIGN_START); + gtk_widget_set_margin_start (screenshot_size_label, 6); + gtk_widget_set_margin_top (screenshot_size_label, 6); + gtk_container_add (GTK_CONTAINER (screenshot_size_window), screenshot_size_label); + + css_provider = gtk_css_provider_new (); + css_string = "label { color: #fff; text-shadow: 1px 1px 2px black; }"; + context = gtk_widget_get_style_context (GTK_WIDGET (screenshot_size_label)); + gtk_css_provider_load_from_data (css_provider, css_string, -1, NULL); + gtk_style_context_add_provider (context, + GTK_STYLE_PROVIDER (css_provider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + + /* only show the window if we're in a composited environment */ + if (screenshot_size_window_composited (screenshot_size_window)) { + g_signal_connect (G_OBJECT (screenshot_size_window), "draw", + G_CALLBACK (screenshot_size_window_draw), NULL); + gtk_widget_show_all (GTK_WIDGET (screenshot_size_window)); + } + /* Wait 100ms before grabbing devices, useful when invoked by global hotkey - * because xfsettings will grab the key for a moment */ + * because xfsettings will grab the key for a moment */ g_usleep(100000); /* Grab the mouse and the keyboard to prevent any interaction with other @@ -874,7 +948,7 @@ static GdkPixbuf res = gdk_device_grab (pointer, gtk_widget_get_window (window), GDK_OWNERSHIP_NONE, FALSE, GDK_POINTER_MOTION_MASK | - GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK, NULL, GDK_CURRENT_TIME); @@ -1144,7 +1218,7 @@ static GdkPixbuf GDK_CROSSHAIR); /* Wait 100ms before grabbing devices, useful when invoked by global hotkey - * because xfsettings will grab the key for a moment */ + * because xfsettings will grab the key for a moment */ g_usleep(100000); /* Grab the mouse and the keyboard to prevent any interaction with other @@ -1169,7 +1243,7 @@ static GdkPixbuf res = gdk_device_grab (pointer, root_window, GDK_OWNERSHIP_NONE, FALSE, GDK_POINTER_MOTION_MASK | - GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK, xhair_cursor, GDK_CURRENT_TIME); -- 2.14.1