6b29f3bafe4f1c38b065988e128fe4708580bf35
[projets/fookb-qt.git] / xlib_wrapper.cpp
1 #include "xlib_wrapper.h"
2 #include <QApplication>
3 #include <QDebug>
4
5 /* X Window headers */
6 #include <X11/Xlib.h>
7 #include <X11/Xutil.h>
8 /* XKB fun */
9 #include <X11/XKBlib.h>
10
11 XlibWrapper::XlibWrapper()
12 {
13     timer = new QTimer(this);
14     timer->setSingleShot(true);
15     connect(timer, SIGNAL(timeout()),
16             this, SLOT(XlibWrapperSlot()));
17     timer->start(1000);
18 }
19
20 void XlibWrapper::XlibWrapperSlot()
21 {
22     int event_rtrn;
23     int error_rtrn;
24     int reason_rtrn;
25     Display *dpy;
26     XkbEvent labuda;
27
28     int state = 0;
29
30     qDebug() << "Timer...";
31     dpy = XkbOpenDisplay(NULL,
32             &event_rtrn,
33             &error_rtrn, NULL, NULL, &reason_rtrn);
34     if (dpy == NULL) {
35         qDebug() << "Cannot open display";
36         qApp->quit();
37     }
38
39     /* We would like receive the only Xkb event: XkbStateNotify. And only
40      * when XkbLockGroup happens. */
41     if (False == XkbSelectEvents(dpy,
42                 XkbUseCoreKbd,
43                 XkbAllEventsMask,
44                 0)) {
45         qDebug() << "Cannot XkbSelectEvents.";
46         qApp->quit();
47     }
48
49     if (False == XkbSelectEventDetails(dpy,
50                 XkbUseCoreKbd,
51                 XkbStateNotify,
52                 XkbAllEventsMask,
53                 XkbGroupLockMask)) {
54         qDebug() << "Cannot XkbSelectEventDetails.";
55         qApp->quit();
56     }
57
58     while (1) {
59         XNextEvent(dpy, &labuda.core);
60         state = labuda.state.group;
61         /* Should not be necessary, here works only with 2 keyboard dispositions */
62         if ((state < 0) || (state > 1))
63             state = 1;
64         qDebug() << "XNextEvent";
65         /* TODO: update flag depending on state */
66     }
67 }