Jak usunąć opóźnienie blokady caps na aluminiowej klawiaturze Apple MacBook Pro po uruchomieniu w systemie Linux

32

MacBook Pro firmy Apple ma niewielkie opóźnienie w klawiszu Caps Lock . Oznacza to, że klawisz Caps Lock należy przytrzymać nieco dłużej niż zwykle, aby zarejestrować naciśnięcie klawisza wymagane do włączenia blokady Caps.

To jest bardzo denerwujące. Czy ktoś wie, jak temu zapobiec?

(Powyżej skopiowano z stackoverflow, ponieważ został tam zamknięty jako „nie na temat”.)

W celu dalszego rozwinięcia: Apple uważa tę funkcję za przydatną, a artykuł z bazy wiedzy nie ujawnia, jak wyłączyć to opóźnienie.

Mam jednak powody, by sądzić, że jest to możliwe.

W szczególności zauważyłem, że przynajmniej z mojego doświadczenia, jeśli ponownie mapujesz klawisz Caps-Lock w Mac OS X (w Preferencjach systemowych .. Klawiatura .. Klawisze modyfikujące) i np. Mapujesz go na Control, wtedy opóźnienie znika podczas gdy jestem zalogowany do Mac OS X.

Mój problem polega na tym, że opóźnienie pozostaje, gdy uruchamiam system Ubuntu Linux, i w tym kontekście, nawet kiedy ponownie przypisuję klawisz Caps Lock do Control, opóźnienie jest nadal obecne.

Pytanie brzmi zatem: w jaki sposób Apple wyłącza opóźnienie, a co ważniejsze, w jaki sposób można replikować te działania w kontekście instalacji systemu Linux na laptopie?

Aktualizacja: W superużytkowniku jest wątek, który może zapewnić obejścia. Nie wypróbowałem jeszcze tam sugestii (mianowicie: (1) przełączanie CapsLock-NoAction wyłączanie / włączanie i (2) aktualizacja oprogramowania układowego). Nie mogę stwierdzić z kontekstu tego wątku, czy obejścia zostały przetestowane na instalacji Ubuntu.

pnkfelix
źródło
Nigdy wcześniej tego nie zauważyłem, ale bawiłem się z moim i rozumiem, co masz na myśli. Jeśli naciśniesz klawisz Caps Lock zbyt szybko, nic nie zrobi. Nigdy wcześniej nie miałem z tym problemu, ale po prostu spróbowałem wyłączyć / włączyć ponownie klawisz Caps Lock, dzięki czemu stało się to natychmiastowe! teraz bez względu na to, jak szybko nacisnę klawisz, zawsze włącza się Caps Lock. Bardzo dziwny!
tom1990
Zawsze myślałem, że po prostu wariuję: p Widzę jego zalety, ale w niektórych sytuacjach naprawdę mnie to denerwuje. Dobrze byłoby wiedzieć, czy to możliwe!
OrangeBox
Rzeczywiście, trik wyłączania / ponownego włączania Caps Lock (po stronie Mac OS X) wydaje się sprawiać, że problem zniknie po ponownym uruchomieniu systemu Linux. Ale nie jest dla mnie jasne, czy efekt jest trwały - pozostawiłem wyłączoną maszynę na jakiś czas (tygodnie, a może nawet dłużej niż miesiąc), a kiedy rano uruchomiłem ją bezpośrednio na Linuksie, wydawało mi się, że opóźnienie wróciło. Nadal dla mnie dość tajemnicza.
pnkfelix
Więc żeby to sprawdzić, wydaje się, że nie ma poprawki dla Linuksa dla tego problemu?
Mike HR
1
Oto poprawka, która działa na macOS i może być uruchomiona pod macOS.
fel1x

Odpowiedzi:

22

Wymyśliłem, jak to zrobić. Krótko mówiąc, musisz wysłać „Raport funkcji” składający się z bajtów 0x9, 0x0, 0x0, 0x0do odpowiedniego urządzenia hidraw jako root.

