MacBook Pro от Apple имеет небольшую задержку нажатия клавиши Caps Lock . То есть клавишу Caps Lock необходимо удерживать немного дольше, чем обычно, чтобы зарегистрировать нажатие клавиши, необходимое для включения 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.
Я придумал, как это сделать. Короче говоря, вы должны отправить «Отчет о функциях», состоящий из байтов 0x9, 0x0, 0x0, 0x0
, на соответствующее устройство hidraw от имени пользователя root.
Вы можете найти нужное устройство hidraw с помощью этой команды:
dmesg | grep Apple | grep Keyboard | grep input0 | tail -1 | sed -e 's/.*hidraw\([[:digit:]]\+\).*/\/dev\/hidraw\1/'
Код для отправки пакета управления Magic приведен ниже. Компилируется с помощью gcc, принимает в качестве параметра устройство hidraw. Итак, весь поток:
disable-capslock-delay.c
gcc -o disable-capslock-delay disable-capslock-delay.c
HIDDEVICE=$(dmesg | grep Apple | grep Keyboard | grep input0 | tail -1 | sed -e 's/.*hidraw\([[:digit:]]\+\).*/\/dev\/hidraw\1/')
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;
}
Вот исправление для macOS Sierra.
Перейдите в Системные настройки > Специальные возможности.
Когда окно специальных возможностей открыто — в левой части окна — нажмите Клавиатура
Затем будет 2 варианта — для залипания клавиш и для медленных клавиш — щелкните поле рядом с медленными клавишами, чтобы включить его — затем нажмите Options...
кнопку — появится новое окно с ползунком для изменения задержки принятия — по умолчанию это в середине. Сдвиньте кнопку до упора влево, чтобы это было как можно короче.
Теперь это должно быть исправлено. Не экспериментировал, чтобы увидеть, останется ли исправление после перезапуска, но я надеюсь, что это произойдет.
РЕДАКТИРОВАТЬ: Это, кажется, популярный вопрос для пользователей, которые хотят удалить задержку клавиши Caps Lock в OS X. Что касается OS X Mojave,
Перейдите в Системные настройки; доступность; Клавиатура; включить медленные клавиши и перейти к параметрам; уменьшите задержку до минимума. Единственный нежелательный побочный эффект, который я заметил до сих пор, — это медленное нажатие на клавишу Backspace при удерживании ее нажатой. Обычно я использую CMD+A / CMD+SHIFT+L/R / CMD+SHIFT+CTRL+L/R в любом случае, так что это не большая проблема.
Начиная с Эль-Капитана и ранее,
Решение довольно неуловимое, и вы бы не узнали, что удалили его, если бы не пытались избавиться от него специально. Способ, который я собираюсь вам показать, предназначен исключительно для (текущей) последней версии OSX, Yosemite. Однако вы можете абсолютно точно применить этот метод к предыдущим и будущим версиям.
Решение простое. Если вы перейдете к клавиатуре в настройках системы через логотип Apple в верхнем левом углу, вы попадете на этот экран.
Если вы нажмете кнопку клавиши-модификатора, вы сможете изменить функцию каждой из программируемых клавиш. Все, что вам нужно сделать, это установить клавишу Caps Lock без действия и нажать ОК, чтобы вернуться в меню клавиатуры. После этого вернитесь к клавишам-модификаторам и измените клавишу Caps Lock обратно на Caps Lock, и это устранит задержку! Обратите внимание, что это исправление остается в силе до тех пор, пока вы не перейдете в спящий режим, не перезапустите или не выключите устройство. В этот момент задержка восстанавливается.
Это странные исправления, и возникает вопрос, почему они не предоставляют возможность удалить задержку, когда это исправление основано исключительно на программном обеспечении. Но эй, по крайней мере, есть способ!
Удачного укупорки.
Работа над ответом @jmrk. Его код хорошо работает для так называемой «алюминиевой» клавиатуры, но Apple также выпускала беспроводные клавиатуры под названием «волшебная клавиатура» с идентификатором продукта 0x022d. (У них также есть алюминиевое шасси, и я думаю, что моя модель примерно 2008 года.) У этого продукта такая же проблема с заглавными буквами, и почти такой же код может ее исправить. Помимо изменения идентификатора продукта, размер дескриптора равен 218, а данные для отправки — не 0x00, а 0x01:
buf[0] = 0x09; // Report Number
buf[1] = 0x01; // Report data
Я нашел это сегодня и решил записать свой ответ здесь на случай, если он кому-нибудь поможет, включая меня в будущем.
Вот полная программа, устраняющая проблему на обоих типах устройств. Вы можете передать дополнительные скрытые устройства, это будет применяться только к известным. Таким образом, вы можете просто назвать это как./a.out /dev/hidraw*
#include <linux/hidraw.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv) {
printf("Pass all devices to configure. For example, like this: %s /dev/hidraw*\n", argv[0]);
int expected_desc_size;
char data_to_set;
for (int argnum=1;argnum<argc;argnum++) {
printf("Trying to configure %s...\n", argv[argnum]);
int fd, i, res, desc_size = 0;
char buf[256];
struct hidraw_devinfo info;
char *device = argv[argnum];
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 Raw Info
res = ioctl(fd, HIDIOCGRAWINFO, &info);
if (res < 0) {
perror("HIDIOCGRAWINFO");
return 1;
}
if (info.vendor == 0x05ac) {
printf("Apple device found!\n");
} else {
printf("Not an apple device.\n");
continue;
}
if (info.product == 0x022d) {
printf("We have a 'magic' keyboard\n");
expected_desc_size = 218;
data_to_set = 1;
} else if (info.product == 0x0250) {
printf("We have an 'aluminium' keyboard\n");
expected_desc_size = 75;
data_to_set = 0;
}
else {
printf("Warning: Unknown product ID 0x%x!\n", info.product);
continue;
}
// Get Report Descriptor Size
res = ioctl(fd, HIDIOCGRDESCSIZE, &desc_size);
if (res < 0) {
perror("HIDIOCGRDESCSIZE");
return 1;
}
if (desc_size != expected_desc_size) {
printf("Error: unexpected descriptor size %d; panic'ing", desc_size);
return 1;
}
// 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] = data_to_set; // 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");
return 1;
}
printf("HID Feature Report (after change):\n\t");
for (i = 0; i < res; i++) printf("%hhx ", buf[i]);
puts("\n");
close(fd);
}
return 0;
}
Я точно знаю, что задержка Caps Lock является особенностью прошивки самой клавиатуры, поэтому вы можете быть уверены, что время задержки происходит независимо от того, какая ОС работает на клавиатуре в данный момент.
Я также знаю, что Apple не предлагает путь для прошивки прошивки до более низкого уровня, поэтому нам всем придется ждать, пока кто-то с достаточным опытом работы с аппаратным обеспечением не опубликует в блогах инструменты и шаги, которые они выполнили, чтобы обманом заставить оборудование загрузить более старую прошивку (или предоставить то, что выглядит как более новая прошивка, которая регрессирует задержку к тому, как она работала раньше, без каких-либо задержек.)
Прошу прощения за отсутствие ответа, но путь к этому хорошо освещен, и это может помочь другим принять меры (выбрать более старую клавиатуру или воздержаться от обновления прошивки) в то же время, пока мы ждем реального решения для реализации короткий таймер или его отсутствие на клавише Caps Lock.
Перейдите в системные настройки> специальные возможности> клавиатура> включите медленные клавиши> измените задержку приема полностью влево (коротко)! Это сработало для меня.
Решение «включение/выключение CapsLock-NoAction», на которое ссылается OP, работает как на моей проводной клавиатуре Mac, так и на клавиатуре MacBookPro. Брэдли говорит, что это работает только на Yosemite, но я успешно использовал его на Snow Leopard (10.6.8) и Mavericks (10.9.5). Я также проверил это внутри виртуальной машины Kubuntu, и Caps Lock продолжал правильно работать внутри виртуальной машины.
Modifier Keys...
:No Action
и нажмите OK
:Modifier Keys...
еще раз и установите для клавиши Caps Lock значение Caps Lock
, а затем нажмите OK
:Это остается в силе только до следующей перезагрузки.
init.lua
путь ~/.hammerspoon
, вставьте код ниже.pressedF19 = function()
hs.hid.capslock.toggle()
end
hs.hotkey.bind({}, 'F19', pressedF19, nil)
Затем перезагрузите конфигурацию Hammerspoon, чтобы изменения вступили в силу.
Смотрите мой блог здесь http://hellohtml5.com/2019/04/25/best-way-to-disable-capslock-delay-on-mac/
Я написал очень легкий инструмент с открытым исходным кодом, чтобы исправить именно это:
Том1990
Оранжевая коробка
pnkfelix
Майк HR
pnkfelix
rr
для отладки, и поэтому, возможно, я еще раз попытаюсь найти исправление.fel1x
Пит