Ubuntu Desktop + Apple Keyboard で親指シフトを使う

## はじめに

最近、久しぶりに自宅でPCを組んでUbuntuをインストールしました。
僕は普段はMacを使っていて、日本語入力には親指シフトを使っている[^1]ので、IFを統一するため自作PCのUbuntu上でもApple Keyboardと親指シフトを使いたいと考えたのですが、意外に苦戦してしまったので備忘録として書きます。
[^1]: Mac上ではLacailleを使用しています。

結果としては以下の環境で、親指シフトでの日本語入力ができています。

* OS: Ubuntu Desktop 18 LTS
* IME: fcitx
* 親指シフト入力ソフト: [oyainput](https://www.inworks.jp/download/oyainput)
* キーボード: Apple Keyboard (JIS配列 テンキー付き Model No: A1243)

以下、Apple Keyboard で oyainput を使って親指シフト入力をするために行った設定について記述します。
なお、fcitx等の設定については既にネット上に情報がいろいろあるので、ここでは割愛します。

## 設定手順

### キーボード設定
まず、以下を実行し、

```bash
$ sudo dpkg-reconfigure keyboard-configuration
```

各項目に対して以下のように選択します。

* キーボードモデル: Apple Aluminum(JIS)
* 国: 日本語
* レイアウト: 日本語
* AltGrとして機能させるキー: キーボード配置のデフォルト
* コンポーズキー: なし
* Xサーバを強制終了するのにControl+Alt+BackSpaceを使いますか?: いいえ

### oyainputインストール

通常のJISキーボードであれば問題ないのですが、Apple Keyboard で oyainput を使うためにはソースに若干修正を加える必要があります。

```bash
$ git clone https://github.com/inwskatsube/oyainput.git
```

でソースを落としたら `src/config.c` で定義されている`keyNameCodeTable` という配列に２行追加します。
diffを示します。

```diff
--- a/src/config.c
+++ b/src/config.c
@@ -165,7 +165,9 @@ KEYNAMECODE keyNameCodeTable[] = {
        {"F21", KEY_F21},
        {"F22", KEY_F22},
        {"F23", KEY_F23},
-       {"F24", KEY_F24}
+       {"F24", KEY_F24},
+       {"HANGUEL", KEY_HANGUEL},
+       {"HANJA", KEY_HANJA}
 };
 
 MOJINAMECODE mojiNameCodeTable[] = {
```

なぜハングルのキーを追加するかというと、Apple Keyboard(JIS)は外見は日本語キーボードですが電気的にはハングルのキーボードらしい[^2]ためです。
Macだとドライバが吸収するんでしょうが、非MacなOSにとってはそんなん知らないですよね(^^;
[^2]: 少なくとも僕が持っているModel No:A1243では。Macbookとかは多分違うと思いますが、未確認。

コードを修正したら、あとは通常通り`make`して`sudo make install`してインストールは完了。

あとはoyainputの設定ファイルですが、初回起動時に`~/.oyainputconf`として作成されるので、僕の場合は

```
LOYAKEY=SPACE
ROYAKEY=HANGUEL
```
として、左親指キーをスペースに、右親指キーを「かな」キーに割り当てています。

設定手順としては以上です。

## おまけ: Appe Keyboard(JIS)がハングルキーボードであることの確認

OSが内部的にキーをどのように認識しているか調べるための `evtest` というコマンドがあります。（入っていない場合、Ubuntuであれば apt installで入ります。）

実行にはroot権限が必要になります。sudo付きで実行してみると

```bash:evtest実行例
$ sudo evtest
No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0:    Power Button
/dev/input/event1:    Power Button
/dev/input/event2:    Logitech M570
/dev/input/event3:    Apple Inc. Apple Keyboard
/dev/input/event4:    Logitech M505/B605

### 中略 ###

Select the device event number [0-17]: 3 # Apple Keyboardの番号(ここでは3)を入力

Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0x5ac product 0x251 version 0x111
Input device name: "Apple Inc. Apple Keyboard"
Supported events:
  Event type 0 (EV_SYN)
  Event type 1 (EV_KEY)
    Event code 1 (KEY_ESC)
    Event code 2 (KEY_1)

### 中略 ###

Testing ... (interrupt to exit)
Event: time 1543753231.311830, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70028
Event: time 1543753231.311830, type 1 (EV_KEY), code 28 (KEY_ENTER), value 0
Event: time 1543753231.311830, -------------- SYN_REPORT ------------
```

となり、ここで「英数」キー、「かな」キーをそれぞれ押してみます。

```bash:「英数」キーを押した時の出力
Event: time 1543752452.435055, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70091
Event: time 1543752452.435055, type 1 (EV_KEY), code 123 (KEY_HANJA), value 1
Event: time 1543752452.435055, -------------- SYN_REPORT ------------
Event: time 1543752452.507052, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70091
Event: time 1543752452.507052, type 1 (EV_KEY), code 123 (KEY_HANJA), value 0
Event: time 1543752452.507052, -------------- SYN_REPORT ------------
```

```bash:「かな」キーを押した時の出力
Event: time 1543752456.459106, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70090
Event: time 1543752456.459106, type 1 (EV_KEY), code 122 (KEY_HANGUEL), value 1
Event: time 1543752456.459106, -------------- SYN_REPORT ------------
Event: time 1543752456.531105, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70090
Event: time 1543752456.531105, type 1 (EV_KEY), code 122 (KEY_HANGUEL), value 0
Event: time 1543752456.531105, -------------- SYN_REPORT ------------
```
というわけで、「英数」キーは`KEY_HANJA`、「かな」キーは`KEY_HANGUEL`として認識されていることがわかりました。

さきほど oyainput のソースに追加した2行

```
       {"HANGUEL", KEY_HANGUEL},
       {"HANJA", KEY_HANJA}
```
のうち、右側の定数がさきほどのキーコードに対応しています。
左側は .oyinputconf 内で指定するための文字列なので任意であり、キーの刻印に合わせてわかりやすく `"EISU"`、`"KANA"`などとしても良いのですが、そうすると別のキーボードで使うときに混乱を招きそうなのが悩ましいところですね。