Możesz znaleźć odpowiednie urządzenie hidraw za pomocą tego polecenia:

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

Kod do wysłania pakietu kontroli magii znajduje się poniżej. Kompiluje się z gcc, przyjmuje jako parametr parametr urządzenia hidraw. Cały przepływ to:

  1. zapisz poniższy kod jako 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

Kroki 3 i 4 należy wykonać przy każdym ponownym uruchomieniu komputera (lub odłączeniu i ponownym podłączeniu klawiatury); możesz umieścić je w /etc/rc.local(lub odpowiedniku swojej dystrybucji), aby wykonać je przy starcie systemu ( sudow tym przypadku nie potrzebujesz ; możesz chcieć przenieść skompilowany plik binarny /usr/local/sbin/lub coś takiego).

Przeprowadziłem kilka kontroli bezpieczeństwa dla identyfikatora dostawcy, identyfikatora urządzenia i długości deskryptora raportu. Być może będziesz musiał zmienić dwa ostatnie, jeśli twój model różni się od mojego.


#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
źródło
2
Wygląda świetnie, dzięki! z ciekawości, jak to znalazłeś (magiczne bajty muszą zostać wysłane)?
Mike HR
6
@ MikeH-R: Spędziłem dzień, ucząc się, jak działa protokół HID: w zasadzie urządzenia opisują, jakie pakiety danych („raporty”) rozumieją. Niestety klawiatura Apple nie wspomina o tym raporcie w swoich deskryptorach HID. Jednak znalazłem zrzut deskryptorów HID klawiatury wewnętrznej MacBooka, który ktoś opublikował, który zawierał prawidłowy opis raportu, po prostu spróbowałem tego i stwierdziłem, że działa on również na zewnętrzną klawiaturę przewodową.
jmrk
Och, wow, muszę to wypróbować!
pnkfelix,
(Wydaje mi się, że przynajmniej dostaję różne rozmiary deskryptorów. Nadal je dostosuję i zobaczę, jak to działa.)
pnkfelix
Przyjmuję tę odpowiedź, ponieważ jest ona najbliższa faktycznego uznania opisanego problemu i dostarczenia wiarygodnego rozwiązania (chociaż w moim przypadku rozmiary deskryptorów są różne).
pnkfelix,
13

Oto poprawka dla systemu macOS Sierra.

Przejdź do Preferencji systemowych > Dostępność

Gdy okno dostępności jest otwarte - w lewej części okna - kliknij Klawiatura

Następnie będą 2 opcje - dla klawiszy lepkich i dla wolnych klawiszy - kliknij pole obok wolnych klawiszy, aby je włączyć - następnie kliknij Options...przycisk - nowe okno wyświetli suwak, aby zmienić opóźnienie akceptacji - domyślnie to jest w środku. Przesuń przycisk do końca w lewo, aby był to najkrótszy możliwy czas.

Teraz powinno to zostać naprawione. Nie eksperymentowałem, aby sprawdzić, czy poprawka pozostanie po ponownym uruchomieniu, ale mam nadzieję, że tak się stanie.

