home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 6
/
AACD06.ISO
/
AACD
/
System
/
FreeWheel
/
WheelMouse.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-12-29
|
2KB
|
100 lines
#include <stdio.h>
#include <stdlib.h>
#include <exec/types.h>
#include <clib/exec_protos.h>
#include "WheelMouse.h"
char *WindowModeNames[]={"Window under pointer",
"Active window",NULL };
char *ButtonModeNames[]={"Ignore",
"Shift",
"Shift + click",
"Wheel depth arrange",
"Shift + depth arrange",
"Cycle screens",NULL};
BOOL WheelMouse_Handle(struct WheelMouseContext *wmc,unsigned long signals);
void WheelMouse_Dispose(struct WheelMouseContext *wmc);
void WheelMouse_Dispose(struct WheelMouseContext *wmc)
{
if(wmc)
{
if(wmc->ReplyPort)
DeleteMsgPort(wmc->ReplyPort);
if(wmc->SigBit>-1)
FreeSignal(wmc->SigBit);
free(wmc);
}
}
struct WheelMouseContext *WheelMouse_Create()
{
struct WheelMouseContext *wmc;
if(!(wmc=malloc(sizeof(struct WheelMouseContext))))
return(NULL);
memset(wmc,0,sizeof(struct WheelMouseContext));
wmc->Dispose=WheelMouse_Dispose;
wmc->Handle=WheelMouse_Handle;
wmc->WindowModeNames=WindowModeNames;
wmc->MMBModeNames=ButtonModeNames;
wmc->FourthButtonModeNames=ButtonModeNames;
wmc->MouseSpeed=100;
wmc->ClickToFront=FALSE;
wmc->MainTask=FindTask(NULL);
if((wmc->SigBit=AllocSignal(-1))==-1)
{
wmc->Dispose(wmc);
return(NULL);
}
wmc->Signals=1<<wmc->SigBit;
if(!(wmc->ReplyPort=CreateMsgPort()))
{
wmc->Dispose(wmc);
return(NULL);
}
return(wmc);
}
void AddIntAtomic(int *a,int v)
{
*a+=v; /* Make sure your compiler generates a single instruction
for this operation, i.e. add.l d0,(a0), and not
move.l (a0),d1 add.l d0,d1 move.l d1,(a0) */
}
BOOL WheelMouse_Handle(struct WheelMouseContext *wmc,unsigned long signals)
{
int distance;
if(!(signals&wmc->Signals))
return(TRUE);
while(distance=wmc->ScrollX)
{
distance=DoScroll(wmc,FREEHORIZ,distance);
AddIntAtomic(&wmc->ScrollX,-distance);
}
while(distance=wmc->ScrollY)
{
distance=DoScroll(wmc,FREEVERT,distance);
AddIntAtomic(&wmc->ScrollY,-distance);
}
return(TRUE);
}