13 #include "modifiers.h"
15 int lk_map_exists(struct lk_ctx *ctx, unsigned int k_table)
17 return (lk_array_get_ptr(ctx->keymap, k_table) != NULL);
20 int lk_get_keys_total(struct lk_ctx *ctx, unsigned int k_table)
23 map = lk_array_get_ptr(ctx->keymap, k_table);
30 int lk_key_exists(struct lk_ctx *ctx, unsigned int k_table, unsigned int k_index)
35 map = lk_array_get_ptr(ctx->keymap, k_table);
40 key = lk_array_get(map, k_index);
48 int lk_add_map(struct lk_ctx *ctx, unsigned int k_table)
50 struct lk_array *keys;
52 if (lk_map_exists(ctx, k_table)) {
56 keys = malloc(sizeof(struct lk_array));
58 ERR(ctx, _("out of memory"));
62 lk_array_init(keys, sizeof(unsigned int), 0);
64 if (lk_array_set(ctx->keymap, k_table, &keys) < 0) {
66 ERR(ctx, _("out of memory"));
73 int lk_get_key(struct lk_ctx *ctx, unsigned int k_table, unsigned int k_index)
78 map = lk_array_get_ptr(ctx->keymap, k_table);
80 ERR(ctx, _("unable to get keymap %d"), k_table);
84 key = lk_array_get(map, k_index);
85 if (!key || *key == 0) {
92 int lk_del_key(struct lk_ctx *ctx, unsigned int k_table, unsigned int k_index)
96 map = lk_array_get_ptr(ctx->keymap, k_table);
98 ERR(ctx, _("unable to get keymap %d"), k_table);
102 if (!lk_array_exists(map, k_index))
105 if (lk_array_unset(map, k_index) < 0) {
106 ERR(ctx, _("unable to unset key %d for table %d"),
114 int lk_add_key(struct lk_ctx *ctx, unsigned int k_table, unsigned int k_index, int keycode)
116 struct lk_array *map;
117 unsigned int code = keycode + 1;
119 if (keycode == CODE_FOR_UNKNOWN_KSYM) {
120 /* is safer not to be silent in this case,
121 * it can be caused by coding errors as well. */
122 ERR(ctx, _("lk_add_key called with bad keycode %d"), keycode);
126 map = lk_array_get_ptr(ctx->keymap, k_table);
128 if (ctx->keywords & LK_KEYWORD_KEYMAPS) {
129 ERR(ctx, _("adding map %d violates explicit keymaps line"),
134 if (lk_add_map(ctx, k_table) < 0)
138 if ((ctx->keywords & LK_KEYWORD_ALTISMETA) && keycode == K_HOLE &&
139 lk_key_exists(ctx, k_table, k_index))
142 map = lk_array_get_ptr(ctx->keymap, k_table);
144 if (lk_array_set(map, k_index, &code) < 0) {
145 ERR(ctx, _("unable to set key %d for table %d"),
150 if (ctx->keywords & LK_KEYWORD_ALTISMETA) {
151 unsigned int alttable = k_table | M_ALT;
152 int type = KTYP(keycode);
153 int val = KVAL(keycode);
155 if (alttable != k_table && lk_map_exists(ctx, alttable) &&
156 !lk_key_exists(ctx, alttable, k_index) &&
157 (type == KT_LATIN || type == KT_LETTER) &&
159 if (lk_add_key(ctx, alttable, k_index, K(KT_META, val)) < 0)
168 do_constant_key(struct lk_ctx *ctx, int i, unsigned short key)
176 if ((typ == KT_LATIN || typ == KT_LETTER) &&
177 ((val >= 'a' && val <= 'z') || (val >= 'A' && val <= 'Z'))) {
178 unsigned short defs[16];
179 defs[0] = K(KT_LETTER, val);
180 defs[1] = K(KT_LETTER, val ^ 32);
184 for (j = 4; j < 8; j++)
185 defs[j] = K(KT_LATIN, val & ~96);
187 for (j = 8; j < 16; j++)
188 defs[j] = K(KT_META, KVAL(defs[j - 8]));
190 for (j = 0; j < ctx->keymap->total; j++) {
191 if (!lk_map_exists(ctx, j))
194 if (j > 0 && lk_key_exists(ctx, j, i))
197 if (lk_add_key(ctx, j, i, defs[j % 16]) < 0)
202 /* do this also for keys like Escape,
203 as promised in the man page */
204 for (j = 1; j < ctx->keymap->total; j++) {
205 if (!lk_map_exists(ctx, j))
208 if (lk_key_exists(ctx, j, i))
211 if (lk_add_key(ctx, j, i, key) < 0)
218 int lk_add_constants(struct lk_ctx *ctx)
220 unsigned int i, r0 = 0;
222 if (ctx->keywords & LK_KEYWORD_KEYMAPS) {
223 while (r0 < ctx->keymap->total && !lk_map_exists(ctx, r0))
227 for (i = 0; i < ctx->key_constant->total; i++) {
231 constant = lk_array_get(ctx->key_constant, i);
232 if (!constant || !(*constant))
235 if (!lk_map_exists(ctx, r0)) {
236 ERR(ctx, _("impossible error in lk_add_constants"));
240 key = lk_get_key(ctx, r0, i);
242 if (do_constant_key(ctx, i, key) < 0)