Verwenden vonsed

Verwenden vonsed

Ich versuche, die Feststelltaste-LED einzuschalten. xsetDas funktioniert bei mir nicht, also versuche ich, zu verwenden setleds.

In einer grafischen Konsole gibt dieser Befehl Folgendes zurück:

> LANG=C setleds -L +caps
KDGKBLED: Inappropriate ioctl for device
Error reading current flags setting. Maybe you are not on the console?

In einem virtuellen Terminal funktioniert es, allerdings ist der Effekt lokal auf dieses virtuelle Terminal beschränkt. Soweit ich weiß, läuft

> setleds -L +caps < /dev/tty1

von einem virtuellen Terminal aus (mein X-Server sitzt auf tty1) sollte funktionieren. Dies erfordert jedoch Root-Zugriff.

Gibt es eine Möglichkeit, ohne Root einen Befehl an die Konsole zu senden, die einem X-Server zugrunde liegt, sei es vom besagten X-Server oder von einem anderen VT?

Bearbeiten: Aus einem Vorschlag von Mark Plotnik und basierend auf gefundenem CodeHierhabe ich Folgendes geschrieben und zusammengestellt:

#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;
}

Nach dem, was Gilles darüber geschrieben hat xset, hätte ich nicht erwartet, dass es funktioniert, aber es funktioniert... in gewisser Weise: Es setzt die LED, aber auch den Feststelltaste-Status. Ich verstehe den obigen Code nicht ganz, also habe ich vielleicht einen dummen Fehler gemacht. Anscheinend XChangeKeyboardControl...ändert die Zeile das Verhalten des Programms nicht und XkbLockModifierssetzt die LED und den Feststelltaste-Status.

Antwort1

Im Prinzip sollte man es mit dem ehrwürdigenxsetBefehl.

xset led named 'Caps Lock'

oder xset led 4um die LED Nummer 4 einzustellen, wenn Ihr System die LEDs nicht anhand der Namen erkennt.

Dies scheint jedoch nicht zuverlässig zu funktionieren. Auf meinem Computer kann ich die Rollen-Taste nur auf diese Weise einstellen, undIch bin nicht der einzige. Dasscheint eine Frage der XKB-Konfiguration zu sein.

Die folgende Problemumgehung auf Benutzerebene sollte (größtenteils) funktionieren:

  1. Extrahieren Sie Ihre aktuelle xkb-Konfiguration:

    xkbcomp $DISPLAY myconf.xkb
    
  2. Bearbeiten Sie die Datei myconf.xkbund ersetzen Sie sie in den entsprechenden Blöcken !allowExplicitdurch :allowExplicit

    indicator "Caps Lock" {
        allowExplicit;
        whichModState= locked;
        modifiers= Lock;
    };
    indicator "Num Lock" {
        allowExplicit;
        whichModState= locked;
        modifiers= NumLock;
    };
    
  3. Laden Sie die neue Datei

    xkbcomp myconf.xkb $DISPLAY
    

Jetzt sollte das Ein- und Ausschalten der LEDs xsetfunktionieren. Laut Fehlerbericht können Sie die LEDs nicht ausschalten, wenn sie eingeschaltet sein sollen (z. B. wenn die Feststelltaste aktiviert ist).

Antwort2

Verwenden vonsed

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

Nach dem Ab- und erneuten Anmelden kann die LED nun ohne Berechtigungen mit den folgenden Befehlen Caps Lockgesteuert werden :root

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

Antwort3

Eine Kombination des Root-losen Ansatzes von @Gilles mit der Idee der vollständigen Automatisierung von @Serge_Stroobandt.

Zur Steuerung derFeststelltaste,Num LockUndUmschaltsperreLEDs:

#!/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

So schalten Sie eine LED ein und aus:

# 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'

verwandte Informationen