diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c index fffb3d68a..df34b5441 100644 --- a/desktop-shell/shell.c +++ b/desktop-shell/shell.c @@ -4189,11 +4189,11 @@ switcher_destroy(struct switcher *switcher) } static void -switcher_key(struct weston_keyboard_grab *grab, - const struct timespec *time, uint32_t key, uint32_t state_w) +switcher_key(struct weston_keyboard_grab *grab, const struct weston_key_event *key_event) { struct switcher *switcher = container_of(grab, struct switcher, grab); - enum wl_keyboard_key_state state = state_w; + enum wl_keyboard_key_state state = key_event->key_state; + uint32_t key = key_event->key; if (key == KEY_TAB && state == WL_KEYBOARD_KEY_STATE_PRESSED) switcher_next(switcher); diff --git a/frontend/text-backend.c b/frontend/text-backend.c index 73a1eda30..05e34cdfd 100644 --- a/frontend/text-backend.c +++ b/frontend/text-backend.c @@ -621,13 +621,15 @@ unbind_keyboard(struct wl_resource *resource) static void input_method_context_grab_key(struct weston_keyboard_grab *grab, - const struct timespec *time, uint32_t key, - uint32_t state_w) + const struct weston_key_event *key_event) { struct weston_keyboard *keyboard = grab->keyboard; struct wl_display *display; uint32_t serial; uint32_t msecs; + uint32_t key = key_event->key; + struct timespec time = key_event->base.ts; + uint32_t state_w = key_event->key_state; if (!keyboard->input_method_resource) return; @@ -635,7 +637,7 @@ input_method_context_grab_key(struct weston_keyboard_grab *grab, display = wl_client_get_display( wl_resource_get_client(keyboard->input_method_resource)); serial = wl_display_next_serial(display); - msecs = timespec_to_msec(time); + msecs = timespec_to_msec(&time); wl_keyboard_send_key(keyboard->input_method_resource, serial, msecs, key, state_w); } @@ -712,10 +714,14 @@ input_method_context_key(struct wl_client *client, struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat); struct weston_keyboard_grab *default_grab = &keyboard->default_grab; struct timespec ts; + struct weston_key_event key_event; timespec_from_msec(&ts, time); - default_grab->interface->key(default_grab, &ts, key, state_w); + weston_input_event_init(&key_event.base, &ts, seat); + weston_key_event_init(&key_event, key, state_w, STATE_UPDATE_NONE); + + default_grab->interface->key(default_grab, &key_event); } static void diff --git a/include/libweston/libweston.h b/include/libweston/libweston.h index aa787386c..cdd9cf285 100644 --- a/include/libweston/libweston.h +++ b/include/libweston/libweston.h @@ -188,6 +188,11 @@ struct weston_spring { uint32_t clip; }; +enum weston_key_state_update { + STATE_UPDATE_AUTOMATIC, + STATE_UPDATE_NONE, +}; + /* bit compatible with drm definitions. */ enum dpms_enum { WESTON_DPMS_ON, @@ -615,6 +620,20 @@ struct weston_pointer_axis_event { int32_t discrete; }; +/* base/common struct which all weston_xxx_event should "inherit" */ +struct weston_input_event { + struct timespec ts; + struct weston_seat *seat; +}; + +struct weston_key_event { + struct weston_input_event base; + uint32_t key; + enum wl_keyboard_key_state key_state; + enum weston_key_state_update key_update_state; +}; + + struct weston_pointer_grab; struct weston_pointer_grab_interface { void (*focus)(struct weston_pointer_grab *grab); @@ -640,7 +659,7 @@ struct weston_pointer_grab { struct weston_keyboard_grab; struct weston_keyboard_grab_interface { void (*key)(struct weston_keyboard_grab *grab, - const struct timespec *time, uint32_t key, uint32_t state); + const struct weston_key_event *key_event); void (*modifiers)(struct weston_keyboard_grab *grab, uint32_t serial, uint32_t mods_depressed, uint32_t mods_latched, uint32_t mods_locked, uint32_t group); @@ -1003,8 +1022,16 @@ weston_keyboard_set_locks(struct weston_keyboard *keyboard, void weston_keyboard_send_key(struct weston_keyboard *keyboard, - const struct timespec *time, uint32_t key, - enum wl_keyboard_key_state state); + const struct weston_key_event *key_event); + +void +weston_input_event_init(struct weston_input_event *ievent, struct timespec *ts, struct weston_seat *seat); + +void +weston_key_event_init(struct weston_key_event *event, uint32_t key, + enum wl_keyboard_key_state key_state, + enum weston_key_state_update key_update_state); + void weston_keyboard_send_modifiers(struct weston_keyboard *keyboard, uint32_t serial, uint32_t mods_depressed, @@ -2125,12 +2152,6 @@ struct content_protection { struct wl_event_source *surface_protection_update; }; - -enum weston_key_state_update { - STATE_UPDATE_AUTOMATIC, - STATE_UPDATE_NONE, -}; - enum weston_activate_flag { WESTON_ACTIVATE_FLAG_NONE = 0, WESTON_ACTIVATE_FLAG_CONFIGURE = 1 << 0, diff --git a/libweston/backend-rdp/rdp.c b/libweston/backend-rdp/rdp.c index d4d0af858..8580a1b88 100644 --- a/libweston/backend-rdp/rdp.c +++ b/libweston/backend-rdp/rdp.c @@ -1573,6 +1573,7 @@ xf_input_keyboard_event(rdpInput *input, UINT16 flags, XF_KEV_CODE_TYPE code) bool send_release_key = false; int notify = 0; struct timespec time; + struct weston_key_event key_event; rdp_debug_verbose(peerContext->rdpBackend, "RDP backend: %s flags:0x%x, code:0x%x\n", __func__, flags, code); @@ -1638,14 +1639,18 @@ xf_input_keyboard_event(rdpInput *input, UINT16 flags, XF_KEV_CODE_TYPE code) /*weston_log("code=%x ext=%d vk_code=%x scan_code=%x\n", code, (flags & KBD_FLAGS_EXTENDED) ? 1 : 0, vk_code, scan_code);*/ weston_compositor_get_time(&time); - notify_key(peerContext->item.seat, &time, - scan_code - 8, keyState, STATE_UPDATE_AUTOMATIC); + + weston_input_event_init(&key_event.base, + &time, peerContext->item.seat); + weston_key_event_init(&key_event, scan_code - 8, + keyState, STATE_UPDATE_AUTOMATIC); + notify_key(peerContext->item.seat, &key_event); if (send_release_key) { - notify_key(peerContext->item.seat, &time, - scan_code - 8, - WL_KEYBOARD_KEY_STATE_RELEASED, - STATE_UPDATE_AUTOMATIC); + weston_key_event_init(&key_event, scan_code - 8, + WL_KEYBOARD_KEY_STATE_RELEASED, + STATE_UPDATE_AUTOMATIC); + notify_key(peerContext->item.seat, &key_event); } } diff --git a/libweston/backend-vnc/vnc.c b/libweston/backend-vnc/vnc.c index ae689d855..a632260a2 100644 --- a/libweston/backend-vnc/vnc.c +++ b/libweston/backend-vnc/vnc.c @@ -301,6 +301,7 @@ vnc_handle_key_event(struct nvnc_client *client, uint32_t keysym, bool needs_shift = false; enum weston_key_state_update state_update; enum wl_keyboard_key_state state; + struct weston_key_event key_event; struct timespec time; int i; @@ -336,20 +337,27 @@ vnc_handle_key_event(struct nvnc_client *client, uint32_t keysym, return; } + weston_input_event_init(&key_event.base, &time, peer->seat); + /* emulate lshift press */ - if (needs_shift) - notify_key(peer->seat, &time, KEY_LEFTSHIFT, - WL_KEYBOARD_KEY_STATE_PRESSED, - STATE_UPDATE_AUTOMATIC); + if (needs_shift) { + weston_key_event_init(&key_event, KEY_LEFTSHIFT, + WL_KEYBOARD_KEY_STATE_PRESSED, + STATE_UPDATE_AUTOMATIC); + notify_key(peer->seat, &key_event); + } /* send detected key code */ - notify_key(peer->seat, &time, key, state, state_update); + weston_key_event_init(&key_event, key, state, state_update); + notify_key(peer->seat, &key_event); /* emulate lshift release */ - if (needs_shift) - notify_key(peer->seat, &time, KEY_LEFTSHIFT, - WL_KEYBOARD_KEY_STATE_RELEASED, - STATE_UPDATE_AUTOMATIC); + if (needs_shift) { + weston_key_event_init(&key_event, KEY_LEFTSHIFT, + WL_KEYBOARD_KEY_STATE_RELEASED, + STATE_UPDATE_AUTOMATIC); + notify_key(peer->seat, &key_event); + } } static void @@ -359,6 +367,7 @@ vnc_handle_key_code_event(struct nvnc_client *client, uint32_t key, struct vnc_peer *peer = nvnc_get_userdata(client); enum wl_keyboard_key_state state; struct timespec time; + struct weston_key_event key_event; weston_compositor_get_time(&time); @@ -367,7 +376,9 @@ vnc_handle_key_code_event(struct nvnc_client *client, uint32_t key, else state = WL_KEYBOARD_KEY_STATE_RELEASED; - notify_key(peer->seat, &time, key, state, STATE_UPDATE_AUTOMATIC); + weston_input_event_init(&key_event.base, &time, peer->seat); + weston_key_event_init(&key_event, key, state, STATE_UPDATE_AUTOMATIC); + notify_key(peer->seat, &key_event); } static void diff --git a/libweston/backend-wayland/wayland.c b/libweston/backend-wayland/wayland.c index 6ad1d7b49..e31ecd70b 100644 --- a/libweston/backend-wayland/wayland.c +++ b/libweston/backend-wayland/wayland.c @@ -2004,6 +2004,7 @@ input_handle_key(void *data, struct wl_keyboard *keyboard, { struct wayland_input *input = data; struct timespec ts; + struct weston_key_event key_event; if (!input->keyboard_focus) return; @@ -2011,10 +2012,11 @@ input_handle_key(void *data, struct wl_keyboard *keyboard, timespec_from_msec(&ts, time); input->key_serial = serial; - notify_key(&input->base, &ts, key, - state ? WL_KEYBOARD_KEY_STATE_PRESSED : - WL_KEYBOARD_KEY_STATE_RELEASED, - input->keyboard_state_update); + + weston_input_event_init(&key_event.base, &ts, &input->base); + weston_key_event_init(&key_event, key, state ? WL_KEYBOARD_KEY_STATE_PRESSED : + WL_KEYBOARD_KEY_STATE_RELEASED, input->keyboard_state_update); + notify_key(&input->base, &key_event); } static void diff --git a/libweston/backend-x11/x11.c b/libweston/backend-x11/x11.c index 182baf6aa..7a6ed9557 100644 --- a/libweston/backend-x11/x11.c +++ b/libweston/backend-x11/x11.c @@ -1630,11 +1630,15 @@ x11_backend_handle_event(int fd, uint32_t mask, void *data) * event below. */ update_xkb_state_from_core(b, key_release->state); weston_compositor_get_time(&time); - notify_key(&b->core_seat, - &time, - key_release->detail - 8, - WL_KEYBOARD_KEY_STATE_RELEASED, - STATE_UPDATE_AUTOMATIC); + + struct weston_key_event key_event; + + weston_input_event_init(&key_event.base, &time, &b->core_seat); + weston_key_event_init(&key_event, key_release->detail - 8, + WL_KEYBOARD_KEY_STATE_RELEASED, + STATE_UPDATE_AUTOMATIC); + + notify_key(&b->core_seat, &key_event); free(b->prev_event); b->prev_event = NULL; break; @@ -1675,12 +1679,15 @@ x11_backend_handle_event(int fd, uint32_t mask, void *data) if (!b->has_xkb) update_xkb_state_from_core(b, key_press->state); weston_compositor_get_time(&time); - notify_key(&b->core_seat, - &time, - key_press->detail - 8, - WL_KEYBOARD_KEY_STATE_PRESSED, - b->has_xkb ? STATE_UPDATE_NONE : - STATE_UPDATE_AUTOMATIC); + + struct weston_key_event key_event; + + weston_input_event_init(&key_event.base, &time, &b->core_seat); + weston_key_event_init(&key_event, key_release->detail - 8, + WL_KEYBOARD_KEY_STATE_PRESSED, + b->has_xkb ? STATE_UPDATE_NONE : STATE_UPDATE_AUTOMATIC); + notify_key(&b->core_seat, &key_event); + break; case XCB_KEY_RELEASE: /* If we don't have XKB, we need to use the lame @@ -1691,11 +1698,13 @@ x11_backend_handle_event(int fd, uint32_t mask, void *data) } key_release = (xcb_key_press_event_t *) event; weston_compositor_get_time(&time); - notify_key(&b->core_seat, - &time, - key_release->detail - 8, - WL_KEYBOARD_KEY_STATE_RELEASED, - STATE_UPDATE_NONE); + + struct weston_key_event w_key_event; + + weston_input_event_init(&w_key_event.base, &time, &b->core_seat); + weston_key_event_init(&w_key_event, key_release->detail - 8, + WL_KEYBOARD_KEY_STATE_RELEASED, STATE_UPDATE_NONE); + notify_key(&b->core_seat, &w_key_event); break; case XCB_BUTTON_PRESS: case XCB_BUTTON_RELEASE: @@ -1824,11 +1833,14 @@ x11_backend_handle_event(int fd, uint32_t mask, void *data) key_release = (xcb_key_press_event_t *) b->prev_event; update_xkb_state_from_core(b, key_release->state); weston_compositor_get_time(&time); - notify_key(&b->core_seat, - &time, - key_release->detail - 8, - WL_KEYBOARD_KEY_STATE_RELEASED, - STATE_UPDATE_AUTOMATIC); + + struct weston_key_event lshift_key_event; + + weston_input_event_init(&lshift_key_event.base, &time, &b->core_seat); + weston_key_event_init(&lshift_key_event, key_release->detail - 8, + WL_KEYBOARD_KEY_STATE_RELEASED, STATE_UPDATE_AUTOMATIC); + notify_key(&b->core_seat, &lshift_key_event); + free(b->prev_event); b->prev_event = NULL; break; diff --git a/libweston/backend.h b/libweston/backend.h index cb4d575d8..ea232af7d 100644 --- a/libweston/backend.h +++ b/libweston/backend.h @@ -242,9 +242,8 @@ notify_button(struct weston_seat *seat, const struct timespec *time, int32_t button, enum wl_pointer_button_state state); void -notify_key(struct weston_seat *seat, const struct timespec *time, uint32_t key, - enum wl_keyboard_key_state state, - enum weston_key_state_update update_state); +notify_key(struct weston_seat *seat, const struct weston_key_event *key_event); + void notify_keyboard_focus_in(struct weston_seat *seat, struct wl_array *keys, enum weston_key_state_update update_state); diff --git a/libweston/bindings.c b/libweston/bindings.c index 4d2ad94f6..7b8df7527 100644 --- a/libweston/bindings.c +++ b/libweston/bindings.c @@ -216,13 +216,14 @@ struct binding_keyboard_grab { }; static void -binding_key(struct weston_keyboard_grab *grab, - const struct timespec *time, uint32_t key, uint32_t state_w) +binding_key(struct weston_keyboard_grab *grab, const struct weston_key_event *key_event) { struct binding_keyboard_grab *b = container_of(grab, struct binding_keyboard_grab, grab); struct wl_resource *resource; - enum wl_keyboard_key_state state = state_w; + enum wl_keyboard_key_state state = key_event->key_state; + struct timespec time = key_event->base.ts; + uint32_t key = key_event->key; uint32_t serial; struct weston_keyboard *keyboard = grab->keyboard; struct wl_display *display = keyboard->seat->compositor->wl_display; @@ -241,7 +242,7 @@ binding_key(struct weston_keyboard_grab *grab, } if (!wl_list_empty(&keyboard->focus_resource_list)) { serial = wl_display_next_serial(display); - msecs = timespec_to_msec(time); + msecs = timespec_to_msec(&time); wl_resource_for_each(resource, &keyboard->focus_resource_list) { wl_keyboard_send_key(resource, serial, @@ -491,8 +492,8 @@ struct debug_binding_grab { }; static void -debug_binding_key(struct weston_keyboard_grab *grab, const struct timespec *time, - uint32_t key, uint32_t state) +debug_binding_key(struct weston_keyboard_grab *grab, + const struct weston_key_event *key_event) { struct debug_binding_grab *db = (struct debug_binding_grab *) grab; struct weston_compositor *ec = db->seat->compositor; @@ -501,6 +502,9 @@ debug_binding_key(struct weston_keyboard_grab *grab, const struct timespec *time uint32_t serial; int send = 0, terminate = 0; int check_binding = 1; + struct timespec time = key_event->base.ts; + uint32_t key = key_event->key; + uint32_t state = key_event->key_state; int i; struct wl_list *resource_list; uint32_t msecs; @@ -535,7 +539,7 @@ debug_binding_key(struct weston_keyboard_grab *grab, const struct timespec *time if (check_binding) { if (weston_compositor_run_debug_binding(ec, grab->keyboard, - time, key, state)) { + &time, key, state)) { /* We ran a binding so swallow the press and keep the * grab to swallow the released too. */ send = 0; @@ -552,7 +556,7 @@ debug_binding_key(struct weston_keyboard_grab *grab, const struct timespec *time if (send) { serial = wl_display_next_serial(display); resource_list = &grab->keyboard->focus_resource_list; - msecs = timespec_to_msec(time); + msecs = timespec_to_msec(&time); wl_resource_for_each(resource, resource_list) { wl_keyboard_send_key(resource, serial, msecs, key, state); } diff --git a/libweston/data-device.c b/libweston/data-device.c index 905d002c1..cb899b642 100644 --- a/libweston/data-device.c +++ b/libweston/data-device.c @@ -838,7 +838,7 @@ static const struct weston_touch_grab_interface touch_drag_grab_interface = { static void drag_grab_keyboard_key(struct weston_keyboard_grab *grab, - const struct timespec *time, uint32_t key, uint32_t state) + const struct weston_key_event *key_event) { } diff --git a/libweston/desktop/seat.c b/libweston/desktop/seat.c index d45719de0..7886d5000 100644 --- a/libweston/desktop/seat.c +++ b/libweston/desktop/seat.c @@ -57,11 +57,9 @@ static void weston_desktop_seat_popup_grab_end(struct weston_desktop_seat *seat) static void weston_desktop_seat_popup_grab_keyboard_key(struct weston_keyboard_grab *grab, - const struct timespec *time, - uint32_t key, - enum wl_keyboard_key_state state) + const struct weston_key_event *key_event) { - weston_keyboard_send_key(grab->keyboard, time, key, state); + weston_keyboard_send_key(grab->keyboard, key_event); } static void diff --git a/libweston/input.c b/libweston/input.c index e51faf78a..46bdd231f 100644 --- a/libweston/input.c +++ b/libweston/input.c @@ -1089,9 +1089,7 @@ weston_keyboard_has_focus_resource(struct weston_keyboard *keyboard) /** Send wl_keyboard.key events to focused resources. * * \param keyboard The keyboard where the key events originates from. - * \param time The timestamp of the event - * \param key The key value of the event - * \param state The state enum value of the event + * \param key_event The weston_key_event as a pointer * * For every resource that is currently in focus, send a wl_keyboard.key event * with the passed parameters. The focused resources are the wl_keyboard @@ -1099,35 +1097,36 @@ weston_keyboard_has_focus_resource(struct weston_keyboard *keyboard) */ WL_EXPORT void weston_keyboard_send_key(struct weston_keyboard *keyboard, - const struct timespec *time, uint32_t key, - enum wl_keyboard_key_state state) + const struct weston_key_event *key_event) { struct wl_resource *resource; struct wl_display *display = keyboard->seat->compositor->wl_display; uint32_t serial; struct wl_list *resource_list; uint32_t msecs; + struct timespec time = key_event->base.ts; + uint32_t key = key_event->key; + enum wl_keyboard_key_state state = key_event->key_state; if (!weston_keyboard_has_focus_resource(keyboard)) return; resource_list = &keyboard->focus_resource_list; serial = wl_display_next_serial(display); - msecs = timespec_to_msec(time); + msecs = timespec_to_msec(&time); wl_resource_for_each(resource, resource_list) { send_timestamps_for_input_resource(resource, &keyboard->timestamps_list, - time); + &time); wl_keyboard_send_key(resource, serial, msecs, key, state); } }; static void default_grab_keyboard_key(struct weston_keyboard_grab *grab, - const struct timespec *time, uint32_t key, - uint32_t state) + const struct weston_key_event *key_event) { - weston_keyboard_send_key(grab->keyboard, time, key, state); + weston_keyboard_send_key(grab->keyboard, key_event); } static void @@ -2664,13 +2663,15 @@ update_keymap(struct weston_seat *seat) } WL_EXPORT void -notify_key(struct weston_seat *seat, const struct timespec *time, uint32_t key, - enum wl_keyboard_key_state state, - enum weston_key_state_update update_state) +notify_key(struct weston_seat *seat, const struct weston_key_event *key_event) { + struct timespec time = key_event->base.ts; struct weston_compositor *compositor = seat->compositor; struct weston_keyboard *keyboard = weston_seat_get_keyboard(seat); struct weston_keyboard_grab *grab = keyboard->grab; + enum wl_keyboard_key_state state = key_event->key_state; + uint32_t key = key_event->key; + enum weston_key_state_update update_state = key_event->key_update_state; uint32_t *k, *end; end = keyboard->keys.data + keyboard->keys.size; @@ -2697,12 +2698,12 @@ notify_key(struct weston_seat *seat, const struct timespec *time, uint32_t key, if (grab == &keyboard->default_grab || grab == &keyboard->input_method_grab) { - weston_compositor_run_key_binding(compositor, keyboard, time, + weston_compositor_run_key_binding(compositor, keyboard, &time, key, state); grab = keyboard->grab; } - grab->interface->key(grab, time, key, state); + grab->interface->key(grab, key_event); if (keyboard->pending_keymap && keyboard->keys.size == 0) @@ -2717,7 +2718,7 @@ notify_key(struct weston_seat *seat, const struct timespec *time, uint32_t key, keyboard->grab_serial = wl_display_get_serial(compositor->wl_display); if (state == WL_KEYBOARD_KEY_STATE_PRESSED) { - keyboard->grab_time = *time; + keyboard->grab_time = time; keyboard->grab_key = key; } } @@ -6027,3 +6028,20 @@ weston_input_init(struct weston_compositor *compositor) return 0; } + +WL_EXPORT void +weston_input_event_init(struct weston_input_event *ievent, struct timespec *ts, + struct weston_seat *seat) +{ + ievent->ts = *ts; + ievent->seat = seat; +} + +WL_EXPORT void +weston_key_event_init(struct weston_key_event *event, uint32_t key, enum wl_keyboard_key_state key_state, + enum weston_key_state_update key_update_state) +{ + event->key = key; + event->key_state = key_state; + event->key_update_state = key_update_state; +} diff --git a/libweston/libinput-device.c b/libweston/libinput-device.c index c79d03db6..948dc8711 100644 --- a/libweston/libinput-device.c +++ b/libweston/libinput-device.c @@ -98,6 +98,8 @@ handle_keyboard_key(struct libinput_device *libinput_device, int seat_key_count = libinput_event_keyboard_get_seat_key_count(keyboard_event); struct timespec time; + uint32_t key = libinput_event_keyboard_get_key(keyboard_event); + struct weston_key_event key_event; /* Ignore key events that are not seat wide state changes. */ if ((key_state == LIBINPUT_KEY_STATE_PRESSED && @@ -106,12 +108,12 @@ handle_keyboard_key(struct libinput_device *libinput_device, seat_key_count != 0)) return; - timespec_from_usec(&time, - libinput_event_keyboard_get_time_usec(keyboard_event)); + timespec_from_usec(&time, libinput_event_keyboard_get_time_usec(keyboard_event)); - notify_key(device->seat, &time, - libinput_event_keyboard_get_key(keyboard_event), - key_state, STATE_UPDATE_AUTOMATIC); + weston_input_event_init(&key_event.base, &time, device->seat); + weston_key_event_init(&key_event, key, key_state, STATE_UPDATE_AUTOMATIC); + + notify_key(device->seat, &key_event); } static bool diff --git a/tests/harness/weston-test.c b/tests/harness/weston-test.c index 59f54644c..6e4a97823 100644 --- a/tests/harness/weston-test.c +++ b/tests/harness/weston-test.c @@ -494,10 +494,13 @@ send_key(struct wl_client *client, struct wl_resource *resource, struct weston_test *test = wl_resource_get_user_data(resource); struct weston_seat *seat = get_seat(test); struct timespec time; + struct weston_key_event key_event; timespec_from_proto(&time, tv_sec_hi, tv_sec_lo, tv_nsec); - notify_key(seat, &time, key, state, STATE_UPDATE_AUTOMATIC); + weston_input_event_init(&key_event.base, &time, seat); + weston_key_event_init(&key_event, key, state, STATE_UPDATE_AUTOMATIC); + notify_key(seat, &key_event); } static void