3
3
#include < X11/Xutil.h>
4
4
#include < X11/extensions/XTest.h>
5
5
#include < unistd.h>
6
+
6
7
#include < algorithm>
7
8
#include < cctype>
8
9
#include < fstream>
9
10
#include < streambuf>
10
11
#include < string>
11
12
#include < vector>
12
13
14
+ #include " linux.hpp"
15
+
13
16
namespace driver {
14
17
18
+ void Click (const std::string& buttonType, int count) {
19
+ Display* display = XOpenDisplay (NULL );
20
+ int button = Button1;
21
+ if (buttonType == " middle" ) {
22
+ button = Button2;
23
+ } else if (buttonType == " right" ) {
24
+ button = Button3;
25
+ }
26
+
27
+ for (int i = 0 ; i < count; i++) {
28
+ XTestFakeButtonEvent (display, button, true , 0 );
29
+ XFlush (display);
30
+ usleep (10000 );
31
+ XTestFakeButtonEvent (display, button, false , 0 );
32
+ XFlush (display);
33
+ }
34
+
35
+ XCloseDisplay (display);
36
+ }
37
+
38
+ void FocusApplication (const std::string& application) {
39
+ std::string lower = application;
40
+ ToLower (lower);
41
+
42
+ Display* display = XOpenDisplay (NULL );
43
+ Window root = XDefaultRootWindow (display);
44
+
45
+ unsigned long length = 0 ;
46
+ unsigned char * property = 0 ;
47
+ GetProperty (display, root, " _NET_CLIENT_LIST" , &property, &length);
48
+
49
+ Window* windows = (Window*)property;
50
+ for (unsigned long i = 0 ; i < length; i++) {
51
+ Window window = windows[i];
52
+ std::string name = ProcessName (display, window);
53
+ if (name.find (application) != std::string::npos) {
54
+ XClientMessageEvent event;
55
+ event.type = ClientMessage;
56
+ event.display = display;
57
+ event.window = window;
58
+ event.message_type =
59
+ XInternAtom (display, std::string (" _NET_ACTIVE_WINDOW" ).c_str (), 1 );
60
+ event.format = 32 ;
61
+ event.data .l [0 ] = 1 ;
62
+ event.data .l [1 ] = CurrentTime;
63
+
64
+ Window root = XDefaultRootWindow (display);
65
+ XSendEvent (display, root, 0 ,
66
+ SubstructureRedirectMask | SubstructureNotifyMask,
67
+ (XEvent*)&event);
68
+ }
69
+ }
70
+
71
+ XFree (windows);
72
+ XCloseDisplay (display);
73
+ }
74
+
75
+ std::string GetActiveApplication () {
76
+ Display* display = XOpenDisplay (NULL );
77
+ Window root = XDefaultRootWindow (display);
78
+ unsigned long length = 0 ;
79
+ unsigned char * property = 0 ;
80
+ GetProperty (display, root, " _NET_ACTIVE_WINDOW" , &property, &length);
81
+
82
+ Window* window = (Window*)property;
83
+ std::string result = ProcessName (display, *window);
84
+
85
+ XFree (window);
86
+ XCloseDisplay (display);
87
+ return result;
88
+ }
89
+
15
90
void GetKeycode (Display* display, const std::string& key, int * keycode,
16
91
bool * shift) {
17
92
// convert our key names to the corresponding x11 key
18
93
std::string mapped = key;
19
- if (key == " Escape " ) {
20
- mapped = " escape " ;
94
+ if (key == " escape " ) {
95
+ mapped = " Escape " ;
21
96
} else if (key == " control" || key == " ctrl" ) {
22
97
mapped = " Control_L" ;
23
98
} else if (key == " alt" ) {
@@ -170,11 +245,6 @@ void GetKeycode(Display* display, const std::string& key, int* keycode,
170
245
}
171
246
}
172
247
173
- void ToLower (std::string& s) {
174
- std::transform (s.begin (), s.end (), s.begin (),
175
- [](unsigned char c) { return std::tolower (c); });
176
- }
177
-
178
248
void GetProperty (Display* display, Window window, const std::string& property,
179
249
unsigned char ** result, unsigned long * length) {
180
250
Atom atom = XInternAtom (display, property.c_str (), 1 );
@@ -185,106 +255,6 @@ void GetProperty(Display* display, Window window, const std::string& property,
185
255
&actual_format, length, &bytes_after, result);
186
256
}
187
257
188
- std::string ProcessName (Display* display, Window window) {
189
- unsigned long length = 0 ;
190
- unsigned char * property = 0 ;
191
- GetProperty (display, window, " _NET_WM_PID" , &property, &length);
192
-
193
- unsigned long * pid = (unsigned long *)property;
194
- std::ifstream t (std::string (" /proc/" ) + std::to_string (*pid) +
195
- std::string (" /cmdline" ));
196
- std::string path ((std::istreambuf_iterator<char >(t)),
197
- std::istreambuf_iterator<char >());
198
-
199
- XFree (pid);
200
- ToLower (path);
201
- return path;
202
- }
203
-
204
- void ToggleKey (Display* display, const std::string& key, bool down) {
205
- int keycode = -1 ;
206
- bool shift = false ;
207
- GetKeycode (display, key, &keycode, &shift);
208
- if (keycode == -1 ) {
209
- return ;
210
- }
211
-
212
- XTestFakeKeyEvent (display, keycode, down, CurrentTime);
213
- XFlush (display);
214
- }
215
-
216
- void Click (const std::string& buttonType, int count) {
217
- Display* display = XOpenDisplay (NULL );
218
- int button = Button1;
219
- if (buttonType == " middle" ) {
220
- button = Button2;
221
- } else if (buttonType == " right" ) {
222
- button = Button3;
223
- }
224
-
225
- for (int i = 0 ; i < count; i++) {
226
- XTestFakeButtonEvent (display, button, true , 0 );
227
- XFlush (display);
228
- usleep (10000 );
229
- XTestFakeButtonEvent (display, button, false , 0 );
230
- XFlush (display);
231
- }
232
-
233
- XCloseDisplay (display);
234
- }
235
-
236
- void FocusApplication (const std::string& application) {
237
- std::string lower = application;
238
- ToLower (lower);
239
-
240
- Display* display = XOpenDisplay (NULL );
241
- Window root = XDefaultRootWindow (display);
242
-
243
- unsigned long length = 0 ;
244
- unsigned char * property = 0 ;
245
- GetProperty (display, root, " _NET_CLIENT_LIST" , &property, &length);
246
-
247
- Window* windows = (Window*)property;
248
- for (unsigned long i = 0 ; i < length; i++) {
249
- Window window = windows[i];
250
- std::string name = ProcessName (display, window);
251
- if (name.find (application) != std::string::npos) {
252
- XClientMessageEvent event;
253
- event.type = ClientMessage;
254
- event.display = display;
255
- event.window = window;
256
- event.message_type =
257
- XInternAtom (display, std::string (" _NET_ACTIVE_WINDOW" ).c_str (), 1 );
258
- event.format = 32 ;
259
- event.data .l [0 ] = 1 ;
260
- event.data .l [1 ] = CurrentTime;
261
-
262
- Window root = XDefaultRootWindow (display);
263
- XSendEvent (display, root, 0 ,
264
- SubstructureRedirectMask | SubstructureNotifyMask,
265
- (XEvent*)&event);
266
- }
267
- }
268
-
269
- XFree (windows);
270
- XCloseDisplay (display);
271
- }
272
-
273
- std::string GetActiveApplication () {
274
- Display* display = XOpenDisplay (NULL );
275
- Window root = XDefaultRootWindow (display);
276
- unsigned long length = 0 ;
277
- unsigned char * property = 0 ;
278
- GetProperty (display, root, " _NET_ACTIVE_WINDOW" , &property, &length);
279
-
280
- Window* window = (Window*)property;
281
- std::string result = ProcessName (display, *window);
282
-
283
- XFree (window);
284
- XCloseDisplay (display);
285
- return result;
286
- }
287
-
288
258
std::vector<std::string> GetRunningApplications () {
289
259
Display* display = XOpenDisplay (NULL );
290
260
Window root = XDefaultRootWindow (display);
@@ -338,10 +308,43 @@ void PressKey(Display* display, std::string key,
338
308
}
339
309
}
340
310
311
+ std::string ProcessName (Display* display, Window window) {
312
+ unsigned long length = 0 ;
313
+ unsigned char * property = 0 ;
314
+ GetProperty (display, window, " _NET_WM_PID" , &property, &length);
315
+
316
+ unsigned long * pid = (unsigned long *)property;
317
+ std::ifstream t (std::string (" /proc/" ) + std::to_string (*pid) +
318
+ std::string (" /cmdline" ));
319
+ std::string path ((std::istreambuf_iterator<char >(t)),
320
+ std::istreambuf_iterator<char >());
321
+
322
+ XFree (pid);
323
+ ToLower (path);
324
+ return path;
325
+ }
326
+
341
327
void SetMouseLocation (int x, int y) {
342
328
Display* display = XOpenDisplay (NULL );
343
329
XWarpPointer (display, None, XDefaultRootWindow (display), 0 , 0 , 0 , 0 , x, y);
344
330
XCloseDisplay (display);
345
331
}
346
332
333
+ void ToggleKey (Display* display, const std::string& key, bool down) {
334
+ int keycode = -1 ;
335
+ bool shift = false ;
336
+ GetKeycode (display, key, &keycode, &shift);
337
+ if (keycode == -1 ) {
338
+ return ;
339
+ }
340
+
341
+ XTestFakeKeyEvent (display, keycode, down, CurrentTime);
342
+ XFlush (display);
343
+ }
344
+
345
+ void ToLower (std::string& s) {
346
+ std::transform (s.begin (), s.end (), s.begin (),
347
+ [](unsigned char c) { return std::tolower (c); });
348
+ }
349
+
347
350
} // namespace driver
0 commit comments