aboutsummaryrefslogtreecommitdiffstats
path: root/sway/input/keyboard.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/input/keyboard.c')
-rw-r--r--sway/input/keyboard.c251
1 files changed, 137 insertions, 114 deletions
diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c
index ce259eb2..f74d0658 100644
--- a/sway/input/keyboard.c
+++ b/sway/input/keyboard.c
@@ -1,15 +1,13 @@
1#include <assert.h> 1#include <assert.h>
2#include <limits.h> 2#include <limits.h>
3#include <strings.h> 3#include <strings.h>
4#include <wlr/config.h>
4#include <wlr/backend/multi.h> 5#include <wlr/backend/multi.h>
5#include <wlr/backend/session.h>
6#include <wlr/interfaces/wlr_keyboard.h> 6#include <wlr/interfaces/wlr_keyboard.h>
7#include <wlr/types/wlr_idle.h>
8#include <wlr/types/wlr_keyboard.h> 7#include <wlr/types/wlr_keyboard.h>
9#include <wlr/types/wlr_keyboard_group.h> 8#include <wlr/types/wlr_keyboard_group.h>
10#include <xkbcommon/xkbcommon-names.h> 9#include <xkbcommon/xkbcommon-names.h>
11#include "sway/commands.h" 10#include "sway/commands.h"
12#include "sway/desktop/transaction.h"
13#include "sway/input/input-manager.h" 11#include "sway/input/input-manager.h"
14#include "sway/input/keyboard.h" 12#include "sway/input/keyboard.h"
15#include "sway/input/seat.h" 13#include "sway/input/seat.h"
@@ -17,6 +15,10 @@
17#include "sway/ipc-server.h" 15#include "sway/ipc-server.h"
18#include "log.h" 16#include "log.h"
19 17
18#if WLR_HAS_SESSION
19#include <wlr/backend/session.h>
20#endif
21
20static struct modifier_key { 22static struct modifier_key {
21 char *name; 23 char *name;
22 uint32_t mod; 24 uint32_t mod;
@@ -30,6 +32,7 @@ static struct modifier_key {
30 { XKB_MOD_NAME_NUM, WLR_MODIFIER_MOD2 }, 32 { XKB_MOD_NAME_NUM, WLR_MODIFIER_MOD2 },
31 { "Mod3", WLR_MODIFIER_MOD3 }, 33 { "Mod3", WLR_MODIFIER_MOD3 },
32 { XKB_MOD_NAME_LOGO, WLR_MODIFIER_LOGO }, 34 { XKB_MOD_NAME_LOGO, WLR_MODIFIER_LOGO },
35 { "Super", WLR_MODIFIER_LOGO },
33 { "Mod5", WLR_MODIFIER_MOD5 }, 36 { "Mod5", WLR_MODIFIER_MOD5 },
34}; 37};
35 38
@@ -265,14 +268,12 @@ static bool keyboard_execute_compositor_binding(struct sway_keyboard *keyboard,
265 xkb_keysym_t keysym = pressed_keysyms[i]; 268 xkb_keysym_t keysym = pressed_keysyms[i];
266 if (keysym >= XKB_KEY_XF86Switch_VT_1 && 269 if (keysym >= XKB_KEY_XF86Switch_VT_1 &&
267 keysym <= XKB_KEY_XF86Switch_VT_12) { 270 keysym <= XKB_KEY_XF86Switch_VT_12) {
268 if (wlr_backend_is_multi(server.backend)) { 271#if WLR_HAS_SESSION
269 struct wlr_session *session = 272 if (server.session) {
270 wlr_backend_get_session(server.backend); 273 unsigned vt = keysym - XKB_KEY_XF86Switch_VT_1 + 1;
271 if (session) { 274 wlr_session_change_vt(server.session, vt);
272 unsigned vt = keysym - XKB_KEY_XF86Switch_VT_1 + 1;
273 wlr_session_change_vt(session, vt);
274 }
275 } 275 }
276#endif
276 return true; 277 return true;
277 } 278 }
278 } 279 }
@@ -292,14 +293,12 @@ static bool keyboard_execute_compositor_binding(struct sway_keyboard *keyboard,
292static size_t keyboard_keysyms_translated(struct sway_keyboard *keyboard, 293static size_t keyboard_keysyms_translated(struct sway_keyboard *keyboard,
293 xkb_keycode_t keycode, const xkb_keysym_t **keysyms, 294 xkb_keycode_t keycode, const xkb_keysym_t **keysyms,
294 uint32_t *modifiers) { 295 uint32_t *modifiers) {
295 struct wlr_input_device *device = 296 *modifiers = wlr_keyboard_get_modifiers(keyboard->wlr);
296 keyboard->seat_device->input_device->wlr_device;
297 *modifiers = wlr_keyboard_get_modifiers(device->keyboard);
298 xkb_mod_mask_t consumed = xkb_state_key_get_consumed_mods2( 297 xkb_mod_mask_t consumed = xkb_state_key_get_consumed_mods2(
299 device->keyboard->xkb_state, keycode, XKB_CONSUMED_MODE_XKB); 298 keyboard->wlr->xkb_state, keycode, XKB_CONSUMED_MODE_XKB);
300 *modifiers = *modifiers & ~consumed; 299 *modifiers = *modifiers & ~consumed;
301 300
302 return xkb_state_key_get_syms(device->keyboard->xkb_state, 301 return xkb_state_key_get_syms(keyboard->wlr->xkb_state,
303 keycode, keysyms); 302 keycode, keysyms);
304} 303}
305 304
@@ -315,13 +314,11 @@ static size_t keyboard_keysyms_translated(struct sway_keyboard *keyboard,
315static size_t keyboard_keysyms_raw(struct sway_keyboard *keyboard, 314static size_t keyboard_keysyms_raw(struct sway_keyboard *keyboard,
316 xkb_keycode_t keycode, const xkb_keysym_t **keysyms, 315 xkb_keycode_t keycode, const xkb_keysym_t **keysyms,
317 uint32_t *modifiers) { 316 uint32_t *modifiers) {
318 struct wlr_input_device *device = 317 *modifiers = wlr_keyboard_get_modifiers(keyboard->wlr);
319 keyboard->seat_device->input_device->wlr_device;
320 *modifiers = wlr_keyboard_get_modifiers(device->keyboard);
321 318
322 xkb_layout_index_t layout_index = xkb_state_key_get_layout( 319 xkb_layout_index_t layout_index = xkb_state_key_get_layout(
323 device->keyboard->xkb_state, keycode); 320 keyboard->wlr->xkb_state, keycode);
324 return xkb_keymap_key_get_syms_by_level(device->keyboard->keymap, 321 return xkb_keymap_key_get_syms_by_level(keyboard->wlr->keymap,
325 keycode, layout_index, 0, keysyms); 322 keycode, layout_index, 0, keysyms);
326} 323}
327 324
@@ -361,8 +358,7 @@ static void update_keyboard_state(struct sway_keyboard *keyboard,
361 keyinfo->keycode, &keyinfo->translated_keysyms, 358 keyinfo->keycode, &keyinfo->translated_keysyms,
362 &keyinfo->translated_modifiers); 359 &keyinfo->translated_modifiers);
363 360
364 keyinfo->code_modifiers = wlr_keyboard_get_modifiers( 361 keyinfo->code_modifiers = wlr_keyboard_get_modifiers(keyboard->wlr);
365 keyboard->seat_device->input_device->wlr_device->keyboard);
366 362
367 // Update shortcut model keyinfo 363 // Update shortcut model keyinfo
368 update_shortcut_state(&keyboard->state_keycodes, raw_keycode, keystate, 364 update_shortcut_state(&keyboard->state_keycodes, raw_keycode, keystate,
@@ -379,16 +375,38 @@ static void update_keyboard_state(struct sway_keyboard *keyboard,
379 } 375 }
380} 376}
381 377
378/**
379 * Get keyboard grab of the seat from sway_keyboard if we should forward events
380 * to it.
381 *
382 * Returns NULL if the keyboard is not grabbed by an input method,
383 * or if event is from virtual keyboard of the same client as grab.
384 * TODO: see swaywm/wlroots#2322
385 */
386static struct wlr_input_method_keyboard_grab_v2 *keyboard_get_im_grab(
387 struct sway_keyboard *keyboard) {
388 struct wlr_input_method_v2 *input_method = keyboard->seat_device->
389 sway_seat->im_relay.input_method;
390 struct wlr_virtual_keyboard_v1 *virtual_keyboard =
391 wlr_input_device_get_virtual_keyboard(keyboard->seat_device->input_device->wlr_device);
392 if (!input_method || !input_method->keyboard_grab || (virtual_keyboard &&
393 wl_resource_get_client(virtual_keyboard->resource) ==
394 wl_resource_get_client(input_method->keyboard_grab->resource))) {
395 return NULL;
396 }
397 return input_method->keyboard_grab;
398}
399
382static void handle_key_event(struct sway_keyboard *keyboard, 400static void handle_key_event(struct sway_keyboard *keyboard,
383 struct wlr_event_keyboard_key *event) { 401 struct wlr_keyboard_key_event *event) {
384 struct sway_seat *seat = keyboard->seat_device->sway_seat; 402 struct sway_seat *seat = keyboard->seat_device->sway_seat;
385 struct wlr_seat *wlr_seat = seat->wlr_seat; 403 struct wlr_seat *wlr_seat = seat->wlr_seat;
386 struct wlr_input_device *wlr_device = 404 struct wlr_input_device *wlr_device =
387 keyboard->seat_device->input_device->wlr_device; 405 keyboard->seat_device->input_device->wlr_device;
388 char *device_identifier = input_device_get_identifier(wlr_device); 406 char *device_identifier = input_device_get_identifier(wlr_device);
389 bool exact_identifier = wlr_device->keyboard->group != NULL; 407 bool exact_identifier = keyboard->wlr->group != NULL;
390 seat_idle_notify_activity(seat, IDLE_SOURCE_KEYBOARD); 408 seat_idle_notify_activity(seat, IDLE_SOURCE_KEYBOARD);
391 bool input_inhibited = seat->exclusive_client != NULL; 409 bool locked = server.session_lock.lock;
392 struct sway_keyboard_shortcuts_inhibitor *sway_inhibitor = 410 struct sway_keyboard_shortcuts_inhibitor *sway_inhibitor =
393 keyboard_shortcuts_inhibitor_get_for_focused_surface(seat); 411 keyboard_shortcuts_inhibitor_get_for_focused_surface(seat);
394 bool shortcuts_inhibited = sway_inhibitor && sway_inhibitor->inhibitor->active; 412 bool shortcuts_inhibited = sway_inhibitor && sway_inhibitor->inhibitor->active;
@@ -406,17 +424,17 @@ static void handle_key_event(struct sway_keyboard *keyboard,
406 struct sway_binding *binding_released = NULL; 424 struct sway_binding *binding_released = NULL;
407 get_active_binding(&keyboard->state_keycodes, 425 get_active_binding(&keyboard->state_keycodes,
408 config->current_mode->keycode_bindings, &binding_released, 426 config->current_mode->keycode_bindings, &binding_released,
409 keyinfo.code_modifiers, true, input_inhibited, 427 keyinfo.code_modifiers, true, locked,
410 shortcuts_inhibited, device_identifier, 428 shortcuts_inhibited, device_identifier,
411 exact_identifier, keyboard->effective_layout); 429 exact_identifier, keyboard->effective_layout);
412 get_active_binding(&keyboard->state_keysyms_raw, 430 get_active_binding(&keyboard->state_keysyms_raw,
413 config->current_mode->keysym_bindings, &binding_released, 431 config->current_mode->keysym_bindings, &binding_released,
414 keyinfo.raw_modifiers, true, input_inhibited, 432 keyinfo.raw_modifiers, true, locked,
415 shortcuts_inhibited, device_identifier, 433 shortcuts_inhibited, device_identifier,
416 exact_identifier, keyboard->effective_layout); 434 exact_identifier, keyboard->effective_layout);
417 get_active_binding(&keyboard->state_keysyms_translated, 435 get_active_binding(&keyboard->state_keysyms_translated,
418 config->current_mode->keysym_bindings, &binding_released, 436 config->current_mode->keysym_bindings, &binding_released,
419 keyinfo.translated_modifiers, true, input_inhibited, 437 keyinfo.translated_modifiers, true, locked,
420 shortcuts_inhibited, device_identifier, 438 shortcuts_inhibited, device_identifier,
421 exact_identifier, keyboard->effective_layout); 439 exact_identifier, keyboard->effective_layout);
422 440
@@ -438,17 +456,17 @@ static void handle_key_event(struct sway_keyboard *keyboard,
438 if (event->state == WL_KEYBOARD_KEY_STATE_PRESSED) { 456 if (event->state == WL_KEYBOARD_KEY_STATE_PRESSED) {
439 get_active_binding(&keyboard->state_keycodes, 457 get_active_binding(&keyboard->state_keycodes,
440 config->current_mode->keycode_bindings, &binding, 458 config->current_mode->keycode_bindings, &binding,
441 keyinfo.code_modifiers, false, input_inhibited, 459 keyinfo.code_modifiers, false, locked,
442 shortcuts_inhibited, device_identifier, 460 shortcuts_inhibited, device_identifier,
443 exact_identifier, keyboard->effective_layout); 461 exact_identifier, keyboard->effective_layout);
444 get_active_binding(&keyboard->state_keysyms_raw, 462 get_active_binding(&keyboard->state_keysyms_raw,
445 config->current_mode->keysym_bindings, &binding, 463 config->current_mode->keysym_bindings, &binding,
446 keyinfo.raw_modifiers, false, input_inhibited, 464 keyinfo.raw_modifiers, false, locked,
447 shortcuts_inhibited, device_identifier, 465 shortcuts_inhibited, device_identifier,
448 exact_identifier, keyboard->effective_layout); 466 exact_identifier, keyboard->effective_layout);
449 get_active_binding(&keyboard->state_keysyms_translated, 467 get_active_binding(&keyboard->state_keysyms_translated,
450 config->current_mode->keysym_bindings, &binding, 468 config->current_mode->keysym_bindings, &binding,
451 keyinfo.translated_modifiers, false, input_inhibited, 469 keyinfo.translated_modifiers, false, locked,
452 shortcuts_inhibited, device_identifier, 470 shortcuts_inhibited, device_identifier,
453 exact_identifier, keyboard->effective_layout); 471 exact_identifier, keyboard->effective_layout);
454 } 472 }
@@ -456,10 +474,10 @@ static void handle_key_event(struct sway_keyboard *keyboard,
456 // Set up (or clear) keyboard repeat for a pressed binding. Since the 474 // Set up (or clear) keyboard repeat for a pressed binding. Since the
457 // binding may remove the keyboard, the timer needs to be updated first 475 // binding may remove the keyboard, the timer needs to be updated first
458 if (binding && !(binding->flags & BINDING_NOREPEAT) && 476 if (binding && !(binding->flags & BINDING_NOREPEAT) &&
459 wlr_device->keyboard->repeat_info.delay > 0) { 477 keyboard->wlr->repeat_info.delay > 0) {
460 keyboard->repeat_binding = binding; 478 keyboard->repeat_binding = binding;
461 if (wl_event_source_timer_update(keyboard->key_repeat_source, 479 if (wl_event_source_timer_update(keyboard->key_repeat_source,
462 wlr_device->keyboard->repeat_info.delay) < 0) { 480 keyboard->wlr->repeat_info.delay) < 0) {
463 sway_log(SWAY_DEBUG, "failed to set key repeat timer"); 481 sway_log(SWAY_DEBUG, "failed to set key repeat timer");
464 } 482 }
465 } else if (keyboard->repeat_binding) { 483 } else if (keyboard->repeat_binding) {
@@ -471,7 +489,7 @@ static void handle_key_event(struct sway_keyboard *keyboard,
471 handled = true; 489 handled = true;
472 } 490 }
473 491
474 if (!handled && wlr_device->keyboard->group) { 492 if (!handled && keyboard->wlr->group) {
475 // Only handle device specific bindings for keyboards in a group 493 // Only handle device specific bindings for keyboards in a group
476 free(device_identifier); 494 free(device_identifier);
477 return; 495 return;
@@ -489,18 +507,41 @@ static void handle_key_event(struct sway_keyboard *keyboard,
489 keyinfo.raw_keysyms_len); 507 keyinfo.raw_keysyms_len);
490 } 508 }
491 509
492 if (!handled || event->state == WL_KEYBOARD_KEY_STATE_RELEASED) { 510 if (event->state == WL_KEYBOARD_KEY_STATE_RELEASED) {
511 // If the pressed event was sent to a client, also send the released
512 // event. In particular, don't send the released event to the IM grab.
493 bool pressed_sent = update_shortcut_state( 513 bool pressed_sent = update_shortcut_state(
494 &keyboard->state_pressed_sent, event->keycode, event->state, 514 &keyboard->state_pressed_sent, event->keycode,
495 keyinfo.keycode, 0); 515 event->state, keyinfo.keycode, 0);
496 if (pressed_sent || event->state == WL_KEYBOARD_KEY_STATE_PRESSED) { 516 if (pressed_sent) {
497 wlr_seat_set_keyboard(wlr_seat, wlr_device); 517 wlr_seat_set_keyboard(wlr_seat, keyboard->wlr);
498 wlr_seat_keyboard_notify_key(wlr_seat, event->time_msec, 518 wlr_seat_keyboard_notify_key(wlr_seat, event->time_msec,
499 event->keycode, event->state); 519 event->keycode, event->state);
520 handled = true;
521 }
522 }
523
524 if (!handled) {
525 struct wlr_input_method_keyboard_grab_v2 *kb_grab = keyboard_get_im_grab(keyboard);
526
527 if (kb_grab) {
528 wlr_input_method_keyboard_grab_v2_set_keyboard(kb_grab, keyboard->wlr);
529 wlr_input_method_keyboard_grab_v2_send_key(kb_grab,
530 event->time_msec, event->keycode, event->state);
531 handled = true;
500 } 532 }
501 } 533 }
502 534
503 transaction_commit_dirty(); 535 if (!handled && event->state != WL_KEYBOARD_KEY_STATE_RELEASED) {
536 // If a released event failed pressed sent test, and not in sent to
537 // keyboard grab, it is still not handled. Don't handle released here.
538 update_shortcut_state(
539 &keyboard->state_pressed_sent, event->keycode, event->state,
540 keyinfo.keycode, 0);
541 wlr_seat_set_keyboard(wlr_seat, keyboard->wlr);
542 wlr_seat_keyboard_notify_key(wlr_seat, event->time_msec,
543 event->keycode, event->state);
544 }
504 545
505 free(device_identifier); 546 free(device_identifier);
506} 547}
@@ -573,21 +614,18 @@ static void handle_keyboard_group_leave(struct wl_listener *listener,
573} 614}
574 615
575static int handle_keyboard_repeat(void *data) { 616static int handle_keyboard_repeat(void *data) {
576 struct sway_keyboard *keyboard = (struct sway_keyboard *)data; 617 struct sway_keyboard *keyboard = data;
577 struct wlr_keyboard *wlr_device =
578 keyboard->seat_device->input_device->wlr_device->keyboard;
579 if (keyboard->repeat_binding) { 618 if (keyboard->repeat_binding) {
580 if (wlr_device->repeat_info.rate > 0) { 619 if (keyboard->wlr->repeat_info.rate > 0) {
581 // We queue the next event first, as the command might cancel it 620 // We queue the next event first, as the command might cancel it
582 if (wl_event_source_timer_update(keyboard->key_repeat_source, 621 if (wl_event_source_timer_update(keyboard->key_repeat_source,
583 1000 / wlr_device->repeat_info.rate) < 0) { 622 1000 / keyboard->wlr->repeat_info.rate) < 0) {
584 sway_log(SWAY_DEBUG, "failed to update key repeat timer"); 623 sway_log(SWAY_DEBUG, "failed to update key repeat timer");
585 } 624 }
586 } 625 }
587 626
588 seat_execute_command(keyboard->seat_device->sway_seat, 627 seat_execute_command(keyboard->seat_device->sway_seat,
589 keyboard->repeat_binding); 628 keyboard->repeat_binding);
590 transaction_commit_dirty();
591 } 629 }
592 return 0; 630 return 0;
593} 631}
@@ -614,22 +652,28 @@ static void determine_bar_visibility(uint32_t modifiers) {
614} 652}
615 653
616static void handle_modifier_event(struct sway_keyboard *keyboard) { 654static void handle_modifier_event(struct sway_keyboard *keyboard) {
617 struct wlr_input_device *wlr_device = 655 if (!keyboard->wlr->group) {
618 keyboard->seat_device->input_device->wlr_device; 656 struct wlr_input_method_keyboard_grab_v2 *kb_grab = keyboard_get_im_grab(keyboard);
619 if (!wlr_device->keyboard->group) {
620 struct wlr_seat *wlr_seat = keyboard->seat_device->sway_seat->wlr_seat;
621 wlr_seat_set_keyboard(wlr_seat, wlr_device);
622 wlr_seat_keyboard_notify_modifiers(wlr_seat,
623 &wlr_device->keyboard->modifiers);
624 657
625 uint32_t modifiers = wlr_keyboard_get_modifiers(wlr_device->keyboard); 658 if (kb_grab) {
659 wlr_input_method_keyboard_grab_v2_set_keyboard(kb_grab, keyboard->wlr);
660 wlr_input_method_keyboard_grab_v2_send_modifiers(kb_grab,
661 &keyboard->wlr->modifiers);
662 } else {
663 struct wlr_seat *wlr_seat = keyboard->seat_device->sway_seat->wlr_seat;
664 wlr_seat_set_keyboard(wlr_seat, keyboard->wlr);
665 wlr_seat_keyboard_notify_modifiers(wlr_seat,
666 &keyboard->wlr->modifiers);
667 }
668
669 uint32_t modifiers = wlr_keyboard_get_modifiers(keyboard->wlr);
626 determine_bar_visibility(modifiers); 670 determine_bar_visibility(modifiers);
627 } 671 }
628 672
629 if (wlr_device->keyboard->modifiers.group != keyboard->effective_layout) { 673 if (keyboard->wlr->modifiers.group != keyboard->effective_layout) {
630 keyboard->effective_layout = wlr_device->keyboard->modifiers.group; 674 keyboard->effective_layout = keyboard->wlr->modifiers.group;
631 675
632 if (!wlr_keyboard_group_from_wlr_keyboard(wlr_device->keyboard)) { 676 if (!wlr_keyboard_group_from_wlr_keyboard(keyboard->wlr)) {
633 ipc_event_input("xkb_layout", keyboard->seat_device->input_device); 677 ipc_event_input("xkb_layout", keyboard->seat_device->input_device);
634 } 678 }
635 } 679 }
@@ -658,6 +702,7 @@ struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat,
658 } 702 }
659 703
660 keyboard->seat_device = device; 704 keyboard->seat_device = device;
705 keyboard->wlr = wlr_keyboard_from_input_device(device->input_device->wlr_device);
661 device->keyboard = keyboard; 706 device->keyboard = keyboard;
662 707
663 wl_list_init(&keyboard->keyboard_key.link); 708 wl_list_init(&keyboard->keyboard_key.link);
@@ -671,23 +716,11 @@ struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat,
671 716
672static void handle_xkb_context_log(struct xkb_context *context, 717static void handle_xkb_context_log(struct xkb_context *context,
673 enum xkb_log_level level, const char *format, va_list args) { 718 enum xkb_log_level level, const char *format, va_list args) {
674 va_list args_copy; 719 char *error = vformat_str(format, args);
675 va_copy(args_copy, args);
676 size_t length = vsnprintf(NULL, 0, format, args_copy) + 1;
677 va_end(args_copy);
678
679 char *error = malloc(length);
680 if (!error) {
681 sway_log(SWAY_ERROR, "Failed to allocate libxkbcommon log message");
682 return;
683 }
684
685 va_copy(args_copy, args);
686 vsnprintf(error, length, format, args_copy);
687 va_end(args_copy);
688 720
689 if (error[length - 2] == '\n') { 721 size_t len = strlen(error);
690 error[length - 2] = '\0'; 722 if (error[len - 1] == '\n') {
723 error[len - 1] = '\0';
691 } 724 }
692 725
693 sway_log_importance_t importance = SWAY_DEBUG; 726 sway_log_importance_t importance = SWAY_DEBUG;
@@ -708,7 +741,7 @@ static void handle_xkb_context_log(struct xkb_context *context,
708 741
709struct xkb_keymap *sway_keyboard_compile_keymap(struct input_config *ic, 742struct xkb_keymap *sway_keyboard_compile_keymap(struct input_config *ic,
710 char **error) { 743 char **error) {
711 struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_FLAGS); 744 struct xkb_context *context = xkb_context_new(XKB_CONTEXT_NO_SECURE_GETENV);
712 if (!sway_assert(context, "cannot create XKB context")) { 745 if (!sway_assert(context, "cannot create XKB context")) {
713 return NULL; 746 return NULL;
714 } 747 }
@@ -722,13 +755,8 @@ struct xkb_keymap *sway_keyboard_compile_keymap(struct input_config *ic,
722 if (!keymap_file) { 755 if (!keymap_file) {
723 sway_log_errno(SWAY_ERROR, "cannot read xkb file %s", ic->xkb_file); 756 sway_log_errno(SWAY_ERROR, "cannot read xkb file %s", ic->xkb_file);
724 if (error) { 757 if (error) {
725 size_t len = snprintf(NULL, 0, "cannot read xkb file %s: %s", 758 *error = format_str("cannot read xkb file %s: %s",
726 ic->xkb_file, strerror(errno)) + 1; 759 ic->xkb_file, strerror(errno));
727 *error = malloc(len);
728 if (*error) {
729 snprintf(*error, len, "cannot read xkb_file %s: %s",
730 ic->xkb_file, strerror(errno));
731 }
732 } 760 }
733 goto cleanup; 761 goto cleanup;
734 } 762 }
@@ -766,13 +794,12 @@ static void destroy_empty_wlr_keyboard_group(void *data) {
766 794
767static void sway_keyboard_group_remove(struct sway_keyboard *keyboard) { 795static void sway_keyboard_group_remove(struct sway_keyboard *keyboard) {
768 struct sway_input_device *device = keyboard->seat_device->input_device; 796 struct sway_input_device *device = keyboard->seat_device->input_device;
769 struct wlr_keyboard *wlr_keyboard = device->wlr_device->keyboard; 797 struct wlr_keyboard_group *wlr_group = keyboard->wlr->group;
770 struct wlr_keyboard_group *wlr_group = wlr_keyboard->group;
771 798
772 sway_log(SWAY_DEBUG, "Removing keyboard %s from group %p", 799 sway_log(SWAY_DEBUG, "Removing keyboard %s from group %p",
773 device->identifier, wlr_group); 800 device->identifier, wlr_group);
774 801
775 wlr_keyboard_group_remove_keyboard(wlr_keyboard->group, wlr_keyboard); 802 wlr_keyboard_group_remove_keyboard(keyboard->wlr->group, keyboard->wlr);
776 803
777 if (wl_list_empty(&wlr_group->devices)) { 804 if (wl_list_empty(&wlr_group->devices)) {
778 sway_log(SWAY_DEBUG, "Destroying empty keyboard group %p", 805 sway_log(SWAY_DEBUG, "Destroying empty keyboard group %p",
@@ -797,9 +824,7 @@ static void sway_keyboard_group_remove(struct sway_keyboard *keyboard) {
797} 824}
798 825
799static void sway_keyboard_group_remove_invalid(struct sway_keyboard *keyboard) { 826static void sway_keyboard_group_remove_invalid(struct sway_keyboard *keyboard) {
800 struct sway_input_device *device = keyboard->seat_device->input_device; 827 if (!keyboard->wlr->group) {
801 struct wlr_keyboard *wlr_keyboard = device->wlr_device->keyboard;
802 if (!wlr_keyboard->group) {
803 return; 828 return;
804 } 829 }
805 830
@@ -815,7 +840,7 @@ static void sway_keyboard_group_remove_invalid(struct sway_keyboard *keyboard) {
815 break; 840 break;
816 case KEYBOARD_GROUP_DEFAULT: /* fallthrough */ 841 case KEYBOARD_GROUP_DEFAULT: /* fallthrough */
817 case KEYBOARD_GROUP_SMART:; 842 case KEYBOARD_GROUP_SMART:;
818 struct wlr_keyboard_group *group = wlr_keyboard->group; 843 struct wlr_keyboard_group *group = keyboard->wlr->group;
819 if (!wlr_keyboard_keymaps_match(keyboard->keymap, group->keyboard.keymap) || 844 if (!wlr_keyboard_keymaps_match(keyboard->keymap, group->keyboard.keymap) ||
820 !repeat_info_match(keyboard, &group->keyboard)) { 845 !repeat_info_match(keyboard, &group->keyboard)) {
821 sway_keyboard_group_remove(keyboard); 846 sway_keyboard_group_remove(keyboard);
@@ -826,7 +851,6 @@ static void sway_keyboard_group_remove_invalid(struct sway_keyboard *keyboard) {
826 851
827static void sway_keyboard_group_add(struct sway_keyboard *keyboard) { 852static void sway_keyboard_group_add(struct sway_keyboard *keyboard) {
828 struct sway_input_device *device = keyboard->seat_device->input_device; 853 struct sway_input_device *device = keyboard->seat_device->input_device;
829 struct wlr_keyboard *wlr_keyboard = device->wlr_device->keyboard;
830 struct sway_seat *seat = keyboard->seat_device->sway_seat; 854 struct sway_seat *seat = keyboard->seat_device->sway_seat;
831 struct seat_config *sc = seat_get_config(seat); 855 struct seat_config *sc = seat_get_config(seat);
832 856
@@ -858,7 +882,7 @@ static void sway_keyboard_group_add(struct sway_keyboard *keyboard) {
858 repeat_info_match(keyboard, &wlr_group->keyboard)) { 882 repeat_info_match(keyboard, &wlr_group->keyboard)) {
859 sway_log(SWAY_DEBUG, "Adding keyboard %s to group %p", 883 sway_log(SWAY_DEBUG, "Adding keyboard %s to group %p",
860 device->identifier, wlr_group); 884 device->identifier, wlr_group);
861 wlr_keyboard_group_add_keyboard(wlr_group, wlr_keyboard); 885 wlr_keyboard_group_add_keyboard(wlr_group, keyboard->wlr);
862 return; 886 return;
863 } 887 }
864 break; 888 break;
@@ -897,7 +921,7 @@ static void sway_keyboard_group_add(struct sway_keyboard *keyboard) {
897 goto cleanup; 921 goto cleanup;
898 } 922 }
899 sway_group->seat_device->input_device->wlr_device = 923 sway_group->seat_device->input_device->wlr_device =
900 sway_group->wlr_group->input_device; 924 &sway_group->wlr_group->keyboard.base;
901 925
902 if (!sway_keyboard_create(seat, sway_group->seat_device)) { 926 if (!sway_keyboard_create(seat, sway_group->seat_device)) {
903 sway_log(SWAY_ERROR, "Failed to allocate sway_keyboard for group"); 927 sway_log(SWAY_ERROR, "Failed to allocate sway_keyboard for group");
@@ -906,7 +930,7 @@ static void sway_keyboard_group_add(struct sway_keyboard *keyboard) {
906 930
907 sway_log(SWAY_DEBUG, "Adding keyboard %s to group %p", 931 sway_log(SWAY_DEBUG, "Adding keyboard %s to group %p",
908 device->identifier, sway_group->wlr_group); 932 device->identifier, sway_group->wlr_group);
909 wlr_keyboard_group_add_keyboard(sway_group->wlr_group, wlr_keyboard); 933 wlr_keyboard_group_add_keyboard(sway_group->wlr_group, keyboard->wlr);
910 934
911 wl_list_insert(&seat->keyboard_groups, &sway_group->link); 935 wl_list_insert(&seat->keyboard_groups, &sway_group->link);
912 936
@@ -938,10 +962,8 @@ cleanup:
938void sway_keyboard_configure(struct sway_keyboard *keyboard) { 962void sway_keyboard_configure(struct sway_keyboard *keyboard) {
939 struct input_config *input_config = 963 struct input_config *input_config =
940 input_device_get_config(keyboard->seat_device->input_device); 964 input_device_get_config(keyboard->seat_device->input_device);
941 struct wlr_input_device *wlr_device =
942 keyboard->seat_device->input_device->wlr_device;
943 965
944 if (!sway_assert(!wlr_keyboard_group_from_wlr_keyboard(wlr_device->keyboard), 966 if (!sway_assert(!wlr_keyboard_group_from_wlr_keyboard(keyboard->wlr),
945 "sway_keyboard_configure should not be called with a " 967 "sway_keyboard_configure should not be called with a "
946 "keyboard group's keyboard")) { 968 "keyboard group's keyboard")) {
947 return; 969 return;
@@ -983,11 +1005,11 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) {
983 1005
984 sway_keyboard_group_remove_invalid(keyboard); 1006 sway_keyboard_group_remove_invalid(keyboard);
985 1007
986 wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap); 1008 wlr_keyboard_set_keymap(keyboard->wlr, keyboard->keymap);
987 wlr_keyboard_set_repeat_info(wlr_device->keyboard, 1009 wlr_keyboard_set_repeat_info(keyboard->wlr,
988 keyboard->repeat_rate, keyboard->repeat_delay); 1010 keyboard->repeat_rate, keyboard->repeat_delay);
989 1011
990 if (!wlr_device->keyboard->group) { 1012 if (!keyboard->wlr->group) {
991 sway_keyboard_group_add(keyboard); 1013 sway_keyboard_group_add(keyboard);
992 } 1014 }
993 1015
@@ -1007,40 +1029,42 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) {
1007 } 1029 }
1008 } 1030 }
1009 if (locked_mods) { 1031 if (locked_mods) {
1010 wlr_keyboard_notify_modifiers(wlr_device->keyboard, 0, 0, 1032 wlr_keyboard_notify_modifiers(keyboard->wlr, 0, 0,
1011 locked_mods, 0); 1033 locked_mods, 0);
1012 uint32_t leds = 0; 1034 uint32_t leds = 0;
1013 for (uint32_t i = 0; i < WLR_LED_COUNT; ++i) { 1035 for (uint32_t i = 0; i < WLR_LED_COUNT; ++i) {
1014 if (xkb_state_led_index_is_active( 1036 if (xkb_state_led_index_is_active(keyboard->wlr->xkb_state,
1015 wlr_device->keyboard->xkb_state, 1037 keyboard->wlr->led_indexes[i])) {
1016 wlr_device->keyboard->led_indexes[i])) {
1017 leds |= (1 << i); 1038 leds |= (1 << i);
1018 } 1039 }
1019 } 1040 }
1020 if (wlr_device->keyboard->group) { 1041 if (keyboard->wlr->group) {
1021 wlr_keyboard_led_update( 1042 wlr_keyboard_led_update(&keyboard->wlr->group->keyboard, leds);
1022 &wlr_device->keyboard->group->keyboard, leds);
1023 } else { 1043 } else {
1024 wlr_keyboard_led_update(wlr_device->keyboard, leds); 1044 wlr_keyboard_led_update(keyboard->wlr, leds);
1025 } 1045 }
1026 } 1046 }
1027 } else { 1047 } else {
1028 xkb_keymap_unref(keymap); 1048 xkb_keymap_unref(keymap);
1029 sway_keyboard_group_remove_invalid(keyboard); 1049 sway_keyboard_group_remove_invalid(keyboard);
1030 if (!wlr_device->keyboard->group) { 1050 if (!keyboard->wlr->group) {
1031 sway_keyboard_group_add(keyboard); 1051 sway_keyboard_group_add(keyboard);
1032 } 1052 }
1033 } 1053 }
1034 1054
1055 // If the seat has no active keyboard, set this one
1035 struct wlr_seat *seat = keyboard->seat_device->sway_seat->wlr_seat; 1056 struct wlr_seat *seat = keyboard->seat_device->sway_seat->wlr_seat;
1036 wlr_seat_set_keyboard(seat, wlr_device); 1057 struct wlr_keyboard *current_keyboard = seat->keyboard_state.keyboard;
1058 if (current_keyboard == NULL) {
1059 wlr_seat_set_keyboard(seat, keyboard->wlr);
1060 }
1037 1061
1038 wl_list_remove(&keyboard->keyboard_key.link); 1062 wl_list_remove(&keyboard->keyboard_key.link);
1039 wl_signal_add(&wlr_device->keyboard->events.key, &keyboard->keyboard_key); 1063 wl_signal_add(&keyboard->wlr->events.key, &keyboard->keyboard_key);
1040 keyboard->keyboard_key.notify = handle_keyboard_key; 1064 keyboard->keyboard_key.notify = handle_keyboard_key;
1041 1065
1042 wl_list_remove(&keyboard->keyboard_modifiers.link); 1066 wl_list_remove(&keyboard->keyboard_modifiers.link);
1043 wl_signal_add(&wlr_device->keyboard->events.modifiers, 1067 wl_signal_add(&keyboard->wlr->events.modifiers,
1044 &keyboard->keyboard_modifiers); 1068 &keyboard->keyboard_modifiers);
1045 keyboard->keyboard_modifiers.notify = handle_keyboard_modifiers; 1069 keyboard->keyboard_modifiers.notify = handle_keyboard_modifiers;
1046 1070
@@ -1057,12 +1081,11 @@ void sway_keyboard_destroy(struct sway_keyboard *keyboard) {
1057 if (!keyboard) { 1081 if (!keyboard) {
1058 return; 1082 return;
1059 } 1083 }
1060 if (keyboard->seat_device->input_device->wlr_device->keyboard->group) { 1084 if (keyboard->wlr->group) {
1061 sway_keyboard_group_remove(keyboard); 1085 sway_keyboard_group_remove(keyboard);
1062 } 1086 }
1063 struct wlr_seat *wlr_seat = keyboard->seat_device->sway_seat->wlr_seat; 1087 struct wlr_seat *wlr_seat = keyboard->seat_device->sway_seat->wlr_seat;
1064 struct sway_input_device *device = keyboard->seat_device->input_device; 1088 if (wlr_seat_get_keyboard(wlr_seat) == keyboard->wlr) {
1065 if (wlr_seat_get_keyboard(wlr_seat) == device->wlr_device->keyboard) {
1066 wlr_seat_set_keyboard(wlr_seat, NULL); 1089 wlr_seat_set_keyboard(wlr_seat, NULL);
1067 } 1090 }
1068 if (keyboard->keymap) { 1091 if (keyboard->keymap) {