mouse.inc 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348
  1. {
  2. System independent mouse interface for linux
  3. $Id$
  4. }
  5. uses
  6. Linux,Video
  7. {$ifndef NOMOUSE}
  8. {$ifdef OLDGPM}
  9. ,gpm114
  10. {$else}
  11. ,gpm
  12. {$endif}
  13. {$endif ndef NOMOUSE}
  14. ;
  15. const
  16. mousecur : boolean = false;
  17. mousecurofs : longint = -1;
  18. var
  19. mousecurcell : TVideoCell;
  20. const
  21. gpm_fs : longint = -1;
  22. procedure PlaceMouseCur(ofs:longint);
  23. {$ifndef NOMOUSE}
  24. var
  25. upd : boolean;
  26. {$endif ndef NOMOUSE}
  27. begin
  28. {$ifndef NOMOUSE}
  29. if VideoBuf=nil then
  30. exit;
  31. upd:=false;
  32. if (MouseCurOfs<>-1) and (VideoBuf^[MouseCurOfs]=MouseCurCell) then
  33. begin
  34. VideoBuf^[MouseCurOfs]:=MouseCurCell xor $7f00;
  35. upd:=true;
  36. end;
  37. MouseCurOfs:=ofs;
  38. if (MouseCurOfs<>-1) then
  39. begin
  40. MouseCurCell:=VideoBuf^[MouseCurOfs] xor $7f00;
  41. VideoBuf^[MouseCurOfs]:=MouseCurCell;
  42. upd:=true;
  43. end;
  44. if upd then
  45. Updatescreen(false);
  46. {$endif ndef NOMOUSE}
  47. end;
  48. procedure InitMouse;
  49. {$ifndef NOMOUSE}
  50. var
  51. connect : TGPMConnect;
  52. {$endif ndef NOMOUSE}
  53. begin
  54. {$ifndef NOMOUSE}
  55. PendingMouseHead:=@PendingMouseEvent;
  56. PendingMouseTail:=@PendingMouseEvent;
  57. PendingMouseEvents:=0;
  58. FillChar(LastMouseEvent,sizeof(TMouseEvent),0);
  59. if gpm_fs=-1 then
  60. begin
  61. { open gpm }
  62. connect.EventMask:=GPM_MOVE or GPM_DRAG or GPM_DOWN or GPM_UP;
  63. connect.DefaultMask:=0;
  64. connect.MinMod:=0;
  65. connect.MaxMod:=0;
  66. gpm_fs:=Gpm_Open(connect,0);
  67. if (gpm_fs=-2) and (getenv('TERM')<>'xterm') then
  68. begin
  69. gpm_fs:=-1;
  70. Gpm_Close;
  71. end;
  72. end;
  73. { show mousepointer }
  74. if gpm_fs<>-1 then
  75. ShowMouse;
  76. {$endif ndef NOMOUSE}
  77. end;
  78. procedure DoneMouse;
  79. begin
  80. {$ifndef NOMOUSE}
  81. If gpm_fs<>-1 then
  82. begin
  83. HideMouse;
  84. Gpm_Close;
  85. gpm_fs:=-1;
  86. end;
  87. {$endif ndef NOMOUSE}
  88. end;
  89. function DetectMouse:byte;
  90. {$ifndef NOMOUSE}
  91. var
  92. x : longint;
  93. e : TGPMEvent;
  94. connect : TGPMConnect;
  95. {$endif ndef NOMOUSE}
  96. begin
  97. {$ifdef NOMOUSE}
  98. DetectMouse:=0;
  99. {$else ndef NOMOUSE}
  100. if gpm_fs=-1 then
  101. begin
  102. connect.EventMask:=GPM_MOVE or GPM_DRAG or GPM_DOWN or GPM_UP;
  103. connect.DefaultMask:=0;
  104. connect.MinMod:=0;
  105. connect.MaxMod:=0;
  106. gpm_fs:=Gpm_Open(connect,0);
  107. if (gpm_fs=-2) and (getenv('TERM')<>'xterm') then
  108. begin
  109. Gpm_Close;
  110. gpm_fs:=-1;
  111. end;
  112. end;
  113. { always a mouse deamon present }
  114. if gpm_fs<>-1 then
  115. begin
  116. x:=Gpm_GetSnapshot(e);
  117. if x<>-1 then
  118. DetectMouse:=x
  119. else
  120. DetectMouse:=2;
  121. end
  122. else
  123. DetectMouse:=0;
  124. {$endif ndef NOMOUSE}
  125. end;
  126. procedure ShowMouse;
  127. begin
  128. PlaceMouseCur(MouseCurOfs);
  129. mousecur:=true;
  130. end;
  131. procedure HideMouse;
  132. begin
  133. PlaceMouseCur(-1);
  134. mousecur:=false;
  135. end;
  136. function GetMouseX:word;
  137. {$ifndef NOMOUSE}
  138. var
  139. e : TGPMEvent;
  140. {$endif ndef NOMOUSE}
  141. begin
  142. {$ifdef NOMOUSE}
  143. GetMouseX:=0;
  144. {$else ndef NOMOUSE}
  145. if gpm_fd<0 then
  146. exit(0);
  147. Gpm_GetSnapshot(e);
  148. GetMouseX:=e.x-1;
  149. {$endif ndef NOMOUSE}
  150. end;
  151. function GetMouseY:word;
  152. {$ifndef NOMOUSE}
  153. var
  154. e : TGPMEvent;
  155. {$endif ndef NOMOUSE}
  156. begin
  157. {$ifdef NOMOUSE}
  158. GetMouseY:=0;
  159. {$else ndef NOMOUSE}
  160. if gpm_fd<0 then
  161. exit(0);
  162. Gpm_GetSnapshot(e);
  163. GetMouseY:=e.y-1;
  164. {$endif ndef NOMOUSE}
  165. end;
  166. function GetMouseButtons:word;
  167. {$ifndef NOMOUSE}
  168. var
  169. e : TGPMEvent;
  170. {$endif ndef NOMOUSE}
  171. begin
  172. {$ifdef NOMOUSE}
  173. GetMouseButtons:=0;
  174. {$else ndef NOMOUSE}
  175. if gpm_fd<0 then
  176. exit(0);
  177. Gpm_GetSnapshot(e);
  178. GetMouseButtons:=e.buttons;
  179. {$endif ndef NOMOUSE}
  180. end;
  181. procedure SetMouseXY(x,y:word);
  182. begin
  183. end;
  184. procedure GetMouseEvent(var MouseEvent: TMouseEvent);
  185. {$ifndef NOMOUSE}
  186. var
  187. e : TGPMEvent;
  188. {$endif ndef NOMOUSE}
  189. begin
  190. {$ifdef NOMOUSE}
  191. fillchar(MouseEvent,SizeOf(TMouseEvent),#0);
  192. {$else ndef NOMOUSE}
  193. fillchar(MouseEvent,SizeOf(TMouseEvent),#0);
  194. if gpm_fd<0 then
  195. exit;
  196. Gpm_GetEvent(e);
  197. MouseEvent.x:=e.x-1;
  198. MouseEvent.y:=e.y-1;
  199. MouseEvent.buttons:=0;
  200. if e.buttons and Gpm_b_left<>0 then
  201. inc(MouseEvent.buttons,1);
  202. if e.buttons and Gpm_b_right<>0 then
  203. inc(MouseEvent.buttons,2);
  204. if e.buttons and Gpm_b_middle<>0 then
  205. inc(MouseEvent.buttons,4);
  206. case (e.EventType and $f) of
  207. GPM_MOVE,
  208. GPM_DRAG : MouseEvent.Action:=MouseActionMove;
  209. GPM_DOWN : MouseEvent.Action:=MouseActionDown;
  210. GPM_UP : MouseEvent.Action:=MouseActionUp;
  211. else
  212. MouseEvent.Action:=0;
  213. end;
  214. LastMouseEvent:=MouseEvent;
  215. { update mouse cursor }
  216. if mousecur then
  217. PlaceMouseCur(MouseEvent.y*ScreenWidth+MouseEvent.x);
  218. {$endif ndef NOMOUSE}
  219. end;
  220. function PollMouseEvent(var MouseEvent: TMouseEvent):boolean;
  221. {$ifndef NOMOUSE}
  222. var
  223. e : TGPMEvent;
  224. fds : FDSet;
  225. {$endif ndef NOMOUSE}
  226. begin
  227. {$ifdef NOMOUSE}
  228. fillchar(MouseEvent,SizeOf(TMouseEvent),#0);
  229. exit(false);
  230. {$else ndef NOMOUSE}
  231. fillchar(MouseEvent,SizeOf(TMouseEvent),#0);
  232. if gpm_fd<0 then
  233. exit(false);
  234. if gpm_fd>0 then
  235. begin
  236. FD_Zero(fds);
  237. FD_Set(gpm_fd,fds);
  238. end;
  239. if (gpm_fd=-2) or (Select(gpm_fd+1,@fds,nil,nil,1)>0) then
  240. begin
  241. Gpm_GetSnapshot(e);
  242. MouseEvent.x:=e.x-1;
  243. MouseEvent.y:=e.y-1;
  244. MouseEvent.buttons:=0;
  245. if e.buttons and Gpm_b_left<>0 then
  246. inc(MouseEvent.buttons,1);
  247. if e.buttons and Gpm_b_right<>0 then
  248. inc(MouseEvent.buttons,2);
  249. if e.buttons and Gpm_b_middle<>0 then
  250. inc(MouseEvent.buttons,4);
  251. case (e.EventType and $f) of
  252. GPM_MOVE,
  253. GPM_DRAG : MouseEvent.Action:=MouseActionMove;
  254. GPM_DOWN : MouseEvent.Action:=MouseActionDown;
  255. GPM_UP : MouseEvent.Action:=MouseActionUp;
  256. else
  257. MouseEvent.Action:=0;
  258. end;
  259. if (gpm_fd<>-2) or (MouseEvent.Action<>0) then
  260. PollMouseEvent:=true
  261. else
  262. PollMouseEvent:=false;
  263. end
  264. else
  265. PollMouseEvent:=false;
  266. {$endif ndef NOMOUSE}
  267. end;
  268. {
  269. $Log$
  270. Revision 1.2 2000-10-26 23:08:48 peter
  271. * merged freebsd from fixes
  272. Revision 1.1.2.1 2000/10/25 12:23:20 marco
  273. * Linux dir split up
  274. Revision 1.1.2.1 2000/10/24 07:58:49 pierre
  275. * get mouse to not crash on xterm, its now completely disabled
  276. Revision 1.1 2000/07/13 06:29:39 michael
  277. + Initial import
  278. Revision 1.3 2000/06/30 09:00:33 jonas
  279. * compiles again with -dnomouse
  280. Revision 1.2 2000/04/17 08:51:38 pierre
  281. + set conditional NOMOUSE to get dummy mouse unit
  282. Revision 1.1 2000/01/06 01:20:31 peter
  283. * moved out of packages/ back to topdir
  284. Revision 1.1 1999/11/24 23:36:38 peter
  285. * moved to packages dir
  286. Revision 1.5 1999/07/01 19:41:26 peter
  287. * define OLDGPM to compile with old gpm (for v1.14) else the new
  288. gpm unit from rtl will be used (v1.17)
  289. Revision 1.4 1999/06/23 00:01:30 peter
  290. * check for videobuf=nil
  291. Revision 1.3 1999/03/31 20:20:18 michael
  292. + Fixed probmem preventing IDE to run in x-term.
  293. Revision 1.2 1998/12/11 00:13:20 peter
  294. + SetMouseXY
  295. * use far for exitproc procedure
  296. Revision 1.1 1998/12/04 12:48:30 peter
  297. * moved some dirs
  298. Revision 1.3 1998/12/01 15:08:16 peter
  299. * fixes for linux
  300. Revision 1.2 1998/10/29 12:49:49 peter
  301. * more fixes
  302. }