-
Notifications
You must be signed in to change notification settings - Fork 0
/
mouse.cpp
109 lines (89 loc) · 2.96 KB
/
mouse.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
This file is part of VidMotion.
VidMotion is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
VidMotion is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with VidMotion. If not, see <http://www.gnu.org/licenses/>.
*/
#include "mouse.hpp"
static int XlibErrorHandler(Display *display, XErrorEvent *event) {
fprintf(stderr, "An error occured detecting the mouse position\n");
return True;
}
CCursor::CCursor() {
display = XOpenDisplay(NULL);
assert(display);
XSetErrorHandler(XlibErrorHandler);
number_of_screens = XScreenCount(display);
fprintf(stderr, "There are %d screens available in this X session\n", number_of_screens);
root_windows = static_cast<Window *>(malloc(sizeof(Window) * number_of_screens));
for (int i = 0; i < number_of_screens; i++) {
root_windows[i] = XRootWindow(display, i);
}
//Display *displayMain = XOpenDisplay(NULL);
XWindowAttributes gwa;
Window root = DefaultRootWindow(display);
XGetWindowAttributes(display, root, &gwa);
width = gwa.width;
height = gwa.height;
}
CCursor::~CCursor() {
XCloseDisplay(display);
free(root_windows);
}
coordinates CCursor::getPosition() {
bool result;
Window window_returned;
int root_x, root_y;
int win_x, win_y;
unsigned int mask_return;
coordinates pos;
pos.x=-1;
pos.y=-1;
for (int i = 0; i < number_of_screens; i++) {
result = XQueryPointer(display, root_windows[i], &window_returned,
&window_returned, &root_x, &root_y, &win_x, &win_y,
&mask_return);
if (result == True) {
break;
}
}
if (result != True) {
fprintf(stderr, "No mouse found.\n");
return pos;
}
// printf("Mouse is at (%d,%d)\n", root_x, root_y);
pos.x=root_x;
pos.y=root_y;
// free(root_windows);
// mouseMove(root_x, root_y);
return pos;
}
int CCursor::setRelPosition(coordinates pos) {
//Display *displayMain = XOpenDisplay(NULL);
if(display == NULL)
{
fprintf(stderr, "Error Opening the Display !!!\n");
return -1;
}
XWarpPointer(display, None, None, 0, 0, 0, 0, pos.x, pos.y);
//XCloseDisplay(displayMain);
return 0;
}
int CCursor::setAbsPosition(coordinates pos) {
coordinates mousePos=getPosition();
pos.x=pos.x-mousePos.x;
pos.y=pos.y-mousePos.y;
return setRelPosition(pos);
}
int CCursor::setAbsPercentPosition(coordinates pos) {
pos.x=pos.x*width;
pos.y=pos.y*height;
return setAbsPosition(pos);
}