aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoremersion <contact@emersion.fr>2018-06-08 00:04:33 +0100
committerGitHub <noreply@github.com>2018-06-08 00:04:33 +0100
commit32f9699359a4caeb833c4f38c61f065d06d551f6 (patch)
tree5e959f37edd7fdefadaa1b30a7a4204679c79815
parent6f895081e1d05e651543187e11766259e2b4f798 (diff)
parent551700e88722cf2ec77500b913c8164495d179c6 (diff)
Merge pull request #1029 from emersion/wl-backend-keyboard-focus-keys
backend/wayland: fix keyboard keys not pressed/released when focus changes
-rw-r--r--backend/wayland/wl_seat.c40
-rw-r--r--include/wlr/types/wlr_keyboard.h2
2 files changed, 41 insertions, 1 deletions
diff --git a/backend/wayland/wl_seat.c b/backend/wayland/wl_seat.c
index cf9b9372..8ed61409 100644
--- a/backend/wayland/wl_seat.c
+++ b/backend/wayland/wl_seat.c
@@ -3,6 +3,7 @@
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
+#include <time.h>
#include <wayland-client.h>
#include <wlr/interfaces/wlr_input_device.h>
#include <wlr/interfaces/wlr_keyboard.h>
@@ -169,12 +170,51 @@ static void keyboard_handle_keymap(void *data, struct wl_keyboard *wl_keyboard,
// TODO: set keymap
}
+static uint32_t get_current_time_msec() {
+ struct timespec now;
+ clock_gettime(CLOCK_MONOTONIC, &now);
+ return now.tv_nsec / 1000;
+}
+
static void keyboard_handle_enter(void *data, struct wl_keyboard *wl_keyboard,
uint32_t serial, struct wl_surface *surface, struct wl_array *keys) {
+ struct wlr_input_device *dev = data;
+
+ uint32_t time = get_current_time_msec();
+
+ uint32_t *keycode_ptr;
+ wl_array_for_each(keycode_ptr, keys) {
+ struct wlr_event_keyboard_key event = {
+ .keycode = *keycode_ptr,
+ .state = WLR_KEY_PRESSED,
+ .time_msec = time,
+ .update_state = false,
+ };
+ wlr_keyboard_notify_key(dev->keyboard, &event);
+ }
}
static void keyboard_handle_leave(void *data, struct wl_keyboard *wl_keyboard,
uint32_t serial, struct wl_surface *surface) {
+ struct wlr_input_device *dev = data;
+
+ uint32_t time = get_current_time_msec();
+
+ uint32_t pressed[dev->keyboard->num_keycodes];
+ memcpy(pressed, dev->keyboard->keycodes,
+ dev->keyboard->num_keycodes * sizeof(uint32_t));
+
+ for (size_t i = 0; i < sizeof(pressed)/sizeof(pressed[0]); ++i) {
+ uint32_t keycode = pressed[i];
+
+ struct wlr_event_keyboard_key event = {
+ .keycode = keycode,
+ .state = WLR_KEY_RELEASED,
+ .time_msec = time,
+ .update_state = false,
+ };
+ wlr_keyboard_notify_key(dev->keyboard, &event);
+ }
}
static void keyboard_handle_key(void *data, struct wl_keyboard *wl_keyboard,
diff --git a/include/wlr/types/wlr_keyboard.h b/include/wlr/types/wlr_keyboard.h
index 97288508..67d4e5be 100644
--- a/include/wlr/types/wlr_keyboard.h
+++ b/include/wlr/types/wlr_keyboard.h
@@ -89,7 +89,7 @@ enum wlr_key_state {
struct wlr_event_keyboard_key {
uint32_t time_msec;
uint32_t keycode;
- bool update_state;
+ bool update_state; // if backend doesn't update modifiers on its own
enum wlr_key_state state;
};