Estoy tratando de forzar el bloqueo del led. xset
no funciona para mí, así que estoy tratando de usarlo setleds
.
En una consola gráfica, este comando devuelve:
> LANG=C setleds -L +caps
KDGKBLED: Inappropriate ioctl for device
Error reading current flags setting. Maybe you are not on the console?
En una terminal virtual, funciona, sin embargo, el efecto es local en esa terminal virtual. Por lo que entiendo, corriendo
> setleds -L +caps < /dev/tty1
desde una terminal virtual (mi servidor X está sentado en tty1) debería funcionar. Sin embargo, esto requiere acceso de root.
¿Hay alguna forma de enviar un comando a la consola subyacente a un servidor X, ya sea desde dicho servidor x o desde otro VT, sin root?
Editar: a partir de una sugerencia de Mark Plotnik, y en base al código encontrado aquí , escribí y compilé lo siguiente:
#include <X11/Xlib.h>
#include <X11/XKBlib.h>
#define SCROLLLOCK 1
#define CAPSLOCK 2
#define NUMLOCK 16
void setLeds(int leds) {
Display *dpy = XOpenDisplay(0);
XKeyboardControl values;
values.led_mode = leds & SCROLLLOCK ? LedModeOn : LedModeOff;
values.led = 3;
XChangeKeyboardControl(dpy, KBLedMode, &values);
XkbLockModifiers(dpy, XkbUseCoreKbd, CAPSLOCK | NUMLOCK,
leds & (CAPSLOCK | NUMLOCK) );
XFlush(dpy);
XCloseDisplay(dpy);
}
int main() {
setLeds(CAPSLOCK);
return 0;
}
Por lo que Gilles escribió sobre xset
, no esperaba que funcionara, pero lo hace ... en cierto sentido: establece el led, pero también establece el estado del bloqueo de mayúsculas. No entiendo completamente todo el código anterior, por lo que es posible que haya cometido un error tonto. Aparentemente, la línea XChangeKeyboardControl...
no cambia el comportamiento del programa, y XkbLockModifiers
es lo que establece el led y el estado del bloqueo de mayúsculas.
xdotool key Caps_Lock
desde un cliente X autorizado, aunque esto realmente activará el bloqueo de mayúsculas.xterm
fuente y utiliza una llamada a XChangeKeyboardControl () para configurar o deshabilitar los LED sin afectar el estado de bloqueo de mayúsculas, etc. Entonces, si puede compilar el código C, ese es un enfoque.xterm
a los leds? Parece una buena idea, editaré la pregunta con mis resultados.xterm
encender el LED ScrollLock enviando la secuencia de escape ESC [3 q, según el archivoctlseqs.txt
que viene con la fuente, pero no pude hacer que los LED Num o CapsLock se iluminaran con los parámetros 1 y 2. Tal vez necesito haz la configuración XKB mencionada en la respuesta.xterm
llamadasXChangeKeyboardControl
enxtermShowLED
yxtermClearLEDs
, pero no llamaXkbLockModifiers
a ningún lado.Respuestas:
En principio, deberías poder hacerlo con el venerable
xset
comando.o
xset led 4
para configurar el LED número 4, si su sistema no reconoce los LED por su nombre.Sin embargo, esto no parece funcionar de manera confiable. En mi máquina, solo puedo configurar Scroll Lock de esta manera, y no soy el único . Esto parece ser una cuestión de configuración de XKB .
La siguiente solución a nivel de usuario debería funcionar (en su mayor parte):
Extraiga su configuración actual de xkb:
Edite el archivo
myconf.xkb
, reemplazando!allowExplicit
conallowExplicit
en los bloques relevantes:Cargue el nuevo archivo
Ahora, encender y apagar los leds
xset
debería funcionar. Según el informe de error, no podrá apagar los leds cuando se supone que están encendidos (por ejemplo, si CapsLock está habilitado).fuente
xset
antes, y de hecho no funciona. Sin embargo, no había visto este informe de error. De todos modos, "Estado: Wontfix resuelto" no es realmente alentador ... La soluciónallowExplicit
probablemente funcionaría para mí (no necesito apagar el led), pero cambiarlo aún requiere root.xkbcomp
en cualquier momento. No estoy lo suficientemente familiarizado con XKB para decirle exactamente lo que necesita cambiar (establecer un aspecto específico en lugar de un mapa predefinido completo con XKB es un poco difícil ), pero unix.stackexchange.com/questions/166844/mapping -key-bindings / ... debería tener algunos punteros.xkbcomp $DISPLAY output.xkb
luego reemplacé!allowExplicit
porallowExplicit
en laindicator "Caps Lock"
sección, luego volví a cargar el archivoxkbcomp output.xkb
. Hay muchas advertencias y xset no funciona mejor después. Leeré más sobre xkb./usr/share/X11/xkb/compat/ledcaps
y ... / lednum y esto lo hizo permanente.Utilizando
sed
Después de cerrar sesión y volver a iniciarla, el Caps LockLED ahora se puede controlar sin ningún
root
privilegio utilizando los comandos:fuente
sudo
y nunca más. Para comprender por qué esto podría ser tan importante para ciertos usuarios, consulte estavim
aplicación .sed
sola frase.Una combinación del enfoque sin raíz de @Gilles con la idea de la automatización completa de @Serge_Stroobandt.
Para habilitar el control de los LED de bloqueo de mayúsculas , bloqueo numérico y bloqueo de mayúsculas :
Para encender y apagar un LED:
fuente