Skip to content

Commit 8fda423

Browse files
committed
wayland: Optimize the legacy key level fallback function
When iterating over the keymap entries, a valid xkb state object has already been allocated, so use that instead of allocating/destroying a new state object for every lookup, which avoids a calloc/free operation inside libxkbcommon. Any state set by the level lookup function will be overwritten with valid state after keymap iteration has completed.
1 parent 2c02e6f commit 8fda423

File tree

1 file changed

+25
-29
lines changed

1 file changed

+25
-29
lines changed

src/video/wayland/SDL_waylandevents.c

Lines changed: 25 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1429,38 +1429,34 @@ static size_t xkb_legacy_get_mods_for_level(SDL_WaylandSeat *seat, xkb_keycode_t
14291429
}
14301430

14311431
size_t mask_idx = 0;
1432-
struct xkb_state *state = WAYLAND_xkb_state_new(seat->keyboard.xkb.keymap);
1433-
if (state) {
1434-
const xkb_mod_mask_t keymod_masks[] = {
1435-
0,
1436-
seat->keyboard.xkb.shift_mask,
1437-
seat->keyboard.xkb.caps_mask,
1438-
seat->keyboard.xkb.shift_mask | seat->keyboard.xkb.caps_mask,
1439-
seat->keyboard.xkb.level3_mask,
1440-
seat->keyboard.xkb.level3_mask | seat->keyboard.xkb.shift_mask,
1441-
seat->keyboard.xkb.level3_mask | seat->keyboard.xkb.caps_mask,
1442-
seat->keyboard.xkb.level3_mask | seat->keyboard.xkb.shift_mask | seat->keyboard.xkb.caps_mask,
1443-
seat->keyboard.xkb.level5_mask,
1444-
seat->keyboard.xkb.level5_mask | seat->keyboard.xkb.shift_mask,
1445-
seat->keyboard.xkb.level5_mask | seat->keyboard.xkb.caps_mask,
1446-
seat->keyboard.xkb.level5_mask | seat->keyboard.xkb.shift_mask | seat->keyboard.xkb.caps_mask
1447-
};
1448-
const xkb_mod_mask_t pressed_mod_mask = seat->keyboard.xkb.shift_mask | seat->keyboard.xkb.level3_mask | seat->keyboard.xkb.level5_mask;
1449-
const xkb_mod_mask_t locked_mod_mask = seat->keyboard.xkb.caps_mask;
1450-
1451-
for (size_t i = 0; i < SDL_arraysize(keymod_masks); ++i) {
1452-
WAYLAND_xkb_state_update_mask(state, keymod_masks[i] & pressed_mod_mask, 0, keymod_masks[i] & locked_mod_mask, 0, 0, layout);
1453-
if (WAYLAND_xkb_state_key_get_level(state, key, layout) == level) {
1454-
masks_out[mask_idx] = keymod_masks[i];
1455-
1456-
if (++mask_idx == masks_size) {
1457-
break;
1458-
}
1432+
const xkb_mod_mask_t keymod_masks[] = {
1433+
0,
1434+
seat->keyboard.xkb.shift_mask,
1435+
seat->keyboard.xkb.caps_mask,
1436+
seat->keyboard.xkb.shift_mask | seat->keyboard.xkb.caps_mask,
1437+
seat->keyboard.xkb.level3_mask,
1438+
seat->keyboard.xkb.level3_mask | seat->keyboard.xkb.shift_mask,
1439+
seat->keyboard.xkb.level3_mask | seat->keyboard.xkb.caps_mask,
1440+
seat->keyboard.xkb.level3_mask | seat->keyboard.xkb.shift_mask | seat->keyboard.xkb.caps_mask,
1441+
seat->keyboard.xkb.level5_mask,
1442+
seat->keyboard.xkb.level5_mask | seat->keyboard.xkb.shift_mask,
1443+
seat->keyboard.xkb.level5_mask | seat->keyboard.xkb.caps_mask,
1444+
seat->keyboard.xkb.level5_mask | seat->keyboard.xkb.shift_mask | seat->keyboard.xkb.caps_mask
1445+
};
1446+
const xkb_mod_mask_t pressed_mod_mask = seat->keyboard.xkb.shift_mask | seat->keyboard.xkb.level3_mask | seat->keyboard.xkb.level5_mask;
1447+
const xkb_mod_mask_t locked_mod_mask = seat->keyboard.xkb.caps_mask;
1448+
1449+
for (size_t i = 0; i < SDL_arraysize(keymod_masks); ++i) {
1450+
WAYLAND_xkb_state_update_mask(seat->keyboard.xkb.state, keymod_masks[i] & pressed_mod_mask, 0, keymod_masks[i] & locked_mod_mask, 0, 0, layout);
1451+
if (WAYLAND_xkb_state_key_get_level(seat->keyboard.xkb.state, key, layout) == level) {
1452+
masks_out[mask_idx] = keymod_masks[i];
1453+
1454+
if (++mask_idx == masks_size) {
1455+
break;
14591456
}
14601457
}
1461-
1462-
WAYLAND_xkb_state_unref(state);
14631458
}
1459+
14641460
return mask_idx;
14651461
}
14661462
#endif

0 commit comments

Comments
 (0)