input/keyboard: use wlr_keyboard_keymaps_match from wlroots

Added in swaywm/wlroots#2172, so that sway doesn't need to maintain
an independent copy of this function.
This commit is contained in:
Tudor Brindus 2020-05-08 13:21:15 -04:00 committed by Brian Ashworth
parent 9cda5a5bd6
commit 7c37e9d01e

View file

@ -5,6 +5,7 @@
#include <wlr/backend/session.h> #include <wlr/backend/session.h>
#include <wlr/interfaces/wlr_keyboard.h> #include <wlr/interfaces/wlr_keyboard.h>
#include <wlr/types/wlr_idle.h> #include <wlr/types/wlr_idle.h>
#include <wlr/types/wlr_keyboard.h>
#include <wlr/types/wlr_keyboard_group.h> #include <wlr/types/wlr_keyboard_group.h>
#include <xkbcommon/xkbcommon-names.h> #include <xkbcommon/xkbcommon-names.h>
#include "sway/commands.h" #include "sway/commands.h"
@ -674,15 +675,6 @@ cleanup:
return keymap; return keymap;
} }
static bool keymaps_match(struct xkb_keymap *km1, struct xkb_keymap *km2) {
char *km1_str = xkb_keymap_get_as_string(km1, XKB_KEYMAP_FORMAT_TEXT_V1);
char *km2_str = xkb_keymap_get_as_string(km2, XKB_KEYMAP_FORMAT_TEXT_V1);
bool result = strcmp(km1_str, km2_str) == 0;
free(km1_str);
free(km2_str);
return result;
}
static bool repeat_info_match(struct sway_keyboard *a, struct wlr_keyboard *b) { static bool repeat_info_match(struct sway_keyboard *a, struct wlr_keyboard *b) {
return a->repeat_rate == b->repeat_info.rate && return a->repeat_rate == b->repeat_info.rate &&
a->repeat_delay == b->repeat_info.delay; a->repeat_delay == b->repeat_info.delay;
@ -742,7 +734,7 @@ static void sway_keyboard_group_remove_invalid(struct sway_keyboard *keyboard) {
case KEYBOARD_GROUP_DEFAULT: /* fallthrough */ case KEYBOARD_GROUP_DEFAULT: /* fallthrough */
case KEYBOARD_GROUP_SMART:; case KEYBOARD_GROUP_SMART:;
struct wlr_keyboard_group *group = wlr_keyboard->group; struct wlr_keyboard_group *group = wlr_keyboard->group;
if (!keymaps_match(keyboard->keymap, group->keyboard.keymap) || if (!wlr_keyboard_keymaps_match(keyboard->keymap, group->keyboard.keymap) ||
!repeat_info_match(keyboard, &group->keyboard)) { !repeat_info_match(keyboard, &group->keyboard)) {
sway_keyboard_group_remove(keyboard); sway_keyboard_group_remove(keyboard);
} }
@ -779,7 +771,8 @@ static void sway_keyboard_group_add(struct sway_keyboard *keyboard) {
case KEYBOARD_GROUP_DEFAULT: /* fallthrough */ case KEYBOARD_GROUP_DEFAULT: /* fallthrough */
case KEYBOARD_GROUP_SMART:; case KEYBOARD_GROUP_SMART:;
struct wlr_keyboard_group *wlr_group = group->wlr_group; struct wlr_keyboard_group *wlr_group = group->wlr_group;
if (keymaps_match(keyboard->keymap, wlr_group->keyboard.keymap) && if (wlr_keyboard_keymaps_match(keyboard->keymap,
wlr_group->keyboard.keymap) &&
repeat_info_match(keyboard, &wlr_group->keyboard)) { repeat_info_match(keyboard, &wlr_group->keyboard)) {
sway_log(SWAY_DEBUG, "Adding keyboard %s to group %p", sway_log(SWAY_DEBUG, "Adding keyboard %s to group %p",
device->identifier, wlr_group); device->identifier, wlr_group);
@ -871,8 +864,8 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) {
} }
} }
bool keymap_changed = bool keymap_changed = keyboard->keymap ?
keyboard->keymap ? !keymaps_match(keyboard->keymap, keymap) : true; !wlr_keyboard_keymaps_match(keyboard->keymap, keymap) : true;
bool effective_layout_changed = keyboard->effective_layout != 0; bool effective_layout_changed = keyboard->effective_layout != 0;
int repeat_rate = 25; int repeat_rate = 25;
@ -909,14 +902,14 @@ void sway_keyboard_configure(struct sway_keyboard *keyboard) {
xkb_mod_index_t mod_index = xkb_map_mod_get_index(keymap, xkb_mod_index_t mod_index = xkb_map_mod_get_index(keymap,
XKB_MOD_NAME_NUM); XKB_MOD_NAME_NUM);
if (mod_index != XKB_MOD_INVALID) { if (mod_index != XKB_MOD_INVALID) {
locked_mods |= (uint32_t)1 << mod_index; locked_mods |= (uint32_t)1 << mod_index;
} }
} }
if (input_config && input_config->xkb_capslock > 0) { if (input_config && input_config->xkb_capslock > 0) {
xkb_mod_index_t mod_index = xkb_map_mod_get_index(keymap, xkb_mod_index_t mod_index = xkb_map_mod_get_index(keymap,
XKB_MOD_NAME_CAPS); XKB_MOD_NAME_CAPS);
if (mod_index != XKB_MOD_INVALID) { if (mod_index != XKB_MOD_INVALID) {
locked_mods |= (uint32_t)1 << mod_index; locked_mods |= (uint32_t)1 << mod_index;
} }
} }
if (locked_mods) { if (locked_mods) {