Michelle
źródło
Byłem podekscytowany na sekundę, ale kiedy tam poszedłem, powolne klawisze nie były włączone, więc działa tylko dla osób, które używają wolnych klawiszy :( pewnego dnia odzyskam mój cenny klawisz Caps Lock!
Bradley,
4
To trochę to zmniejsza, ale nadal wolniej włącza Caps Lock niż wyłącza. Również częstotliwość powtarzania klawiszy spowalnia do indeksowania, nawet jeśli ustawienie jest najszybsze. (Sierra 10.12.6)
scipilot
1
nie jest to właściwe rozwiązanie tego problemu, ponieważ spowalnia keyrepat i nie można już poprawnie usuwać rzeczy podczas przytrzymywania backspace.
Denialos
7

EDYCJA: To wydaje się być popularnym pytaniem dla użytkowników, którzy chcą usunąć opóźnienie na klawiszu Caps Lock w OS X. Od OS X Mojave,

Przejdź do Preferencji systemowych; Dostępność; Klawiatura; włącz Powolne klawisze i przejdź do opcji; zmniejsz opóźnienie do minimum. Jedynym niepożądanym efektem ubocznym, jaki do tej pory zauważyłem, jest powolne cofanie się po przytrzymaniu go. Ogólnie używam CMD + A / CMD + SHIFT + L / R / CMD + SHIFT + CTRL + L / R, więc nie jest to duży problem.

Od El Capitan i wcześniejszych

Rozwiązanie jest dość nieuchwytne i tak naprawdę nie wiedziałbyś, że je usunąłeś, chyba że specjalnie próbowałeś się go pozbyć. Sposób, w jaki wam pokażę, dotyczy wyłącznie (bieżącej) najnowszej wersji OSX, Yosemite. Możesz jednak bezwzględnie zastosować tę metodę do poprzednich i przyszłych wersji.

Rozwiązanie jest proste. Jeśli przejdziesz do opcji Klawiatura w Preferencjach systemowych za pomocą logo jabłka w lewym górnym rogu, dojdziesz do tego ekranu! [Wprowadź opis obrazu tutaj] [1]

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

Kliknięcie przycisku modyfikatora umożliwia zmianę funkcji każdego z programowalnych klawiszy. Wszystko, co musisz zrobić, to ustawić klawisz Caps Lock na brak działania i nacisnąć OK, aby wrócić do menu klawiatury. Po zakończeniu wróć do klawiszy modyfikujących i zmień klawisz Caps Lock z powrotem na Caps Lock, a to usunie opóźnienie! Należy pamiętać, że ta poprawka pozostaje na miejscu do momentu uśpienia, ponownego uruchomienia lub wyłączenia urządzenia. W tym momencie opóźnienie jest przywracane.

Są to dziwne poprawki i nasuwa się pytanie, dlaczego nie zapewniają opcji usunięcia opóźnienia, gdy ta poprawka opiera się wyłącznie na oprogramowaniu. Ale hej, przynajmniej istnieje sposób!

Happy caping.

Bradley
źródło
Jak to rozwiązuje mój problem w systemie Linux?
pnkfelix
Aby być bardziej zrozumiałym: pierwotne pytanie brzmiało: „... opóźnienie zanika, gdy jestem zalogowany do Mac OS X. Moim problemem jest to, że opóźnienie pozostaje, gdy uruchamiam system Ubuntu Linux iw tym kontekście, nawet gdy ponownie mapuję Klawisz Caps Lock do Control, opóźnienie jest nadal obecne. ”
pnkfelix
Ach! Rozumiem, chyba powinienem uważniej przeczytać pytania OP. Znalazłem w OSX, że całkowite rozpięcie klawisza Caps i ponowne wiązanie rozwiązało problem. Może opóźnienie pozostaje, ponieważ jesteś zobowiązany do kontroli? Warto spróbować wszystkiego, jeśli jeszcze nie masz pracy :)
Bradley
1
To podejście nie miało dla mnie żadnego efektu. (Sierra 10.12.6)
scipilot
3

Przejdź do preferencji systemowych> dostępność> klawiatura> włącz wolne klawisze> zmień opóźnienie akceptacji aż do lewej (krótkie)! To zadziałało dla mnie.

