Как убрать задержку заглавных букв на алюминиевой клавиатуре Apple MacBook Pro при загрузке на Linux

32

Apple MacBook Pro имеет небольшую задержку на клавиатуре Caps Lock . То есть ключ блокировки колпачков должен удерживаться немного дольше обычного, чтобы зарегистрировать нажатие клавиши, необходимое для включения блокировки колпачков.

Это супер раздражает. Кто-нибудь знает, как это предотвратить?

(Выше скопировано из stackoverflow, поскольку оно было закрыто как «не по теме».)

Чтобы уточнить подробнее: Apple считает, что это особенность, и их статья базы знаний не раскрывает, как отключить эту задержку.

Однако у меня есть основания полагать, что это возможно.

Примечательно, что я обнаружил, что, по крайней мере, по моему опыту, если вы переназначаете клавишу caps-lock в Mac OS X (в Системных настройках .. Клавиатура .. Ключи модификаторов) и, например, сопоставляете ее с Control, то задержка исчезает пока я вошел в Mac OS X.

Моя проблема заключается в том, что задержка сохраняется, когда я загружаюсь в Ubuntu Linux, и в этом контексте, даже когда я переназначаю клавишу Caps Lock в Control, задержка все еще присутствует.

Итак, вопрос заключается в следующем: как Apple отключает задержку, и, что более важно, как можно реплицировать действия в контексте установки Linux на ноутбуке?

Обновление: на суперпользователе есть ветка, которая может обеспечить обходные пути. Я еще не пробовал предложения там (а именно: (1) выключение / включение CapsLock-NoAction и (2) обновление прошивки). Я не могу сказать из контекста этого потока, были ли обходные пути протестированы на установке Ubuntu.

pnkfelix
источник
Я никогда раньше этого не замечал, но у меня была игра с моей, и я понимаю, что вы имеете в виду. Если вы слишком быстро нажмете на кнопку блокировки колпачков, это ничего не даст. Я никогда не сталкивался с проблемой раньше, но просто попробовал отключить / снова включить трюк с заглушкой, и он сделал это мгновенно! теперь, независимо от того, быстро я нажимаю на клавишу, она всегда включает и закрывает заглавные буквы. Очень странно!
Tom1990
Всегда думал, что просто схожу с ума: p Я вижу его выгоду, но в некоторых ситуациях это действительно раздражает меня. Было бы хорошо узнать, если это возможно!
OrangeBox
В самом деле, трюк с отключением / повторным включением caps lock (на стороне Mac OS X), похоже, устраняет проблему, когда кто-то впоследствии перезагружается в Linux. Но мне не ясно, является ли эффект постоянным - я оставил свою машину выключенной на некоторое время (недели или, возможно, даже больше, чем месяц), и когда я загрузил ее прямо в Linux сегодня утром, это выглядело как задержка вернулась. Все еще довольно таинственно для меня.
pnkfelix
Итак, просто чтобы проверить, не существует ли исправления для Linux для этой проблемы?
Майк Х.Р.
1
Вот исправление, которое работает для macOS и может быть запущено под macOS.
fel1x

Ответы:

22

Я понял, как это сделать. Короче говоря, вы должны отправить «Отчет о 0x9, 0x0, 0x0, 0x0функциях », состоящий из байтов, на соответствующее устройство hidraw в качестве пользователя root.

Вы можете найти правильное устройство hidraw с этой командой:

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

Код для отправки магического пакета управления приведен ниже. Компилируется с помощью gcc, принимает в качестве параметра hidraw-устройство. Итак, весь поток:

  1. сохраните код ниже как 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

Шаги 3 и 4 необходимо выполнять при каждой перезагрузке (или отключите и снова подключите клавиатуру); вы можете поместить их в /etc/rc.local(или эквивалент вашего дистрибутива), чтобы выполнить их при загрузке ( sudoв этом случае вам это не нужно ; и вы можете захотеть переместить скомпилированный двоичный файл /usr/local/sbin/или что-то в этом роде).

Я добавил некоторые проверки безопасности для идентификатора поставщика, идентификатора устройства и длины дескриптора отчета. Возможно, вам придется изменить последние два, если ваша модель отличается от моей.


