salida - listar usuarios en linux
Biblioteca de entrada Linux/X11 sin crear una ventana (2)
De acuerdo, si tienes menos de X11 y quieres obtener el kbd, tienes que agarrarlo. Si no lo eres, mi única buena respuesta es ncurses desde una terminal.
Así es como agarras todo desde el teclado y lo liberas de nuevo:
/* 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; }
Ejecuta esto desde un terminal y todos los eventos kbd deberían golpearlo. Lo estoy probando bajo Xorg pero usa mecanismos venerables y estables de Xlib.
Espero que esto ayude.
TENGA CUIDADO con los controles debajo de X. Cuando es nuevo para ellos, a veces es una buena idea comenzar un proceso de demora que desabrochará el servidor cuando está probando el código y lo dejará funcionar y funcionar y desabrochará cada par de minutos. Ahorra tener que matar o pasar del servidor al estado de reinicio externo.
Desde aquí, te dejo decidir cómo multiplexar renderes. Lea los documentos de XGrabKeyboard y los documentos de XEvent para comenzar. Si tiene pequeñas ventanas expuestas en las esquinas de la pantalla, puede bloquear el puntero en una esquina para seleccionar un controlador. XWarpPointer puede empujar el puntero a uno de ellos también desde el código.
Un punto más: también puedes tomar el puntero y otros recursos. Si tenía un controlador ejecutándose en la caja en frente de la cual se sienta, podría usar la entrada de teclado y mouse para alternar entre tomas abiertas con diferentes representadores. Ya no deberías necesitar cambiar el tamaño de la ventana de salida a menos de la pantalla completa con este enfoque. Con más trabajo, podría colocar superposiciones combinadas alfa en la parte superior utilizando las extensiones SHAPE y COMPOSITE para obtener una buena función de superposición en respuesta a la entrada del usuario (que podría contar como dorado del lirio).
¿Existe una buena biblioteca para recopilar información del usuario en Linux desde el mouse / teclado / joystick que no lo obliga a crear una ventana visible para hacerlo? SDL le permite obtener la entrada del usuario de una manera razonable, pero parece forzarlo a crear una ventana, lo cual es problemático si ha abstraído el control para que la máquina de control no tenga que ser la misma que la máquina de renderizado. Sin embargo, si las máquinas de control y renderización son iguales, esto da como resultado una fea ventana SDL pequeña en la parte superior de la pantalla.
Editar para aclarar :
El renderizador tiene una ventana de salida, en su caso de uso normal, esa ventana es de pantalla completa, excepto cuando ambas se ejecutan en la misma computadora, solo para poder enfocar al controlador. En realidad, puede haber múltiples representadores que muestran una vista diferente de los mismos datos en diferentes computadoras controladas por el mismo controlador, por lo tanto, el desacoplamiento total de la entrada de la salida (Aprovechando las cosas incorporadas del cliente / servidor X11 para mostrar menos utilizable) Además, también son posibles múltiples aplicaciones de controlador para un renderizador. La comunicación entre los controladores y los renderizadores se realiza a través de zócalos.
Para el mouse puedes usar GPM .
No estoy seguro de la parte superior de mi cabeza para el teclado o joystick.
Probablemente no sería tan malo leer directamente desde allí /dev
archivos si es necesario.
Espero eso ayude