summaryrefslogtreecommitdiff
path: root/sway/input/keyboard.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/input/keyboard.c')
-rw-r--r--sway/input/keyboard.c128
1 files changed, 57 insertions, 71 deletions
diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c
index f258ac7d..c5a646c4 100644
--- a/sway/input/keyboard.c
+++ b/sway/input/keyboard.c
@@ -291,14 +291,12 @@ static bool keyboard_execute_compositor_binding(struct sway_keyboard *keyboard,
static size_t keyboard_keysyms_translated(struct sway_keyboard *keyboard,
xkb_keycode_t keycode, const xkb_keysym_t **keysyms,
uint32_t *modifiers) {
- struct wlr_input_device *device =
- keyboard->seat_device->input_device->wlr_device;
- *modifiers = wlr_keyboard_get_modifiers(device->keyboard);
+ *modifiers = wlr_keyboard_get_modifiers(keyboard->wlr);
xkb_mod_mask_t consumed = xkb_state_key_get_consumed_mods2(
- device->keyboard->xkb_state, keycode, XKB_CONSUMED_MODE_XKB);
+ keyboard->wlr->xkb_state, keycode, XKB_CONSUMED_MODE_XKB);
*modifiers = *modifiers & ~consumed;
- return xkb_state_key_get_syms(device->keyboard->xkb_state,
+ return xkb_state_key_get_syms(keyboard->wlr->xkb_state,
keycode, keysyms);
}
@@ -314,13 +312,11 @@ static size_t keyboard_keysyms_translated(struct sway_keyboard *keyboard,
static size_t keyboard_keysyms_raw(struct sway_keyboard *keyboard,
xkb_keycode_t keycode, const xkb_keysym_t **keysyms,
uint32_t *modifiers) {
- struct wlr_input_device *device =
- keyboard->seat_device->input_device->wlr_device;
- *modifiers = wlr_keyboard_get_modifiers(device->keyboard);
+ *modifiers = wlr_keyboard_get_modifiers(keyboard->wlr);
xkb_layout_index_t layout_index = xkb_state_key_get_layout(
- device->keyboard->xkb_state, keycode);
- return xkb_keymap_key_get_syms_by_level(device->keyboard->keymap,
+ keyboard->wlr->xkb_state, keycode);
+ return xkb_keymap_key_get_syms_by_level(keyboard->wlr->keymap,
keycode, layout_index, 0, keysyms);
}
@@ -360,8 +356,7 @@ static void update_keyboard_state(struct sway_keyboard *keyboard,
keyinfo->keycode, &keyinfo->translated_keysyms,
&keyinfo->translated_modifiers);
- keyinfo->code_modifiers = wlr_keyboard_get_modifiers(
- keyboard->seat_device->input_device->wlr_device->keyboard);
+ keyinfo->code_modifiers = wlr_keyboard_get_modifiers(keyboard->wlr);
// Update shortcut model keyinfo
update_shortcut_state(&keyboard->state_keycodes, raw_keycode, keystate,
@@ -401,15 +396,16 @@ static struct wlr_input_method_keyboard_grab_v2 *keyboard_get_im_grab(
}
static void handle_key_event(struct sway_keyboard *keyboard,
- struct wlr_event_keyboard_key *event) {
+ struct wlr_keyboard_key_event *event) {
struct sway_seat *seat = keyboard->seat_device->sway_seat;
struct wlr_seat *wlr_seat = seat->wlr_seat;
struct wlr_input_device *wlr_device =
keyboard->seat_device->input_device->wlr_device;
char *device_identifier = input_device_get_identifier(wlr_device);
- bool exact_identifier = wlr_device->keyboard->group != NULL;
+ bool exact_identifier = keyboard->wlr->group != NULL;
seat_idle_notify_activity(seat, IDLE_SOURCE_KEYBOARD);
- bool input_inhibited = seat->exclusive_client != NULL;
+ bool input_inhibited = seat->exclusive_client != NULL ||
+ server.session_lock.locked;
struct sway_keyboard_shortcuts_inhibitor *sway_inhibitor =
keyboard_shortcuts_inhibitor_get_for_focused_surface(seat);
bool shortcuts_inhibited = sway_inhibitor && sway_inhibitor->inhibitor->active;
@@ -477,10 +473,10 @@ static void handle_key_event(struct sway_keyboard *keyboard,
// Set up (or clear) keyboard repeat for a pressed binding. Since the
// binding may remove the keyboard, the timer needs to be updated first
if (binding && !(binding->flags & BINDING_NOREPEAT) &&
- wlr_device->keyboard->repeat_info.delay > 0) {
+ keyboard->wlr->repeat_info.delay > 0) {
keyboard->repeat_binding = binding;
if (wl_event_source_timer_update(keyboard->key_repeat_source,
- wlr_device->keyboard->repeat_info.delay) < 0) {
+ keyboard->wlr->repeat_info.delay) < 0) {
sway_log(SWAY_DEBUG, "failed to set key repeat timer");
}
} else if (keyboard->repeat_binding) {
@@ -492,7 +488,7 @@ static void handle_key_event(struct sway_keyboard *keyboard,
handled = true;
}
- if (!handled && wlr_device->keyboard->group) {
+ if (!handled && keyboard->wlr->group) {
// Only handle device specific bindings for keyboards in a group
free(device_identifier);
return;
@@ -517,7 +513,7 @@ static void handle_key_event(struct sway_keyboard *keyboard,
&keyboard->state_pressed_sent, event->keycode,
event->state, keyinfo.keycode, 0);
if (pressed_sent) {
- wlr_seat_set_keyboard(wlr_seat, wlr_device);
+ wlr_seat_set_keyboard(wlr_seat, keyboard->wlr);
wlr_seat_keyboard_notify_key(wlr_seat, event->time_msec,
event->keycode, event->state);
handled = true;
@@ -528,8 +524,7 @@ static void handle_key_event(struct sway_keyboard *keyboard,
struct wlr_input_method_keyboard_grab_v2 *kb_grab = keyboard_get_im_grab(keyboard);
if (kb_grab) {
- wlr_input_method_keyboard_grab_v2_set_keyboard(kb_grab,
- wlr_device->keyboard);
+ wlr_input_method_keyboard_grab_v2_set_keyboard(kb_grab, keyboard->wlr);
wlr_input_method_keyboard_grab_v2_send_key(kb_grab,
event->time_msec, event->keycode, event->state);
handled = true;
@@ -542,7 +537,7 @@ static void handle_key_event(struct sway_keyboard *keyboard,
update_shortcut_state(
&keyboard->state_pressed_sent, event->keycode, event->state,
keyinfo.keycode, 0);
- wlr_seat_set_keyboard(wlr_seat, wlr_device);
+ wlr_seat_set_keyboard(wlr_seat, keyboard->wlr);
wlr_seat_keyboard_notify_key(wlr_seat, event->time_msec,
event->keycode, event->state);
}
@@ -618,14 +613,12 @@ static void handle_keyboard_group_leave(struct wl_listener *listener,
}
static int handle_keyboard_repeat(void *data) {
- struct sway_keyboard *keyboard = (struct sway_keyboard *)data;
- struct wlr_keyboard *wlr_device =
- keyboard->seat_device->input_device->wlr_device->keyboard;
+ struct sway_keyboard *keyboard = data;
if (keyboard->repeat_binding) {
- if (wlr_device->repeat_info.rate > 0) {
+ if (keyboard->wlr->repeat_info.rate > 0) {
// We queue the next event first, as the command might cancel it
if (wl_event_source_timer_update(keyboard->key_repeat_source,
- 1000 / wlr_device->repeat_info.rate) < 0) {
+ 1000 / keyboard->wlr->repeat_info.rate) < 0) {
sway_log(SWAY_DEBUG, "failed to update key repeat timer");
}
}
@@ -658,31 +651,28 @@ static void determine_bar_visibility(uint32_t modifiers) {
}
static void handle_modifier_event(struct sway_keyboard *keyboard) {
- struct wlr_input_device *wlr_device =
- keyboard->seat_device->input_device->wlr_device;
- if (!wlr_device->keyboard->group) {
+ if (!keyboard->wlr->group) {
struct wlr_input_method_keyboard_grab_v2 *kb_grab = keyboard_get_im_grab(keyboard);
if (kb_grab) {
- wlr_input_method_keyboard_grab_v2_set_keyboard(kb_grab,
- wlr_device->keyboard);
+ wlr_input_method_keyboard_grab_v2_set_keyboard(kb_grab, keyboard->wlr);
wlr_input_method_keyboard_grab_v2_send_modifiers(kb_grab,
- &wlr_device->keyboard->modifiers);
+ &keyboard->wlr->modifiers);
} else {
struct wlr_seat *wlr_seat = keyboard->seat_device->sway_seat->wlr_seat;
- wlr_seat_set_keyboard(wlr_seat, wlr_device);
+ wlr_seat_set_keyboard(wlr_seat, keyboard->wlr);
wlr_seat_keyboard_notify_modifiers(wlr_seat,
- &wlr_device->keyboard->modifiers);
+ &keyboard->wlr->modifiers);
}
- uint32_t modifiers = wlr_keyboard_get_modifiers(wlr_device->keyboard);
+ uint32_t modifiers = wlr_keyboard_get_modifiers(keyboard->wlr);
determine_bar_visibility(modifiers);
}
- if (wlr_device->keyboard->modifiers.group != keyboard->effective_layout) {
- keyboard->effective_layout = wlr_device->keyboard->modifiers.group;
+ if (keyboard->wlr->modifiers.group != keyboard->effective_layout) {
+ keyboard->effective_layout = keyboard->wlr->modifiers.group;
- if (!wlr_keyboard_group_from_wlr_keyboard(wlr_device->keyboard)) {
+ if (!wlr_keyboard_group_from_wlr_keyboard(keyboard->wlr)) {
ipc_event_input("xkb_layout", keyboard->seat_device->input_device);
}
}
@@ -711,6 +701,7 @@ struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat,
}
keyboard->seat_device = device;
+ keyboard->wlr = wlr_keyboard_from_input_device(device->input_device->wlr_device);
device->keyboard = keyboard;
wl_list_init(&keyboard->keyboard_key.link);
@@ -819,13 +810,12 @@ static void destroy_empty_wlr_keyboard_group(void *data) {
static void sway_keyboard_group_remove(struct sway_keyboard *keyboard) {
struct sway_input_device *device = keyboard->seat_device->input_device;
- struct wlr_keyboard *wlr_keyboard = device->wlr_device->keyboard;
- struct wlr_keyboard_group *wlr_group = wlr_keyboard->group;
+ struct wlr_keyboard_group *wlr_group = keyboard->wlr->group;
sway_log(SWAY_DEBUG, "Removing keyboard %s from group %p",
device->identifier, wlr_group);
- wlr_keyboard_group_remove_keyboard(wlr_keyboard->group, wlr_keyboard);
+ wlr_keyboard_group_remove_keyboard(keyboard->wlr->group, keyboard->wlr);
if (wl_list_empty(&wlr_group->devices)) {
sway_log(SWAY_DEBUG, "Destroying empty keyboard group %p",
@@ -850,9 +840,7 @@ static void sway_keyboard_group_remove(struct sway_keyboard *keyboard) {
}
static void sway_keyboard_group_remove_invalid(struct sway_keyboard *keyboard) {
- struct sway_input_device *device = keyboard->seat_device->input_device;
- struct wlr_keyboard *wlr_keyboard = device->wlr_device->keyboard;
- if (!wlr_keyboard->group) {
+ if (!keyboard->wlr->group) {
return;
}
@@ -868,7 +856,7 @@ static void sway_keyboard_group_remove_invalid(struct sway_keyboard *keyboard) {
break;
case KEYBOARD_GROUP_DEFAULT: /* fallthrough */
case KEYBOARD_GROUP_SMART:;
- struct wlr_keyboard_group *group = wlr_keyboard->group;
+ struct wlr_keyboard_group *group = keyboard->wlr->group;
if (!wlr_keyboard_keymaps_match(keyboard->keymap, group->keyboard.keymap) ||
!repeat_info_match(keyboard, &group->keyboard)) {
sway_keyboard_group_remove(keyboard);
@@ -879,7 +867,6 @@ static void sway_keyboard_group_remove_invalid(struct sway_keyboard *keyboard) {
static void sway_keyboard_group_add(struct sway_keyboard *keyboard) {
struct sway_input_device *device = keyboard->seat_device->input_device;
- struct wlr_keyboard *wlr_keyboard = device->wlr_device->keyboard;
struct sway_seat *seat = keyboard->seat_device->sway_seat;
struct seat_config *sc = seat_get_config(seat);
@@ -911,7 +898,7 @@ static void sway_keyboard_group_add(struct sway_keyboard *keyboard) {
repeat_info_match(keyboard, &wlr_group->keyboard)) {
sway_log(SWAY_DEBUG, "Adding keyboard %s to group %p",
device->identifier, wlr_group);
- wlr_keyboard_group_add_keyboard(wlr_group, wlr_keyboard);
+ wlr_keyboard_group_add_keyboard(wlr_group, keyboard->wlr);
return;
}
break;
@@ -950,7 +937,7 @@ static void sway_keyboard_group_add(struct sway_keyboard *keyboard) {
goto cleanup;
}
sway_group->seat_device->input_device->wlr_device =
- sway_group->wlr_group->input_device;
+ &sway_group->wlr_group->keyboard.base;
if (!sway_keyboard_create(seat, sway_group->seat_device)) {
sway_log(SWAY_ERROR, "Failed to allocate sway_keyboard for group");
@@ -959,7 +946,7 @@ static void sway_keyboard_group_add(struct sway_keyboard *keyboard) {
sway_log(SWAY_DEBUG, "Adding keyboard %s to group %p",
device->identifier, sway_group->wlr_group);
- wlr_keyboard_group_add_keyboard(sway_group->wlr_group, wlr_keyboard);
+ wlr_keyboard_group_add_keyboard(sway_group->wlr_group, keyboard->wlr);
wl_list_insert(&seat->keyboard_groups, &sway_group->link);
@@ -991,10 +978,8 @@ cleanup:
void sway_keyboard_configure(struct sway_keyboard *keyboard) {
struct input_config *input_config =
input_device_get_config(keyboard->seat_device->input_device);
- struct wlr_input_device *wlr_device =
- keyboard->seat_device->input_device->wlr_device;
- if (!sway_assert(!wlr_keyboard_group_from_wlr_keyboard(wlr_device->keyboard),
+ if (!sway_assert(!wlr_keyboard_group_from_wlr_keyboard(keyboard->wlr),
"sway_keyboard_configure should not be called with a "
"keyboard group's keyboard")) {
return;
@@ -1036,11 +1021,11 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) {
sway_keyboard_group_remove_invalid(keyboard);
- wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap);
- wlr_keyboard_set_repeat_info(wlr_device->keyboard,
+ wlr_keyboard_set_keymap(keyboard->wlr, keyboard->keymap);
+ wlr_keyboard_set_repeat_info(keyboard->wlr,
keyboard->repeat_rate, keyboard->repeat_delay);
- if (!wlr_device->keyboard->group) {
+ if (!keyboard->wlr->group) {
sway_keyboard_group_add(keyboard);
}
@@ -1060,40 +1045,42 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) {
}
}
if (locked_mods) {
- wlr_keyboard_notify_modifiers(wlr_device->keyboard, 0, 0,
+ wlr_keyboard_notify_modifiers(keyboard->wlr, 0, 0,
locked_mods, 0);
uint32_t leds = 0;
for (uint32_t i = 0; i < WLR_LED_COUNT; ++i) {
- if (xkb_state_led_index_is_active(
- wlr_device->keyboard->xkb_state,
- wlr_device->keyboard->led_indexes[i])) {
+ if (xkb_state_led_index_is_active(keyboard->wlr->xkb_state,
+ keyboard->wlr->led_indexes[i])) {
leds |= (1 << i);
}
}
- if (wlr_device->keyboard->group) {
- wlr_keyboard_led_update(
- &wlr_device->keyboard->group->keyboard, leds);
+ if (keyboard->wlr->group) {
+ wlr_keyboard_led_update(&keyboard->wlr->group->keyboard, leds);
} else {
- wlr_keyboard_led_update(wlr_device->keyboard, leds);
+ wlr_keyboard_led_update(keyboard->wlr, leds);
}
}
} else {
xkb_keymap_unref(keymap);
sway_keyboard_group_remove_invalid(keyboard);
- if (!wlr_device->keyboard->group) {
+ if (!keyboard->wlr->group) {
sway_keyboard_group_add(keyboard);
}
}
+ // If the seat has no active keyboard, set this one
struct wlr_seat *seat = keyboard->seat_device->sway_seat->wlr_seat;
- wlr_seat_set_keyboard(seat, wlr_device);
+ struct wlr_keyboard *current_keyboard = seat->keyboard_state.keyboard;
+ if (current_keyboard == NULL) {
+ wlr_seat_set_keyboard(seat, keyboard->wlr);
+ }
wl_list_remove(&keyboard->keyboard_key.link);
- wl_signal_add(&wlr_device->keyboard->events.key, &keyboard->keyboard_key);
+ wl_signal_add(&keyboard->wlr->events.key, &keyboard->keyboard_key);
keyboard->keyboard_key.notify = handle_keyboard_key;
wl_list_remove(&keyboard->keyboard_modifiers.link);
- wl_signal_add(&wlr_device->keyboard->events.modifiers,
+ wl_signal_add(&keyboard->wlr->events.modifiers,
&keyboard->keyboard_modifiers);
keyboard->keyboard_modifiers.notify = handle_keyboard_modifiers;
@@ -1110,12 +1097,11 @@ void sway_keyboard_destroy(struct sway_keyboard *keyboard) {
if (!keyboard) {
return;
}
- if (keyboard->seat_device->input_device->wlr_device->keyboard->group) {
+ if (keyboard->wlr->group) {
sway_keyboard_group_remove(keyboard);
}
struct wlr_seat *wlr_seat = keyboard->seat_device->sway_seat->wlr_seat;
- struct sway_input_device *device = keyboard->seat_device->input_device;
- if (wlr_seat_get_keyboard(wlr_seat) == device->wlr_device->keyboard) {
+ if (wlr_seat_get_keyboard(wlr_seat) == keyboard->wlr) {
wlr_seat_set_keyboard(wlr_seat, NULL);
}
if (keyboard->keymap) {