shell: run surface bindings only when focus surface is not NULL
authorRafal Mielniczuk <rafal.mielniczuk2@gmail.com>
Sun, 5 Jan 2014 19:04:59 +0000 (20:04 +0100)
committerKristian Høgsberg <krh@bitplanet.net>
Thu, 9 Jan 2014 06:17:40 +0000 (22:17 -0800)
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

index 4cc23d5..00c7b01 100644 (file)
@@ -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;