tipos - listar usuarios en linux
enganchar en el manejo de eventos clave de Linux (4)
Quiero conectarme al manejo de eventos clave de escritorio de Linux.
Presionando CapsLock debería ingresar algún tipo de línea de comando.
Algunos de los comandos que deseo implementar:
- d / x: Eliminar de la posición actual del cursor hasta el carácter
x
. (inspirado en vi) - a: Ir al principio de la línea, como pos1. (inspirado en emacs).
- k: Eliminar hasta el final de la línea. (inspirado en emacs).
- ...
Los comandos deberían funcionar en cualquier campo de texto: navegador, cliente de correo, terminal gnome, ...
AFAIK low level xmodmap no me ayudará aquí.
Es algo como esto posible?
¿Dónde debo colocar el gancho?
La plataforma de destino actual es Ubuntu> = 14.04
Antecedentes: quiero mantener mis dedos señaladores en F y J, y usar la computadora sin mirar el teclado. Funciona para AZ desde hace varios años, pero las claves como Pos1 / End no son de fácil acceso.
Por favor, deje un comentario si no entiende una parte de esta pregunta. Gracias.
Actualizar
Esta pregunta solo trata de cómo enganchar en el manejo de eventos clave. El otro material (línea de comando) es un tema diferente. ¿Cómo puedes ver, por ejemplo, CapsLock x
?
Update2 Veo que no hay una solución fácil y directa. Si no tiene respuesta, pero sabe dónde puedo encontrar más ayuda (como preguntar en la lista de correo FOO), por favor dígame.
Actualización3 Dado que algunas personas no entienden lo que quiero, trato de explicarlo: si uso emacs o bash, me siento como si tuviera el control de la computadora: es como volar, con muy pocos movimientos puedo decirle a la computadora que haga lo que quiero. Editar texto en webbrowser textarea, LibreOffice o usar thunderbird hace que esta sensación desaparezca. Los movimientos del cursor son engorrosos, no tiene ganas de volar. Quiero controlar el escritorio, no solo una aplicación, y mantener mis dedos señaladores en las teclas F y J.
Otra forma de ver su pregunta: quiere un gestor de ventanas especializado. Lea las especificaciones de EWMH para más detalles. Lea antes una descripción general de X11 .
O considere algún administrador de ventanas X existente. Hay muchos de ellos. Sospecho que ratpoison o xmonad (o quizás pez sierra , etc.) podrían configurarse para satisfacer sus necesidades. (Pero no conozco bien estos WM).
Piense dos veces antes de implementar su administrador de ventanas desde cero. ¡Podría significar años de trabajo! AFAIU, un WM puede redirigir, filtrar, capturar o sintetizar eventos de teclado o mouse.
Por supuesto, con el mundo de los caminos, las cosas serán diferentes.
ACTUALIZAR
En lugar de decirle al servidor X que ignore el dispositivo, puede usar EVIOCGRAB
ioctl, que agregué al programa a continuación.
Debes hacer las siguientes cosas:
1. Asegúrese de tener el módulo CONFIG_UINPUT compilado y cargado. Creo que Ubuntu ya lo tiene. Si no ve el dispositivo /dev/uinput
, intente ejecutar modprobe -v uinput
para cargar el módulo.
2. Ejecute el siguiente programa como root y asígnele la ruta del dispositivo de teclado, por ejemplo:
./process /dev/input/by-id/usb-Microsoft_Wired_Keyboard_600-event-kbd
El siguiente programa crea un dispositivo de entrada falso llamado uinput-sample
y reenvía todos los eventos desde un dispositivo de entrada determinado. Lo adapté de la muestra que figura en http://thiemonge.org/getting-started-with-uinput
Puede modificarlo para hacer las cosas que quiere hacer.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <linux/input.h>
#include <linux/uinput.h>
#define die(str, args...) do { /
perror(str); /
exit(EXIT_FAILURE); /
} while(0)
int
main(int argc, char* argv[])
{
int fdo, fdi;
struct uinput_user_dev uidev;
struct input_event ev;
int i;
if(argc != 2) die("error: specify input device");
fdo = open("/dev/uinput", O_WRONLY | O_NONBLOCK);
if(fdo < 0) die("error: open");
fdi = open(argv[1], O_RDONLY);
if(fdi < 0) die("error: open");
if(ioctl(fdi, EVIOCGRAB, 1) < 0) die("error: ioctl");
if(ioctl(fdo, UI_SET_EVBIT, EV_SYN) < 0) die("error: ioctl");
if(ioctl(fdo, UI_SET_EVBIT, EV_KEY) < 0) die("error: ioctl");
if(ioctl(fdo, UI_SET_EVBIT, EV_MSC) < 0) die("error: ioctl");
for(i = 0; i < KEY_MAX; ++i)
if(ioctl(fdo, UI_SET_KEYBIT, i) < 0) die("error: ioctl");
memset(&uidev, 0, sizeof(uidev));
snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-sample");
uidev.id.bustype = BUS_USB;
uidev.id.vendor = 0x1;
uidev.id.product = 0x1;
uidev.id.version = 1;
if(write(fdo, &uidev, sizeof(uidev)) < 0) die("error: write");
if(ioctl(fdo, UI_DEV_CREATE) < 0) die("error: ioctl");
while(1)
{
if(read(fdi, &ev, sizeof(struct input_event)) < 0)
die("error: read");
ev.time.tv_sec = 0;
ev.time.tv_usec = 0;
if(write(fdo, &ev, sizeof(struct input_event)) < 0)
die("error: write");
}
if(ioctl(fdo, UI_DEV_DESTROY) < 0) die("error: ioctl");
close(fdi);
close(fdo);
return 0;
}
Aquí también hay un proyecto python que usa el controlador uinput:
La forma de fuerza bruta sería hacer modyfy / rebuild xserver-xorg-input-evdev
package y reemplazar /usr/lib/xorg/modules/input/evdev_drv.so
. Comenzaría tratando de modificar la función EvdevQueueKbdEvent()
en xf86-input-evdev-2.9.0/src/evdev.c
. No parece una solución muy elegante, pero creo que obtendrás flexibilidad para modificar la cola de eventos del teclado.
Una solución menos intrusiva puede ser posible usando XGRabKey()
(algunos detalles aquí ) y / o XGrabKeyboard()
.
Alguna información, que puede ser útil aquí (con respecto a la extensión XTest).