summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Fourdan <ofourdan@redhat.com>2018-03-23 13:05:12 +0100
committerOlivier Fourdan <ofourdan@redhat.com>2018-03-23 15:12:37 +0100
commit67917db45f96befb777e5f331a775ea3c2b53012 (patch)
treed93ad4b468e030001c9c3673990a9f67f2192726
parent8286557a0555058440536e88393fda445d49d399 (diff)
downloadmutter-67917db45f96befb777e5f331a775ea3c2b53012.tar.gz
wayland: Use cursor position in logical monitor
When using two monitors size by side with different scales, once the cursor moves from one output to another one, its size changes based on the scale of the given output. Changing the size of the cursor can cause the cursor area to change output again if the hotspot is not exactly at the top left corner of the area, causing the texture of the cursor to change, which will trigger another output change, so on and so forth causing continuous surface enter/leave event which flood the clients and eventually kill them. Change the logic to use only the actual cursor position to determine if its on the given logical monitor, so that it remains immune to scale changes induced by output scale differences. Closes: https://gitlab.gnome.org/GNOME/mutter/issues/83
-rw-r--r--src/backends/meta-cursor-renderer.c12
-rw-r--r--src/backends/meta-cursor-renderer.h1
-rw-r--r--src/wayland/meta-wayland-surface-role-cursor.c9
3 files changed, 18 insertions, 4 deletions
diff --git a/src/backends/meta-cursor-renderer.c b/src/backends/meta-cursor-renderer.c
index 27617ef92..6c0ec57a8 100644
--- a/src/backends/meta-cursor-renderer.c
+++ b/src/backends/meta-cursor-renderer.c
@@ -264,6 +264,18 @@ meta_cursor_renderer_set_position (MetaCursorRenderer *renderer,
update_cursor (renderer, priv->displayed_cursor);
}
+ClutterPoint
+meta_cursor_renderer_get_position (MetaCursorRenderer *renderer)
+{
+ MetaCursorRendererPrivate *priv =
+ meta_cursor_renderer_get_instance_private (renderer);
+
+ return (ClutterPoint) {
+ .x = priv->current_x,
+ .y = priv->current_y
+ };
+}
+
MetaCursorSprite *
meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer)
{
diff --git a/src/backends/meta-cursor-renderer.h b/src/backends/meta-cursor-renderer.h
index 8ac0fe79b..1691f4471 100644
--- a/src/backends/meta-cursor-renderer.h
+++ b/src/backends/meta-cursor-renderer.h
@@ -62,6 +62,7 @@ void meta_cursor_renderer_set_cursor (MetaCursorRenderer *renderer,
void meta_cursor_renderer_set_position (MetaCursorRenderer *renderer,
float x,
float y);
+ClutterPoint meta_cursor_renderer_get_position (MetaCursorRenderer *renderer);
void meta_cursor_renderer_force_update (MetaCursorRenderer *renderer);
MetaCursorSprite * meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer);
diff --git a/src/wayland/meta-wayland-surface-role-cursor.c b/src/wayland/meta-wayland-surface-role-cursor.c
index 1c8ba94e5..d118a8917 100644
--- a/src/wayland/meta-wayland-surface-role-cursor.c
+++ b/src/wayland/meta-wayland-surface-role-cursor.c
@@ -195,14 +195,15 @@ cursor_surface_role_is_on_logical_monitor (MetaWaylandSurfaceRole *role,
META_WAYLAND_SURFACE_ROLE_CURSOR (surface->role);
MetaWaylandSurfaceRoleCursorPrivate *priv =
meta_wayland_surface_role_cursor_get_instance_private (cursor_role);
- ClutterRect rect;
+ ClutterPoint point;
ClutterRect logical_monitor_rect;
- rect = meta_cursor_renderer_calculate_rect (priv->cursor_renderer,
- priv->cursor_sprite);
logical_monitor_rect =
meta_rectangle_to_clutter_rect (&logical_monitor->rect);
- return clutter_rect_intersection (&rect, &logical_monitor_rect, NULL);
+
+ point = meta_cursor_renderer_get_position (priv->cursor_renderer);
+
+ return clutter_rect_contains_point (&logical_monitor_rect, &point);
}
static void