引导至Linux时如何消除Apple MacBook Pro铝制键盘上的大写锁定延迟


32

苹果的MacBook Pro 的大写锁定键略有延迟。也就是说,大写锁定键的按下时间必须比正常情况下稍长一些,以记录接合大写锁定所需的按键压力。

这太烦人了。有谁知道如何阻止它的发生?

(以上是从stackoverflow复制过来的,因为它在此处被关闭为“ off topic”。)

详细说明:Apple认为此功能有效,其知识库文章未披露如何禁用此延迟。

但是,我有理由相信有可能这样做。

值得注意的是,至少在我的经验中,我发现,如果您重新映射Mac OS X上的大写锁定键(在系统偏好设置..键盘..修改键中),例如将其映射到Control,则延迟消失了当我登录Mac OS X时。

我的问题是,当我启动到Ubuntu Linux时,延迟仍然存在,并且在这种情况下,即使将Caps Lock键重新映射为Control,延迟仍然存在。

因此,问题是:Apple如何禁用延迟,更重要的是,如何在笔记本电脑顶部安装Linux的情况下进行复制?

更新:超级用户上有一个线程可以提供解决方法。我尚未尝试那里的建议(即:(1)切换CapsLock-NoAction的开/关,以及(2)固件升级)。我无法从该线程的上下文中得知该解决方法是否已在Ubuntu安装上进行了测试。


我以前从没注意到这一点,但是我和我玩过,我明白你的意思了。如果您太快地按下了大写锁定键,它什么也没做。我以前从没发现过问题,只是尝试了禁用/重新启用大写锁定键的技巧,它使它立即生效!现在,无论我快速按了哪个键,它都可以切换大写锁定。很奇怪!
tom1990年

一直以为我快要疯了:p我可以看到它的好处,但是在某些情况下,它确实让我很烦。最好知道是否可能!
OrangeBox

确实,(随后在Mac OS X上)禁用/重新启用大写锁定技巧似乎确实使问题消失了,只要随后重新启动到Linux。但是对我来说,这种影响是否持久还不清楚,我关闭了一段时间(数周甚至是一个月以上),然后在今天早上直接将其启动到Linux时,延迟又回来了。对我来说还是很神秘的。
pnkfelix

因此,仅检查一下,似乎没有针对该问题的Linux修复程序?
Mike HR

1
是一个适用于macOS的修复程序,可以在macOS下运行。
fel1x

Answers:


22

我已经知道如何做到这一点。简而言之,您必须将包含字节的“功能报告” 0x9, 0x0, 0x0, 0x0作为根发送到适当的Hidraw设备。

您可以使用以下命令找到合适的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/或移入某物)。

我已经对供应商ID,设备ID和报告描述符长度进行了一些安全检查。如果您的模型与我的模型不同,则可能必须更改后两者。


#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
看起来不错,谢谢!出于兴趣,您是如何找到它的(需要发送的魔术字节)?
Mike HR

6
@ MikeH-R:我花了一天的时间学习HID协议的工作原理:本质上,设备描述了他们理解的数据包(“报告”)。不幸的是,Apple键盘在其HID描述符中没有提及相关报告。但是我发现有人张贴的MacBook内部键盘的HID描述符转储确实包含正确的报告描述,我只是尝试了一下,发现它也适用于外部有线键盘。
jmrk

哦,我必须尝试一下!
pnkfelix '16

(至少我确实确实获得了不同的描述符大小。不过,我还是会对其进行调整,看看它是如何工作的。)
pnkfelix

我将接受此答案,因为它最接近实际确认所描述的问题并提供可信的解决方案(即使在我自己的情况下,描述符的大小也不同)。
pnkfelix '16

13

这是macOS Sierra的修复程序。

转到系统偏好设置 > 辅助功能

当可访问性窗口打开时-在窗口的左侧-单击键盘

然后将有2个选项-粘滞键和慢键-单击慢键旁边的框将其启用-然后单击Options...按钮-默认情况下,将在新窗口中出现一个滑块以更改接受延迟-这是在中间。将按钮一直滑到最左侧,以使时间最短。

现在应该修复。还没有尝试过查看该修复程序是否在重新启动后仍然存在,但我希望它会继续存在。


