
6 changed files with 43 additions and 97 deletions
@ -0,0 +1,23 @@
|
||||
#include "xcbEventFilter.h" |
||||
#include <QApplication> |
||||
#include <QDebug> |
||||
|
||||
#include <xcb/xcb.h> |
||||
|
||||
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<xcb_generic_event_t *>(message); |
||||
qDebug() << "XCB Event"; |
||||
// ...
|
||||
} |
||||
return false; |
||||
} |
@ -0,0 +1,14 @@
|
||||
#ifndef XCB_EVENT_FILTER_H |
||||
#define XCB_EVENT_FILTER_H |
||||
|
||||
#include <QAbstractNativeEventFilter> |
||||
|
||||
class XcbEventFilter : public QAbstractNativeEventFilter |
||||
{ |
||||
public: |
||||
XcbEventFilter(); |
||||
~XcbEventFilter() override; |
||||
bool nativeEventFilter(const QByteArray &eventType, void *message, long *) override; |
||||
}; |
||||
|
||||
#endif // XCB_EVENT_FILTER_H
|
@ -1,75 +0,0 @@
|
||||
#include "xlib_wrapper.h" |
||||
#include <QApplication> |
||||
#include <QDebug> |
||||
|
||||
/* X Window headers */ |
||||
#include <X11/Xlib.h> |
||||
#include <X11/Xutil.h> |
||||
/* XKB fun */ |
||||
#include <X11/XKBlib.h> |
||||
|
||||
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 */ |
||||
} |
||||
} |
Loading…
Reference in new issue