J'essaie de forcer le verrouillage des majuscules. xset
ne fonctionne pas pour moi, donc j'essaie d'utiliser setleds
.
Dans une console graphique, cette commande renvoie:
> LANG=C setleds -L +caps
KDGKBLED: Inappropriate ioctl for device
Error reading current flags setting. Maybe you are not on the console?
Dans un terminal virtuel, cela fonctionne, mais l'effet est local sur ce terminal virtuel. D'après ce que je comprends, courir
> setleds -L +caps < /dev/tty1
à partir d'un terminal virtuel (mon serveur X est assis sur tty1) devrait fonctionner. Cependant, cela nécessite un accès root.
Existe-t-il un moyen d'envoyer une commande à la console sous-jacente à un serveur X, que ce soit à partir dudit serveur x ou d'un autre VT, sans root?
Edit: D'après une suggestion de Mark Plotnik, et basé sur le code trouvé ici , j'ai écrit et compilé ce qui suit:
#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;
}
D'après ce que Gilles a écrit xset
, je ne m'attendais pas à ce que cela fonctionne, mais ça le fait ... dans un certain sens: cela définit la LED, mais cela définit également le statut de verrouillage. Je ne comprends pas bien tout le code ci-dessus, donc j'ai peut-être fait une erreur stupide. Apparemment, la ligne XChangeKeyboardControl...
ne change pas le comportement du programme, et XkbLockModifiers
c'est ce qui définit le statut de la led et du capslock.
xdotool key Caps_Lock
partir d'un client X autorisé, bien que cela active le verrouillage des majuscules.xterm
source et il utilise un appel à XChangeKeyboardControl () pour définir ou désactiver les LED sans affecter l'état du verrouillage des majuscules, etc. Donc, si vous pouvez compiler du code C, c'est une approche.xterm
les leds? Cela semble être une bonne idée, je vais modifier la question avec mes résultats.xterm
allumer la LED ScrollLock en envoyant la séquence d'échappement ESC [3 q, selon le fichierctlseqs.txt
fourni avec la source, mais je n'ai pas pu allumer les LED Num ou CapsLock avec les paramètres 1 et 2. Peut-être que je dois faire la configuration XKB mentionnée dans la réponse.xterm
appelsXChangeKeyboardControl
àxtermShowLED
etxtermClearLEDs
, mais ne remet pasXkbLockModifiers
nulle part.Réponses:
En principe, vous devriez pouvoir le faire avec la
xset
commande venerable .ou
xset led 4
pour définir le numéro de LED 4, si votre système ne reconnaît pas les LED par leur nom.Cependant, cela ne semble pas fonctionner de manière fiable. Sur ma machine, je ne peux que définir le verrouillage du défilement de cette façon, et je ne suis pas le seul . Cela semble être une question de configuration XKB .
La solution de contournement suivante au niveau de l'utilisateur devrait fonctionner (pour la plupart):
Extrayez votre configuration xkb actuelle:
Modifiez le fichier
myconf.xkb
en le remplaçant!allowExplicit
parallowExplicit
dans les blocs appropriés:Chargez le nouveau fichier
Maintenant, allumer et éteindre les leds
xset
devrait fonctionner. Selon le rapport de bogue, vous ne pourrez pas éteindre les voyants lorsqu'ils sont censés être allumés (par exemple si CapsLock est activé).la source
xset
avant, et en effet ça ne marche pas. Je n'avais cependant pas vu ce rapport de bogue. Quoi qu'il en soit, "Status: Resolved Wontfix" n'est pas vraiment encourageant ... La solution deallowExplicit
contournement fonctionnerait probablement pour moi (je n'ai pas besoin d'éteindre le voyant), mais le changer nécessite toujours root.xkbcomp
à tout moment. Je ne connais pas suffisamment XKB pour vous dire exactement ce que vous devez changer (définir un aspect spécifique plutôt qu'une carte complète prédéfinie avec XKB est un peu pénible ), mais unix.stackexchange.com/questions/166844/mapping -key-bindings /… devrait avoir quelques pointeurs.xkbcomp $DISPLAY output.xkb
:, puis en remplaçant!allowExplicit
parallowExplicit
dans laindicator "Caps Lock"
section, puis en rechargeant le fichier avecxkbcomp output.xkb
. Il y a beaucoup d'avertissements et xset ne fonctionne pas mieux par la suite. Je vais en lire plus sur xkb./usr/share/X11/xkb/compat/ledcaps
et ... / lednum et cela l'a rendu permanent.En utilisant
sed
Après vous être déconnecté et reconnecté, la Caps LockLED peut maintenant être contrôlée sans aucun
root
privilège à l'aide des commandes:la source
sudo
puis plus jamais. Pour comprendre pourquoi cela peut être si important pour certains utilisateurs, consultez cettevim
application .sed
ligne.Une combinaison de l'approche sans racine de @Gilles avec l'idée d'une automatisation complète par @Serge_Stroobandt.
Pour activer le contrôle des voyants Lock Lock , Num Lock et Shift Lock :
Pour allumer et éteindre une LED:
la source