[Xfce4-commits] [xfce/xfce4-settings] 21/27: Fix race condition and drop lots of unneeded calls

noreply at xfce.org noreply at xfce.org
Sun Feb 25 23:56:30 CET 2018


This is an automated email from the git hooks/post-receive script.

o   c   h   o   s   i       p   u   s   h   e   d       a       c   o   m   m   i   t       t   o       b   r   a   n   c   h       x   f   c   e   -   4   .   1   2   
   in repository xfce/xfce4-settings.

commit 151e294abf0649b3f193baeec49168b39f41743c
Author: Simon Steinbeiss <simon.steinbeiss at elfenbeinturm.at>
Date:   Sun Feb 25 13:10:37 2018 +0100

    Fix race condition and drop lots of unneeded calls
    
    Taking the screenshot should happen before the expose event, not
    inside.
    Also: don't query things we already know like width and height of
    the window or the pointer position (as that always stays the same)
---
 dialogs/accessibility-settings/find-cursor.c | 63 +++++++++++++---------------
 1 file changed, 29 insertions(+), 34 deletions(-)

diff --git a/dialogs/accessibility-settings/find-cursor.c b/dialogs/accessibility-settings/find-cursor.c
index cd6ef00..0932bd6 100644
--- a/dialogs/accessibility-settings/find-cursor.c
+++ b/dialogs/accessibility-settings/find-cursor.c
@@ -39,7 +39,10 @@
 double px = 1;
 
 /* size of the final circles */
-gint circle_size=500;
+gint circle_size = 500;
+
+GdkPixbuf *pixbuf = NULL;
+gint screenshot_offset_x, screenshot_offset_y;
 
 /* gdk_cairo_set_source_pixbuf() crashes with 0,0 */
 gint workaround_offset = 1;
@@ -70,7 +73,7 @@ static GdkPixbuf
         height += y;
         y = 0;
     }
- 
+
     screenshot =
         gdk_pixbuf_get_from_drawable (NULL, root_window, colormap,
                                       x,
@@ -111,54 +114,37 @@ find_cursor_window_composited (GtkWidget *widget) {
     return composited;
 }
 
-GdkPixbuf *pixbuf = NULL;
-gint screenshot_offset_x, screenshot_offset_y;
+
 
 static gboolean
-find_cursor_window_expose (GtkWidget *widget,
-                           GdkEvent  *event,
-                           gpointer   user_data) {
+find_cursor_window_expose (GtkWidget       *widget,
+                           GdkEventExpose  *event,
+                           gpointer         user_data) {
     cairo_t *cr;
-    GdkWindow *window = gtk_widget_get_window (widget);
-    int width, height;
-    gint x, y, root_x, root_y;
     int i = 0;
     int arcs = 1;
     gboolean composited = GPOINTER_TO_INT (user_data);
 
-    gtk_widget_get_size_request (widget, &width, &height);
-    gdk_window_get_pointer (window, &x, &y, NULL);
-    gtk_window_get_position (GTK_WINDOW (widget), &root_x, &root_y);
-
-    cr = gdk_cairo_create (window);
+    cr = gdk_cairo_create (event->window);
     if (composited) {
         cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
         cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 0.0);
     }
     else {
-        /* only take a screenshot once in the first iteration */
-        if (px == 1) {
-            /* this offset has to match the screenshot */
-            screenshot_offset_x = root_x + x - (circle_size / 2) - workaround_offset;
-            screenshot_offset_y = root_y + y - (circle_size / 2) - workaround_offset;
-
-            pixbuf = get_rectangle_screenshot (screenshot_offset_x, screenshot_offset_y);
-            if (!pixbuf)
-                g_warning("Getting screenshot failed");
-        }
-
         if (pixbuf) {
             if (screenshot_offset_x > 0) screenshot_offset_x = 0;
             if (screenshot_offset_y > 0) screenshot_offset_y = 0;
 
             gdk_cairo_set_source_pixbuf (cr, pixbuf, 0 - screenshot_offset_x - workaround_offset, 0 - screenshot_offset_y - workaround_offset);
         }
+        else
+            g_warning ("Something with the screenshot went wrong.");
     }
 
     cairo_paint (cr);
 
     cairo_set_line_width (cr, 3.0);
-    cairo_translate (cr, width / 2, height / 2);
+    cairo_translate (cr, circle_size / 2, circle_size / 2);
 
     if (px > 90.0)
         arcs = 4;
@@ -183,12 +169,12 @@ find_cursor_window_expose (GtkWidget *widget,
     if (px >= (circle_size/2)) {
         if (pixbuf)
             g_object_unref (pixbuf);
-        gtk_main_quit();
+        gtk_main_quit ();
     }
 
     px += 3;
 
-    cairo_destroy(cr);
+    cairo_destroy (cr);
 
     return FALSE;
 }
@@ -233,30 +219,39 @@ main (gint argc, gchar **argv)
     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), circle_size, circle_size);
-    gtk_widget_set_size_request (window, circle_size, circle_size);
+    gtk_widget_set_size_request (GTK_WIDGET (window), circle_size, circle_size);
     gtk_window_set_decorated (GTK_WINDOW (window), FALSE);
-    gtk_widget_set_app_paintable (window, TRUE);
+    gtk_widget_set_app_paintable (GTK_WIDGET (window), TRUE);
     gtk_window_set_skip_taskbar_hint (GTK_WINDOW (window), FALSE);
 
     /* center the window around the mouse cursor */
     gtk_window_move (GTK_WINDOW (window), x - (circle_size/2), y - (circle_size/2));
 
     /* check if we're in a composited environment */
-    composited = find_cursor_window_composited (window);
+    composited = find_cursor_window_composited (GTK_WIDGET (window));
 
     /* make the circles follow the mouse cursor */
     if (composited) {
-        gtk_widget_set_events (window, GDK_POINTER_MOTION_MASK);
+        gtk_widget_set_events (GTK_WIDGET (window), GDK_POINTER_MOTION_MASK);
         g_signal_connect (G_OBJECT (window), "motion-notify-event",
                           G_CALLBACK (find_cursor_motion_notify_event), NULL);
     }
+    else {
+        /* this offset has to match the screenshot */
+        screenshot_offset_x = x - (circle_size/2) - workaround_offset;
+        screenshot_offset_y = y - (circle_size/2) - workaround_offset;
+
+        pixbuf = get_rectangle_screenshot (screenshot_offset_x, screenshot_offset_y);
+        if (!pixbuf)
+            g_warning("Getting screenshot failed");
+    }
     g_signal_connect (G_OBJECT (window), "expose-event",
                       G_CALLBACK (find_cursor_window_expose), GINT_TO_POINTER (composited));
     g_signal_connect (G_OBJECT (window), "destroy",
                       G_CALLBACK (gtk_main_quit), NULL);
 
 
-    gtk_widget_show_all (window);
+    gtk_widget_show_all (GTK_WIDGET (window));
 
     g_timeout_add (10, timeout, window);
 

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list