代码拉取完成,页面将自动刷新
/*
* Copyright (C) 2017 ~ 2018 Deepin Technology Co., Ltd.
*
* Author: rekols <rekols@foxmail.com>
*
* 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);
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。