mouse.inc 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. {
  2. System independent mouse interface for linux
  3. $Id$
  4. }
  5. uses
  6. Linux,Video
  7. {$ifdef OLDGPM}
  8. ,gpm114
  9. {$else}
  10. ,gpm
  11. {$endif}
  12. ;
  13. const
  14. mousecur : boolean = false;
  15. mousecurofs : longint = -1;
  16. var
  17. mousecurcell : TVideoCell;
  18. procedure PlaceMouseCur(ofs:longint);
  19. var
  20. upd : boolean;
  21. begin
  22. if VideoBuf=nil then
  23. exit;
  24. upd:=false;
  25. if (MouseCurOfs<>-1) and (VideoBuf^[MouseCurOfs]=MouseCurCell) then
  26. begin
  27. VideoBuf^[MouseCurOfs]:=MouseCurCell xor $7f00;
  28. upd:=true;
  29. end;
  30. MouseCurOfs:=ofs;
  31. if (MouseCurOfs<>-1) then
  32. begin
  33. MouseCurCell:=VideoBuf^[MouseCurOfs] xor $7f00;
  34. VideoBuf^[MouseCurOfs]:=MouseCurCell;
  35. upd:=true;
  36. end;
  37. if upd then
  38. Updatescreen(false);
  39. end;
  40. procedure InitMouse;
  41. var
  42. connect : TGPMConnect;
  43. begin
  44. PendingMouseHead:=@PendingMouseEvent;
  45. PendingMouseTail:=@PendingMouseEvent;
  46. PendingMouseEvents:=0;
  47. FillChar(LastMouseEvent,sizeof(TMouseEvent),0);
  48. { open gpm }
  49. connect.EventMask:=GPM_MOVE or GPM_DRAG or GPM_DOWN or GPM_UP;
  50. connect.DefaultMask:=0;
  51. connect.MinMod:=0;
  52. connect.MaxMod:=0;
  53. Gpm_Open(connect,0);
  54. { show mousepointer }
  55. ShowMouse;
  56. end;
  57. procedure DoneMouse;
  58. begin
  59. HideMouse;
  60. Gpm_Close;
  61. end;
  62. function DetectMouse:byte;
  63. begin
  64. { always a mouse deamon present }
  65. DetectMouse:=2;
  66. end;
  67. procedure ShowMouse;
  68. begin
  69. PlaceMouseCur(MouseCurOfs);
  70. mousecur:=true;
  71. end;
  72. procedure HideMouse;
  73. begin
  74. PlaceMouseCur(-1);
  75. mousecur:=false;
  76. end;
  77. function GetMouseX:word;
  78. var
  79. e : TGPMEvent;
  80. begin
  81. if gpm_fd<0 then
  82. exit(0);
  83. Gpm_GetSnapshot(e);
  84. GetMouseX:=e.x-1;
  85. end;
  86. function GetMouseY:word;
  87. var
  88. e : TGPMEvent;
  89. begin
  90. if gpm_fd<0 then
  91. exit(0);
  92. Gpm_GetSnapshot(e);
  93. GetMouseY:=e.y-1;
  94. end;
  95. function GetMouseButtons:word;
  96. var
  97. e : TGPMEvent;
  98. begin
  99. if gpm_fd<0 then
  100. exit(0);
  101. Gpm_GetSnapshot(e);
  102. GetMouseButtons:=e.buttons;
  103. end;
  104. procedure SetMouseXY(x,y:word);
  105. begin
  106. end;
  107. procedure GetMouseEvent(var MouseEvent: TMouseEvent);
  108. var
  109. e : TGPMEvent;
  110. begin
  111. if gpm_fd<0 then
  112. exit;
  113. Gpm_GetEvent(e);
  114. MouseEvent.x:=e.x-1;
  115. MouseEvent.y:=e.y-1;
  116. MouseEvent.buttons:=0;
  117. if e.buttons and Gpm_b_left<>0 then
  118. inc(MouseEvent.buttons,1);
  119. if e.buttons and Gpm_b_right<>0 then
  120. inc(MouseEvent.buttons,2);
  121. if e.buttons and Gpm_b_middle<>0 then
  122. inc(MouseEvent.buttons,4);
  123. case (e.EventType and $f) of
  124. GPM_MOVE,
  125. GPM_DRAG : MouseEvent.Action:=MouseActionMove;
  126. GPM_DOWN : MouseEvent.Action:=MouseActionDown;
  127. GPM_UP : MouseEvent.Action:=MouseActionUp;
  128. else
  129. MouseEvent.Action:=0;
  130. end;
  131. LastMouseEvent:=MouseEvent;
  132. { update mouse cursor }
  133. if mousecur then
  134. PlaceMouseCur(MouseEvent.y*ScreenWidth+MouseEvent.x);
  135. end;
  136. function PollMouseEvent(var MouseEvent: TMouseEvent):boolean;
  137. var
  138. e : TGPMEvent;
  139. fds : FDSet;
  140. begin
  141. if gpm_fd<0 then
  142. exit(false);
  143. FD_Zero(fds);
  144. FD_Set(gpm_fd,fds);
  145. if (Select(gpm_fd+1,@fds,nil,nil,1)>0) then
  146. begin
  147. Gpm_GetSnapshot(e);
  148. MouseEvent.x:=e.x-1;
  149. MouseEvent.y:=e.y-1;
  150. MouseEvent.buttons:=0;
  151. if e.buttons and Gpm_b_left<>0 then
  152. inc(MouseEvent.buttons,1);
  153. if e.buttons and Gpm_b_right<>0 then
  154. inc(MouseEvent.buttons,2);
  155. if e.buttons and Gpm_b_middle<>0 then
  156. inc(MouseEvent.buttons,4);
  157. case (e.EventType and $f) of
  158. GPM_MOVE,
  159. GPM_DRAG : MouseEvent.Action:=MouseActionMove;
  160. GPM_DOWN : MouseEvent.Action:=MouseActionDown;
  161. GPM_UP : MouseEvent.Action:=MouseActionUp;
  162. else
  163. MouseEvent.Action:=0;
  164. end;
  165. PollMouseEvent:=true;
  166. end
  167. else
  168. PollMouseEvent:=false;
  169. end;
  170. {
  171. $Log$
  172. Revision 1.1 2000-01-06 01:20:31 peter
  173. * moved out of packages/ back to topdir
  174. Revision 1.1 1999/11/24 23:36:38 peter
  175. * moved to packages dir
  176. Revision 1.5 1999/07/01 19:41:26 peter
  177. * define OLDGPM to compile with old gpm (for v1.14) else the new
  178. gpm unit from rtl will be used (v1.17)
  179. Revision 1.4 1999/06/23 00:01:30 peter
  180. * check for videobuf=nil
  181. Revision 1.3 1999/03/31 20:20:18 michael
  182. + Fixed probmem preventing IDE to run in x-term.
  183. Revision 1.2 1998/12/11 00:13:20 peter
  184. + SetMouseXY
  185. * use far for exitproc procedure
  186. Revision 1.1 1998/12/04 12:48:30 peter
  187. * moved some dirs
  188. Revision 1.3 1998/12/01 15:08:16 peter
  189. * fixes for linux
  190. Revision 1.2 1998/10/29 12:49:49 peter
  191. * more fixes
  192. }