home *** CD-ROM | disk | FTP | other *** search
- /* amiga_keys.c -- Event translation for AmigaDOS
- Copyright (C) 1993, 1994 John Harper <jsh@ukc.ac.uk>
-
- This file is part of Jade.
-
- Jade is free software; you can redistribute it and/or modify it
- under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2, or (at your option)
- any later version.
-
- Jade is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Jade; see the file COPYING. If not, write to
- the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
-
- #include "jade.h"
- #include "jade_protos.h"
-
- #define INTUI_V36_NAMES_ONLY
- #include <clib/intuition_protos.h>
- #include <clib/keymap_protos.h>
- #include <string.h>
-
- #define SHIFTQUALS (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)
- #define ALTQUALS (IEQUALIFIER_LALT | IEQUALIFIER_RALT)
- #define CMDQUALS (IEQUALIFIER_LCOMMAND | IEQUALIFIER_RCOMMAND)
-
- _PR void translateevent(Event *, struct IntuiMessage *);
- _PR int cookkey(struct IntuiMessage *, u_char *, int);
- _PR int lookupevent(EventDef *, u_char *);
-
- static void
- translatequals(EventDef *evd, u_short qual)
- {
- if(qual & SHIFTQUALS)
- evd->evd_Mods |= EV_MOD_SHIFT;
- if(qual & ALTQUALS)
- evd->evd_Mods |= EV_MOD_META;
- if(qual & CMDQUALS)
- evd->evd_Mods |= EV_MOD_MOD2; /* Amiga keys */
- if(qual & IEQUALIFIER_CONTROL)
- evd->evd_Mods |= EV_MOD_CTRL;
- if(qual & IEQUALIFIER_CAPSLOCK)
- evd->evd_Mods ^= EV_MOD_SHIFT;
- if(qual & IEQUALIFIER_LEFTBUTTON)
- evd->evd_Mods |= EV_MOD_LMB;
- if(qual & IEQUALIFIER_MIDBUTTON)
- evd->evd_Mods |= EV_MOD_MMB;
- if(qual & IEQUALIFIER_RBUTTON)
- evd->evd_Mods |= EV_MOD_RMB;
- }
-
- /*
- * Takes an IntuiMsg and converts it's contents to an EVENT
- */
- void
- translateevent(Event *ev, struct IntuiMessage *im)
- {
- static u_long ClickMics, ClickSecs;
- translatequals(&ev->ev_EventDef, im->Qualifier);
- switch(im->Class)
- {
- case IDCMP_RAWKEY:
- /* This magic means that we disreguard all upcodes and qualifiers. */
- if((im->Code > 0x7f) || ((im->Code >= 0x60) && (im->Code <= 0x67)))
- return;
- ev->ev_EventDef.evd_Type = EV_TYPE_KEYBD;
- ev->ev_EventDef.evd_Code = (ULONG)im->Code;
- break;
- case IDCMP_MOUSEBUTTONS:
- ev->ev_EventDef.evd_Type = EV_TYPE_MOUSE;
- if(im->Code & IECODE_UP_PREFIX)
- {
- ev->ev_EventDef.evd_Code = EV_CODE_MOUSE_UP;
- switch(im->Code & ~IECODE_UP_PREFIX)
- {
- case IECODE_LBUTTON:
- ev->ev_EventDef.evd_Mods |= EV_MOD_LMB;
- break;
- case IECODE_MBUTTON:
- ev->ev_EventDef.evd_Mods |= EV_MOD_MMB;
- break;
- case IECODE_RBUTTON:
- ev->ev_EventDef.evd_Mods |= EV_MOD_RMB;
- break;
- }
- }
- else
- {
- if(DoubleClick(ClickSecs, ClickMics, im->Seconds, im->Micros))
- ev->ev_EventDef.evd_Code = EV_CODE_MOUSE_CLICK2;
- else
- ev->ev_EventDef.evd_Code = EV_CODE_MOUSE_CLICK1;
- ClickSecs = im->Seconds;
- ClickMics = im->Micros;
- }
- break;
- case IDCMP_MOUSEMOVE:
- if(im->Qualifier & (IEQUALIFIER_MIDBUTTON | IEQUALIFIER_RBUTTON | IEQUALIFIER_LEFTBUTTON))
- {
- ev->ev_EventDef.evd_Type = EV_TYPE_MOUSE;
- ev->ev_EventDef.evd_Code = EV_CODE_MOUSE_MOVE;
- }
- break;
- }
- }
-
- int
- cookkey(struct IntuiMessage *im, u_char *buf, int buflen)
- {
- struct InputEvent ie;
- ie.ie_Class = IECLASS_RAWKEY;
- ie.ie_SubClass = 0;
- ie.ie_Code = im->Code;
- ie.ie_Qualifier = im->Qualifier;
- ie.ie_EventAddress = *((APTR *)im->IAddress);
- return(MapRawKey(&ie, buf, buflen, NULL));
- }
-
- /*
- * Stuff to translate textual key descriptions into key codes
- */
-
- typedef struct KeyDesc
- {
- u_char *kd_Name;
- EventDef kd_Event;
- } KeyDesc;
-
- static const KeyDesc KeyDescr[] =
- {
- "SHIFT", { 0, EV_MOD_SHIFT, 0 },
- "SFT", { 0, EV_MOD_SHIFT, 0 },
- "CONTROL", { 0, EV_MOD_CTRL, 0 },
- "CTRL", { 0, EV_MOD_CTRL, 0 },
- "CTL", { 0, EV_MOD_CTRL, 0 },
- "MOD1", { 0, EV_MOD_MOD1, 0 },
- "META", { 0, EV_MOD_META, 0 },
- "MOD2", { 0, EV_MOD_MOD2, 0 },
- "AMIGA", { 0, EV_MOD_MOD2, 0 },
- "MOD3", { 0, EV_MOD_MOD3, 0 },
- "MOD4", { 0, EV_MOD_MOD4, 0 },
- "BUTTON1", { 0, EV_MOD_BUTTON1, 0 },
- "LMB", { 0, EV_MOD_LMB, 0 },
- "BUTTON2", { 0, EV_MOD_BUTTON2, 0 },
- "MMB", { 0, EV_MOD_MMB, 0 },
- "BUTTON3", { 0, EV_MOD_BUTTON3, 0 },
- "RMB", { 0, EV_MOD_RMB, 0 },
- "BUTTON4", { 0, EV_MOD_BUTTON4, 0 },
- "BUTTON5", { 0, EV_MOD_BUTTON5, 0 },
-
- "SPACE", { EV_TYPE_KEYBD, 0, 0x40 },
- "SPACEBAR", { EV_TYPE_KEYBD, 0, 0x40 },
- "SPC", { EV_TYPE_KEYBD, 0, 0x40 },
- "BACKSPACE", { EV_TYPE_KEYBD, 0, 0x41 },
- "BS", { EV_TYPE_KEYBD, 0, 0x41 },
- "TAB", { EV_TYPE_KEYBD, 0, 0x42 },
- "RETURN", { EV_TYPE_KEYBD, 0, 0x44 },
- "RET", { EV_TYPE_KEYBD, 0, 0x44 },
- "ESC", { EV_TYPE_KEYBD, 0, 0x45 },
- "ESCAPE", { EV_TYPE_KEYBD, 0, 0x45 },
- "DEL", { EV_TYPE_KEYBD, 0, 0x46 },
- "DELETE", { EV_TYPE_KEYBD, 0, 0x46 },
- "HELP", { EV_TYPE_KEYBD, 0, 0x5f },
- "UP", { EV_TYPE_KEYBD, 0, 0x4c },
- "DOWN", { EV_TYPE_KEYBD, 0, 0x4d },
- "RIGHT", { EV_TYPE_KEYBD, 0, 0x4e },
- "LEFT", { EV_TYPE_KEYBD, 0, 0x4f },
- "F1", { EV_TYPE_KEYBD, 0, 0x50 },
- "F2", { EV_TYPE_KEYBD, 0, 0x51 },
- "F3", { EV_TYPE_KEYBD, 0, 0x52 },
- "F4", { EV_TYPE_KEYBD, 0, 0x53 },
- "F5", { EV_TYPE_KEYBD, 0, 0x54 },
- "F6", { EV_TYPE_KEYBD, 0, 0x55 },
- "F7", { EV_TYPE_KEYBD, 0, 0x56 },
- "F8", { EV_TYPE_KEYBD, 0, 0x57 },
- "F9", { EV_TYPE_KEYBD, 0, 0x58 },
- "F10", { EV_TYPE_KEYBD, 0, 0x59 },
-
- /*
- * numeric keypad
- */
- "KP_ENTER", { EV_TYPE_KEYBD, 0, 0x43 },
- "KP_MULTIPLY", { EV_TYPE_KEYBD, 0, 0x5d },
- "KP_DIVIDE", { EV_TYPE_KEYBD, 0, 0x5c },
- "KP_MINUS", { EV_TYPE_KEYBD, 0, 0x4a },
- "KP_ADD", { EV_TYPE_KEYBD, 0, 0x5e },
- "KP_DECIMAL", { EV_TYPE_KEYBD, 0, 0x39 },
- "KP_0", { EV_TYPE_KEYBD, 0, 0x0a },
- "KP_1", { EV_TYPE_KEYBD, 0, 0x1d },
- "KP_2", { EV_TYPE_KEYBD, 0, 0x1e },
- "KP_3", { EV_TYPE_KEYBD, 0, 0x1f },
- "KP_4", { EV_TYPE_KEYBD, 0, 0x2d },
- "KP_5", { EV_TYPE_KEYBD, 0, 0x2e },
- "KP_6", { EV_TYPE_KEYBD, 0, 0x2f },
- "KP_7", { EV_TYPE_KEYBD, 0, 0x3d },
- "KP_8", { EV_TYPE_KEYBD, 0, 0x3e },
- "KP_9", { EV_TYPE_KEYBD, 0, 0x3f },
-
- /* mouse events
- */
- "CLICK1", { EV_TYPE_MOUSE, 0, EV_CODE_MOUSE_CLICK1 },
- "CLICK2", { EV_TYPE_MOUSE, 0, EV_CODE_MOUSE_CLICK2 },
- "OFF", { EV_TYPE_MOUSE, 0, EV_CODE_MOUSE_UP },
- "MOVE", { EV_TYPE_MOUSE, 0, EV_CODE_MOUSE_MOVE },
-
- NULL, 0, 0
- };
-
- /*
- */
- int
- lookupevent(EventDef *ie, u_char *desc)
- {
- int rc = TRUE;
- u_char *str = desc;
- for(;;)
- {
- u_char buff[100];
- u_char *tmp = buff;
- u_char c;
- const KeyDesc *kd = KeyDescr;
- /*
- * get this one token
- */
- while((c = *str) && (c != '-') && (c != ' '))
- {
- if(c == '\\')
- str++;
- *tmp++ = *str++;
- }
- *tmp = 0;
- if(*str)
- str++;
- while(kd->kd_Name)
- {
- if(!stricmp(kd->kd_Name, buff))
- {
- ie->evd_Mods |= kd->kd_Event.evd_Mods;
- ie->evd_Code |= kd->kd_Event.evd_Code;
- if(ie->evd_Type = kd->kd_Event.evd_Type)
- goto end;
- break;
- }
- kd++;
- }
- if(!kd->kd_Name)
- {
- u_char coded[2];
- if(MapANSI(buff, strlen(buff), coded, 1, NULL) == 1)
- {
- ie->evd_Type = EV_TYPE_KEYBD;
- translatequals(ie, (UWORD)coded[1]);
- ie->evd_Code = (ULONG)coded[0];
- goto end;
- }
- else
- {
- cmd_signal(sym_bad_event_desc, LIST_1(valstrdup(desc)));
- rc = FALSE;
- goto end;
- }
- }
- }
- end:
- return(rc);
- }
-