[mutter/wip/carlosg/invalid-constraint-region] wayland: Ensure pointer constraint region consistency




commit 98ef6d0d0521b3cfb72153bc427a9bfc86b8d338
Author: Carlos Garnacho <carlosg gnome org>
Date:   Wed Dec 23 18:58:48 2020 +0100

    wayland: Ensure pointer constraint region consistency
    
    Changes in games between fullscreen and windowed modes may trigger
    chaotic situations where the buffer and the frame size temporarily
    disagree, producing rectangles with negative width/height. This is
    usually followed by other updates that bring the pointer constraint
    up to date.
    
    This makes cairo panic and return an "error" empty region, which breaks
    deeper down when using the region rectangles to apply the pointer
    constraint.
    
    If we hit this situation, ignore the frame rectangle, and just go with
    the buffer rectangle.
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1655>

 src/wayland/meta-wayland-pointer-constraints.c | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)
---
diff --git a/src/wayland/meta-wayland-pointer-constraints.c b/src/wayland/meta-wayland-pointer-constraints.c
index d7033e3ef6..965b95ddad 100644
--- a/src/wayland/meta-wayland-pointer-constraints.c
+++ b/src/wayland/meta-wayland-pointer-constraints.c
@@ -624,12 +624,15 @@ meta_wayland_pointer_constraint_calculate_effective_region (MetaWaylandPointerCo
                                                   frame->right_width);
       actual_height = window->buffer_rect.height - (frame->child_y +
                                                     frame->bottom_height);
-      cairo_region_intersect_rectangle (region, &(cairo_rectangle_int_t) {
-                                          .x = frame->child_x,
-                                          .y = frame->child_y,
-                                          .width = actual_width,
-                                          .height = actual_height
-                                        });
+      if (actual_width > 0 && actual_height > 0)
+        {
+          cairo_region_intersect_rectangle (region, &(cairo_rectangle_int_t) {
+                                              .x = frame->child_x,
+                                              .y = frame->child_y,
+                                              .width = actual_width,
+                                              .height = actual_height
+                                            });
+        }
     }
 
   return region;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]