1 Star 0 Fork 0

开源应用/redict-submit

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
eventmonitor.cpp 2.79 KB
一键复制 编辑 原始数据 按行查看 历史
shenmo 提交于 2020-08-08 08:20 +08:00 . 提交
/*
* 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);
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
C++
1
https://gitee.com/deepin-opensource/redict-submit.git
git@gitee.com:deepin-opensource/redict-submit.git
deepin-opensource
redict-submit
redict-submit
master

搜索帮助