mouse.inc 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 1999-2000 by the Free Pascal development team
  4. See the file COPYING.FPC, included in this distribution,
  5. for details about the copyright.
  6. This program is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9. **********************************************************************}
  10. Var
  11. CurrentMouseDriver : TMouseDriver;
  12. MouseInitialized : Boolean;
  13. // Mouse queue event mechanism
  14. PendingMouseEvent : array[0..MouseEventBufSize-1] of TMouseEvent;
  15. PendingMouseHead,
  16. PendingMouseTail : PMouseEvent;
  17. PendingMouseEvents : byte;
  18. LastMouseEvent : TMouseEvent;
  19. Procedure ClearMouseEventQueue;
  20. begin
  21. PendingMouseHead:=@PendingMouseEvent;
  22. PendingMouseTail:=@PendingMouseEvent;
  23. PendingMouseEvents:=0;
  24. FillChar(LastMouseEvent,sizeof(TMouseEvent),0);
  25. end;
  26. procedure InitMouse;
  27. begin
  28. If Not MouseInitialized then
  29. begin
  30. If Assigned(CurrentMouseDriver.InitDriver) Then
  31. CurrentMouseDriver.InitDriver();
  32. ClearMouseEventQueue;
  33. MouseInitialized:=True;
  34. end;
  35. end;
  36. procedure DoneMouse;
  37. begin
  38. If MouseInitialized then
  39. begin
  40. If Assigned(CurrentMouseDriver.DoneDriver) Then
  41. CurrentMouseDriver.DoneDriver();
  42. ClearMouseEventQueue;
  43. MouseInitialized:=False;
  44. end;
  45. end;
  46. function DetectMouse:byte;
  47. begin
  48. If Assigned(CurrentMouseDriver.DetectMouse) Then
  49. DetectMouse:=CurrentMouseDriver.DetectMouse()
  50. else
  51. DetectMouse:=0;
  52. end;
  53. procedure ShowMouse;
  54. begin
  55. If Assigned(CurrentMouseDriver.ShowMouse) Then
  56. CurrentMouseDriver.ShowMouse();
  57. end;
  58. procedure HideMouse;
  59. begin
  60. If Assigned(CurrentMouseDriver.HideMouse) Then
  61. CurrentMouseDriver.HideMouse();
  62. end;
  63. function GetMouseX:word;
  64. begin
  65. If Assigned(CurrentMouseDriver.GetMouseX) Then
  66. GetMouseX:=CurrentMouseDriver.GetMouseX()
  67. else
  68. GetMouseX:=0;
  69. end;
  70. function GetMouseY:word;
  71. begin
  72. If Assigned(CurrentMouseDriver.GetMouseY) Then
  73. GetMouseY:=CurrentMouseDriver.GetMouseY()
  74. else
  75. GetMouseY:=0;
  76. end;
  77. function GetMouseButtons:word;
  78. begin
  79. If Assigned(CurrentMouseDriver.GetMouseButtons) Then
  80. GetMouseButtons:=CurrentMouseDriver.GetMouseButtons()
  81. else
  82. GetMouseButtons:=0;
  83. end;
  84. procedure SetMouseXY(x,y:word);
  85. begin
  86. If Assigned(CurrentMouseDriver.SetMouseXY) Then
  87. CurrentMouseDriver.SetMouseXY(X,Y)
  88. end;
  89. Procedure GetPendingEvent(Var MouseEvent:TMouseEvent);
  90. begin
  91. MouseEvent:=PendingMouseHead^;
  92. inc(PendingMouseHead);
  93. if PtrInt(PendingMouseHead)=Ptrint(@PendingMouseEvent)+sizeof(PendingMouseEvent) then
  94. PendingMouseHead:=@PendingMouseEvent;
  95. dec(PendingMouseEvents);
  96. if (LastMouseEvent.x<>MouseEvent.x) or
  97. (LastMouseEvent.y<>MouseEvent.y) then
  98. MouseEvent.Action:=MouseActionMove;
  99. if (LastMouseEvent.Buttons<>MouseEvent.Buttons) then
  100. begin
  101. if (LastMouseEvent.Buttons=0) then
  102. MouseEvent.Action:=MouseActionDown
  103. else
  104. MouseEvent.Action:=MouseActionUp;
  105. end;
  106. LastMouseEvent:=MouseEvent;
  107. end;
  108. procedure GetMouseEvent(var MouseEvent:TMouseEvent);
  109. begin
  110. if CurrentMouseDriver.UseDefaultQueue then
  111. begin
  112. if (PendingMouseEvents>0) then
  113. GetPendingEvent(MouseEvent)
  114. else
  115. CurrentMouseDriver.GetMouseEvent(MouseEvent);
  116. { FillChar(MouseEvent,sizeof(MouseEvent),0);}
  117. end
  118. else
  119. If Assigned(CurrentMouseDriver.GetMouseEvent) Then
  120. begin
  121. LastMouseEvent:=MouseEvent;
  122. end
  123. else
  124. FillChar(MouseEvent,sizeof(TMouseEvent),0);
  125. end;
  126. procedure PutMouseEvent(const MouseEvent: TMouseEvent);
  127. begin
  128. if CurrentMouseDriver.UseDefaultQueue then
  129. begin
  130. PendingMouseTail^:=MouseEvent;
  131. inc(PendingMouseTail);
  132. if PtrInt(PendingMouseTail)=Ptrint(@PendingMouseEvent)+sizeof(PendingMouseEvent) then
  133. PendingMouseTail:=@PendingMouseEvent;
  134. inc(PendingMouseEvents);
  135. end
  136. else
  137. If Assigned(CurrentMouseDriver.PutMouseEvent) then
  138. CurrentMouseDriver.PutMouseEvent(MouseEvent);
  139. end;
  140. function PollMouseEvent(var MouseEvent: TMouseEvent):boolean;
  141. begin
  142. if (CurrentMouseDriver.UseDefaultQueue) and
  143. (PendingMouseEvents>0) then
  144. begin
  145. MouseEvent:=PendingMouseHead^;
  146. PollMouseEvent:=true;
  147. end
  148. else
  149. If Assigned(CurrentMouseDriver.PollMouseEvent) Then
  150. begin
  151. PollMouseEvent:=CurrentMouseDriver.PollMouseEvent(MouseEvent);
  152. // Put it in queue, so next poll/get will be faster.
  153. // Only if an event was found PM
  154. // If PollMouseEvent then
  155. // PutMouseEvent(MouseEvent);
  156. // This is all wrong, because the Event might already
  157. // have been pushed in the Event Array.
  158. end
  159. else
  160. PollMouseEvent:=false;
  161. end;
  162. Procedure SetMouseDriver(Const Driver : TMouseDriver);
  163. begin
  164. If Not MouseInitialized then
  165. CurrentMouseDriver:=Driver;
  166. end;
  167. Procedure GetMouseDriver(Var Driver : TMouseDriver);
  168. begin
  169. Driver:=CurrentMouseDriver;
  170. end;