add notice
[projets/fookb-qt.git] / xlib_wrapper.cpp
index d940a158cd252b23e73208ad4277075290ec1a5c..57ee6bf7d4509360869d5a3e15ed3d7c140002a6 100644 (file)
@@ -1,16 +1,68 @@
 #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()));
+            this, SLOT(XlibWrapperSlot()));
     timer->start(1000);
 }
+/* Instead of this, should subscribe to the correct QEvent */
 
 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 */
+    }
 }