Como remover o atraso do caps lock no teclado de alumínio Apple MacBook Pro quando inicializado no Linux

32

O MacBook Pro da Apple tem um pequeno atraso na tecla Caps Lock . Ou seja, a tecla Caps Lock deve ser mantida pressionada um pouco mais do que o normal para registrar a pressão da tecla necessária para ativar a Caps Lock.

Isso é super chato. Alguém sabe como impedir que isso aconteça?

(Acima, copiado do stackoverflow , pois foi fechado lá como "off topic".)

Para aprofundar: A Apple considera isso um recurso, e o artigo da base de conhecimento não divulga como desativar esse atraso.

No entanto, tenho motivos para acreditar que é possível fazer isso.

Notavelmente, eu descobri que, pelo menos na minha experiência, se você remapear a tecla caps-lock no Mac OS X (em Preferências do sistema .. Teclado .. Teclas modificadoras) e, por exemplo, mapeá-la para Control, o atraso desaparecerá enquanto eu estiver conectado ao Mac OS X.

Meu problema é que o atraso permanece quando eu inicializo no Ubuntu Linux e, nesse contexto, mesmo quando eu remapeado a tecla Caps Lock para Control, o atraso ainda está presente.

Portanto, a pergunta é: como a Apple está desabilitando o atraso e, mais importante, como replicar isso que atua no contexto de uma instalação do Linux no topo do laptop?

Atualização: Há um encadeamento no superusuário que pode fornecer soluções alternativas. Ainda não tentei as sugestões lá (a saber: (1) ativar / desativar CapsLock-NoAction e (2) uma atualização de firmware). Não posso dizer pelo contexto desse segmento se as soluções alternativas foram testadas em uma instalação do Ubuntu.

pnkfelix
fonte
Eu nunca havia notado isso antes, mas já brinquei com o meu e posso entender o que você quer dizer. Se você tocar rapidamente na tecla caps lock, isso não fará nada. Eu nunca encontrei um problema antes, mas apenas tentei desativar / reativar o truque da tecla caps lock e tornou instantâneo! agora, não importa rapidamente, pressione a tecla que sempre alterna entre maiúsculas e minúsculas. Muito estranho!
precisa saber é o seguinte
Sempre pensei que estava enlouquecendo: p Posso ver seu benefício, mas em algumas situações isso realmente me irrita. Seria bom saber se é possível!
OrangeBox
De fato, o truque de desativar / reativar o caps lock (no lado do Mac OS X) parece fazer com que o problema desapareça depois que um reinicia posteriormente no Linux. Mas não está claro para mim se o efeito é permanente - deixei minha máquina desligada por algum tempo (semanas ou talvez mais de um mês), e quando a inicializei diretamente no Linux nesta manhã, parecia que o atraso havia retornado. Ainda bastante misterioso para mim.
Pnkfelix 28/04
Então, só para verificar, não parece haver uma correção para o Linux para esse problema?
Mike HR
1
Aqui está uma correção que funciona para o macOS e pode ser executada no macOS.
fel1x 22/02

Respostas:

22

Eu descobri como fazer isso. Em resumo, você deve enviar um "Relatório de recursos" que consiste nos bytes 0x9, 0x0, 0x0, 0x0para o dispositivo hidraw apropriado como raiz.

Você pode encontrar o dispositivo hidraw correto com este comando:

dmesg | grep Apple | grep Keyboard | grep input0 | tail -1 | sed -e 's/.*hidraw\([[:digit:]]\+\).*/\/dev\/hidraw\1/'

O código para enviar o pacote de controle mágico está abaixo. Compila com o gcc, usa o dispositivo hidraw como parâmetro. Portanto, todo o fluxo é:

  1. salve o código abaixo como disable-capslock-delay.c
  2. gcc -o disable-capslock-delay disable-capslock-delay.c
  3. HIDDEVICE=$(dmesg | grep Apple | grep Keyboard | grep input0 | tail -1 | sed -e 's/.*hidraw\([[:digit:]]\+\).*/\/dev\/hidraw\1/')
  4. sudo ./disable-capslock-delay $HIDDEVICE

