home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 192.lha / wrap.c < prev    next >
C/C++ Source or Header  |  1988-04-28  |  8KB  |  348 lines

  1. /* November 6th, 1988 */
  2.  
  3. /* I took the MachMouse source code and cut it down to just the parts  */
  4. /* which were needed for the pointer manipulation, So this source is   */
  5. /* actually already in the PD. Anyway, I just thought I'd include it   */
  6. /* because I HATE IT WHEN SOMEONE DOESN'T DISTRIBUTE THEIR SOURCE CODE */
  7. /* WITH THEIR PROGRAM. drives me nuts. This is totally PD, ofcourse.   */
  8. /* Probably not perfectly written, and no documentation - sorry. */
  9. /* Used Manx C v3.4b */
  10.  
  11. /* Enjoy, K.Mardam-Bey */
  12.  
  13. #include <devices/input.h>
  14. #include <devices/inputevent.h>
  15. #include <devices/timer.h>
  16. #include <exec/types.h>
  17. #include <exec/interrupts.h>
  18. #include <exec/memory.h>
  19. #include <exec/ports.h>
  20. #include <functions.h>
  21. #include <intuition/intuition.h>
  22. #include <intuition/intuitionbase.h>
  23. #include <graphics/gfxbase.h>
  24.  
  25.  
  26. #define QUIT         0x1
  27. #define MOVEIT       0x4
  28. #define DELAY    1000000L
  29. #define LAMIGA       0x66
  30. #define STOPIT       0x41
  31.  
  32. char PortName[] = "PPT";
  33.  
  34. short left, right;
  35. short dx,dy;
  36. short x,y;
  37. short event;
  38. short lastcode = 0;
  39. long  sec = 0,micro = 0;
  40. short rbuttonisdown = 0, lbuttonisdown = 0;
  41.  
  42. struct MsgPort       *inputPort = NULL;
  43. struct IOStdReq      *inputReq = NULL;
  44. struct MsgPort       *TimerPort = NULL;
  45. struct Screen        *s;
  46. struct IntuitionBase *IntuitionBase = NULL;
  47. struct GfxBase       *GfxBase = NULL;
  48.  
  49. struct timerequest Timer_Req;
  50. long   TimerSig,tdevice = 1;
  51.  
  52. struct InputEvent phoney;
  53. struct HotInfo
  54.   {
  55.   struct Task *hotTask;
  56.   long  hotSig;
  57.   } hotStuff;
  58.  
  59. long signum = -1;
  60.  
  61. struct Interrupt handlerStuff;
  62. struct defPort
  63. {
  64.   struct MsgPort mp;
  65. };
  66.  
  67. struct defPort *defPortPtr;
  68. char defPortName[] = "MaDP";
  69. short updating = 0;
  70.  
  71. void HandlerInterface()
  72. {
  73. #asm
  74.   movem.l a4,-(sp)
  75.   jsr _geta4#
  76.   movem.l   A0/A1,-(sp)
  77.   jsr       _myhandler
  78.   addq.l    #8,A7
  79.   movem.l (sp)+,a4
  80. #endasm
  81. }
  82.  
  83. struct InputEvent *myhandler(ev1, hotStuff)
  84. struct InputEvent *ev1;
  85. struct HotInfo *hotStuff;
  86. {
  87.   struct InputEvent *ev, *last;
  88.   short removeit;
  89.   short evcode,evqual;
  90.  
  91.   event = 0;
  92.   for (ev=ev1,last = NULL; ev; ev=ev->ie_NextEvent)
  93.   {
  94.     evcode = ev->ie_Code;
  95.     evqual = ev->ie_Qualifier;
  96.     removeit = 0;
  97.  
  98.     if ((ev->ie_Class != IECLASS_TIMER))
  99.     {
  100.       if (ev->ie_Class == IECLASS_RAWKEY)
  101.       {
  102.         if ((evcode >= 0x80) && (evcode == (lastcode | 0x80))) {
  103.           removeit = 1;
  104.           lastcode = 0; }
  105.         else
  106.           if (evcode == LAMIGA) {
  107.             lastcode = evcode;
  108.             removeit = 1; }
  109.         else {
  110.           lastcode = 0;
  111.           removeit = 0;
  112.         }
  113.  
  114.         if ((evcode == STOPIT)&&((evqual & IEQUALIFIER_LCOMMAND) == IEQUALIFIER_LCOMMAND))
  115.         {
  116.           lastcode = evcode;
  117.           removeit = 1;
  118.           event |= QUIT;
  119.         }
  120.       }
  121.     }
  122.  
  123.     if (ev->ie_Class == IECLASS_RAWMOUSE)
  124.     {
  125.       if (!left && (evcode == IECODE_LBUTTON))
  126.         lbuttonisdown = 1;
  127.       if (!right && (evcode == IECODE_RBUTTON))
  128.         rbuttonisdown = 1;
  129.  
  130.       if ((ev->ie_TimeStamp.tv_secs == sec) && ((ev->ie_TimeStamp.tv_micro / 50000) == micro))
  131.       {
  132.         dx = ev->ie_X;
  133.         dy = ev->ie_Y;
  134.         if (!lbuttonisdown && !rbuttonisdown) event |= MOVEIT;
  135.       }
  136.  
  137.       if (ev->ie_TimeStamp.tv_secs)
  138.       {
  139.         micro = ev->ie_TimeStamp.tv_micro / 50000;
  140.         sec = ev->ie_TimeStamp.tv_secs;
  141.       }
  142.  
  143.       if (evcode == (IECODE_LBUTTON | 0x80))
  144.         lbuttonisdown = 0;
  145.       if (evcode == (IECODE_RBUTTON | 0x80))
  146.         rbuttonisdown = 0;
  147.     }
  148.  
  149.     if (removeit)
  150.       if (last == NULL)
  151.         ev1 = ev->ie_NextEvent;
  152.       else
  153.         last->ie_NextEvent = ev->ie_NextEvent;
  154.     else
  155.       last = ev;
  156.     }
  157.  
  158.   if (event)
  159.     Signal(hotStuff->hotTask,hotStuff->hotSig);
  160.   return(ev1);
  161. }
  162.  
  163. main (argc, argv)
  164. int argc;
  165. char *argv[];
  166. {
  167.   struct IntuiMessage *Msg;
  168.   long                class;
  169.   long                len;
  170.   short               i,j,f,c;
  171.  
  172.   IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0L);
  173.   if (!IntuitionBase) exit(0L);
  174.  
  175.   GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",0L);
  176.   if (!GfxBase) exit(0L);
  177.  
  178.   defPortPtr = (struct defPort *) FindPort(defPortName);
  179.   if (defPortPtr == NULL)
  180.   {
  181.     if ((defPortPtr = (struct defPort *) AllocMem((long)sizeof(struct defPort),MEMF_PUBLIC | MEMF_CLEAR)) == NULL)
  182.       exit(10);
  183.   }
  184.   else
  185.     updating = 1;
  186.  
  187.   if (updating)
  188.     Uninstall();
  189.  
  190.   i = left = right = 0;
  191.  
  192.   while (argv[1][i]) {
  193.     if (argv[1][i] == 'l')
  194.       left = 1;
  195.     if (argv[1][i] == 'r')
  196.       right = 1;
  197.     i += 1;
  198.   }
  199.  
  200.   defPortPtr->mp.mp_Node.ln_Pri = 0;
  201.   defPortPtr->mp.mp_Node.ln_Type = NT_MSGPORT;
  202.   NewList(&(defPortPtr->mp.mp_MsgList));
  203.   defPortPtr->mp.mp_Node.ln_Name = (char *) &(defPortName);
  204.  
  205.   AddPort(defPortPtr);
  206.  
  207.   if((signum = AllocSignal((long)-1)) == -1)
  208.     Uninstall();
  209.  
  210.   hotStuff.hotSig = 1 << signum;
  211.   hotStuff.hotTask = FindTask(NULL);
  212.  
  213.   if(!(inputPort = CreatePort(PortName,0)))
  214.     Uninstall();
  215.   if(!(inputReq = CreateStdIO(inputPort)))
  216.     Uninstall();
  217.  
  218.   handlerStuff.is_Data = (APTR)&hotStuff;
  219.   handlerStuff.is_Code = HandlerInterface;
  220.   handlerStuff.is_Node.ln_Pri = 55;
  221.   handlerStuff.is_Node.ln_Name = "PopHan";
  222.  
  223.   if(OpenDevice("input.device",0L,inputReq,0L) != 0)
  224.     Uninstall();
  225.  
  226.   inputReq->io_Command = IND_ADDHANDLER;
  227.   inputReq->io_Data = (APTR)&handlerStuff;
  228.  
  229.   DoIO(inputReq);
  230.  
  231.   if ((TimerPort = CreatePort("TimP", 0L)) == NULL)
  232.     Uninstall();
  233.  
  234.   if ((tdevice = OpenDevice(TIMERNAME, UNIT_VBLANK, &Timer_Req, 0L)) != 0)
  235.     Uninstall();
  236.   Timer_Req.tr_node.io_Message.mn_ReplyPort = TimerPort;
  237.   Timer_Req.tr_node.io_Command = TR_ADDREQUEST;
  238.   Timer_Req.tr_node.io_Flags = 0;
  239.   Timer_Req.tr_node.io_Error = 0;
  240.  
  241.   TimerSig = (1L << TimerPort->mp_SigBit);
  242.  
  243.   (void)SetTaskPri(FindTask(NULL), 0L);
  244.  
  245.   QueTimer();
  246.  
  247.   for (;;)
  248.   {
  249.     Wait(hotStuff.hotSig | TimerSig);
  250.  
  251.     if (Msg = (struct IntuiMessage *)GetMsg(TimerPort))
  252.       if (Msg) QueTimer();
  253.  
  254.     if (event & MOVEIT)
  255.       MovePointer();
  256.  
  257.     if (event & QUIT)
  258.       Uninstall();
  259.   }
  260. }
  261.  
  262. QueTimer()
  263. {
  264.   Timer_Req.tr_time.tv_secs = 0;
  265.   Timer_Req.tr_time.tv_micro = DELAY;
  266.   SendIO(&Timer_Req.tr_node);
  267. }
  268.  
  269. MovePointer()
  270. {
  271.   int height = 0;
  272.  
  273.   s = IntuitionBase->FirstScreen;
  274.   if (s == NULL) s = IntuitionBase->ActiveScreen;
  275.  
  276.   x = s->MouseX;
  277.   y = s->MouseY;
  278.  
  279.   height = GfxBase->NormalDisplayRows;
  280.   if (height > s->Height) height = s->Height;
  281.  
  282.   if (x < 1)
  283.     dx = s->Width * 2;
  284.   if (x >= s->Width - 1)
  285.     dx = (s->Width * -2);
  286.   if (y < 1)
  287.     dy = s->Height * 3;
  288.   if (y >= height - 1)
  289.     dy = (s->Height * -3);
  290.  
  291.   inputReq->io_Command = IND_WRITEEVENT;
  292.   inputReq->io_Flags = 0;
  293.   inputReq->io_Length = sizeof(struct InputEvent);
  294.   inputReq->io_Data = (APTR)&phoney;
  295.  
  296.   phoney.ie_NextEvent = NULL;
  297.   phoney.ie_Class = IECLASS_RAWMOUSE;
  298.   phoney.ie_TimeStamp.tv_secs = 0;
  299.   phoney.ie_TimeStamp.tv_micro = 0;
  300.   phoney.ie_Code = IECODE_NOBUTTON;
  301.   phoney.ie_Qualifier = IEQUALIFIER_RELATIVEMOUSE;
  302.   phoney.ie_X = dx;
  303.   phoney.ie_Y = dy;
  304.  
  305.   DoIO(inputReq);
  306. }
  307.  
  308. Uninstall()
  309. {
  310.   if (!updating)
  311.     {
  312.     if (inputReq)
  313.       {
  314.       inputReq->io_Command = IND_REMHANDLER;
  315.       inputReq->io_Data = (APTR)&handlerStuff;
  316.       DoIO(inputReq);
  317.  
  318.       CloseDevice(inputReq);
  319.       DeleteStdIO(inputReq);
  320.       }
  321.  
  322.     if (inputPort)    DeletePort(inputPort);
  323.     if (signum > -1)  FreeSignal(signum);
  324.  
  325.     if (tdevice == 0)
  326.       {
  327.       AbortIO(&Timer_Req.tr_node);
  328.       CloseDevice(&Timer_Req);
  329.       }
  330.  
  331.     if (TimerPort)
  332.       DeletePort(TimerPort);
  333.  
  334.     if (defPortPtr)
  335.       {
  336.       if (defPortPtr->mp.mp_Node.ln_Name)
  337.         RemPort(defPortPtr);
  338.       FreeMem(defPortPtr,(long)sizeof(struct defPort));
  339.       }
  340.     }
  341.  
  342.   if (IntuitionBase)
  343.     CloseLibrary(IntuitionBase);
  344.   if (GfxBase)
  345.     CloseLibrary(GfxBase);
  346.   exit(0L);
  347. }
  348.