Fix sessions with no active input devices

Fix a few unconditional dereferences of seat->keyboard and seat->pointer
in paths that could be hit outside of input event processing.

Reported-by: Pekka Paalanen <ppaalanen@gmail.com>
Signed-off-by: Daniel Stone <daniel@fooishbar.org>
dev
Daniel Stone 13 years ago committed by Kristian Høgsberg
parent a497d57619
commit e9e92d2ad7
  1. 9
      src/compositor.c

@ -620,6 +620,9 @@ weston_device_repick(struct wl_seat *seat)
const struct wl_pointer_grab_interface *interface; const struct wl_pointer_grab_interface *interface;
struct weston_surface *surface, *focus; struct weston_surface *surface, *focus;
if (!seat->pointer)
return;
surface = weston_compositor_pick_surface(ws->compositor, surface = weston_compositor_pick_surface(ws->compositor,
seat->pointer->x, seat->pointer->x,
seat->pointer->y, seat->pointer->y,
@ -666,9 +669,11 @@ weston_surface_unmap(struct weston_surface *surface)
wl_list_remove(&surface->layer_link); wl_list_remove(&surface->layer_link);
wl_list_for_each(seat, &surface->compositor->seat_list, link) { wl_list_for_each(seat, &surface->compositor->seat_list, link) {
if (seat->seat.keyboard->focus == &surface->surface) if (seat->seat.keyboard &&
seat->seat.keyboard->focus == &surface->surface)
wl_keyboard_set_focus(seat->seat.keyboard, NULL); wl_keyboard_set_focus(seat->seat.keyboard, NULL);
if (seat->seat.pointer->focus == &surface->surface) if (seat->seat.pointer &&
seat->seat.pointer->focus == &surface->surface)
wl_pointer_set_focus(seat->seat.pointer, wl_pointer_set_focus(seat->seat.pointer,
NULL, NULL,
wl_fixed_from_int(0), wl_fixed_from_int(0),

Loading…
Cancel
Save