Apple KeyboardのCaps Lockの遅延問題への対症療法的対策ソフト その3
ありがたい事にどなたかがアメリカのディスカッションボードに拙作の対策ソフトの事を書き込んでくれまして、ほんの少しですがダウンロードページにアクセスがあるようです。
とは言え、キー入力イベント処理の関数でCaps LockがONからOFFになった時を検知してCaps LockのLEDを再度点灯させているだけという凄く簡単な処理なので少々こっ恥ずかしいです (^^;
実際核となる部分はログ表示含めても10行しかありませんです。
具体的にはremapAndDoEvent()の下記の部分となりますが、_keyboardEventActionをフックしているプログラムなら同様の事が可能です。
// ここから
if(*flags & KeyCode::CAPSLOCK_FLAG){
if(!p->caps){
IOLog("SetKeyboardLED::remapAndDoEvent CAPS:on\n");
p->caps = true;
}
}else if(p->caps){
IOLog("SetKeyboardLED::remapAndDoEvent CAPS:off\n");
p->kbd->setAlphaLockFeedback(true); // set caps lock LED
p->caps = false;
}
// ここまで
海外では現在DoubleCommandが有名なんでしょうか?sourceforgeにあるソースを見てみました。
DoubleCommand.cppのevent()にてキー入力イベントを処理していますので、下記のように追加すれば良い様な気がします。
int i = find_client(false);
if (i >= 0)
{
// ここから
if(flags & 0x010000/*KeyCode::CAPSLOCK_FLAG*/){
if(!Keyboards[i].caps){
IOLog("DoubleCommand: CAPS:on\n");
Keyboards[i].caps = true;
}
}else if(Keyboards[i].caps){
IOLog("DoubleCommand: CAPS:off\n");
Keyboards[i].keyboard->setAlphaLockFeedback(true); // set caps lock LED
Keyboards[i].caps = false;
}
// ここまで
GcharCode = charCode;
:
capsはboolでdc_keyboard構造体に追加が必要です。
これだけですと、初期化時にLEDがONせず一度Caps Lockに入れなければならなくなるため、SetKeyboardLEDでは初期化時にcapsをtrueに設定したりLEDをONしたりもしています。
と言う事をディスカッションボードに書こうかと思いましたが、とてもじゃないですが英語に訳せないので諦めました、ごめんなさい m(_ _)m
とは言え、キー入力イベント処理の関数でCaps LockがONからOFFになった時を検知してCaps LockのLEDを再度点灯させているだけという凄く簡単な処理なので少々こっ恥ずかしいです (^^;
実際核となる部分はログ表示含めても10行しかありませんです。
具体的にはremapAndDoEvent()の下記の部分となりますが、_keyboardEventActionをフックしているプログラムなら同様の事が可能です。
// ここから
if(*flags & KeyCode::CAPSLOCK_FLAG){
if(!p->caps){
IOLog("SetKeyboardLED::remapAndDoEvent CAPS:on\n");
p->caps = true;
}
}else if(p->caps){
IOLog("SetKeyboardLED::remapAndDoEvent CAPS:off\n");
p->kbd->setAlphaLockFeedback(true); // set caps lock LED
p->caps = false;
}
// ここまで
海外では現在DoubleCommandが有名なんでしょうか?sourceforgeにあるソースを見てみました。
DoubleCommand.cppのevent()にてキー入力イベントを処理していますので、下記のように追加すれば良い様な気がします。
int i = find_client(false);
if (i >= 0)
{
// ここから
if(flags & 0x010000/*KeyCode::CAPSLOCK_FLAG*/){
if(!Keyboards[i].caps){
IOLog("DoubleCommand: CAPS:on\n");
Keyboards[i].caps = true;
}
}else if(Keyboards[i].caps){
IOLog("DoubleCommand: CAPS:off\n");
Keyboards[i].keyboard->setAlphaLockFeedback(true); // set caps lock LED
Keyboards[i].caps = false;
}
// ここまで
GcharCode = charCode;
:
capsはboolでdc_keyboard構造体に追加が必要です。
これだけですと、初期化時にLEDがONせず一度Caps Lockに入れなければならなくなるため、SetKeyboardLEDでは初期化時にcapsをtrueに設定したりLEDをONしたりもしています。
と言う事をディスカッションボードに書こうかと思いましたが、とてもじゃないですが英語に訳せないので諦めました、ごめんなさい m(_ _)m
お久しぶりです。
この問題、ソフトウェア的な遅延であれば、おそらく PCKeyboardHack で CapsLock を Control に変更すれば、それなりに本質的な解決が出来ると思っています。
ソースを眺めた限りでは IOHIDFamily で遅延が行われているような感じがします。
で、PCKeyboardHack は Apple のキーボードドライバーにパッチを当てることでキーの差し替えを行っていて、IOHIDFamily では 完全に Control キーに見えます。
そのため遅延は発生しないのではないか……という感じですね。
推測まじりの話なので自信を持って言えないのですが、もし何か参考になれば幸いです。
http://www.pqrs.org/tekezo/macosx/keyremap4macbook/extra.html.ja
投稿 Takayama Fumihiko | 2008年4月 3日 (木) 18時02分
お久しぶりです。
情報どうもありがとうございます m(_ _)m
もしかすると完全解決かも?ということで早速PCKeyboardHack-3.0.0をインストールしてMB167J/Aにて確認してみましたが、残念ながら結果は芳しくありませんでした。
PCKeyboardHackの設定画面でCaps Lockを59(Control_L)にControl_Lを57(Caps Lock)に変更したのですが、そう言う事ですよね?
PCKeyboardHackのソースをザクっと見た限りではUSB-ADBの変換テーブルを書き換えでキーの入れ替えを実現しているように見えました。
この対策ソフトを作成する時に私の方でもテーブル書き換えでの確認は実施したのですが、やはりダメだった記憶があります。
もう少し何かありそうなのでIOUSBFamilyの方を調べてみます。
ではでは。
投稿 なすこじ | 2008年4月 3日 (木) 21時05分
ググったらWindowsでも遅延が発生しているようです。
どうもハードウェア組み込みの方が可能性が高そうな感じです。
投稿 なすこじ | 2008年4月 4日 (金) 00時06分
IOUSBFamilyを見てみましたが遅延を発生させている所は分かりませんでした orz
IOHIDFamilyの方にcapsDelayMSというのが有りましたが、こちらとは違いますでしょうか?
こちらはIOHIDEventService.cppのdispatchKeyboardEvent()にて遅延処理していました。
ただし、この部分は10.5.2で追加された箇所でしかもApple以外のキーボードの時に有効となるようでしたので、関係無いような気がします。
ではでは。
投稿 なすこじ | 2008年4月 4日 (金) 05時20分
最初からIOHIDFamilyとありましたね。
コメントを誤読してました (^^;
投稿 なすこじ | 2008年4月 4日 (金) 10時58分
さらに自分の間違いを発見 (^^;
dispatchKeyboardEvent()のソースの該当部分世見間違えていました。
kIOUSBVendorIDAppleComputerの後ろにアンドで掛かっているのが分かって無かったです。
かなり情けないっす orz
投稿 なすこじ | 2008年4月 4日 (金) 15時24分
詳細な情報ありがとうございます!!
随分とお手数をおかけしまして恐縮です。
PCKeyboardHack のリマップ方法については
おっしゃる通りでテーブル書き替えをしています。
なるほど、ハードウェアのほうで遅延が入っているんですか。
てっきり LED のステータス変更も IOHIDFamily を抜けるためだと思っていました。
ハードウェアのほうで LED の状態を見て遅延を入れるかどうか判断しているから、LED を点灯させると遅延が解消するとかそんな感じなんですね。
もしよければ該当コードを KeyRemap4MacBook にも取り込ませていただいてもよろしいでしょうか?
投稿 Takayama Fumihiko | 2008年4月 4日 (金) 15時41分
>もしよければ該当コードを KeyRemap4MacBook にも取り込ませていただいてもよろしいでしょうか?
宜しくお願いいたします m(_ _)m
本家に取り込んで頂けると安心です。
ただ、少し気になる点があります。
・アメリカのディスカッションボードにて「上手くいかねー!」って人が出ています。
この方の勘違いなのかどうか分かりません。
・今後このタイプが適用拡大されそうですが、ソフトで遅延(件のdispatchKeyboardEvent()の所で処理)するパターンが出て来る様な気がします。
その場合は、"CapsLockDelay" のパラメータを0にすれば従来通りになると思うのですが、現時点では分かりません。
ではでは。
投稿 なすこじ | 2008年4月 4日 (金) 22時04分
どうもです。 KeyRemap4MacBook にも取り込ませていただきました。
http://preview.tinyurl.com/465a7w
ソースはこんな感じで、押されたキーに関わらず LED を光らせています。
http://preview.tinyurl.com/4gpeqb
これでうまくいくのであれば PCKeyboardHack との組み合せでソフトウェア的な遅延も回避出来るので大丈夫かなというところですね。
投稿 Takayama Fumihiko | 2008年4月 7日 (月) 12時55分
どうもありがとうございます。
早速確認してみます。
投稿 なすこじ | 2008年4月 7日 (月) 14時48分
なぜか私のところでmakeしたパッケージを起動すると下記のエラーとなってしまいインストールできません(><)
「KeyRemap4MacBookは、このコンピュータにインストールできません。
"KeyRemap4MacBook-r.0.6"に対して InstallationCheckツールを実行しているときにエラーが起きました。」
ソースは修正していないのですがなぜ?
一応本体情報をば
本体:Gigabit Ethernet
CPU:FastMac 1.4GHzに変更
VGA:Radeon8500 AGP
PCI:OWC SATA card(10.5.2はここから起動)
OS:10.5.2(SATA)と10.4.11(ATA)にて確認
という事でパッケージの方をダウンロードして確認しましたが、こちらは上手くインストールできました。
当たり前ですが動作も正常でした。
どうもありがとうございました m(_ _)m
投稿 なすこじ | 2008年4月 7日 (月) 16時38分
と言う訳で、勝手にディスカッションボードに宣伝しておきました。ごめんなさい m(_ _)m
通じるかどうかは謎 (^^;
投稿 なすこじ | 2008年4月 7日 (月) 20時56分
動作確認ありがとうございます!
ビルドが上手くいかないのは謎ですね……。
とりあえず Tiger (Xcode 2.4) だと prefpane でコケていたのでそれは修正しましたが、それとは全然別問題っぽいですし。
一応、念頭に置いておきます。
投稿 Takayama Fumihiko | 2008年4月 8日 (火) 14時00分