unit FMouse;
{ -- fMouse (c) Dreadnaut 2003 - dreadnaut@libero.it --
unit per la gestione del mouse, compatibile al 99% con la
gestione usata dalla unit Drivers (TEvent diventa FEvent). }
interface
type
Pnt = record x,y:integer; end;
FEvent = record
Where : Pnt;
What : byte;
Buttons : byte;
end;
const
moResetMouse = $00; moShowMouse = $01;
moHideMouse = $02; moGetPosition = $03;
moSetPosition = $04; moGetButPress = $05;
moGetButRel = $06; moSetHorzRange = $07;
moSetVertRange = $08; moSetGraphCur = $09;
moSetTextCur = $0A; moGetMouseRel = $0B;
{ moSetInterrupt = $0C; moLightPen_ON = $0D;
moLightPen_OFF = $0E;} moSetMouseSpd = $0F;
mbLeftButton = $01; mbRightButton = $02;
mbCenterButton = $04;
evNothing = $00; evMouseDown = $01;
evMouseUp = $02; evMouseMove = $04;
evMouseAuto = $08;
Function InitEvents: boolean;
Procedure ShowMouse;{ far; }
Procedure HideMouse;
Procedure GetMouseEvent(var e: FEvent);
Procedure MousePos (var x,y,buttons:integer);
Procedure MouseRel (var x,y :integer);
Procedure SetMouseSens ( x,y :integer);
procedure MousePressed (var x,y,buttons:integer);
procedure MouseReleased(var x,y,buttons:integer);
procedure SetMouseView (x1,y1,x2,y2: word);
procedure SetMousePos (x,y:word);
implementation
var
FmData : record
NButton : byte;
Init : byte;
b,p : integer;
Where : Pnt;
end;
Procedure GetMouseEvent(var e: FEvent);
var
p : Pnt;
b : integer;
begin
e.What := evNothing;
MousePos(P.x,P.y,b);
if (P.x <> e.Where.X) or (P.y <> e.Where.Y) then
begin
e.What := 4; { evMouseMove}
if FmData.p <> 0 then e.What := evMouseAuto;
e.Where := P;
FmData.Where := P;
end;
if b <> FmData.p
then if b = 0
then begin
e.What := 2; {evMouseUp}
FmData.p := 0;
FmData.b := 0;
end
else if FmData.b = 0
then begin
e.What := 1; {evMouseDown}
e.Buttons := b;
FmData.p := b;
FmData.b := 1;
end
else begin
e.What := 8; {evMouseAuto}
FmData.b := 0;
end;
end;
Function InitEvents: boolean; assembler;
asm
MOV ax, moResetMouse
INT 33h
MOV byte ptr [FmData.NButton],bl
MOV byte ptr [FmData.Init],al
CMP ax,0
JE @InitQuit
PUSH ax
MOV ax, moShowMouse
INT 33h
POP ax
@InitQuit:
end;
Procedure ShowMouse; assembler;
asm
MOV AX, moShowMouse
INT 33h
end;
Procedure HideMouse; assembler;
asm
MOV AX, moHideMouse
INT 33h
end;
Procedure MousePos(var x,y,buttons:integer); assembler;
asm
MOV AX, moGetPosition
INT 33h
LES DI,buttons
MOV AX,BX
STOSW
LES DI,x
MOV AX,CX
STOSW
LES DI,y
MOV AX,DX
STOSW
end;
Procedure MouseRel(var x,y:integer); assembler;
asm
MOV AX, moGetMouseRel
INT 33h
LES DI,x
MOV AX,CX
STOSW
LES DI,y
MOV AX,DX
STOSW
end;
Procedure SetMouseSens(x,y:integer); assembler;
asm
MOV AX, moSetMouseSpd
MOV BX, x
MOV CX, y
INT 33h
end;
procedure SetMouseView(x1,y1,x2,y2: word); assembler;
asm
MOV AX, moSetHorzRange
MOV CX, word ptr x1
MOV DX, word ptr x2
INT 33h
MOV AX, moSetVertRange
MOV CX, word ptr y1
MOV DX, word ptr y2
INT 33h
end;
procedure SetMousePos(x,y:word); assembler;
asm
MOV AX, moSetPosition
MOV CX, word ptr x
MOV DX, word ptr y
INT 33h
end;
procedure MousePressed(var x,y,buttons: integer); assembler;
asm
MOV AX, moGetButPress
INT 33h
LES DI,buttons
MOV AX,BX
STOSW
LES DI,x
MOV AX,CX
STOSW
LES DI,y
MOV AX,DX
STOSW
end;
procedure MouseReleased(var x,y,buttons: integer); assembler;
asm
MOV AX, moGetButRel
INT 33h
LES DI,buttons
MOV AX,BX
STOSW
LES DI,x
MOV AX,CX
STOSW
LES DI,y
MOV AX,DX
STOSW
end;
end.