Ich versuche, die geöffnete Feststelltaste zu erzwingen. xset
funktioniert bei mir nicht, also versuche ich es zu benutzen 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, der Effekt ist jedoch lokal für dieses virtuelle Terminal. Soweit ich weiß, läuft
> setleds -L +caps < /dev/tty1
von einem virtuellen Terminal (mein X-Server sitzt auf tty1) sollte funktionieren. Dies erfordert jedoch Root-Zugriff.
Gibt es eine Möglichkeit, einen Befehl an die Konsole zu senden, die einem X-Server zugrunde liegt, sei es vom X-Server oder von einem anderen VT ohne Root?
Bearbeiten: Auf Vorschlag von Mark Plotnik und basierend auf dem hier gefundenen Code habe ich Folgendes geschrieben und kompiliert:
#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, worüber Gilles schrieb xset
, hatte ich nicht erwartet, dass es funktioniert, aber es funktioniert ... in gewissem Sinne: Es setzt die LED, aber es setzt auch den Capslock-Status. Ich verstehe den obigen Code nicht vollständig, daher habe ich möglicherweise einen dummen Fehler gemacht. Anscheinend XChangeKeyboardControl...
ändert die Zeile das Verhalten des Programms nicht und XkbLockModifiers
setzt den LED- und den Capslock-Status.
xdotool key Caps_Lock
von einem autorisierten X-Client aus tun , obwohl dadurch die Feststelltaste aktiviert wird.xterm
Quelle angesehen und sie verwendet einen Aufruf von XChangeKeyboardControl () , um die LEDs zu setzen oder zu deaktivieren, ohne den Status der Feststelltaste usw. zu beeinflussen. Wenn Sie also C-Code kompilieren können, ist dies ein Ansatz.xterm
Beeinflusst die LEDs? Es klingt nach einer guten Idee, ich werde die Frage mit meinen Ergebnissen bearbeiten.xterm
musste die ScrollLock-LED durch Senden der Escape-Sequenz ESC [3 q gemäß derctlseqs.txt
mit der Quelle gelieferten Datei aufleuchten lassen, konnte aber die Num- oder CapsLock-LEDs nicht mit den Parametern 1 und 2 aufleuchten lassen. Vielleicht muss ich Führen Sie die in der Antwort angegebene XKB-Konfiguration durch.xterm
ruftXChangeKeyboardControl
anxtermShowLED
undxtermClearLEDs
, ruft aberXkbLockModifiers
nirgendwo an.Antworten:
Im Prinzip sollten Sie dies mit dem ehrwürdigen
xset
Befehl tun können .oder
xset led 4
um LED Nummer 4 einzustellen, wenn Ihr System die LEDs nicht anhand des Namens erkennt.Dies scheint jedoch nicht zuverlässig zu funktionieren. Auf meinem Computer kann ich die Bildlaufsperre nur auf diese Weise einstellen, und ich bin nicht der einzige . Dies scheint eine Frage der XKB-Konfiguration zu sein .
Die folgende Problemumgehung auf Benutzerebene sollte (größtenteils) funktionieren:
Extrahieren Sie Ihre aktuelle xkb-Konfiguration:
Bearbeiten Sie die Datei
myconf.xkb
, ersetzt!allowExplicit
mitallowExplicit
in den entsprechenden Blöcken:Laden Sie die neue Datei
Jetzt die LEDs mit ein- und ausschalten
xset
funktionieren. Laut Fehlerbericht können Sie die LEDs nicht ausschalten, wenn sie eingeschaltet sein sollen (z. B. wenn CapsLock aktiviert ist).quelle
xset
, und tatsächlich funktioniert es nicht. Ich hatte diesen Fehlerbericht jedoch nicht gesehen. Wie auch immer, "Status: Resolved Wontfix" ist nicht wirklich ermutigend ... Die ProblemumgehungallowExplicit
würde wahrscheinlich für mich funktionieren (ich muss die LED nicht ausschalten), aber das Ändern erfordert immer noch root.xkbcomp
jederzeit anrufen . Ich bin mit XKB nicht vertraut genug, um Ihnen genau zu sagen, was Sie ändern müssen (das Festlegen eines bestimmten Aspekts anstelle einer vollständig vordefinierten Map mit XKB ist etwas mühsam ), aber unix.stackexchange.com/questions/166844/mapping -key-bindings /… sollte ein paar Zeiger haben.xkbcomp $DISPLAY output.xkb
dann!allowExplicit
durchallowExplicit
imindicator "Caps Lock"
Abschnitt zu ersetzen und dann die Datei mit neu zu ladenxkbcomp output.xkb
. Es gibt viele Warnungen und xset funktioniert danach nicht mehr besser. Ich werde mehr über xkb lesen./usr/share/X11/xkb/compat/ledcaps
und ... / lednum gemacht und das hat es dauerhaft gemacht.Verwenden von
sed
Nach dem Abmelden und erneuten Anmelden kann die Caps LockLED nun ohne
root
Berechtigungen mit den folgenden Befehlen gesteuert werden:quelle
sudo
und dann nie wieder. In dieservim
Anwendung erfahren Sie, warum dies für bestimmte Benutzer so wichtig sein kann .sed
Einzeiler.Eine Kombination des wurzellosen Ansatzes von @Gilles mit der Idee der vollständigen Automatisierung von @Serge_Stroobandt.
So aktivieren Sie die Steuerung der LEDs Caps Lock , Num Lock und Shift Lock :
So schalten Sie eine LED ein und aus:
quelle