KeymapSwitcher: ChooseKeymapMenu.c

// ChooseKeymapMenu.c
//#define MDEBUG
 
#include <proto/intuition.h>
#include <proto/exec.h>
#include <classes/popupmenu.h>
#include "dockybase.h"
#include "DockWindow.h"
#include "prefs.h"
 
#include "KeyMapSwitcher_rev.h"
 
extern BOOL WinMode;
extern char keymap1Flag[1024], keymap2Flag[1024];
 
void MenuHandlerFunc(struct Hook *hook, Object *o, APTR reserved);
 
 
void OpenDockMenu(struct DockyData *dd)
{
 Object *chooseMenu;
 struct Hook *MenuHandler;
 
// MenuHandler.h_Entry = (HOOKFUNC)MenuHandlerFunc;
// MenuHandler.h_Data = dd;
 MenuHandler = (struct Hook *)IExec->AllocSysObjectTags(ASOT_HOOK,
                                      ASOHOOK_Entry, MenuHandlerFunc,
                                      ASOHOOK_Data, dd,
                                     TAG_DONE);
 
 chooseMenu = IIntuition->NewObject(NULL, "popupmenu.class",
                                    PMA_MenuHandler,MenuHandler, TAG_DONE);
 
 Object *item1 = IIntuition->NewObject(NULL, "popupmenuitem.class",
                              PMIA_ID,    MENU_OPT1,
                              PMIA_Title, dd->keymap1Name,
                              PMIA_Icon,  OBJ(GID_BITMAP1) = IIntuition->NewObject(NULL, "bitmap.image",
                                   BITMAP_SourceFile, keymap1Flag,
                                   BITMAP_Screen,     dd->scr,
                                   BITMAP_Masking,    TRUE,
                                  TAG_DONE),
                             TAG_END);
 
 Object *item2 = IIntuition->NewObject(NULL, "popupmenuitem.class",
                              PMIA_ID,       MENU_OPT2,
                              PMIA_Title,    dd->keymap2Name,
                              PMIA_Disabled, TRUE,
                              PMIA_Icon,     OBJ(GID_BITMAP2) = IIntuition->NewObject(NULL, "bitmap.image",
                                   BITMAP_SourceFile, keymap2Flag,
                                   BITMAP_Screen,     dd->scr,
                                   BITMAP_Masking,    TRUE,
                                  TAG_DONE),
                             TAG_END);
 
  Object *item3 = IIntuition->NewObject(NULL, "popupmenuitem.class",
                               PMIA_Title, "Settings...",
                               PMIA_ID,    MENU_PREFS,
                              TAG_END);
 
 Object *itemBar = IIntuition->NewObject(NULL, "popupmenuitem.class", PMIA_Title,~0, TAG_END);
 
 // language2 valid/available
 if( OBJ(GID_BITMAP2) ) IIntuition->SetAttrs(item2, PMIA_Disabled,FALSE, TAG_DONE);
 
 IIntuition->IDoMethod(chooseMenu, OM_ADDMEMBER, item1); // lang1
 IIntuition->IDoMethod(chooseMenu, OM_ADDMEMBER, item2); // lang2
 if(!WinMode)
 {
  IIntuition->IDoMethod(chooseMenu, OM_ADDMEMBER, itemBar); // separator
  IIntuition->IDoMethod(chooseMenu, OM_ADDMEMBER, item3); // Settings...
}
 
 IIntuition->IDoMethod(chooseMenu, PM_OPEN, dd->win); // show popup menu
 
 IIntuition->DisposeObject(chooseMenu);
 IExec->FreeSysObject(ASOT_HOOK, MenuHandler);
}
 
 
void MenuHandlerFunc(struct Hook *hook, Object *o, APTR reserved)
{
 uint32 item_ID = 0;
 struct DockyData *DD = (struct DockyData *)hook->h_Data;
 
 if( IIntuition->GetAttr(PMIA_ID, o, &item_ID) )
 {
#ifdef MDEBUG
IDOS->Printf("Choosed: ");
#endif
  switch(item_ID)
  {
   case MENU_OPT1:
#ifdef MDEBUG
IDOS->Printf("'%s'\n",DD->keymap1Name);
#endif
    ChangeKeymap(DD, DD->keymap1Name);
    IUtility->Strlcpy( DD->keymapSel, DD->keymap1Name, sizeof(DD->keymapSel) );
   break;
   case MENU_OPT2:
#ifdef MDEBUG
IDOS->Printf("'%s'\n",DD->keymap2Name);
#endif
    ChangeKeymap(DD, DD->keymap2Name);
    IUtility->Strlcpy( DD->keymapSel, DD->keymap2Name, sizeof(DD->keymapSel) );
   break;
   case MENU_PREFS:
   {
    char keymap2Sel[128]; // to check if keymap2 changed
#ifdef MDEBUG
IDOS->Printf("Settings...\n");
#endif
    IUtility->Strlcpy( keymap2Sel, DD->keymap2Name, sizeof(keymap2Sel) );
    OpenPrefsWindow(DD);
#ifdef MDEBUG
IDOS->Printf("%s == %s?\n",DD->keymap2Name,keymap2Sel);
#endif
    if(IUtility->Stricmp(DD->keymap2Name, keymap2Sel) != 0)
    {// NEW keymap2: tooltype (KEYMAP2); keymap2Name & keymap2Flag
     SetKeyMapFlag(DD->keymap2Name, keymap2Flag);
#ifdef MDEBUG
IDOS->Printf("[NEW]KEYMAP2='%s' FLAG2='%s' (tooltype)\n",DD->keymap2Name,keymap2Flag);
#endif
    }
   }
   break;
  }
 }
 
}