Mercurial > ~darius > hgwebdir.cgi > paradise_client
diff keymap.c @ 3:5a977ccbc7a9 default tip
Empty changelog
author | darius |
---|---|
date | Sat, 06 Dec 1997 05:41:29 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/keymap.c Sat Dec 06 05:41:29 1997 +0000 @@ -0,0 +1,240 @@ +/* $Id: keymap.c,v 1.1.1.1 1997/12/06 05:41:29 darius Exp $ */ + +/* + * keymap.c + * Bill Dyess, 10/20/93 + */ + +#include "copyright.h" +#include <stdio.h> +/*#include <sys/types.h> +#ifdef RS6K +#include <sys/select.h> +#endif +#include <signal.h> +#include <errno.h> +#include "packets.h"*/ +#include "Wlib.h" +#include "defs.h" +#include "struct.h" +#include "data.h" +#include "proto.h" + +#define control(x) (x)+128 + +int +doKeymap(data) + W_Event *data; +{ + int key = data->key; + +#ifdef MACROS + if (macroState) { /* macro needed a destination or in macro + mode */ + if (key > 256 && data->type != W_EV_BUTTON) { /* an alt-key will exit + the macro mode */ + /* + but let mouse buttons do macros! button conversion is done by + calling function. + */ + warning(" "); + } else { + if (key > 256) + data->key -= 256; + doMacro(data); + return -1; + } + } +#endif /* MACROS */ + + if (key < 256) { /* not alt key */ + key = myship->s_keymap[key]; + +#ifdef MACROS + if (macrotable[key] && (macrotable[key]->flags & MACSINGLE)) { + data->key = key; + doMacro(data); + return -1; + } +#endif /* MACROS */ + + } else + key = key - 256; + return key; +} + +unsigned char def_keymap[256]; +unsigned char def_buttonmap[12]; +void +buildShipKeymap(shipp) + struct ship *shipp; +{ + char keybuf[40], ckeybuf[40], buttonbuf[40], cbuttonbuf[40]; + struct stringlist *l; + + bcopy(def_keymap, shipp->s_keymap, 256); + bcopy(def_buttonmap, shipp->s_buttonmap, 12); + + sprintf(keybuf, "keymap.%c%c", shipp->s_desig[0], shipp->s_desig[1]); + sprintf(ckeybuf, "ckeymap.%c%c", shipp->s_desig[0], shipp->s_desig[1]); + sprintf(buttonbuf, "buttonmap.%c%c", shipp->s_desig[0], shipp->s_desig[1]); + sprintf(cbuttonbuf, "cbuttonmap.%c%c", shipp->s_desig[0], shipp->s_desig[1]); + + for (l = defaults; l; l = l->next) { + if (!strcmpi(keybuf, l->string)) + keymapAdd(l->value, shipp->s_keymap); + else if (!strcmpi(ckeybuf, l->string)) + ckeymapAdd(l->value, shipp->s_keymap); + else if (!strcmpi(buttonbuf, l->string)) + buttonmapAdd(l->value, shipp->s_buttonmap); + else if (!strcmpi(cbuttonbuf, l->string)) + cbuttonmapAdd(l->value, shipp->s_buttonmap); + } +} + +void +initkeymap(type) + int type; +{ + char keybuf[40], ckeybuf[40], buttonbuf[40], cbuttonbuf[40]; + struct ship *sh; + int i, j; + struct stringlist *l; + + keybuf[0] = ckeybuf[0] = buttonbuf[0] = cbuttonbuf[0] = 0; + + if (type < 0) { + for (i = 0; i < 256; i++) + def_keymap[i] = i; + + for (l = defaults; l; l = l->next) { + if (!strcmpi("keymap", l->string)) + keymapAdd(l->value, def_keymap); + else if (!strcmpi("ckeymap", l->string)) + ckeymapAdd(l->value, def_keymap); + else if (!strcmpi("buttonmap", l->string)) + buttonmapAdd(l->value, def_buttonmap); + else if (!strcmpi("cbuttonmap", l->string)) + cbuttonmapAdd(l->value, def_buttonmap); + } + + for (j = 0; j < nshiptypes; j++) { + buildShipKeymap(getship(j)); + } + } +} + +void +keymapAdd(str, map) + char *str, *map; +{ + if (str) { + /* parse non-control char keymap */ + while (*str != '\0' && *(str + 1) != '\0') { + if (*str >= 32 && *str < 127) { + map[(int) *str] = *(str + 1); + } + str += 2; + } + } +} + +void +ckeymapAdd(cstr, map) + char *cstr, *map; +{ + unsigned char key[2]; + short state = 0; + + if (cstr) { + /* + control chars are allowed, so use ^char to mean control, and ^^ to + mean ^ + */ + while (*cstr != '\0') { + if (*cstr == '^') { + cstr++; + if (*cstr == '^' || !*cstr) + key[state] = '^'; + else + key[state] = 128 + *cstr; + } else { + key[state] = *cstr; + } + if (*cstr) + cstr++; + if (state) + map[key[0]] = key[1]; + state = 1 - state; + } + } +} + +void +buttonmapAdd(str, map) + char *str, *map; +{ + unsigned char button, ch; + + if (str) { + while (*str != '\0' && *(str + 1) != '\0') { + if (*str < 'a') + button = *str++ - '1'; + else + button = 9 + *str++ - 'a'; + if (button > 11) + fprintf(stderr, "%c ignored in buttonmap\n", *(str - 1)); + else { + ch = *str++; + map[button] = ch; + } + } + } +} + +void +cbuttonmapAdd(cstr, map) + char *cstr, *map; +{ + unsigned char button, ch; + + if (cstr) { + while (*cstr != '\0' && *(cstr + 1) != '\0') { + /* + code for cbuttonmap, which allows buttons to be mapped to + control keys. [BDyess] + */ + if (*cstr < 'a') + button = *cstr++ - '1'; + else + button = 9 + *cstr++ - 'a'; + if (button > 11) + fprintf(stderr, "%c ignored in cbuttonmap\n", *(cstr - 1)); + else { + ch = *cstr++; + if (ch == '^') { + ch = *cstr++; + if (ch != '^') + ch += 128; + } + map[button] = ch; + } + } + } +} + +#ifdef KEYMAP_DEBUG +void +dumpKeymap() +{ + int i; + + for (i = 0; i < 256; i++) { + printf("%3d %c : %3d %c\n", + i, + isprint(i) ? i : '_', + myship->s_keymap[i], + isprint(myship->s_keymap[i]) ? myship->s_keymap[i] : '_'); + } +} +#endif /* KEYMAP_DEBUG */