/* * Key Map Editor ver 1.0 * * By: Tim Friest * on: December 31, 1988 * * Editor for standard Amiga Key Maps. Allows custom key definitions. * Produces files compatible with AmigaDOS SetMap command. */ unsigned long ResourceFlags = 0; unsigned long StatusFlags = 0; #include "KME_Includes.h" #include "KME_Protos.h" #include "KME_Defs.h" #include "KME_Menus.h" #include "KME_Gadgets.h" #include "KME_Window.h" int ReturnCode = 0; struct GfxBase *GfxBase; struct IntuitionBase *IntuitionBase; struct timerequest *Timer; ULONG Timer_sf = 0; struct TextAttr Topaz8TextAttr = { "topaz.font", /* name */ 8, /* size */ FS_NORMAL, /* style */ FPF_ROMFONT /* flags */ }; struct TextFont *TopazFont; struct Window *KeyMapEdWindow; struct Window *FileReqWindow; struct Window *KeyReqWindow; BPTR DirLock; BPTR KeyMapSegment; struct KeyMapNode *KeyMapNode; struct FileNode *FileList = NULL; int FileListLength = 0; char *filename = NULL; unsigned long Wind_sf = 0; struct Gadget *FromKeyGad = NULL; extern struct StringInfo NameStrGadSInfo; extern UBYTE FileNameBuff[30]; extern int main(int, char **); /* * Key Map Editor Main procedure * * reads keymap filename from command line if supplied */ int main(argc, argv) int argc; char **argv; { struct IntuiMessage *Message; unsigned long Class; unsigned short Code; APTR Address; struct MenuItem *Item; struct Gadget *Gad; BPTR OldDirLock, templock; /* * Get the Key Map Filename */ if (argc > 1) { if (strcmp(argv[1], "?") == 0) { Write(Output(), "KeyMapEd ver 1.0 1-Jan-89\n", 26); Write(Output(), " by Tim Friest\n", 23); Write(Output(), "Usage: KeyMapEd keymap\n", 23); goto CleanUp; } filename = argv[1]; } /* * Change directory to devs:keymaps */ if ((DirLock = Lock("devs:keymaps", SHARED_LOCK)) == NULL) { ReturnCode = IoErr(); Write(Output(), "Unable to place lock on devs:keymaps\n", 37); goto CleanUp; } FlagResource(RF_DirLock); if ((OldDirLock = CurrentDir(DirLock)) == NULL) { ReturnCode = IoErr(); Write(Output(), "Unable to CD to devs:keymaps\n", 29); goto CleanUp; } FlagResource(RF_CurrentDir); /* * Open necessary libraries */ if ((GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0)) == NULL) { Write(Output(), "Unable to open Graphics Library\n", 32); goto CleanUp; } FlagResource(RF_Graphics); if ((IntuitionBase = (struct IntuitionBase *)OpenLibrary( "intuition.library", 0)) == NULL) { Write(Output(), "Unable to open Intuition Library\n", 33); goto CleanUp; } FlagResource(RF_Intuition); /* * Open necessary devices */ if ((Timer = (struct timerequest *)CreateExtIO(CreatePort("Timer", 0), sizeof(struct timerequest))) == NULL) { Write(Output(), "Unable to create timer ExtIO block\n", 35); goto CleanUp; } if (OpenDevice(TIMERNAME, UNIT_VBLANK, (struct IORequest *)Timer, NULL)) { Write(Output(), "Unable to open timer device\n", 28); goto CleanUp; } Timer_sf = (1<tr_node.io_Message.mn_ReplyPort->mp_SigBit); FlagResource(RF_Timer); /* * Read in the Key Map */ if (filename != NULL) { strcpy(FileNameBuff, filename); NameStrGadSInfo.BufferPos = strlen(filename); if (ReadKeyMap(FileNameBuff)) UpdateDisplay(GadgetList, KeyMapNode, TRUE); else KeyMapIO(FileNameBuff, LOAD); } else KeyMapIO(filename, LOAD); if (!CheckResource(RF_KeyMap)) goto CleanUp; /* * Open the Key Map Editor window */ if ((KeyMapEdWindow = OpenWindow(&NewKMEWindow)) == NULL) { Write(Output(), "Unable to open window\n", 22); goto CleanUp; } FlagResource(RF_Window); Wind_sf = (1<UserPort->mp_SigBit); /* * Set font to Topaz 8 (so everything looks right) */ if ((TopazFont = OpenFont(&Topaz8TextAttr)) != NULL) { if (!SetFont(KeyMapEdWindow->RPort, TopazFont)) Write(Output(), "Unable to set font in Key Map Ed window\n", 40); FlagResource(RF_Font); } else Write(Output(), "Unable to open Topaz 8 font\n", 28); /* Add menu to Window */ SetMenuStrip(KeyMapEdWindow, MenuList); FlagResource(RF_Menu); SetFlag(SF_Define); /* * Process Inputs */ while (Wait(Wind_sf) == Wind_sf) { while ((Message = (struct IntuiMessage *)GetMsg(KeyMapEdWindow->UserPort)) != NULL) { Class = Message->Class; Code = Message->Code; Address = Message->IAddress; ReplyMsg((struct Message *)Message); switch (Class) { case CLOSEWINDOW: /* CloseWindow gadget was hit */ if (CheckFlag(SF_Modified)) { if (VerifyReq()) goto CleanUp; } else goto CleanUp; break; case MENUPICK: /* Menu Item was selected */ while (Code != MENUNULL) { Item = ItemAddress(MenuList, Code); if (!ProcMenu(Code)) goto CleanUp; Code = Item->NextSelect; } break; case GADGETUP: /* Gadget was selected */ Gad = (struct Gadget *)Address; ProcGadget(Gad); break; } /* switch */ } /* while */ } /* while */ CleanUp: if (CheckFlag(SF_Pointer)) ChangePointer(0); if (CheckResource(RF_Timer)) { CloseDevice((struct IORequest *)Timer); DeletePort(Timer->tr_node.io_Message.mn_ReplyPort); DeleteExtIO((struct IORequest *)Timer); ClearResource(RF_Timer); } if (CheckResource(RF_FileList)) { struct FileNode *temp; while (FileList != NULL) { temp = FileList; FileList = FileList->NextFile; if (temp->FileName != NULL) FreeMem(temp->FileName, strlen(temp->FileName)+1); FreeMem(temp, sizeof(struct FileNode)); } ClearResource(RF_FileList); } if (CheckResource(RF_KeyMap)) FreeKeyMap(KeyMapNode); if (CheckResource(RF_Menu)) { ClearMenuStrip(KeyMapEdWindow); ClearResource(RF_Menu); } if (CheckResource(RF_GadgetText)) { Gad = GadgetList; do if (Gad->GadgetText != NULL) { if (Gad->GadgetText->IText != NULL) FreeMem(Gad->GadgetText->IText, strlen(Gad->GadgetText->IText)+1); FreeMem(Gad->GadgetText, sizeof(struct IntuiText)); Gad->GadgetText = NULL; } while ((Gad = Gad->NextGadget) != NULL); ClearResource(RF_GadgetText); } if (CheckResource(RF_Font)) { CloseFont(TopazFont); ClearResource(RF_Font); } if (CheckResource(RF_Window)) { CloseWindow(KeyMapEdWindow); ClearResource(RF_Window); } if (CheckResource(RF_Intuition)) { CloseLibrary((struct Library *)IntuitionBase); ClearResource(RF_Intuition); } if (CheckResource(RF_Graphics)) { CloseLibrary((struct Library *)GfxBase); ClearResource(RF_Graphics); } if (CheckResource(RF_CurrentDir)) { templock = CurrentDir(OldDirLock); ClearResource(RF_CurrentDir); } if (CheckResource(RF_DirLock)) { UnLock(DirLock); ClearResource(RF_DirLock); } return(ReturnCode); }