home *** CD-ROM | disk | FTP | other *** search
/ Magazyn Exec 3 / CD_Magazyn_EXEC_nr_3.iso / Recent / util / mouse / FreeWheel.lha / FreeWheel / WheelMouse.c < prev    next >
C/C++ Source or Header  |  2000-05-26  |  6KB  |  213 lines

  1.  
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5.  
  6. #include <exec/types.h>
  7. #include <exec/io.h>
  8.  
  9. #include <devices/input.h>
  10. #include <intuition/newmouse.h>
  11.  
  12. #include <clib/exec_protos.h>
  13. #include <clib/input_protos.h>
  14.  
  15. #include "WheelMouse.h"
  16. #include "Scroll.h"
  17.  
  18. char *WindowModeNames[]={"Window under pointer",
  19.                          "Active window",NULL };
  20.  
  21. char *ClickModeNames[]={"Ignore",
  22.                          "Shift",
  23.                          "Shift + Left Button",
  24.                          "Toggle Left Button",
  25.                          "Movement -> Scroll",
  26.                          "Move/Scroll Toggle",
  27.                          "Cycle screens",NULL};
  28.  
  29. char *ClickRollModeNames[]={"Ignore",
  30.                            "Depth Arrange Windows",
  31.                            "Horizontal Scroll",NULL};
  32.  
  33. char *DoubleClickModeNames[]={"Ignore",
  34.                               "Cycle Screens",
  35.                               "Swap Axis",NULL};
  36.  
  37. void *InputBase;
  38.  
  39. BOOL WheelMouse_Handle(struct WheelMouseContext *wmc,unsigned long signals);
  40. void WheelMouse_Dispose(struct WheelMouseContext *wmc);
  41.  
  42.  
  43. void WheelMouse_Dispose(struct WheelMouseContext *wmc)
  44. {
  45.   if(wmc)
  46.   {
  47.     if(wmc->IOReq)
  48.     {
  49.       CloseDevice((struct IORequest *)wmc->IOReq);
  50.       DeleteIORequest((struct IORequest *)wmc->IOReq);
  51.       wmc->IOReq=NULL;
  52.     }
  53.     if(wmc->IOPort)
  54.       DeleteMsgPort(wmc->IOPort);
  55.     wmc->IOPort=NULL;
  56.  
  57.     if(wmc->ReplyPort)
  58.       DeleteMsgPort(wmc->ReplyPort);
  59.  
  60.     if(wmc->SigBit>-1)
  61.       FreeSignal(wmc->SigBit);
  62.     free(wmc);
  63.   }
  64. }
  65.  
  66.  
  67. struct WheelMouseContext *WheelMouse_Create()
  68. {
  69.   struct WheelMouseContext *wmc;
  70.   if(!(wmc=malloc(sizeof(struct WheelMouseContext))))
  71.     return(NULL);
  72.   memset(wmc,0,sizeof(struct WheelMouseContext));
  73.  
  74.   wmc->Dispose=WheelMouse_Dispose;
  75.   wmc->Handle=WheelMouse_Handle;
  76.  
  77.   wmc->WindowModeNames=WindowModeNames;
  78.   wmc->MidButton.ClickModeNames=ClickModeNames;
  79.   wmc->MidButton.ClickRollModeNames=ClickRollModeNames;
  80.   wmc->MidButton.DoubleClickModeNames=DoubleClickModeNames;
  81.   wmc->FourthButton.ClickModeNames=ClickModeNames;
  82.   wmc->FourthButton.ClickRollModeNames=ClickRollModeNames;
  83.   wmc->FourthButton.DoubleClickModeNames=DoubleClickModeNames;
  84.   wmc->MouseSpeedX=wmc->MouseSpeedY=100;
  85.   wmc->ClickToFront=FALSE;
  86.  
  87.   wmc->MainTask=FindTask(NULL);
  88.   if((wmc->SigBit=AllocSignal(-1))==-1)
  89.   {
  90.     wmc->Dispose(wmc);
  91.     return(NULL);
  92.   }
  93.   wmc->Signals=1<<wmc->SigBit;
  94.  
  95.   if(!(wmc->ReplyPort=CreateMsgPort()))
  96.   {
  97.     wmc->Dispose(wmc);
  98.     return(NULL);
  99.   }
  100.  
  101.   if(!(wmc->IOPort=CreateMsgPort()))
  102.   {
  103.     wmc->Dispose(wmc);
  104.     return(NULL);
  105.   }
  106.  
  107.   if(!(wmc->IOReq=(struct IOStdReq *)CreateIORequest(wmc->IOPort,sizeof(struct IOStdReq))))
  108.   {
  109.     wmc->Dispose(wmc);
  110.     return(NULL);
  111.   }
  112.  
  113.   if(OpenDevice("input.device",0,(struct IORequest *)wmc->IOReq,0))
  114.   {
  115.     DeleteIORequest((struct IORequest *)wmc->IOReq);
  116.     wmc->IOReq=NULL;
  117.     wmc->Dispose(wmc);
  118.   }
  119.   InputBase=wmc->IOReq->io_Device;
  120.  
  121.   wmc->IOReq->io_Command=IND_WRITEEVENT;
  122.   wmc->IOReq->io_Length=sizeof(struct InputEvent);
  123.   wmc->IOReq->io_Data=&wmc->Event;
  124.  
  125.   return(wmc);
  126. }
  127.  
  128.  
  129. void AddIntAtomic(int *a,int v)
  130. {
  131.   *a+=v;  /* Make sure your compiler generates a single instruction
  132.              for this operation, i.e. add.l d0,(a0), and not
  133.              move.l (a0),d1   add.l d0,d1   move.l d1,(a0) */
  134. }
  135.  
  136.  
  137. BOOL WheelMouse_Handle(struct WheelMouseContext *wmc,unsigned long signals)
  138. {
  139.   int distance;
  140.   if(!(signals&wmc->Signals))
  141.     return(TRUE);
  142.  
  143.   while(wmc->ScrollX||wmc->ScrollY||wmc->FakeX||wmc->FakeY)
  144.   {
  145.     if(distance=wmc->ScrollX)
  146.     {
  147.       distance=DoScroll(wmc,FREEHORIZ,distance);
  148.       AddIntAtomic(&wmc->ScrollX,-distance);
  149.     }
  150.  
  151.     if(distance=wmc->ScrollY)
  152.     {
  153.       distance=DoScroll(wmc,FREEHORIZ|FREEVERT,distance);
  154.       AddIntAtomic(&wmc->ScrollY,-distance);
  155.     }
  156.  
  157.     if(wmc->FakeX<0)
  158.     {
  159.       AddIntAtomic(&wmc->FakeX,1);
  160.       wmc->Event.ie_Class=IECLASS_RAWKEY;
  161.       wmc->Event.ie_Code=NM_WHEEL_LEFT;
  162.       wmc->Event.ie_Qualifier=PeekQualifier();
  163.       DoIO((struct IORequest *)wmc->IOReq);
  164.       wmc->Event.ie_Class=IECLASS_NEWMOUSE;
  165.       wmc->Event.ie_Code=NM_WHEEL_LEFT;
  166.       wmc->Event.ie_Qualifier=PeekQualifier();
  167.       DoIO((struct IORequest *)wmc->IOReq);
  168.     }
  169.  
  170.     if(wmc->FakeX>0)
  171.     {
  172.       AddIntAtomic(&wmc->FakeX,-1);
  173.       wmc->Event.ie_Class=IECLASS_RAWKEY;
  174.       wmc->Event.ie_Code=NM_WHEEL_RIGHT;
  175.       wmc->Event.ie_Qualifier=PeekQualifier();
  176.       DoIO((struct IORequest *)wmc->IOReq);
  177.       wmc->Event.ie_Class=IECLASS_NEWMOUSE;
  178.       wmc->Event.ie_Code=NM_WHEEL_RIGHT;
  179.       wmc->Event.ie_Qualifier=PeekQualifier();
  180.       DoIO((struct IORequest *)wmc->IOReq);
  181.     }
  182.  
  183.     if(wmc->FakeY<0)
  184.     {
  185.       AddIntAtomic(&wmc->FakeY,1);
  186.       wmc->Event.ie_Class=IECLASS_RAWKEY;
  187.       wmc->Event.ie_Code=NM_WHEEL_UP;
  188.       wmc->Event.ie_Qualifier=PeekQualifier();
  189.       DoIO((struct IORequest *)wmc->IOReq);
  190.       wmc->Event.ie_Class=IECLASS_NEWMOUSE;
  191.       wmc->Event.ie_Code=NM_WHEEL_UP;
  192.       wmc->Event.ie_Qualifier=PeekQualifier();
  193.       DoIO((struct IORequest *)wmc->IOReq);
  194.     }
  195.  
  196.     if(wmc->FakeY>0)
  197.     {
  198.       AddIntAtomic(&wmc->FakeY,-1);
  199.       wmc->Event.ie_Class=IECLASS_RAWKEY;
  200.       wmc->Event.ie_Code=NM_WHEEL_DOWN;
  201.       wmc->Event.ie_Qualifier=PeekQualifier();
  202.       DoIO((struct IORequest *)wmc->IOReq);
  203.       wmc->Event.ie_Class=IECLASS_NEWMOUSE;
  204.       wmc->Event.ie_Code=NM_WHEEL_DOWN;
  205.       wmc->Event.ie_Qualifier=PeekQualifier();
  206.       DoIO((struct IORequest *)wmc->IOReq);
  207.     }
  208.  
  209.   }
  210.   return(TRUE);
  211. }
  212.  
  213.