compositor-drm, evdev: don't crash on missing keyboard

Weston's notify_keyboard_focus_*() assume that a keyboard is present, if
they are called. With evdev, there might not always be a keyboard.

Also clean up the variable definition in evdev_notify_keyborad_focus().
I read that function through many times and finally had to grep where
does 'all_keys' come from.

Signed-off-by: Pekka Paalanen <ppaalanen@gmail.com>
dev
Pekka Paalanen 13 years ago committed by Kristian Høgsberg
parent 81a13a3757
commit d858351a61
  1. 3
      src/compositor-drm.c
  2. 6
      src/evdev.c

@ -2012,7 +2012,8 @@ evdev_remove_devices(struct weston_seat *seat_base)
wl_list_for_each_safe(device, next, &seat->devices_list, link) wl_list_for_each_safe(device, next, &seat->devices_list, link)
evdev_input_device_destroy(device); evdev_input_device_destroy(device);
notify_keyboard_focus_out(&seat->base.seat); if (seat->base.seat.keyboard)
notify_keyboard_focus_out(&seat->base.seat);
} }
static void static void

@ -561,10 +561,14 @@ evdev_notify_keyboard_focus(struct weston_seat *seat,
struct evdev_input_device *device; struct evdev_input_device *device;
struct wl_array keys; struct wl_array keys;
unsigned int i, set; unsigned int i, set;
char evdev_keys[(KEY_CNT + 7) / 8], all_keys[(KEY_CNT + 7) / 8]; char evdev_keys[(KEY_CNT + 7) / 8];
char all_keys[(KEY_CNT + 7) / 8];
uint32_t *k; uint32_t *k;
int ret; int ret;
if (!seat->seat.keyboard)
return;
memset(all_keys, 0, sizeof all_keys); memset(all_keys, 0, sizeof all_keys);
wl_list_for_each(device, evdev_devices, link) { wl_list_for_each(device, evdev_devices, link) {
memset(evdev_keys, 0, sizeof evdev_keys); memset(evdev_keys, 0, sizeof evdev_keys);

Loading…
Cancel
Save