aboutsummaryrefslogtreecommitdiffstats
path: root/compositor
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@bitplanet.net>2011-01-28 15:53:07 -0500
committerKristian Høgsberg <krh@bitplanet.net>2011-01-28 15:53:07 -0500
commitf992b2fc47c44c53a3b8f2c2d823d9d3961df7ad (patch)
tree5f1a34f0488aefd513cc6773b5899aac39ab9690 /compositor
parentAdd initial basic support for fullscreen surfaces (diff)
downloadwayland-f992b2fc47c44c53a3b8f2c2d823d9d3961df7ad.tar
wayland-f992b2fc47c44c53a3b8f2c2d823d9d3961df7ad.tar.gz
wayland-f992b2fc47c44c53a3b8f2c2d823d9d3961df7ad.tar.bz2
wayland-f992b2fc47c44c53a3b8f2c2d823d9d3961df7ad.tar.lz
wayland-f992b2fc47c44c53a3b8f2c2d823d9d3961df7ad.tar.xz
wayland-f992b2fc47c44c53a3b8f2c2d823d9d3961df7ad.tar.zst
wayland-f992b2fc47c44c53a3b8f2c2d823d9d3961df7ad.zip
Don't crash when the previous keyboard surface goes away
Just always set keyboard focus to the top surface.
Diffstat (limited to 'compositor')
-rw-r--r--compositor/compositor.c26
-rw-r--r--compositor/compositor.h1
2 files changed, 16 insertions, 11 deletions
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 @@ 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);
}
}
diff --git a/compositor/compositor.h b/compositor/compositor.h
index 8127b5d..b3dddda 100644
--- a/compositor/compositor.h
+++ b/compositor/compositor.h
@@ -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 {