Estou tentando forçar o capslock liderado. xset
não funciona para mim, então estou tentando usar 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, ele funciona, no entanto, o efeito é local para esse terminal virtual. Pelo que entendi, correndo
> setleds -L +caps < /dev/tty1
de um terminal virtual (meu servidor X está no 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 raiz?
Edit: A partir de uma sugestão de Mark Plotnik, e com base no código encontrado aqui , 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. Como não entendo completamente todo o código acima, 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.
xdotool key Caps_Lock
um cliente X autorizado, embora isso realmente ative o caps lock.xterm
fonte e ela usa uma chamada para XChangeKeyboardControl () para definir ou desabilitar os LEDs sem afetar o estado do caps lock etc. Portanto, se você pode compilar o código C, essa é uma abordagem.xterm
os leds? Parece uma boa ideia, editarei a pergunta com meus resultados.xterm
acendi o LED ScrollLock enviando a seqüência de escape ESC [3 q, conforme o arquivoctlseqs.txt
que acompanha a fonte, mas não consegui que os LEDs Num ou CapsLock acendessem com os parâmetros 1 e 2. Talvez eu precise faça a configuração XKB mencionada na resposta.xterm
chamadasXChangeKeyboardControl
emxtermShowLED
extermClearLEDs
, mas não chamaXkbLockModifiers
a lugar nenhum.Respostas:
Em princípio, você deve conseguir fazê-lo com o venerável
xset
comando.ou
xset led 4
para definir o número 4 do LED, se o seu sistema não reconhecer os LEDs pelo nome.No entanto, isso não parece funcionar de maneira confiável. Na minha máquina, só posso definir o Scroll Lock dessa maneira e não sou o único . Isso parece 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:
Edite o arquivo
myconf.xkb
, substituindo!allowExplicit
porallowExplicit
nos blocos relevantes:Carregue o novo arquivo
Agora, ativar e desativar os leds
xset
deve funcionar. De acordo com o relatório de erros, você não poderá desativar os leds quando eles devem estar ligados (por exemplo, se o CapsLock estiver ativado).fonte
xset
antes, e de fato não funciona. Eu ainda não tinha visto este relatório de bug. Enfim, "Status: Resolvido Wontfix" não é realmente encorajador ... A solução alternativaallowExplicit
provavelmente funcionaria para mim (não preciso desligar o led), mas alterá-lo ainda requer raiz.xkbcomp
a qualquer momento. Não estou familiarizado o suficiente com o XKB para dizer exatamente o que você precisa alterar (definir um aspecto específico em vez de um mapa predefinido completo com o XKB é um pouco trabalhoso), mas unix.stackexchange.com/questions/166844/mapping -key-bindings /… deve ter alguns ponteiros.xkbcomp $DISPLAY output.xkb
:, substituindo!allowExplicit
porallowExplicit
naindicator "Caps Lock"
seção e recarregando o arquivo porxkbcomp output.xkb
. Existem muitos avisos e o xset não funciona melhor depois. Vou ler um pouco mais sobre o xkb./usr/share/X11/xkb/compat/ledcaps
e ... / lednum e isso o tornou permanente.Usando
sed
Após o logoff e logon novamente, o Caps LockLED agora pode ser controlado sem
root
privilégios usando os comandos:fonte
sudo
e nunca mais. Para entender por que isso pode ser tão importante para determinados usuários, consulte estevim
aplicativo .sed
dela uma frase única.Uma combinação da abordagem sem raiz do @Gilles com a idéia de automação completa do @Serge_Stroobandt.
Para ativar o controle dos LEDs Caps Lock , Num Lock e Shift Lock :
Para ligar e desligar um LED:
fonte