123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- {
- $Id$
- System independent mouse interface for win32
- Copyright (c) 1999 by Florian Klaempfl
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License as published by the Free Software Foundation; either
- version 2 of the License, or (at your option) any later version.
- This library 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. See the GNU
- Library General Public License for more details.
- You should have received a copy of the GNU Library General Public
- License along with this library; if not, write to the Free
- Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- }
- uses
- windows,dos,event;
- var
- ChangeMouseEvents : TCriticalSection;
- Const
- MouseEventActive : Boolean = false;
- procedure MouseEventHandler;
- var
- ir : INPUT_RECORD;
- dwRead : DWord;
- i: longint;
- e : TMouseEvent;
- begin
- ReadConsoleInput(TextRec(Input).Handle,ir,1,dwRead);
- if (dwRead=1) and (ir.EventType=_MOUSE_EVENT) then
- begin
- EnterCriticalSection(ChangeMouseEvents);
- e.x:=ir.MouseEvent.dwMousePosition.x;
- e.y:=ir.MouseEvent.dwMousePosition.y;
- e.buttons:=0;
- e.action:=0;
- if (ir.MouseEvent.dwButtonState and FROM_LEFT_1ST_BUTTON_PRESSED<>0) then
- e.buttons:=e.buttons or MouseLeftButton;
- if (ir.MouseEvent.dwButtonState and FROM_LEFT_2ND_BUTTON_PRESSED<>0) then
- e.buttons:=e.buttons or MouseMiddleButton;
- if (ir.MouseEvent.dwButtonState and RIGHTMOST_BUTTON_PRESSED<>0) then
- e.buttons:=e.buttons or MouseRightButton;
- { can we compress the events? }
- if (PendingMouseEvents>0) and
- (e.buttons=PendingMouseTail^.buttons) and
- (e.action=PendingMouseTail^.action) then
- begin
- PendingMouseTail^.x:=e.x;
- PendingMouseTail^.y:=e.y;
- end
- else
- begin
- PutMouseEvent(e);
- // this should be done in PutMouseEvent
- inc(PendingMouseEvents);
- end;
- LeaveCriticalSection(ChangeMouseEvents);
- end;
- end;
- procedure InitMouse;
- var
- mode : dword;
- begin
- if MouseEventActive then
- exit;
- // enable mouse events
- GetConsoleMode(TextRec(Input).Handle,@mode);
- mode:=mode or ENABLE_MOUSE_INPUT;
- SetConsoleMode(TextRec(Input).Handle,mode);
- PendingMouseHead:=@PendingMouseEvent;
- PendingMouseTail:=@PendingMouseEvent;
- PendingMouseEvents:=0;
- FillChar(LastMouseEvent,sizeof(TMouseEvent),0);
- InitializeCriticalSection(ChangeMouseEvents);
- SetMouseEventHandler(@MouseEventHandler);
- ShowMouse;
- MouseEventActive:=true;
- end;
- procedure DoneMouse;
- var
- mode : dword;
- begin
- if not MouseEventActive then
- exit;
- HideMouse;
- // disable mouse events
- GetConsoleMode(TextRec(Input).Handle,@mode);
- mode:=mode and (not ENABLE_MOUSE_INPUT);
- SetConsoleMode(TextRec(Input).Handle,mode);
- SetMouseEventHandler(nil);
- DeleteCriticalSection(ChangeMouseEvents);
- MouseEventActive:=false;
- end;
- function DetectMouse: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;
- end;
- function GetMouseButtons:word;
- begin
- GetMouseButtons:=0;
- end;
- procedure SetMouseXY(x,y:word);
- begin
- end;
- procedure GetMouseEvent(var MouseEvent: TMouseEvent);
- var
- b : byte;
- begin
- repeat
- EnterCriticalSection(ChangeMouseEvents);
- b:=PendingMouseEvents;
- LeaveCriticalSection(ChangeMouseEvents);
- if b>0 then
- break
- else
- sleep(50);
- until false;
- EnterCriticalSection(ChangeMouseEvents);
- 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;
- LeaveCriticalSection(ChangeMouseEvents);
- end;
- function PollMouseEvent(var MouseEvent: TMouseEvent):boolean;
- begin
- EnterCriticalSection(ChangeMouseEvents);
- if PendingMouseEvents>0 then
- begin
- MouseEvent:=PendingMouseHead^;
- PollMouseEvent:=true;
- end
- else
- PollMouseEvent:=false;
- LeaveCriticalSection(ChangeMouseEvents);
- end;
- {
- $Log$
- Revision 1.2 2000-07-13 11:32:27 michael
- + removed logs
-
- }
|