瀏覽代碼

+ Merged driver support for mouse from fixbranch

michael 24 年之前
父節點
當前提交
29c840668a
共有 6 個文件被更改,包括 484 次插入256 次删除
  1. 42 45
      rtl/go32v2/mouse.pp
  2. 209 0
      rtl/inc/mouse.inc
  3. 34 8
      rtl/inc/mouseh.inc
  4. 64 36
      rtl/os2/mouse.pp
  5. 89 113
      rtl/unix/mouse.pp
  6. 46 54
      rtl/win32/mouse.pp

+ 42 - 45
rtl/go32v2/mouse.pp

@@ -17,9 +17,6 @@
 unit Mouse;
 interface
 
-const
-  MouseEventBufSize = 16;
-
 {$i mouseh.inc}
 
 { tells the mouse unit to draw the mouse cursor itself }
@@ -31,6 +28,9 @@ implementation
 uses
   video,go32;
 
+{$i mouse.inc}
+
+
 var
   RealSeg : Word;                                    { Real mode segment }
   RealOfs : Word;                                    { Real mode offset }
@@ -425,7 +425,7 @@ begin
   RunningUnderWINNT:=(r.bx=$3205);
 end;
 
-procedure InitMouse;
+procedure SysInitMouse;
 begin
   UnderNT:=RunningUnderWINNT;
   if not MousePresent then
@@ -438,11 +438,6 @@ begin
       else
         MousePresent:=true;
     end;
