Skip to content

Commit b40e453

Browse files
committed
added linux mouseDown mouseUp mouseClick
1 parent 73d19c6 commit b40e453

File tree

3 files changed

+65
-5
lines changed

3 files changed

+65
-5
lines changed

XInputSimulator/main.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,15 +23,27 @@
2323

2424
using namespace std;
2525

26+
void waitABit();
27+
2628
int main()
2729
{
2830
cout << "Hello World!" << endl;
2931

3032
XInputSimulator &sim = XInputSimulator::getInstance();
31-
sim.mouseMoveTo(100,200);
32-
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
33+
sim.mouseMoveTo(500,400);
34+
waitABit();
3335
sim.mouseMoveRelative(400, -100);
36+
waitABit();
37+
sim.mouseDown(1);
38+
waitABit();
39+
sim.mouseMoveRelative(0, 300);
40+
waitABit();
41+
sim.mouseUp(1);
3442

3543
return 0;
3644
}
3745

46+
void waitABit()
47+
{
48+
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
49+
}

XInputSimulator/xinputsimulatorimpllinux.cpp

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,14 @@
1919
#include "notimplementedexception.h"
2020
#include <iostream>
2121

22+
//memset
23+
#include <stdio.h>
24+
#include <cstring>
25+
26+
//sleep
27+
#include <chrono>
28+
#include <thread>
29+
2230
XInputSimulatorImplLinux::XInputSimulatorImplLinux()
2331
{
2432
if((display = XOpenDisplay(NULL)) == NULL) {
@@ -29,6 +37,22 @@ XInputSimulatorImplLinux::XInputSimulatorImplLinux()
2937
root = DefaultRootWindow(display);
3038
}
3139

40+
void XInputSimulatorImplLinux::initMouseEvent(int button)
41+
{
42+
event.xbutton.button = button; //which button
43+
event.xbutton.same_screen = True;
44+
event.xbutton.subwindow = DefaultRootWindow(display);
45+
while (event.xbutton.subwindow)
46+
{
47+
event.xbutton.window = event.xbutton.subwindow;
48+
XQueryPointer(display, event.xbutton.window,
49+
&event.xbutton.root, &event.xbutton.subwindow,
50+
&event.xbutton.x_root, &event.xbutton.y_root,
51+
&event.xbutton.x, &event.xbutton.y,
52+
&event.xbutton.state);
53+
}
54+
}
55+
3256
void XInputSimulatorImplLinux::mouseMoveTo(int x, int y)
3357
{
3458
std::cout << "move the mouse!\n";
@@ -39,6 +63,10 @@ void XInputSimulatorImplLinux::mouseMoveTo(int x, int y)
3963

4064
XWarpPointer(display, None, root, 0, 0, 0, 0, x, y);
4165
XFlush(display);
66+
67+
68+
XEvent event;
69+
memset(&event, 0, sizeof (event));
4270
}
4371

4472
void XInputSimulatorImplLinux::mouseMoveRelative(int x, int y)
@@ -55,17 +83,34 @@ void XInputSimulatorImplLinux::mouseMoveRelative(int x, int y)
5583

5684
void XInputSimulatorImplLinux::mouseDown(int button)
5785
{
58-
throw NotImplementedException();
86+
//throw NotImplementedException();
87+
88+
this->initMouseEvent(button);
89+
90+
event.type = ButtonPress;
91+
if (XSendEvent(display, PointerWindow, True, ButtonPressMask, &event) == 0)
92+
std::cout << "Error to send the event!\n";
93+
XFlush(display);
5994
}
6095

6196
void XInputSimulatorImplLinux::mouseUp(int button)
6297
{
63-
throw NotImplementedException();
98+
//throw NotImplementedException();
99+
100+
this->initMouseEvent(button);
101+
102+
event.type = ButtonRelease;
103+
if (XSendEvent(display, PointerWindow, True, ButtonReleaseMask, &event) == 0)
104+
std::cout << "Error to send the event!\n";
105+
XFlush(display);
64106
}
65107

66108
void XInputSimulatorImplLinux::mouseClick(int button)
67109
{
68-
throw NotImplementedException();
110+
//throw NotImplementedException();
111+
this->mouseDown(button);
112+
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
113+
this->mouseUp(button);
69114
}
70115

71116
void XInputSimulatorImplLinux::mouseScrollX(int length)

XInputSimulator/xinputsimulatorimpllinux.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@ class XInputSimulatorImplLinux : public XInputSimulatorImpl
2828
private:
2929
Display *display;
3030
Window root;
31+
XEvent event;
32+
33+
void initMouseEvent(int button);
3134

3235
public:
3336
XInputSimulatorImplLinux();

0 commit comments

Comments
 (0)