// 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.. }

