diff options
| author | Kristian Høgsberg <krh@hinata.localdomain> | 2008-12-12 13:48:30 -0500 |
|---|---|---|
| committer | Kristian Høgsberg <krh@hinata.localdomain> | 2008-12-12 13:48:30 -0500 |
| commit | a7700c8ff1b0ec5b06048092bb16f0531ec89e08 (patch) | |
| tree | 849181b47ac8be3f86b31b94217f7a7f905e0f7c | |
| parent | f0c7b2083ac0654dba6508e8ddd5de1a431a95e1 (diff) | |
| download | wayland-a7700c8ff1b0ec5b06048092bb16f0531ec89e08.tar.gz wayland-a7700c8ff1b0ec5b06048092bb16f0531ec89e08.tar.xz wayland-a7700c8ff1b0ec5b06048092bb16f0531ec89e08.zip | |
Handle per-device keyboard focus.
| -rw-r--r-- | egl-compositor.c | 17 |
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); } } |
