input/keyboard: expose keymap matching helper

sway needs this logic too, and currently ships a version that has fallen
behind in terms of bugfixes (b1a63bc).
master
Tudor Brindus 5 years ago committed by Brian Ashworth
parent 6357e166f9
commit 064f64dbf7

@ -105,6 +105,9 @@ struct wlr_event_keyboard_key {
bool wlr_keyboard_set_keymap(struct wlr_keyboard *kb, bool wlr_keyboard_set_keymap(struct wlr_keyboard *kb,
struct xkb_keymap *keymap); struct xkb_keymap *keymap);
bool wlr_keyboard_keymaps_match(struct xkb_keymap *km1, struct xkb_keymap *km2);
/** /**
* Sets the keyboard repeat info. `rate` is in key repeats/second and delay is * Sets the keyboard repeat info. `rate` is in key repeats/second and delay is
* in milliseconds. * in milliseconds.

@ -232,3 +232,19 @@ uint32_t wlr_keyboard_get_modifiers(struct wlr_keyboard *kb) {
} }
return modifiers; return modifiers;
} }
bool wlr_keyboard_keymaps_match(struct xkb_keymap *km1,
struct xkb_keymap *km2) {
if (!km1 && !km2) {
return true;
}
if (!km1 || !km2) {
return false;
}
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;
}

@ -81,21 +81,6 @@ struct wlr_keyboard_group *wlr_keyboard_group_from_wlr_keyboard(
return (struct wlr_keyboard_group *)keyboard; return (struct wlr_keyboard_group *)keyboard;
} }
static bool keymaps_match(struct xkb_keymap *km1, struct xkb_keymap *km2) {
if (!km1 && !km2) {
return true;
}
if (!km1 || !km2) {
return false;
}
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 void handle_keyboard_key(struct wl_listener *listener, void *data) { static void handle_keyboard_key(struct wl_listener *listener, void *data) {
struct keyboard_group_device *group_device = struct keyboard_group_device *group_device =
wl_container_of(listener, group_device, key); wl_container_of(listener, group_device, key);
@ -166,10 +151,12 @@ static void handle_keyboard_keymap(struct wl_listener *listener, void *data) {
wl_container_of(listener, group_device, keymap); wl_container_of(listener, group_device, keymap);
struct wlr_keyboard *keyboard = group_device->keyboard; struct wlr_keyboard *keyboard = group_device->keyboard;
if (!keymaps_match(keyboard->group->keyboard.keymap, keyboard->keymap)) { if (!wlr_keyboard_keymaps_match(keyboard->group->keyboard.keymap,
keyboard->keymap)) {
struct keyboard_group_device *device; struct keyboard_group_device *device;
wl_list_for_each(device, &keyboard->group->devices, link) { wl_list_for_each(device, &keyboard->group->devices, link) {
if (!keymaps_match(keyboard->keymap, device->keyboard->keymap)) { if (!wlr_keyboard_keymaps_match(keyboard->keymap,
device->keyboard->keymap)) {
wlr_keyboard_set_keymap(device->keyboard, keyboard->keymap); wlr_keyboard_set_keymap(device->keyboard, keyboard->keymap);
return; return;
} }
@ -245,7 +232,7 @@ bool wlr_keyboard_group_add_keyboard(struct wlr_keyboard_group *group,
return false; return false;
} }
if (!keymaps_match(group->keyboard.keymap, keyboard->keymap)) { if (!wlr_keyboard_keymaps_match(group->keyboard.keymap, keyboard->keymap)) {
wlr_log(WLR_ERROR, "Device keymap does not match keyboard group's"); wlr_log(WLR_ERROR, "Device keymap does not match keyboard group's");
return false; return false;
} }

Loading…
Cancel
Save