История изменений
Исправление EXL, (текущая версия) :
И root-доступ не нужен!
$ cat x11shit.c
// x11shit.c -- Die X.Org shit!
#include <X11/XKBlib.h>
#include <X11/extensions/XInput2.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
void main(void) {
Display *disp = XOpenDisplay(":0");
int xiOpcode, queryEvent, queryError, major = 2, minor = 0;
XQueryExtension(disp, "XInputExtension", &xiOpcode, &queryEvent, &queryError);
XIQueryVersion(disp, &major, &minor);
Window root = DefaultRootWindow(disp);
XIEventMask m;
m.deviceid = XIAllMasterDevices;
m.mask_len = XIMaskLen(XI_LASTEVENT);
m.mask = calloc(m.mask_len, sizeof(char));
XISetMask(m.mask, XI_RawKeyPress);
XISelectEvents(disp, root, &m, 1);
XSync(disp, 0);
free(m.mask);
while ("X.Org is shit") {
XEvent event;
XGenericEventCookie *cookie = (XGenericEventCookie*)&event.xcookie;
XNextEvent(disp, &event);
if (XGetEventData(disp, cookie) && cookie->type == GenericEvent && cookie->extension == xiOpcode) {
switch (cookie->evtype) {
case XI_RawKeyPress: {
XIRawEvent *ev = cookie->data;
KeySym s = XkbKeycodeToKeysym(disp, ev->detail, 0, 0);
if (s == NoSymbol) continue;
char *str = XKeysymToString(s);
if (str == NULL) continue;
if (strncmp(str, "Escape", 6) == 0) {
fprintf(stderr, "Esc получен. Выход из программы.\n", str);
exit(0);
} else
fprintf(stderr, "В дырявые иксы утёк keyEvent: \'%s\'. Нажми \'Esc\' для выхода.\n", str);
}
}
}
}
}
$ gcc x11shit.c -lX11 -lXi
$ ./a.out
В дырявые иксы утёк keyEvent: 'f'. Нажми 'Esc' для выхода.
В дырявые иксы утёк keyEvent: 'u'. Нажми 'Esc' для выхода.
В дырявые иксы утёк keyEvent: 'c'. Нажми 'Esc' для выхода.
В дырявые иксы утёк keyEvent: 'k'. Нажми 'Esc' для выхода.
Esc получен. Выход из программы.
Исправление EXL, :
И root-доступ не нужен!
$ cat x11shit.c
// x11shit.c -- Die X.Org shit!
#include <X11/XKBlib.h>
#include <X11/extensions/XInput2.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
void main(void) {
Display *disp = XOpenDisplay(":0");
int xiOpcode, queryEvent, queryError, major = 2, minor = 0;
XQueryExtension(disp, "XInputExtension", &xiOpcode, &queryEvent, &queryError);
XIQueryVersion(disp, &major, &minor);
Window root = DefaultRootWindow(disp);
XIEventMask m;
m.deviceid = XIAllMasterDevices;
m.mask_len = XIMaskLen(XI_LASTEVENT);
m.mask = calloc(m.mask_len, sizeof(char));
XISetMask(m.mask, XI_RawKeyPress);
XISelectEvents(disp, root, &m, 1);
XSync(disp, 0);
free(m.mask);
while ("X.Org is shit") {
XEvent event;
XGenericEventCookie *cookie = (XGenericEventCookie*)&event.xcookie;
XNextEvent(disp, &event);
if (XGetEventData(disp, cookie) && cookie->type == GenericEvent && cookie->extension == xiOpcode) {
switch (cookie->evtype) {
case XI_RawKeyPress: {
XIRawEvent *ev = cookie->data;
KeySym s = XkbKeycodeToKeysym(disp, ev->detail, 0, 0);
if (s == NoSymbol) continue;
char *str = XKeysymToString(s);
if (str == NULL) continue;
if (strncmp(str, "Escape", 6) == 0) {
fprintf(stderr, "Esc получен. Выход из программы.\n", str);
exit(0);
} else
fprintf(stderr, "В дырявые иксы утёк keyEvent: \'%s\'. Нажми \'Esc\', чтобы выйти из программы.\n", str);
}
}
}
}
}
$ gcc x11shit.c -lX11 -lXi
$ ./a.out
В дырявые иксы утёк keyEvent: 'f'. Нажми 'Esc', чтобы выйти из программы.
В дырявые иксы утёк keyEvent: 'u'. Нажми 'Esc', чтобы выйти из программы.
В дырявые иксы утёк keyEvent: 'c'. Нажми 'Esc', чтобы выйти из программы.
В дырявые иксы утёк keyEvent: 'k'. Нажми 'Esc', чтобы выйти из программы.
Esc получен. Выход из программы.
Исправление EXL, :
И root-доступ не нужен!
$ cat x11shit.c
// x11shit.c -- Die X.Org shit!
#include <X11/XKBlib.h>
#include <X11/extensions/XInput2.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
void main(void) {
Display *disp = XOpenDisplay(":0");
int xiOpcode, queryEvent, queryError, major = 2, minor = 0;
XQueryExtension(disp, "XInputExtension", &xiOpcode, &queryEvent, &queryError);
XIQueryVersion(disp, &major, &minor);
Window root = DefaultRootWindow(disp);
XIEventMask m;
m.deviceid = XIAllMasterDevices;
m.mask_len = XIMaskLen(XI_LASTEVENT);
m.mask = calloc(m.mask_len, sizeof(char));
XISetMask(m.mask, XI_RawKeyPress);
XISelectEvents(disp, root, &m, 1);
XSync(disp, 0);
free(m.mask);
while ("forever") {
XEvent event;
XGenericEventCookie *cookie = (XGenericEventCookie*)&event.xcookie;
XNextEvent(disp, &event);
if (XGetEventData(disp, cookie) && cookie->type == GenericEvent && cookie->extension == xiOpcode) {
switch (cookie->evtype) {
case XI_RawKeyPress: {
XIRawEvent *ev = cookie->data;
KeySym s = XkbKeycodeToKeysym(disp, ev->detail, 0, 0);
if (s == NoSymbol) continue;
char *str = XKeysymToString(s);
if (str == NULL) continue;
if (strncmp(str, "Escape", 6) == 0) {
fprintf(stderr, "Esc получен. Выход из программы.\n", str);
exit(0);
} else
fprintf(stderr, "В дырявые иксы утёк keyEvent: \'%s\'. Нажми \'Esc\', чтобы выйти из программы.\n", str);
}
}
}
}
}
$ gcc x11shit.c -lX11 -lXi
$ ./a.out
В дырявые иксы утёк keyEvent: 'f'. Нажми 'Esc', чтобы выйти из программы.
В дырявые иксы утёк keyEvent: 'u'. Нажми 'Esc', чтобы выйти из программы.
В дырявые иксы утёк keyEvent: 'c'. Нажми 'Esc', чтобы выйти из программы.
В дырявые иксы утёк keyEvent: 'k'. Нажми 'Esc', чтобы выйти из программы.
Esc получен. Выход из программы.
Исходная версия EXL, :
Сделай через дырявые иксы
И root-доступ не нужен!
$ cat x11shit.c
// x11shit.c -- Die X.Org shit!
#include <X11/XKBlib.h>
#include <X11/extensions/XInput2.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
void main(void) {
Display *disp = XOpenDisplay(":0");
int xiOpcode, queryEvent, queryError, major = 2, minor = 0;
XQueryExtension(disp, "XInputExtension", &xiOpcode, &queryEvent, &queryError);
XIQueryVersion(disp, &major, &minor);
Window root = DefaultRootWindow(disp);
XIEventMask m;
m.deviceid = XIAllMasterDevices;
m.mask_len = XIMaskLen(XI_LASTEVENT);
m.mask = calloc(m.mask_len, sizeof(char));
XISetMask(m.mask, XI_RawKeyPress);
XISelectEvents(disp, root, &m, 1);
XSync(disp, 0);
free(m.mask);
while ("forever") {
XEvent event;
XGenericEventCookie *cookie = (XGenericEventCookie*)&event.xcookie;
XNextEvent(disp, &event);
if (XGetEventData(disp, cookie) && cookie->type == GenericEvent && cookie->extension == xiOpcode) {
switch (cookie->evtype) {
case XI_RawKeyPress: {
XIRawEvent *ev = cookie->data;
KeySym s = XkbKeycodeToKeysym(disp, ev->detail, 0, 0);
if (s == NoSymbol) continue;
char *str = XKeysymToString(s);
if (str == NULL) continue;
if (strncmp(str, "Escape", 6) == 0) {
fprintf(stderr, "Esc получен. Выход из программы.\n", str);
exit(0);
} else
fprintf(stderr, "В дырявые иксы утёк keyEvent: \'%s\'. Нажми \'Esc\', чтобы выйти из программы.\n", str);
}
}
}
}
}
$ gcc x11shit.c -lX11 -lXi
$ ./a.out
В дырявые иксы утёк keyEvent: 'f'. Нажми 'Esc', чтобы выйти из программы.
В дырявые иксы утёк keyEvent: 'u'. Нажми 'Esc', чтобы выйти из программы.
В дырявые иксы утёк keyEvent: 'c'. Нажми 'Esc', чтобы выйти из программы.
В дырявые иксы утёк keyEvent: 'k'. Нажми 'Esc', чтобы выйти из программы.
Esc получен. Выход из программы.