Add keyboard and pointer focus events.

dev
Kristian Høgsberg 16 years ago
parent ce5a9c1096
commit db6c2f3f0e
  1. 6
      wayland-client.h
  2. 2
      wayland-protocol.c
  3. 2
      wayland-protocol.h
  4. 56
      wayland-system-compositor.c
  5. 16
      window.c

@ -119,6 +119,12 @@ struct wl_input_device_listener {
void (*key)(void *data, void (*key)(void *data,
struct wl_input_device *input_device, struct wl_input_device *input_device,
uint32_t button, uint32_t state); uint32_t button, uint32_t state);
void (*pointer_focus)(void *data,
struct wl_input_device *input_device,
struct wl_surface *surface);
void (*keyboard_focus)(void *data,
struct wl_input_device *input_device,
struct wl_surface *surface);
}; };
int int

@ -76,6 +76,8 @@ static const struct wl_message input_device_events[] = {
{ "motion", "iiii" }, { "motion", "iiii" },
{ "button", "uuiiii" }, { "button", "uuiiii" },
{ "key", "uu" }, { "key", "uu" },
{ "pointer_focus", "o" },
{ "keyboard_focus", "o" },
}; };
WL_EXPORT const struct wl_interface wl_input_device_interface = { WL_EXPORT const struct wl_interface wl_input_device_interface = {

@ -55,6 +55,8 @@ extern const struct wl_interface wl_surface_interface;
#define WL_INPUT_MOTION 0 #define WL_INPUT_MOTION 0
#define WL_INPUT_BUTTON 1 #define WL_INPUT_BUTTON 1
#define WL_INPUT_KEY 2 #define WL_INPUT_KEY 2
#define WL_INPUT_POINTER_FOCUS 3
#define WL_INPUT_KEYBOARD_FOCUS 4
extern const struct wl_interface wl_input_device_interface; extern const struct wl_interface wl_input_device_interface;

@ -86,7 +86,8 @@ struct wlsc_input_device {
int grab; int grab;
struct wlsc_surface *grab_surface; struct wlsc_surface *grab_surface;
struct wlsc_surface *focus_surface; struct wlsc_surface *pointer_focus;
struct wlsc_surface *keyboard_focus;
}; };
struct wlsc_compositor { struct wlsc_compositor {
@ -858,6 +859,49 @@ wlsc_surface_transform(struct wlsc_surface *surface,
*sy = (y - surface->map.y) * surface->height / surface->map.height; *sy = (y - surface->map.y) * surface->height / surface->map.height;
} }
static void
wlsc_input_device_set_keyboard_focus(struct wlsc_input_device *device,
struct wlsc_surface *surface)
{
if (device->keyboard_focus == surface)
return;
if (device->keyboard_focus &&
(!surface || device->keyboard_focus->base.client != surface->base.client))
wl_surface_post_event(&device->keyboard_focus->base,
&device->base,
WL_INPUT_KEYBOARD_FOCUS, NULL);
/* FIXME: We need to send the currently held down keys in the
* keyboard focus event. */
if (surface)
wl_surface_post_event(&surface->base,
&device->base,
WL_INPUT_KEYBOARD_FOCUS, &surface->base);
device->keyboard_focus = surface;
}
static void
wlsc_input_device_set_pointer_focus(struct wlsc_input_device *device,
struct wlsc_surface *surface)
{
if (device->pointer_focus == surface)
return;
if (device->pointer_focus &&
(!surface || device->pointer_focus->base.client != surface->base.client))
wl_surface_post_event(&device->pointer_focus->base,
&device->base,
WL_INPUT_POINTER_FOCUS, NULL);
if (surface)
wl_surface_post_event(&surface->base,
&device->base,
WL_INPUT_POINTER_FOCUS, &surface->base);
device->pointer_focus = surface;
}
static struct wlsc_surface * static struct wlsc_surface *
pick_surface(struct wlsc_input_device *device, int32_t *sx, int32_t *sy) pick_surface(struct wlsc_input_device *device, int32_t *sx, int32_t *sy)
{ {
@ -915,6 +959,9 @@ notify_motion(struct wlsc_input_device *device, int x, int y)
device->x = x; device->x = x;
device->y = y; device->y = y;
es = pick_surface(device, &sx, &sy); es = pick_surface(device, &sx, &sy);
wlsc_input_device_set_pointer_focus(device, es);
if (es) if (es)
wl_surface_post_event(&es->base, &device->base, wl_surface_post_event(&es->base, &device->base,
WL_INPUT_MOTION, x, y, sx, sy); WL_INPUT_MOTION, x, y, sx, sy);
@ -946,7 +993,7 @@ notify_button(struct wlsc_input_device *device,
* we reference here go away. */ * we reference here go away. */
device->grab++; device->grab++;
device->grab_surface = es; device->grab_surface = es;
device->focus_surface = es; wlsc_input_device_set_keyboard_focus(device, es);
} else { } else {
device->grab--; device->grab--;
} }
@ -1017,6 +1064,7 @@ notify_key(struct wlsc_input_device *device,
case KEY_5 | META_DOWN: case KEY_5 | META_DOWN:
update_surface_targets(ec, key - KEY_1); update_surface_targets(ec, key - KEY_1);
if (device->grab == 0) if (device->grab == 0)
wlsc_input_device_set_keyboard_focus(device, ec->primary);
device->keyboard_focus = ec->primary; device->keyboard_focus = ec->primary;
return; return;
@ -1038,8 +1086,8 @@ notify_key(struct wlsc_input_device *device,
if (!ec->vt_active) if (!ec->vt_active)
return; return;
if (device->focus_surface != NULL) if (device->keyboard_focus != NULL)
wl_surface_post_event(&device->focus_surface->base, wl_surface_post_event(&device->keyboard_focus->base,
&device->base, &device->base,
WL_INPUT_KEY, key, state); WL_INPUT_KEY, key, state);
} }

@ -475,10 +475,26 @@ window_handle_key(void *data, struct wl_input_device *input_device,
state, window->modifiers, window->user_data); state, window->modifiers, window->user_data);
} }
static void
window_handle_pointer_focus(void *data,
struct wl_input_device *input_device,
struct wl_surface *surface)
{
}
static void
window_handle_keyboard_focus(void *data,
struct wl_input_device *input_device,
struct wl_surface *surface)
{
}
static const struct wl_input_device_listener input_device_listener = { static const struct wl_input_device_listener input_device_listener = {
window_handle_motion, window_handle_motion,
window_handle_button, window_handle_button,
window_handle_key, window_handle_key,
window_handle_pointer_focus,
window_handle_keyboard_focus,
}; };
void void

Loading…
Cancel
Save