[Xfce4-commits] [apps/xfce4-screenshooter] 01/01: Show width and height of selection area (Bug #12664)
noreply at xfce.org
noreply at xfce.org
Thu Dec 27 01:17:31 CET 2018
This is an automated email from the git hooks/post-receive script.
a n d r e p u s h e d a c o m m i t t o b r a n c h m a s t e r
in repository apps/xfce4-screenshooter.
commit 31bed658702f0e9a16ed5bcb712499fa39716c36
Author: Andre Miranda <andreldm at xfce.org>
Date: Wed Dec 26 21:16:03 2018 -0300
Show width and height of selection area (Bug #12664)
Thanks Simon for the original patch!
---
lib/screenshooter-capture.c | 115 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 115 insertions(+)
diff --git a/lib/screenshooter-capture.c b/lib/screenshooter-capture.c
index a8fcf23..314e7be 100644
--- a/lib/screenshooter-capture.c
+++ b/lib/screenshooter-capture.c
@@ -42,6 +42,8 @@ typedef struct
gint y_root;
cairo_rectangle_int_t rectangle;
cairo_rectangle_int_t rectangle_root;
+ GtkWidget *size_window;
+ GtkWidget *size_label;
} RubberBandData;
/* For non-composited environments */
@@ -649,6 +651,7 @@ static gboolean cb_button_released (GtkWidget *widget,
if (rbdata->rubber_banding)
{
gtk_dialog_response (GTK_DIALOG (widget), GTK_RESPONSE_NONE);
+ gtk_widget_destroy (rbdata->size_window);
return TRUE;
}
else
@@ -660,10 +663,99 @@ static gboolean cb_button_released (GtkWidget *widget,
+
+static gboolean cb_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 void size_window_get_offset (GtkWidget *widget,
+ gint digits,
+ gint x_event,
+ gint y_event,
+ gint *x_offset,
+ gint *y_offset)
+{
+ GdkRectangle geometry;
+ gint relative_x, relative_y;
+
+ GdkDisplay *display = gtk_widget_get_display (widget);
+ GdkMonitor *monitor = gdk_display_get_monitor_at_point (display, x_event, y_event);
+ gdk_monitor_get_geometry (monitor, &geometry);
+
+ relative_x = x_event - geometry.x;
+ relative_y = y_event - geometry.y;
+
+ *x_offset = -2;
+ *y_offset = -4;
+
+ if (relative_x > geometry.width - (digits * 9))
+ *x_offset -= digits * 9;
+
+ if (relative_y > geometry.height - 20)
+ *y_offset -= 20;
+}
+
+
+
+static void create_size_window (RubberBandData *rbdata)
+{
+ GtkWidget *window, *label;
+ GtkCssProvider *css_provider;
+ GtkStyleContext *context;
+ GdkVisual *visual;
+
+ rbdata->size_window = window = gtk_window_new (GTK_WINDOW_POPUP);
+ gtk_container_set_border_width (GTK_CONTAINER (window), 0);
+ gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
+ gtk_window_set_default_size (GTK_WINDOW (window), 100, 50);
+ gtk_widget_set_size_request (GTK_WIDGET (window), 100, 50);
+ gtk_window_set_decorated (GTK_WINDOW (window), FALSE);
+ gtk_widget_set_app_paintable (GTK_WIDGET (window), TRUE);
+ gtk_window_set_skip_taskbar_hint (GTK_WINDOW (window), FALSE);
+ g_signal_connect (G_OBJECT (window), "draw",
+ G_CALLBACK (cb_size_window_draw), NULL);
+
+ visual = gdk_screen_get_rgba_visual (gtk_widget_get_screen (window));
+ gtk_widget_set_visual (window, visual);
+
+ rbdata->size_label = label = gtk_label_new ("");
+ gtk_label_set_xalign (GTK_LABEL (label), 0.0);
+ gtk_widget_set_valign (label, GTK_ALIGN_START);
+ gtk_widget_set_margin_start (label, 6);
+ gtk_widget_set_margin_top (label, 6);
+ gtk_container_add (GTK_CONTAINER (window), label);
+
+ css_provider = gtk_css_provider_new ();
+ gtk_css_provider_load_from_data (css_provider,
+ "label { font-family: monospace; color: #fff; text-shadow: 1px 1px 0px black; }", -1, NULL);
+
+ context = gtk_widget_get_style_context (GTK_WIDGET (label));
+ gtk_style_context_add_provider (context,
+ GTK_STYLE_PROVIDER (css_provider),
+ GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
+ g_object_unref (css_provider);
+
+ gtk_widget_show_all (GTK_WIDGET (window));
+}
+
+
+
static gboolean cb_motion_notify (GtkWidget *widget,
GdkEventMotion *event,
RubberBandData *rbdata)
{
+ gchar *coords;
+ gint rect_width, rect_height, x_offset, y_offset;
+
if (rbdata->left_pressed)
{
cairo_rectangle_int_t *new_rect, *new_rect_root;
@@ -690,6 +782,26 @@ 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;
+
+ rect_width = old_rect.width;
+ rect_height = old_rect.height;
+
+ /* Take into account when the rectangle is moved out of screen */
+ if (old_rect.x < 0) rect_width += old_rect.x;
+ if (old_rect.y < 0) rect_height += old_rect.y;
+
+ coords = g_strdup_printf ("%d x %d", rect_width, rect_height);
+
+ size_window_get_offset (rbdata->size_window, strlen (coords),
+ event->x_root, event->y_root,
+ &x_offset, &y_offset);
+
+ gtk_window_move (GTK_WINDOW (rbdata->size_window),
+ event->x_root + x_offset,
+ event->y_root + y_offset);
+
+ gtk_label_set_text (GTK_LABEL (rbdata->size_label), coords);
+ g_free (coords);
}
if (rbdata->move_rectangle)
@@ -868,6 +980,9 @@ static GdkPixbuf
gtk_widget_grab_focus (window);
gdk_flush ();
+ /* set up the window showing the screenshot size */
+ create_size_window (&rbdata);
+
/* Wait 100ms before grabbing devices, useful when invoked by global hotkey
* because xfsettings will grab the key for a moment */
g_usleep(100000);
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list