[PATCH v3 weston] window: Add API for manually set confine region
Jonas Ådahl
jadahl at gmail.com
Thu Jun 25 21:38:02 PDT 2015
We can use this to test more complex confine regions.
Signed-off-by: Jonas Ådahl <jadahl at gmail.com>
---
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
More information about the wayland-devel
mailing list