MacBookキーボードをもっとHappy Hacking Keyboardにする

ソースコードに修正を加えた上で利用し、MacBookキーボードをHHKBに近づけようと。キーボードはどちらも英語配列のものを使っている。

MacBookを自宅で使う時はずっと外付けキーボードを使っている。見た目重視で極薄Apple Keyboardを利用していたが、集中して長時間タイプしていると隣のキーを押してしまうなどタイプミスに苛立ち、しばらく前からHHKB Lite2 for Macを利用している。始めは少しとまどったが、Fnキー押しながらのカーソルキー操作に慣れてくると、本当に手首の位置を変えずにタイプでき、マウスに右手をやるのも面倒になるぐらい。手首の位置を固定・安定・疲労減の目的で買ったリストレストが大当たりで、HHKB使うならこのリストレストが欠かせない。

エレコム リストレスト 疲労軽減

エレコム リストレスト 疲労軽減 "COMFY" ロング(ブラック) MOH-012BK

こんなふうに設置してる。

この感じに慣れた後で困ったのが、場所を変えてMacBookのキーボードがHHKBに慣れた指に馴染めなくなったこと。一番困るのはdeleteキーの場所だ。HHKBではReturnキーのすぐ上にあり手首を動かさずに右薬指で押しているのだが、MacBookキーボード(英語配列)だとそこはバックスラッシュなわけで。それをなんとかしたいと見つけたKeyRemap4MacBookだったのだが、勢いでそれ以外もソース修正を行った。

ソース修正内容

オリジナルのソースはKeyRemap4MacBook-3.2.0.tar.gzにした。それには「HHK compatible Arrow Key Mode」というモードが用意されているので、それに、

  • MacBookのキーボードでのみ有効
  • deleteキーと「\」キーを入れ替える
  • 右のshiftキーをfnキーとして扱う
  • 数字キー(1〜0)と「-」「=」キーをfnキーと合わせて、F1〜F12キーとして扱う

を追加する。次は変更したソースファイル。

src/kext/remap.cpp

remap_hhkmode(const RemapParams ¶ms)を以下のように追記変更。

  void
  remap_hhkmode(const RemapParams &params)
  {
    if (! config.remap_hhkmode) return;
    
    // 追加その1:始まり ======
    // enable for only MacBook Keyboard
    if (*(params.keyboardType) != KeyboardType::MACBOOK) return;
    
    // exchange delete and backslash
    RemapUtil::keyToKey(params, KeyCode::BACKSLASH, KeyCode::DELETE);
    RemapUtil::keyToKey(params, KeyCode::DELETE, KeyCode::BACKSLASH);
    
    // shiftR => fn
    RemapUtil::modifierToModifier(params, ModifierFlag::SHIFT_R, ModifierFlag::FN);
    RemapUtil::toFN(params);
    // 追加その1:終わり ======

    if (! allFlagStatus.fn.isHeldDown()) return;

    allFlagStatus.keypad = false;

    // [ => up
    if (params.ex_origKey == KeyCode::BRACKET_LEFT) {
      *(params.key) = KeyCode::CURSOR_UP;
      allFlagStatus.cursor = true;
      allFlagStatus.fn.temporary_decrease();
    }
    
    // ※中略※
    
    // , => End
    if (params.ex_origKey == KeyCode::COMMA) {
      *(params.key) = KeyCode::END;
    }
    
    // 追加その2:始まり ======
    if (params.ex_origKey == KeyCode::FN_KEY_1) {
      *(params.key) = KeyCode::F1;
    }
    if (params.ex_origKey == KeyCode::FN_KEY_2) {
      *(params.key) = KeyCode::F2;
    }
    if (params.ex_origKey == KeyCode::FN_KEY_3) {
      *(params.key) = KeyCode::F3;
    }
    if (params.ex_origKey == KeyCode::FN_KEY_4) {
      *(params.key) = KeyCode::F4;
    }
    if (params.ex_origKey == KeyCode::FN_KEY_5) {
      *(params.key) = KeyCode::F5;
    }
    if (params.ex_origKey == KeyCode::FN_KEY_6 || params.ex_origKey == KeyCode::KEY_6) {
      *(params.key) = KeyCode::F6;
    }
    if (params.ex_origKey == KeyCode::FN_KEY_7 || params.ex_origKey == KeyCode::KEY_7) {
      *(params.key) = KeyCode::F7;
    }
    if (params.ex_origKey == KeyCode::FN_KEY_8 || params.ex_origKey == KeyCode::KEY_8) {
      *(params.key) = KeyCode::F8;
    }
    if (params.ex_origKey == KeyCode::FN_KEY_9 || params.ex_origKey == KeyCode::KEY_9) {
      *(params.key) = KeyCode::F9;
    }
    if (params.ex_origKey == KeyCode::FN_KEY_0 || params.ex_origKey == KeyCode::KEY_0) {
      *(params.key) = KeyCode::F10;
    }
    if (params.ex_origKey == KeyCode::FN_KEY_MINUS || params.ex_origKey == KeyCode::MINUS) {
      *(params.key) = KeyCode::F11;
    }
    if (params.ex_origKey == KeyCode::FN_KEY_EQUAL) {
      *(params.key) = KeyCode::F12;
    }
    // 追加その2:終わり ======
  }

ここにこのようにまとめれば同ファイルのorg_pqrs_KeyRemap4MacBook::remap_core(const RemapParams ¶ms)も、files/prefpane/sysctl.xmlの修正も必要ない。ただ、左Fnキー・右Fnキー(元右shiftキー)を押しながらの数字キーなどのKeyCodeがそれぞれ変わったりするので、次のファイルも編集した。

src/kext/keycode.cpp

  namespace KeyCode {
    enum KeyCode {
      
      // ※中略※
      
      // 追加始まり ======
      FN_KEY_1 = 18,
      FN_KEY_2 = 19,
      FN_KEY_3 = 20,
      FN_KEY_4 = 21,
      FN_KEY_5 = 23,
      FN_KEY_6 = 71,
      FN_KEY_7 = 89,
      FN_KEY_8 = 91,
      FN_KEY_9 = 92,
      FN_KEY_0 = 75,
      FN_KEY_MINUS = 81,
      FN_KEY_EQUAL = 24,
      // 追加終わり ======
      
      // ※中略※
      
    };
  }

保存してmakeしてpkgインストールして有効化しておしまい

ソースのトップディレクトリで
make clean all
KeyRemap4MacBook-3.2.0.pkgが作成されるがそれをインストール(アップグレード)しても自分の環境(Mac OS 10.4.11)ではシステム環境設定に設定項目が増えない。ソースからmakeしたものではなくpkgダウンロードして最初にインストールしたときは項目追加されたんだけど。
error: There is no SDK at specified SDKROOT path '/MacOSX10.4u.sdk'
が出ているのが原因かなと思ったけど今はあまり調べずに
sudo sysctl -w keyremap4macbook.remap.hhkmode=1
で設定を有効化した。もちろん再起動とかしても設定は残る。

MacBookキーボードに最初からある左Fnキーと右のshiftキーをFnキーにしたもの、それぞれの挙動が少し違って無理矢理合わせている感があるな…。数字キーなどでは挙動が同じになるようにしたが、実際のF7キーとかをそれぞれのFnキーと合わせて押すと挙動が変わる。が、F7キーとかHHKBにはないし使わないし問題ないやってことで今回はこれにて終了。また追記するかもしれない。でも、当初の目的(deleteと「\」の入れ替え)以上のことはできた。