As etapas 3 e 4 devem ser executadas sempre que você reiniciar (ou desconecte e reconecte o teclado); você pode colocá-los no /etc/rc.local(ou o equivalente da sua distribuição) para executá-los na inicialização (não é necessário sudonesse caso; e você pode mover o binário compilado para /usr/local/sbin/algo assim).

Fiz algumas verificações de segurança quanto ao ID do fornecedor, ID do dispositivo e comprimento do descritor do relatório. Pode ser necessário alterar os dois últimos se o modelo for diferente do meu.


#include <linux/hidraw.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv) { if (argc != 2 || strcmp(argv[1], "-h") == 0) { printf("Pass a hidraw device as the first and only parameter!\n"); printf("You may find the right device with:\n"); printf(" dmesg | grep Apple | grep Keyboard | grep input0 | tail -1 | " "sed -e 's/.hidraw\([[:digit:]]\+\)./\/dev\/hidraw\1/'\n"); return 1; } int fd, i, res, desc_size = 0; char buf[256]; struct hidraw_devinfo info; char *device = argv[1]; fd = open(device, O_RDWR | O_NONBLOCK); if (fd < 0) { perror("Unable to open device"); return 1; } memset(&info, 0, sizeof(info)); memset(buf, 0, sizeof(buf)); // Get Report Descriptor Size res = ioctl(fd, HIDIOCGRDESCSIZE, &desc_size); if (res < 0) { perror("HIDIOCGRDESCSIZE"); } if (desc_size != 75) { printf("Error: unexpected descriptor size %d; you've probably got " "the wrong hidraw device!\n", desc_size); return 1; } // Get Raw Info res = ioctl(fd, HIDIOCGRAWINFO, &info); if (res < 0) { perror("HIDIOCGRAWINFO"); } else { if (info.vendor != 0x05ac) { printf("Error: Wrong vendor ID, make sure you got the right " "hidraw device!\n"); return 1; } if (info.product != 0x0250) { printf("Warning: Unknown product ID 0x%x!\n", info.product); } } // Get Feature buf[0] = 0x09; // Report Number res = ioctl(fd, HIDIOCGFEATURE(256), buf); if (res < 0) { perror("HIDIOCGFEATURE"); } else { printf("HID Feature Report (before change):\n\t"); for (i = 0; i < res; i++) printf("%hhx ", buf[i]); puts("\n"); } // Set Feature buf[0] = 0x09; // Report Number buf[1] = 0x00; // Report data buf[2] = 0x00; // padding buf[3] = 0x00; // padding res = ioctl(fd, HIDIOCSFEATURE(4), buf); if (res < 0) { perror("HIDIOCSFEATURE"); } else { printf("Caps lock delay disabled.\n"); } // Get Feature buf[0] = 0x09; // Report Number res = ioctl(fd, HIDIOCGFEATURE(256), buf); if (res < 0) { perror("HIDIOCGFEATURE"); } else { printf("HID Feature Report (after change):\n\t"); for (i = 0; i < res; i++) printf("%hhx ", buf[i]); puts("\n"); } close(fd); return 0; }

jmrk
fonte
2
Parece ótimo, obrigado! por interesse, como você achou isso (os bytes mágicos necessários para o envio)?
Mike HR
6
@ MikeH-R: Passei um dia aprendendo como o protocolo HID funciona: essencialmente, os dispositivos descrevem quais pacotes de dados ("relatórios") eles entendem. Infelizmente, o teclado da Apple não menciona o relatório em questão em seus descritores HID. No entanto, encontrei um despejo dos descritores HID de um teclado interno do MacBook que alguém havia postado que continha a descrição correta do relatório, e simplesmente tentei isso e descobri que ele também funciona para o teclado com fio externo.
jmrk
Oh uau, eu tenho que tentar isso!
Pnkfelix
(Eu não parecem ter diferentes tamanhos descritor, no mínimo Ainda vou ajustá-los e ver como ele funciona..)
pnkfelix
Aceito esta resposta porque ela é a mais próxima de realmente reconhecer o problema, conforme descrito, e fornecer uma solução confiável (mesmo que, no meu caso, os tamanhos dos descritores sejam diferentes).
Pnkfelix
13