#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
источник
2
Это выглядит великолепно, спасибо! из интереса, как ты нашел это (волшебные байты, необходимые для отправки)?
Майк HR
6
@ MikeH-R: я провел целый день, изучая, как работает протокол HID: по сути, устройства описывают, какие пакеты данных («отчеты») они понимают. К сожалению, клавиатура Apple не упоминает этот отчет в своих дескрипторах HID. Однако я нашел дамп HID-дескрипторов внутренней клавиатуры MacBook, который кто-то опубликовал, который содержал правильное описание отчета, и я просто попробовал это и обнаружил, что он работает и для внешней проводной клавиатуры.
JMRK
Ух ты, я должен попробовать это!
pnkfelix
(Мне кажется, я получаю дескрипторы разных размеров, по крайней мере. Тем не менее, я
настрою
Я собираюсь принять этот ответ, потому что он наиболее близок к фактическому признанию проблемы, как описано, и предоставлению правдоподобного решения (даже если в моем собственном случае размеры дескриптора различны).
pnkfelix
13

Вот исправление для MacOS Sierra.

Перейдите в Системные настройки > Доступность

Когда окно доступности открыто - в левой части окна - нажмите Клавиатура

Затем будут 2 варианта - для закрепленных клавиш и для медленных клавиш - установите флажок рядом с медленными клавишами, чтобы включить его - затем нажмите Options...кнопку - в новом окне появится ползунок для изменения задержки приема - по умолчанию это посередине. Сдвиньте кнопку до упора влево, чтобы это было как можно меньше времени.

Теперь это должно быть исправлено. Не экспериментировал, чтобы увидеть, останется ли исправление после перезапуска, но я надеюсь, что так и будет.

Michelle
источник
Я был взволнован на секунду, но когда я пошел сюда, чтобы посмотреть, медленные клавиши не были включены, поэтому работает только для людей, которые используют медленные клавиши :( однажды я верну свой драгоценный ключ блокировки заглавных букв!
Брэдли
4
Это немного уменьшает его, но все же медленнее включить caps-lock, чем выключить. Кроме того, частота повторения клавиш замедляется до ползания, даже если настройка включена быстрее всего. (Сьерра 10.12.6)
Скипилот
1
это не правильное решение проблемы, так как это замедляет повторное нажатие клавиш, и вы больше не можете правильно удалять вещи, удерживая клавишу Backspace.
Дениалос
7

РЕДАКТИРОВАТЬ: Это, кажется, популярный вопрос посадки для пользователей, желающих убрать задержку на клавише caps lock в OS X. Начиная с OS X Mojave

Перейдите в Системные настройки; Доступность; Клавиатура; включите Slow Keys и зайдите в настройки; уменьшите задержку до минимума. Единственный нежелательный побочный эффект, который я заметил до сих пор, - медленное нажатие на клавишу возврата при удерживании. Обычно я использую CMD + A / CMD + SHIFT + L / R / CMD + SHIFT + CTRL + L / R, так что это не большая проблема.

На Эль-Капитан и ранее,

Решение довольно труднодостижимо, и вы бы на самом деле не знали, что удалили его, если бы не пытались вообще от него избавиться. То, как я собираюсь показать вам, предназначено исключительно для (текущей) последней версии OSX, Yosemite. Однако вы можете абсолютно применить этот метод к предыдущей и будущей версиям.

Решение простое. Если вы перейдете к Клавиатура в Системных настройках через логотип apple в верхнем левом углу, вы попадете на этот экран! [Введите описание изображения здесь] [1]

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

Если вы нажмете кнопку клавиш-модификаторов, вы сможете изменить функцию каждой из программируемых клавиш. Все, что вам нужно сделать, это установить клавишу Caps Lock бездействующей и нажать кнопку ОК, чтобы вернуться в меню клавиатуры. После этого вернитесь в клавиши-модификаторы и измените клавишу блокировки заглавных букв обратно на заглавные буквы, и это устранит задержку! Обратите внимание, что это исправление остается на месте до тех пор, пока вы не будете спать, перезапускать или выключать устройство. В этот момент задержка восстанавливается.

Это странные исправления, и возникает вопрос, почему они не предоставляют возможность убрать задержку, если это исправление основано исключительно на программном обеспечении. Но, по крайней мере, есть способ!

Удачного наполнения.

Брэдли
источник
Как это решает мою проблему в Linux?
pnkfelix
Чтобы быть более понятным: в первоначальном вопросе говорилось: «... задержка уходит, когда я вхожу в Mac OS X. Моя проблема в том, что задержка сохраняется, когда я загружаюсь в Ubuntu Linux и в этом контексте, даже когда я переназначаю Кнопка Caps Lock для управления, задержка все еще присутствует. "
pnkfelix
Ах! Понятно, мне следует внимательнее прочитать вопросы OP. Я обнаружил на OSX, что полное открепление ключа caps и повторное связывание решают проблему. Может быть, задержка остается, потому что вместо этого вы связываетесь с контролем? Стоит попробовать все, если у вас еще нет работы :)
Брэдли
1
Этот подход не имел никакого эффекта для меня. (Сьерра 10.12.6)
Скипилот
3

Перейдите в системные настройки> Специальные возможности> Клавиатура> Включить медленные клавиши> Изменить задержку приема до упора влево (коротко)! Это сработало для меня.

Томас Карл-Эрик Йонссон
источник
Вы описываете шаг в Mac OS X? Как это решает проблему в Ubuntu Linux, как описано в вопросе?
pnkfelix
Да исправить. Я не знаю Ubuntu Linux, извините. Я думаю, что решаю основной заголовок «Как убрать задержку блокировки колпачка на алюминиевой клавиатуре Apple MacBook Pro *» и, возможно, вопрос «Как Apple отключает задержку». :-) С наилучшими пожеланиями Томас, Швеция * Этот вопрос является причиной, по которой я нашел и прочитал этот протектор, и ничего не помогло, поэтому я решил его сам: P
Томас Карл-Эрик Йонссон
2
Согласно ответу Мишель: это немного уменьшает его, но все же медленнее включить caps-lock, чем выключить. Кроме того, частота повторения клавиш замедляется до ползания, даже если настройка включена быстрее всего. (Сьерра 10.12.6)
Скипилот
2

