Signed-off-by: longcheng <longcheng@kylinsec.com.cn> (cherry picked from commit 9b1b23452c0f29171b82df42088f6d639f92558e)
150 lines
5.4 KiB
Diff
150 lines
5.4 KiB
Diff
From 15cc4fa985c1d6adc78c68a90fe90ba3d219e221 Mon Sep 17 00:00:00 2001
|
|
From: longcheng <longcheng@kylinos.com.cn>
|
|
Date: Tue, 22 Mar 2022 16:51:12 +0800
|
|
Subject: [PATCH 0/4] draw mask for whole screen except the selection area
|
|
|
|
---
|
|
mate-screenshot/src/screenshot-utils.c | 79 ++++++++++----------------
|
|
1 file changed, 30 insertions(+), 49 deletions(-)
|
|
|
|
diff --git a/mate-screenshot/src/screenshot-utils.c b/mate-screenshot/src/screenshot-utils.c
|
|
index 8809571..a8eaea7 100644
|
|
--- a/mate-screenshot/src/screenshot-utils.c
|
|
+++ b/mate-screenshot/src/screenshot-utils.c
|
|
@@ -213,6 +213,10 @@ select_area_button_press (GtkWidget *window,
|
|
data->button_pressed = TRUE;
|
|
data->rect.x = event->x_root;
|
|
data->rect.y = event->y_root;
|
|
+ data->rect.width = 0;
|
|
+ data->rect.height = 0;
|
|
+
|
|
+ gtk_widget_queue_draw(window);
|
|
|
|
return TRUE;
|
|
}
|
|
@@ -227,52 +231,10 @@ select_area_motion_notify (GtkWidget *window,
|
|
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, *region2;
|
|
- cairo_rectangle_int_t region_rect = {
|
|
- 0, 0,
|
|
- draw_rect.width - 2, draw_rect.height - 2
|
|
- };
|
|
-
|
|
- region = cairo_region_create_rectangle (®ion_rect);
|
|
- region_rect.x++;
|
|
- region_rect.y++;
|
|
- region_rect.width -= 2;
|
|
- region_rect.height -= 2;
|
|
- region2 = cairo_region_create_rectangle (®ion_rect);
|
|
- cairo_region_subtract (region, region2);
|
|
-
|
|
- gdk_window_shape_combine_region (gdkwindow, region, 0, 0);
|
|
-
|
|
- cairo_region_destroy (region);
|
|
- cairo_region_destroy (region2);
|
|
- }
|
|
- else
|
|
- gdk_window_shape_combine_region (gdkwindow, NULL, 0, 0);
|
|
- }
|
|
+ data->rect.width = event->x_root - data->rect.x;
|
|
+ data->rect.height = event->y_root - data->rect.y;
|
|
|
|
+ gtk_widget_queue_draw(window);
|
|
return TRUE;
|
|
}
|
|
|
|
@@ -316,18 +278,35 @@ static gboolean
|
|
draw (GtkWidget *window, cairo_t *cr, gpointer unused)
|
|
{
|
|
GtkStyleContext *style;
|
|
+ GdkRectangle *rect;
|
|
|
|
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_set_source_rgba (cr, 0, 0, 0, 0.6);
|
|
cairo_paint (cr);
|
|
|
|
gtk_style_context_save (style);
|
|
gtk_style_context_add_class (style, GTK_STYLE_CLASS_RUBBERBAND);
|
|
|
|
+ cairo_save(cr);
|
|
+ rect = g_object_get_data(G_OBJECT(window), "selection-area");
|
|
+ if (rect->width != 0 || rect->height != 0) {
|
|
+ cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
|
|
+ cairo_set_source_rgba (cr, 0.0, 0, 0, 0.0);
|
|
+ cairo_rectangle(cr, rect->x, rect->y, rect->width, rect->height);
|
|
+ cairo_fill (cr);
|
|
+
|
|
+ cairo_set_line_width (cr, 1.0);
|
|
+ cairo_set_source_rgb (cr, 255/255.0, 0/255.0, 0/255.0);
|
|
+ cairo_rectangle (cr,
|
|
+ rect->x + 0.5, rect->y + 0.5,
|
|
+ rect->width - 1, rect->height - 1);
|
|
+ cairo_stroke (cr);
|
|
+ }
|
|
+#if 0
|
|
gtk_render_background (style, cr,
|
|
0, 0,
|
|
gtk_widget_get_allocated_width (window),
|
|
@@ -336,7 +315,8 @@ draw (GtkWidget *window, cairo_t *cr, gpointer unused)
|
|
0, 0,
|
|
gtk_widget_get_allocated_width (window),
|
|
gtk_widget_get_allocated_height (window));
|
|
-
|
|
+#endif
|
|
+ cairo_restore(cr);
|
|
gtk_style_context_restore (style);
|
|
}
|
|
|
|
@@ -358,8 +338,8 @@ create_select_window (void)
|
|
|
|
g_signal_connect (window, "draw", G_CALLBACK (draw), NULL);
|
|
|
|
- gtk_window_move (GTK_WINDOW (window), -100, -100);
|
|
- gtk_window_resize (GTK_WINDOW (window), 10, 10);
|
|
+ gtk_window_resize(GTK_WINDOW(window), gdk_screen_get_width(screen), gdk_screen_get_height(screen));
|
|
+ gtk_window_move(GTK_WINDOW(window), 0, 0);
|
|
gtk_widget_show (window);
|
|
return window;
|
|
}
|
|
@@ -401,6 +381,7 @@ screenshot_select_area_async (SelectAreaCallback callback)
|
|
cb_data = g_slice_new0 (CallbackData);
|
|
cb_data->callback = callback;
|
|
|
|
+ g_object_set_data(G_OBJECT(data.window), "selection-area", &data.rect);
|
|
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);
|
|
--
|
|
2.27.0
|
|
|