add notice
[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 /* Instead of this, should subscribe to the correct QEvent */
20
21 void XlibWrapper::XlibWrapperSlot()
22 {
23     int event_rtrn;
24     int error_rtrn;
25     int reason_rtrn;
26     Display *dpy;
27     XkbEvent labuda;
28
29     int state = 0;
30
31     qDebug() << "Timer...";
32     dpy = XkbOpenDisplay(NULL,
33             &event_rtrn,
34             &error_rtrn, NULL, NULL, &reason_rtrn);
35     if (dpy == NULL) {
36         qDebug() << "Cannot open display";
37         qApp->quit();
38     }
39
40     /* We would like receive the only Xkb event: XkbStateNotify. And only
41      * when XkbLockGroup happens. */
42     if (False == XkbSelectEvents(dpy,
43                 XkbUseCoreKbd,
44                 XkbAllEventsMask,
45                 0)) {
46         qDebug() << "Cannot XkbSelectEvents.";
47         qApp->quit();
48     }
49
50     if (False == XkbSelectEventDetails(dpy,
51                 XkbUseCoreKbd,
52                 XkbStateNotify,
53                 XkbAllEventsMask,
54                 XkbGroupLockMask)) {
55         qDebug() << "Cannot XkbSelectEventDetails.";
56         qApp->quit();
57     }
58
59     while (1) {
60         XNextEvent(dpy, &labuda.core);
61         state = labuda.state.group;
62         /* Should not be necessary, here works only with 2 keyboard dispositions */
63         if ((state < 0) || (state > 1))
64             state = 1;
65         qDebug() << "XNextEvent";
66         /* TODO: update flag depending on state */
67     }
68 }