Skip to content

Commit 662ce93

Browse files
committed
state: Avoid keycode lookup when key ref is available
1 parent 7cd1180 commit 662ce93

File tree

4 files changed

+33
-26
lines changed

4 files changed

+33
-26
lines changed

src/keymap-priv.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -259,12 +259,11 @@ XkbWrapGroupIntoRange(int32_t group,
259259

260260
unsigned int
261261
xkb_keymap_key_get_actions_by_level(struct xkb_keymap *keymap,
262-
xkb_keycode_t kc,
262+
const struct xkb_key *key,
263263
xkb_layout_index_t layout,
264264
xkb_level_index_t level,
265265
const union xkb_action **actions)
266266
{
267-
const struct xkb_key *key = XkbKey(keymap, kc);
268267
if (!key)
269268
goto err;
270269

src/keymap.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,7 @@ xkb_keymap_key_get_level(struct xkb_keymap *keymap, const struct xkb_key *key,
585585

586586
unsigned int
587587
xkb_keymap_key_get_actions_by_level(struct xkb_keymap *keymap,
588-
xkb_keycode_t kc,
588+
const struct xkb_key *key,
589589
xkb_layout_index_t layout,
590590
xkb_level_index_t level,
591591
const union xkb_action **actions);

src/state.c

+30-22
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,20 @@ get_entry_for_key_state(struct xkb_state *state, const struct xkb_key *key,
101101
return get_entry_for_mods(type, active_mods);
102102
}
103103

104+
static inline xkb_level_index_t
105+
state_key_get_level(struct xkb_state *state, const struct xkb_key *key,
106+
xkb_layout_index_t layout)
107+
{
108+
if (layout >= key->num_groups)
109+
return XKB_LEVEL_INVALID;
110+
111+
/* If we don't find an explicit match the default is 0. */
112+
const struct xkb_key_type_entry* const entry =
113+
get_entry_for_key_state(state, key, layout);
114+
115+
return (entry) ? entry->level : 0;
116+
}
117+
104118
/**
105119
* Returns the level to use for the given key and state, or
106120
* XKB_LEVEL_INVALID.
@@ -111,16 +125,19 @@ xkb_state_key_get_level(struct xkb_state *state, xkb_keycode_t kc,
111125
{
112126
const struct xkb_key* const key = XkbKey(state->keymap, kc);
113127

114-
if (!key || layout >= key->num_groups)
115-
return XKB_LEVEL_INVALID;
116-
117-
/* If we don't find an explicit match the default is 0. */
118-
const struct xkb_key_type_entry* const entry =
119-
get_entry_for_key_state(state, key, layout);
120-
if (!entry)
121-
return 0;
128+
return (key)
129+
? state_key_get_level(state, key, layout)
130+
: XKB_LEVEL_INVALID;
131+
}
122132

123-
return entry->level;
133+
static inline xkb_layout_index_t
134+
state_key_get_layout(struct xkb_state *state, const struct xkb_key *key)
135+
{
136+
static_assert(XKB_MAX_GROUPS < INT32_MAX, "Max groups don't fit");
137+
return XkbWrapGroupIntoRange((int32_t) state->components.group,
138+
key->num_groups,
139+
key->out_of_range_group_action,
140+
key->out_of_range_group_number);
124141
}
125142

126143
/**
@@ -135,11 +152,7 @@ xkb_state_key_get_layout(struct xkb_state *state, xkb_keycode_t kc)
135152
if (!key)
136153
return XKB_LAYOUT_INVALID;
137154

138-
static_assert(XKB_MAX_GROUPS < INT32_MAX, "Max groups don't fit");
139-
return XkbWrapGroupIntoRange((int32_t) state->components.group,
140-
key->num_groups,
141-
key->out_of_range_group_action,
142-
key->out_of_range_group_number);
155+
return state_key_get_layout(state, key);
143156
}
144157

145158
/* Empty action used for empty levels */
@@ -149,18 +162,13 @@ static unsigned int
149162
xkb_key_get_actions(struct xkb_state *state, const struct xkb_key *key,
150163
const union xkb_action **actions)
151164
{
152-
const xkb_layout_index_t layout =
153-
xkb_state_key_get_layout(state, key->keycode);
154-
if (layout == XKB_LAYOUT_INVALID)
155-
goto err;
156-
157-
const xkb_level_index_t level =
158-
xkb_state_key_get_level(state, key->keycode, layout);
165+
const xkb_layout_index_t layout = state_key_get_layout(state, key);
166+
const xkb_level_index_t level = state_key_get_level(state, key, layout);
159167
if (level == XKB_LEVEL_INVALID)
160168
goto err;
161169

162170
const unsigned int count =
163-
xkb_keymap_key_get_actions_by_level(state->keymap, key->keycode,
171+
xkb_keymap_key_get_actions_by_level(state->keymap, key,
164172
layout, level, actions);
165173
if (!count)
166174
goto err;

src/xkbcomp/keymap-dump.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -517,7 +517,7 @@ write_actions(struct xkb_keymap *keymap, struct buf *buf, struct buf *buf2,
517517
if (level != 0)
518518
copy_to_buf(buf, ", ");
519519

520-
count = xkb_keymap_key_get_actions_by_level(keymap, key->keycode,
520+
count = xkb_keymap_key_get_actions_by_level(keymap, key,
521521
group, level, &actions);
522522
buf2->size = 0;
523523
if (count == 0) {

0 commit comments

Comments
 (0)