Aqui está a correção para o macOS Sierra.

Vá para Preferências do Sistema > Acessibilidade

Quando a janela de acessibilidade estiver aberta - à esquerda da janela - clique em Teclado

Depois, haverá as 2 opções - para teclas fixas e para teclas lentas - clique na caixa ao lado de teclas lentas para ativá-lo - clique no Options...botão - uma nova janela será exibida com um controle deslizante para alterar o atraso de aceitação - por padrão isso está no meio. Deslize o botão totalmente para a esquerda, para que seja o menor tempo possível.

Agora deve ser consertado. Não experimentei para ver se a correção permanece após a reinicialização, mas espero que seja.

michelle
fonte
I ficou animado por um segundo, mas quando eu fui olhar aqui, teclas lentas não foi ativado por isso só funciona para pessoas que usam as teclas lentas :( um dia eu vou ter meus limites preciosos bloquear volta chave!
Bradley
4
Isso reduz um pouco, mas ainda é mais lento ativar o caps lock do que desligar. Além disso, a taxa de repetição de teclas diminui para um rastreamento, mesmo que a configuração esteja mais rápida. (Sierra 10.12.6)
scipilot
1
essa não é uma solução adequada para o problema em questão, pois diminui a velocidade do keyrepat e você não pode mais excluir itens adequadamente ao manter o backspace.
Denialos
7

EDIT: esta parece ser uma pergunta popular de pouso para usuários que desejam remover o atraso na tecla caps lock no OS X. A partir do OS X Mojave,

Vá para Preferências do Sistema; Acessibilidade; Teclado; ative as teclas lentas e entre em opções; reduza o atraso para o mínimo. O único efeito colateral indesejado que notei até agora é a ação lenta do backspace ao pressioná-lo. Geralmente eu uso CMD + A / CMD + SHIFT + L / R / CMD + SHIFT + CTRL + L / R de qualquer maneira, portanto não é um grande problema.

A partir de El Capitan e anteriores,

A solução é bastante ilusória e você realmente não saberia que a removeu, a menos que estivesse especificamente tentando se livrar dela em primeiro lugar. O jeito que eu vou lhe mostrar é apenas para a versão mais recente (atual) do OSX, Yosemite. No entanto, você pode aplicar esse método absolutamente a versões anteriores e futuras.

A solução é simples. Se você navegar para o teclado nas preferências do sistema, através do logotipo da apple no canto superior esquerdo, chegará a esta tela! [Insira a descrição da imagem aqui] [1]

[1]: http://i.stack.imgur.com/DIbZD.png

Se você clicar no botão das teclas modificadoras, poderá alterar a função de cada uma das teclas programáveis. Tudo o que você precisa fazer é definir a tecla caps lock para nenhuma ação e pressionar ok para retornar ao menu do teclado. Uma vez feito, volte para as teclas modificadoras e mude a tecla caps lock novamente para caps lock e isso removerá o atraso! Observe que essa correção permanece no local até você dormir, reiniciar ou desligar o dispositivo. Nesse momento, o atraso é restabelecido.

São correções estranhas, e isso levanta a questão: por que elas não fornecem uma opção para remover o atraso quando essa correção é puramente baseada em software? Mas ei, pelo menos há um caminho!

Feliz virada.

Bradley
fonte
Como isso resolve meu problema no Linux?
Pnkfelix 20/05
Para ser mais claro: a pergunta original dizia: "... o atraso desaparece enquanto eu estiver logado no Mac OS X. Meu problema é que o atraso permanece quando eu inicializo o Ubuntu Linux e, nesse contexto, mesmo quando eu remapeado o Caps Lock para Control, o atraso ainda está presente. "
Pnkfelix 20/05
Ah! Entendo, eu deveria ler as perguntas do OP com mais cuidado. Descobri no OSX que desassociar completamente a tecla caps e rebobinar resolviam o problema. Talvez o atraso permaneça porque você está vinculando ao controle? Vale a pena tentar tudo, se você ainda não tem um em torno do trabalho :)
Bradley
1
Essa abordagem não teve nenhum efeito para mim. (Sierra 10.12.6)
scipilot
3