Я точно знаю, что задержка блокировки крышки - это особенность прошивки самой клавиатуры - так что вы можете быть уверены, что время задержки происходит независимо от того, какая ОС в данный момент работает на клавиатуре.

Я также знаю, что Apple не предлагает пути для прошивки микропрограммы до более низкого уровня, поэтому нам всем придется подождать, пока кто-то с достаточным опытом работы с оборудованием опубликует инструменты и шаги, которые они выполнили, чтобы обманным путем заставить аппарат загружать более старую прошивку (или предоставить что выглядит как более новая прошивка, которая уменьшает задержку до того, как она работала раньше без какой-либо задержки.)

Я извиняюсь за отсутствие ответа, но путь для достижения этой цели хорошо освещен, и это может помочь другим предпринять действия (выбрать более старую клавиатуру или воздержаться от обновления прошивки) в то же время, пока мы ждем реального решения для реализации короткий или нулевой таймер на клавише Caps Lock.

bmike
источник
2
Одна деталь, в которой я запутался в вашем ответе: вы говорите, что это ложно, что когда кто-то переопределяет ключ caps-lock в Mac OS X, задержка уходит? (Я не знаю, как иначе истолковать ваше утверждение «время задержки происходит независимо от того, на какой ОС в данный момент работает клавиатура»; но это противоречит моему непосредственному опыту - если Apple не использует какой-либо недокументированный API для прошивки, чтобы настроить время?)
pnkfelix
Я перенес мой в ESC, и немного более продолжительное удержание все еще необходимо. Я сделал это с помощью стороннего приложения под названием Seil, а не с помощью какой-либо функциональности, встроенной в OSX. Раздражает, конечно - их разработчики не используют Vim? Geez.
интуитивно
0

Решение «Включение / выключение CapsLock-NoAction», на которое ссылается OP, работает как на моей проводной клавиатуре Mac, так и на клавиатуре MacBookPro. Брэдли говорит, что это работает только на Yosemite, но я успешно использовал его на Snow Leopard (10.6.8) и Mavericks (10.9.5). Я также проверил это внутри виртуальной машины Kubuntu, и Caps Lock продолжал корректно работать внутри виртуальной машины.

  • Откройте Системные настройки клавиатуры и нажмите Modifier Keys...:

введите описание изображения здесь

  • Установите ключ Caps Lock No Actionи нажмите OK:

                    введите описание изображения здесь

  • Нажмите еще Modifier Keys...раз, установите ключ Caps Lock на Caps Lockи нажмите OK:

                    введите описание изображения здесь

Это остается в силе только до следующей перезагрузки.

Нил Штайнер
источник
1
Это не повлияло на меня. (Sierra 10.12.6, клавиатура Mac USB и внутренняя на MBPro)
scipilot