home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD1.bin / new / util / cdity / yak / src / keydef_window.c < prev    next >
C/C++ Source or Header  |  1994-10-13  |  20KB  |  636 lines

  1. #include <exec/types.h>
  2. #include <exec/memory.h>
  3. #include <dos/dosextens.h>
  4. #include <graphics/displayinfo.h>
  5. #include <graphics/gfxbase.h>
  6. #include <graphics/gfxmacros.h>
  7. #include <intuition/intuition.h>
  8. #include <intuition/classes.h>
  9. #include <intuition/classusr.h>
  10. #include <intuition/imageclass.h>
  11. #include <intuition/gadgetclass.h>
  12. #include <intuition/intuitionbase.h>
  13. #include <libraries/gadtools.h>
  14. #include <libraries/commodities.h>
  15. #include <proto/commodities.h>
  16. #include <proto/keymap.h>
  17. #include <proto/exec.h>
  18. #include <proto/intuition.h>
  19. #include <proto/gadtools.h>
  20. #include <proto/graphics.h>
  21. #include <proto/locale.h>
  22. #include <proto/utility.h>
  23. #include <proto/dos.h>
  24. #include <string.h>
  25. #include <ctype.h>
  26.  
  27.  
  28. #include "code.h"
  29. #include "version.h"
  30. #include "hotkey_types.h"
  31. #include "yak.h"
  32. #include "gui.h"
  33. #include "KeyDef_Window.h"
  34.  
  35. #define CATCOMP_NUMBERS
  36. #include "locale/yak_locale_strings.h"
  37.  
  38.  
  39. extern LONG (*HandleIDCMP)(void);
  40.  
  41.  
  42. struct Window         *KeyDefWnd    = NULL;
  43. struct Gadget         *KeyDefGList  = NULL;
  44. struct Gadget         *KeyDefGadgets[KeyDef_CNT];
  45. UWORD                  KeyDefLeft   = 0;
  46. UWORD                  KeyDefTop    = 0;
  47. UWORD                  KeyDefWidth  = 517;
  48. UWORD                  KeyDefHeight = 85;
  49. UBYTE                 *KeyDefWdt    = NULL;
  50.  
  51. IMPORT YakHotKey      *curhk;
  52. IMPORT UWORD           curtype;
  53.  
  54. static YakKeyDef       KeyDef;
  55.  
  56.  
  57.  
  58. UBYTE *Class0Labels[5];
  59.  
  60. void
  61. InitClass0Labels()
  62. {
  63.     Class0Labels[0] = getString(RawKey_CLASS);
  64.     Class0Labels[1] = getString(RawMouse_CLASS);
  65.     Class0Labels[2] = getString(DiskInserted_CLASS);
  66.     Class0Labels[3] = getString(DiskRemoved_CLASS);
  67.     Class0Labels[4] = NULL;
  68. }
  69.  
  70.  
  71. UBYTE *Stroke0Labels[4];
  72.  
  73. void
  74. InitStroke0Labels()
  75. {
  76.     Stroke0Labels[0] = getString(Down_STROKE);
  77.     Stroke0Labels[1] = getString(Up_STROKE);
  78.     Stroke0Labels[2] = getString(Down_Up_STROKE);
  79.     Stroke0Labels[3] = NULL;
  80. }
  81.  
  82.  
  83. UWORD KeyDefGTypes[] = 
  84. {
  85.         CYCLE_KIND,
  86.         CYCLE_KIND,
  87.         STRING_KIND,
  88.         BUTTON_KIND,
  89.         BUTTON_KIND
  90. };
  91.  
  92. struct NewGadget KeyDefNGad[] = {
  93.          66, 13, 166, 13, NULL, NULL, GD_Class,  PLACETEXT_LEFT, NULL, NULL,
  94.         325, 13, 186, 13, NULL, NULL, GD_Stroke, PLACETEXT_LEFT, NULL, NULL,
  95.         108, 38, 403, 14, NULL, NULL, GD_Desc,   PLACETEXT_LEFT, NULL, NULL,
  96.           6, 68,  79, 13, NULL, NULL, GD_Ok,     PLACETEXT_IN,   NULL, NULL,
  97.         431, 68,  79, 13, NULL, NULL, GD_Cancel, PLACETEXT_IN,   NULL, NULL
  98. };
  99.  
  100.  
  101. void InitKeyDefNGad (void)
  102. {
  103.     KeyDefNGad[GD_Class].ng_GadgetText  = getString(CLASS_STRING);
  104.     KeyDefNGad[GD_Stroke].ng_GadgetText = getString(STROKE_STRING);
  105.     KeyDefNGad[GD_Desc].ng_GadgetText   = getString(DESC_STRING);
  106.     KeyDefNGad[GD_Ok].ng_GadgetText     = getString(OK_STRING);
  107.     KeyDefNGad[GD_Cancel].ng_GadgetText = getString(CANCEL_STRING);
  108. }
  109.  
  110.  
  111.  
  112. ULONG KeyDefGTags[] = {
  113.         (GTCY_Labels), (ULONG)&Class0Labels[ 0 ], (TAG_DONE),
  114.         (GTCY_Labels), (ULONG)&Stroke0Labels[ 0 ], (TAG_DONE),
  115.         (GTST_MaxChars), 256, (TAG_DONE),
  116.         (TAG_DONE),
  117.         (TAG_DONE)
  118. };
  119.  
  120.  
  121.  
  122. static __regargs void
  123. ConvertQualifiers(UWORD qual, UWORD iqual, UWORD squal, char *qualstr)
  124. {
  125.     UWORD i;
  126.  
  127.     *qualstr = '\0';
  128.  
  129.     for (i=0; i<SAMEQUALIFIERS_NUMBER; i++)
  130.     {
  131.         if ((qual & squal & SameQualifierArray[i].qat_ID) == SameQualifierArray[i].qat_ID)
  132.         {
  133.            *qualstr++ = ' ';
  134.            qualstr = stpcpy(qualstr, SameQualifierArray[i].qat_Str);
  135.         }
  136.         if ((iqual & squal & SameQualifierArray[i].qat_ID) == SameQualifierArray[i].qat_ID)
  137.         {
  138.            *qualstr++ = ' ';
  139.            *qualstr++ = '-';
  140.            qualstr = stpcpy(qualstr, SameQualifierArray[i].qat_Str);
  141.         }
  142.  
  143.     }
  144.  
  145.     qual  &= ~squal;
  146.     iqual &= ~squal;
  147.     for (i=0; i<QUALIFIERS_NUMBER; i++)
  148.     {
  149.         if (qual & QualifierArray[i].qat_ID)
  150.         {
  151.            *qualstr++ = ' ';
  152.            qualstr = stpcpy(qualstr, QualifierArray[i].qat_Str);
  153.         }
  154.         if (iqual & QualifierArray[i].qat_ID)
  155.         {
  156.            *qualstr++ = ' ';
  157.            *qualstr++ = '-';
  158.            qualstr = stpcpy(qualstr, QualifierArray[i].qat_Str);
  159.         }
  160.     }
  161. }
  162.  
  163.  
  164. static __regargs BOOL
  165. ConvertCode(UWORD code, char *codestr)
  166. {
  167.   *codestr = '\0';
  168.  
  169.   if (code != NO_IECODE)
  170.   {
  171.       struct InputEvent ievent;
  172.       UWORD  i;
  173.  
  174.       for (i=0; i<CODES_NUMBER; i++)
  175.       {
  176.           if (code == CodeArray[i].cat_Code)
  177.           {
  178.               codestr[0] = ' ';
  179.               strcpy(codestr+1, CodeArray[i].cat_Str);
  180.               return TRUE;
  181.           }
  182.  
  183.       }
  184.  
  185.       ievent.ie_Class         = IECLASS_RAWKEY;
  186.       ievent.ie_Code          = code;
  187.       ievent.ie_Qualifier     = NO_IEQUALIFIER;
  188.       ievent.ie_Prev1DownCode = ievent.ie_Prev1DownQual = NO_IEQUALIFIER;
  189.       ievent.ie_Prev2DownCode = ievent.ie_Prev2DownQual = NO_IEQUALIFIER;
  190.  
  191.       if((MapRawKey(&ievent, codestr+1, 1, NULL) == 1) &&
  192.          (codestr[1] != '-'))             /* forbidden */
  193.       {
  194.           codestr[0] = ' ';
  195.           codestr[2] = '\0';
  196.           return TRUE;
  197.       }
  198.   }
  199.   return FALSE;
  200. }
  201.  
  202.  
  203.  
  204.  
  205.  
  206.  
  207. static __regargs BOOL
  208. BuildKeyDef(YakKeyDef *ykd, STRPTR desc)
  209. {
  210.   BOOL  ret;
  211.   UBYTE codestr[20], qualstr[110];
  212.  
  213.   ConvertQualifiers(ykd->ykd_Qual, ykd->ykd_IQual, ykd->ykd_SQual, qualstr);
  214.  
  215.   if (ykd->ykd_Class > HKCLASS_RAWMOUSE)
  216.       ret = TRUE;
  217.   else
  218.       ret = ConvertCode(ykd->ykd_Code, codestr);
  219.  
  220.   stpcpy(desc, ClassArray[ykd->ykd_Class]);
  221.   strcat(desc, qualstr);
  222.   strcat(desc, StrokeArray[ykd->ykd_Stroke]);
  223.   strcat(desc, codestr);
  224.  
  225.   return ret;
  226.  
  227. }
  228.  
  229.  
  230. /* initialise all gadgets of keydef window */
  231. static void
  232. InitKeyDefGadgets(void)
  233. {
  234.     UBYTE SeqString[127];
  235.     BOOL SeqOk = BuildKeyDef(&KeyDef, SeqString);
  236.  
  237.     InitWindowGadget(GDX_Class,  GTCY_Active, KeyDef.ykd_Class,  KEYDEF_WINDOW);
  238.     InitWindowGadget(GDX_Desc,   GTST_String, (LONG)SeqString,   KEYDEF_WINDOW);
  239.     InitWindowGadget(GDX_Stroke, GTCY_Active, KeyDef.ykd_Stroke, KEYDEF_WINDOW);
  240.     InitWindowGadget(GDX_Stroke, GA_Disabled, KeyDef.ykd_Class,  KEYDEF_WINDOW);
  241.     InitWindowGadget(GDX_Ok,     GA_Disabled, !SeqOk,            KEYDEF_WINDOW);
  242. }
  243.  
  244.  
  245. static __regargs LONG
  246. ParseKeyDef(STRPTR desc, YakKeyDef *ykd)
  247. {
  248.     IX   ix;
  249.     LONG ret;
  250.  
  251.  
  252.     if (!(ret=ParseIX(desc, &ix)))
  253.     {
  254.         /* Class ? */
  255.         switch(ix.ix_Class)
  256.         {
  257.             case IECLASS_RAWKEY:
  258.                 ykd->ykd_Class = HKCLASS_RAWKEY;
  259.                 break;
  260.             case IECLASS_RAWMOUSE:
  261.                 ykd->ykd_Class = HKCLASS_RAWMOUSE;
  262.                 break;
  263.             case IECLASS_DISKINSERTED:
  264.                 ykd->ykd_Class = HKCLASS_DISKINSERTED;
  265.                 break;
  266.             case IECLASS_DISKREMOVED:
  267.                 ykd->ykd_Class = HKCLASS_DISKREMOVED;
  268.                 break;
  269.             default:
  270.                 return -1;
  271.         }
  272.  
  273.         /* Qualifier ? */
  274.         ykd->ykd_Qual  =  ix.ix_Qualifier;
  275.         ykd->ykd_IQual = ~ix.ix_QualMask;
  276.  
  277.         ykd->ykd_SQual = NO_IEQUALIFIER;
  278.         if (ix.ix_QualSame & IXSYM_SHIFT) ykd->ykd_SQual |= IXSYM_SHIFTMASK;
  279.         if (ix.ix_QualSame & IXSYM_CAPS)  ykd->ykd_SQual |= IXSYM_CAPSMASK;
  280.         if (ix.ix_QualSame & IXSYM_ALT)   ykd->ykd_SQual |= IXSYM_ALTMASK;
  281.  
  282.         /* Stroke ? */
  283.         if (ix.ix_Code & IECODE_UP_PREFIX)
  284.             ykd->ykd_Stroke = HKSTROKE_UP;
  285.         else
  286.             if (~ix.ix_CodeMask & IECODE_UP_PREFIX)
  287.                 ykd->ykd_Stroke = HKSTROKE_DOWN_UP;
  288.             else
  289.                 ykd->ykd_Stroke = HKSTROKE_DOWN;
  290.  
  291.         /* Code ? */
  292.         if (!ix.ix_Code && (ix.ix_Class == IECLASS_RAWMOUSE))
  293.             ykd->ykd_Code = NO_IECODE;
  294.         else
  295.             ykd->ykd_Code = ix.ix_Code & ~IECODE_UP_PREFIX;
  296.     }
  297.     else
  298.     {
  299.         if (ret == -2)  /* NULL description */
  300.         {
  301.             ykd->ykd_Class  = HKCLASS_RAWKEY;
  302.             ykd->ykd_Qual   = ykd->ykd_IQual = ykd->ykd_SQual = NO_IEQUALIFIER;
  303.             ykd->ykd_Stroke = HKSTROKE_DOWN;
  304.             ykd->ykd_Code   = NO_IECODE;
  305.         }
  306.     }
  307.  
  308.     return ret;
  309. }
  310.  
  311. static __regargs UWORD
  312. IsQualifierPad(UWORD code)
  313. {
  314.     UWORD i;
  315.  
  316.     for (i=0; i<QUALIFIERSPAD_NUMBER; i++)
  317.         if (QualifierPadArray[i].qpat_Code == code)
  318.             return Qual