mouse.inc 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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[0];
  22. PendingMouseTail:=@PendingMouseEvent[0];
  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[0];
  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. CurrentMouseDriver.GetMouseEvent(MouseEvent);
  123. end
  124. else
  125. FillChar(MouseEvent,sizeof(TMouseEvent),0);
  126. end;
  127. procedure PutMouseEvent(const MouseEvent: TMouseEvent);
  128. begin
  129. if CurrentMouseDriver.UseDefaultQueue then
  130. begin
  131. PendingMouseTail^:=MouseEvent;
  132. inc(PendingMouseTail);
  133. if PtrInt(PendingMouseTail)=Ptrint(@PendingMouseEvent)+sizeof(PendingMouseEvent) then
  134. PendingMouseTail:=@PendingMouseEvent[0];
  135. inc(PendingMouseEvents);
  136. end
  137. else
  138. If Assigned(CurrentMouseDriver.PutMouseEvent) then
  139. CurrentMouseDriver.PutMouseEvent(MouseEvent);
  140. end;
  141. function PollMouseEvent(var MouseEvent: TMouseEvent):boolean;
  142. begin
  143. if (CurrentMouseDriver.UseDefaultQueue) and
  144. (PendingMouseEvents>0) then
  145. begin
  146. MouseEvent:=PendingMouseHead^;
  147. PollMouseEvent:=true;
  148. end
  149. else
  150. If Assigned(CurrentMouseDriver.PollMouseEvent) Then
  151. begin
  152. PollMouseEvent:=CurrentMouseDriver.PollMouseEvent(MouseEvent);
  153. // Put it in queue, so next poll/get will be faster.
  154. // Only if an event was found PM
  155. // If PollMouseEvent then
  156. // PutMouseEvent(MouseEvent);
  157. // This is all wrong, because the Event might already
  158. // have been pushed in the Event Array.
  159. end
  160. else
  161. PollMouseEvent:=false;
  162. end;
  163. Procedure SetMouseDriver(Const Driver : TMouseDriver);
  164. begin
  165. If Not MouseInitialized then
  166. CurrentMouseDriver:=Driver;
  167. end;
  168. Procedure GetMouseDriver(Var Driver : TMouseDriver);
  169. begin
  170. Driver:=CurrentMouseDriver;
  171. end;