Estou tentando forçar o capslock aceso. xset
não funciona para mim, então estou tentando usar o setleds
.
Em um console gráfico, este comando retorna:
> LANG=C setleds -L +caps
KDGKBLED: Inappropriate ioctl for device
Error reading current flags setting. Maybe you are not on the console?
Em um terminal virtual funciona, porém o efeito é local para esse terminal virtual. Pelo que entendi, correndo
> setleds -L +caps < /dev/tty1
de um terminal virtual (meu servidor X está em tty1) deve funcionar. No entanto, isso requer acesso root.
Existe uma maneira de enviar um comando para o console subjacente a um servidor X, seja do referido xserver ou de outro VT, sem root?
Editar: por sugestão de Mark Plotnik e com base no código encontradoaqui, escrevi e compilei o seguinte:
#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;
}
Pelo que Gilles escreveu xset
, eu não esperava que funcionasse, mas funciona... em certo sentido: define o led, mas também define o status do capslock. Não entendi completamente todo o código acima, então posso ter cometido um erro bobo. Aparentemente, a linha XChangeKeyboardControl...
não altera o comportamento do programa, e XkbLockModifiers
é o que define o status do led e do capslock.
Responder1
Em princípio, você deveria ser capaz de fazer isso com o venerávelxset
comando.
xset led named 'Caps Lock'
ou xset led 4
para definir o LED número 4, se o seu sistema não reconhecer os LEDs pelo nome.
No entanto, isso não parece funcionar de forma confiável. Na minha máquina, só posso configurar o Scroll Lock desta forma eEu não sou o único. Esseparece ser uma questão de configuração do XKB.
A seguinte solução alternativa no nível do usuário deve funcionar (na maior parte):
Extraia sua configuração atual do xkb:
xkbcomp $DISPLAY myconf.xkb
Edite o arquivo
myconf.xkb
, substituindo!allowExplicit
porallowExplicit
nos blocos relevantes:indicator "Caps Lock" { allowExplicit; whichModState= locked; modifiers= Lock; }; indicator "Num Lock" { allowExplicit; whichModState= locked; modifiers= NumLock; };
Carregue o novo arquivo
xkbcomp myconf.xkb $DISPLAY
Agora ligar e desligar os leds xset
deve funcionar. De acordo com o relatório de bug, você não poderá desligar os leds quando eles deveriam estar ligados (por exemplo, se o CapsLock estiver ativado).
Responder2
Usandosed
$ sudo sed -i 's|\!allowExplicit|allowExplicit|g' /usr/share/X11/xkb/compat/ledcaps
Após efetuar logout e login novamente, o Caps LockLED agora pode ser controlado sem quaisquer root
privilégios usando os comandos:
$ xset led named 'Caps Lock'
$ xset -led named 'Caps Lock'
Responder3
Uma combinação da abordagem sem raiz de @Gilles com a ideia de automação total de @Serge_Stroobandt.
Para permitir o controle doCaps Lock,Num LockeBloqueio de mudançaLEDs:
#!/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 ligar e desligar um 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'