Thomas Carl-Erik Jönsson
źródło
Czy opisujesz krok w Mac OS X? Jak to rozwiązuje problem w systemie Ubuntu Linux, jak opisano w pytaniu?
pnkfelix,
Tak, poprawnie. Przepraszam, nie znam Ubuntu Linux. Myślę, że rozwiązuję główny tytuł: „Jak usunąć opóźnienie Caps Lock na aluminiowej klawiaturze Apple MacBook Pro *” i może pytanie „Jak Apple wyłącza opóźnienie”. :-) Pozdrawiam Thomas, Szwecja * To pytanie jest powodem, dla którego znalazłem i przeczytałem ten bieżnik i nic nie pomogło, więc sam go rozwiązałem: P
Thomas Carl-Erik Jönsson
2
Zgodnie z odpowiedzią Michelle: To trochę to zmniejsza, ale nadal wolniej jest włączyć Caps Lock niż wyłączyć. Również częstotliwość powtarzania klawiszy spowalnia do indeksowania, nawet jeśli ustawienie jest najszybsze. (Sierra 10.12.6)
scipilot
2

Wiem na pewno, że opóźnienie Caps Lock jest funkcją oprogramowania układowego samej klawiatury - możesz więc mieć pewność, że opóźnienie ma miejsce bez względu na to, jaki system operacyjny obsługuje obecnie klawiatura.

Wiem również, że Apple nie oferuje ścieżki flashowania oprogramowania układowego na niższy poziom, więc wszyscy będziemy musieli poczekać, aż ktoś z wystarczającą ilością doświadczenia w blogowaniu narzędzi i kroków, które wykonali, aby nakłonić sprzęt do załadowania starszego oprogramowania (lub zapewnić coś, co wygląda na nowsze oprogramowanie układowe, które regresuje opóźnienie wcześniejszego działania).

Przepraszam za brak odpowiedzi, ale ścieżka do osiągnięcia tego celu jest dobrze oświetlona i może pomóc innym podjąć działania (wybierając starszą klawiaturę - lub powstrzymać się od aktualizacji oprogramowania układowego) w międzyczasie, podczas gdy czekamy na prawdziwe rozwiązanie do wdrożenia krótki lub brak timera na klawiszu Caps Lock.

bmike
źródło
2
Jeden szczegół, co do którego jestem zdezorientowany w twojej odpowiedzi: Czy mówisz, że to nieprawda, że ​​kiedy ponownie mapujesz klawisz Caps-Lock w Mac OS X, opóźnienie znika? (Nie wiem, jak inaczej zinterpretować stwierdzenie „opóźnienie występuje niezależnie od systemu operacyjnego, którym steruje obecnie klawiatura”; ale to przeczy mojemu bezpośredniemu doświadczeniu - chyba że Apple używa jakiegoś nieudokumentowanego interfejsu API do oprogramowania układowego, aby dostosować czas?)
pnkfelix
Moje zmieniono na ESC, a nieco dłuższe trzymanie jest nadal konieczne. Zrobiłem to za pomocą aplikacji Seil innej firmy, a nie za pośrednictwem żadnej funkcji wbudowanej w OSX. Z pewnością denerwujące - czy ich programiści nie używają Vima? Rany.
intuicyjnie,
0

Rozwiązanie „przełączanie CapsLock-NoAction off / on”, do którego odnosi się OP, działa zarówno na mojej przewodowej klawiaturze Mac, jak i na mojej MacBookPro. Bradley mówi, że działa to tylko na Yosemite, ale z powodzeniem użyłem go na Snow Leopard (10.6.8) i Mavericks (10.9.5). Przetestowałem to również w maszynie wirtualnej Kubuntu, a Caps Lock działał poprawnie w maszynie wirtualnej.

  • Otwórz Preferencje systemowe klawiatury i kliknij Modifier Keys...:

wprowadź opis zdjęcia tutaj

  • Ustaw klawisz Caps Lock na No Actioni kliknij OK:

                    wprowadź opis zdjęcia tutaj

  • Kliknij Modifier Keys...ponownie, ustaw klawisz Caps Lock na Caps Locki kliknij OK:

                    wprowadź opis zdjęcia tutaj

Działa to tylko do następnego ponownego uruchomienia.

Neil Steiner
źródło
1
Nie miało to dla mnie żadnego efektu. (Sierra 10.12.6, klawiatura Mac USB i wewnętrzna na MBPro)
scipilot