Caps を Ctrl に、続編

uControl で Caps を Ctrl にしているわけなのだが、ウインドウ切り替えにアレにコレに、modifier を駆使してがりがりキーボード作業していると Control Lock (?) 状態になることがときたまある。

これは非常に腹立たしい。窓から PowerBook を捨てたくなる。先程はマウスを思いきり机に打ちつけて、机が微妙にへこんだ。

USB キーボードなら簡単

という話もあるが、しかし疑問の声もあがっているようで。しかし PowerBook な俺には関係ない。

Technical Note TN2056: Installable Keyboard Layouts

Mac OS X 10.2 adds the ability to install a new keyboard layout byputting a file or bundle in a standard folder.It is also now possible to define a Unicode keyboardvia an XML text file. These keyboards have the same set ofcapabilities as the 'uchr' resource keyboards defined in the document"Supporting Unicode Input." In fact, the XML file is translated tothe uchr format and then handled in exactly the same way.

にはおいしそうな話があがっていて、つまり OS X ではKeyboard layout を XML で記述して設置すれば、それがオレキーボードレイアウトとして選択可能になる。US Keyboard の定義は/System/Library/Keyboard Layouts/Unicode.bundle/Contents/Resources/USExtended.keylayout にあるのでパクる。

… しかし俺は「Caps を Ctrl にしたい」んでもって「Caps が何にアサインされているかはともかく、Caps キーがもたらすモディファイヤのロック状態を捨てたい」ので、後者はこの戦法だと無理なようだ。kernel の中に状態をもっている模様。

uControl と同様のものを探してみたが…

DoubleCommand

だめ。ステ

(あとなんか1個あったな)

だめ。ステ

uControl パッチ

uControl は Caps のイベントのあと、状態をしらべて、kernel に「ん? Caps? さぁ押されてないなぁ、勘違いじゃないの?」って感じで event のフラグを変えて自分のフックから戻しているのだが、戻しきれていないイベント組み合わせがあるのだろう。

uControl には挙動を syslog るオプションもあるのだが、どういうタイミングで (おそらく modifier 入力がぶつかってからみあったときなのだろうが)それが起こるのか予測しがたい、で再現したってそれはログられたキーイベントの数十行まえのどこかなのでどうももわからない。

とりあえずきたないパッチを入れて状況が改善されるか生活中

diff -urN uControl1.3.2/kext/ODHIDHack.cpp uControl1.3.2jm/kext/ODHIDHack.cpp
--- uControl1.3.2/kext/ODHIDHack.cpp    Wed Mar 19 06:19:56 2003
+++ uControl1.3.2jm/kext/ODHIDHack.cpp  Sat Aug  9 13:45:01 2003
@@ -461,6 +461,18 @@
     // update with our own flags
     flags |= addFlags;
 
+    // morimoto@xantia.citroen.org: start change
+#ifdef CAPS_TO_CTRL
+    if (capslock.enabled 
+        && !(capslock.kbtype && cachedKeyboard != capslock.kbtype)) {
+      // for some circumstances, caps flag has set
+      // although we unset capslock event.
+      // force the bit off.
+      flags &= ~0x10000;
+    }
+#endif
+    // morimoto@xantia.citroen.org: end change
+
     // SEC handle the scrolling after all the translation has happened
 #ifdef SCROLL_EMULATION
     checkForScrollKey(flags);