Linuxから起動したときにApple MacBook ProのアルミニウムキーボードのCaps Lock遅延を削除する方法


32

AppleのMacBook Proでは、Caps Lockキーにわずかな遅延があります。つまり、Caps Lockキーを押すには、Caps Lockキーを通常よりも少し長く押して、Caps Lockをオンにする必要があります。

これは非常に迷惑です。誰もそれを防ぐ方法を知っていますか?

(上で「off topic」として閉じられたため、stackoverflowからコピーされました。)

さらに詳しく説明すると、Appleはこれを機能と見なしており、彼らのナレッジベースの記事はこの遅延を無効にする方法を開示していません。

しかし、そうすることが可能であると信じる理由があります。

特に、少なくとも私の経験では、Mac OS XのCaps-Lockキーを(システム環境設定..キーボード..修飾キーで)再マップし、たとえばControlにマップすると、遅延なくなることがわかりまし Mac OS Xにログインしています。

私の問題は、Ubuntu Linuxを起動したときに遅延が残ることであり、そのコンテキストでは、Caps LockキーをControlに再マップしても、遅延は依然として存在します。

それで、質問は次のとおりです。Appleはどのように遅延を無効にしていますか。さらに重要なことは、ラップトップ上にLinuxをインストールする状況で、それをどのように複製できるかということです。

更新:回避策を提供する可能性のあるスーパーユーザーのスレッドがあります。私はまだ提案を試していません(つまり:(1)CapsLock-NoActionのオン/オフの切り替え、および(2)ファームウェアのアップグレード)。Ubuntuのインストールで回避策がテストされているかどうかは、そのスレッドのコンテキストからはわかりません。


今までこれに気づいたことはありませんが、私は私のものと遊びましたが、私はあなたの意味を見ることができます。Caps Lockキーをすばやくタップしても、何も実行されません。以前は問題を発見していませんが、Caps Lockキートリックの無効化/再有効化を試みたところ、すぐに成功しました!すぐにキーを押すと、常にCaps Lockが切り替わります。非常に奇妙な!
–tom1990

いつも私はただ夢中になっていると思っていました:p私はその恩恵を見ることができますが、状況によっては本当にイライラさせられます。その可能性を知っておくといいでしょう!
OrangeBox

実際、Caps Lockの無効化/再有効化(Mac OS X側)により、その後Linuxを再起動すると問題は解消されるようです。しかし、その効果が永続的であるかどうかははっきりしません-マシンをしばらく(数週間または1か月以上)電源を切ったままにしておき、今朝Linuxで直接起動すると、遅延が戻りました。私にはまだ非常に神秘的です。
pnkfelix

確認のためだけに、この問題に対するLinuxの修正プログラムはないようです。
マイクHR

1
以下は、macOSで動作し、macOSで実行できる修正プログラムです。
fel1x

回答:


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、レポート記述子の長さについて、いくつかの安全性チェックを実施しました。モデルが私のモデルと異なる場合は、後者の2つを変更する必要があります。


#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
これは素晴らしいですね、ありがとう!興味のないところで、どのようにしてこれを見つけましたか(送信に必要なマジックバイト)?
マイクHR

6
@ MikeH-R:HIDプロトコルがどのように機能するかを学ぶのに1日を費やしました。本質的に、デバイスは理解するデータパケット(「レポート」)を記述します。残念ながら、AppleキーボードのHID記述子には問題のレポートが記載されていません。しかし、誰かが投稿したMacBookの内部キーボードのHID記述子のダンプを見つけましたが、これには正しいレポートの説明が含まれていました。
jmrk

なんてこった
pnkfelix

(少なくとも、異なる記述子サイズを取得するようです。それでも、それらを調整し、どのように機能するかを確認します。)
pnkfelix

説明されているように問題を実際に認識し、信頼できる解決策を提供するのに最も近いため、この答えを受け入れます(私の場合、記述子のサイズは異なります)。
pnkfelix

13

これはmacOS Sierraの修正です。

行くシステム環境設定 >アクセシビリティ

アクセシビリティウィンドウが開いている場合-ウィンドウの左側で-[ キーボード ]をクリックします

次に、スティッキーキーとスローキーの2つのオプションがあります。スローキーの横にあるボックスをクリックして有効にし、Options...ボタンをクリックします。新しいウィンドウに、受け入れ遅延を変更するスライダーが表示されます。これは途中です。可能な限り最短の時間になるように、ボタンを一番左までスライドします。

これで修正されるはずです。修正が再起動時に残るかどうかを確認するために実験したことはありませんが、そうなることを期待しています。


