KeymapSwitcher: ChooseKeymapWin.c

// ChooseKeymapWin.c
//#define WDEBUG
 
#include <proto/intuition.h>
#include <proto/exec.h>
#include <proto/keymap.h>
#include "dockybase.h"
#include "DockWindow.h"
#include "prefs.h"
 
#include "KeyMapSwitcher_rev.h"
 
Object *win2;
struct Window *window2;
uint32 wsignal = 0;
extern char keymap1Flag[1024], keymap2Flag[1024];
 
 
void OpenDockWindow(struct DockyData *dd)
{
 //extern BOOL WinBorders;
 
 win2 = IIntuition->NewObject(NULL, "window.class",
    WA_ScreenTitle, VERS" "DATE,
    WA_CustomScreen,(long)dd->scr,
    WA_Activate, TRUE,
    WA_DepthGadget, FALSE,
    WA_DragBar, FALSE,
    WA_CloseGadget, FALSE,
    WA_SizeGadget, FALSE,
    WA_SmartRefresh, TRUE,
    WINDOW_NewMenu, NULL, // enabling RMB (WMHI_MENUPICK)
    //WINDOW_GadgetHelp, TRUE, // gadgethelp on/off
//    WA_Borderless, WinBorders,
    WINDOW_Position, WPOS_CENTERMOUSE,
    WINDOW_Layout, IIntuition->NewObject(NULL, "layout.gadget",
//           LAYOUT_Orientation, LAYOUT_ORIENT_VERT,
           LAYOUT_SpaceOuter, TRUE,
           //LAYOUT_DeferLayout, TRUE,
           LAYOUT_InnerSpacing, 6,
           LAYOUT_AddChild, OBJ(OBJ_BTN1) = IIntuition->NewObject(NULL, "button.gadget",
                  GA_ID,         OBJ_BTN1,
                  GA_RelVerify,  TRUE,
                  GA_Underscore, ~0,
                  BUTTON_BevelStyle,  BVS_THIN,
                  BUTTON_Transparent, TRUE,
                  BUTTON_RenderImage, OBJ(GID_KM1) = IIntuition->NewObject(NULL, "bitmap.image",
                         IA_Width,    32,
                         IA_Height,   32,
                         //IA_Scalable, TRUE,
                         BITMAP_SourceFile, keymap1Flag,
                         BITMAP_Screen,     dd->scr,
                         BITMAP_Masking,    TRUE,
//                         BITMAP_Transparent,TRUE,
                        TAG_DONE),
           TAG_DONE),
           LAYOUT_AddChild, OBJ(OBJ_BTN2) = IIntuition->NewObject(NULL, "button.gadget",
                  GA_ID,         OBJ_BTN2,
                  GA_RelVerify,  TRUE,
                  GA_Underscore, ~0,
                  BUTTON_BevelStyle,  BVS_THIN,
                  BUTTON_Transparent, TRUE,
                  BUTTON_RenderImage, OBJ(GID_KM2) = IIntuition->NewObject(NULL, "bitmap.image",
                         IA_Width,    32,
                         IA_Height,   32,
                         //IA_Scalable, TRUE,
                         BITMAP_SourceFile, keymap2Flag,
                         BITMAP_Screen,     dd->scr,
                         BITMAP_Masking,    TRUE,
//                         BITMAP_Transparent,TRUE,
                        TAG_DONE),
           TAG_DONE),
 
    TAG_DONE),
 TAG_END);
 
 // fallback in case images not found
 if( !OBJ(GID_KM1) ) IIntuition->SetAttrs(OBJ(OBJ_BTN1), GA_Text,dd->keymap1Name, TAG_DONE);
 if( !OBJ(GID_KM2) ) IIntuition->SetAttrs(OBJ(OBJ_BTN2), GA_Text,dd->keymap2Name, TAG_DONE);
 
 if(win2)
 {
  window2 = (struct Window *)IIntuition->IDoMethod(win2, WM_OPEN);
  if(window2)
  {// Obtain the window wait signal mask.
   IIntuition->GetAttr(WINDOW_SigMask, win2, &wsignal);
   // Input Event Loop
   while( !ProcessDockWindow(dd) );
 
  } // if(windows[WID_MAIN])
 
  FreeDockWindow();
 } // if(win[OID_MAIN])
 
}
 
 
void FreeDockWindow(void)
{
 IIntuition->DisposeObject( OBJ(GID_KM1) );
 IIntuition->DisposeObject( OBJ(GID_KM2) );
 OBJ(GID_KM1) = NULL;
 OBJ(GID_KM2) = NULL;
 IIntuition->DisposeObject(win2);
 win2 = NULL;
}
 
 
BOOL ProcessDockWindow(struct DockyData *dd)
{
 uint32 wait = IExec->Wait(wsignal);
 static char KM_choosed[64] = "";
 
 if(wait & wsignal)
 {
  uint32 result = WMHI_LASTMSG;
  int16 code = 0;
 
  while( (result = IIntuition->IDoMethod(win2, WM_HANDLEINPUT, &code)) != WMHI_LASTMSG )
  {
#ifdef WDEBUG
IDOS->Printf("%08lx code=%ld\n",result,code);
#endif
   switch(result & WMHI_CLASSMASK)
   {
    case WMHI_MENUPICK: // clicked RMB
    case WMHI_INACTIVE: // clicked outside DockWindow
#ifdef WDEBUG
IDOS->Printf("WMHI_MENUPICK or WMHI_INACTIVE\n");
#endif
     return TRUE;
    break;
 
    case WMHI_GADGETUP:
#ifdef WDEBUG
IDOS->Printf("WMHI_GADGETUP (%08lx):",result);
#endif
     switch(result & WMHI_GADGETMASK)
      {
       case OBJ_BTN1:
        IUtility->Strlcpy( KM_choosed, dd->keymap1Name, sizeof(KM_choosed) );
        ChangeKeymap(dd, KM_choosed);
        return TRUE;
       break;
       case OBJ_BTN2:
        IUtility->Strlcpy( KM_choosed, dd->keymap2Name, sizeof(KM_choosed) );
        ChangeKeymap(dd, KM_choosed);
        return TRUE;
       break;
      } // END switch(result & WMHI_GADGETMASK)
    break;
   }  // END switch(result & WMHI_CLASSMASK)
 
  } // END while( (result..
 
 } // if(wait & wsignal)
 
 return FALSE;
}
 
 
void ChangeKeymap(struct DockyData *dd, STRPTR keymap)
{
 APTR KM_handle;
 ULONG KM_res;
 struct KeyMapNode *kmn = NULL;
#ifdef WDEBUG
IDOS->Printf("Choosed: '%s'\n",keymap);
#endif
 if(IUtility->Stricmp(keymap, dd->keymapSel) != 0) // only if keymap changed
 {
  if( (KM_handle = IKeymap->OpenKeyMapHandle(keymap)) )
  {
   KM_res = IKeymap->ObtainKeyMapInfo(KM_handle, KEYMAPINFO_KEYMAPNODE,&kmn, TAG_END);
   if(KM_res)
   {
#ifdef WDEBUG
IDOS->Printf("Changing keymap to '%s'...\n",kmn->kn_Node.ln_Name);
#endif
    IKeymap->SetKeyMapDefault( &(kmn->kn_KeyMap) );
    IUtility->Strlcpy( dd->keymapSel, kmn->kn_Node.ln_Name, sizeof(dd->keymapSel) );
   }
   else IDOS->Printf("Failed to change keymap!\n");
 
   IKeymap->CloseKeyMapHandle(KM_handle);
  } // END if( (KM_handle =..
  else IDOS->Printf("Keymap doesn't exists!\n");
 } // END if(IUtility->Stricmp..
}