こんにちは、ナナオです。

前回の記事で、キーボード上でマウスジェスチャを扱えるようにしました。

今回はそれを発展させて、BT接続先(Windows / Mac)ごとにレイヤとジェスチャを切り替えるようにします。

BTの接続先ごとの対応

前の記事でマウスジェスチャ自体は実装できたのですが、私の環境ではBT接続先ごとにOSを行き来することが多くあるので、それに対応します。

どのように切り替えを行うかですが、以下のような手順で実装しました。

  1. BT接続先によってデフォルトレイヤを変更するマクロを実装する
  2. 接続先切り替えを行っているキーを、設定したマクロに置き換える
  3. 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でよくあるトラックパッドの三本指の操作をキーボード単体で再現することができ、打鍵時の移動を最小限にすることができました。

(マジックパッドあるけどもういらないかもな…)

ということで今回はこれで👍