home *** CD-ROM | disk | FTP | other *** search
/ The Fred Fish Collection 1.5 / ffcollection-1-5-1992-11.iso / ff_disks / 600-699 / ff667.lha / PopUpMenu / Source / Options.c < prev    next >
Text File  |  1992-05-21  |  16KB  |  424 lines

  1. /* This is needed for Lattice bug with 16 bit ints */
  2. #undef RMBTRAP
  3. #define RMBTRAP 0x00010000L
  4.  
  5.  
  6. #define SHOWSINGLEMENU       0
  7. #define SUBITEMPOINTER       1
  8. #define ITEMSCENTERED       2
  9. #define POPUPWITHQUAL       3
  10. #define POPUPNOQUAL       4
  11. #define CLICKMENUES       5
  12. #define OPENWINDOW       6
  13. #define EXIT           7
  14.  
  15. #define RESET           0x100
  16. #define CANCEL           0x200
  17. #define REMOVE           0x300
  18. #define USE           0x400
  19.  
  20. #define HOTKEYQUAL       (IEQUALIFIER_CONTROL|IEQUALIFIER_LALT)
  21. static USHORT
  22.   chip CheckOffData[] = {0x0000,0x0000, 0x07f0,0x0000, 0x3c1e,0x0000,
  23.              0x6003,0x0000, 0xc001,0x8000, 0xc001,0x8000,
  24.              0xc001,0x8000, 0x6003,0x0000, 0x3c1e,0x0000,
  25.              0x07f0,0x0000},
  26.   chip CheckOnData[]  = {0x0000,0xf000, 0x07f3,0xf800, 0x3c1f,0xf000,
  27.              0x7e3f,0xe000, 0xff7f,0x8000, 0xdffd,0x8000,
  28.              0xcff1,0x8000, 0x67e3,0x0000, 0x3fde,0x0000,
  29.              0x07f0,0x0000,
  30.              0x0000,0x0000, 0x0000,0xf000, 0x0003,0xe000,
  31.              0x1c0f,0x0000, 0x1e3c,0x0000, 0x0f70,0x0000,
  32.              0x07e0,0x0000, 0x03c0,0x0000, 0x0180,0x0000,
  33.              0x0000,0x0000},
  34.  
  35.   chip LogoData[]    = { 0x7FF0,0x0000,0x6180,0x0780,0x0800,0x0000,0x0000,0x0000,0x0000,0x0000,
  36.              0x8C18,0x0000,0xE180,0x08C0,0x1800,0x0000,0x0000,0x0000,0x0000,0x0000,
  37.              0x0C18,0x0000,0x6180,0x00E0,0x3800,0x0000,0x0000,0x0000,0x0000,0x0000,
  38.              0x0C10,0xF8CC,0x618C,0xC0F0,0x783C,0x2618,0xC000,0x0000,0x0080,0x7000,
  39.              0x0FE1,0x0DD6,0x619D,0x60D8,0xD846,0x6B38,0xC000,0x0000,0x0480,0x8800,
  40.              0x0C03,0x0CE6,0x618E,0x60CD,0x98C4,0xF318,0xC004,0x4E58,0x0480,0x3000,
  41.              0x0C03,0x0CC6,0x63AC,0x60C7,0x19F8,0x6359,0xD004,0x5224,0x07C0,0x0800,
  42.              0x0C03,0x08C4,0x65CC,0x40C2,0x1AC2,0x639A,0xE002,0x9420,0x0084,0x8800,
  43.              0x0C01,0xF0F8,0x398F,0x8080,0x1C7C,0x630C,0x4001,0x0F20,0x01C4,0x7000,
  44.              0x1000,0x00C0,0x000C,0x0700,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  45.              0x0000,0x00C0,0x000C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  46.              0x0000,0x00C0,0x000C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  47.              0x0000,0x00C0,0x000C,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  48.              0x0000,0x0080,0x0008,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  49.              0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  50.  
  51.              0x7FF0,0x0000,0x6180,0x0780,0x09C0,0x0000,0x0000,0x0000,0x0000,0x0000,
  52.              0x9FFC,0x0000,0xF9E0,0x09E0,0x1A70,0x0000,0x0000,0x0000,0x0000,0x0000,
  53.              0x2FFF,0x0000,0x7FF8,0x02F8,0x3E80,0x0000,0x0000,0x0000,0x0000,0x0000,
  54.              0x0FD7,0xF8CC,0x7FFC,0xC0FC,0x7FBC,0x2618,0xC000,0x0000,0x0000,0x0000,
  55.              0x0FE5,0xBFF7,0x7FFF,0x70FE,0xDFCF,0x6BBE,0xF000,0x0000,0x0000,0x0000,
  56.              0x0FFB,0x4FFF,0xFFFF,0xFCFF,0xBFD7,0xFBFF,0xFC00,0x0000,0x0000,0x0000,
  57.              0x0FFF,0xDFFF,0xFFFF,0xFEFF,0xFFFD,0x7FFF,0xFC00,0x0000,0x0000,0x0000,
  58.              0x0FC3,0xFBFF,0xFFFF,0xFEFF,0xDFFE,0x7FFF,0xFC00,0x0000,0x0000,0x0000,
  59.              0x0FC1,0xF2FD,0x7FFF,0xD6BC,0xFFFF,0xFFFF,0xFD00,0x0000,0x0000,0x0000,
  60.              0x13C0,0x7CFE,0x4E7F,0xE72C,0x27BF,0x3EFB,0xBE00,0x0000,0x0000,0x0000,
  61.              0x04C0,0x1FFF,0x839F,0xF9C8,0x01C7,0xC630,0xC400,0x0000,0x0000,0x0000,
  62.              0x0100,0x00FC,0x000F,0xC070,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  63.              0x0000,0x00FC,0x000F,0xC000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  64.              0x0000,0x00BC,0x000B,0xC000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
  65.              0x0000,0x002C,0x0002,0xC000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000},
  66.  
  67.   chip NameData[]     = {0x899C,0xEE88,0x339C,0xE644,
  68.              0xDA52,0x44C8,0x4A52,0x4964,
  69.              0xABDC,0x44A8,0x7A5C,0x4F54,
  70.              0x8A52,0x4498,0x4A52,0x494C,
  71.              0x8A52,0x4E88,0x4B92,0xE944,
  72.              0x0000,0x0000,0x0000,0x0000,
  73.              0x0000,0x04C6,0x6000,0x0000,
  74.              0x0000,0x0D29,0x1000,0x0000,
  75.              0x0000,0x04E7,0x2000,0x0000,
  76.              0x0000,0x0421,0x4000,0x0000,
  77.              0x0000,0x0EC6,0x7000,0x0000};
  78.  
  79.           /* Normal gadget */
  80. static struct Image
  81.   CheckOff = { 0, 0, 21, 10, 1, CheckOffData, 1, 0, NULL },
  82.          /* Selected gadget */
  83.   CheckOn  = { 0, 0, 21, 10, 2, CheckOnData,  3, 0, NULL },
  84.          /* Name */
  85.   Name       = {170,3, 63, 11, 1, NameData,     1, 0, NULL },
  86.          /* PopUpMenu Logo */
  87.   Logo       = { 0, 0,149, 15, 2, LogoData,     3, 0, &Name};
  88.  
  89.          /* Upper & left border for small gadget */
  90. static SHORT
  91.   UpperVectors1[] = {  0, 0,   0,13,   1,12,   1, 0,  58, 0 },
  92.          /* Lower & right border for small gadget */
  93.   LowerVectors1[] = { 59,13,  59, 0,  58, 1,  58,13,   1,13 },
  94.          /* Upper & left border for big gadget */
  95.   UpperVectors2[] = {  0, 0,   0,13,   1,12,   1, 0, 148, 0 },
  96.          /* Lower & Right border for big gadget */
  97.   LowerVectors2[] = {149,13, 149, 0, 148, 1, 148,13,   1,13 };
  98.  
  99.          /* Small border */
  100. static struct Border
  101.   UpBorder1b  = {-2,-1, 2,0,JAM1, 5, LowerVectors1, NULL     },
  102.   UpBorder1a  = {-2,-1, 1,0,JAM1, 5, UpperVectors1, &UpBorder1b  },
  103.          /* Big border */
  104.   UpBorder2b  = {-2,-1, 2,0,JAM1, 5, LowerVectors2, NULL     },
  105.   UpBorder2a  = {-2,-1, 1,0,JAM1, 5, UpperVectors2, &UpBorder2b  };
  106.  
  107. static char
  108.   UseText[]    = {'U','s','e',0},
  109.   ResetText[]  = {'R','e','s','e','t',0},
  110.   CancelText[] = {'C','a','n','c','e','l',0},
  111.  
  112.   RemoveText[] = {'R','e','m','o','v','e',' ','P','o','p','U','p','M','e','n','u',0},
  113.   ClickText[]  = {'"','C','l','i','c','k','"',' ','m','e','n','u','e','s',' ','(','C',')',0},
  114.   SubText[]    = {'S','u','b','-','i','t','e','m',' ','p','o','i','n','t','e','r',' ','(','P',')',0},
  115.   ItemsText[]  = {'M','e','n','u','i','t','e','m','s',' ','c','e','n','t','e','r','e','d',' ','(','I',')',0},
  116.   SingleText[] = {'S','h','o','w',' ','s','i','n','g','l','e',' ','m','e','n','u',' ','(','S',')',0},
  117.   PopUpText[]  = {'P','o','p','-','u','p',' ','m','e','n','u','e','s',0},
  118.   WithText[]   = {'w','i','t','h',' ','(','W',')',0},
  119.   WithoutText[]= {'w','i','t','h','o','u','t',' ','(','N',')',0},
  120.   QualText[]   = {'q','u','a','l','i','f','i','e','r','s',0},
  121.   HotKeyText[] = {'H','o','t','k','e','y',':',' ','C','T','R','L',' ','+',' ','A','L','T',' ','+',0},
  122.  
  123.   KeyText[]   = {'Q',0},
  124.   BlankText[] = {' ',0};
  125.  
  126. static struct TextAttr
  127.   Topaz80 = {"topaz.font", TOPAZ_EIGHTY, 0, 0 };
  128.  
  129. static struct IntuiText
  130.   WinText13b = {1,0,JAM1, 93, 30, &Topaz80, ClickText,    NULL       },
  131.   WinText13a = {2,0,JAM1, 95, 31, &Topaz80, ClickText,    &WinText13b},
  132.   WinText12b = {1,0,JAM1, 93, 45, &Topaz80, SubText,    &WinText13a},
  133.   WinText12a = {2,0,JAM1, 95, 46, &Topaz80, SubText,    &WinText12b},
  134.   WinText11b = {1,0,JAM1, 93, 60, &Topaz80, SingleText, &WinText12a},
  135.   WinText11a = {2,0,JAM1, 95, 61, &Topaz80, SingleText, &WinText11b},
  136.   WinText10b = {1,0,JAM1, 93, 75, &Topaz80, ItemsText,    &WinText11a},
  137.   WinText10a = {2,0,JAM1, 95, 76, &Topaz80, ItemsText,    &WinText10b},
  138.   WinText09b = {1,0,JAM1,  5,100, &Topaz80, PopUpText,    &WinText10a},
  139.   WinText09a = {2,0,JAM1,  7,101, &Topaz80, PopUpText,    &WinText09b},
  140.   WinText08b = {1,0,JAM1,137, 92, &Topaz80, WithText,    &WinText09a},
  141.   WinText08a = {2,0,JAM1,139, 93, &Topaz80, WithText,    &WinText08b},
  142.   WinText07b = {1,0,JAM1,137,107, &Topaz80, WithoutText,&WinText08a},
  143.   WinText07a = {2,0,JAM1,139,108, &Topaz80, WithoutText,&WinText07b},
  144.   WinText06b = {1,0,JAM1,225,100, &Topaz80, QualText,    &WinText07a},
  145.   WinText06a = {2,0,JAM1,227,101, &Topaz80, QualText,    &WinText06b},
  146.   WinText05b = {1,0,JAM1, 67,122, &Topaz80, HotKeyText, &WinText06a},
  147.   WinText05a = {2,0,JAM1, 69,123, &Topaz80, HotKeyText, &WinText05b};
  148.  
  149. #define FIRSTWINTEXT WinText05a
  150.  
  151. /****************** Gadget text **********************/
  152. static struct IntuiText
  153.   UseIText1   = {3,0,JAM1, 17,2, &Topaz80, UseText,    NULL      },
  154.   UseIText    = {2,0,JAM1, 19,3, &Topaz80, UseText,    &UseIText1 },
  155.   ResIText1   = {3,0,JAM1,  9,2, &Topaz80, ResetText,  NULL      },
  156.   ResIText    = {2,0,JAM1, 11,3, &Topaz80, ResetText,  &ResIText1 },
  157.   CancIText1  = {3,0,JAM1,  5,2, &Topaz80, CancelText, NULL      },
  158.   CancIText   = {2,0,JAM1,  7,3, &Topaz80, CancelText, &CancIText1},
  159.   RemIText1   = {3,0,JAM1,  5,2, &Topaz80, RemoveText, NULL      },
  160.   RemIText    = {2,0,JAM1,  7,3, &Topaz80, RemoveText, &RemIText1 };
  161.  
  162. /* Hotkey */
  163. static struct IntuiText
  164.   HotKeyIText2 = {1,0,JAM1,235,122, &Topaz80, KeyText,     NULL           },
  165.   HotKeyIText1 = {2,0,JAM2,237,123, &Topaz80, KeyText,     &HotKeyIText2 },
  166.   HotKeyIText  = {1,0,JAM2,235,122, &Topaz80, BlankText, &HotKeyIText1 };
  167.  
  168. /****************** All gadgets *********************/
  169. static struct Gadget
  170.   ClickGad  = {NULL, 70,28, 135,10, GADGHIMAGE | GADGIMAGE,
  171.            RELVERIFY | TOGGLESELECT,
  172.            BOOLGADGET, (APTR)&CheckOff, (APTR)&CheckOn,
  173.            NULL, 0, NULL, 1<<CLICKMENUES, NULL },
  174.   SubGad    = {&ClickGad, 70,43,  151,10, GADGHIMAGE | GADGIMAGE,
  175.            RELVERIFY | TOGGLESELECT,
  176.            BOOLGADGET, (APTR)&CheckOff, (APTR)&CheckOn,
  177.            NULL, 0, NULL, 1<<SUBITEMPOINTER, NULL },
  178.   ShowGad   = {&SubGad, 70,58, 151,10, GADGHIMAGE | GADGIMAGE,
  179.            RELVERIFY | TOGGLESELECT,
  180.            BOOLGADGET, (APTR)&CheckOff, (APTR)&CheckOn,
  181.            NULL, NULL, NULL, 1<<SHOWSINGLEMENU, NULL },
  182.   ItemGad   = {&ShowGad, 70,73, 167,10, GADGHIMAGE | GADGIMAGE,
  183.            RELVERIFY | TOGGLESELECT,
  184.            BOOLGADGET, (APTR)&CheckOff, (APTR)&CheckOn,
  185.            NULL, NULL, NULL, 1<<ITEMSCENTERED, NULL },
  186.   WithGad   = {&ItemGad, 114,90, 55,10, GADGHIMAGE | GADGIMAGE,
  187.            RELVERIFY | TOGGLESELECT,
  188.            BOOLGADGET, (APTR)&CheckOff, (APTR)&CheckOn,
  189.            NULL, NULL, NULL, 1<<POPUPWITHQUAL, NULL },
  190.   WithoutGad= {&WithGad, 114,105, 79,10, GADGHIMAGE | GADGIMAGE,
  191.            RELVERIFY | TOGGLESELECT,
  192.            BOOLGADGET, (APTR)&CheckOff, (APTR)&CheckOn,
  193.            NULL, NULL, NULL, 1<<POPUPNOQUAL, NULL },
  194.   RemoveGad = {&WithoutGad, 80,165, 145,12, GADGHCOMP, RELVERIFY,
  195.            BOOLGADGET, (APTR)&UpBorder2a, NULL,
  196.            &RemIText, NULL, NULL, REMOVE, NULL },
  197.   UseGad    = {&RemoveGad,230,145, 56,12, GADGHCOMP, RELVERIFY,
  198.            BOOLGADGET, (APTR)&UpBorder1a, NULL,
  199.            &UseIText, NULL, NULL, USE, NULL },
  200.   ResetGad  = {&UseGad,   121,145, 56,12, GADGHCOMP, RELVERIFY,
  201.            BOOLGADGET, (APTR)&UpBorder1a, NULL,
  202.            &ResIText, NULL, NULL, RESET, NULL },
  203.   CancelGad = {&ResetGad, 18,145, 56,12, GADGHCOMP,  RELVERIFY,
  204.            BOOLGADGET, (APTR)&UpBorder1a, NULL,
  205.            &CancIText, NULL, NULL, CANCEL, NULL };
  206.  
  207. #define FIRSTGADGET CancelGad
  208.  
  209. static struct NewWindow OptionWindow = {
  210.   165,55, 310,185,  0,1,
  211.   GADGETUP | RAWKEY,
  212.   RMBTRAP | WINDOWDRAG | WINDOWDEPTH | ACTIVATE | NOCAREREFRESH, &FIRSTGADGET,
  213.   NULL, "PopUpMenu", NULL, NULL, 0,0,0,0, WBENCHSCREEN};
  214.  
  215. static SHORT
  216.   WindowBorder[] = { 1,184, 308,184, 308,0,  309,0, 309,184 };
  217.  
  218. static struct Border
  219.   WBorder = { 0,0, 2,0, JAM1, 5, WindowBorder, NULL};
  220.  
  221. /*** These must be global (Init them to NULL to put them in the Data segment) */
  222. static struct Window *Win = NULL;
  223. static struct IntuitionBase *IntuitionBase = NULL;
  224.  
  225.        USHORT SelectOpt(USHORT CurrOptions);
  226. STATIC VOID   FixGadgets(UBYTE Options);
  227. STATIC UBYTE  DoHotKeyReq(struct Window *Win, UBYTE RawKey);
  228. STATIC UBYTE  Raw2ASCII(UBYTE Code);
  229. STATIC VOID   PrintHotKey(UBYTE Key);
  230.  
  231. /*VOID main()*/
  232. /*{*/
  233.   /* The libraries MUST be opened in this or a similar manner in     */
  234.   /* order to use pop-up menus.                      */
  235.  
  236. /*  IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 0L);*/
  237. /*  printf("%x",SelectOpt(0x0f55));*/
  238. /*  CloseLibrary((struct Library *)IntuitionBase);*/
  239. /*}*/
  240.  
  241. USHORT SelectOpt(CurrOptions)
  242.   USHORT CurrOptions;
  243. {
  244.   /* Can't reach global IntuitionBase from C */
  245.   UBYTE Options;
  246.   UBYTE HotKey;
  247.   char    Buf[16];
  248.  
  249.   UBYTE Quit = 0;
  250.  
  251.   CurrOptions &= ~((1<<EXIT) | (1<<OPENWINDOW));
  252.   Options = CurrOptions>>8;
  253.   HotKey = CurrOptions & 0xff;
  254.  
  255.   IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0);
  256.  
  257.   if (IntuitionBase) {
  258.     if (IntuitionBase->LibNode.lib_Version >= 37) { /* Kickstart 2.0 ? */
  259.       USHORT *Temp1 = Logo.ImageData; /*&LogoData[0];*/
  260.       USHORT *Temp2 = Temp1+150;
  261.       USHORT i;
  262.  
  263.       for (i = 0; i < 150; i++, Temp1++, Temp2++)
  264.     *Temp1 ^= *Temp2 ^= *Temp1 ^= *Temp2;
  265.  
  266.       /* Switch BLACK and WHITE */
  267.       WinText13b.FrontPen = WinText12b.FrontPen = WinText11b.FrontPen =
  268.       WinText10b.FrontPen = WinText09b.FrontPen = WinText08b.FrontPen =
  269.       WinText07b.FrontPen = WinText06b.FrontPen = WinText05b.FrontPen =
  270.       UseIText1.FrontPen  = ResIText1.FrontPen    = CancIText1.FrontPen =
  271.       RemIText1.FrontPen  = UpBorder1a.FrontPen = UpBorder2a.FrontPen =
  272.       OptionWindow.BlockPen = HotKeyIText2.FrontPen = Name.PlanePick = 2;
  273.  
  274.       WinText13a.FrontPen = WinText12a.FrontPen = WinText11a.FrontPen =
  275.       WinText10a.FrontPen = WinText09a.FrontPen = WinText08a.FrontPen =
  276.       WinText07a.FrontPen = WinText06a.FrontPen = WinText05a.FrontPen =
  277.       UseIText.FrontPen   = ResIText.FrontPen    = CancIText.FrontPen  =
  278.       RemIText.FrontPen   = UpBorder1b.FrontPen = UpBorder2b.FrontPen =
  279.       WBorder.FrontPen      = HotKeyIText1.FrontPen = 1;
  280.     }
  281.  
  282.     WBenchToFront();
  283.     if (GetScreenData(Buf,16,WBENCHSCREEN,NULL)) {    /* Get size of Workbench Screen */
  284.       OptionWindow.LeftEdge = (USHORT)((((struct Screen *)Buf)->Width - 310))/2;
  285.       OptionWindow.TopEdge  = (USHORT)((((struct Screen *)Buf)->Height - 185))/2;
  286.  
  287.       FixGadgets(Options);
  288.  
  289.       if (Win = OpenWindow(&OptionWindow)) {
  290.     struct MsgPort *Port = Win->UserPort;
  291.  
  292.     if (IntuitionBase->LibNode.lib_Version < 37)
  293.       DrawBorder(Win->RPort, &WBorder, 0, 0);
  294.  
  295.     PrintIText(Win->RPort, &FIRSTWINTEXT, 0, 0);
  296.     PrintHotKey(Raw2ASCII(HotKey));
  297.     DrawImage(Win->RPort, &Logo, 74, 11);
  298.  
  299.     do {
  300.       struct IntuiMessage *Message;
  301.  
  302.       WaitPort(Port);
  303.  
  304.       while (Message = (struct IntuiMessage *)GetMsg(Port)) {
  305.         USHORT ID = 0;
  306.  
  307.         if (Message->Class == RAWKEY) {
  308.           if ((Message->Qualifier & 0x01f8) == HOTKEYQUAL) {
  309.         UBYTE Key = Raw2ASCII((UBYTE)Message->Code);
  310.  
  311.         if (Key > ' ') {
  312.           HotKey = Message->Code;
  313.           KeyText[0] = Key;
  314.           PrintHotKey(Key);
  315.         }
  316.           }
  317.           else if ((Message->Qualifier & 0x01f8) == 0) { /* only shift allowed */
  318.         STATIC char Keys[] = {'\x1b','R','\r','X','N','W','I','S','P','C'};
  319.         STATIC WORD Code[] = {CANCEL, RESET, USE, REMOVE,
  320.                       0x10,0x08,0x04,0x01,0x02,0x20};
  321.         struct Gadget *TempGad = &FIRSTGADGET;
  322.         UBYTE Key = Raw2ASCII((UBYTE)Message->Code);
  323.         USHORT i;
  324.  
  325.         for (i = 0; i < sizeof(Keys); i++, TempGad = TempGad->NextGadget)
  326.           if (Key == Keys[i]) {
  327.             ID = Code[i];
  328.             if (ID < RESET) {
  329.               TempGad->Flags ^= SELECTED;
  330.               RefreshGadgets(&WithoutGad,Win,NULL);
  331.             }
  332.             break;
  333.           }
  334.           }
  335.         }
  336.         else if (Message->Class == GADGETUP)
  337.           ID = ((struct Gadget *)(Message->IAddress))->GadgetID;
  338.  
  339.         if (ID)
  340.           if (ID & 0xff)
  341.         Options ^= ID;
  342.           else
  343.         switch(ID) {
  344.           case RESET:
  345.             Options = CurrOptions>>8;
  346.             HotKey  = CurrOptions & 0xff;
  347.             PrintHotKey(Raw2ASCII(HotKey));
  348.             FixGadgets(Options);
  349.             RefreshGadgets(&WithoutGad,Win,NULL);
  350.             break;
  351.           case USE:
  352.             Quit = 1;
  353.             break;
  354.           case CANCEL:
  355.             Quit = 2;
  356.             break;
  357.           case REMOVE:
  358.             Options |= 1<<EXIT;
  359.             Quit = 1;
  360.             break;
  361.         } /* switch */
  362.  
  363.         ReplyMsg((struct Message *)Message);
  364.       } /* while */
  365.     } /* do */
  366.     while (!Quit);
  367.  
  368.     CloseWindow(Win);
  369.       } /* if (Win == ... */
  370.     } /* if (GetScreenData ...) */
  371.  
  372.     CloseLibrary((struct Library *)IntuitionBase);
  373.   } /* if (IntuitionBase) */
  374.  
  375.   if (Quit == 1)
  376.     return (USHORT)((Options<<8) + HotKey);
  377.   else
  378.     return CurrOptions;
  379. }
  380.  
  381. STATIC VOID FixGadgets(Options)
  382.   UBYTE Options;
  383. {
  384.   struct Gadget *TempGad = &WithoutGad;
  385.  
  386.   do
  387.     if (Options & TempGad->GadgetID)
  388.       TempGad->Flags |= SELECTED;
  389.     else
  390.       TempGad->Flags &= ~SELECTED;
  391.   while (TempGad = TempGad->NextGadget);
  392. }
  393.  
  394. STATIC UBYTE Raw2ASCII(Code)
  395.   UBYTE Code;
  396. {
  397.   static struct InputEvent IEvent = { NULL, IECLASS_RAWKEY, 0, 0, IEQUALIFIER_CAPSLOCK }; /* reset to 0 */
  398.   struct Library *ConsoleDevice;
  399.   struct IOStdReq CIO;
  400.   UWORD  Length;
  401.   UBYTE  Buf[4];
  402.  
  403.   OpenDevice("console.device",-1,(struct IORequest *)&CIO, 0);
  404.   ConsoleDevice = (struct Library *)CIO.io_Device;
  405.  
  406.   IEvent.ie_Code = Code;
  407.   Length = RawKeyConvert(&IEvent,Buf,4,NULL);
  408.  
  409.   CloseDevice((struct IORequest *)&CIO);
  410.  
  411.   if (Length == 1)
  412.     return Buf[0];
  413.   else
  414.     return 0;
  415. }
  416.  
  417. STATIC VOID PrintHotKey(Key)
  418.   UBYTE Key;
  419. {
  420.   KeyText[0] = Key;
  421.   PrintIText(Win->RPort,&HotKeyIText,0,0);
  422. }
  423.  
  424.