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.