-  PendingMouseHead:=@PendingMouseEvent;
-  PendingMouseTail:=@PendingMouseEvent;
-  PendingMouseEvents:=0;
-  FillChar(LastMouseEvent,sizeof(TMouseEvent),0);
-
   { don't do this twice !! PM }
 
   If not FirstMouseInitDone then
@@ -491,7 +486,7 @@ begin
 end;
 
 
-procedure DoneMouse;
+procedure SysDoneMouse;
 begin
   HideMouse;
   If (MouseCallBack <> Nil) Then
@@ -499,7 +494,7 @@ begin
 end;
 
 
-function DetectMouse:byte;assembler;
+function SysDetectMouse:byte;assembler;
 asm
         movl    $0x200,%eax
         movl    $0x33,%ebx
@@ -518,7 +513,7 @@ asm
 end;
 
 
-procedure ShowMouse;
+procedure SysShowMouse;
 
 begin
    if drawmousecursor then
@@ -547,7 +542,7 @@ begin
 end;
 
 
-procedure HideMouse;
+procedure SysHideMouse;
 
 begin
    if drawmousecursor then
@@ -576,7 +571,7 @@ begin
 end;
 
 
-function GetMouseX:word;assembler;
+function SysGetMouseX:word;assembler;
 asm
         cmpb    $1,MousePresent
         jne     .LGetMouseXError
@@ -593,7 +588,7 @@ asm
 end;
 
 
-function GetMouseY:word;assembler;
+function SysGetMouseY:word;assembler;
 asm
         cmpb    $1,MousePresent
         jne     .LGetMouseYError
@@ -610,7 +605,7 @@ asm
 end;
 
 
-function GetMouseButtons:word;assembler;
+function SysGetMouseButtons:word;assembler;
 asm
         cmpb    $1,MousePresent
         jne     .LGetMouseButtonsError
@@ -625,7 +620,7 @@ asm
 end;
 
 
-procedure SetMouseXY(x,y:word);assembler;
+procedure SysSetMouseXY(x,y:word);assembler;
 asm
         cmpb    $1,MousePresent
         jne     .LSetMouseXYExit
@@ -686,7 +681,7 @@ procedure DoCustomMouse(b : boolean);
 const
   LastCallcounter : longint = 0;
 
-procedure GetMouseEvent(var MouseEvent: TMouseEvent);
+procedure SysGetMouseEvent(var MouseEvent: TMouseEvent);
 begin
   if not MousePresent then
     begin
@@ -720,36 +715,38 @@ begin
 end;
 
 
-function PollMouseEvent(var MouseEvent: TMouseEvent):boolean;
-begin
-  if PendingMouseEvents>0 then
-   begin
-     MouseEvent:=PendingMouseHead^;
-     PollMouseEvent:=true;
-   end
-  else
-   PollMouseEvent:=false;
-end;
-
-procedure PutMouseEvent(const MouseEvent: TMouseEvent);
-begin
-  if PendingMouseEvents<MouseEventBufSize then
-   begin
-     PendingMouseTail^:=MouseEvent;
-     inc(PendingMouseTail);
-     if longint(PendingMouseTail)=longint(@PendingMouseEvent)+sizeof(PendingMouseEvent) then
-      PendingMouseTail:=@PendingMouseEvent;
-      { why isn't this done here ?
-        so the win32 version do this by hand:}
-       inc(PendingMouseEvents);
-   end
-  else
-end;
-
+Const
+  SysMouseDriver : TMouseDriver = (
+    useDefaultQueue : true;
+    InitDriver      : @SysInitMouse;
+    DoneDriver      : @SysDoneMouse;
+    DetectMouse     : @SysDetectMouse;
+    ShowMouse       : @SysShowMouse;
+    HideMouse       : @SysHideMouse;
+    GetMouseX       : @SysGetMouseX;
+    GetMouseY       : @SysGetMouseY;
+    GetMouseButtons : @SysGetMouseButtons;
+    SetMouseXY      : @SysSetMouseXY;
+    GetMouseEvent   : @SysGetMouseEvent;
+    PollMouseEvent  : Nil;
+    PutMouseEvent  : Nil;
+  );
+  
+Begin
+  SetMouseDriver(SysMouseDriver);  
 end.
 {
   $Log$
-  Revision 1.1  2001-01-13 11:03:58  peter
+  Revision 1.2  2001-09-22 00:01:42  michael
+  + Merged driver support for mouse from fixbranch
+
+  Revision 1.1.2.2  2001/09/21 23:53:48  michael
+  + Added mouse driver support.
+
+  Revision 1.1.2.1  2001/01/30 21:52:01  peter
+    * moved api utils to rtl
+
+  Revision 1.1  2001/01/13 11:03:58  peter
     * API 2 RTL commit
 
 }

+ 209 - 0
rtl/inc/mouse.inc

@@ -0,0 +1,209 @@
+{
+    $Id$
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 1999-2000 by the Free Pascal development team
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ **********************************************************************}
+
+Var
+  CurrentMouseDriver : TMouseDriver;
+  MouseInitialized : Boolean;
+  
+  // Mouse queue event mechanism
+  PendingMouseEvent  : array[0..MouseEventBufSize-1] of TMouseEvent;
+  PendingMouseHead,
+  PendingMouseTail   : PMouseEvent;
+  PendingMouseEvents : byte;
+  LastMouseEvent : TMouseEvent;
+
+Procedure ClearMouseEventQueue;
+
+begin
+  PendingMouseHead:=@PendingMouseEvent;
+  PendingMouseTail:=@PendingMouseEvent;
+  PendingMouseEvents:=0;
+  FillChar(LastMouseEvent,sizeof(TMouseEvent),0);
+end;
+
+  
+procedure InitMouse;
+
+begin
+ If Not MouseInitialized then
+   begin
+   If Assigned(CurrentMouseDriver.InitDriver) Then
+     CurrentMouseDriver.InitDriver();
+   ClearMouseEventQueue;
+   MouseInitialized:=True;  
+   end; 
+end;
+
+procedure DoneMouse;
+
+begin
+ If MouseInitialized then
+   begin
+   If Assigned(CurrentMouseDriver.DoneDriver) Then
+     CurrentMouseDriver.DoneDriver();
+   ClearMouseEventQueue;
+   MouseInitialized:=False;  
+   end; 
+end;
+
+function DetectMouse:byte;
+
+begin
+  If Assigned(CurrentMouseDriver.DetectMouse) Then
+    DetectMouse:=CurrentMouseDriver.DetectMouse()
+  else
+    DetectMouse:=0;  
+end;
+
+procedure ShowMouse;
+
+begin
+  If Assigned(CurrentMouseDriver.ShowMouse) Then
+    CurrentMouseDriver.ShowMouse();
+end;
+
+procedure HideMouse;
+
+begin
+  If Assigned(CurrentMouseDriver.HideMouse) Then
+    CurrentMouseDriver.HideMouse();
+end;
+
+function GetMouseX:word;
+
+begin
+  If Assigned(CurrentMouseDriver.GetMouseX) Then
+    GetMouseX:=CurrentMouseDriver.GetMouseX()
+  else
+    GetMouseX:=0;  
+end;
+
+function GetMouseY:word;
+
+begin
+  If Assigned(CurrentMouseDriver.GetMouseY) Then
+    GetMouseY:=CurrentMouseDriver.GetMouseY()
+  else
+    GetMouseY:=0;  
+end;
+
+function GetMouseButtons:word;
+
+begin
+  If Assigned(CurrentMouseDriver.GetMouseButtons) Then
+    GetMouseButtons:=CurrentMouseDriver.GetMouseButtons()
+  else
+    GetMouseButtons:=0;  
+end;
+
+procedure SetMouseXY(x,y:word);
+
+begin
+  If Assigned(CurrentMouseDriver.SetMouseXY) Then
+    CurrentMouseDriver.SetMouseXY(X,Y)
+end;
+
+Procedure GetPendingEvent(Var MouseEvent:TMouseEvent);
+
+begin
+  MouseEvent:=PendingMouseHead^;
+  inc(PendingMouseHead);
+  if longint(PendingMouseHead)=longint(@PendingMouseEvent)+sizeof(PendingMouseEvent) then
+   PendingMouseHead:=@PendingMouseEvent;
+  dec(PendingMouseEvents);
+  if (LastMouseEvent.x<>MouseEvent.x) or 
+     (LastMouseEvent.y<>MouseEvent.y) then
+    MouseEvent.Action:=MouseActionMove;
+  if (LastMouseEvent.Buttons<>MouseEvent.Buttons) then
+     begin
+     if (LastMouseEvent.Buttons=0) then
+       MouseEvent.Action:=MouseActionDown
+       else
+        MouseEvent.Action:=MouseActionUp;
+     end;
+  LastMouseEvent:=MouseEvent;
+end;
+
+procedure GetMouseEvent(var MouseEvent:TMouseEvent);
+
+begin
+  if CurrentMouseDriver.UseDefaultQueue then
+    begin
+    if (PendingMouseEvents>0) then
+      GetPendingEvent(MouseEvent)
+    end
+  else
+    If Assigned(CurrentMouseDriver.GetMouseEvent) Then
+      begin
+      CurrentMouseDriver.GetMouseEvent(MouseEvent);
+      LastMouseEvent:=MouseEvent;
+      end;
+end;
+
+procedure PutMouseEvent(const MouseEvent: TMouseEvent);
+begin
+  if CurrentMouseDriver.UseDefaultQueue then
+    begin
+    PendingMouseTail^:=MouseEvent;
+    inc(PendingMouseTail);
+    if longint(PendingMouseTail)=longint(@PendingMouseEvent)+sizeof(PendingMouseEvent) then
+      PendingMouseTail:=@PendingMouseEvent;
+    inc(PendingMouseEvents);
+    end
+  else
+    If Assigned(CurrentMouseDriver.PutMouseEvent) then
+      CurrentMouseDriver.PutMouseEvent(MouseEvent);
+end;
+      
+function PollMouseEvent(var MouseEvent: TMouseEvent):boolean;
+
+begin
+  if (CurrentMouseDriver.UseDefaultQueue) and
+     (PendingMouseEvents>0) then
+    begin
+    MouseEvent:=PendingMouseHead^;
+    PollMouseEvent:=true;
+    end
+  else
+    If Assigned(CurrentMouseDriver.PollMouseEvent) Then
+      begin
+      PollMouseEvent:=CurrentMouseDriver.PollMouseEvent(MouseEvent);
+      // Put it in queue, so next poll/get will be faster.
+      PutMouseEvent(MouseEvent);
+      end;
+end;
+
+Procedure SetMouseDriver(Const Driver : TMouseDriver);
+
+begin
+  If Not MouseInitialized then
+    CurrentMouseDriver:=Driver;
+end;
+
+
+Procedure GetMouseDriver(Var Driver : TMouseDriver);
+
+begin
+  Driver:=CurrentMouseDriver;
+end;
+
+{
+  $Log$
+  Revision 1.2  2001-09-22 00:01:42  michael
+  + Merged driver support for mouse from fixbranch
+
+  Revision 1.1.2.1  2001/09/21 23:53:48  michael
+  + Added mouse driver support.
+
+}

+ 34 - 8
rtl/inc/mouseh.inc

@@ -35,19 +35,30 @@ const
   MouseRightButton  = $02;                         { Right mouse button }
   MouseMiddleButton = $04;                         { Middle mouse button }
 
+  MouseEventBufSize = 16;                { Size of event queue }
+  
 var
-  PendingMouseEvent  : array[0..MouseEventBufSize-1] of TMouseEvent;
-  PendingMouseHead,
-  PendingMouseTail   : PMouseEvent;
-  PendingMouseEvents : byte;
-
-  LastMouseEvent : TMouseEvent;
-
   MouseIntFlag : Byte;                                { Mouse in int flag }
   MouseButtons : Byte;                                { Mouse button state }
   MouseWhereX,
   MouseWhereY  : Word;                                { Mouse position }
 
+Type 
+  TMouseDriver = Record 
+    UseDefaultQueue : Boolean;
+    InitDriver : Procedure;
+    DoneDriver : Procedure;
+    DetectMouse : Function : Byte;
+    ShowMouse : Procedure;
+    HideMouse : Procedure;
+    GetMouseX : Function : Word;
+    GetMouseY : Function : Word;
+    GetMouseButtons : Function : Word;
+    SetMouseXY : procedure (x,y:word);
+    GetMouseEvent : procedure (var MouseEvent:TMouseEvent);
+    PollMouseEvent : function (var MouseEvent: TMouseEvent):boolean;
+    PutMouseEvent : procedure (Const MouseEvent:TMouseEvent); 
+  end;
 
 procedure InitMouse;
 { Initialize the mouse interface }
@@ -88,9 +99,24 @@ function PollMouseEvent(var MouseEvent: TMouseEvent):boolean;
 { Checks if a Mouseevent is available, and returns it if one is found. If no
   event is pending, it returns 0 }
 
+Procedure SetMouseDriver(Const Driver : TMouseDriver);
+{ Sets the mouse driver. }
+
+Procedure GetMouseDriver(Var Driver : TMouseDriver);
+{ Returns the currently active mouse driver }
+
 {
   $Log$
-  Revision 1.1  2001-01-13 11:13:12  peter
+  Revision 1.2  2001-09-22 00:01:42  michael
+  + Merged driver support for mouse from fixbranch
+
+  Revision 1.1.2.2  2001/09/21 23:53:48  michael
+  + Added mouse driver support.
+
+  Revision 1.1.2.1  2001/01/30 22:21:22  peter
+    * move api to rtl
+
+  Revision 1.1  2001/01/13 11:13:12  peter
     * API 2 RTL
 
 }

+ 64 - 36
rtl/os2/mouse.pp

@@ -17,9 +17,6 @@
 unit Mouse;
 interface
 
-const
-  MouseEventBufSize = 16;
-
 {$i mouseh.inc}
 
 implementation
@@ -28,6 +25,7 @@ uses
  Video,
  MouCalls, DosCalls;
 
+{$i mouse.inc}
 
 var
  PendingMouseEventOrder: array [0..MouseEventBufSize-1] of cardinal;
@@ -40,7 +38,7 @@ const
  HideCounter: cardinal = 0;
  OldEventMask: longint = -1;
 
-procedure InitMouse;
+procedure SysInitMouse;
 var
  Loc: TPtrLoc;
  SetPrev: boolean;
@@ -50,10 +48,6 @@ var
 begin
  SetPrev := MouGetPtrPos (Loc, DefaultMouse) = 0;
  if MouGetEventMask (W, DefaultMouse) = 0 then OldEventMask := W;
- PendingMouseHead := @PendingMouseEvent;
- PendingMouseTail := @PendingMouseEvent;
- PendingMouseEvents := 0;
- FillChar (LastMouseEvent, SizeOf (TMouseEvent), 0);
  MouseEventOrderTail := 0;
  MouseEventOrderHead := 0;
  HideCounter := 0;
@@ -78,7 +72,7 @@ begin
  end;
 end;
 
-procedure DoneMouse;
+procedure SysDoneMouse;
 var
  W: word;
 begin
@@ -101,19 +95,21 @@ begin
  end;
 end;
 
-function DetectMouse:byte;
+function SysDetectMouse:byte;
 var
  Buttons: word;
  RC: longint;
  TempHandle: word;
 begin
  MouOpen (nil, TempHandle);
- if MouGetNumButtons (Buttons, TempHandle) = 0 then DetectMouse := Buttons
-                                                         else DetectMouse := 0;
+ if MouGetNumButtons (Buttons, TempHandle) = 0 then 
+   SysDetectMouse := Buttons
+ else 
+   SysDetectMouse := 0;
  MouClose (TempHandle);
 end;
 
-procedure ShowMouse;
+procedure SysShowMouse;
 begin
  if Handle <> NoMouse then
  begin
@@ -125,7 +121,7 @@ begin
  end;
 end;
 
-procedure HideMouse;
+procedure SysHideMouse;
 var
  PtrRect: TNoPtrRect;
 begin
@@ -145,29 +141,33 @@ begin
  end;
 end;
 
-function GetMouseX: word;
+function SysGetMouseX: word;
 var
  Event: TMouseEvent;
 begin
- if Handle = NoMouse then GetMouseX := 0 else
- begin
-  PollMouseEvent (Event);
-  GetMouseX := Event.X;
- end;
+ if Handle = NoMouse then 
+   SysGetMouseX := 0 
+ else
+   begin
+   PollMouseEvent (Event);
+   SysGetMouseX := Event.X;
+   end;
 end;
 
-function GetMouseY: word;
+function SysGetMouseY: word;
 var
  Event: TMouseEvent;
 begin
- if Handle = NoMouse then GetMouseY := 0 else
- begin
-  PollMouseEvent (Event);
-  GetMouseY := Event.Y;
- end;
+ if Handle = NoMouse then 
+   SysGetMouseY := 0 
+ else
+   begin
+   PollMouseEvent (Event);
+   SysGetMouseY := Event.Y;
+   end;
 end;
 
-procedure GetMouseXY (var X: word; var Y: word);
+procedure SysGetMouseXY (var X: word; var Y: word);
 var
  Loc: TPtrLoc;
 begin
@@ -186,7 +186,7 @@ begin
  end;
 end;
 
-procedure SetMouseXY (X, Y: word);
+procedure SysSetMouseXY (X, Y: word);
 var
  Loc: TPtrLoc;
 begin
@@ -258,7 +258,7 @@ begin
  end;
 end;
 
-function PollMouseEvent (var MouseEvent: TMouseEvent) :boolean;
+function SysPollMouseEvent (var MouseEvent: TMouseEvent) :boolean;
 var
  SysEvent: TMouEventInfo;
  P, Q: PMouseEvent;
@@ -330,24 +330,24 @@ begin
  begin
   MouseEvent := PendingMouseHead^;
   LastMouseEvent := MouseEvent;
-  PollMouseEvent := true;
+  SysPollMouseEvent := true;
  end else
  begin
-  PollMouseEvent := false;
+  SysPollMouseEvent := false;
   MouseEvent := LastMouseEvent;
   MouseEvent.Action := 0;
  end;
 end;
 
-function GetMouseButtons: word;
+function SysGetMouseButtons: word;
 var
  Event: TMouseEvent;
 begin
  PollMouseEvent (Event);
- GetMouseButtons := Event.Buttons;
+ SysGetMouseButtons := Event.Buttons;
 end;
 
-procedure GetMouseEvent (var MouseEvent: TMouseEvent);
+procedure SysGetMouseEvent (var MouseEvent: TMouseEvent);
 var
  Event: TMouEventInfo;
 begin
@@ -370,7 +370,7 @@ begin
  Dec (PendingMouseEvents);
 end;
 
-procedure PutMouseEvent (const MouseEvent: TMouseEvent);
+procedure SysPutMouseEvent (const MouseEvent: TMouseEvent);
 var
  QI: TMouQueInfo;
 begin
@@ -388,10 +388,38 @@ begin
  end;
 end;
 
+Const
+  SysMouseDriver : TMouseDriver = (
+    UseDefaultQueue : False;
+    InitDriver      : @SysInitMouse;
+    DoneDriver      : @SysDoneMouse;
+    DetectMouse     : @SysDetectMouse;
+    ShowMouse       : @SysShowMouse;
+    HideMouse       : @SysHideMouse;
+    GetMouseX       : @SysGetMouseX;
+    GetMouseY       : @SysGetMouseY;
+    GetMouseButtons : @SysGetMouseButtons;
+    SetMouseXY      : @SysSetMouseXY;
+    GetMouseEvent   : @SysGetMouseEvent;
+    PollMouseEvent  : @SysPollMouseEvent;
+    PutMouseEvent   : @SysPutMouseEvent;
+  );
+
+Begin
+  SetMouseDriver(SysMouseDriver);  
 end.
 {
   $Log$
-  Revision 1.1  2001-01-13 11:03:58  peter
+  Revision 1.2  2001-09-22 00:01:42  michael
+  + Merged driver support for mouse from fixbranch
+
+  Revision 1.1.2.2  2001/09/21 23:53:48  michael
+  + Added mouse driver support.
+
+  Revision 1.1.2.1  2001/01/30 21:52:02  peter
+    * moved api utils to rtl
+
+  Revision 1.1  2001/01/13 11:03:58  peter
     * API 2 RTL commit
 
 }

+ 89 - 113
rtl/unix/mouse.pp

@@ -21,9 +21,6 @@ interface
 {$DEFINE NOGPM}
 {$ENDIF}
 
-const
-  MouseEventBufSize = 16;
-
 {$i mouseh.inc}
 
 implementation
@@ -35,6 +32,10 @@ uses
 {$endif ndef NOGPM}
   ;
 
+{$i mouse.inc}
+
+{$ifndef NOMOUSE}
+
 const
   mousecur    : boolean = false;
   mousecurofs : longint = -1;
@@ -42,18 +43,15 @@ const
 var
   mousecurcell : TVideoCell;
 
-
 const
   gpm_fs : longint = -1;
 
-
 procedure PlaceMouseCur(ofs:longint);
-{$ifndef NOMOUSE}
+
 var
   upd : boolean;
-{$endif ndef NOMOUSE}
+
 begin
-{$ifndef NOMOUSE}
   if VideoBuf=nil then
    exit;
   upd:=false;
@@ -71,21 +69,14 @@ begin
    end;
   if upd then
    Updatescreen(false);
-{$endif ndef NOMOUSE}
 end;
 
-
-procedure InitMouse;
+procedure SysInitMouse;
 {$ifndef NOGPM}
 var
   connect : TGPMConnect;
 {$endif ndef NOGPM}
 begin
-{$ifndef NOMOUSE}
-  PendingMouseHead:=@PendingMouseEvent;
-  PendingMouseTail:=@PendingMouseEvent;
-  PendingMouseEvents:=0;
-  FillChar(LastMouseEvent,sizeof(TMouseEvent),0);
 {$ifndef NOGPM}
   if gpm_fs=-1 then
     begin
@@ -112,13 +103,11 @@ begin
           Write(#27'[?1000h'); { enable mouse tracking }
         end;
 {$endif NOGPM}
-{$endif ndef NOMOUSE}
 end;
 
 
-procedure DoneMouse;
+procedure SysDoneMouse;
 begin
-{$ifndef NOMOUSE}
   If gpm_fs<>-1 then
     begin
       HideMouse;
@@ -130,11 +119,10 @@ begin
 {$endif ifdef NOGPM}
       gpm_fs:=-1;
     end;
-{$endif ndef NOMOUSE}
 end;
 
 
-function DetectMouse:byte;
+function SysDetectMouse:byte;
 {$ifndef NOGPM}
 var
   x : longint;
@@ -142,9 +130,6 @@ var
   connect : TGPMConnect;
 {$endif ndef NOGPM}
 begin
-{$ifdef NOMOUSE}
-  DetectMouse:=0;
-{$else ndef NOMOUSE}
 {$ifndef NOGPM}
   if gpm_fs=-1 then
     begin
@@ -164,128 +149,88 @@ begin
     begin
       x:=Gpm_GetSnapshot(e);
       if x<>-1 then
-        DetectMouse:=x
+        SysDetectMouse:=x
       else
-        DetectMouse:=2;
+        SysDetectMouse:=2;
     end
   else
-    DetectMouse:=0;
+    SysDetectMouse:=0;
 {$else ifdef NOGPM}
   if (getenv('TERM')='xterm') then
-    DetectMouse:=2;
+    SysDetectMouse:=2;
 {$endif NOGPM}
-{$endif ndef NOMOUSE}
 end;
 
 
-procedure ShowMouse;
+procedure SysShowMouse;
 begin
   PlaceMouseCur(MouseCurOfs);
   mousecur:=true;
 end;
 
 
-procedure HideMouse;
+procedure SysHideMouse;
 begin
   PlaceMouseCur(-1);
   mousecur:=false;
 end;
 
 
-function GetMouseX:word;
+function SysGetMouseX:word;
 {$ifndef NOGPM}
 var
   e : TGPMEvent;
 {$endif ndef NOGPM}
 begin
-{$ifdef NOMOUSE}
-  GetMouseX:=0;
-{$else ndef NOMOUSE}
   if gpm_fs<0 then
    exit(0);
 {$ifndef NOGPM}
   Gpm_GetSnapshot(e);
-  GetMouseX:=e.x-1;
+  SysGetMouseX:=e.x-1;
 {$endif ndef NOGPM}
-{$endif ndef NOMOUSE}
 end;
 
 
-function GetMouseY:word;
+function SysGetMouseY:word;
 {$ifndef NOGPM}
 var
   e : TGPMEvent;
 {$endif ndef NOGPM}
 begin
-{$ifdef NOMOUSE}
-  GetMouseY:=0;
-{$else ndef NOMOUSE}
   if gpm_fs<0 then
    exit(0);
 {$ifndef NOGPM}
   Gpm_GetSnapshot(e);
   if e.y>0 then
-   GetMouseY:=e.y-1
+   SysGetMouseY:=e.y-1
   else
-   GetMouseY:=0;
+   SysGetMouseY:=0;
 {$endif ndef NOGPM}
-{$endif ndef NOMOUSE}
 end;
 
 
-function GetMouseButtons:word;
+function SysGetMouseButtons:word;
 {$ifndef NOGPM}
 var
   e : TGPMEvent;
 {$endif ndef NOGPM}
 begin
-{$ifdef NOMOUSE}
-  GetMouseButtons:=0;
-{$else ndef NOMOUSE}
   if gpm_fs<0 then
    exit(0);
 {$ifndef NOGPM}
   Gpm_GetSnapshot(e);
-  GetMouseButtons:=e.buttons;
+  SysGetMouseButtons:=e.buttons;
 {$endif ndef NOGPM}
-{$endif ndef NOMOUSE}
 end;
 
 
-procedure SetMouseXY(x,y:word);
-begin
-end;
-
-
-procedure GetMouseEvent(var MouseEvent: TMouseEvent);
+procedure SysGetMouseEvent(var MouseEvent: TMouseEvent);
 {$ifndef NOGPM}
 var
   e : TGPMEvent;
 {$endif ndef NOGPM}
 begin
-{$ifdef NOMOUSE}
   fillchar(MouseEvent,SizeOf(TMouseEvent),#0);
-{$else ndef NOMOUSE}
-  fillchar(MouseEvent,SizeOf(TMouseEvent),#0);
-  if PendingMouseEvents>0 then
-    begin
-      MouseEvent:=PendingMouseHead^;
-      inc(PendingMouseHead);
-      if longint(PendingMouseHead)=longint(@PendingMouseEvent)+sizeof(PendingMouseEvent) then
-       PendingMouseHead:=@PendingMouseEvent;
-      dec(PendingMouseEvents);
-      if (LastMouseEvent.x<>MouseEvent.x) or (LastMouseEvent.y<>MouseEvent.y) then
-       MouseEvent.Action:=MouseActionMove;
-      if (LastMouseEvent.Buttons<>MouseEvent.Buttons) then
-       begin
-         if (LastMouseEvent.Buttons=0) then
-          MouseEvent.Action:=MouseActionDown
-         else
-          MouseEvent.Action:=MouseActionUp;
-       end;
-      LastMouseEvent:=MouseEvent;
-      exit;
-    end;
   if gpm_fs<0 then
    exit;
 {$ifndef NOGPM}
@@ -313,53 +258,26 @@ begin
   else
    MouseEvent.Action:=0;
   end;
-  LastMouseEvent:=MouseEvent;
 { update mouse cursor }
   if mousecur then
    PlaceMouseCur(MouseEvent.y*ScreenWidth+MouseEvent.x);
 {$endif ndef NOGPM}
-{$endif ndef NOMOUSE}
 end;
 
 
-procedure PutMouseEvent(const MouseEvent: TMouseEvent);
-begin
-{$ifndef NOMOUSE}
-  if PendingMouseEvents<MouseEventBufSize then
-   begin
-     PendingMouseTail^:=MouseEvent;
-     inc(PendingMouseTail);
-     if longint(PendingMouseTail)=longint(@PendingMouseEvent)+sizeof(PendingMouseEvent) then
-      PendingMouseTail:=@PendingMouseEvent;
-      { why isn't this done here ?
-        so the win32 version do this by hand:}
-       inc(PendingMouseEvents);
-   end;
-{$endif ndef NOMOUSE}
-end;
 
+function SysPollMouseEvent(var MouseEvent: TMouseEvent):boolean;
 
-function PollMouseEvent(var MouseEvent: TMouseEvent):boolean;
 {$ifndef NOGPM}
 var
   e : TGPMEvent;
   fds : FDSet;
 {$endif ndef NOGPM}
 begin
-{$ifdef NOMOUSE}
   fillchar(MouseEvent,SizeOf(TMouseEvent),#0);
-  exit(false);
-{$else ndef NOMOUSE}
-  fillchar(MouseEvent,SizeOf(TMouseEvent),#0);
-  if PendingMouseEvents>0 then
-   begin
-     MouseEvent:=PendingMouseHead^;
-     PollMouseEvent:=true;
-     exit;
-   end
-  else if gpm_fs<0 then
-   exit(false);
 {$ifndef NOGPM}
+  if gpm_fs<0 then
+   exit(false);
   if gpm_fs>0 then
     begin
       FD_Zero(fds);
@@ -392,22 +310,80 @@ begin
       MouseEvent.Action:=0;
      end;
      if (gpm_fs<>-2) or (MouseEvent.Action<>0) then
-       PollMouseEvent:=true
+       SysPollMouseEvent:=true
      else
-       PollMouseEvent:=false;
+       SysPollMouseEvent:=false;
    end
   else
-   PollMouseEvent:=false;
+   SysPollMouseEvent:=false;
 {$endif ndef NOGPM}
-{$endif ndef NOMOUSE}
 end;
 
+Const
+  SysMouseDriver : TMouseDriver = (
+    UseDefaultQueue : true;
+    InitDriver      : @SysInitMouse;
+    DoneDriver      : @SysDoneMouse;
+    DetectMouse     : @SysDetectMouse;
+    ShowMouse       : @SysShowMouse;
+    HideMouse       : @SysHideMouse;
+    GetMouseX       : @SysGetMouseX;
+    GetMouseY       : @SysGetMouseY;
+    GetMouseButtons : @SysGetMouseButtons;
+    SetMouseXY      : Nil;
+    GetMouseEvent   : @SysGetMouseEvent;
+    PollMouseEvent  : @SysPollMouseEvent;
+    PutMouseEvent   : Nil;
+  );
+
+{$else ifndef NOMOUSE}
+
+Const
+  SysMouseDriver : TMouseDriver = (
+    UseDefaultQueue : true;
+    InitDriver      : Nil;
+    DoneDriver      : Nil;
+    DetectMouse     : Nil;
+    ShowMouse       : Nil;
+    HideMouse       : Nil;
+    GetMouseX       : Nil;
+    GetMouseY       : Nil;
+    GetMouseButtons : Nil;
+    SetMouseXY      : Nil;
+    GetMouseEvent   : Nil;
+    PollMouseEvent  : Nil;
+    PutMouseEvent   : Nil;
+  );
+
+{$endif}
+  
+Begin
+  SetMouseDriver(SysMouseDriver);  
 end.
+
 {
   $Log$
-  Revision 1.4  2001-09-17 21:36:31  peter
+  Revision 1.5  2001-09-22 00:01:43  michael
+  + Merged driver support for mouse from fixbranch
+
+  Revision 1.4  2001/09/17 21:36:31  peter
     * merged fixes
 
+  Revision 1.2.2.6  2001/09/21 23:53:48  michael
+  + Added mouse driver support.
+
+  Revision 1.2.2.5  2001/09/06 09:05:08  pierre
+   * fix NOGPM code
+
+  Revision 1.2.2.4  2001/09/06 08:33:34  pierre
+   * fix NOGPM cond to not include gpm unit
+
+  Revision 1.2.2.3  2001/08/05 12:25:55  peter
+    * fix possible range check errors
+
+  Revision 1.2.2.2  2001/01/30 22:23:44  peter
+    * unix back to linux
+
   Revision 1.3  2001/08/05 12:24:20  peter
     * m68k merges
 

+ 46 - 54
rtl/win32/mouse.pp

@@ -17,9 +17,6 @@
 unit Mouse;
 interface
 
-const
-  MouseEventBufSize = 255;
-
 {$i mouseh.inc}
 
 implementation
@@ -27,10 +24,10 @@ implementation
 uses
    windows,dos,Winevent;
 
+{$i mouse.inc}
+
 var
    ChangeMouseEvents : TCriticalSection;
-Const
-  MouseEventActive : Boolean = false;
 
 procedure MouseEventHandler(var ir:INPUT_RECORD);
 
@@ -67,14 +64,12 @@ procedure MouseEventHandler(var ir:INPUT_RECORD);
           LeaveCriticalSection(ChangeMouseEvents);
   end;
 
-procedure InitMouse;
+procedure SysInitMouse;
 
 var
    mode : dword;
 
 begin
-  if MouseEventActive then
-    exit;
   // enable mouse events
   GetConsoleMode(StdInputHandle,@mode);
   mode:=mode or ENABLE_MOUSE_INPUT;
@@ -87,16 +82,13 @@ begin
   InitializeCriticalSection(ChangeMouseEvents);
   SetMouseEventHandler(@MouseEventHandler);
   ShowMouse;
-  MouseEventActive:=true;
 end;
 
 
-procedure DoneMouse;
+procedure SysDoneMouse;
 var
    mode : dword;
 begin
-  if not MouseEventActive then
-    exit;
   HideMouse;
   // disable mouse events
   GetConsoleMode(StdInputHandle,@mode);
@@ -105,53 +97,19 @@ begin
 
   SetMouseEventHandler(nil);
   DeleteCriticalSection(ChangeMouseEvents);
-  MouseEventActive:=false;
 end;
 
 
-function DetectMouse:byte;
+function SysDetectMouse:byte;
 var
   num : dword;
 begin
   GetNumberOfConsoleMouseButtons(@num);
-  DetectMouse:=num;
-end;
-
-
-procedure ShowMouse;
-begin
-end;
-
-
-procedure HideMouse;
-begin
-end;
-
-
-function GetMouseX:word;
-begin
-  GetMouseX:=0;
-end;
-
-
-function GetMouseY:word;
-begin
-  GetMouseY:=0;
+  SysDetectMouse:=num;
 end;
 
 
-function GetMouseButtons:word;
-begin
-  GetMouseButtons:=0;
-end;
-
-
-procedure SetMouseXY(x,y:word);
-begin
-end;
-
-
-procedure GetMouseEvent(var MouseEvent: TMouseEvent);
+procedure SysGetMouseEvent(var MouseEvent: TMouseEvent);
 
 var
    b : byte;
@@ -186,21 +144,21 @@ begin
 end;
 
 
-function PollMouseEvent(var MouseEvent: TMouseEvent):boolean;
+function SysPollMouseEvent(var MouseEvent: TMouseEvent):boolean;
 begin
   EnterCriticalSection(ChangeMouseEvents);
   if PendingMouseEvents>0 then
    begin
      MouseEvent:=PendingMouseHead^;
-     PollMouseEvent:=true;
+     SysPollMouseEvent:=true;
    end
   else
-   PollMouseEvent:=false;
+   SysPollMouseEvent:=false;
   LeaveCriticalSection(ChangeMouseEvents);
 end;
 
 
-procedure PutMouseEvent(const MouseEvent: TMouseEvent);
+procedure SysPutMouseEvent(const MouseEvent: TMouseEvent);
 begin
   if PendingMouseEvents<MouseEventBufSize then
    begin
@@ -214,15 +172,49 @@ begin
    end;
 end;
 
+Const
+  SysMouseDriver : TMouseDriver = (
+    UseDefaultQueue : False;
+    InitDriver      : @SysInitMouse;
+    DoneDriver      : @SysDoneMouse;
+    DetectMouse     : @SysDetectMouse;
+    ShowMouse       : Nil;
+    HideMouse       : Nil;
+    GetMouseX       : Nil;
+    GetMouseY       : Nil;
+    GetMouseButtons : Nil;
+    SetMouseXY      : Nil;
+    GetMouseEvent   : @SysGetMouseEvent;
+    PollMouseEvent  : @SysPollMouseEvent;
+    PutMouseEvent   : @SysPutMouseEvent;
+  );
+
+Begin
+  SetMouseDriver(SysMouseDriver);  
 end.
 {
   $Log$
-  Revision 1.4  2001-08-05 12:23:57  peter
+  Revision 1.5  2001-09-22 00:01:43  michael
+  + Merged driver support for mouse from fixbranch
+
+  Revision 1.4  2001/08/05 12:23:57  peter
     * fixed for new input_record
 
   Revision 1.3  2001/04/10 21:28:36  peter
     * removed warnigns
 
+  Revision 1.2.2.4  2001/09/21 23:53:48  michael
+  + Added mouse driver support.
+
+  Revision 1.2.2.3  2001/08/05 12:24:37  peter
+    * fixed for new input_record
+
+  Revision 1.2.2.2  2001/04/10 20:33:04  peter
+    * remove some warnings
+
+  Revision 1.2.2.1  2001/01/30 21:52:03  peter
+    * moved api utils to rtl
+
   Revision 1.2  2001/01/14 22:20:00  peter
     * slightly optimized event handling (merged)