LINUX.ORG.RU

История изменений

Исправление 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 получен. Выход из программы.