home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 5 / FreshFish_July-August1994.bin / bbs / util / jade-3.0.lha / Jade / src / amiga_keys.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-19  |  7.7 KB  |  272 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 translateevent(Event *, struct IntuiMessage *);
  33. _PR int  cookkey(struct IntuiMessage *, u_char *, int);
  34. _PR int  lookupevent(EventDef *, u_char *);
  35.  
  36. static void
  37. translatequals(EventDef *evd, u_short qual)
  38. {
  39.     if(qual & SHIFTQUALS)
  40.     evd->evd_Mods |= EV_MOD_SHIFT;
  41.     if(qual & ALTQUALS)
  42.     evd->evd_Mods |= EV_MOD_META;
  43.     if(qual & CMDQUALS)
  44.     evd->evd_Mods |= EV_MOD_MOD2; /* Amiga keys */
  45.     if(qual & IEQUALIFIER_CONTROL)
  46.     evd->evd_Mods |= EV_MOD_CTRL;
  47.     if(qual & IEQUALIFIER_CAPSLOCK)
  48.     evd->evd_Mods ^= EV_MOD_SHIFT;
  49.     if(qual & IEQUALIFIER_LEFTBUTTON)
  50.     evd->evd_Mods |= EV_MOD_LMB;
  51.     if(qual & IEQUALIFIER_MIDBUTTON)
  52.     evd->evd_Mods |= EV_MOD_MMB;
  53.     if(qual & IEQUALIFIER_RBUTTON)
  54.     evd->evd_Mods |= EV_MOD_RMB;
  55. }
  56.  
  57. /*
  58.  * Takes an IntuiMsg and converts it's contents to an EVENT
  59.  */
  60. void
  61. translateevent(Event *ev, struct IntuiMessage *im)
  62. {
  63.     static u_long ClickMics, ClickSecs;
  64.     translatequals(&ev->ev_EventDef, im->Qualifier);
  65.     switch(im->Class)
  66.     {
  67.     case IDCMP_RAWKEY:
  68.     /* This magic means that we disreguard all upcodes and qualifiers.  */
  69.     if((im->Code > 0x7f) || ((im->Code >= 0x60) && (im->Code <= 0x67)))
  70.         return;
  71.     ev->ev_EventDef.evd_Type = EV_TYPE_KEYBD;
  72.     ev->ev_EventDef.evd_Code = (ULONG)im->Code;
  73.     break;
  74.     case IDCMP_MOUSEBUTTONS:
  75.     ev->ev_EventDef.evd_Type = EV_TYPE_MOUSE;
  76.     if(im->Code & IECODE_UP_PREFIX)
  77.     {
  78.         ev->ev_EventDef.evd_Code = EV_CODE_MOUSE_UP;
  79.         switch(im->Code & ~IECODE_UP_PREFIX)
  80.         {
  81.         case IECODE_LBUTTON:
  82.         ev->ev_EventDef.evd_Mods |= EV_MOD_LMB;
  83.         break;
  84.         case IECODE_MBUTTON:
  85.         ev->ev_EventDef.evd_Mods |= EV_MOD_MMB;
  86.         break;
  87.         case IECODE_RBUTTON:
  88.         ev->ev_EventDef.evd_Mods |= EV_MOD_RMB;
  89.         break;
  90.         }
  91.     }
  92.     else
  93.     {
  94.         if(DoubleClick(ClickSecs, ClickMics, im->Seconds, im->Micros))
  95.         ev->ev_EventDef.evd_Code = EV_CODE_MOUSE_CLICK2;
  96.         else
  97.         ev->ev_EventDef.evd_Code = EV_CODE_MOUSE_CLICK1;
  98.         ClickSecs = im->Seconds;
  99.         ClickMics = im->Micros;
  100.     }
  101.     break;
  102.     case IDCMP_MOUSEMOVE:
  103.     if(im->Qualifier & (IEQUALIFIER_MIDBUTTON | IEQUALIFIER_RBUTTON | IEQUALIFIER_LEFTBUTTON))
  104.     {
  105.         ev->ev_EventDef.evd_Type = EV_TYPE_MOUSE;
  106.         ev->ev_EventDef.evd_Code = EV_CODE_MOUSE_MOVE;
  107.     }
  108.     break;
  109.     }
  110. }
  111.  
  112. int
  113. cookkey(struct IntuiMessage *im, u_char *buf, int buflen)
  114. {
  115.     struct InputEvent ie;
  116.     ie.ie_Class = IECLASS_RAWKEY;
  117.     ie.ie_SubClass = 0;
  118.     ie.ie_Code = im->Code;
  119.     ie.ie_Qualifier = im->Qualifier;
  120.     ie.ie_EventAddress = *((APTR *)im->IAddress);
  121.     return(MapRawKey(&ie, buf, buflen, NULL));
  122. }
  123.  
  124. /*
  125.  * Stuff to translate textual key descriptions into key codes
  126.  */
  127.  
  128. typedef struct KeyDesc
  129. {
  130.     u_char     *kd_Name;
  131.     EventDef      kd_Event;
  132. } KeyDesc;
  133.  
  134. static const KeyDesc KeyDescr[] =
  135. {
  136.     "SHIFT",    { 0, EV_MOD_SHIFT, 0 },
  137.     "SFT",      { 0, EV_MOD_SHIFT, 0 },
  138.     "CONTROL",  { 0, EV_MOD_CTRL, 0 },
  139.     "CTRL",     { 0, EV_MOD_CTRL, 0 },
  140.     "CTL",      { 0, EV_MOD_CTRL, 0 },
  141.     "MOD1",     { 0, EV_MOD_MOD1, 0 },
  142.     "META",     { 0, EV_MOD_META, 0 },
  143.     "MOD2",     { 0, EV_MOD_MOD2, 0 },
  144.     "AMIGA",    { 0, EV_MOD_MOD2, 0 },
  145.     "MOD3",     { 0, EV_MOD_MOD3, 0 },
  146.     "MOD4",     { 0, EV_MOD_MOD4, 0 },
  147.     "BUTTON1",  { 0, EV_MOD_BUTTON1, 0 },
  148.     "LMB",      { 0, EV_MOD_LMB, 0 },
  149.     "BUTTON2",  { 0, EV_MOD_BUTTON2, 0 },
  150.     "MMB",      { 0, EV_MOD_MMB, 0 },
  151.     "BUTTON3",  { 0, EV_MOD_BUTTON3, 0 },
  152.     "RMB",      { 0, EV_MOD_RMB, 0 },
  153.     "BUTTON4",  { 0, EV_MOD_BUTTON4, 0 },
  154.     "BUTTON5",  { 0, EV_MOD_BUTTON5, 0 },
  155.  
  156.     "SPACE",     { EV_TYPE_KEYBD, 0, 0x40 },
  157.     "SPACEBAR",  { EV_TYPE_KEYBD, 0, 0x40 },
  158.     "SPC",       { EV_TYPE_KEYBD, 0, 0x40 },
  159.     "BACKSPACE", { EV_TYPE_KEYBD, 0, 0x41 },
  160.     "BS",        { EV_TYPE_KEYBD, 0, 0x41 },
  161.     "TAB",       { EV_TYPE_KEYBD, 0, 0x42 },
  162.     "RETURN",    { EV_TYPE_KEYBD, 0, 0x44 },
  163.     "RET",       { EV_TYPE_KEYBD, 0, 0x44 },
  164.     "ESC",       { EV_TYPE_KEYBD, 0, 0x45 },
  165.     "ESCAPE",    { EV_TYPE_KEYBD, 0, 0x45 },
  166.     "DEL",       { EV_TYPE_KEYBD, 0, 0x46 },
  167.     "DELETE",    { EV_TYPE_KEYBD, 0, 0x46 },
  168.     "HELP",      { EV_TYPE_KEYBD, 0, 0x5f },
  169.     "UP",        { EV_TYPE_KEYBD, 0, 0x4c },
  170.     "DOWN",      { EV_TYPE_KEYBD, 0, 0x4d },
  171.     "RIGHT",     { EV_TYPE_KEYBD, 0, 0x4e },
  172.     "LEFT",      { EV_TYPE_KEYBD, 0, 0x4f },
  173.     "F1",        { EV_TYPE_KEYBD, 0, 0x50 },
  174.     "F2",        { EV_TYPE_KEYBD, 0, 0x51 },
  175.     "F3",        { EV_TYPE_KEYBD, 0, 0x52 },
  176.     "F4",        { EV_TYPE_KEYBD, 0, 0x53 },
  177.     "F5",        { EV_TYPE_KEYBD, 0, 0x54 },
  178.     "F6",        { EV_TYPE_KEYBD, 0, 0x55 },
  179.     "F7",        { EV_TYPE_KEYBD, 0, 0x56 },
  180.     "F8",        { EV_TYPE_KEYBD, 0, 0x57 },
  181.     "F9",        { EV_TYPE_KEYBD, 0, 0x58 },
  182.     "F10",       { EV_TYPE_KEYBD, 0, 0x59 },
  183.  
  184.     /*
  185.      * numeric keypad
  186.      */
  187.     "KP_ENTER",   { EV_TYPE_KEYBD, 0, 0x43 },
  188.     "KP_MULTIPLY", { EV_TYPE_KEYBD, 0, 0x5d },
  189.     "KP_DIVIDE",  { EV_TYPE_KEYBD, 0, 0x5c },
  190.     "KP_MINUS",   { EV_TYPE_KEYBD, 0, 0x4a },
  191.     "KP_ADD",     { EV_TYPE_KEYBD, 0, 0x5e },
  192.     "KP_DECIMAL", { EV_TYPE_KEYBD, 0, 0x39 },
  193.     "KP_0",       { EV_TYPE_KEYBD, 0, 0x0a },
  194.     "KP_1",       { EV_TYPE_KEYBD, 0, 0x1d },
  195.     "KP_2",       { EV_TYPE_KEYBD, 0, 0x1e },
  196.     "KP_3",       { EV_TYPE_KEYBD, 0, 0x1f },
  197.     "KP_4",       { EV_TYPE_KEYBD, 0, 0x2d },
  198.     "KP_5",       { EV_TYPE_KEYBD, 0, 0x2e },
  199.     "KP_6",       { EV_TYPE_KEYBD, 0, 0x2f },
  200.     "KP_7",       { EV_TYPE_KEYBD, 0, 0x3d },
  201.     "KP_8",       { EV_TYPE_KEYBD, 0, 0x3e },
  202.     "KP_9",       { EV_TYPE_KEYBD, 0, 0x3f },
  203.  
  204.     /* mouse events
  205.      */
  206.     "CLICK1",     { EV_TYPE_MOUSE, 0, EV_CODE_MOUSE_CLICK1 },
  207.     "CLICK2",     { EV_TYPE_MOUSE, 0, EV_CODE_MOUSE_CLICK2 },
  208.     "OFF",        { EV_TYPE_MOUSE, 0, EV_CODE_MOUSE_UP },
  209.     "MOVE",       { EV_TYPE_MOUSE, 0, EV_CODE_MOUSE_MOVE },
  210.  
  211.     NULL, 0, 0
  212. };
  213.  
  214. /*
  215.  */
  216. int
  217. lookupevent(EventDef *ie, u_char *desc)
  218. {
  219.     int rc = TRUE;
  220.     u_char *str = desc;
  221.     for(;;)
  222.     {
  223.     u_char buff[100];
  224.     u_char *tmp = buff;
  225.     u_char c;
  226.     const KeyDesc *kd = KeyDescr;
  227.     /*
  228.      * get this one token
  229.      */
  230.     while((c = *str) && (c != '-') && (c != ' '))
  231.     {
  232.         if(c == '\\')
  233.         str++;
  234.         *tmp++ = *str++;
  235.     }
  236.     *tmp = 0;
  237.     if(*str)
  238.         str++;
  239.     while(kd->kd_Name)
  240.     {
  241.         if(!stricmp(kd->kd_Name, buff))
  242.         {
  243.         ie->evd_Mods |= kd->kd_Event.evd_Mods;
  244.         ie->evd_Code |= kd->kd_Event.evd_Code;
  245.         if(ie->evd_Type = kd->kd_Event.evd_Type)
  246.             goto end;
  247.         break;
  248.         }
  249.         kd++;
  250.     }
  251.     if(!kd->kd_Name)
  252.     {
  253.         u_char coded[2];
  254.         if(MapANSI(buff, strlen(buff), coded, 1, NULL) == 1)
  255.         {
  256.         ie->evd_Type = EV_TYPE_KEYBD;
  257.         translatequals(ie, (UWORD)coded[1]);
  258.         ie->evd_Code = (ULONG)coded[0];
  259.         goto end;
  260.         }
  261.         else
  262.         {
  263.         cmd_signal(sym_bad_event_desc, LIST_1(valstrdup(desc)));
  264.         rc = FALSE;
  265.         goto end;
  266.         }
  267.     }
  268.     }
  269. end:
  270.     return(rc);
  271. }
  272.