Don't crash when the previous keyboard surface goes away
Just always set keyboard focus to the top surface.
diff --git a/compositor/compositor.c b/compositor/compositor.c
index 80a972e..9d7c330 100644
--- a/compositor/compositor.c
+++ b/compositor/compositor.c
@@ -901,22 +901,28 @@
}
void
-notify_keyboard_focus(struct wl_input_device *device_base,
+notify_keyboard_focus(struct wl_input_device *device,
uint32_t time, struct wlsc_output *output,
struct wl_array *keys)
{
- struct wlsc_input_device *device =
- (struct wlsc_input_device *) device_base;
+ struct wlsc_input_device *wd =
+ (struct wlsc_input_device *) device;
+ struct wlsc_compositor *compositor =
+ (struct wlsc_compositor *) device->compositor;
+ struct wlsc_surface *es;
+
+ if (!wl_list_empty(&compositor->surface_list))
+ es = container_of(compositor->surface_list.next,
+ struct wlsc_surface, link);
+ else
+ es = NULL;
if (output) {
- wl_array_copy(&device->input_device.keys, keys);
- wl_input_device_set_keyboard_focus(&device->input_device,
- device->saved_keyboard_focus,
- time);
+ wl_array_copy(&wd->input_device.keys, keys);
+ wl_input_device_set_keyboard_focus(&wd->input_device,
+ &es->surface, time);
} else {
- device->saved_keyboard_focus =
- device->input_device.keyboard_focus;
- wl_input_device_set_keyboard_focus(&device->input_device,
+ wl_input_device_set_keyboard_focus(&wd->input_device,
NULL, time);
}
}