aboutsummaryrefslogtreecommitdiff
path: root/src/compose/state.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/compose/state.c')
-rw-r--r--src/compose/state.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/src/compose/state.c b/src/compose/state.c
index 9c64eb4..6ba0344 100644
--- a/src/compose/state.c
+++ b/src/compose/state.c
@@ -41,8 +41,8 @@ struct xkb_compose_state {
* This is also sufficient for inferring the current status; see
* xkb_compose_state_get_status().
*/
- uint32_t prev_context;
- uint32_t context;
+ uint16_t prev_context;
+ uint16_t context;
};
XKB_EXPORT struct xkb_compose_state *
@@ -91,7 +91,7 @@ xkb_compose_state_get_compose_table(struct xkb_compose_state *state)
XKB_EXPORT enum xkb_compose_feed_result
xkb_compose_state_feed(struct xkb_compose_state *state, xkb_keysym_t keysym)
{
- uint32_t context;
+ uint16_t context;
const struct compose_node *node;
/*
@@ -109,17 +109,20 @@ xkb_compose_state_feed(struct xkb_compose_state *state, xkb_keysym_t keysym)
node = &darray_item(state->table->nodes, state->context);
- context = (node->is_leaf ? 0 : node->u.successor);
- node = &darray_item(state->table->nodes, context);
+ context = (node->is_leaf ? 1 : node->internal.eqkid);
+ if (context == 1 && darray_size(state->table->nodes) == 1)
+ context = 0;
- while (node->keysym != keysym && node->next != 0) {
- context = node->next;
+ while (context != 0) {
node = &darray_item(state->table->nodes, context);
+ if (keysym < node->keysym)
+ context = node->lokid;
+ else if (keysym > node->keysym)
+ context = node->hikid;
+ else
+ break;
}
- if (node->keysym != keysym)
- context = 0;
-
state->prev_context = state->context;
state->context = context;
return XKB_COMPOSE_FEED_ACCEPTED;
@@ -164,11 +167,11 @@ xkb_compose_state_get_utf8(struct xkb_compose_state *state,
/* If there's no string specified, but only a keysym, try to do the
* most helpful thing. */
- if (node->u.leaf.utf8 == 0 && node->u.leaf.keysym != XKB_KEY_NoSymbol) {
+ if (node->leaf.utf8 == 0 && node->leaf.keysym != XKB_KEY_NoSymbol) {
char name[64];
int ret;
- ret = xkb_keysym_to_utf8(node->u.leaf.keysym, name, sizeof(name));
+ ret = xkb_keysym_to_utf8(node->leaf.keysym, name, sizeof(name));
if (ret < 0 || ret == 0) {
/* ret < 0 is impossible.
* ret == 0 means the keysym has no string representation. */
@@ -179,7 +182,7 @@ xkb_compose_state_get_utf8(struct xkb_compose_state *state,
}
return snprintf(buffer, size, "%s",
- &darray_item(state->table->utf8, node->u.leaf.utf8));
+ &darray_item(state->table->utf8, node->leaf.utf8));
fail:
if (size > 0)
@@ -194,5 +197,5 @@ xkb_compose_state_get_one_sym(struct xkb_compose_state *state)
&darray_item(state->table->nodes, state->context);
if (!node->is_leaf)
return XKB_KEY_NoSymbol;
- return node->u.leaf.keysym;
+ return node->leaf.keysym;
}