home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 616.lha / DragIt_v1.01 / DragIt.c < prev    next >
C/C++ Source or Header  |  1992-03-02  |  9KB  |  360 lines

  1. ///////////////////////////////////////////////////////////////////////////
  2. //                                                                       //
  3. //                     DragIt 1.01 by Steve Lemieux                       //
  4. //  © Copyright 1992, SilverBox Software, All rights reserved, Freeware  //
  5. //                                                                       //
  6. ///////////////////////////////////////////////////////////////////////////
  7.  
  8.  
  9. #include <exec/memory.h>
  10. #include <exec/interrupts.h>
  11. #include <graphics/layers.h>
  12. #include <dos/dos.h>
  13. #include <dos/dosextens.h>
  14. #include <devices/input.h>
  15. #include <devices/inputevent.h>
  16. #include <intuition/intuitionbase.h>
  17. #include <intuition/screens.h>
  18. #include <graphics/gfxbase.h>
  19. #include <workbench/workbench.h>
  20. #include <libraries/commodities.h>
  21.  
  22. #include <pragmas/input_lib.h>
  23. #include <pragmas/intuition_lib.h>
  24. #include <pragmas/icon_lib.h>
  25. #include <pragmas/graphics_lib.h>
  26. #include <pragmas/layers_lib.h>
  27. #include <pragmas/commodities_lib.h>
  28. #include <pragmas/dos_lib.h>
  29. #include <pragmas/exec_lib.h>
  30.  
  31. #define LIBVERSION 36
  32.  
  33. struct LayersBase *LayersBase;
  34. struct IntuitionBase *IntuitionBase;
  35. struct GfxBase *GfxBase;
  36. struct MsgPort *InputMP;
  37. struct MsgPort *Port;
  38. struct IOStdReq *InputIO;
  39. struct Library *InputBase;
  40. struct Interrupt Handler;
  41. struct Window *Window;
  42. struct Screen *scr;
  43. struct DOSBase *DOSBase;
  44. struct Library *IconBase;
  45. struct RastPort *rp;
  46. struct RDArgs *RDArgs;
  47. struct MsgPort *CxPort;
  48. struct Library *CxBase;
  49.  
  50. CxObj *Broker;
  51. ULONG *ArgsArray[7];
  52. WORD PosX,PosY,OldPosX,OldPosY,WinPosX,WinPosY;
  53. WORD SizeX,SizeY,dx,dy,ScrX,ScrY,Enable = TRUE;
  54.  
  55. LONG Device = -1;
  56. ULONG peek;
  57.  
  58. struct InputEvent *handler();
  59. struct NewBroker NewBroker =
  60.     {
  61.     NB_VERSION, "DragIt",
  62.     "DragIt 1.01, © 1992 by Steve Lemieux",
  63.     "Drag a window from anywhere!",
  64.     NBU_UNIQUE,0,0,0,0
  65.     };
  66.  
  67.  
  68. void Quitter(UWORD code)
  69.     {
  70.     if (Broker) DeleteCxObj(Broker);
  71.     if (CxPort) DeleteMsgPort(CxPort);
  72.     if (RDArgs) FreeArgs(RDArgs);
  73.     if (!Device) CloseDevice(InputIO);
  74.     if (InputIO) DeleteExtIO(InputIO);
  75.     if (InputMP) DeleteMsgPort(InputMP);
  76.     if (Port) DeleteMsgPort(Port);
  77.     if (IconBase) CloseLibrary(IconBase);
  78.     if (CxBase) CloseLibrary(CxBase);
  79.     if (GfxBase) CloseLibrary(GfxBase);
  80.     if (IntuitionBase) CloseLibrary(IntuitionBase);
  81.     if (LayersBase) CloseLibrary(LayersBase);
  82.     exit(code);
  83.     }
  84.  
  85. void Ouvrir(void)
  86.     {
  87.     if (!(IconBase = (struct IconBase *)OpenLibrary("icon.library",LIBVERSION)))
  88.         Quitter(10);
  89.     if (!(LayersBase = (struct LayersBase *)OpenLibrary("layers.library",LIBVERSION)))
  90.         Quitter(10);
  91.     if (!(IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",LIBVERSION)))
  92.         Quitter(10);
  93.     if (!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",LIBVERSION)))
  94.         Quitter(10);
  95.     if (!(CxBase = (struct CxBase *)OpenLibrary("commodities.library",LIBVERSION)))
  96.         Quitter(10);
  97.     if (!(InputMP = (struct MsgPort *)CreateMsgPort()))
  98.         Quitter(10);
  99.     if (!(Port = (struct MsgPort *)CreateMsgPort()))
  100.         Quitter(10);
  101.     if (!(InputIO = (struct StdIOReq *)CreateExtIO(InputMP,sizeof(struct IOStdReq))))
  102.         Quitter(10);
  103.     if (Device = OpenDevice("input.device",NULL,InputIO,NULL))
  104.         Quitter(10);
  105.     InputBase = (struct Library *)InputIO->io_Device;
  106.     if (!(CxPort = (struct MsgPort *)CreateMsgPort()))
  107.         Quitter(10);
  108.     NewBroker.nb_Port = CxPort;
  109.     if (!(Broker = (CxObj *)CxBroker(&NewBroker, NULL)))
  110.         Quitter(10);
  111.     ActivateCxObj(Broker, TRUE);
  112.     }
  113.  
  114. void Send(void)
  115.     {
  116.     struct Message *Msg;
  117.  
  118.     if (Msg = (struct Message *)AllocMem(sizeof(struct Message), MEMF_PUBLIC))
  119.         {
  120.         Msg->mn_ReplyPort = NULL;
  121.         Msg->mn_Length = sizeof(struct Message);
  122.         PutMsg(Port, Msg);
  123.         }
  124.     }
  125.  
  126. void __asm HandlerCode(register __a0 struct InputEvent *Ev)
  127.     {
  128.     struct InputEvent *ev;
  129.     UWORD Qual;
  130.  
  131.     for (ev = Ev; ev; ev = ev->ie_NextEvent)
  132.         if (ev->ie_Class == IECLASS_RAWMOUSE)
  133.             if (ev->ie_Code == IECODE_LBUTTON)
  134.                 if (Enable)
  135.                     {
  136.                     Qual = PeekQualifier();
  137.                     if ((Qual & peek) == peek)
  138.                         {
  139.                         ev->ie_Class = IECLASS_NULL;
  140.                         Send();
  141.                         }
  142.                     }
  143.     }
  144.  
  145. void TestPos(WORD X,WORD Y)
  146.     {
  147.     dx = X - WinPosX;
  148.     dy = Y - WinPosY;
  149.  
  150.     if (dx < 0) dx = 0;
  151.     if (dy < 0) dy = 0;
  152.     if (dx > ScrX) dx = ScrX;
  153.     if (dy > ScrY) dy = ScrY;
  154.     }
  155.  
  156. void DrawRectangle(WORD X,WORD Y)
  157.     {
  158.     TestPos(X,Y);
  159.     SetDrMd(rp,COMPLEMENT);
  160.     Move(rp,dx,dy);
  161.     Draw(rp,dx+SizeX,dy);
  162.     Draw(rp,dx+SizeX,dy+SizeY);
  163.     Draw(rp,dx,dy+SizeY);
  164.     Draw(rp,dx,dy+1);
  165.     Move(rp,dx+1,dy+1);
  166.     Draw(rp,dx+1,dy+SizeY-1);
  167.     Move(rp,dx+SizeX-1,dy+1);
  168.     Draw(rp,dx+SizeX-1,dy+SizeY-1);
  169.     }
  170.  
  171. void GetPos(void)
  172.     {
  173.     PosX = IntuitionBase->MouseX;
  174.     PosY = IntuitionBase->MouseY;
  175.     if (!(scr->ViewPort.Modes & LACE))
  176.         PosY >>= 1;
  177.     if (!(scr->ViewPort.Modes & HIRES))
  178.         PosX >>= 1;
  179.     }
  180.  
  181. void Scroll(void)
  182.     {
  183.     UBYTE *Button;
  184.     WORD PosX2,PosY2;
  185.  
  186.     SizeX = Window->Width - 1;
  187.     SizeY = Window->Height - 1;
  188.     ScrX = scr->Width - SizeX - 1;
  189.     ScrY = scr->Height - SizeY - 1;
  190.  
  191.     GetPos();
  192.  
  193.     PosX2 = OldPosX = PosX;
  194.     PosY2 = OldPosY = PosY;
  195.     WinPosX = PosX - Window->LeftEdge;
  196.     WinPosY = PosY - Window->TopEdge;
  197.  
  198.     Button = (UBYTE *)0xbfe001;
  199.     rp = &(scr->RastPort);
  200.  
  201.     LockLayerInfo(&(scr->LayerInfo));
  202.     LockLayers(&(scr->LayerInfo));
  203.     DrawRectangle(PosX,PosY);
  204.     do
  205.         {
  206.         GetPos();
  207.         if (PosX != OldPosX || PosY != OldPosY)
  208.             {
  209.             DrawRectangle(OldPosX,OldPosY);
  210.             OldPosX = PosX;
  211.             OldPosY = PosY;
  212.             DrawRectangle(PosX,PosY);
  213.             WaitTOF();
  214.             }
  215.         }
  216.     while(!((*Button) & 64));
  217.     DrawRectangle(OldPosX,OldPosY);
  218.     TestPos(PosX,PosY);
  219.     UnlockLayers(&(scr->LayerInfo));
  220.     UnlockLayerInfo(&(scr->LayerInfo));
  221.     if (PosX != PosX2 || PosY != PosY2)
  222.         ChangeWindowBox(Window,dx,dy,Window->Width,Window->Height);
  223.     }
  224.  
  225. UWORD TraiterCx(void)
  226.     {
  227.     CxMsg *CxMsg;
  228.     UWORD Quit = FALSE;
  229.     ULONG msgid, msgtype;
  230.  
  231.     while(CxMsg = (LONG *)GetMsg(CxPort))
  232.         {
  233.         msgid = CxMsgID(CxMsg);
  234.         msgtype = CxMsgType(CxMsg);
  235.         ReplyMsg((struct Message *)CxMsg);
  236.  
  237.         if (msgtype == CXM_COMMAND)
  238.             switch(msgid)
  239.                 {
  240.                 case CXCMD_DISABLE:
  241.                     Enable = FALSE;
  242.                     ActivateCxObj(Broker, FALSE);
  243.                     break;
  244.                 case CXCMD_ENABLE:
  245.                     Enable = TRUE;
  246.                     ActivateCxObj(Broker, TRUE);
  247.                     break;
  248.                 case CXCMD_KILL:
  249.                     Quit = TRUE;
  250.                     break;
  251.                 }
  252.         }
  253.     return(Quit);
  254.     }
  255.  
  256. void _main(void)
  257.     {
  258.     long sig,sigport,sigcx;
  259.     struct Message *msg;
  260.     struct Layer *layer = NULL;
  261.     struct Task *Task;
  262.     struct DiskObject *diskobj;
  263.  
  264.     Ouvrir();
  265.  
  266.     if (Cli())
  267.         {
  268.         PutStr("\33[33mDragIt 1.01 by Steve Lemieux\33[31m\n© Copyright 1992, SilverBox Software, All rights reserved, Freeware\33[31m\n");
  269.         if (RDArgs = (struct RDArgs *)ReadArgs("LSHIFT/S,RSHIFT/S,CONTROL/S,LALT/S,RALT/S,LCOMMAND/S,RCOMMAND/S",ArgsArray,NULL))
  270.             {
  271.             if (ArgsArray[0])
  272.                 peek |= IEQUALIFIER_LSHIFT;
  273.             if (ArgsArray[1])
  274.                 peek |= IEQUALIFIER_RSHIFT;
  275.             if (ArgsArray[2])
  276.                 peek |= IEQUALIFIER_CONTROL;
  277.             if (ArgsArray[3])
  278.                 peek |= IEQUALIFIER_LALT;
  279.             if (ArgsArray[4])
  280.                 peek |= IEQUALIFIER_RALT;
  281.             if (ArgsArray[5])
  282.                 peek |= IEQUALIFIER_LCOMMAND;
  283.             if (ArgsArray[6])
  284.                 peek |= IEQUALIFIER_RCOMMAND;
  285.             }
  286.         else
  287.             {
  288.             PutStr("Invalid parameters!\n");
  289.             Quitter(10);
  290.             }
  291.         }
  292.     else
  293.         {
  294.         Task = (struct Task *)FindTask(NULL);
  295.         if (diskobj = (struct DiskObject *)GetDiskObjectNew(Task -> tc_Node.ln_Name))
  296.             {
  297.             if (FindToolType(diskobj->do_ToolTypes,"LSHIFT"))
  298.                 peek |= IEQUALIFIER_LSHIFT;
  299.             if (FindToolType(diskobj->do_ToolTypes,"RSHIFT"))
  300.                 peek |= IEQUALIFIER_RSHIFT;
  301.             if (FindToolType(diskobj->do_ToolTypes,"CONTROL"))
  302.                 peek |= IEQUALIFIER_CONTROL;
  303.             if (FindToolType(diskobj->do_ToolTypes,"LALT"))
  304.                 peek |= IEQUALIFIER_LALT;
  305.             if (FindToolType(diskobj->do_ToolTypes,"RALT"))
  306.                 peek |= IEQUALIFIER_RALT;
  307.             if (FindToolType(diskobj->do_ToolTypes,"LCOMMAND"))
  308.                 peek |= IEQUALIFIER_LCOMMAND;
  309.             if (FindToolType(diskobj->do_ToolTypes,"RCOMMAND"))
  310.                 peek |= IEQUALIFIER_RCOMMAND;
  311.             FreeDiskObject(diskobj);
  312.             }
  313.         }
  314.  
  315.     if (!peek) peek |= IEQUALIFIER_LSHIFT;
  316.  
  317.     Handler.is_Code = (APTR)handler;
  318.     Handler.is_Data = NULL;
  319.     Handler.is_Node.ln_Pri = 100;
  320.     Handler.is_Node.ln_Name = "DragIt Handler";
  321.     InputIO->io_Data = &Handler;
  322.     InputIO->io_Command = IND_ADDHANDLER;
  323.     DoIO(InputIO);
  324.  
  325.     sigport = 1<<Port->mp_SigBit;
  326.     sigcx = 1<<CxPort->mp_SigBit;
  327.     while(TRUE)
  328.         {
  329.         sig = Wait(sigcx|sigport|SIGBREAKF_CTRL_C);
  330.         if (sig & sigport)
  331.             while (msg = (struct Message *)GetMsg(Port))
  332.                 {
  333.                 FreeMem(msg, msg->mn_Length);
  334.  
  335.                 for (scr = IntuitionBase->FirstScreen; scr; scr = scr->NextScreen)
  336.                     {
  337.                     GetPos();
  338.                     if (layer = (struct Layer *)WhichLayer(&(scr->LayerInfo), PosX - scr->ViewPort.DxOffset, PosY - scr->ViewPort.DyOffset))
  339.                         break;
  340.                     if (PosY >= scr->ViewPort.DyOffset)
  341.                         break;
  342.                     }
  343.                 if (layer)
  344.                     if (Window = layer->Window)
  345.                         if (!(Window->Flags & BACKDROP))
  346.                             Scroll();
  347.                 }
  348.         if (sig & sigcx)
  349.             if (TraiterCx()) break;
  350.         if (sig & SIGBREAKF_CTRL_C)
  351.             break;
  352.         }
  353.  
  354.     InputIO->io_Data = &Handler;
  355.     InputIO->io_Command = IND_REMHANDLER;
  356.     DoIO(InputIO);
  357.  
  358.     Quitter(0);
  359.     }
  360.