10 #include "modifiers.h"
13 lk_add_map(struct keymap *kmap, int i)
15 if (i < 0 || i >= MAX_NR_KEYMAPS) {
16 ERR(kmap, _("lk_add_map called with bad index %d"), i);
20 if (kmap->defining[i])
23 kmap->defining[i] = i + 1;
25 if (kmap->max_keymap <= i)
26 kmap->max_keymap = i + 1;
32 lk_get_key(struct keymap *kmap, int k_table, int k_index)
34 if (k_index < 0 || k_index >= NR_KEYS) {
35 ERR(kmap, _("lk_get_key called with bad index %d"), k_index);
39 if (k_table < 0 || k_table >= MAX_NR_KEYMAPS) {
40 ERR(kmap, _("lk_get_key called with bad table %d"), k_table);
44 if (!(kmap->keymap_was_set[k_table]))
47 return (kmap->key_map[k_table])[k_index];
51 lk_del_key(struct keymap *kmap, int k_table, int k_index)
53 /* roughly: addkey(k_index, k_table, K_HOLE); */
55 if (k_index < 0 || k_index >= NR_KEYS) {
56 ERR(kmap, _("lk_del_key called with bad index %d"), k_index);
60 if (k_table < 0 || k_table >= MAX_NR_KEYMAPS) {
61 ERR(kmap, _("lk_del_key called with bad table %d"), k_table);
65 if (kmap->key_map[k_table])
66 (kmap->key_map[k_table])[k_index] = K_HOLE;
68 if (kmap->keymap_was_set[k_table])
69 (kmap->keymap_was_set[k_table])[k_index] = 0;
75 lk_add_key(struct keymap *kmap, int k_table, int k_index, int keycode)
79 if (keycode == CODE_FOR_UNKNOWN_KSYM) {
80 /* is safer not to be silent in this case,
81 * it can be caused by coding errors as well. */
82 ERR(kmap, _("lk_add_key called with bad keycode %d"), keycode);
86 if (k_index < 0 || k_index >= NR_KEYS) {
87 ERR(kmap, _("lk_add_key called with bad index %d"), k_index);
91 if (k_table < 0 || k_table >= MAX_NR_KEYMAPS) {
92 ERR(kmap, _("lk_add_key called with bad table %d"), k_table);
96 if (!k_index && keycode == K_NOSUCHMAP)
99 if (!kmap->defining[k_table]) {
100 if (kmap->keywords & LK_KEYWORD_KEYMAPS) {
101 ERR(kmap, _("adding map %d violates explicit keymaps line"),
106 if (lk_add_map(kmap, k_table) < 0)
110 if (!kmap->key_map[k_table]) {
111 kmap->key_map[k_table] = (u_short *)malloc(NR_KEYS * sizeof(u_short));
113 if (!kmap->key_map[k_table]) {
114 ERR(kmap, _("out of memory"));
118 for (i = 0; i < NR_KEYS; i++)
119 (kmap->key_map[k_table])[i] = K_HOLE;
122 if (!kmap->keymap_was_set[k_table]) {
123 kmap->keymap_was_set[k_table] = (char *)malloc(NR_KEYS);
125 if (!kmap->key_map[k_table]) {
126 ERR(kmap, _("out of memory"));
130 for (i = 0; i < NR_KEYS; i++)
131 (kmap->keymap_was_set[k_table])[i] = 0;
134 if ((kmap->keywords & LK_KEYWORD_ALTISMETA) &&
136 && (kmap->keymap_was_set[k_table])[k_index])
139 (kmap->key_map[k_table])[k_index] = keycode;
140 (kmap->keymap_was_set[k_table])[k_index] = 1;
142 if (kmap->keywords & LK_KEYWORD_ALTISMETA) {
143 int alttable = k_table | M_ALT;
144 int type = KTYP(keycode);
145 int val = KVAL(keycode);
147 if (alttable != k_table && kmap->defining[alttable] &&
148 (!kmap->keymap_was_set[alttable] ||
149 !(kmap->keymap_was_set[alttable])[k_index]) &&
150 (type == KT_LATIN || type == KT_LETTER) && val < 128) {
151 if (lk_add_key(kmap, alttable, k_index, K(KT_META, val)) < 0)
159 lk_get_func(struct keymap *kmap, struct kbsentry *kbs)
161 int x = kbs->kb_func;
163 if (x >= MAX_NR_FUNC) {
164 ERR(kmap, _("bad index %d"), x);
168 if(!(kmap->func_table[x])) {
169 ERR(kmap, _("func %d not allocated"), x);
173 strncpy((char *)kbs->kb_string, kmap->func_table[x],
174 sizeof(kbs->kb_string));
175 kbs->kb_string[sizeof(kbs->kb_string) - 1] = 0;
182 lk_add_func(struct keymap *kmap, struct kbsentry kbs)
188 if (x >= MAX_NR_FUNC) {
189 ERR(kmap, _("bad func %d"), kbs.kb_func);
193 if(kmap->func_table[x]) {
194 free(kmap->func_table[x]);
195 kmap->func_table[x] = NULL;
198 kmap->func_table[x] = strdup((char *)kbs.kb_string);
200 if (!kmap->func_table[x]) {
201 ERR(kmap, _("out of memory"));
209 lk_add_diacr(struct keymap *kmap, unsigned int diacr, unsigned int base, unsigned int res)
213 if (kmap->accent_table_size == MAX_DIACR) {
214 ERR(kmap, _("table overflow"));
218 ptr = &(kmap->accent_table[kmap->accent_table_size++]);
227 lk_add_compose(struct keymap *kmap,
232 int direction = TO_8BIT;
235 if (kmap->flags & LK_FLAG_PREFER_UNICODE)
236 direction = TO_UNICODE;
238 return lk_add_diacr(kmap,
239 convert_code(kmap, diacr, direction),
240 convert_code(kmap, base, direction),
241 convert_code(kmap, res, direction)
246 do_constant_key(struct keymap *kmap, int i, u_short key)
253 if ((typ == KT_LATIN || typ == KT_LETTER) &&
254 ((val >= 'a' && val <= 'z') || (val >= 'A' && val <= 'Z'))) {
256 defs[0] = K(KT_LETTER, val);
257 defs[1] = K(KT_LETTER, val ^ 32);
261 for (j = 4; j < 8; j++)
262 defs[j] = K(KT_LATIN, val & ~96);
264 for (j = 8; j < 16; j++)
265 defs[j] = K(KT_META, KVAL(defs[j - 8]));
267 for (j = 0; j < kmap->max_keymap; j++) {
268 if (!kmap->defining[j])
272 kmap->keymap_was_set[j] && (kmap->keymap_was_set[j])[i])
275 if (lk_add_key(kmap, j, i, defs[j % 16]) < 0)
280 /* do this also for keys like Escape,
281 as promised in the man page */
282 for (j = 1; j < kmap->max_keymap; j++) {
283 if (!kmap->defining[j])
286 if (kmap->keymap_was_set[j] && (kmap->keymap_was_set[j])[i])
289 if (lk_add_key(kmap, j, i, key) < 0)
297 lk_add_constants(struct keymap *kmap)
301 if (kmap->keywords & LK_KEYWORD_KEYMAPS) {
302 while (r0 < kmap->max_keymap && !kmap->defining[r0])
306 for (i = 0; i < NR_KEYS; i++) {
309 if (!kmap->key_is_constant[i])
312 if (!kmap->key_map[r0]) {
313 ERR(kmap, _("impossible error in lk_add_constants"));
317 key = lk_get_key(kmap, r0, i);
319 if (do_constant_key(kmap, i, key) < 0)