1#include "NativeEventFilterUnix.h"
8#include <QLoggingCategory>
11static Q_LOGGING_CATEGORY(log,
"Client.NativeEventFilter")
14#include <xcb/xcb_keysyms.h>
17#include <X11/keysymdef.h>
62Qt::KeyboardModifiers GetModifiers(uint32_t mask)
64 Qt::KeyboardModifiers modifiers = Qt::NoModifier;
65 if(XCB_KEY_BUT_MASK_SHIFT & mask)
66 modifiers |= Qt::ShiftModifier;
67 if(XCB_KEY_BUT_MASK_CONTROL & mask)
68 modifiers |= Qt::ControlModifier;
69 if(XCB_KEY_BUT_MASK_MOD_1 & mask)
70 modifiers |= Qt::AltModifier;
74bool CNativeEventFilterUnix::HandleKey(
75 xcb_keysym_t keysym, QEvent::Type type, Qt::KeyboardModifiers modifiers)
78 if(!m_pParameterPlugin
79 || m_pParameterPlugin->GetNativeWindowReceiveKeyboard()) {
80 qDebug(log) <<
"Native window receive keyboard.";
101 key = Qt::Key_Super_L;
105 key = Qt::Key_Super_R;
113 CFrmViewer* focus = qobject_cast<CFrmViewer*>(QApplication::focusWidget());
116 QKeyEvent* keyEvent =
new QKeyEvent(type, key, modifiers);
122 case QEvent::KeyPress:
123 emit focus->sigKeyPressEvent(keyEvent);
125 case QEvent::KeyRelease:
126 emit focus->sigKeyReleaseEvent(keyEvent);
133 QKeyEvent* keyEvent =
new QKeyEvent(type, key, modifiers);
134 qDebug(log) <<
"Process:" << keyEvent;
139bool CNativeEventFilterUnix::HandleEvent(xcb_generic_event_t* event)
143 switch (event->response_type & ~0x80) {
144 case XCB_KEY_PRESS: {
145 xcb_key_press_event_t *ke = (xcb_key_press_event_t *)event;
149 nRet = GetKeySym(ke, keysym);
155 bRet = HandleKey(keysym, QEvent::KeyPress, GetModifiers(ke->state));
158 case XCB_KEY_RELEASE: {
159 xcb_key_release_event_t *ke = (xcb_key_release_event_t *)event;
163 nRet = GetKeySym(ke, keysym);
169 bRet = HandleKey(keysym, QEvent::KeyRelease, GetModifiers(ke->state));
179int CNativeEventFilterUnix::GetKeySym(xcb_key_press_event_t *event, xcb_keysym_t &keysym)
183 keysym = xcb_key_symbols_get_keysym(m_pKeySymbols, event->detail, 0);
185 if (event->state & XCB_MOD_MASK_SHIFT) {
186 keysym = xcb_key_symbols_get_keysym(m_pKeySymbols, event->detail, 1);
193 : m_pParameterPlugin(pPara)
195 m_pConnect = xcb_connect(NULL, NULL);
197 if (xcb_connection_has_error(m_pConnect)) {
198 qCritical(log) <<
"Don't connect X server";
203 m_pKeySymbols = xcb_key_symbols_alloc(m_pConnect);
204 if (!m_pKeySymbols) {
205 qCritical(log) <<
"无法分配键符表";
210CNativeEventFilterUnix::~CNativeEventFilterUnix()
214 xcb_key_symbols_free(m_pKeySymbols);
215 xcb_disconnect(m_pConnect);
218#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
219bool CNativeEventFilterUnix::nativeEventFilter(
const QByteArray &eventType,
void *message, qintptr *result)
221bool CNativeEventFilterUnix::nativeEventFilter(
const QByteArray &eventType,
void *message,
long *result)
226 if (eventType ==
"xcb_generic_event_t") {
227 xcb_generic_event_t* e =
static_cast<xcb_generic_event_t *
>(message);
228 return HandleEvent(e);
231 if (eventType ==
"windows_generic_MSG" || eventType ==
"windows_dispatcher_MSG")
233 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.