OK, si vous êtes sous X11 et que vous voulez obtenir le kbd, vous devez faire un grappin. Si ce n'est pas le cas, ma seule bonne réponse est ncurses d'un terminal.
Voilà comment vous prenez tout à partir du clavier et relâchez à nouveau:
/* 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;
}
Exécuter ce à partir d'un terminal et tous les événements kbd devraient frapper. Je le teste sous Xorg mais il utilise des mécanismes Xlib vénérables et stables.
Espérons que cela aide.
SOYEZ PRUDENT avec grappins sous X. Lorsque vous êtes nouveau pour eux, il est parfois une bonne idée de commencer un processus de temporisation qui ungrab le serveur lorsque vous êtes code de test et laissez reposer et courir et décrocher toutes les quelques minutes. Il évite d'avoir à tuer ou de quitter le serveur pour réinitialiser l'état externe.
A partir de là, je vais laisser à vous de décider comment multiplexer renderes. Lisez les documents XGrabKeyboard et les documents XEvent pour commencer. Si vous avez de petites fenêtres exposées aux coins de l'écran, vous pouvez coincer le pointeur dans un coin pour sélectionner un contrôleur. XWarpPointer peut mettre le pointeur sur l'un d'entre eux ainsi que du code.
Un point de plus: vous pouvez saisir le pointeur ainsi, et d'autres ressources. Si vous avez un contrôleur en cours d'exécution sur la boîte en face de laquelle vous êtes assis, vous pouvez utiliser le clavier et la souris pour le basculer entre des sockets ouverts avec des moteurs de rendu différents.Vous ne devriez pas avoir besoin de redimensionner la fenêtre de sortie à moins de plein écran avec cette approche, jamais. Avec plus de travail, vous pouvez réellement déposer des superpositions alpha-mélangées sur le dessus en utilisant les extensions SHAPE et COMPOSITE pour obtenir une belle fonctionnalité de superposition en réponse à l'entrée de l'utilisateur (qui pourrait compter comme dorure le lis).
J'ai supprimé la "réponse" qui a conduit à la clarification ci-dessus ... Je pense que la clarification doit rester, mais elle couvre assez que ma pseudo-réponse, qui aurait pu être un commentaire, peut être entièrement effacée. –