6 #include <linux/keyboard.h>
15 defkeys(struct lk_ctx *ctx, int fd, int kbd_mode)
21 if (ctx->flags & LK_FLAG_UNICODE_MODE) {
22 /* temporarily switch to K_UNICODE while defining keys */
23 if (ioctl(fd, KDSKBMODE, K_UNICODE)) {
24 ERR(ctx, _("KDSKBMODE: %s: could not switch to Unicode mode"),
30 for (i = 0; i < MAX_NR_KEYMAPS; i++) {
31 unsigned int exist = lk_map_exists(ctx, i);
34 for (j = 0; j < NR_KEYS; j++) {
35 if (!lk_key_exists(ctx, i, j))
40 ke.kb_value = lk_get_key(ctx, i, j);
42 fail = ioctl(fd, KDSKBENT, (unsigned long)&ke);
46 ERR(ctx, _("Keymap %d: Permission denied"), i);
50 ERR(ctx, "%s", strerror(errno));
54 INFO(ctx, _("keycode %d, table %d = %d%s"),
55 j, i, lk_get_key(ctx,i, j), fail ? _(" FAILED") : "");
58 WARN(ctx, _("failed to bind key %d to value %d"),
59 j, lk_get_key(ctx, i, j));
62 } else if ((ctx->keywords & LK_KEYWORD_KEYMAPS) && !exist) {
63 /* deallocate keymap */
66 ke.kb_value = K_NOSUCHMAP;
68 DBG(ctx, _("deallocate keymap %d"), i);
70 if (ioctl(fd, KDSKBENT, (unsigned long)&ke)) {
71 if (errno != EINVAL) {
72 ERR(ctx, _("KDSKBENT: %s: could not deallocate keymap %d"),
76 /* probably an old kernel */
77 /* clear keymap by hand */
78 for (j = 0; j < NR_KEYS; j++) {
83 if (ioctl(fd, KDSKBENT, (unsigned long)&ke)) {
84 if (errno == EINVAL && i >= 16)
85 break; /* old kernel */
87 ERR(ctx, _("KDSKBENT: %s: cannot deallocate or clear keymap"),
96 if ((ctx->flags & LK_FLAG_UNICODE_MODE) && ioctl(fd, KDSKBMODE, kbd_mode)) {
97 ERR(ctx, _("KDSKBMODE: %s: could not return to original keyboard mode"),
109 ostr(struct lk_ctx *ctx, char *s)
112 char *ns0 = malloc(4 * lth + 1);
116 ERR(ctx, _("out of memory"));
142 deffuncs(struct lk_ctx *ctx, int fd)
148 for (i = 0; i < MAX_NR_FUNC; i++) {
151 ptr = lk_array_get_ptr(ctx->func_table, i);
154 strcpy((char *)kbs.kb_string, ptr);
155 if (ioctl(fd, KDSKBSENT, (unsigned long)&kbs)) {
156 s = ostr(ctx, (char *)kbs.kb_string);
159 ERR(ctx, _("failed to bind string '%s' to function %s"),
160 s, syms[KT_FN].table[kbs.kb_func]);
165 } else if (ctx->flags & LK_FLAG_CLEAR_STRINGS) {
166 kbs.kb_string[0] = 0;
168 if (ioctl(fd, KDSKBSENT, (unsigned long)&kbs)) {
169 ERR(ctx, _("failed to clear string %s"),
170 syms[KT_FN].table[kbs.kb_func]);
180 defdiacs(struct lk_ctx *ctx, int fd)
182 unsigned int i, count;
183 struct kb_diacr *ptr;
185 count = ctx->accent_table->count;
186 if (count > MAX_DIACR) {
188 ERR(ctx, _("too many compose definitions"));
191 if (ctx->flags & LK_FLAG_PREFER_UNICODE) {
192 struct kbdiacrsuc kdu;
196 for (i = 0; i < kdu.kb_cnt; i++) {
197 ptr = lk_array_get_ptr(ctx->accent_table, i);
199 /* It can't be happen */
200 ERR(ctx, _("unable to get compose definitions"));
204 kdu.kbdiacruc[i].diacr = ptr->diacr;
205 kdu.kbdiacruc[i].base = ptr->base;
206 kdu.kbdiacruc[i].result = ptr->result;
209 if (ioctl(fd, KDSKBDIACRUC, (unsigned long)&kdu)) {
210 ERR(ctx, "KDSKBDIACRUC: %s", strerror(errno));
220 for (i = 0; i < kd.kb_cnt; i++) {
221 ptr = lk_array_get_ptr(ctx->accent_table, i);
223 ERR(ctx, _("unable to get compose definitions"));
226 kd.kbdiacr[i].diacr = ptr->diacr;
227 kd.kbdiacr[i].base = ptr->base;
228 kd.kbdiacr[i].result = ptr->result;
231 if (ioctl(fd, KDSKBDIACR, (unsigned long)&kd)) {
232 ERR(ctx, "KDSKBDIACR: %s", strerror(errno));
241 lk_load_keymap(struct lk_ctx *ctx, int fd, int kbd_mode)
243 int keyct, funcct, diacct;
245 if (lk_add_constants(ctx) < 0)
248 if ((keyct = defkeys(ctx, fd, kbd_mode)) < 0 || (funcct = deffuncs(ctx, fd)) < 0)
251 INFO(ctx, _("\nChanged %d %s and %d %s"),
252 keyct, (keyct == 1) ? _("key") : _("keys"),
253 funcct, (funcct == 1) ? _("string") : _("strings"));
255 if (ctx->accent_table->count > 0 || ctx->flags & LK_FLAG_CLEAR_COMPOSE) {
256 diacct = defdiacs(ctx, fd);
261 INFO(ctx, _("Loaded %d compose %s"),
262 diacct, (diacct == 1) ? _("definition") : _("definitions"));
265 INFO(ctx, _("(No change in compose definitions)"));