3#include "NativeEventFilterUnix.h"
8#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
9 #include <QtX11Extras/QX11Info>
12#include <QApplication>
13#include <QLoggingCategory>
17static Q_LOGGING_CATEGORY(log,
"Plugin.Hook.NativeEventFilter")
20#include <xcb/xcb_keysyms.h>
23#include <X11/keysymdef.h>
40Qt::KeyboardModifiers GetModifiers(uint32_t mask)
42 Qt::KeyboardModifiers modifiers = Qt::NoModifier;
43 if(XCB_KEY_BUT_MASK_SHIFT & mask)
44 modifiers |= Qt::ShiftModifier;
45 if(XCB_KEY_BUT_MASK_CONTROL & mask)
46 modifiers |= Qt::ControlModifier;
47 if(XCB_KEY_BUT_MASK_MOD_1 & mask)
48 modifiers |= Qt::AltModifier;
52bool CNativeEventFilterUnix::HandleKey(
53 xcb_keysym_t keysym, QEvent::Type type, Qt::KeyboardModifiers modifiers)
56 if(!m_pParameterPlugin
57 || !m_pParameterPlugin->GetCaptureAllKeyboard()) {
58 qDebug(log) <<
"Native window receive keyboard.";
79 key = Qt::Key_Super_L;
83 key = Qt::Key_Super_R;
91 CFrmViewer* focus = qobject_cast<CFrmViewer*>(QApplication::focusWidget());
94 QKeyEvent* keyEvent =
new QKeyEvent(type, key, modifiers);
100 case QEvent::KeyPress:
101 emit focus->sigKeyPressEvent(keyEvent);
103 case QEvent::KeyRelease:
104 emit focus->sigKeyReleaseEvent(keyEvent);
123bool CNativeEventFilterUnix::HandleEvent(xcb_generic_event_t* event)
127 switch (event->response_type & ~0x80) {
128 case XCB_KEY_PRESS: {
129 xcb_key_press_event_t *ke = (xcb_key_press_event_t *)event;
133 nRet = GetKeySym(ke, keysym);
139 bRet = HandleKey(keysym, QEvent::KeyPress, GetModifiers(ke->state));
142 case XCB_KEY_RELEASE: {
143 xcb_key_release_event_t *ke = (xcb_key_release_event_t *)event;
147 nRet = GetKeySym(ke, keysym);
153 bRet = HandleKey(keysym, QEvent::KeyRelease, GetModifiers(ke->state));
163int CNativeEventFilterUnix::GetKeySym(xcb_key_press_event_t *event, xcb_keysym_t &keysym)
167 keysym = xcb_key_symbols_get_keysym(m_pKeySymbols, event->detail, 0);
169 if (event->state & XCB_MOD_MASK_SHIFT) {
170 keysym = xcb_key_symbols_get_keysym(m_pKeySymbols, event->detail, 1);
176void CNativeEventFilterUnix::DisableSuperKeyShortcuts()
179 QProcess::execute(
"gsettings", {
"set",
"org.gnome.mutter",
"overlay-key",
""});
182 QString desktop = qEnvironmentVariable(
"XDG_CURRENT_DESKTOP");
183 if (desktop.contains(
"KDE", Qt::CaseInsensitive)) {
184 QProcess::execute(
"kwriteconfig5", {
"--file",
"kwinrc",
"--group",
"ModifierOnlyShortcuts",
"--key",
"Meta",
""});
185 QProcess::execute(
"kwin_x11", {
"--replace"});
189void CNativeEventFilterUnix::RestoreSuperKeyShortcuts()
192 QProcess::execute(
"gsettings", {
"reset",
"org.gnome.mutter",
"overlay-key"});
195 QString desktop = qEnvironmentVariable(
"XDG_CURRENT_DESKTOP");
196 if (desktop.contains(
"KDE", Qt::CaseInsensitive)) {
197 QProcess::execute(
"kwriteconfig5", {
"--file",
"kwinrc",
"--group",
"ModifierOnlyShortcuts",
"--key",
"Meta",
"org.kde.kglobalaccel,/component/kwin,,invokeShortcut,Show Desktop Grid"});
198 QProcess::execute(
"kwin_x11", {
"--replace"});
203 : m_pParameterPlugin(pPara)
204 , m_pKeySymbols(nullptr)
207 xcb_connection_t *connection =
nullptr;
208#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
209 if (
auto *x11Application = qGuiApp->nativeInterface<QNativeInterface::QX11Application>()) {
210 connection = x11Application->connection();
213 connection = QX11Info::connection();
216 m_pKeySymbols = xcb_key_symbols_alloc(connection);
217 if (!m_pKeySymbols) {
218 qCritical(log) <<
"Unable to allocate symbol table";
223CNativeEventFilterUnix::~CNativeEventFilterUnix()
227 xcb_key_symbols_free(m_pKeySymbols);
230#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
231bool CNativeEventFilterUnix::nativeEventFilter(
const QByteArray &eventType,
void *message, qintptr *result)
233bool CNativeEventFilterUnix::nativeEventFilter(
const QByteArray &eventType,
void *message,
long *result)
238 if (eventType ==
"xcb_generic_event_t") {
239 xcb_generic_event_t* e =
static_cast<xcb_generic_event_t *
>(message);
240 return HandleEvent(e);
243 if (eventType ==
"windows_generic_MSG" || eventType ==
"windows_dispatcher_MSG")
245 MSG *pMsg =
reinterpret_cast<MSG *
>(message);
A widget which displays output image from a CConnectDesktop and sends input keypresses and mouse acti...
Global parameters of plugins.