home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD1.bin / new / util / edit / jade / src / amiga_keys.c < prev    next >
C/C++ Source or Header  |  1994-10-01  |  9KB  |  353 lines

  1. /* amiga_keys.c -- Event translation for AmigaDOS
  2.    Copyright (C) 1993, 1994 John Harper <jsh@ukc.ac.uk>
  3.  
  4.    This file is part of Jade.
  5.  
  6.    Jade is free software; you can redistribute it and/or modify it
  7.    under the terms of the GNU General Public License as published by
  8.    the Free Software Foundation; either version 2, or (at your option)
  9.    any later version.
  10.  
  11.    Jade is distributed in the hope that it will be useful, but
  12.    WITHOUT ANY WARRANTY; without even the implied warranty of
  13.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.    GNU General Public License for more details.
  15.  
  16.    You should have received a copy of the GNU General Public License
  17.    along with Jade; see the file COPYING.  If not, write to
  18.    the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. #include "jade.h"
  21. #include "jade_protos.h"
  22.  
  23. #define INTUI_V36_NAMES_ONLY
  24. #include <clib/intuition_protos.h>
  25. #include <clib/keymap_protos.h>
  26. #include <string.h>
  27.  
  28. #define SHIFTQUALS (IEQUALIFIER_LSHIFT | IEQUALIFIER_RSHIFT)
  29. #define ALTQUALS   (IEQUALIFIER_LALT | IEQUALIFIER_RALT)
  30. #define CMDQUALS   (IEQUALIFIER_LCOMMAND | IEQUALIFIER_RCOMMAND)
  31.  
  32. _PR void translate_event(u_long *, u_long *, struct IntuiMessage *);
  33. _PR int  cook_key(struct IntuiMessage *, u_char *, int);
  34. _PR bool lookup_event(u_long *, u_long *, u_char *);
  35. _PR bool lookup_event_name(u_char *, u_long, u_long);
  36.  
  37. _PR u_long esc_code, esc_mods;
  38. u_long esc_code = 0x45, esc_mods = EV_TYPE_KEYBD;
  39.  
  40. static u_long
  41. translate_quals(u_long mods, u_short qual)
  42. {
  43.     if(qual & SHIFTQUALS)
  44.     mods |= EV_MOD_SHIFT;
  45.     if(qual & ALTQUALS)
  46.     mods |= EV_MOD_META;
  47.     if(qual & CMDQUALS)
  48.     mods |= EV_MOD_MOD2; /* Amiga keys */
  49.     if(qual & IEQUALIFIER_CONTROL)
  50.     mods |= EV_MOD_CTRL;
  51.     if(qual & IEQUALIFIER_CAPSLOCK)
  52.     mods ^= EV_MOD_SHIFT;
  53.     if(qual & IEQUALIFIER_LEFTBUTTON)
  54.     mods |= EV_MOD_LMB;
  55.     if(qual & IEQUALIFIER_MIDBUTTON)
  56.     mods |= EV_MOD_MMB;
  57.     if(qual & IEQUALIFIER_RBUTTON)
  58.     mods |= EV_MOD_RMB;
  59.     return(mods);
  60. }
  61.  
  62. static u_long
  63. translate_mods(u_long mods)
  64. {
  65.     u_long quals = 0;
  66.     if(mods & EV_MOD_SHIFT)
  67.     quals |= IEQUALIFIER_LSHIFT;
  68.     if(mods & EV_MOD_CTRL)
  69.     quals |= IEQUALIFIER_CONTROL;
  70.     if(mods & EV_MOD_META)
  71.     quals |= IEQUALIFIER_LALT;
  72.     if(mods & EV_MOD_MOD2)
  73.     quals |= IEQUALIFIER_LCOMMAND;
  74.     if(mods & EV_MOD_LMB)
  75.     quals |= IEQUALIFIER_LEFTBUTTON;
  76.     if(mods & EV_MOD_MMB)
  77.     quals |= IEQUALIFIER_MIDBUTTON;
  78.     if(mods & EV_MOD_RMB)
  79.     quals |= IEQUALIFIER_RBUTTON;
  80.     return(mods);
  81. }
  82.  
  83. /* Takes an IntuiMsg and converts it's contents to an EVENT. */
  84. void
  85. translate_event(u_long *code, u_long *mods, struct IntuiMessage *im)
  86. {
  87.     static u_long ClickMics, ClickSecs;
  88.     *mods = translate_quals(*mods, im->Qualifier);
  89.     switch(im->Class)
  90.     {
  91.     case IDCMP_RAWKEY:
  92.     /* This magic means that we disreguard all upcodes and qualifiers.  */
  93.     if((im->Code > 0x7f) || ((im->Code >= 0x60) && (im->Code <= 0x67)))
  94.         return;
  95.     *code = (u_long)im->Code;
  96.     *mods |= EV_TYPE_KEYBD;
  97.     break;
  98.     case IDCMP_MOUSEBUTTONS:
  99.     *mods |= EV_TYPE_MOUSE;
  100.     if(im->Code & IECODE_UP_PREFIX)
  101.     {
  102.         *code = EV_CODE_MOUSE_UP;
  103.         switch(im->Code & ~IECODE_UP_PREFIX)
  104.         {
  105.         case IECODE_LBUTTON:
  106.         *mods |= EV_MOD_LMB;
  107.         break;
  108.         case IECODE_MBUTTON:
  109.         *mods |= EV_MOD_MMB;
  110.         break;
  111.         case IECODE_RBUTTON:
  112.         *mods |= EV_MOD_RMB;
  113.         break;
  114.         }
  115.     }
  116.     else
  117.     {
  118.         if(DoubleClick(ClickSecs, ClickMics, im->Seconds, im->Micros))
  119.         *code = EV_CODE_MOUSE_CLICK2;
  120.         else
  121.         *code = EV_CODE_MOUSE_CLICK1;
  122.         ClickSecs = im->Seconds;
  123.         ClickMics = im->Micros;
  124.     }
  125.     break;
  126.     case IDCMP_MOUSEMOVE:
  127.     if(im->Qualifier & (IEQUALIFIER_MIDBUTTON | IEQUALIFIER_RBUTTON
  128.                 | IEQUALIFIER_LEFTBUTTON))
  129.     {
  130.         *mods |= EV_TYPE_MOUSE;
  131.         *code = EV_CODE_MOUSE_MOVE;
  132.     }
  133.     break;
  134.     }
  135. }
  136.  
  137. int
  138. cook_key(struct IntuiMessage *im, u_char *buf, int buflen)
  139. {
  140.     struct InputEvent ie;
  141.     ie.ie_Class = IECLASS_RAWKEY;
  142.     ie.ie_SubClass = 0;
  143.     ie.ie_Code = im->Code;
  144.     ie.ie_Qualifier = im->Qualifier;
  145.     ie.ie_EventAddress = *((APTR *)im->IAddress);
  146.     return(MapRawKey(&ie, buf, buflen, NULL));
  147. }
  148.  
  149. /*
  150.  * Stuff to translate textual key descriptions into key codes
  151.  */
  152.  
  153. typedef struct KeyDesc
  154. {
  155.     u_char     *kd_Name;
  156.     u_long      kd_Mods;
  157.     u_long      kd_Code;
  158. } KeyDesc;
  159.  
  160. static const KeyDesc KeyDescr[] =
  161. {
  162.     "Shift",    EV_MOD_SHIFT, 0,
  163.     "SFT",      EV_MOD_SHIFT, 0,
  164.     "Ctrl",     EV_MOD_CTRL, 0,
  165.     "Control",  EV_MOD_CTRL, 0,
  166.     "CTL",      EV_MOD_CTRL, 0,
  167.     "Meta",     EV_MOD_META, 0,
  168.     "Mod1",     EV_MOD_MOD1, 0,
  169.     "Mod2",     EV_MOD_MOD2, 0,
  170.     "Amiga",    EV_MOD_MOD2, 0,
  171.     "Mod3",     EV_MOD_MOD3, 0,
  172.     "Mod4",     EV_MOD_MOD4, 0,
  173.     "LMB",      EV_MOD_LMB, 0,
  174.     "Button1",  EV_MOD_BUTTON1, 0,
  175.     "MMB",      EV_MOD_MMB, 0,
  176.     "Button2",  EV_MOD_BUTTON2, 0,
  177.     "RMB",      EV_MOD_RMB, 0,
  178.     "Button3",  EV_MOD_BUTTON3, 0,
  179.     "Button4",  EV_MOD_BUTTON4, 0,
  180.     "Button5",  EV_MOD_BUTTON5, 0,
  181.  
  182.     "SPC",       EV_TYPE_KEYBD, 0x40,
  183.     "Space",     EV_TYPE_KEYBD, 0x40,
  184.     "Spacebar",  EV_TYPE_KEYBD, 0x40,
  185.     "BS",        EV_TYPE_KEYBD, 0x41,
  186.     "Backspace", EV_TYPE_KEYBD, 0x41,
  187.     "TAB",       EV_TYPE_KEYBD, 0x42,
  188.     "RET",       EV_TYPE_KEYBD, 0x44,
  189.     "Return",    EV_TYPE_KEYBD, 0x44,
  190.     "ESC",       EV_TYPE_KEYBD, 0x45,
  191.     "Escape",    EV_TYPE_KEYBD, 0x45,
  192.     "DEL",       EV_TYPE_KEYBD, 0x46,
  193.     "Delete",    EV_TYPE_KEYBD, 0x46,
  194.     "Help",      EV_TYPE_KEYBD, 0x5f,
  195.     "Up",        EV_TYPE_KEYBD, 0x4c,
  196.     "Down",      EV_TYPE_KEYBD, 0x4d,
  197.     "Right",     EV_TYPE_KEYBD, 0x4e,
  198.     "Left",      EV_TYPE_KEYBD, 0x4f,
  199.     "F1",        EV_TYPE_KEYBD, 0x50,
  200.     "F2",        EV_TYPE_KEYBD, 0x51,
  201.     "F3",        EV_TYPE_KEYBD, 0x52,
  202.     "F4",        EV_TYPE_KEYBD, 0x53,
  203.     "F5",        EV_TYPE_KEYBD, 0x54,
  204.     "F6",        EV_TYPE_KEYBD, 0x55,
  205.     "F7",        EV_TYPE_KEYBD, 0x56,
  206.     "F8",        EV_TYPE_KEYBD, 0x57,
  207.     "F9",        EV_TYPE_KEYBD, 0x58,
  208.     "F10",       EV_TYPE_KEYBD, 0x59,
  209.  
  210.     /* Numeric keypad */
  211.     "KP_Enter",   EV_TYPE_KEYBD, 0x43,
  212.     "KP_Multiply",EV_TYPE_KEYBD, 0x5d,
  213.     "KP_Divide",  EV_TYPE_KEYBD, 0x5c,
  214.     "KP_Minus",   EV_TYPE_KEYBD, 0x4a,
  215.     "KP_Add",     EV_TYPE_KEYBD, 0x5e,
  216.     "KP_Decimal", EV_TYPE_KEYBD, 0x39,
  217.     "KP_0",       EV_TYPE_KEYBD, 0x0a,
  218.     "KP_1",       EV_TYPE_KEYBD, 0x1d,
  219.     "KP_2",       EV_TYPE_KEYBD, 0x1e,
  220.     "KP_3",       EV_TYPE_KEYBD, 0x1f,
  221.     "KP_4",       EV_TYPE_KEYBD, 0x2d,
  222.     "KP_5",       EV_TYPE_KEYBD, 0x2e,
  223.     "KP_6",       EV_TYPE_KEYBD, 0x2f,
  224.     "KP_7",       EV_TYPE_KEYBD, 0x3d,
  225.     "KP_8",       EV_TYPE_KEYBD, 0x3e,
  226.     "KP_9",       EV_TYPE_KEYBD, 0x3f,
  227.  
  228.     /* Mouse events */
  229.     "Click1",     EV_TYPE_MOUSE, EV_CODE_MOUSE_CLICK1,
  230.     "Click2",     EV_TYPE_MOUSE, EV_CODE_MOUSE_CLICK2,
  231.     "Off",        EV_TYPE_MOUSE, EV_CODE_MOUSE_UP,
  232.     "Move",       EV_TYPE_MOUSE, EV_CODE_MOUSE_MOVE,
  233.  
  234.     NULL, 0, 0
  235. };
  236.  
  237. /* Puts the integers defining the event described in DESC into CODE and
  238.    MODS.  */
  239. bool
  240. lookup_event(u_long *code, u_long *mods, u_char *desc)
  241. {
  242.     bool rc = TRUE;
  243.     u_char *str = desc;
  244.     *code = *mods = 0;
  245.     for(;;)
  246.     {
  247.     u_char buff[100];
  248.     u_char *tmp = buff;
  249.     u_char c = *str++;
  250.     const KeyDesc *kd = KeyDescr;
  251.     /* Get this one token.  The first character is read separately to
  252.        allow minus characters to be used to represent itself as well as
  253.        to terminate a token. */
  254.     if(c != 0)
  255.     {
  256.         *tmp++ = c;
  257.         while((c = *str) && (c != '-'))
  258.         {
  259.         *tmp++ = c;
  260.         str++;
  261.         }
  262.     }
  263.     else
  264.         goto error;
  265.     *tmp = 0;
  266.     if(*str)
  267.         str++;
  268.     while(kd->kd_Name)
  269.     {
  270.         if(!stricmp(kd->kd_Name, buff))
  271.         {
  272.         *mods |= kd->kd_Mods;
  273.         *code |= kd->kd_Code;
  274.         if(*mods & EV_TYPE_MASK)
  275.             goto end;
  276.         break;
  277.         }
  278.         kd++;
  279.     }
  280.     if(!kd->kd_Name)
  281.     {
  282.         u_char coded[2];
  283.         if(MapANSI(buff, strlen(buff), coded, 1, NULL) == 1)
  284.         {
  285.         *mods |= EV_TYPE_KEYBD;
  286.         *mods = translate_quals(*mods, (UWORD)coded[1]);
  287.         *code = (u_long)coded[0];
  288.         goto end;
  289.         }
  290.         else
  291.         {
  292.         error:
  293.         cmd_signal(sym_bad_event_desc, LIST_1(string_dup(desc)));
  294.         rc = FALSE;
  295.         goto end;
  296.         }
  297.     }
  298.     }
  299. end:
  300.     return(rc);
  301. }
  302.  
  303. /* Constructs the name of the event defined by CODE and MODS in BUF.  */
  304. bool
  305. lookup_event_name(u_char *buf,