QMK Firmware で英字配列のまま Windows と macOS 両対応の IME のオンオフキーを作る

## 概要

Keebio の自作キーボードキット Iris を QMK Firmware でカスタマイズして使っています。
macOS では Mac の日本語キーボードのように、左右の親指キーに IME のオン・オフ (LANG1, LANG2) を割り当てることで、トグル無しに快適な日本語切り替えができます。しかし、Windows では英字キーボードに設定するとこれらのキーが認識されないため、仕方なく Ctrl+Space で切り替えるようにしていました。

対処法としては、日本語配列を英字配列風にカスタマイズする方法、AX 配列をインストールする方法など色々あるようですが、今回はなるべく環境をいじらないで実現できる方法として、英字配列でも認識される F12 以降のファンクションキーを LANG1, LANG2 と同時に送信するようにファームウェアの書き換えを行います。

## 事前準備

QMK Firmware のリポジトリを clone してセットアップを行います。方法は公式の[ドキュメント](https://docs.qmk.fm/#/)をどうぞ。

### キーマップを作る

`keyboards/keebio/iris/keymaps/default` などの元にする設定のディレクトリをコピーし、適当な名前をつけます (本記事では `keyboards/keebio/iris/keymaps/ryohey` ディレクトリ)

## 設定方法

コードはこちら
https://github.com/ryohey/qmk_firmware/commit/deb4e582ec660ec692c019bebce798e725b24bc0

keymap.c にカスタムキーコード `IMEON`、`IMEOFF` を追加し、キーマップに指定します。

```c:keymap.c
enum custom_keycodes {
  QWERTY = SAFE_RANGE,
  LOWER,
  RAISE,
  ADJUST,
  IMEON,
  IMEOFF,
};
```

```c:keymap.c
#define KC_IMEON IMEON
#define KC_IMEOFF IMEOFF
```

```c:keymap.c
  [_QWERTY] = LAYOUT_kc(
  //,----+----+----+----+----+----.              ,----+----+----+----+----+----.
     ESC , 1  , 2  , 3  , 4  , 5  ,                6  , 7  , 8  , 9  , 0  ,BSPC,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
     TAB , Q  , W  , E  , R  , T  ,                Y  , U  , I  , O  , P  ,    ,
  //|----+----+----+----+----+----|              |----+----+----+----+----+----|
     LCTL, A  , S  , D  , F  , G  ,                H  , J  , K  , L  ,SCLN,ENT,
  //|----+----+----+----+----+----+----.    ,----|----+----+----+----+----+----|
     LSFT, Z  , X  , C  , V  , B  ,IMEOFF,  IMEON, N  , M  ,COMM,DOT ,SLSH,    ,
  //`----+----+----+--+-+----+----+----/    \----+----+----+----+----+----+----'
                       LGUI,LOWR,SPC ,         RSFT,RASE,RALT
  //                  `----+----+----'        `----+----+----'
  ),
```

`process_record_user` に `IMEON`、`IMEOFF` が押されたときに複数のキーコードを送信する処理を追加します。


```c:keymap.c
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  switch (keycode) {
    case QWERTY:
      if (record->event.pressed) {
        persistent_default_layer_set(1UL<<_QWERTY);
      }
      return false;
      break;
    case LOWER:
      if (record->event.pressed) {
        layer_on(_LOWER);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      } else {
        layer_off(_LOWER);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      }
      return false;
      break;
    case RAISE:
      if (record->event.pressed) {
        layer_on(_RAISE);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      } else {
        layer_off(_RAISE);
        update_tri_layer(_LOWER, _RAISE, _ADJUST);
      }
      return false;
      break;
    case ADJUST:
      if (record->event.pressed) {
        layer_on(_ADJUST);
      } else {
        layer_off(_ADJUST);
      }
      return false;
      break;
    case IMEON:
      if (record->event.pressed) {
        register_code(LANG1);
        register_code(F14);
      } else {
        unregister_code(LANG1);
        unregister_code(F14);
      }
      break;
    case IMEOFF:
      if (record->event.pressed) {
        register_code(LANG2);
        register_code(F15);
      } else {
        unregister_code(LANG2);
        unregister_code(F15);
      }
      break;
  }
  return true;
}
```

## Firmware の書き込み

```sh
qmk flash --keyboard keebio/iris/rev2 --keymap ryohey --bootloader avrdude
```

make での書き方

```sh
make keebio/iris/rev2:ryohey:avrdude
```

## 結果

Windows 側で認識されました。

![Fkey.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31477/012398c3-15f0-aa8c-5198-6f80308d2fbb.png)

## Windows での設定

IME で F14, F15 に IME の有効化、無効化を設定します。

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/31477/17e93644-880a-a767-0af8-d4603704064d.png)

## 追記

macOS でターミナルを利用しているときに F13 がなにかのキーとして入力されてしまうので、F14, F15 を使うように変更しました。

## 追記2

クラムシェルモードで使っていたので気が付かなかったのですが、F14, F15 は画面の明るさを変えるショートカットに割り当てられているようです。F24 まであるので、何にも割り当てられていないキーを探すとよさそうです。