Come rimuovere il ritardo di blocco maiuscole sulla tastiera in alluminio Apple MacBook Pro all'avvio su Linux


32

Il MacBook Pro di Apple ha un leggero ritardo sul tasto BLOC MAIUSC . Cioè, il tasto BLOC MAIUSC deve essere tenuto leggermente più a lungo del normale per registrare la pressione del tasto richiesta per inserire il BLOC MAIUSC.

Questo è super fastidioso. Qualcuno sa come impedirlo?

(Sopra copiato da StackOverflow perché era chiuso lì come "fuori tema".)

Per approfondire: Apple ritiene che questa sia una funzionalità e il loro articolo della knowledge base non rivela come disabilitare questo ritardo.

Tuttavia, ho motivo di credere che sia possibile farlo.

In particolare, ho scoperto che, almeno nella mia esperienza, se si rimappa il tasto BLOC MAIUSC su Mac OS X (in Preferenze di Sistema .. Tastiera .. Tasti modificatori), e ad es. Si associa a Control, il ritardo scompare mentre sono connesso a Mac OS X.

Il mio problema è che il ritardo rimane quando avvio in Ubuntu Linux e in quel contesto, anche quando rimappo il tasto BLOC MAIUSC su Control, il ritardo è ancora presente.

Quindi, la domanda è: in che modo Apple sta disabilitando il ritardo e, cosa ancora più importante, come si può replicare quel comportamento nel contesto di un'installazione Linux in cima al laptop?

Aggiornamento: esiste un thread su superutente che può fornire soluzioni alternative. Non ho ancora provato i suggerimenti lì (vale a dire: (1) attivare / disattivare CapsLock-NoAction e (2) un aggiornamento del firmware). Non posso dire dal contesto di quel thread se le soluzioni alternative sono state testate su un'installazione Ubuntu.


Non l'ho mai notato prima d'ora, ma ho avuto un gioco con il mio e posso vedere cosa intendi. Se si tocca il tasto BLOC MAIUSC troppo rapidamente non fa nulla. Non ho mai trovato un problema prima, ma ho appena provato a disabilitare / riattivare il trucco del tasto BLOC MAIUSC e lo ha reso immediato! ora, non importa in fretta, premo il tasto, attiva sempre il blocco maiuscole. Molto strano!
tom1990

Ho sempre pensato che stavo solo impazzendo: p ne vedo i benefici, ma in alcune situazioni mi dà davvero fastidio. Sarebbe bello sapere se è possibile!
OrangeBox

In effetti, il trucco di disabilitazione / blocco delle maiuscole (sul lato di Mac OS X) sembra far scomparire il problema una volta che si riavvia successivamente su Linux. Ma non mi è chiaro se l'effetto è permanente - ho lasciato la macchina spenta per un po 'di tempo (settimane o forse anche più di un mese), e quando l'ho avviata direttamente su Linux questa mattina, sembrava che il il ritardo era tornato. Ancora abbastanza misterioso per me.
pnkfelix,

Quindi, solo per verificare, non sembra esserci una soluzione per Linux per questo problema?
Mike HR,

1
Ecco una correzione che funziona per macOS e può essere eseguita su macOS.
fel1x,

Risposte:


22

Ho capito come farlo. In breve, è necessario inviare un "Rapporto funzionalità" costituito dai byte 0x9, 0x0, 0x0, 0x0al dispositivo hidraw appropriato come root.

Puoi trovare il dispositivo hidraw giusto con questo comando:

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

Il codice per inviare il pacchetto di controllo magico è di seguito. Compila con gcc, prende il dispositivo hidraw come parametro. Quindi l'intero flusso è:

  1. salva il codice qui sotto come 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

