diff --git a/fookb.cpp b/fookb.cpp index 982d9d2..de93742 100644 --- a/fookb.cpp +++ b/fookb.cpp @@ -2,7 +2,7 @@ #include #include -#include "xlib_wrapper.h" +#include "xcbEventFilter.h" int main(int argc, char *argv[]) { @@ -11,7 +11,9 @@ int main(int argc, char *argv[]) QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/fookb.qml"))); - XlibWrapper xlib; + // Install event filter to handle mapping change + XcbEventFilter eventFilter; + app.installNativeEventFilter(&eventFilter); return app.exec(); } diff --git a/fookb.pro b/fookb.pro index 61a6c88..255f8c8 100644 --- a/fookb.pro +++ b/fookb.pro @@ -1,8 +1,7 @@ SOURCES = fookb.cpp \ - xlib_wrapper.cpp -HEADERS = xlib_wrapper.h + xcbEventFilter.cpp +HEADERS = xcbEventFilter.h TARGET = fookb RESOURCES = fookb.qrc QT += widgets qml -QMAKE_LFLAGS +=-lX11 diff --git a/xcbEventFilter.cpp b/xcbEventFilter.cpp new file mode 100644 index 0000000..b7e300b --- /dev/null +++ b/xcbEventFilter.cpp @@ -0,0 +1,23 @@ +#include "xcbEventFilter.h" +#include +#include + +#include + +XcbEventFilter::XcbEventFilter() +{ +} + +XcbEventFilter::~XcbEventFilter() +{ +} + +bool XcbEventFilter::nativeEventFilter(const QByteArray &eventType, void *message, long *) +{ + if (eventType == "xcb_generic_event_t") { + xcb_generic_event_t* ev = static_cast(message); + qDebug() << "XCB Event"; + // ... + } + return false; +} diff --git a/xcbEventFilter.h b/xcbEventFilter.h new file mode 100644 index 0000000..54b679f --- /dev/null +++ b/xcbEventFilter.h @@ -0,0 +1,14 @@ +#ifndef XCB_EVENT_FILTER_H +#define XCB_EVENT_FILTER_H + +#include + +class XcbEventFilter : public QAbstractNativeEventFilter +{ +public: + XcbEventFilter(); + ~XcbEventFilter() override; + bool nativeEventFilter(const QByteArray &eventType, void *message, long *) override; +}; + +#endif // XCB_EVENT_FILTER_H diff --git a/xlib_wrapper.cpp b/xlib_wrapper.cpp deleted file mode 100644 index 7d9b9b0..0000000 --- a/xlib_wrapper.cpp +++ /dev/null @@ -1,75 +0,0 @@ -#include "xlib_wrapper.h" -#include -#include - -/* X Window headers */ -#include -#include -/* XKB fun */ -#include - -XlibWrapper::XlibWrapper() -{ - timer = new QTimer(this); - timer->setSingleShot(true); - connect(timer, SIGNAL(timeout()), - this, SLOT(XlibWrapperSlot())); - timer->start(1000); -} -/* Instead of this, should subscribe to the correct QEvent */ -/* - * https://doc.qt.io/qt-5/qabstractnativeeventfilter.html - * - * case XCB_MAPPING_NOTIFY: - m_keyboard->handleMappingNotifyEvent((xcb_mapping_notify_event_t *)event); - break; - */ - -void XlibWrapper::XlibWrapperSlot() -{ - int event_rtrn; - int error_rtrn; - int reason_rtrn; - Display *dpy; - XkbEvent labuda; - - int state = 0; - - qDebug() << "Timer..."; - dpy = XkbOpenDisplay(NULL, - &event_rtrn, - &error_rtrn, NULL, NULL, &reason_rtrn); - if (dpy == NULL) { - qDebug() << "Cannot open display"; - qApp->quit(); - } - - /* We would like receive the only Xkb event: XkbStateNotify. And only - * when XkbLockGroup happens. */ - if (False == XkbSelectEvents(dpy, - XkbUseCoreKbd, - XkbAllEventsMask, - 0)) { - qDebug() << "Cannot XkbSelectEvents."; - qApp->quit(); - } - - if (False == XkbSelectEventDetails(dpy, - XkbUseCoreKbd, - XkbStateNotify, - XkbAllEventsMask, - XkbGroupLockMask)) { - qDebug() << "Cannot XkbSelectEventDetails."; - qApp->quit(); - } - - while (1) { - XNextEvent(dpy, &labuda.core); - state = labuda.state.group; - /* Should not be necessary, here works only with 2 keyboard dispositions */ - if ((state < 0) || (state > 1)) - state = 1; - qDebug() << "XNextEvent"; - /* TODO: update flag depending on state */ - } -} diff --git a/xlib_wrapper.h b/xlib_wrapper.h deleted file mode 100644 index 8362133..0000000 --- a/xlib_wrapper.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef XLIB_WRAPPER_H -#define XLIB_WRAPPER_H - -#include - -class XlibWrapper : public QObject -{ - Q_OBJECT -public: - XlibWrapper(); - QTimer *timer; - -public slots: - void XlibWrapperSlot(); -}; - -#endif // XLIB_WRAPPER_H