私は秒間興奮したが、私はここを見に行ったとき、低速の鍵は遅いキーを使用する人々のために働くので、有効になっていませんでした:( 1日、私は私の貴重なキャップがキーバックをロックしています!
ブラッドリー

4
これにより多少は軽減されますが、Caps-Lockをオンにする方がオフにするよりも遅くなります。また、設定が最速であっても、キーのリピートレートはクロールまで遅くなります。(シエラ10.12.6)
-scipilot

1
keyrepatが遅くなり、バックスペースを保持しているときに適切に削除できなくなるため、これは目前の問題に対する適切な解決策ではありません。
デニアロス

7

編集:これは、OS XのCaps Lockキーの遅延を削除しようとしているユーザーに人気の着陸時の質問のようです。OSX Mojaveでは、

システム環境設定に移動します。アクセシビリティ; キーボード; スローキーを有効にしてオプションに入ります。遅延を最小限に抑えます。私がこれまで気づいた唯一の望ましくない副作用は、それを押したときに遅いバックスペースアクションです。一般に、とにかくCMD + A / CMD + SHIFT + L / R / CMD + SHIFT + CTRL + L / Rを使用するので、大きな問題ではありません。

エルキャピタン以前では、

解決策は非常にわかりにくいので、最初に具体的にそれを取り除こうとしていない限り、あなたはそれを削除したことを本当に知りません。ここで紹介する方法は、純粋に(最新の)OSXの最新バージョンであるYosemiteの場合です。ただし、この方法を以前および将来のバージョンに絶対に適用できます。

解決策は簡単です。左上隅にあるリンゴのロゴからシステム環境設定のキーボードに移動すると、この画面が表示されます![ここに画像の説明を入力してください] [1]

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

修飾キーボタンをクリックすると、プログラム可能な各キーの機能を変更できます。必要なことは、Caps Lockキーをアクションなしに設定し、[OK]を押してキーボードメニューに戻ることだけです。完了したら、修飾キーに戻り、Caps Lockキーを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アルミニウムキーボード*のCaps Lock遅延を削除する方法」というメインタイトルと、「Appleが遅延を無効にする方法」という問題を解決していると思います。P::-)敬具トーマスは、スウェーデン*その質問は私が発見し、私は自分自身それを解決したように、このトレッドと何が助け読む理由です
トーマス・カール・エリック・ヨンソン

2
Michelleの答えによると:これは少し軽減されますが、Caps-Lockをオンにする方がオフにするよりも遅いです。また、設定が最速であっても、キーのリピートレートはクロールまで遅くなります。(シエラ10.12.6)
スキピロット

2

Caps Lock遅延がキーボード自体のファームウェアの機能であることは確かにわかっています。そのため、キーボードが現在どのOSを駆動していても遅延タイミングが発生することを確信できます。

Appleはファームウェアをより低いレベルにフラッシュするパスを提供していないことも知っているので、十分なハードウェア経験のある人がハードウェアをtrickして古いファームウェアをロードするためのツールと手順をブログに投稿するまで待つ必要があります新しいファームウェアのように見えるもので、遅延を遅らせることなく以前の動作に戻します)

私は回答がないことをおaびしますが、これを達成するための道は十分に明るく、他の人がアクションを起こすのを助けるかもしれません(古いキーボードを選択するか、ファームウェアのアップグレードを控えます) Caps Lockキーの短いタイマーまたはタイマーなし。


2
あなたの答えで混乱している1つの詳細:Mac OS Xでcaps-lockキーを再マップすると、遅延がなくなるというのは間違っていると言っていますか?(「キーボードが現在どのOSを駆動していても遅延タイミングが発生する」という文を他にどのように解釈するかはわかりませんが、Appleがファームウェアに対して文書化されていないAPIを使用して調整しない限り、私の直接的な経験と矛盾しますタイミング?)
pnkfelix

私はESCにリマップしましたが、やや長いホールドが必要です。ただし、OSXに組み込まれた機能ではなく、Seilというサードパーティアプリを使用してこれを行いました。迷惑なのは確かですが、開発者はVimを使用していませんか?もう。
直感

0

OPが参照する「CapsLock-NoActionの切り替え」ソリューションは、有線のMacキーボードとMacBookProキーボードの両方で機能します。ブラッドリーによれば、これはヨセミテでのみ機能しますが、Snow Leopard(10.6.8)およびMavericks(10.9.5)で正常に使用できました。また、これをKubuntu VM内でテストしましたが、Caps LockはVM内で正常に機能し続けました。

  • キーボードシステム設定を開き、をクリックします Modifier Keys...

enter image description here

  • Caps Lockキーをに設定し、No ActionクリックしますOK

                    enter image description here

  • Modifier Keys...もう一度クリックして、Caps Lockキーをに設定しCaps Lock、クリックしますOK

                    enter image description here

これは、次回の再起動まで有効です。


1
これは私には効果がありませんでした。(Sierra 10.12.6、Mac USBキーボードおよびMBProの内部)
scipilot
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.