minix/drivers/tty/keymaps/genmap.c
Ben Gras 6a0e8e3b80 Added a separate keymap for escaped scancodes. This makes the code
a little cleaner (escaped scancodes are less of a special case) and
lets us be completely flexible when assigning meaning to them.

Future: a tool and ioctl to load the escaped keymap.
2009-02-04 17:04:16 +00:00

60 lines
1.1 KiB
C

/* genmap - output binary keymap Author: Marcus Hampel
*/
#include <sys/types.h>
#include <minix/keymap.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
u16_t keymap[NR_SCAN_CODES * MAP_COLS] = {
#include KEYSRC
};
u8_t comprmap[4 + NR_SCAN_CODES * MAP_COLS * 9/8 * 2 + 1];
void tell(const char *s)
{
write(2, s, strlen(s));
}
int main(void)
{
u8_t *cm, *fb;
u16_t *km;
int n;
/* Compress the keymap. */
memcpy(comprmap, KEY_MAGIC, 4);
cm = comprmap + 4;
n = 8;
for (km = keymap; km < keymap + NR_SCAN_CODES * MAP_COLS; km++) {
if (n == 8) {
/* Allocate a new flag byte. */
fb = cm;
*cm++ = 0;
n= 0;
}
*cm++ = (*km & 0x00FF); /* Low byte. */
if (*km & 0xFF00) {
*cm++ = (*km >> 8); /* High byte only when set. */
*fb |= (1 << n); /* Set a flag if so. */
}
n++;
}
/* Don't store trailing zeros. */
while (cm > comprmap && cm[-1] == 0) cm--;
/* Emit the compressed keymap. */
if (write(1, comprmap, cm - comprmap) < 0) {
int err = errno;
tell("genmap: ");
tell(strerror(err));
tell("\n");
exit(1);
}
exit(0);
}