fpc/api/linux/mouse.inc
2000-07-13 11:32:24 +00:00

253 lines
4.5 KiB
PHP

{
System independent mouse interface for linux
$Id$
}
uses
Linux,Video
{$ifndef NOMOUSE}
{$ifdef OLDGPM}
,gpm114
{$else}
,gpm
{$endif}
{$endif ndef NOMOUSE}
;
const
mousecur : boolean = false;
mousecurofs : longint = -1;
var
mousecurcell : TVideoCell;
procedure PlaceMouseCur(ofs:longint);
{$ifndef NOMOUSE}
var
upd : boolean;
{$endif ndef NOMOUSE}
begin
{$ifndef NOMOUSE}
if VideoBuf=nil then
exit;
upd:=false;
if (MouseCurOfs<>-1) and (VideoBuf^[MouseCurOfs]=MouseCurCell) then
begin
VideoBuf^[MouseCurOfs]:=MouseCurCell xor $7f00;
upd:=true;
end;
MouseCurOfs:=ofs;
if (MouseCurOfs<>-1) then
begin
MouseCurCell:=VideoBuf^[MouseCurOfs] xor $7f00;
VideoBuf^[MouseCurOfs]:=MouseCurCell;
upd:=true;
end;
if upd then
Updatescreen(false);
{$endif ndef NOMOUSE}
end;
procedure InitMouse;
{$ifndef NOMOUSE}
var
connect : TGPMConnect;
{$endif ndef NOMOUSE}
begin
{$ifndef NOMOUSE}
PendingMouseHead:=@PendingMouseEvent;
PendingMouseTail:=@PendingMouseEvent;
PendingMouseEvents:=0;
FillChar(LastMouseEvent,sizeof(TMouseEvent),0);
{ open gpm }
connect.EventMask:=GPM_MOVE or GPM_DRAG or GPM_DOWN or GPM_UP;
connect.DefaultMask:=0;
connect.MinMod:=0;
connect.MaxMod:=0;
Gpm_Open(connect,0);
{ show mousepointer }
ShowMouse;
{$endif ndef NOMOUSE}
end;
procedure DoneMouse;
begin
{$ifndef NOMOUSE}
HideMouse;
Gpm_Close;
{$endif ndef NOMOUSE}
end;
function DetectMouse:byte;
begin
{$ifdef NOMOUSE}
DetectMouse:=0;
{$else ndef NOMOUSE}
{ always a mouse deamon present }
DetectMouse:=2;
{$endif ndef NOMOUSE}
end;
procedure ShowMouse;
begin
PlaceMouseCur(MouseCurOfs);
mousecur:=true;
end;
procedure HideMouse;
begin
PlaceMouseCur(-1);
mousecur:=false;
end;
function GetMouseX:word;
{$ifndef NOMOUSE}
var
e : TGPMEvent;
{$endif ndef NOMOUSE}
begin
{$ifdef NOMOUSE}
GetMouseX:=0;
{$else ndef NOMOUSE}
if gpm_fd<0 then
exit(0);
Gpm_GetSnapshot(e);
GetMouseX:=e.x-1;
{$endif ndef NOMOUSE}
end;
function GetMouseY:word;
{$ifndef NOMOUSE}
var
e : TGPMEvent;
{$endif ndef NOMOUSE}
begin
{$ifdef NOMOUSE}
GetMouseY:=0;
{$else ndef NOMOUSE}
if gpm_fd<0 then
exit(0);
Gpm_GetSnapshot(e);
GetMouseY:=e.y-1;
{$endif ndef NOMOUSE}
end;
function GetMouseButtons:word;
{$ifndef NOMOUSE}
var
e : TGPMEvent;
{$endif ndef NOMOUSE}
begin
{$ifdef NOMOUSE}
GetMouseButtons:=0;
{$else ndef NOMOUSE}
if gpm_fd<0 then
exit(0);
Gpm_GetSnapshot(e);
GetMouseButtons:=e.buttons;
{$endif ndef NOMOUSE}
end;
procedure SetMouseXY(x,y:word);
begin
end;
procedure GetMouseEvent(var MouseEvent: TMouseEvent);
{$ifndef NOMOUSE}
var
e : TGPMEvent;
{$endif ndef NOMOUSE}
begin
{$ifdef NOMOUSE}
fillchar(MouseEvent,SizeOf(TMouseEvent),#0);
{$else ndef NOMOUSE}
if gpm_fd<0 then
exit;
Gpm_GetEvent(e);
MouseEvent.x:=e.x-1;
MouseEvent.y:=e.y-1;
MouseEvent.buttons:=0;
if e.buttons and Gpm_b_left<>0 then
inc(MouseEvent.buttons,1);
if e.buttons and Gpm_b_right<>0 then
inc(MouseEvent.buttons,2);
if e.buttons and Gpm_b_middle<>0 then
inc(MouseEvent.buttons,4);
case (e.EventType and $f) of
GPM_MOVE,
GPM_DRAG : MouseEvent.Action:=MouseActionMove;
GPM_DOWN : MouseEvent.Action:=MouseActionDown;
GPM_UP : MouseEvent.Action:=MouseActionUp;
else
MouseEvent.Action:=0;
end;
LastMouseEvent:=MouseEvent;
{ update mouse cursor }
if mousecur then
PlaceMouseCur(MouseEvent.y*ScreenWidth+MouseEvent.x);
{$endif ndef NOMOUSE}
end;
function PollMouseEvent(var MouseEvent: TMouseEvent):boolean;
{$ifndef NOMOUSE}
var
e : TGPMEvent;
fds : FDSet;
{$endif ndef NOMOUSE}
begin
{$ifdef NOMOUSE}
fillchar(MouseEvent,SizeOf(TMouseEvent),#0);
exit(false);
{$else ndef NOMOUSE}
if gpm_fd<0 then
exit(false);
FD_Zero(fds);
FD_Set(gpm_fd,fds);
if (Select(gpm_fd+1,@fds,nil,nil,1)>0) then
begin
Gpm_GetSnapshot(e);
MouseEvent.x:=e.x-1;
MouseEvent.y:=e.y-1;
MouseEvent.buttons:=0;
if e.buttons and Gpm_b_left<>0 then
inc(MouseEvent.buttons,1);
if e.buttons and Gpm_b_right<>0 then
inc(MouseEvent.buttons,2);
if e.buttons and Gpm_b_middle<>0 then
inc(MouseEvent.buttons,4);
case (e.EventType and $f) of
GPM_MOVE,
GPM_DRAG : MouseEvent.Action:=MouseActionMove;
GPM_DOWN : MouseEvent.Action:=MouseActionDown;
GPM_UP : MouseEvent.Action:=MouseActionUp;
else
MouseEvent.Action:=0;
end;
PollMouseEvent:=true;
end
else
PollMouseEvent:=false;
{$endif ndef NOMOUSE}
end;
{
$Log$
Revision 1.2 2000-07-13 11:32:25 michael
+ removed logs
}