-
Notifications
You must be signed in to change notification settings - Fork 15
/
Copy patheventmonitor.cpp
116 lines (93 loc) · 2.79 KB
/
eventmonitor.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
108
109
110
111
112
113
114
115
116
/*
* Copyright (C) 2017 ~ 2018 Deepin Technology Co., Ltd.
*
* Author: rekols <[email protected]>
*
* This program 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
* any later version.
*
* This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "eventmonitor.h"
#include <X11/Xlibint.h>
EventMonitor::EventMonitor(QObject *parent)
: QThread(parent)
{
}
EventMonitor::~EventMonitor()
{
requestInterruption();
quit();
wait();
}
void EventMonitor::run()
{
if (isInterruptionRequested())
return;
auto *display = QX11Info::display();
// unable to open display.
if (display == 0) {
return;
}
XRecordClientSpec clients = XRecordAllClients;
XRecordRange *range = XRecordAllocRange();
// unable to allocate XRecordRange
if (range == 0) {
return;
}
memset(range, 0, sizeof(XRecordRange));
range->device_events.first = KeyPress;
range->device_events.last = MotionNotify;
XRecordContext context = XRecordCreateContext(display, 0, &clients, 1, &range, 1);
if (context == 0) {
return;
}
XFree(range);
XSync(display, True);
Display *display_datalink = XOpenDisplay(0);
if (display_datalink == 0) {
return;
}
if (!XRecordEnableContext(display_datalink, context, callback, (XPointer) this)) {
return;
}
}
void EventMonitor::callback(XPointer ptr, XRecordInterceptData* data)
{
((EventMonitor *) ptr)->handleEvent(data);
}
void EventMonitor::handleEvent(XRecordInterceptData* data)
{
if (data->category == XRecordFromServer) {
xEvent *event = (xEvent *)data->data;
switch (event->u.u.type) {
case ButtonPress:
Q_EMIT buttonPress(event->u.keyButtonPointer.rootX,
event->u.keyButtonPointer.rootY);
// 鼠标左键点击
if (event->u.u.detail == 1) {
}
break;
case ButtonRelease:
Q_EMIT buttonRelease(event->u.keyButtonPointer.rootX,
event->u.keyButtonPointer.rootY);
// 鼠标左键释放
if (event->u.u.detail == 1) {
}
break;
case MotionNotify:
// 鼠标移动
break;
}
}
fflush(stdout);
XRecordFreeData(data);
}