[mutter/wip/carlosg/input-thread: 18/96] backends/native: Make seat constrain pointer to monitors out of the box
- From: Carlos Garnacho <carlosg src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wip/carlosg/input-thread: 18/96] backends/native: Make seat constrain pointer to monitors out of the box
- Date: Tue, 6 Oct 2020 15:50:42 +0000 (UTC)
commit 68372166cc07db99df81ed0e75e9afb3883c512f
Author: Carlos Garnacho <carlosg gnome org>
Date: Fri Jun 5 12:44:12 2020 +0200
backends/native: Make seat constrain pointer to monitors out of the box
It does access the MetaMonitorManager directly ATM.
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1403
src/backends/native/meta-backend-native.c | 66 ----------------------------
src/backends/native/meta-seat-native.c | 73 +++++++++++++++++++++++++++----
2 files changed, 65 insertions(+), 74 deletions(-)
---
diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
index ab8cb82d66..dae89c675b 100644
--- a/src/backends/native/meta-backend-native.c
+++ b/src/backends/native/meta-backend-native.c
@@ -124,60 +124,6 @@ constrain_to_client_constraint (ClutterInputDevice *device,
time, prev_x, prev_y, x, y);
}
-/*
- * The pointer constrain code is mostly a rip-off of the XRandR code from Xorg.
- * (from xserver/randr/rrcrtc.c, RRConstrainCursorHarder)
- *
- * Copyright © 2006 Keith Packard
- * Copyright 2010 Red Hat, Inc
- *
- */
-
-static void
-constrain_all_screen_monitors (ClutterInputDevice *device,
- MetaMonitorManager *monitor_manager,
- float *x,
- float *y)
-{
- graphene_point_t current;
- float cx, cy;
- GList *logical_monitors, *l;
-
- clutter_input_device_get_coords (device, NULL, ¤t);
-
- cx = current.x;
- cy = current.y;
-
- /* if we're trying to escape, clamp to the CRTC we're coming from */
-
- logical_monitors =
- meta_monitor_manager_get_logical_monitors (monitor_manager);
- for (l = logical_monitors; l; l = l->next)
- {
- MetaLogicalMonitor *logical_monitor = l->data;
- int left, right, top, bottom;
-
- left = logical_monitor->rect.x;
- right = left + logical_monitor->rect.width;
- top = logical_monitor->rect.y;
- bottom = top + logical_monitor->rect.height;
-
- if ((cx >= left) && (cx < right) && (cy >= top) && (cy < bottom))
- {
- if (*x < left)
- *x = left;
- if (*x >= right)
- *x = right - 1;
- if (*y < top)
- *y = top;
- if (*y >= bottom)
- *y = bottom - 1;
-
- return;
- }
- }
-}
-
static void
pointer_constrain_callback (ClutterInputDevice *device,
guint32 time,
@@ -187,20 +133,8 @@ pointer_constrain_callback (ClutterInputDevice *device,
float *new_y,
gpointer user_data)
{
- MetaBackend *backend = meta_get_backend ();
- MetaMonitorManager *monitor_manager =
- meta_backend_get_monitor_manager (backend);
-
/* Constrain to pointer lock */
constrain_to_client_constraint (device, time, prev_x, prev_y, new_x, new_y);
-
- /* if we're moving inside a monitor, we're fine */
- if (meta_monitor_manager_get_logical_monitor_at (monitor_manager,
- *new_x, *new_y))
- return;
-
- /* if we're trying to escape, clamp to the CRTC we're coming from */
- constrain_all_screen_monitors (device, monitor_manager, new_x, new_y);
}
static void
diff --git a/src/backends/native/meta-seat-native.c b/src/backends/native/meta-seat-native.c
index f07e570df8..c44bd8a173 100644
--- a/src/backends/native/meta-seat-native.c
+++ b/src/backends/native/meta-seat-native.c
@@ -902,6 +902,60 @@ constrain_to_barriers (MetaSeatNative *seat,
new_x, new_y);
}
+/*
+ * The pointer constrain code is mostly a rip-off of the XRandR code from Xorg.
+ * (from xserver/randr/rrcrtc.c, RRConstrainCursorHarder)
+ *
+ * Copyright © 2006 Keith Packard
+ * Copyright 2010 Red Hat, Inc
+ *
+ */
+
+static void
+constrain_all_screen_monitors (ClutterInputDevice *device,
+ MetaMonitorManager *monitor_manager,
+ float *x,
+ float *y)
+{
+ graphene_point_t current;
+ float cx, cy;
+ GList *logical_monitors, *l;
+
+ clutter_input_device_get_coords (device, NULL, ¤t);
+
+ cx = current.x;
+ cy = current.y;
+
+ /* if we're trying to escape, clamp to the CRTC we're coming from */
+
+ logical_monitors =
+ meta_monitor_manager_get_logical_monitors (monitor_manager);
+ for (l = logical_monitors; l; l = l->next)
+ {
+ MetaLogicalMonitor *logical_monitor = l->data;
+ int left, right, top, bottom;
+
+ left = logical_monitor->rect.x;
+ right = left + logical_monitor->rect.width;
+ top = logical_monitor->rect.y;
+ bottom = top + logical_monitor->rect.height;
+
+ if ((cx >= left) && (cx < right) && (cy >= top) && (cy < bottom))
+ {
+ if (*x < left)
+ *x = left;
+ if (*x >= right)
+ *x = right - 1;
+ if (*y < top)
+ *y = top;
+ if (*y >= bottom)
+ *y = bottom - 1;
+
+ return;
+ }
+ }
+}
+
void
meta_seat_native_constrain_pointer (MetaSeatNative *seat,
ClutterInputDevice *core_pointer,
@@ -911,6 +965,10 @@ meta_seat_native_constrain_pointer (MetaSeatNative *seat,
float *new_x,
float *new_y)
{
+ MetaBackend *backend = meta_get_backend ();
+ MetaMonitorManager *monitor_manager =
+ meta_backend_get_monitor_manager (backend);
+
/* Constrain to barriers */
constrain_to_barriers (seat, core_pointer,
us2ms (time_us),
@@ -924,15 +982,14 @@ meta_seat_native_constrain_pointer (MetaSeatNative *seat,
new_x, new_y,
seat->constrain_data);
}
- else
- {
- ClutterActor *stage = CLUTTER_ACTOR (meta_seat_native_get_stage (seat));
- float stage_width = clutter_actor_get_width (stage);
- float stage_height = clutter_actor_get_height (stage);
- *new_x = CLAMP (*new_x, 0.f, stage_width - 1);
- *new_y = CLAMP (*new_y, 0.f, stage_height - 1);
- }
+ /* if we're moving inside a monitor, we're fine */
+ if (meta_monitor_manager_get_logical_monitor_at (monitor_manager,
+ *new_x, *new_y))
+ return;
+
+ /* if we're trying to escape, clamp to the CRTC we're coming from */
+ constrain_all_screen_monitors (core_pointer, monitor_manager, new_x, new_y);
}
void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]