We can use this to test more complex confine regions.

Signed-off-by: Jonas Ådahl <[email protected]>
---

Changes since v2:

 * Added support for updating the manually set confine region.


 clients/window.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++--------
 clients/window.h | 11 +++++++++
 2 files changed, 70 insertions(+), 10 deletions(-)

diff --git a/clients/window.c b/clients/window.c
index a468ad0..f557baf 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -4691,14 +4691,16 @@ static const struct _wl_confined_pointer_listener 
confined_pointer_listener = {
 };
 
 int
-window_confine_pointer_to_widget(struct window *window,
-                                struct widget *widget,
-                                struct input *input)
+window_confine_pointer_to_rectangles(struct window *window,
+                                    struct input *input,
+                                    struct rectangle *rectangles,
+                                    int num_rectangles)
 {
        struct _wl_pointer_lock *pointer_lock = window->display->pointer_lock;
        struct _wl_confined_pointer *confined_pointer;
        struct wl_compositor *compositor = window->display->compositor;
        struct wl_region *region = NULL;
+       int i;
 
        if (!window->display->pointer_lock)
                return -1;
@@ -4712,13 +4714,15 @@ window_confine_pointer_to_widget(struct window *window,
        if (!input->pointer)
                return -1;
 
-       if (widget) {
+       if (num_rectangles >= 1) {
                region = wl_compositor_create_region(compositor);
-               wl_region_add(region,
-                             widget->allocation.x,
-                             widget->allocation.y,
-                             widget->allocation.width,
-                             widget->allocation.height);
+               for (i = 0; i < num_rectangles; i++) {
+                       wl_region_add(region,
+                                     rectangles[i].x,
+                                     rectangles[i].y,
+                                     rectangles[i].width,
+                                     rectangles[i].height);
+               }
        }
 
        confined_pointer =
@@ -4734,12 +4738,57 @@ window_confine_pointer_to_widget(struct window *window,
                                          input);
 
        window->confined_pointer = confined_pointer;
-       window->confined_widget = widget;
+       window->confined_widget = NULL;
 
        return 0;
 }
 
 void
+window_update_confine_rectangles(struct window *window,
+                                struct rectangle *rectangles,
+                                int num_rectangles)
+{
+       struct wl_compositor *compositor = window->display->compositor;
+       struct wl_region *region;
+       int i;
+
+       region = wl_compositor_create_region(compositor);
+       for (i = 0; i < num_rectangles; i++) {
+               wl_region_add(region,
+                             rectangles[i].x,
+                             rectangles[i].y,
+                             rectangles[i].width,
+                             rectangles[i].height);
+       }
+
+       _wl_confined_pointer_set_region(window->confined_pointer, region);
+
+       wl_region_destroy(region);
+}
+
+int
+window_confine_pointer_to_widget(struct window *window,
+                                struct widget *widget,
+                                struct input *input)
+{
+       int ret;
+
+       if (widget) {
+               ret = window_confine_pointer_to_rectangles(window,
+                                                          input,
+                                                          &widget->allocation,
+                                                          1);
+               window->confined_widget = widget;
+               return ret;
+       } else {
+               return window_confine_pointer_to_rectangles(window,
+                                                           input,
+                                                           NULL,
+                                                           0);
+       }
+}
+
+void
 window_unconfine_pointer(struct window *window)
 {
        if (!window->confined_pointer)
diff --git a/clients/window.h b/clients/window.h
index c62a6db..fb322ac 100644
--- a/clients/window.h
+++ b/clients/window.h
@@ -386,6 +386,17 @@ widget_set_locked_pointer_cursor_hint(struct widget 
*widget,
                                      float x, float y);
 
 int
+window_confine_pointer_to_rectangles(struct window *window,
+                                    struct input *input,
+                                    struct rectangle *rectangles,
+                                    int num_rectangles);
+
+void
+window_update_confine_rectangles(struct window *window,
+                                struct rectangle *rectangles,
+                                int num_rectangles);
+
+int
 window_confine_pointer_to_widget(struct window *window,
                                 struct widget *widget,
                                 struct input *input);
-- 
2.1.4

_______________________________________________
wayland-devel mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to