From b2917a2fedd62a0938f0f34921fe57e5320d5fdb Mon Sep 17 00:00:00 2001 From: Rafal Mielniczuk Date: Sun, 5 Jan 2014 20:04:59 +0100 Subject: [PATCH] shell: run surface bindings only when focus surface is not NULL This fixes the crash when move, rotate or resize binding is activated while exposay effect is active. Steps to reproduce: - activate exposay - try to rotate the surface with mod + right mouse button - crash Closes: https://bugs.freedesktop.org/show_bug.cgi?id=72885 --- desktop-shell/shell.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c index 4cc23d54..00c7b019 100644 --- a/desktop-shell/shell.c +++ b/desktop-shell/shell.c @@ -3747,10 +3747,15 @@ get_shell_surface_type(struct weston_surface *surface) static void move_binding(struct weston_seat *seat, uint32_t time, uint32_t button, void *data) { - struct weston_surface *focus = seat->pointer->focus->surface; + struct weston_surface *focus; struct weston_surface *surface; struct shell_surface *shsurf; + if (seat->pointer->focus == NULL) + return; + + focus = seat->pointer->focus->surface; + surface = weston_surface_get_main_surface(focus); if (surface == NULL) return; @@ -3833,12 +3838,17 @@ touch_move_binding(struct weston_seat *seat, uint32_t time, void *data) static void resize_binding(struct weston_seat *seat, uint32_t time, uint32_t button, void *data) { - struct weston_surface *focus = seat->pointer->focus->surface; + struct weston_surface *focus; struct weston_surface *surface; uint32_t edges = 0; int32_t x, y; struct shell_surface *shsurf; + if (seat->pointer->focus == NULL) + return; + + focus = seat->pointer->focus->surface; + surface = weston_surface_get_main_surface(focus); if (surface == NULL) return; @@ -4107,10 +4117,15 @@ static void rotate_binding(struct weston_seat *seat, uint32_t time, uint32_t button, void *data) { - struct weston_surface *focus = seat->pointer->focus->surface; + struct weston_surface *focus; struct weston_surface *base_surface; struct shell_surface *surface; + if (seat->pointer->focus == NULL) + return; + + focus = seat->pointer->focus->surface; + base_surface = weston_surface_get_main_surface(focus); if (base_surface == NULL) return;