1 { XMouseInput
2 
3   Copyright (C) 2008 Tom Gregorovic
4 
5   This source is free software; you can redistribute it and/or modify it under the terms of the
6   GNU General Public License as published by the Free Software Foundation; either version 2 of the
7   License, or (at your option) any later version.
8 
9   This code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
10   even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11   General Public License for more details.
12 
13   A copy of the GNU General Public License is available on the World Wide Web at
14   <http://www.gnu.org/copyleft/gpl.html>. You can also obtain it by writing to the Free Software
15   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1335, USA.
16 }
17 unit XMouseInput;
18 
19 {$mode objfpc}{$H+}
20 {$linklib Xtst}
21 
22 interface
23 
24 uses
25   Classes, SysUtils, Controls, Forms,
26   XLib, MouseInputIntf;
27 
28 type
29 
30   { TXMouseInput }
31 
32   TXMouseInput = class(TMouseInput)
33   protected
34     procedure DoDown(Button: TMouseButton); override;
35     procedure DoMove(ScreenX, ScreenY: Integer); override;
36     procedure DoUp(Button: TMouseButton); override;
37     procedure DoScrollUp; override;
38     procedure DoScrollDown; override;
39   end;
40 
InitializeMouseInputnull41 function InitializeMouseInput: TMouseInput;
42 
XTestFakeButtonEventnull43 function XTestFakeButtonEvent(dpy: PDisplay; button: dword; is_press: Boolean;
44   delay: dword): longint; cdecl; external;
45 
XTestFakeMotionEventnull46 function XTestFakeMotionEvent(dpy: PDisplay; screen: longint; x: longint; y: longint;
47   delay: dword): longint; cdecl; external;
48 
49 implementation
50 
InitializeMouseInputnull51 function InitializeMouseInput: TMouseInput;
52 begin
53   Result := TXMouseInput.Create;
54 end;
55 
56 const
57   MouseButtonToXButton: array [TMouseButton] of Integer = (1, 3, 2, 4, 5);
58 
59 { TXMouseInput }
60 
61 procedure TXMouseInput.DoDown(Button: TMouseButton);
62 var
63   Display: PDisplay;
64 begin
65   Display := XOpenDisplay(nil);
66   XTestFakeButtonEvent(Display, MouseButtonToXButton[Button], True, 0);
67   XFlush(Display);
68   XCloseDisplay(Display);
69 end;
70 
71 procedure TXMouseInput.DoMove(ScreenX, ScreenY: Integer);
72 var
73   Display: PDisplay;
74 begin
75   Display := XOpenDisplay(nil);
76   XTestFakeMotionEvent(Display, 0, ScreenX, ScreenY, 0);
77   XFlush(Display);
78   XCloseDisplay(Display);
79 end;
80 
81 procedure TXMouseInput.DoUp(Button: TMouseButton);
82 var
83   Display: PDisplay;
84 begin
85   Display := XOpenDisplay(nil);
86   XTestFakeButtonEvent(Display, MouseButtonToXButton[Button], False, 0);
87   XFlush(Display);
88   XCloseDisplay(Display);
89 end;
90 
91 procedure TXMouseInput.DoScrollUp;
92 var
93   Display: PDisplay;
94 begin
95   Display := XOpenDisplay(nil);
96   XTestFakeButtonEvent(Display, 4, True, 0);
97   XTestFakeButtonEvent(Display, 4, False, 0);
98   XFlush(Display);
99   XCloseDisplay(Display);
100 end;
101 
102 procedure TXMouseInput.DoScrollDown;
103 var
104   Display: PDisplay;
105 begin
106   Display := XOpenDisplay(nil);
107   XTestFakeButtonEvent(Display, 5, True, 0);
108   XTestFakeButtonEvent(Display, 5, False, 0);
109   XFlush(Display);
110   XCloseDisplay(Display);
111 end;
112 
113 end.
114 
115