こんにちは、ナナオです。
前回の記事で、キーボード上でマウスジェスチャを扱えるようにしました。
今回はそれを発展させて、BT接続先(Windows / Mac)ごとにレイヤとジェスチャを切り替えるようにします。
BTの接続先ごとの対応
前の記事でマウスジェスチャ自体は実装できたのですが、私の環境ではBT接続先ごとにOSを行き来することが多くあるので、それに対応します。
どのように切り替えを行うかですが、以下のような手順で実装しました。
- BT接続先によってデフォルトレイヤを変更するマクロを実装する
- 接続先切り替えを行っているキーを、設定したマクロに置き換える
- Windows用のデフォルトレイヤーと別にMac用のデフォルトレイヤを定義する
- Windows向けに組んでいた複数のレイヤを、Mac向けに複製しました
- Windowsでctrlとして定義していた部分をcommandに変更するなどの異なる定義を行いました
1. BT接続先によってデフォルトレイヤを変更するマクロを実装する
Behaviorの&btと&toを使って、BT接続先の切り替えとレイヤーの切り替えを一回でできるマクロを作成します。
(= 接続先を変えた瞬間に、使うキーレイアウトも切り替える)
私の場合、BT接続先は0と1がWindows用のプロファイル、2がMac用のプロファイルになっているので、以下のように設定しました。
&toに設定している5レイヤは別途定義します。
2. マクロに置き換え
接続先切り替えを行っているキーの設定を変更します。
私の場合、接続先切り替えを行うキーをまとめたレイヤーをlayer_4に定義しています。
3. Macのデフォルトレイヤを定義
keymap editorで「Duplicate layer」という項目を選択すると、現在定義されているものと同じレイヤーを複製することができます。
これを使って、Windows用に定義していたレイヤを複製します。
Windows用のデフォルトレイヤが0レイヤ、Mac用のデフォルトレイヤは5レイヤに定義しています。
マウスジェスチャのMac対応
Windowsの仮想デスクトップ起動のコマンドと、Macのミッションコントロールの起動コマンドは異なるため、別々で定義する必要があります。
変更ファイルは以下の通りです。
- /config/keymap.keymap
- /boards/shields/torabo_tsuki_lp/torabo_tsuki_lp.dtsi
- /boards/shields/torabo_tsuki_lp/torabo_tsuki_lp_right.overlay
keymap.keymap
以下のようにMac用のマウスジェスチャを定義します。
ついでに前回実装したWindows用のマウスジェスチャもわかりやすい名前に変更しておきます。
/ {
// ...中略...
// Windows用とMac用の二つを定義する
zip_mouse_gesture_for_win: zip_mouse_gesture_for_win {
compatible = "zmk,input-processor-mouse-gesture";
#input-processor-cells = <0>;
enable-eager-mode;
prev_tab {
pattern = <GESTURE_RIGHT>;
bindings = <&kp LC(LS(TAB))>;
};
next_tab {
pattern = <GESTURE_LEFT>;
bindings = <&kp LC(TAB)>;
};
vdesk {
pattern = <GESTURE_DOWN>;
bindings = <&kp LG(TAB)>;
};
vdesk_send_next {
pattern = <GESTURE_UP>;
bindings = <&kp LG(LC(LS(RIGHT)))>;
};
};
zip_mouse_gesture_for_mac: zip_mouse_gesture_for_mac {
compatible = "zmk,input-processor-mouse-gesture";
#input-processor-cells = <0>;
enable-eager-mode;
vdesk_prev {
pattern = <GESTURE_RIGHT>;
bindings = <&kp LC(LEFT)>;
};
vdesk_next {
pattern = <GESTURE_LEFT>;
bindings = <&kp LC(RIGHT)>;
};
vdesk {
pattern = <GESTURE_DOWN>;
bindings = <&kp LC(UP)>;
};
vdesk_down {
pattern = <GESTURE_UP>;
bindings = <&kp LC(DOWN)>;
};
};
// ...中略...
};
torabo_tsuki_lp.dtsi
layer_listenersの設定を変更して、マウスジェスチャのオンオフを設定するレイヤを定義します。
前回実装したのでinclude文は省略しています。
/ {
// ...中略...
layer_listeners {
compatible = "zmk,layer-listeners";
gesture_win {
layers = <4>; // Windowsでマウスジェスチャを使う際のレイヤ
bindings = <&mouse_gesture_on &mouse_gesture_off>;
};
gesture_mac {
layers = <9>; // Macでマウスジェスチャを使う際のレイヤ
bindings = <&mouse_gesture_on &mouse_gesture_off>;
};
};
// ...中略...
};
torabo_tsuki_lp_right.overlay
keymap.keymapで定義したマウスジェスチャとレイヤを紐づけます。
&pointing_listener {
// ...中略...
// Windows用のジェスチャレイヤとジェスチャを紐づける
gesture_win {
layers = <4>;
input-processors = <
&zip_mouse_gesture_for_win
&zip_xy_scaler 0 1
>;
};
// Mac用のジェスチャレイヤとジェスチャを紐づける
gesture_mac {
layers = <9>;
input-processors = <
&zip_mouse_gesture_for_mac
&zip_xy_scaler 0 1
};
};
まとめ
BT接続先ごと・OSごとにレイヤを分けて使うことで、WindowsとMac間の異なる挙動を最小にすることができます。
特に「OSごとにショートカットを思い出す」という認知コストがなくなるのがかなり快適でした。
また、マウスジェスチャを実装することでMacでよくあるトラックパッドの三本指の操作をキーボード単体で再現することができ、打鍵時の移動を最小限にすることができました。
(マジックパッドあるけどもういらないかもな…)
ということで今回はこれで👍