summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRui Matos <tiagomatos@gmail.com>2016-03-07 17:24:13 +0100
committerRui Matos <tiagomatos@gmail.com>2016-03-10 16:01:54 +0100
commit8b801aac772f92b2c6d8341931b03bbe8d5f8cd6 (patch)
treea87af271e54cc455698782de150a28a12fef8c8b
parentc380f2e03fea133c787fdc8b651420a47c7b2ed9 (diff)
downloadmutter-8b801aac772f92b2c6d8341931b03bbe8d5f8cd6.tar.gz
Handle meta_screen_get_monitor_for_point() returning NULL
On the X11 backend we don't track the pointer position in priv->current_x/y which remain set to zero. That means we never set the clutter stage cursor if point 0,0 isn't covered by any monitor since we return early. Commit 4bebc5e5fa8aade8a96c769bf2365abe0948f6ce introduced this to avoid crashing on the prepare-at handlers when the cursor position doesn't fall inside any monitor area but we can handle that higher up in the stack. In that case, the sprite's scale doesn't matter since the cursor won't be shown anyway so we can skip setting it. https://bugzilla.gnome.org/show_bug.cgi?id=763159
-rw-r--r--src/backends/meta-cursor-renderer.c15
-rw-r--r--src/core/screen.c3
-rw-r--r--src/wayland/meta-wayland-pointer.c5
3 files changed, 5 insertions, 18 deletions
diff --git a/src/backends/meta-cursor-renderer.c b/src/backends/meta-cursor-renderer.c
index a76241b9e..48cd239a9 100644
--- a/src/backends/meta-cursor-renderer.c
+++ b/src/backends/meta-cursor-renderer.c
@@ -27,8 +27,6 @@
#include "meta-cursor-renderer.h"
#include <meta/meta-backend.h>
-#include <backends/meta-backend-private.h>
-#include <backends/meta-monitor-manager-private.h>
#include <meta/util.h>
#include <cogl/cogl.h>
@@ -118,14 +116,6 @@ meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer,
};
}
-static gboolean
-is_cursor_in_monitors_area (int x, int y)
-{
- MetaMonitorManager *monitor_manager = meta_backend_get_monitor_manager (meta_get_backend ());
- return meta_monitor_manager_get_monitor_at_point (monitor_manager,
- (gfloat) x, (gfloat) y) >= 0;
-}
-
static void
update_cursor (MetaCursorRenderer *renderer,
MetaCursorSprite *cursor_sprite)
@@ -134,11 +124,6 @@ update_cursor (MetaCursorRenderer *renderer,
gboolean handled_by_backend;
gboolean should_redraw = FALSE;
- /* do not render cursor if it is not on any monitor. Such situation
- * can occur e. g. after monitor hot-plug */
- if (!is_cursor_in_monitors_area (priv->current_x, priv->current_y))
- return;
-
if (cursor_sprite)
meta_cursor_sprite_prepare_at (cursor_sprite,
priv->current_x,
diff --git a/src/core/screen.c b/src/core/screen.c
index 934b3af35..0e056b3ae 100644
--- a/src/core/screen.c
+++ b/src/core/screen.c
@@ -1233,7 +1233,8 @@ root_cursor_prepare_at (MetaCursorSprite *cursor_sprite,
monitor = meta_screen_get_monitor_for_point (screen, x, y);
/* Reload the cursor texture if the scale has changed. */
- meta_cursor_sprite_set_theme_scale (cursor_sprite, monitor->scale);
+ if (monitor)
+ meta_cursor_sprite_set_theme_scale (cursor_sprite, monitor->scale);
}
static void
diff --git a/src/wayland/meta-wayland-pointer.c b/src/wayland/meta-wayland-pointer.c
index 2936afc7d..b8a138543 100644
--- a/src/wayland/meta-wayland-pointer.c
+++ b/src/wayland/meta-wayland-pointer.c
@@ -1011,8 +1011,9 @@ cursor_sprite_prepare_at (MetaCursorSprite *cursor_sprite,
if (!meta_xwayland_is_xwayland_surface (surface))
{
monitor = meta_screen_get_monitor_for_point (screen, x, y);
- meta_cursor_sprite_set_texture_scale (cursor_sprite,
- (float)monitor->scale / surface->scale);
+ if (monitor)
+ meta_cursor_sprite_set_texture_scale (cursor_sprite,
+ (float)monitor->scale / surface->scale);
}
meta_wayland_surface_update_outputs (surface);
}