[v3,weston] window: Add API for manually set confine region

Submitted by Jonas Ådahl on June 26, 2015, 4:38 a.m.

Details

Message ID 1435293482-20979-9-git-send-email-jadahl@gmail.com
State Superseded
Delegated to: Daniel Stone
Headers show

Not browsing as part of any series.

Commit Message

Jonas Ådahl June 26, 2015, 4:38 a.m.
We can use this to test more complex confine regions.

Signed-off-by: Jonas Ådahl <jadahl@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(-)

Patch hide | download patch | download mbox

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);