-char * get_keyname(int keycode) {
-// Translate some keycodes to readable names of max 9 chars.
- char * keyname;
- keyname = malloc(15);
- if (32 < keycode && keycode < 127)
- sprintf(keyname, "%c", keycode);
- else if (keycode == 9)
- sprintf(keyname, "TAB");
- else if (keycode == 10)
- sprintf(keyname, "RETURN");
- else if (keycode == 27)
- sprintf(keyname, "ESCAPE");
- else if (keycode == 32)
- sprintf(keyname, "SPACE");
- else if (keycode == KEY_UP)
- sprintf(keyname, "UP");
- else if (keycode == KEY_DOWN)
- sprintf(keyname, "DOWN");
- else if (keycode == KEY_LEFT)
- sprintf(keyname, "LEFT");
- else if (keycode == KEY_RIGHT)
- sprintf(keyname, "RIGHT");
- else if (keycode == KEY_HOME)
- sprintf(keyname, "HOME");
- else if (keycode == KEY_BACKSPACE)
- sprintf(keyname, "BACKSPACE");
- else if (keycode >= KEY_F0 && keycode <= KEY_F(63)) {
- int f = keycode - KEY_F0;
- sprintf(keyname, "F%d", f); }
- else if (keycode == KEY_DC)
- sprintf(keyname, "DELETE");
- else if (keycode == KEY_IC)
- sprintf(keyname, "INSERT");
- else if (keycode == KEY_NPAGE)
- sprintf(keyname, "NEXT PAGE");
- else if (keycode == KEY_PPAGE)
- sprintf(keyname, "PREV PAGE");
- else if (keycode == KEY_END)
- sprintf(keyname, "END");
- else
- sprintf(keyname, "(unknown)");
- return keyname; }
-
-void draw_keys_window (struct Win * win) {
-// Draw keybinding window.
- struct World * world = (struct World *) win->data;
- struct KeysWinData * keyswindata = (struct KeysWinData *) world->keyswindata;
- struct KeyBinding * keybindings = world->keybindings;
- int offset = 0;
- if (keyswindata->max >= win->height) {
- if (keyswindata->select > win->height / 2) {
- if (keyswindata->select < (keyswindata->max - (win->height / 2)))
- offset = keyswindata->select - (win->height / 2);
- else
- offset = keyswindata->max - win->height + 1; } }
- int keydescwidth = 9 + 1; // max length assured by get_keyname() + \0
- char * keydesc = malloc(keydescwidth);
- attr_t attri;
- int y, x;
- char * keyname;
- for (y = 0; 0 != keybindings[offset + y].name && y < win->height; y++) {
- attri = 0;
- if (y == keyswindata->select - offset) {
- attri = A_REVERSE;
- if (1 == keyswindata->edit)
- attri = attri | A_BLINK; }
- keyname = get_keyname(keybindings[y + offset].key);
- snprintf(keydesc, keydescwidth, "%-9s", keyname);
- free(keyname);
- for (x = 0; x < win->width; x++)
- if (x < strlen(keydesc))
- mvwaddch(win->curses_win, y, x, keydesc[x] | attri);
- else if (strlen(keydesc) < x && x < strlen(keybindings[y + offset].name) + strlen(keydesc) + 1)
- mvwaddch(win->curses_win, y, x, keybindings[y + offset].name[x - strlen(keydesc) - 1] | attri);
- else
- mvwaddch(win->curses_win, y, x, ' ' | attri); }
- free(keydesc); }
-
-void init_keybindings(struct World * world) {
-// Initialize keybindings from file "keybindings".
- FILE * file = fopen("keybindings", "r");
- int lines = 0;
- int c = 0;
- int linemax = 0;
- int c_count = 0;
- while (EOF != c) {
- c_count++;
- c = getc(file);
- if ('\n' == c) {
- if (c_count > linemax)
- linemax = c_count;
- c_count = 0;
- lines++; } }
- struct KeyBinding * keybindings = malloc(lines * sizeof(struct KeyBinding));
- fseek(file, 0, SEEK_SET);
- char * command = malloc(linemax);
- int commcount = 0;
- char * digits = malloc(3);
- int digicount = 0;
- int key, digimax;
- int keycount = 0;
- c = getc(file);
- while (EOF != c) {
- if ('\n' == c) {
- keybindings[keycount].name = calloc(commcount, sizeof(char));
- memcpy(keybindings[keycount].name, command, commcount);
- keybindings[keycount].key = key;
- keycount++;
- digicount = 0;
- commcount = 0; }
- else if (-1 != digicount)
- if (' ' == c) {
- key = 0;
- digimax = digicount - 1;
- while (digicount > 0) {
- digicount--;
- key = key + ((digits[digicount] - 48) * pow(10, digimax - digicount)); }
- digicount = -1; }
- else {
- digits[digicount] = c;
- digicount++; }