Handle per-device keyboard focus.

dev
Kristian Høgsberg 16 years ago
parent f0c7b2083a
commit a7700c8ff1
  1. 15
      egl-compositor.c

@ -61,6 +61,7 @@ struct egl_input_device {
int grab; int grab;
struct egl_surface *grab_surface; struct egl_surface *grab_surface;
struct egl_surface *focus_surface;
}; };
struct egl_compositor { struct egl_compositor {
@ -813,8 +814,11 @@ notify_button(struct egl_input_device *device,
wl_list_insert(device->ec->surface_list.prev, &es->link); wl_list_insert(device->ec->surface_list.prev, &es->link);
if (state) { if (state) {
/* FIXME: We need callbacks when the surfaces
* we reference here go away. */
device->grab++; device->grab++;
device->grab_surface = es; device->grab_surface = es;
device->focus_surface = es;
} else { } else {
device->grab--; device->grab--;
} }
@ -836,7 +840,6 @@ notify_key(struct egl_input_device *device,
uint32_t key, uint32_t state) uint32_t key, uint32_t state)
{ {
struct egl_compositor *ec = device->ec; struct egl_compositor *ec = device->ec;
struct egl_surface *es;
if (key == KEY_ESC && state == 1) { if (key == KEY_ESC && state == 1) {
if (ec->overlay_target == ec->height) if (ec->overlay_target == ec->height)
@ -845,13 +848,9 @@ notify_key(struct egl_input_device *device,
ec->overlay_target += 200; ec->overlay_target += 200;
schedule_repaint(ec); schedule_repaint(ec);
} else if (!wl_list_empty(&ec->surface_list)) { } else if (!wl_list_empty(&ec->surface_list)) {
/* FIXME: The event source device should track which if (device->focus_surface != NULL)
* surface has its key focus and send the event there. wl_surface_post_event(device->focus_surface->wl_surface,
* For now, just send it to the top surface, which &device->base,
* 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); WL_INPUT_KEY, key, state);
} }
} }

Loading…
Cancel
Save