Usandosed

Usandosed

Estoy intentando forzar el encendido del LED de mayúsculas. xsetNo me funciona, así que estoy intentando 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 para esa terminal virtual. Por lo que tengo entendido, corriendo

> setleds -L +caps < /dev/tty1

desde una terminal virtual (mi servidor X está en tty1) debería funcionar. Sin embargo, esto requiere acceso de root.

¿Hay alguna manera 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: de una sugerencia de Mark Plotnik y basado en el código encontradoaquí, 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 escribió Gilles xset, no esperaba que funcionara, pero funciona... en cierto sentido: configura el LED, pero también establece el estado de bloqueo de mayúsculas. No entiendo completamente todo el código anterior, por lo que es posible que haya cometido un error tonto. Al parecer, la línea XChangeKeyboardControl...no cambia el comportamiento del programa, y XkbLockModifiers​​es la que configura el led y el estado de mayúsculas.

Respuesta1

En principio, deberías poder hacerlo con el venerablexsetdominio.

xset led named 'Caps Lock'

o xset led 4para 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, sólo puedo configurar el bloqueo de desplazamiento de esta manera, yNo soy el unico. EsteParece ser una cuestión de configuración de XKB..

La siguiente solución a nivel de usuario debería funcionar (en su mayor parte):

  1. Extraiga su configuración xkb actual:

    xkbcomp $DISPLAY myconf.xkb
    
  2. Edite el archivo myconf.xkb, reemplazándolo !allowExplicitcon allowExpliciten los bloques relevantes:

    indicator "Caps Lock" {
        allowExplicit;
        whichModState= locked;
        modifiers= Lock;
    };
    indicator "Num Lock" {
        allowExplicit;
        whichModState= locked;
        modifiers= NumLock;
    };
    
  3. Cargar el nuevo archivo

    xkbcomp myconf.xkb $DISPLAY
    

Ahora debería funcionar encender y apagar los LED xset. Según el informe de error, no podrá apagar los LED cuando se supone que deben estar encendidos (por ejemplo, si CapsLock está habilitado).

Respuesta2

Usandosed

$ sudo sed -i 's|\!allowExplicit|allowExplicit|g' /usr/share/X11/xkb/compat/ledcaps

Después de cerrar sesión y volver a iniciarla, el Caps LockLED ahora se puede controlar sin ningún rootprivilegio usando los comandos:

$ xset led named 'Caps Lock'
$ xset -led named 'Caps Lock'

Respuesta3

Una combinación del enfoque sin raíz de @Gilles con la idea de automatización total de @Serge_Stroobandt.

Para permitir el control de laBloq Mayús,Num lockyBloqueo de mayúsculasLED:

#!/bin/bash
# Enables to control keyboard LEDs that are not available for control by default
xkbcomp $DISPLAY /tmp/my_conf.xkb
cat /tmp/my_conf.xkb | awk -e '
    BEGIN {
        change = 0
    }

    {
        if (change == 1) {
            if ($1 == "!allowExplicit;") {
                gsub("!", "", $0)
            }
            change = 0
        }
        print $0

    }

    /indicator "Caps Lock"/ {
        change = 1
    }
    /indicator "Num Lock"/ {
        change = 1
    }
    /indicator "Shift Lock"/ {
        change = 1
    }
    ' > /tmp/my_conf_modified.xkb
xkbcomp /tmp/my_conf_modified.xkb $DISPLAY

Para encender y apagar un LED:

# Turns the LED on
xset led named 'Caps Lock'

# wait 1s
sleep 1

# Resets the LED to the actual state,
# so it might still be on, if Caps Lock is activated.
xset -led named 'Caps Lock'

información relacionada