/* ** $VER: GrabKey 1.0 (08 May 1996) ** ** ** © 1996 Timo C. Nentwig ** all rights reserved ! ** ** ====================================== ** ** Language: ** ¯¯¯¯¯¯¯¯ ** ** Program is compiled by SAS/C ** ** ** Purpose: ** ¯¯¯¯¯¯¯ ** ** Grab/Print active window or screen ** by hotkey. ** ** Requirements: ** ¯¯¯¯¯¯¯¯¯¯¯¯ ** ** · AmigaOS v39+ ** · datatypes.library ** ** Bugs: ** ¯¯¯¯ ** ** ** ** ToDo: ** ¯¯¯¯ ** ** ** ** Notes: ** ¯¯¯¯¯ ** ** ** ====================================== ** ** History: ** ¯¯¯¯¯¯¯ ** ** 08 May 1996 - 1.0 : initial release ** 08 May 1996 - 1.1 : can also grab active screen ** OUTPATH -> FILE ** */ /// #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /// /// #define #define EVT_WINKEY 1L #define EVT_SCRKEY 2L #define EVT_PRTKEY 3L #define EVT_PRTKEY_SCR 4L #define PRG_VERSION "1.1" #define PRG_TITLE "GrabKey" #define PRG_AUTHOR "Timo C. Nentwig" #define PRG_YEAR "1996" #define MAX(a,b) ((a) > (b) ? (a) : (b)) /// /// Prototypes VOID ProcessMsg (VOID); BOOL AttachFilter (STRPTR onkey, ULONG user_event); VOID SavePicture (Object *Picture, STRPTR FileName); VOID PrintPicture (Object *Picture); Object * GetPicture (BOOL fullscreen); /// struct IntuitionBase *IntuitionBase; struct GfxBase *GfxBase; struct Library *DataTypesBase; struct Library *CxBase; struct MsgPort *broker_mp; CxObj *broker; ULONG cxsigflag; STRPTR filename; struct Picture { UWORD Left; UWORD Top; UWORD Width; UWORD Height; UWORD PageWidth; UWORD PageHeight; UWORD Depth; }; /// main () VOID main (UWORD argc, STRPTR *argv) { if (IntuitionBase = (struct IntuitionBase *) OpenLibrary ("intuition.library", 39)) { if (DOSBase = (struct DosLibrary *) OpenLibrary ("dos.library", 39)) { if (GfxBase = (struct GfxBase *) OpenLibrary ("graphics.library", 39)) { if (DataTypesBase = OpenLibrary ("datatypes.library", 39)) { if (CxBase = OpenLibrary ("commodities.library", 39)) { if (broker_mp = CreateMsgPort()) { STRPTR *ttypes; STRPTR winkey; STRPTR scrkey; STRPTR prtkey; STRPTR prtkey_scr; struct NewBroker newbroker = { NB_VERSION, PRG_TITLE, PRG_TITLE" "PRG_VERSION" © "PRG_YEAR" by "PRG_AUTHOR, "Save/Print active window by hotkey", NBU_UNIQUE | NBU_NOTIFY, 0, 0, 0, 0 }; newbroker.nb_Port = broker_mp; cxsigflag = 1L << broker_mp->mp_SigBit; ttypes = ArgArrayInit (argc, argv); newbroker.nb_Pri = (BYTE) ArgInt (ttypes, "CX_PRIORITY", 0); winkey = ArgString (ttypes, "WINKEY", "LALT F1"); scrkey = ArgString (ttypes, "SCRKEY", "LALT F2"); prtkey = ArgString (ttypes, "PRTKEY", "LALT F3"); prtkey_scr = ArgString (ttypes, "PRTKEY_SCR", "LALT F4"); filename = ArgString (ttypes, "FILE", "ram:"PRG_TITLE".IFF"); if (broker = CxBroker (&newbroker, NULL)) { CxMsg *msg; if (AttachFilter (winkey, EVT_WINKEY) && AttachFilter (scrkey, EVT_SCRKEY) && AttachFilter (prtkey, EVT_PRTKEY) && AttachFilter (prtkey, EVT_PRTKEY_SCR)) { ActivateCxObj (broker, 1L); ProcessMsg(); } DeleteCxObjAll (broker); while (msg = (CxMsg *) GetMsg (broker_mp)) // Empty the port of all CxMsgs ReplyMsg ((struct Message *) msg); } DeletePort(broker_mp); } ArgArrayDone(); CloseLibrary (CxBase); } else { printf ("ERROR: Couldn't open commodities.library v39+\n"); } CloseLibrary ((struct Library *) DataTypesBase); } else { printf ("ERROR: Couldn't open datatypes.library v39+\n"); } CloseLibrary ((struct Library *) GfxBase); } else { printf ("ERROR: Couldn't open graphics.library v39+\n"); } CloseLibrary ((struct Library *) DOSBase); } CloseLibrary ((struct Library *) IntuitionBase); } else { printf ("ERROR: Couldn't open intuition.library v39+\n"); } } /// /// ProcessMsg () /* * FROM /rkm/libs/commodities/hotkey.c * * FUNCTION Process commodity messages. * * NOTE * * EXAMPLE ProcessMsg (); * */ VOID ProcessMsg (VOID) { CxMsg *msg; Object *Picture; ULONG sigrcvd; ULONG msgid; ULONG msgtype; LONG returnvalue = 1L; while (returnvalue) { sigrcvd = Wait (SIGBREAKF_CTRL_C | cxsigflag); while (msg = (CxMsg *) GetMsg (broker_mp)) { msgid = CxMsgID (msg); msgtype = CxMsgType (msg); ReplyMsg ((struct Message *) msg); switch (msgtype) { case CXM_IEVENT: switch (msgid) { case EVT_WINKEY: // window if (Picture = GetPicture (FALSE)) { SavePicture (Picture, filename); } break; case EVT_SCRKEY: // screen if (Picture = GetPicture (TRUE)) { SavePicture (Picture, filename); } break; case EVT_PRTKEY: // window if (Picture = GetPicture (FALSE)) { PrintPicture (Picture); } break; case EVT_PRTKEY_SCR: // screen if (Picture = GetPicture (TRUE)) { PrintPicture (Picture); } break; } break; case CXM_COMMAND: switch (msgid) { case CXCMD_DISABLE: ActivateCxObj (broker, 0L); break; case CXCMD_ENABLE: ActivateCxObj (broker, 1L); break; case CXCMD_KILL: returnvalue = 0L; break; case CXCMD_UNIQUE: returnvalue = 0L; break; } break; } } if (sigrcvd & SIGBREAKF_CTRL_C) returnvalue = 0L; } } /// /// AttachFilter () /* * FROM /CenterWin/CenterWin.c * * FUNCTION Attach a filter. * * NOTE * * EXAMPLE AttachFilter (hotkey, EVT_HOTKEY); * */ BOOL AttachFilter (STRPTR onkey, ULONG user_event) { CxObj *filter; CxObj *sender; CxObj *translator; if (filter = CxFilter (onkey)) { AttachCxObj (broker, filter); if (sender = CxSender (broker_mp, user_event)) { AttachCxObj (filter, sender); if (translator = CxTranslate (NULL)) { AttachCxObj (filter, translator); if ( ! (CxObjError (filter))) return (TRUE); } } } return (FALSE); } /// /// SavePicture () /* * FUNCTION Save an Object *Picture. * * NOTE * * EXAMPLE SavePicture (Picture, "ram:file"); * */ VOID SavePicture (Object *Picture, STRPTR FileName) { BPTR FileHandle; if (FileHandle = Open (FileName, MODE_NEWFILE)) { if (DoMethod (Picture, DTM_WRITE, NULL, FileHandle, DTWM_IFF, NULL)) { Close (FileHandle); } else { Close (FileHandle); DeleteFile (FileName); } } DisposeDTObject (Picture); } /// /// PrintPicture () /* * FUNCTION Print an Object *Picture. * * NOTE * * EXAMPLE PrintPicture (Picture); * */ VOID PrintPicture (Object *Picture) { struct MsgPort *PrinterPort; if (PrinterPort = CreateMsgPort()) { union printerIO *PrinterIO; if (PrinterIO = (union printerIO *) CreateIORequest (PrinterPort, sizeof (union printerIO))) { if ( ! (OpenDevice ("printer.device", 0, (struct IORequest *) PrinterIO, NULL))) { DoMethod (Picture, DTM_PRINT, NULL, PrinterIO, NULL); CloseDevice ((struct IORequest *) PrinterIO); } DeleteIORequest ((struct IORequest *) PrinterIO); } DeleteMsgPort (PrinterPort); } DisposeDTObject (Picture); } /// /// GetPicture () /* * FUNCTION Get bitmap for picture. * * NOTE * * EXAMPLE Object *Picture = GetPicture(); * */ Object * GetPicture (BOOL fullscreen) { struct RastPort *RPort; if (RPort = (struct RastPort *) AllocVec (sizeof (struct RastPort), MEMF_ANY)) { struct Picture *Pic; if (Pic = AllocVec (sizeof (struct Picture), MEMF_ANY)) { struct BitMap *BitMap; struct Window *Win; struct Screen *Scr; ULONG IntuiLock; BOOL Locked = TRUE; InitRastPort (RPort); IntuiLock = LockIBase (NULL); Win = IntuitionBase -> ActiveWindow; Scr = IntuitionBase -> ActiveScreen; Pic -> PageWidth = Scr -> Width; Pic -> PageHeight = Scr -> Height; if (fullscreen) { Pic -> Left = Scr -> LeftEdge; Pic -> Top = Scr -> TopEdge; Pic -> Width = Scr -> Width; Pic -> Height = Scr -> Height; Pic -> Depth = GetBitMapAttr (Scr -> RastPort . BitMap, BMA_DEPTH); BitMap = AllocBitMap (Pic -> Width, Pic -> Height, Pic -> Depth, BMF_CLEAR, Scr -> RastPort . BitMap); } else { Pic -> Left = Win -> LeftEdge; Pic -> Top = Win -> TopEdge; Pic -> Width = Win -> Width; Pic -> Height = Win -> Height; Pic -> Depth = GetBitMapAttr (Win -> RPort -> BitMap, BMA_DEPTH); BitMap = AllocBitMap (Pic -> Width, Pic -> Height, Pic -> Depth, BMF_CLEAR, Win -> RPort -> BitMap); } if (BitMap) { ULONG *ColourTable; ULONG ModeID; LONG NumColours; NumColours = Scr -> ViewPort . ColorMap -> Count; ModeID = BestModeID (BIDTAG_NominalWidth, Pic -> Width, BIDTAG_NominalHeight, Pic -> Height, BIDTAG_Depth, Pic -> Depth, TAG_END); RPort -> BitMap = BitMap; if (fullscreen) ClipBlit (&Scr -> RastPort, 0, 0, RPort, 0, 0, Pic -> Width, Pic -> Height, 0xC0); else ClipBlit (Win -> RPort, 0, 0, RPort, 0, 0, Pic -> Width, Pic -> Height, 0xC0); WaitBlit (); if (ColourTable = (ULONG *) AllocVec (sizeof (ULONG) * 3 * NumColours, MEMF_ANY)) { Object *Picture; GetRGB32 (Scr -> ViewPort . ColorMap, 0, NumColours, ColourTable); UnlockIBase (IntuiLock); Locked = FALSE; if (Picture = NewDTObject (PRG_TITLE"BitMap", DTA_SourceType, DTST_RAM, DTA_GroupID, GID_PICTURE, PDTA_NumColors, NumColours, PDTA_BitMap, BitMap, PDTA_ModeID, ModeID, TAG_END)) { struct ColorRegister *ColourMap; struct BitMapHeader *BitMapHeader; ULONG *Colours; if (GetDTAttrs (Picture, PDTA_BitMapHeader, &BitMapHeader, PDTA_ColorRegisters, &ColourMap, PDTA_CRegs, &Colours, TAG_END) == 3) { BitMapHeader -> bmh_Left = Pic -> Left; BitMapHeader -> bmh_Top = Pic -> Top; BitMapHeader -> bmh_Width = Pic -> Width; BitMapHeader -> bmh_Height = Pic -> Height; BitMapHeader -> bmh_Depth = Pic -> Depth; BitMapHeader -> bmh_PageWidth = Pic -> PageWidth; BitMapHeader -> bmh_PageHeight = Pic -> PageHeight; CopyMem (ColourTable, Colours, 3 * sizeof (ULONG) * NumColours); while (NumColours--) { ColourMap -> red = (UBYTE) ((*Colours++) >> 24); ColourMap -> green = (UBYTE) ((*Colours++) >> 24); ColourMap -> blue = (UBYTE) ((*Colours++) >> 24); ColourMap++; } FreeVec (ColourTable); FreeVec (RPort); return (Picture); } else { printf ("ERROR: GetDTAttrs() failed.\n"); } DisposeDTObject (Picture); BitMap = NULL; } else { printf ("ERROR: NewDTObject failed.\n"); } FreeVec (ColourTable); } FreeBitMap (BitMap); } if (Locked) UnlockIBase (IntuiLock); FreeVec (Pic); } FreeVec (RPort); } return (NULL); } ///