I passaggi 3 e 4 devono essere eseguiti ogni volta che si riavvia (o scollegare e ricollegare la tastiera); puoi metterli in /etc/rc.local(o l'equivalente della tua distro) per eseguirli all'avvio (non è necessario sudoin quel caso; e potresti voler spostare il binario compilato in /usr/local/sbin/o qualcosa del genere).

Ho effettuato alcuni controlli di sicurezza per ID fornitore, ID dispositivo e lunghezza del descrittore del rapporto. Potrebbe essere necessario modificare gli ultimi due se il modello è diverso dal mio.


#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; }


2
Sembra fantastico, grazie! per interesse, come hai trovato questo (i byte magici necessari per essere inviati)?
Mike HR,

6
@ MikeH-R: ho passato una giornata a imparare come funziona il protocollo HID: in sostanza, i dispositivi descrivono quali pacchetti di dati ("report") comprendono. Purtroppo la tastiera Apple non menziona il rapporto in questione nei suoi descrittori HID. Tuttavia ho trovato un dump dei descrittori HID della tastiera interna di un MacBook che qualcuno aveva pubblicato che conteneva la giusta descrizione del rapporto, e l'ho semplicemente provato e ho scoperto che funziona anche per la tastiera cablata esterna.
jmrk,

Oh wow, devo provarlo!
pnkfelix,

(Mi sembra di avere dimensioni del descrittore diverse, almeno. Comunque le aggiusterò e vedrò come funziona.)
pnkfelix,

Accetterò questa risposta perché è il più vicino a riconoscere effettivamente il problema come descritto e fornire una soluzione credibile ad esso (anche se nel mio caso le dimensioni del descrittore sono diverse).
pnkfelix,

13

Ecco la correzione per macOS Sierra.

Vai a Preferenze di Sistema > Accessibilità

Quando la finestra di accessibilità è aperta, nella parte sinistra della finestra, fai clic su Tastiera

Quindi ci saranno le 2 opzioni - per i tasti permanenti e per i tasti lenti - fai clic sulla casella accanto ai tasti lenti per abilitarlo - quindi fai clic sul Options...pulsante - verrà visualizzata una nuova finestra con un dispositivo di scorrimento per modificare il ritardo di accettazione - per impostazione predefinita questo è nel mezzo. Fai scorrere il pulsante completamente a sinistra, in modo che sia il più breve tempo possibile.

Ora dovrebbe essere risolto. Non ho sperimentato per vedere se la correzione rimane al riavvio, ma spero che lo farà.


Mi sono emozionato per un secondo, ma quando sono andato a cercare qui, i tasti lenti non erano abilitati, quindi funziona solo per le persone che usano i tasti lenti :( un giorno avrò indietro il mio prezioso tasto di blocco maiuscole!
Bradley

4
Questo lo riduce un po ', ma è ancora più lento attivare il blocco maiuscole rispetto allo spegnimento. Inoltre, la frequenza di ripetizione dei tasti rallenta a una scansione, anche se l'impostazione è più veloce. (Sierra 10.12.6)
scipilota il

1
questa non è una soluzione adeguata al problema attuale poiché rallenta la ripetizione dei tasti e non è più possibile eliminare correttamente le cose quando si tiene il backspace.
Denialos,

7

EDIT: questa sembra essere una domanda di atterraggio popolare per gli utenti che desiderano rimuovere il ritardo sul tasto BLOC MAIUSC in OS X. A partire da OS X Mojave,

Vai a Preferenze di Sistema; Accessibilità; Tastiera; abilitare i tasti lenti e accedere alle opzioni; ridurre il ritardo al minimo. L'unico effetto collaterale indesiderato che ho notato finora è lenta azione di backspace quando lo si tiene premuto. In genere utilizzo CMD + A / CMD + MAIUSC + L / R / CMD + MAIUSC + CTRL + L / R, quindi non è un grosso problema.

A partire da El Capitan e precedenti,

La soluzione è piuttosto elusiva e non sapresti davvero di averla rimossa a meno che tu non stia cercando specificamente di sbarazzartene in primo luogo. Il modo in cui ti mostrerò è puramente per l'ultima (attuale) versione di OSX, Yosemite. Tuttavia, puoi assolutamente applicare questo metodo alle versioni precedenti e future.

La soluzione è semplice Se accedi a Tastiera nelle preferenze Sistema tramite il logo Apple nell'angolo in alto a sinistra, raggiungerai questa schermata! [Inserisci la descrizione dell'immagine qui] [1]

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

Se si fa clic sul pulsante dei tasti modificatori, è possibile modificare la funzione di ciascuno dei tasti programmabili. Tutto quello che devi fare è impostare il tasto BLOC MAIUSC su nessuna azione e premere OK per tornare al menu della tastiera. Una volta fatto, torna ai tasti modificatori e cambia il tasto BLOC MAIUSC in BLOC MAIUSC e questo rimuoverà il ritardo! Tieni presente che questa correzione rimane attiva finché non dormi, riavvia o spegni il dispositivo. A quel punto viene ripristinato il ritardo.

Sono strane correzioni e si pone la domanda perché non forniscono un'opzione per rimuovere il ritardo quando questa correzione è puramente basata su software. Ma ehi, almeno c'è un modo!

Felice tappatura.


In che modo questo risolve il mio problema in Linux?
pnkfelix,

Per essere più chiari: la domanda originale diceva: "... il ritardo scompare mentre sono connesso a Mac OS X. Il mio problema è che il ritardo rimane quando avvio in Ubuntu Linux e in quel contesto, anche quando rimappo Tasto Bloc Maiusc su Controllo, il ritardo è ancora presente. "
pnkfelix,

Ah! Vedo, suppongo che dovrei leggere le domande OP più attentamente. Ho scoperto su OSX che la non associazione completa della chiave maiuscola e la nuova associazione risolto il problema. Forse il ritardo rimane perché sei obbligato a controllare invece? Vale la pena provare tutto se non hai ancora un lavoro in giro :)
Bradley,