我激动了一秒钟,但是当我去这里看时,慢速键没有启用,因此仅适用于使用慢速键的人:(有一天,我会把我宝贵的大写字母锁回键!
Bradley

4
这确实减少了一点,但是打开大写锁定比关闭仍然慢。即使设置是最快的,键重复率也会降低到爬网的速度。(塞拉利昂10.12.6)
scipilot

1
这不是解决当前问题的适当方法,因为它会减慢keyrepat的速度,并且在保留退格键时您将无法再正确删除内容。
Denialos '18

7

编辑:对于希望消除OS X中大写锁定键延迟的用户来说,这似乎是一个流行的着陆问题。从OS X Mojave开始,

转到系统偏好设置;辅助功能;键盘; 启用慢键并进入选项;将延迟降低到最小。到目前为止,我注意到的唯一不想要的副作用是按住它时退格动作缓慢。通常我总是使用CMD + A / CMD + SHIFT + L / R / CMD + SHIFT + CTRL + L / R,所以这不是大问题。

从El Capitan开始,

该解决方案非常难以捉摸,除非您特别想一开始就将其删除,否则您不会真正知道将其删除。我要向您展示的方式纯粹是针对OSX(当前)最新版本的优胜美地。但是,您可以绝对将此方法应用于以前的版本和将来的版本。

解决方案很简单。如果您通过左上角的苹果徽标导航至“系统”偏好设置中的“键盘”,则将显示此屏幕![在此处输入图片描述] [1]

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

如果单击修改键按钮,则可以更改每个可编程键的功能。您所要做的只是将大写锁定键设置为不执行任何操作,然后按确定以使您返回键盘菜单。完成后,返回到修改键,然后将大写锁定键更改回大写锁定,这将消除延迟!请注意,在您进入睡眠状态,重新启动设备或关闭设备电源之前,此修复程序将一直保留。此时将恢复延迟。

它们是奇怪的修复程序,这就引出了一个问题,即当此修复程序完全基于软件时,为什么它们不提供消除延迟的选项。但是,嘿,至少有办法!

祝您开心!


这如何解决我在Linux中的问题?
pnkfelix

更清楚地说:原始问题是:“ ...当我登录Mac OS X时,延迟消失了。我的问题是,当我启动到Ubuntu Linux时,延迟仍然存在,在这种情况下,即使我重新映射了使用Caps Lock键进行控制,延迟仍然存在。”
pnkfelix

啊! 我知道,我想我应该更仔细地阅读OP问题。我在OSX上发现完全解除绑定键并重新绑定解决了问题。也许延迟仍然存在,是因为您绑定控制权吗?如果您还没有解决的问题,值得尝试一切:)
Bradley

1
这种方法对我没有任何影响。(塞拉利昂10.12.6)
scipilot

3

转到系统偏好设置>辅助功能>键盘>启用慢键>更改接受延迟到最左侧(很短)!这对我有用。


您是否正在描述Mac OS X中的步骤?如问题所述,这如何解决Ubuntu Linux中的问题?
pnkfelix '16

是,对的。我不知道Ubuntu Linux,对不起。我想我正在解决的主要标题是“如何消除Apple MacBook Pro铝制键盘上的大写锁定延迟*”,可能还有一个问题:“ Apple如何禁用延迟”。:-)最好的问候瑞典的托马斯*这个问题是我找到并阅读了这张胎面的原因,没有任何帮助,所以我自己解决了:P
Thomas Carl-ErikJönsson2016年

2
按照米歇尔的回答:确实减少了一点,但是打开大写锁定比关闭仍然慢。即使设置是最快的,键重复率也会降低到爬网的速度。(塞拉利昂10.12.6)
scipilot

2

我确实知道大写锁定延迟是键盘本身固件的功能-因此,您可以确信,无论当前键盘驱动的操作系统是什么,延迟时间都会发生。

我也知道Apple不提供将固件刷新到较低级别的途径,因此我们所有人都必须等到具有足够硬件经验的人在博客上记录他们执行的诱使硬件加载旧固件的工具和步骤(或提供)。看起来像较新的固件,可以将延迟恢复为以前的工作方式,而没有任何延迟。)

对于无法解决的问题,我深表歉意,但是在解决此问题的道路上,它可能会帮助其他人在等待真正的解决方案实施的同时采取行动(选择较旧的键盘-或避免升级固件)大写锁定键上的计时器很短或没有计时器。


2
我对您的回答感到困惑:您是说在Mac OS X中重新映射大写锁定键时,延迟消失了吗?(我不知道该如何解释您的陈述“无论当前键盘驱动的是什么操作系统,延迟时间都会发生”;但这与我的直接经验相矛盾-除非Apple对固件使用了一些未公开的API来调整固件,时间?)
pnkfelix

我已经将我的地图重新映射为ESC,仍然需要稍长的保留时间。不过,我是使用名为Seil的第三方应用程序完成此操作的,而不是通过OSX内置的任何功能进行的。可以肯定的是,他们的开发人员不使用Vim吗?真是的
2014年

0

OP所指的“切换CapsLock-NoAction关/开”解决方案可在我的有线Mac键盘和MacBookPro键盘上使用。布拉德利说,这仅适用于优胜美地,但我已经在雪豹(10.6.8)和小牛(10.9.5)上成功使用过。我也在Kubuntu VM中进行了测试,并且Caps Lock在VM中继续正常工作。

  • 打开键盘系统偏好设置,然后单击Modifier Keys...

在此处输入图片说明

  • 将Caps Lock键设置为No Action,然后单击OK

                    在此处输入图片说明

  • Modifier Keys...再次单击,然后将Caps Lock键设置为Caps Lock,然后单击OK

                    在此处输入图片说明

这仅在下一次重新启动之前一直有效。


1
这对我没有影响。(Sierra 10.12.6,Mac USB键盘和MBPro内置)
scipilot
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.