Don't crash when the previous keyboard surface goes away
authorKristian Høgsberg <krh@bitplanet.net>
Fri, 28 Jan 2011 20:53:07 +0000 (15:53 -0500)
committerKristian Høgsberg <krh@bitplanet.net>
Fri, 28 Jan 2011 20:53:07 +0000 (15:53 -0500)
Just always set keyboard focus to the top surface.

compositor/compositor.c
compositor/compositor.h

index 80a972e..9d7c330 100644 (file)
@@ -901,22 +901,28 @@ notify_pointer_focus(struct wl_input_device *device,
 }
 
 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);
        }
 }
index 8127b5d..b3dddda 100644 (file)
@@ -70,7 +70,6 @@ struct wlsc_input_device {
        struct wl_list link;
        uint32_t modifier_state;
        struct wl_selection *selection;
-       struct wl_surface *saved_keyboard_focus;
 };
 
 struct wlsc_drm {