@@ -101,6 +101,20 @@ get_entry_for_key_state(struct xkb_state *state, const struct xkb_key *key,
101
101
return get_entry_for_mods (type , active_mods );
102
102
}
103
103
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
+
104
118
/**
105
119
* Returns the level to use for the given key and state, or
106
120
* XKB_LEVEL_INVALID.
@@ -111,16 +125,19 @@ xkb_state_key_get_level(struct xkb_state *state, xkb_keycode_t kc,
111
125
{
112
126
const struct xkb_key * const key = XkbKey (state -> keymap , kc );
113
127
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
+ }
122
132
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 );
124
141
}
125
142
126
143
/**
@@ -135,11 +152,7 @@ xkb_state_key_get_layout(struct xkb_state *state, xkb_keycode_t kc)
135
152
if (!key )
136
153
return XKB_LAYOUT_INVALID ;
137
154
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 );
143
156
}
144
157
145
158
/* Empty action used for empty levels */
@@ -149,18 +162,13 @@ static unsigned int
149
162
xkb_key_get_actions (struct xkb_state * state , const struct xkb_key * key ,
150
163
const union xkb_action * * actions )
151
164
{
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 );
159
167
if (level == XKB_LEVEL_INVALID )
160
168
goto err ;
161
169
162
170
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 ,
164
172
layout , level , actions );
165
173
if (!count )
166
174
goto err ;
0 commit comments