summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@hinata.localdomain>2008-12-12 13:48:30 -0500
committerKristian Høgsberg <krh@hinata.localdomain>2008-12-12 13:48:30 -0500
commita7700c8ff1b0ec5b06048092bb16f0531ec89e08 (patch)
tree849181b47ac8be3f86b31b94217f7a7f905e0f7c
parentf0c7b2083ac0654dba6508e8ddd5de1a431a95e1 (diff)
downloadwayland-a7700c8ff1b0ec5b06048092bb16f0531ec89e08.tar.gz
wayland-a7700c8ff1b0ec5b06048092bb16f0531ec89e08.tar.xz
wayland-a7700c8ff1b0ec5b06048092bb16f0531ec89e08.zip
Handle per-device keyboard focus.
-rw-r--r--egl-compositor.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/egl-compositor.c b/egl-compositor.c
index 49afe16..d6426c2 100644
--- a/egl-compositor.c
+++ b/egl-compositor.c
@@ -61,6 +61,7 @@ struct egl_input_device {
int grab;
struct egl_surface *grab_surface;
+ struct egl_surface *focus_surface;
};
struct egl_compositor {
@@ -813,8 +814,11 @@ notify_button(struct egl_input_device *device,
wl_list_insert(device->ec->surface_list.prev, &es->link);
if (state) {
+ /* FIXME: We need callbacks when the surfaces
+ * we reference here go away. */
device->grab++;
device->grab_surface = es;
+ device->focus_surface = es;
} else {
device->grab--;
}
@@ -836,7 +840,6 @@ notify_key(struct egl_input_device *device,
uint32_t key, uint32_t state)
{
struct egl_compositor *ec = device->ec;
- struct egl_surface *es;
if (key == KEY_ESC && state == 1) {
if (ec->overlay_target == ec->height)
@@ -845,14 +848,10 @@ notify_key(struct egl_input_device *device,
ec->overlay_target += 200;
schedule_repaint(ec);
} else if (!wl_list_empty(&ec->surface_list)) {
- /* FIXME: The event source device should track which
- * surface has its key focus and send the event there.
- * For now, just send it to the top surface, which
- * effectively gives us click to focus behavior. */
- es = container_of(ec->surface_list.prev,
- struct egl_surface, link);
- wl_surface_post_event(es->wl_surface, &device->base,
- WL_INPUT_KEY, key, state);
+ if (device->focus_surface != NULL)
+ wl_surface_post_event(device->focus_surface->wl_surface,
+ &device->base,
+ WL_INPUT_KEY, key, state);
}
}