OK hilft, wenn Sie unter X11 sind und Sie die kbd bekommen, benötigen Sie einen Greifer zu tun. Wenn Sie nicht sind, ist meine einzige gute Antwort ncurses von einem Terminal.
Hier ist, wie Sie alles, was von der Tastatur greifen und wieder loslassen:
/* 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;
}
Führen Sie dieses von einem Terminal und alle kbd Ereignisse es treffen sollte. Ich teste es unter Xorg , aber es verwendet ehrwürdige, stabile Xlib-Mechanismen.
Hoffe, das hilft.
ACHTUNG mit Greifern unter X. Wenn Sie die neu für sie sind, manchmal ist es eine gute Idee eine Zeitverzögerung zu starten, die den Server wird Ungrab wenn Sie Testcode sind und lassen Sie es sich und laufen und Ungrab alle paar Minuten. Es erspart das Töten oder Wechseln vom Server in den externen Reset-Zustand.
Von hier aus überlasse ich es Ihnen zu entscheiden, wie Renderer zu multiplexen. Lesen Sie die XGrabKeyboard-Dokumente und XEvent-Dokumente, um zu beginnen. Wenn Sie an den Bildschirmecken ausgesetzt kleine Fenster haben, könnten Sie der Zeiger in eine Ecke stauen einen Controller auszuwählen. XWarpPointer kann den Zeiger zu einem von ihnen auch vom Code schieben.
Ein weiterer Punkt: Sie können auch den Zeiger und andere Ressourcen greifen. Wenn auf der Box, vor der Sie sitzen, ein Controller ausgeführt wird, können Sie die Tastatur und die Maus verwenden, um zwischen offenen Sockets mit verschiedenen Renderern zu wechseln.Sie sollten das Ausgabefenster mit diesem Ansatz nicht mehr auf weniger als Vollbildgröße ändern müssen. Mit mehr Arbeit können Sie Alpha-Blended-Overlays mit den SHAPE- und COMPOSITE-Erweiterungen ganz oben ablegen, um eine nette Überlagerungsfunktion als Reaktion auf Benutzereingaben zu erhalten (die als Vergoldung der Lilie gelten könnten).
Ich löschte die "Antwort", die zu der obigen Klarstellung führte ... Ich denke, die Klärung muss bleiben, aber es deckt genug, dass meine Pseudo-Antwort, die ein Kommentar hätte sein können, vollständig gelöscht werden kann. –