Vá para preferências do sistema> acessibilidade> teclado> habilite teclas lentas> altere o atraso da aceitação até a esquerda (curta)! Isso funcionou para mim.

Thomas Carl-Erik Jönsson
fonte
Você está descrevendo uma etapa no Mac OS X? Como isso resolve o problema no Ubuntu Linux, conforme descrito na pergunta?
Pnkfelix
Sim, correto. Eu não sei o Ubuntu Linux, desculpe. Acho que estou resolvendo o título principal "Como remover o atraso do caps lock no teclado de alumínio Apple MacBook Pro *" e talvez a pergunta "Como a Apple está desabilitando o atraso". :-) Atenciosamente Thomas, Suécia * Essa pergunta é a razão que eu encontrei e ler este piso e nada ajudou, então eu resolvi me: P
Thomas Carl-Erik Jönsson
2
Conforme a resposta de Michelle: Isso reduz um pouco, mas ainda é mais lento ativar o caps lock do que desligar. Além disso, a taxa de repetição de teclas diminui para um rastreamento, mesmo que a configuração esteja mais rápida. (Sierra 10.12.6)
scipilot
2

Sei com certeza que o atraso do caps lock é um recurso do firmware no próprio teclado - para que você possa ter certeza de que o tempo de atraso ocorre, independentemente do sistema operacional em que o teclado está operando no momento.

Sei também que a Apple não oferece um caminho para atualizar o firmware para um nível inferior; portanto, todos teremos que esperar até que alguém com experiência de hardware suficiente faça o blog das ferramentas e etapas que eles executaram para induzir o hardware a carregar o firmware mais antigo (ou fornecer o que parece ser um firmware mais recente que regride o atraso para como ele funcionava antes sem nenhum atraso.)

Peço desculpas pela não resposta, mas o caminho para isso é bem iluminado e pode ajudar outras pessoas a agir (selecionando um teclado mais antigo - ou evitando atualizar o firmware) enquanto isso, enquanto esperamos por uma solução real para implementar um temporizador curto ou nenhum na tecla caps lock.

bmike
fonte
2
Um detalhe sobre o qual estou confuso em sua resposta: você está dizendo que é falso que, quando alguém remapeia a tecla caps-lock no Mac OS X, o atraso diminui? (Não sei de que outra forma interpretar sua afirmação "o tempo de atraso acontece, independentemente do SO que o teclado esteja executando no momento"; mas isso contradiz minha experiência direta - a menos que a Apple esteja usando alguma API não documentada no firmware para ajustar o tempo)?
pnkfelix
Eu tenho o meu remapeado para ESC e a espera um pouco mais longa ainda é necessária. Eu fiz isso usando um aplicativo de terceiros chamado Seil, no entanto, e não através de nenhuma funcionalidade incorporada ao OSX. Irritante, com certeza - seus desenvolvedores não usam o Vim? Nossa.
intuited
0

A solução "ativar / desativar o CapsLock-NoAction" ao qual o OP se refere funciona tanto no teclado Mac com fio quanto no teclado do MacBookPro. Bradley diz que isso só funciona em Yosemite, mas eu o usei com sucesso no Snow Leopard (10.6.8) e Mavericks (10.9.5). Também testei isso dentro de uma VM Kubuntu e o Caps Lock continuou funcionando corretamente dentro da VM.

  • Abra a Preferência do sistema de teclado e clique em Modifier Keys...:

insira a descrição da imagem aqui

  • Defina a tecla Caps Lock como No Actione clique em OK:

                    insira a descrição da imagem aqui

  • Clique Modifier Keys...novamente e defina a tecla Caps Lock como Caps Locke clique em OK:

                    insira a descrição da imagem aqui

Isso permanece em vigor até a próxima reinicialização.

Neil Steiner
fonte
1
Isso não teve efeito para mim. (Teclado Sierra 10.12.6, Mac USB e interna sobre MBPro)
scipilot