Ich versuche, die Feststelltaste-LED einzuschalten. xset
Das 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 XkbLockModifiers
setzt die LED und den Feststelltaste-Status.
Antwort1
Im Prinzip sollte man es mit dem ehrwürdigenxset
Befehl.
xset led named 'Caps Lock'
oder xset led 4
um 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:
Extrahieren Sie Ihre aktuelle xkb-Konfiguration:
xkbcomp $DISPLAY myconf.xkb
Bearbeiten Sie die Datei
myconf.xkb
und ersetzen Sie sie in den entsprechenden Blöcken!allowExplicit
durch :allowExplicit
indicator "Caps Lock" { allowExplicit; whichModState= locked; modifiers= Lock; }; indicator "Num Lock" { allowExplicit; whichModState= locked; modifiers= NumLock; };
Laden Sie die neue Datei
xkbcomp myconf.xkb $DISPLAY
Jetzt sollte das Ein- und Ausschalten der LEDs xset
funktionieren. 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'