LalaPad Gen2 のMac/Windowsスクロール速度をZMKマクロで自動切替する

LalaPad Gen2 を Mac と Windows で使い回していると、プロファイルを切り替えるたびにスクロール速度が気になっていました。Mac は慣性スクロールがあって速すぎる。Windows はデフォルト(1.0x)でちょうどいい。どうにかできないものかと思っていたところ、@NetShini さんが zip_dyn_scale_set というbehavior を教えてくれました。

キー押下時に指定した速度設定に一発で変更できるとのこと。これを BT 切り替えのついでに呼べばよさそうということで実装しました。

実装したマクロ

BT プロファイル切り替えマクロに zip_dyn_scale_set を組み合わせ、OS ごとにスクロールスケールが自動で変わるようにしました。

  • to_mac(プロファイル 0): BT 切り替え + スクロールスケールを 0.2x(最小値)に設定
  • to_win(プロファイル 1): BT 切り替え + スクロールスケールを 1.0x(デフォルト)に復元

プロファイル番号とスケール値は #define 定数にまとめており、キーマップ冒頭の値を変えるだけで調整できます。

keymap.c
#define MAC_BT_PROFILE 0
#define WIN_BT_PROFILE 1
#define MAC_SC_SCALE   2   // 0.2x — これ以上下げられない
#define WIN_SC_SCALE   10  // 1.0x(デフォルト)

スクロールスケールの仕様

zmk,behavior-zip-dynamic-scale のスケール値は x10 整数フォーマットで指定します(10 = 1.0x)。

ただしこの範囲は zmk-driver-iqs9151 の Kconfig で [2, 50] にハードコードされており、0.2x が設定できる最小値です。ここで詰まりました。

スケール値の早見表

2 = 0.2x(最小) / 10 = 1.0x(デフォルト) / 50 = 5.0x(最大)

0.2x よりさらに遅くしたい場合の選択肢

0.2x でもまだ速いと感じる場合、下限を拡張する方法はあります。ただしどれも zmk-driver-iqs9151 のフォーク・改修が必要です。

A. zmk-driver-iqs9151 をフォークして Kconfig 範囲を拡張

Kconfig の range 2 50range 0 50 などに変更し、west.yml でフォーク版を参照します。既存の to_mac / to_win マクロはそのまま使えますが、上流の更新を手動で追い続けないといけないのが難点。

B. zmk,input-processor-scaler を重ねがけ

shield の dtsi に静的スケーラー(x-divisor = <N>)を追加し、動的スケーラーと乗算で重ねます。たとえば静的スケーラーで 1/5 を追加した場合、Mac 時は zip_dyn_scale_set ZDS_SC 2(0.2x)で合計 0.04x になり、Win 時は zip_dyn_scale_set ZDS_SC 50(5.0x)で打ち消して 1.0x に戻せます。

スケールの下限をほぼ任意に下げられますが、dtsi の変更が zmk-driver-iqs9151 内にあるためこちらもフォーク必須です。設計もやや複雑になります。

C. IQS9151 ドライバーの感度設定を調整

IQS9151 チップの感度をドライバー設定で下げる方法です。ハードウェアレベルの対応なので一番根本的ではあります。ただ、そもそも設定項目が存在するかどうかの確認から始める必要があって、ドライバー改修になる可能性も高い。3択のなかでコスパが一番悪いです。

ファームウェアはフォークせず Karabiner Elements で解決することにした

A・B・C いずれも zmk-driver-iqs9151 のフォーク・改修が必須で、上流追従のコストを考えると正直しんどいです。

なので、Mac 側は Karabiner Elements のスクロール倍率設定で対処することにしました。Karabiner Elements はデバイスごとに設定を分けられるので、LalaPad だけスクロール倍率を下げています。他のマウスには影響しません。ZMK マクロで BT 切り替えとスケール変更をセットにして、細かい調整は Karabiner Elements 側でやる構成です。

まとめ
  • BT プロファイル切り替えと同時にスクロールスケールを変えるマクロを実装しました(Mac: 0.2x / Win: 1.0x)
  • zmk-driver-iqs9151 のスケール値は [2, 50] にハードコードされており、動的スケーラー単体では 0.2x が最小値です
  • のちに dtsi に zip_scroll_scaler が既に定義されていることがわかり、フォークなしで解決しました(↓追記参照)

追記

記事を公開後、LalaPad Gen2 の作者 @NetShini さんから補足をいただきました。

dtsi に zip_scroll_scaler がすでに定義されているとのこと。この値を調整するだけでスクロール速度を変えられました。全体に影響することを許容すればフォークは不要で対応可能でした。

変更箇所
// lalapadgen2.dtsi(左右・lowspeedmode 計4箇所)
&zip_scroll_scaler 1 60>,   // 1/12 → 1/60(5倍遅く)

// lalapadgen2.keymap
#define WIN_SC_SCALE   50    // 10 → 50(Win の速度を現状維持)

これで Karabiner Elements のスクロール設定は不要になりました。BT 切り替えのタイミングでスクロール速度も自動で切り替わります。

Mac でさらにスクロールを遅くしたい場合は、dtsi の 60 をさらに大きくすれば対応できます。ただし Win 側の速度にも影響するので、WIN_SC_SCALE を上げて打ち消す必要があります。WIN_SC_SCALE はすでに上限(50)なので、上げすぎると Win 側も遅くなる点に注意です。

shotaste
shotaste

今は使ってないBT プロファイルに影響出るのが嫌だったんだけど、まぁまだ使ってないから、登録したタイミングでまたマクロついかすればよいか。。。という判断にした