1
Questo approccio non ha avuto alcun effetto per me. (Sierra 10.12.6)
scipilota il

3

Vai a preferenze di sistema> accessibilità> tastiera> abilita tasti lenti> modifica ritardo accettazione fino a sinistra (breve)! Questo ha funzionato per me.


Stai descrivendo un passaggio in Mac OS X? In che modo questo risolve il problema in Ubuntu Linux, come descritto nella domanda?
pnkfelix,

Si corretto. Non conosco Ubuntu Linux, scusa. Penso di risolvere il titolo principale "Come rimuovere il ritardo del blocco maiuscole sulla tastiera in alluminio Apple MacBook Pro *" e forse la domanda "Come sta disabilitando il ritardo Apple". :-) I migliori saluti Thomas, Svezia * Questa domanda è il motivo per cui ho trovato e letto questo battistrada e niente mi ha aiutato, quindi l'ho risolto da solo: P
Thomas Carl-Erik Jönsson

2
Secondo la risposta di Michelle: questo lo riduce un po ', ma è ancora più lento attivare il blocco maiuscole che disattivarlo. Inoltre, la frequenza di ripetizione dei tasti rallenta a una scansione, anche se l'impostazione è più veloce. (Sierra 10.12.6)
scipilota il

2

So per certo che il ritardo del blocco maiuscole è una caratteristica del firmware sulla tastiera stessa - quindi puoi essere sicuro che il ritardo si verifica indipendentemente dal sistema operativo che sta guidando la tastiera al momento.

So anche che Apple non offre un percorso per aggiornare il firmware a un livello inferiore, quindi tutti dovremo aspettare fino a quando qualcuno con esperienza hardware sufficiente blog gli strumenti e i passaggi che hanno eseguito per indurre l'hardware a caricare il firmware precedente (o fornire quello che sembra un firmware più recente che regredisce senza ritardi al funzionamento precedente.)

Mi scuso per la mancata risposta, ma il percorso per farlo è ben illuminato e può aiutare gli altri ad agire (selezionando una tastiera più vecchia o astenersi dall'aggiornamento del firmware) nel frattempo mentre aspettiamo una vera soluzione da implementare un timer breve o assente sul tasto BLOC MAIUSC.


2
Un dettaglio di cui sono confuso nella tua risposta: stai dicendo che è falso che quando si rimappa il tasto BLOC MAIUSC in Mac OS X, il ritardo scompare? (Non so come interpretare altrimenti la tua affermazione "i tempi di ritardo si verificano indipendentemente dal sistema operativo attualmente utilizzato dalla tastiera"; ma ciò contraddice la mia esperienza diretta - a meno che Apple non stia utilizzando alcune API non documentate per il firmware per regolare il tempismo?)
pnkfelix,

Ho rimappato il mio su ESC ed è ancora necessaria la sospensione leggermente più lunga. L'ho fatto usando un'app di terze parti chiamata Seil, tuttavia, e non tramite alcuna funzionalità integrata in OSX. Di certo fastidioso: i loro sviluppatori non usano Vim? Accidenti.
intuito il

0

La soluzione "attiva / disattiva CapsLock-NoAction off / on" a cui l'OP fa riferimento funziona sia sulla mia tastiera Mac cablata che sulla mia tastiera MacBookPro. Bradley dice che funziona solo su Yosemite, ma l'ho usato con successo su Snow Leopard (10.6.8) e Mavericks (10.9.5). Ho anche provato questo all'interno di una VM Kubuntu e Caps Lock ha continuato a funzionare correttamente all'interno della VM.

  • Apri la Preferenze di Sistema tastiera e fai clic su Modifier Keys...:

inserisci qui la descrizione dell'immagine

  • Impostare il tasto BLOC MAIUSC su No Actione fare clic su OK:

                    inserisci qui la descrizione dell'immagine

  • Fare di Modifier Keys...nuovo clic su , impostare il tasto BLOC MAIUSC su Caps Lock, quindi fare clic su OK:

                    inserisci qui la descrizione dell'immagine

Questo rimane valido solo fino al prossimo riavvio.


1
Questo non ha avuto alcun effetto per me. (Sierra 10.12.6, tastiera Mac USB e interno su MBPro)
scipilot
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.