;/* Execute me to Compile and link shelltimer start verbose ; For debugging, use the following command: ;lc -. -b1 -cfistq -j73 -v -Lit -d3 -isrc:memlib -dMWDEBUG=1 CloneCommandKeys.c ; For develpoment, use the following commands: lc -. -O -ms -b1 -cfistq -j73 -v CloneCommandKeys.c blink define __main=__tinymain MAP mapfile NODEBUG SMALLCODE SMALLDATA FROM lib:c.o,CloneCommandKeys.o to CloneCommandKeys LIBRARY LIB:lc.lib,LIB:amiga.lib ; For production, use the following command: ;lc -. -O -ms -b0 -cfistq -j73 -Lit -tr CloneCommandKeys.c echo "Time to compile and link: " NOLINE shelltimer stop quit */ /*** **** CLONECOMMANDKEYS.C **** **** Creation: John Lindwall **** 12 Feb 1992 **** **** Description: CloneCommandKeys is a Commodity that maps the **** AmigaDOS 2.04 Shell's CUT and PASTE commands to any keys. **** By default, CloneCommandKey will make LEFT-amiga-c also **** operate as COPY, and LEFT-amiga-v will also act as PASTE. **** Alternately, you can specify any key-mapping you like by **** using ToolTypes. **** **** This program requires AmigaDOS 2.04. **** **** CloneCommandKeys is released into the Public Domain by the **** author, John Lindwall. I ask that the archive be kept intact **** with the docs and the source code. **** Bug reports should be sent to me at johnl@crash.cts.com. **** **** The code looked nicer before I optimized for space... **** **** Overhauls: ***/ #include #include #include #include #include #include #include #include #include void main(int, char **); LONG ProcessMessages(void); BOOL SetupBroker(int argc, char *argv[], char **copyKey, char **pasteKey); BOOL CloneCommandKey(char *copyKey, struct InputEvent *event); /* Error codes */ #define ERR_OPENLIBFAIL 20 #define ERR_BROKERFAIL 0 /* Uniqueness violation */ #define ERR_CLONEFAIL 10 #define OPENLIBRARIES() \ (((CxBase = OpenLibrary("commodities.library", 37L))!=NULL) && \ ((IconBase = OpenLibrary("icon.library", 36L))!=NULL) ) #define CLOSELIBRARIES() \ if( IconBase ) CloseLibrary(IconBase); \ if( CxBase ) CloseLibrary(CxBase); #define SHUTDOWNBROKER() \ if( broker ) DeleteCxObjAll(broker); \ if( newbroker.nb_Port != NULL ) DeleteMsgPort(newbroker.nb_Port); \ ArgArrayDone(); UBYTE versionTag[] = "\0$VER: CloneCommandKeys 1.0 (14.02.92)"; struct Library *CxBase, *IconBase; CxObj *broker; ULONG cxSignal; struct NewBroker newbroker = { NB_VERSION, "CloneCommandKeys", &versionTag[7], "Clones the COPY and PASTE command keys", NBU_UNIQUE | NBU_NOTIFY, 0, 0, 0, 0 }; /* * Here are the InputEvents that our translate CxObjects jam into the * event stream. The copyEvent is the "rcommand c" keycode; the pasteEvent * is the "rcommand v" keycode. */ struct InputEvent copyEvent = { NULL, IECLASS_RAWKEY, IESUBCLASS_COMPATIBLE, 0x33, IEQUALIFIER_RCOMMAND }; struct InputEvent pasteEvent = { NULL, IECLASS_RAWKEY, IESUBCLASS_COMPATIBLE, 0x34, IEQUALIFIER_RCOMMAND }; void main(int argc, char **argv) { char *copyKey, *pasteKey; int status; status = 0; if( ! OPENLIBRARIES() ) { status = ERR_OPENLIBFAIL; if( argc != 0 ) { Write(Output(), "Error opening libraries\n", 24); } goto exit; } if( SetupBroker(argc, argv, ©Key, &pasteKey) == FALSE ) { status = ERR_BROKERFAIL; goto exit; } if( CloneCommandKey(copyKey, ©Event) == FALSE || CloneCommandKey(pasteKey, &pasteEvent) == FALSE ) { status = ERR_CLONEFAIL; goto exit; } ActivateCxObj(broker, 1L); while( ProcessMessages() ) { ; /* Empty */ } exit: SHUTDOWNBROKER(); CLOSELIBRARIES(); exit(status); } BOOL SetupBroker(int argc, char *argv[], char **copyKey, char **pasteKey) { struct MsgPort *brokerPort; char **toolTypes; if( brokerPort = CreateMsgPort() ) { newbroker.nb_Port = brokerPort; cxSignal = 1L << brokerPort->mp_SigBit; toolTypes = ArgArrayInit(argc, argv); newbroker.nb_Pri = (BYTE)ArgInt(toolTypes, "CX_PRIORITY", 0); *copyKey = ArgString(toolTypes, "COPYKEY", "lcommand c"); *pasteKey = ArgString(toolTypes, "PASTEKEY", "lcommand v"); if( broker = CxBroker(&newbroker, NULL) ) { return(TRUE); } } return(FALSE); } BOOL CloneCommandKey(char *key, struct InputEvent *event) { CxObj *filter, *translate; if( filter = CxFilter(key) ) { AttachCxObj(broker, filter); if( translate = CxTranslate(event) ) { AttachCxObj(filter, translate); } } if( ! CxObjError(filter) ) { return(TRUE); } return(FALSE); } LONG ProcessMessages(void) { CxMsg *msg; ULONG signalReceived; LONG returnValue = 1L; signalReceived = Wait( SIGBREAKF_CTRL_C | cxSignal); while( msg = (CxMsg *) GetMsg(newbroker.nb_Port)) { switch( CxMsgType(msg) ) { case CXM_COMMAND: switch( CxMsgID(msg) ) { case CXCMD_DISABLE: ActivateCxObj(broker, 0L); break; case CXCMD_ENABLE: ActivateCxObj(broker, 1L); break; case CXCMD_KILL: case CXCMD_UNIQUE: returnValue = 0L; break; } break; } ReplyMsg((struct Message *) msg); } if( signalReceived & SIGBREAKF_CTRL_C ) { returnValue = 0L; } return(returnValue); }