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.c117
1 files changed, 49 insertions, 68 deletions
diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c
index 8f18b8ba..5e5692f1 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,
291static size_t keyboard_keysyms_translated(struct sway_keyboard *keyboard, 291static size_t keyboard_keysyms_translated(struct sway_keyboard *keyboard,
292 xkb_keycode_t keycode, const xkb_keysym_t **keysyms, 292 xkb_keycode_t keycode, const xkb_keysym_t **keysyms,
293 uint32_t *modifiers) { 293 uint32_t *modifiers) {
294 struct wlr_input_device *device = 294 *modifiers = wlr_keyboard_get_modifiers(keyboard->wlr);
295 keyboard->seat_device->input_device->wlr_device;
296 *modifiers = wlr_keyboard_get_modifiers(device->keyboard);
297 xkb_mod_mask_t consumed = xkb_state_key_get_consumed_mods2( 295 xkb_mod_mask_t consumed = xkb_state_key_get_consumed_mods2(
298 device->keyboard->xkb_state, keycode, XKB_CONSUMED_MODE_XKB); 296 keyboard->wlr->xkb_state, keycode, XKB_CONSUMED_MODE_XKB);
299 *modifiers = *modifiers & ~consumed; 297 *modifiers = *modifiers & ~consumed;
300 298
301 return xkb_state_key_get_syms(device->keyboard->xkb_state, 299 return xkb_state_key_get_syms(keyboard->wlr->xkb_state,
302 keycode, keysyms); 300 keycode, keysyms);
303} 301}
304 302
@@ -314,13 +312,11 @@ static size_t keyboard_keysyms_translated(struct sway_keyboard *keyboard,
314static size_t keyboard_keysyms_raw(struct sway_keyboard *keyboard, 312static size_t keyboard_keysyms_raw(struct sway_keyboard *keyboard,
315 xkb_keycode_t keycode, const xkb_keysym_t **keysyms, 313 xkb_keycode_t keycode, const xkb_keysym_t **keysyms,
316 uint32_t *modifiers) { 314 uint32_t *modifiers) {
317 struct wlr_input_device *device = 315 *modifiers = wlr_keyboard_get_modifiers(keyboard->wlr);
318 keyboard->seat_device->input_device->wlr_device;
319 *modifiers = wlr_keyboard_get_modifiers(device->keyboard);
320 316
321 xkb_layout_index_t layout_index = xkb_state_key_get_layout( 317 xkb_layout_index_t layout_index = xkb_state_key_get_layout(
322 device->keyboard->xkb_state, keycode); 318 keyboard->wlr->xkb_state, keycode);
323 return xkb_keymap_key_get_syms_by_level(device->keyboard->keymap, 319 return xkb_keymap_key_get_syms_by_level(keyboard->wlr->keymap,
324 keycode, layout_index, 0, keysyms); 320 keycode, layout_index, 0, keysyms);
325} 321}
326 322
@@ -360,8 +356,7 @@ static void update_keyboard_state(struct sway_keyboard *keyboard,
360 keyinfo->keycode, &keyinfo->translated_keysyms, 356 keyinfo->keycode, &keyinfo->translated_keysyms,
361 &keyinfo->translated_modifiers); 357 &keyinfo->translated_modifiers);
362 358
363 keyinfo->code_modifiers = wlr_keyboard_get_modifiers( 359 keyinfo->code_modifiers = wlr_keyboard_get_modifiers(keyboard->wlr);
364 keyboard->seat_device->input_device->wlr_device->keyboard);
365 360
366 // Update shortcut model keyinfo 361 // Update shortcut model keyinfo
367 update_shortcut_state(&keyboard->state_keycodes, raw_keycode, keystate, 362 update_shortcut_state(&keyboard->state_keycodes, raw_keycode, keystate,
@@ -407,7 +402,7 @@ static void handle_key_event(struct sway_keyboard *keyboard,
407 struct wlr_input_device *wlr_device = 402 struct wlr_input_device *wlr_device =
408 keyboard->seat_device->input_device->wlr_device; 403 keyboard->seat_device->input_device->wlr_device;
409 char *device_identifier = input_device_get_identifier(wlr_device); 404 char *device_identifier = input_device_get_identifier(wlr_device);
410 bool exact_identifier = wlr_device->keyboard->group != NULL; 405 bool exact_identifier = keyboard->wlr->group != NULL;
411 seat_idle_notify_activity(seat, IDLE_SOURCE_KEYBOARD); 406 seat_idle_notify_activity(seat, IDLE_SOURCE_KEYBOARD);
412 bool input_inhibited = seat->exclusive_client != NULL || 407 bool input_inhibited = seat->exclusive_client != NULL ||
413 server.session_lock.locked; 408 server.session_lock.locked;
@@ -478,10 +473,10 @@ static void handle_key_event(struct sway_keyboard *keyboard,
478 // Set up (or clear) keyboard repeat for a pressed binding. Since the 473 // Set up (or clear) keyboard repeat for a pressed binding. Since the
479 // binding may remove the keyboard, the timer needs to be updated first 474 // binding may remove the keyboard, the timer needs to be updated first
480 if (binding && !(binding->flags & BINDING_NOREPEAT) && 475 if (binding && !(binding->flags & BINDING_NOREPEAT) &&
481 wlr_device->keyboard->repeat_info.delay > 0) { 476 keyboard->wlr->repeat_info.delay > 0) {
482 keyboard->repeat_binding = binding; 477 keyboard->repeat_binding = binding;
483 if (wl_event_source_timer_update(keyboard->key_repeat_source, 478 if (wl_event_source_timer_update(keyboard->key_repeat_source,
484 wlr_device->keyboard->repeat_info.delay) < 0) { 479 keyboard->wlr->repeat_info.delay) < 0) {
485 sway_log(SWAY_DEBUG, "failed to set key repeat timer"); 480 sway_log(SWAY_DEBUG, "failed to set key repeat timer");
486 } 481 }
487 } else if (keyboard->repeat_binding) { 482 } else if (keyboard->repeat_binding) {
@@ -493,7 +488,7 @@ static void handle_key_event(struct sway_keyboard *keyboard,
493 handled = true; 488 handled = true;
494 } 489 }
495 490
496 if (!handled && wlr_device->keyboard->group) { 491 if (!handled && keyboard->wlr->group) {
497 // Only handle device specific bindings for keyboards in a group 492 // Only handle device specific bindings for keyboards in a group
498 free(device_identifier); 493 free(device_identifier);
499 return; 494 return;
@@ -518,7 +513,7 @@ static void handle_key_event(struct sway_keyboard *keyboard,
518 &keyboard->state_pressed_sent, event->keycode, 513 &keyboard->state_pressed_sent, event->keycode,
519 event->state, keyinfo.keycode, 0); 514 event->state, keyinfo.keycode, 0);
520 if (pressed_sent) { 515 if (pressed_sent) {
521 wlr_seat_set_keyboard(wlr_seat, wlr_device->keyboard); 516 wlr_seat_set_keyboard(wlr_seat, keyboard->wlr);
522 wlr_seat_keyboard_notify_key(wlr_seat, event->time_msec, 517 wlr_seat_keyboard_notify_key(wlr_seat, event->time_msec,
523 event->keycode, event->state); 518 event->keycode, event->state);
524 handled = true; 519 handled = true;
@@ -529,8 +524,7 @@ static void handle_key_event(struct sway_keyboard *keyboard,
529 struct wlr_input_method_keyboard_grab_v2 *kb_grab = keyboard_get_im_grab(keyboard); 524 struct wlr_input_method_keyboard_grab_v2 *kb_grab = keyboard_get_im_grab(keyboard);
530 525
531 if (kb_grab) { 526 if (kb_grab) {
532 wlr_input_method_keyboard_grab_v2_set_keyboard(kb_grab, 527 wlr_input_method_keyboard_grab_v2_set_keyboard(kb_grab, keyboard->wlr);
533 wlr_device->keyboard);
534 wlr_input_method_keyboard_grab_v2_send_key(kb_grab, 528 wlr_input_method_keyboard_grab_v2_send_key(kb_grab,
535 event->time_msec, event->keycode, event->state); 529 event->time_msec, event->keycode, event->state);
536 handled = true; 530 handled = true;
@@ -543,7 +537,7 @@ static void handle_key_event(struct sway_keyboard *keyboard,
543 update_shortcut_state( 537 update_shortcut_state(
544 &keyboard->state_pressed_sent, event->keycode, event->state, 538 &keyboard->state_pressed_sent, event->keycode, event->state,
545 keyinfo.keycode, 0); 539 keyinfo.keycode, 0);
546 wlr_seat_set_keyboard(wlr_seat, wlr_device->keyboard); 540 wlr_seat_set_keyboard(wlr_seat, keyboard->wlr);
547 wlr_seat_keyboard_notify_key(wlr_seat, event->time_msec, 541 wlr_seat_keyboard_notify_key(wlr_seat, event->time_msec,
548 event->keycode, event->state); 542 event->keycode, event->state);
549 } 543 }
@@ -619,14 +613,12 @@ static void handle_keyboard_group_leave(struct wl_listener *listener,
619} 613}
620 614
621static int handle_keyboard_repeat(void *data) { 615static int handle_keyboard_repeat(void *data) {
622 struct sway_keyboard *keyboard = (struct sway_keyboard *)data; 616 struct sway_keyboard *keyboard = data;
623 struct wlr_keyboard *wlr_device =
624 keyboard->seat_device->input_device->wlr_device->keyboard;
625 if (keyboard->repeat_binding) { 617 if (keyboard->repeat_binding) {
626 if (wlr_device->repeat_info.rate > 0) { 618 if (keyboard->wlr->repeat_info.rate > 0) {
627 // We queue the next event first, as the command might cancel it 619 // We queue the next event first, as the command might cancel it
628 if (wl_event_source_timer_update(keyboard->key_repeat_source, 620 if (wl_event_source_timer_update(keyboard->key_repeat_source,
629 1000 / wlr_device->repeat_info.rate) < 0) { 621 1000 / keyboard->wlr->repeat_info.rate) < 0) {
630 sway_log(SWAY_DEBUG, "failed to update key repeat timer"); 622 sway_log(SWAY_DEBUG, "failed to update key repeat timer");
631 } 623 }
632 } 624 }
@@ -659,31 +651,28 @@ static void determine_bar_visibility(uint32_t modifiers) {
659} 651}
660 652
661static void handle_modifier_event(struct sway_keyboard *keyboard) { 653static void handle_modifier_event(struct sway_keyboard *keyboard) {
662 struct wlr_input_device *wlr_device = 654 if (!keyboard->wlr->group) {
663 keyboard->seat_device->input_device->wlr_device;
664 if (!wlr_device->keyboard->group) {
665 struct wlr_input_method_keyboard_grab_v2 *kb_grab = keyboard_get_im_grab(keyboard); 655 struct wlr_input_method_keyboard_grab_v2 *kb_grab = keyboard_get_im_grab(keyboard);
666 656
667 if (kb_grab) { 657 if (kb_grab) {
668 wlr_input_method_keyboard_grab_v2_set_keyboard(kb_grab, 658 wlr_input_method_keyboard_grab_v2_set_keyboard(kb_grab, keyboard->wlr);
669 wlr_device->keyboard);
670 wlr_input_method_keyboard_grab_v2_send_modifiers(kb_grab, 659 wlr_input_method_keyboard_grab_v2_send_modifiers(kb_grab,
671 &wlr_device->keyboard->modifiers); 660 &keyboard->wlr->modifiers);
672 } else { 661 } else {
673 struct wlr_seat *wlr_seat = keyboard->seat_device->sway_seat->wlr_seat; 662 struct wlr_seat *wlr_seat = keyboard->seat_device->sway_seat->wlr_seat;
674 wlr_seat_set_keyboard(wlr_seat, wlr_device->keyboard); 663 wlr_seat_set_keyboard(wlr_seat, keyboard->wlr);
675 wlr_seat_keyboard_notify_modifiers(wlr_seat, 664 wlr_seat_keyboard_notify_modifiers(wlr_seat,
676 &wlr_device->keyboard->modifiers); 665 &keyboard->wlr->modifiers);
677 } 666 }
678 667
679 uint32_t modifiers = wlr_keyboard_get_modifiers(wlr_device->keyboard); 668 uint32_t modifiers = wlr_keyboard_get_modifiers(keyboard->wlr);
680 determine_bar_visibility(modifiers); 669 determine_bar_visibility(modifiers);
681 } 670 }
682 671
683 if (wlr_device->keyboard->modifiers.group != keyboard->effective_layout) { 672 if (keyboard->wlr->modifiers.group != keyboard->effective_layout) {
684 keyboard->effective_layout = wlr_device->keyboard->modifiers.group; 673 keyboard->effective_layout = keyboard->wlr->modifiers.group;
685 674
686 if (!wlr_keyboard_group_from_wlr_keyboard(wlr_device->keyboard)) { 675 if (!wlr_keyboard_group_from_wlr_keyboard(keyboard->wlr)) {
687 ipc_event_input("xkb_layout", keyboard->seat_device->input_device); 676 ipc_event_input("xkb_layout", keyboard->seat_device->input_device);
688 } 677 }
689 } 678 }
@@ -712,6 +701,7 @@ struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat,
712 } 701 }
713 702
714 keyboard->seat_device = device; 703 keyboard->seat_device = device;
704 keyboard->wlr = wlr_keyboard_from_input_device(device->input_device->wlr_device);
715 device->keyboard = keyboard; 705 device->keyboard = keyboard;
716 706
717 wl_list_init(&keyboard->keyboard_key.link); 707 wl_list_init(&keyboard->keyboard_key.link);
@@ -820,13 +810,12 @@ static void destroy_empty_wlr_keyboard_group(void *data) {
820 810
821static void sway_keyboard_group_remove(struct sway_keyboard *keyboard) { 811static void sway_keyboard_group_remove(struct sway_keyboard *keyboard) {
822 struct sway_input_device *device = keyboard->seat_device->input_device; 812 struct sway_input_device *device = keyboard->seat_device->input_device;
823 struct wlr_keyboard *wlr_keyboard = device->wlr_device->keyboard; 813 struct wlr_keyboard_group *wlr_group = keyboard->wlr->group;
824 struct wlr_keyboard_group *wlr_group = wlr_keyboard->group;
825 814
826 sway_log(SWAY_DEBUG, "Removing keyboard %s from group %p", 815 sway_log(SWAY_DEBUG, "Removing keyboard %s from group %p",
827 device->identifier, wlr_group); 816 device->identifier, wlr_group);
828 817
829 wlr_keyboard_group_remove_keyboard(wlr_keyboard->group, wlr_keyboard); 818 wlr_keyboard_group_remove_keyboard(keyboard->wlr->group, keyboard->wlr);
830 819
831 if (wl_list_empty(&wlr_group->devices)) { 820 if (wl_list_empty(&wlr_group->devices)) {
832 sway_log(SWAY_DEBUG, "Destroying empty keyboard group %p", 821 sway_log(SWAY_DEBUG, "Destroying empty keyboard group %p",
@@ -851,9 +840,7 @@ static void sway_keyboard_group_remove(struct sway_keyboard *keyboard) {
851} 840}
852 841
853static void sway_keyboard_group_remove_invalid(struct sway_keyboard *keyboard) { 842static void sway_keyboard_group_remove_invalid(struct sway_keyboard *keyboard) {
854 struct sway_input_device *device = keyboard->seat_device->input_device; 843 if (!keyboard->wlr->group) {
855 struct wlr_keyboard *wlr_keyboard = device->wlr_device->keyboard;
856 if (!wlr_keyboard->group) {
857 return; 844 return;
858 } 845 }
859 846
@@ -869,7 +856,7 @@ static void sway_keyboard_group_remove_invalid(struct sway_keyboard *keyboard) {
869 break; 856 break;
870 case KEYBOARD_GROUP_DEFAULT: /* fallthrough */ 857 case KEYBOARD_GROUP_DEFAULT: /* fallthrough */
871 case KEYBOARD_GROUP_SMART:; 858 case KEYBOARD_GROUP_SMART:;
872 struct wlr_keyboard_group *group = wlr_keyboard->group; 859 struct wlr_keyboard_group *group = keyboard->wlr->group;
873 if (!wlr_keyboard_keymaps_match(keyboard->keymap, group->keyboard.keymap) || 860 if (!wlr_keyboard_keymaps_match(keyboard->keymap, group->keyboard.keymap) ||
874 !repeat_info_match(keyboard, &group->keyboard)) { 861 !repeat_info_match(keyboard, &group->keyboard)) {
875 sway_keyboard_group_remove(keyboard); 862 sway_keyboard_group_remove(keyboard);
@@ -880,7 +867,6 @@ static void sway_keyboard_group_remove_invalid(struct sway_keyboard *keyboard) {
880 867
881static void sway_keyboard_group_add(struct sway_keyboard *keyboard) { 868static void sway_keyboard_group_add(struct sway_keyboard *keyboard) {
882 struct sway_input_device *device = keyboard->seat_device->input_device; 869 struct sway_input_device *device = keyboard->seat_device->input_device;
883 struct wlr_keyboard *wlr_keyboard = device->wlr_device->keyboard;
884 struct sway_seat *seat = keyboard->seat_device->sway_seat; 870 struct sway_seat *seat = keyboard->seat_device->sway_seat;
885 struct seat_config *sc = seat_get_config(seat); 871 struct seat_config *sc = seat_get_config(seat);
886 872
@@ -912,7 +898,7 @@ static void sway_keyboard_group_add(struct sway_keyboard *keyboard) {
912 repeat_info_match(keyboard, &wlr_group->keyboard)) { 898 repeat_info_match(keyboard, &wlr_group->keyboard)) {
913 sway_log(SWAY_DEBUG, "Adding keyboard %s to group %p", 899 sway_log(SWAY_DEBUG, "Adding keyboard %s to group %p",
914 device->identifier, wlr_group); 900 device->identifier, wlr_group);
915 wlr_keyboard_group_add_keyboard(wlr_group, wlr_keyboard); 901 wlr_keyboard_group_add_keyboard(wlr_group, keyboard->wlr);
916 return; 902 return;
917 } 903 }
918 break; 904 break;
@@ -960,7 +946,7 @@ static void sway_keyboard_group_add(struct sway_keyboard *keyboard) {
960 946
961 sway_log(SWAY_DEBUG, "Adding keyboard %s to group %p", 947 sway_log(SWAY_DEBUG, "Adding keyboard %s to group %p",
962 device->identifier, sway_group->wlr_group); 948 device->identifier, sway_group->wlr_group);
963 wlr_keyboard_group_add_keyboard(sway_group->wlr_group, wlr_keyboard); 949 wlr_keyboard_group_add_keyboard(sway_group->wlr_group, keyboard->wlr);
964 950
965 wl_list_insert(&seat->keyboard_groups, &sway_group->link); 951 wl_list_insert(&seat->keyboard_groups, &sway_group->link);
966 952
@@ -992,10 +978,8 @@ cleanup:
992void sway_keyboard_configure(struct sway_keyboard *keyboard) { 978void sway_keyboard_configure(struct sway_keyboard *keyboard) {
993 struct input_config *input_config = 979 struct input_config *input_config =
994 input_device_get_config(keyboard->seat_device->input_device); 980 input_device_get_config(keyboard->seat_device->input_device);
995 struct wlr_input_device *wlr_device =
996 keyboard->seat_device->input_device->wlr_device;
997 981
998 if (!sway_assert(!wlr_keyboard_group_from_wlr_keyboard(wlr_device->keyboard), 982 if (!sway_assert(!wlr_keyboard_group_from_wlr_keyboard(keyboard->wlr),
999 "sway_keyboard_configure should not be called with a " 983 "sway_keyboard_configure should not be called with a "
1000 "keyboard group's keyboard")) { 984 "keyboard group's keyboard")) {
1001 return; 985 return;
@@ -1037,11 +1021,11 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) {
1037 1021
1038 sway_keyboard_group_remove_invalid(keyboard); 1022 sway_keyboard_group_remove_invalid(keyboard);
1039 1023
1040 wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap); 1024 wlr_keyboard_set_keymap(keyboard->wlr, keyboard->keymap);
1041 wlr_keyboard_set_repeat_info(wlr_device->keyboard, 1025 wlr_keyboard_set_repeat_info(keyboard->wlr,
1042 keyboard->repeat_rate, keyboard->repeat_delay); 1026 keyboard->repeat_rate, keyboard->repeat_delay);
1043 1027
1044 if (!wlr_device->keyboard->group) { 1028 if (!keyboard->wlr->group) {
1045 sway_keyboard_group_add(keyboard); 1029 sway_keyboard_group_add(keyboard);
1046 } 1030 }
1047 1031
@@ -1061,40 +1045,38 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) {
1061 } 1045 }
1062 } 1046 }
1063 if (locked_mods) { 1047 if (locked_mods) {
1064 wlr_keyboard_notify_modifiers(wlr_device->keyboard, 0, 0, 1048 wlr_keyboard_notify_modifiers(keyboard->wlr, 0, 0,
1065 locked_mods, 0); 1049 locked_mods, 0);
1066 uint32_t leds = 0; 1050 uint32_t leds = 0;
1067 for (uint32_t i = 0; i < WLR_LED_COUNT; ++i) { 1051 for (uint32_t i = 0; i < WLR_LED_COUNT; ++i) {
1068 if (xkb_state_led_index_is_active( 1052 if (xkb_state_led_index_is_active(keyboard->wlr->xkb_state,
1069 wlr_device->keyboard->xkb_state, 1053 keyboard->wlr->led_indexes[i])) {
1070 wlr_device->keyboard->led_indexes[i])) {
1071 leds |= (1 << i); 1054 leds |= (1 << i);
1072 } 1055 }
1073 } 1056 }
1074 if (wlr_device->keyboard->group) { 1057 if (keyboard->wlr->group) {
1075 wlr_keyboard_led_update( 1058 wlr_keyboard_led_update(&keyboard->wlr->group->keyboard, leds);
1076 &wlr_device->keyboard->group->keyboard, leds);
1077 } else { 1059 } else {
1078 wlr_keyboard_led_update(wlr_device->keyboard, leds); 1060 wlr_keyboard_led_update(keyboard->wlr, leds);
1079 } 1061 }
1080 } 1062 }
1081 } else { 1063 } else {
1082 xkb_keymap_unref(keymap); 1064 xkb_keymap_unref(keymap);
1083 sway_keyboard_group_remove_invalid(keyboard); 1065 sway_keyboard_group_remove_invalid(keyboard);
1084 if (!wlr_device->keyboard->group) { 1066 if (!keyboard->wlr->group) {
1085 sway_keyboard_group_add(keyboard); 1067 sway_keyboard_group_add(keyboard);
1086 } 1068 }
1087 } 1069 }
1088 1070
1089 struct wlr_seat *seat = keyboard->seat_device->sway_seat->wlr_seat; 1071 struct wlr_seat *seat = keyboard->seat_device->sway_seat->wlr_seat;
1090 wlr_seat_set_keyboard(seat, wlr_device->keyboard); 1072 wlr_seat_set_keyboard(seat, keyboard->wlr);
1091 1073
1092 wl_list_remove(&keyboard->keyboard_key.link); 1074 wl_list_remove(&keyboard->keyboard_key.link);
1093 wl_signal_add(&wlr_device->keyboard->events.key, &keyboard->keyboard_key); 1075 wl_signal_add(&keyboard->wlr->events.key, &keyboard->keyboard_key);
1094 keyboard->keyboard_key.notify = handle_keyboard_key; 1076 keyboard->keyboard_key.notify = handle_keyboard_key;
1095 1077
1096 wl_list_remove(&keyboard->keyboard_modifiers.link); 1078 wl_list_remove(&keyboard->keyboard_modifiers.link);
1097 wl_signal_add(&wlr_device->keyboard->events.modifiers, 1079 wl_signal_add(&keyboard->wlr->events.modifiers,
1098 &keyboard->keyboard_modifiers); 1080 &keyboard->keyboard_modifiers);
1099 keyboard->keyboard_modifiers.notify = handle_keyboard_modifiers; 1081 keyboard->keyboard_modifiers.notify = handle_keyboard_modifiers;
1100 1082
@@ -1111,12 +1093,11 @@ void sway_keyboard_destroy(struct sway_keyboard *keyboard) {
1111 if (!keyboard) { 1093 if (!keyboard) {
1112 return; 1094 return;
1113 } 1095 }
1114 if (keyboard->seat_device->input_device->wlr_device->keyboard->group) { 1096 if (keyboard->wlr->group) {
1115 sway_keyboard_group_remove(keyboard); 1097 sway_keyboard_group_remove(keyboard);
1116 } 1098 }
1117 struct wlr_seat *wlr_seat = keyboard->seat_device->sway_seat->wlr_seat; 1099 struct wlr_seat *wlr_seat = keyboard->seat_device->sway_seat->wlr_seat;
1118 struct sway_input_device *device = keyboard->seat_device->input_device; 1100 if (wlr_seat_get_keyboard(wlr_seat) == keyboard->wlr) {
1119 if (wlr_seat_get_keyboard(wlr_seat) == device->wlr_device->keyboard) {
1120 wlr_seat_set_keyboard(wlr_seat, NULL); 1101 wlr_seat_set_keyboard(wlr_seat, NULL);
1121 } 1102 }
1122 if (keyboard->keymap) { 1103 if (keyboard->keymap) {