OK, если вы под X11, и вы хотите получить KBD, вам нужно сделать захват. Если это не так, мой единственный хороший ответ - это ncurses из терминала.
Вот как вы захватить все с клавиатуры и отпустите снова:
/* Demo code, needs more error checking, compile
* with "gcc nameofthisfile.c -lX11".
/* weird formatting for markdown follows. argh! */
#include <X11/Xlib.h>
int main(int argc, char **argv)
{
Display *dpy;
XEvent ev;
char *s;
unsigned int kc;
int quit = 0;
if (NULL==(dpy=XOpenDisplay(NULL))) {
perror(argv[0]);
exit(1);
}
/*
* You might want to warp the pointer to somewhere that you know
* is not associated with anything that will drain events.
* (void)XWarpPointer(dpy, None, DefaultRootWindow(dpy), 0, 0, 0, 0, x, y);
*/
XGrabKeyboard(dpy, DefaultRootWindow(dpy),
True, GrabModeAsync, GrabModeAsync, CurrentTime);
printf("KEYBOARD GRABBED! Hit 'q' to quit!\n"
"If this job is killed or you get stuck, use Ctrl-Alt-F1\n"
"to switch to a console (if possible) and run something that\n"
"ungrabs the keyboard.\n");
/* A very simple event loop: start at "man XEvent" for more info. */
/* Also see "apropos XGrab" for various ways to lock down access to
* certain types of info. coming out of or going into the server */
for (;!quit;) {
XNextEvent(dpy, &ev);
switch (ev.type) {
case KeyPress:
kc = ((XKeyPressedEvent*)&ev)->keycode;
s = XKeysymToString(XKeycodeToKeysym(dpy, kc, 0));
/* s is NULL or a static no-touchy return string. */
if (s) printf("KEY:%s\n", s);
if (!strcmp(s, "q")) quit=~0;
break;
case Expose:
/* Often, it's a good idea to drain residual exposes to
* avoid visiting Blinky's Fun Club. */
while (XCheckTypedEvent(dpy, Expose, &ev)) /* empty body */ ;
break;
case ButtonPress:
case ButtonRelease:
case KeyRelease:
case MotionNotify:
case ConfigureNotify:
default:
break;
}
}
XUngrabKeyboard(dpy, CurrentTime);
if (XCloseDisplay(dpy)) {
perror(argv[0]);
exit(1);
}
return 0;
}
Выполнить это от терминала и все KBD события должны ударить его. Я тестирую его под Xorg , но он использует почтенные, стабильные механизмы Xlib.
Надеюсь, это поможет.
БУДЬТЕ ОСТОРОЖНЫ с грейферами под X. Когда вы новичок в них, иногда это хорошая идеи начать процесс задержки времени, который будет ungrab сервера, когда вы тестирования кода и дайте ему сидеть и работать и разграбить каждые пару минут. Это экономит на том, чтобы убить или переключиться с сервера на состояние внешнего сброса.
Отсюда я оставлю это вам, чтобы решить, как мультиплексировать визуализации. Прочтите документы XGrabKeyboard и документы XEvent, чтобы начать работу. Если у вас есть маленькие окна, выставленные на углах экрана, вы можете замять указатель в один угол, чтобы выбрать контроллер. XWarpPointer может перетащить указатель на один из них, а также из кода.
Еще один момент: вы также можете захватить указатель и другие ресурсы. Если у вас был один контроллер, работающий на коробке, перед которой вы сидите, вы можете использовать ввод с клавиатуры и мыши для переключения между открытыми сокетами с разными рендерами.При таком подходе вам больше не нужно изменять размер окна вывода до полного экрана. С большим количеством работы вы можете фактически сбросить альфа-смешанные оверлеи сверху с помощью расширений SHAPE и COMPOSITE, чтобы получить хорошую функцию наложения в ответ на ввод пользователя (который может считаться позолотой лилии).
Я удалил «ответ», который привел к пояснению выше ... Я думаю, что разъяснение должно остаться, но оно достаточно охватывает, что мой псевдо-ответ, который мог быть комментарием, можно полностью удалить. –