home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / comm / term33so.lha / MacroPanel.c < prev    next >
C/C++ Source or Header  |  1993-04-30  |  12KB  |  466 lines

  1. /*
  2. **    MacroPanel.c
  3. **
  4. **    Editing panel for key macro configuration
  5. **
  6. **    Copyright © 1990-1993 by Olaf `Olsen' Barthel & MXM
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termGlobal.h"
  11.  
  12. enum    {    GAD_F1,GAD_F2,GAD_F3,GAD_F4,GAD_F5,GAD_F6,GAD_F7,GAD_F8,GAD_F9,
  13.         GAD_F10,GAD_QUALIFIER,GAD_USE,GAD_LOAD,GAD_SAVE,GAD_CANCEL };
  14.  
  15. STATIC STRPTR ModifierString[5];
  16.  
  17. STATIC struct Gadget *
  18. CreateAllGadgets(struct Gadget **GadgetArray,struct Gadget **GadgetList)
  19. {
  20.     struct Gadget        *Gadget;
  21.     struct NewGadget     NewGadget;
  22.     UWORD             Counter = 0;
  23.  
  24.     LocalizeString(ModifierString,MSG_MACROPANEL_NONE_TXT,MSG_MACROPANEL_CONTROL_TXT);
  25.  
  26.     SZ_SizeSetup(Window -> WScreen,&UserFont,TRUE);
  27.  
  28.     memset(&NewGadget,0,sizeof(struct NewGadget));
  29.  
  30.     if(Gadget = CreateContext(GadgetList))
  31.     {
  32.         SZ_AddLeftOffset(SZ_TextWidth("F10") + INTERWIDTH);
  33.  
  34.         SZ_SetWidth(SZ_Width(STRING_KIND,NULL,60,NULL));
  35.  
  36.         NewGadget . ng_GadgetText    = "F 1";
  37.         NewGadget . ng_GadgetID        = Counter;
  38.  
  39.         GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
  40.             SZ_Adjust,    TRUE,
  41.             SZ_AutoWidth,    TRUE,
  42.  
  43.             GTST_MaxChars,    255,
  44.         TAG_DONE);
  45.  
  46.         NewGadget . ng_GadgetText    = "F 2";
  47.         NewGadget . ng_GadgetID        = Counter;
  48.  
  49.         GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
  50.             SZ_Adjust,    TRUE,
  51.             SZ_AutoWidth,    TRUE,
  52.  
  53.             GTST_MaxChars,    255,
  54.         TAG_DONE);
  55.  
  56.         NewGadget . ng_GadgetText    = "F 3";
  57.         NewGadget . ng_GadgetID        = Counter;
  58.  
  59.         GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
  60.             SZ_Adjust,    TRUE,
  61.             SZ_AutoWidth,    TRUE,
  62.  
  63.             GTST_MaxChars,    255,
  64.         TAG_DONE);
  65.  
  66.         NewGadget . ng_GadgetText    = "F 4";
  67.         NewGadget . ng_GadgetID        = Counter;
  68.  
  69.         GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
  70.             SZ_Adjust,    TRUE,
  71.             SZ_AutoWidth,    TRUE,
  72.  
  73.             GTST_MaxChars,    255,
  74.         TAG_DONE);
  75.  
  76.         NewGadget . ng_GadgetText    = "F 5";
  77.         NewGadget . ng_GadgetID        = Counter;
  78.  
  79.         GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
  80.             SZ_Adjust,    TRUE,
  81.             SZ_AutoWidth,    TRUE,
  82.  
  83.             GTST_MaxChars,    255,
  84.         TAG_DONE);
  85.  
  86.         NewGadget . ng_GadgetText    = "F 6";
  87.         NewGadget . ng_GadgetID        = Counter;
  88.  
  89.         GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
  90.             SZ_Adjust,    TRUE,
  91.             SZ_AutoWidth,    TRUE,
  92.  
  93.             GTST_MaxChars,    255,
  94.         TAG_DONE);
  95.  
  96.         NewGadget . ng_GadgetText    = "F 7";
  97.         NewGadget . ng_GadgetID        = Counter;
  98.  
  99.         GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
  100.             SZ_Adjust,    TRUE,
  101.             SZ_AutoWidth,    TRUE,
  102.  
  103.             GTST_MaxChars,    255,
  104.         TAG_DONE);
  105.  
  106.         NewGadget . ng_GadgetText    = "F 8";
  107.         NewGadget . ng_GadgetID        = Counter;
  108.  
  109.         GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
  110.             SZ_Adjust,    TRUE,
  111.             SZ_AutoWidth,    TRUE,
  112.  
  113.             GTST_MaxChars,    255,
  114.         TAG_DONE);
  115.  
  116.         NewGadget . ng_GadgetText    = "F 9";
  117.         NewGadget . ng_GadgetID        = Counter;
  118.  
  119.         GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
  120.             SZ_Adjust,    TRUE,
  121.             SZ_AutoWidth,    TRUE,
  122.  
  123.             GTST_MaxChars,    255,
  124.         TAG_DONE);
  125.  
  126.         NewGadget . ng_GadgetText    = "F10";
  127.         NewGadget . ng_GadgetID        = Counter;
  128.  
  129.         GadgetArray[Counter++] = Gadget = CreateGadget(STRING_KIND,Gadget,&NewGadget,
  130.             SZ_Adjust,    TRUE,
  131.             SZ_AutoWidth,    TRUE,
  132.  
  133.             GTST_MaxChars,    255,
  134.         TAG_DONE);
  135.  
  136.         NewGadget . ng_GadgetText    = LocaleString(MSG_MACROPANEL_KEY_MODIFIER_GAD);
  137.         NewGadget . ng_GadgetID        = Counter;
  138.  
  139.         GadgetArray[Counter++] = Gadget = CreateGadget(CYCLE_KIND,Gadget,&NewGadget,
  140.             SZ_Adjust,    TRUE,
  141.             SZ_AlignCentre,    TRUE,
  142.  
  143.             GTCY_Labels,    ModifierString,
  144.             GTCY_Active,    0,
  145.         TAG_DONE);
  146.  
  147.         SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_USE_GAD),0,NULL);
  148.         SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_CANCEL_GAD),0,NULL);
  149.         SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_LOAD_GAD),0,NULL);
  150.         SZ_UpdateMaxWidth(BUTTON_KIND,LocaleString(MSG_GLOBAL_CANCEL_GAD),0,NULL);
  151.  
  152.         SZ_SetWidth(SZ_ResetMaxWidth());
  153.  
  154.         NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_USE_GAD);
  155.         NewGadget . ng_GadgetID        = Counter;
  156.         NewGadget . ng_Flags        = 0;
  157.  
  158.         GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  159.             SZ_Adjust,    TRUE,
  160.             SZ_AutoWidth,    TRUE,
  161.             SZ_AlignExtra,    TRUE,
  162.             SZ_AlignBottom,    TRUE,
  163.             SZ_GroupCount,    4,
  164.         TAG_DONE);
  165.  
  166.         NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_LOAD_GAD);
  167.         NewGadget . ng_GadgetID        = Counter;
  168.  
  169.         GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  170.             SZ_Adjust,    TRUE,
  171.             SZ_AutoWidth,    TRUE,
  172.             SZ_GroupNext,    TRUE,
  173.         TAG_DONE);
  174.  
  175.         NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_SAVE_GAD);
  176.         NewGadget . ng_GadgetID        = Counter;
  177.  
  178.         GadgetArray[Counter++] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  179.             SZ_Adjust,    TRUE,
  180.             SZ_AutoWidth,    TRUE,
  181.             SZ_GroupNext,    TRUE,
  182.         TAG_DONE);
  183.  
  184.         NewGadget . ng_GadgetText    = LocaleString(MSG_GLOBAL_CANCEL_GAD);
  185.         NewGadget . ng_GadgetID        = Counter;
  186.  
  187.         GadgetArray[Counter] = Gadget = CreateGadget(BUTTON_KIND,Gadget,&NewGadget,
  188.             SZ_Adjust,    TRUE,
  189.             SZ_AutoWidth,    TRUE,
  190.             SZ_GroupNext,    TRUE,
  191.         TAG_DONE);
  192.     }
  193.  
  194.     return(Gadget);
  195. }
  196.  
  197. VOID
  198. MacroPanel(struct MacroKeys *MacroKeys)
  199. {
  200.     struct Window        *PanelWindow;
  201.     struct Gadget        *GadgetList = NULL;
  202.     struct Gadget        *GadgetArray[GAD_CANCEL + 1];
  203.     LONG             i;
  204.  
  205.     struct MacroKeys    *Keys;
  206.  
  207.     ULONG             OldCRC;
  208.  
  209.     OldCRC = DoCRC(MacroKeys,sizeof(struct MacroKeys));
  210.  
  211.     if(Keys = (struct MacroKeys *)AllocVec(sizeof(struct MacroKeys),MEMF_ANY|MEMF_CLEAR))
  212.     {
  213.         CopyMem(MacroKeys,Keys,sizeof(struct MacroKeys));
  214.  
  215.         if(CreateAllGadgets(GadgetArray,&GadgetList))
  216.         {
  217.             if(PanelWindow = OpenWindowTags(NULL,
  218.                 WA_Left,    GetScreenLeft(Window) + (GetScreenWidth(Window) - SZ_GetWindowWidth()) / 2,
  219.                 WA_Top,        GetScreenTop(Window) + (GetScreenHeight(Window) - SZ_GetWindowHeight())    / 2,
  220.                 WA_Width,    SZ_GetWindowWidth(),
  221.                 WA_Height,    SZ_GetWindowHeight(),
  222.  
  223.                 WA_Activate,    TRUE,
  224.                 WA_DragBar,    TRUE,
  225.                 WA_DepthGadget,    TRUE,
  226.                 WA_CloseGadget,    TRUE,
  227.                 WA_RMBTrap,    TRUE,
  228.                 WA_DepthGadget,    TRUE,
  229.                 WA_CustomScreen,Window -> WScreen,
  230.  
  231.                 WA_IDCMP,    IDCMP_GADGETDOWN | IDCMP_CLOSEWINDOW | IDCMP_RAWKEY | IDCMP_VANILLAKEY | IDCMP_ACTIVEWINDOW | BUTTONIDCMP | CYCLEIDCMP | STRINGIDCMP,
  232.  
  233.                 WA_Title,    LocaleString(MSG_MACROPANEL_MACRO_PREFERENCES_TXT),
  234.             TAG_DONE))
  235.             {
  236.                 struct IntuiMessage    *Massage;
  237.                 ULONG             IClass,Code;
  238.                 struct Gadget        *Gadget;
  239.                 BYTE             Terminated = FALSE;
  240.  
  241.                 UBYTE             DummyBuffer[MAX_FILENAME_LENGTH],
  242.                             *DummyChar;
  243.  
  244.                 struct FileRequester    *FileRequest;
  245.  
  246.                 LONG             Modifier = 0;
  247.  
  248.                 GuideContext(CONTEXT_MACROS);
  249.  
  250.                 PushWindow(PanelWindow);
  251.  
  252.                 AddGList(PanelWindow,GadgetList,(UWORD)-1,(UWORD)-1,NULL);
  253.                 RefreshGList(GadgetList,PanelWindow,NULL,(UWORD)-1);
  254.                 GT_RefreshWindow(PanelWindow,NULL);
  255.  
  256.                 if(XEmulatorBase && Config -> TerminalConfig -> EmulationMode == EMULATION_EXTERNAL)
  257.                 {
  258.                     ULONG KeyMask = XEmulatorGetFreeMacroKeys(XEM_IO,Modifier);
  259.  
  260.                     for(i = 0 ; i < 10 ; i++)
  261.                     {
  262.                         GT_SetGadgetAttrs(GadgetArray[GAD_F1 + i],PanelWindow,NULL,
  263.                             GTST_String,    Keys -> Keys[Modifier][i],
  264.                             GA_Disabled,    !(KeyMask & (1 << i)),
  265.                         TAG_DONE);
  266.                     }
  267.                 }
  268.                 else
  269.                 {
  270.                     for(i = 0 ; i < 10 ; i++)
  271.                     {
  272.                         GT_SetGadgetAttrs(GadgetArray[GAD_F1 + i],PanelWindow,NULL,
  273.                             GTST_String,Keys -> Keys[Modifier][i],
  274.                         TAG_DONE);
  275.                     }
  276.                 }
  277.  
  278.                 ActiveGadget = NULL;
  279.  
  280.                 ClrSignal(SIG_BREAK);
  281.  
  282.                 while(!Terminated)
  283.                 {
  284.                     if(Wait(PORTMASK(PanelWindow -> UserPort) | SIG_BREAK) & SIG_BREAK)
  285.                     {
  286.                         CopyMem(Keys,MacroKeys,sizeof(struct MacroKeys));
  287.  
  288.                         break;
  289.                     }
  290.  
  291.                     while(!Terminated && (Massage = (struct IntuiMessage *)GT_GetIMsg(PanelWindow -> UserPort)))
  292.                     {
  293.                         IClass    = Massage -> Class;
  294.                         Code    = Massage -> Code;
  295.                         Gadget    = (struct Gadget *)Massage -> IAddress;
  296.  
  297.                         GT_ReplyIMsg(Massage);
  298.  
  299.                         if(IClass == IDCMP_ACTIVEWINDOW && ActiveGadget)
  300.                             ActivateGadget(ActiveGadget,PanelWindow,NULL);
  301.  
  302.                         KeySelect(GadgetArray,GAD_CANCEL,Code,PanelWindow,&Gadget,&IClass,&Code);
  303.  
  304.                         if(IClass == IDCMP_GADGETDOWN)
  305.                         {
  306.                             if((Gadget -> GadgetType & GTYP_GTYPEMASK) == GTYP_STRGADGET)
  307.                                 ActiveGadget = Gadget;
  308.                         }
  309.  
  310.                         if(IClass == IDCMP_CLOSEWINDOW)
  311.                         {
  312.                             CopyMem(Keys,MacroKeys,sizeof(struct MacroKeys));
  313.  
  314.                             Terminated = TRUE;
  315.                         }
  316.  
  317.                         if(IClass == IDCMP_GADGETUP)
  318.                         {
  319.                             switch(Gadget -> GadgetID)
  320.                             {
  321.                                 case GAD_QUALIFIER:
  322.  
  323.                                     for(i = 0 ; i < 10 ; i++)
  324.                                         strcpy(Keys -> Keys[Modifier][i],SZ_GetString(GadgetArray[i]));
  325.  
  326.                                     Modifier = Code;
  327.  
  328.                                     if(XEmulatorBase && Config -> TerminalConfig -> EmulationMode == EMULATION_EXTERNAL)
  329.                                     {
  330.                                         ULONG KeyMask = XEmulatorGetFreeMacroKeys(XEM_IO,Modifier);
  331.  
  332.                                         ActiveGadget = NULL;
  333.  
  334.                                         for(i = 0 ; i < 10 ; i++)
  335.                                         {
  336.                                             GT_SetGadgetAttrs(GadgetArray[GAD_F1 + i],PanelWindow,NULL,
  337.                                                 GTST_String,    Keys -> Keys[Modifier][i],
  338.                                                 GA_Disabled,    !(KeyMask & (1 << i)),
  339.                                             TAG_DONE);
  340.  
  341.                                             if((KeyMask & (1 << i)) && !ActiveGadget)
  342.                                                 ActiveGadget = GadgetArray[GAD_F1 + i];
  343.                                         }
  344.  
  345.                                         if(ActiveGadget)
  346.                                             ActivateGadget(ActiveGadget,PanelWindow,NULL);
  347.                                     }
  348.                                     else
  349.                                     {
  350.                                         for(i = 0 ; i < 10 ; i++)
  351.                                         {
  352.                                             GT_SetGadgetAttrs(GadgetArray[GAD_F1 + i],PanelWindow,NULL,
  353.                                                 GTST_String,Keys -> Keys[Modifier][i],
  354.                                             TAG_DONE);
  355.                                         }
  356.                                     }
  357.  
  358.                                     break;
  359.  
  360.                                 case GAD_USE:
  361.  
  362.                                     Terminated = TRUE;
  363.  
  364.                                     for(i = 0 ; i < 10 ; i++)
  365.                                         strcpy(Keys -> Keys[Modifier][i],SZ_GetString(GadgetArray[i]));
  366.  
  367.                                     CopyMem(Keys,MacroKeys,sizeof(struct MacroKeys));
  368.  
  369.                                     break;
  370.  
  371.                                 case GAD_LOAD:
  372.  
  373.                                     strcpy(DummyBuffer,LastMacros);
  374.  
  375.                                     DummyChar = PathPart(DummyBuffer);
  376.  
  377.                                     *DummyChar = 0;
  378.  
  379.                                     BlockWindow(PanelWindow);
  380.  
  381.                                     if(FileRequest = GetFile(LocaleString(MSG_MACROPANEL_LOAD_MACRO_KEYS_TXT),DummyBuffer,FilePart(LastMacros),DummyBuffer,"#?.prefs",FALSE,FALSE,FALSE,LocaleString(MSG_GLOBAL_LOAD_TXT),TRUE))
  382.                                     {
  383.                                         if(!LoadMacros(DummyBuffer,Keys))
  384.                                             MyEasyRequest(Window,LocaleString(MSG_MACROPANEL_COULD_NOT_LOAD_MACRO_KEYS_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT),DummyBuffer);
  385.                                         else
  386.                                         {
  387.                                             MacroChanged = FALSE;
  388.  
  389.                                             OldCRC = DoCRC(Keys,sizeof(struct MacroKeys));
  390.  
  391.                                             strcpy(Config -> FileConfig -> MacroFileName,DummyBuffer);
  392.  
  393.                                             strcpy(LastMacros,DummyBuffer);
  394.  
  395.                                             for(i = 0 ; i < 10 ; i++)
  396.                                             {
  397.                                                 GT_SetGadgetAttrs(GadgetArray[GAD_F1 + i],PanelWindow,NULL,
  398.                                                     GTST_String,Keys -> Keys[Modifier][i],
  399.                                                 TAG_DONE);
  400.                                             }
  401.                                         }
  402.                                     }
  403.  
  404.                                     ReleaseWindow(PanelWindow);
  405.  
  406.                                     break;
  407.  
  408.                                 case GAD_SAVE:
  409.  
  410.                                     strcpy(DummyBuffer,LastMacros);
  411.  
  412.                                     DummyChar = PathPart(DummyBuffer);
  413.  
  414.                                     *DummyChar = 0;
  415.  
  416.                                     BlockWindow(PanelWindow);
  417.  
  418.                                     for(i = 0 ; i < 10 ; i++)
  419.                                         strcpy(Keys -> Keys[Modifier][i],SZ_GetString(GadgetArray[i]));
  420.  
  421.                                     if(FileRequest = GetFile(LocaleString(MSG_MACROPANEL_SAVE_MACRO_KEYS_TXT),DummyBuffer,FilePart(LastMacros),DummyBuffer,"#?.prefs",TRUE,FALSE,FALSE,LocaleString(MSG_GLOBAL_SAVE_TXT),TRUE))
  422.                                     {
  423.                                         if(!WriteIFFData(DummyBuffer,Keys,sizeof(struct MacroKeys),ID_KEYS))
  424.                                             MyEasyRequest(Window,LocaleString(MSG_MACROPANEL_COULD_NOT_SAVE_MACRO_KEYS_TXT),LocaleString(MSG_GLOBAL_CONTINUE_TXT),DummyBuffer);
  425.                                         else
  426.                                         {
  427.                                             strcpy(LastMacros,DummyBuffer);
  428.  
  429.                                             MacroChanged = FALSE;
  430.  
  431.                                             OldCRC = DoCRC(Keys,sizeof(struct MacroKeys));
  432.                                         }
  433.                                     }
  434.  
  435.                                     ReleaseWindow(PanelWindow);
  436.  
  437.                                     break;
  438.  
  439.                                 case GAD_CANCEL:
  440.  
  441.                                     Terminated = TRUE;
  442.  
  443.                                     CopyMem(Keys,MacroKeys,sizeof(struct MacroKeys));
  444.  
  445.                                     break;
  446.                             }
  447.                         }
  448.                     }
  449.                 }
  450.  
  451.                 RemoveGList(PanelWindow,GadgetList,(UWORD)-1);
  452.  
  453.                 PopWindow();
  454.  
  455.                 CloseWindow(PanelWindow);
  456.             }
  457.         }
  458.  
  459.         FreeGadgets(GadgetList);
  460.  
  461.         FreeVec(Keys);
  462.     }
  463.  
  464.     MacroChanged |= (OldCRC != DoCRC(MacroKeys,sizeof(struct MacroKeys)));
  465. }
  466.