diff options
author | Brian Ashworth <bosrsf04@gmail.com> | 2019-07-17 17:12:20 -0400 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2019-07-23 20:45:46 +0300 |
commit | 6effca7b61e87c7d17885d007d94e556a0137651 (patch) | |
tree | 686cc1e219d8236f8c9864c9992b3cb6b44c9583 /sway/input/keyboard.c | |
parent | input_cmd_xkb_switch_layout: support input types (diff) | |
download | sway-6effca7b61e87c7d17885d007d94e556a0137651.tar.gz sway-6effca7b61e87c7d17885d007d94e556a0137651.tar.zst sway-6effca7b61e87c7d17885d007d94e556a0137651.zip |
ipc: add an input event
This adds an ipc event related to input devices. Currently the
following changes are supported:
- added: when an input device becomes available
- removed: when an input device is no longer available
- xkb_keymap_changed: (keyboards only) the keymap changed
- xkb_layout_changed: (keyboards only) the effective layout changed
Diffstat (limited to 'sway/input/keyboard.c')
-rw-r--r-- | sway/input/keyboard.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/sway/input/keyboard.c b/sway/input/keyboard.c index 1f7ed849..328458fa 100644 --- a/sway/input/keyboard.c +++ b/sway/input/keyboard.c | |||
@@ -473,6 +473,11 @@ static void handle_keyboard_modifiers(struct wl_listener *listener, | |||
473 | 473 | ||
474 | uint32_t modifiers = wlr_keyboard_get_modifiers(wlr_device->keyboard); | 474 | uint32_t modifiers = wlr_keyboard_get_modifiers(wlr_device->keyboard); |
475 | determine_bar_visibility(modifiers); | 475 | determine_bar_visibility(modifiers); |
476 | |||
477 | if (wlr_device->keyboard->modifiers.group != keyboard->effective_layout) { | ||
478 | keyboard->effective_layout = wlr_device->keyboard->modifiers.group; | ||
479 | ipc_event_input("xkb_layout", keyboard->seat_device->input_device); | ||
480 | } | ||
476 | } | 481 | } |
477 | 482 | ||
478 | struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat, | 483 | struct sway_keyboard *sway_keyboard_create(struct sway_seat *seat, |
@@ -603,8 +608,23 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) { | |||
603 | } | 608 | } |
604 | } | 609 | } |
605 | 610 | ||
611 | bool keymap_changed = false; | ||
612 | bool effective_layout_changed = keyboard->effective_layout != 0; | ||
613 | if (keyboard->keymap) { | ||
614 | char *old_keymap_string = xkb_keymap_get_as_string(keyboard->keymap, | ||
615 | XKB_KEYMAP_FORMAT_TEXT_V1); | ||
616 | char *new_keymap_string = xkb_keymap_get_as_string(keymap, | ||
617 | XKB_KEYMAP_FORMAT_TEXT_V1); | ||
618 | keymap_changed = strcmp(old_keymap_string, new_keymap_string); | ||
619 | free(old_keymap_string); | ||
620 | free(new_keymap_string); | ||
621 | } else { | ||
622 | keymap_changed = true; | ||
623 | } | ||
624 | |||
606 | xkb_keymap_unref(keyboard->keymap); | 625 | xkb_keymap_unref(keyboard->keymap); |
607 | keyboard->keymap = keymap; | 626 | keyboard->keymap = keymap; |
627 | keyboard->effective_layout = 0; | ||
608 | wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap); | 628 | wlr_keyboard_set_keymap(wlr_device->keyboard, keyboard->keymap); |
609 | 629 | ||
610 | xkb_mod_mask_t locked_mods = 0; | 630 | xkb_mod_mask_t locked_mods = 0; |
@@ -654,6 +674,14 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) { | |||
654 | wl_signal_add(&wlr_device->keyboard->events.modifiers, | 674 | wl_signal_add(&wlr_device->keyboard->events.modifiers, |
655 | &keyboard->keyboard_modifiers); | 675 | &keyboard->keyboard_modifiers); |
656 | keyboard->keyboard_modifiers.notify = handle_keyboard_modifiers; | 676 | keyboard->keyboard_modifiers.notify = handle_keyboard_modifiers; |
677 | |||
678 | if (keymap_changed) { | ||
679 | ipc_event_input("xkb_keymap", | ||
680 | keyboard->seat_device->input_device); | ||
681 | } else if (effective_layout_changed) { | ||
682 | ipc_event_input("xkb_layout", | ||
683 | keyboard->seat_device->input_device); | ||
684 | } | ||
657 | } | 685 | } |
658 | 686 | ||
659 | void sway_keyboard_destroy(struct sway_keyboard *keyboard) { | 687 | void sway_keyboard_destroy(struct sway_keyboard *keyboard) { |