マウスカーソルが吹っ飛ぶ

Linuxに移って快適なデスクトップライフを過ごしていたのだけれど、実は悩んでることが2つあった。

  1. chrome/electronアプリがたまにハングする
  2. マウスカーソルが吹っ飛ぶ

ランダムで発生するように見えて、なにかのバグだろうし時間が経てばアップデートが降ってくるだろうと楽観的に思ってたのだが一向に直らない。

ソフトウェアそのもののバグじゃなくて、ハードウェアやセットアップ環境くささが出てきたので本腰を入れて改善しようと思った。

この2つ実は一緒なんじゃないかと思ってた、wayland周りでchrome/electronでハングが発生してその結果マウスカーソルが吹っ飛ぶとか。

でも調べているとchrome/electronアプリを開いてなくてもマウスカーソルが吹っ飛ぶことがわかったので別々の事象だと判明した。

AIに手伝ってもらいながら原因を特定していく。

色々切り分けていくうちに、ノートPC の画面を閉じてクラムシェルとして使用しているときに発生することを突き止めた。

閉じることで何かが悪さをするらしい。

これを特定するために、AIにすすめられたlibinputを起動しながらマウスカーソルが吹っ飛ぶのを待っていると次のログが出てきた。

$ nix shell nixpkgs#libinput
$ sudo libinput debug-events
...
...
-event9 TABLET_TOOL_PROXIMITY +274.566s 97.11*/245.13* tilt: 0.00*/0.00* pressure: 0.00* pen ('<unnamed>', 0, id 0) proximity-in axes:pt btn:S event9 TABLET_TOOL_PROXIMITY +274.614s 97.11 /245.13 tilt: 0.00 /0.00 pressure: 0.00 pen ('<unnamed>', 0, id 0) proximity-out event9 TABLET_TOOL_PROXIMITY +314.638s 98.14*/241.10* tilt: 0.00*/0.00* pressure: 0.00* pen ('<unnamed>', 0, id 0) proximity-in axes:pt btn:S event9 TABLET_TOOL_PROXIMITY +314.685s 98.14 /241.10 tilt: 0.00 /0.00 pressure: 0.00 pen ('<unnamed>', 0, id 0) proximity-out event9 TABLET_TOOL_PROXIMITY +368.913s 72.86*/232.00* tilt: 0.00*/0.00* pressure: 0.00* pen ('<unnamed>', 0, id 0) proximity-in axes:pt btn:S event9 TABLET_TOOL_PROXIMITY +368.961s 72.86 /232.00 tilt: 0.00 /0.00 pressure: 0.00 pen ('<unnamed>', 0, id 0) proximity-out event9 TABLET_TOOL_PROXIMITY +406.238s 99.00*/242.03* tilt: 0.00*/0.00* pressure: 0.00* pen ('<unnamed>', 0, id 0) proximity-in axes:pt btn:S event9 TABLET_TOOL_PROXIMITY +406.288s 99.00 /242.03 tilt: 0.00 /0.00 pressure: 0.00 pen ('<unnamed>', 0, id 0) proximity-out event9 TABLET_TOOL_PROXIMITY +413.223s 95.43*/246.95* tilt: 0.00*/0.00* pressure: 0.00* pen ('<unnamed>', 0, id 0) proximity-in axes:pt btn:S event9 TABLET_TOOL_PROXIMITY +413.272s 95.43 /246.95 tilt: 0.00 /0.00 pressure: 0.00 pen ('<unnamed>', 0, id 0) proximity-out event9 TABLET_TOOL_PROXIMITY +485.054s 97.95*/234.64* tilt: 0.00*/0.00* pressure: 0.00* pen ('<unnamed>', 0, id 0) proximity-in axes:pt btn:S event9 TABLET_TOOL_PROXIMITY +485.102s 97.95 /234.64 tilt: 0.00 /0.00 pressure: 0.00 pen ('<unnamed>', 0, id 0) proximity-out event9 TABLET_TOOL_PROXIMITY +575.813s 96.27*/224.69* tilt: 0.00*/0.00* pressure: 0.00* pen ('<unnamed>', 0, id 0) proximity-in axes:pt btn:S event9 TABLET_TOOL_PROXIMITY +575.861s 96.27 /224.69 tilt: 0.00 /0.00 pressure: 0.00 pen ('<unnamed>', 0, id 0) proximity-out -event19 KEYBOARD_KEY +588.106s *** (-1) pressed event19 KEYBOARD_KEY +588.324s *** (-1) pressed

ここから、AI曰く

GPD Win Max 2系は画面にペン対応のデジタイザーが内蔵されています。蓋を閉じると画面パネルがキーボード面(金属パーツやスピーカー、ヒンジ機構など)に近接し、それをデジタイザーが「ペンが近づいた(proximity-in)」と誤検知しています。ペンは実際には存在しないので座標は毎回ほぼ同じ場所(センサーとキーボード側の金属部品が最も近接する固定位置)になり、niriがその絶対座標をカーソル位置としてワープさせている、という流れです。タッチパッドを切っても直らなかったのは当然で、犯人はタッチパッドではなくこのペン/タブレットデバイスだったわけです。

ということだ。なるほどね。そんなHW仕様わすれてたよ。

最終的に、開閉に応じてデジタイザー、タッチパッド、タッチスクリーン、内部モニターをトグルするようにniriの設定にスクリプトを仕込んだ。

input {
	touchpad {
        // lid-toggle
        ...
    }

    touch {
        // lid-toggle
    }

    tablet {
        // lid-toggle
    }
}
output "eDP-1" {
    // lid-toggle
    ...
}

switch-events {
    lid-close {
        spawn "sh" "-c" "niri msg output eDP-1 off; sed --follow-symlinks -i -E 's|^([[:space:]]*)// lid-toggle[[:space:]]*$|\\1off // lid-toggle|' ~/.config/niri/config.kdl; notify-send -u normal 'Turn off laptop devices'";
    }
    lid-open {
        spawn "sh" "-c" "niri msg output eDP-1 on; sed --follow-symlinks -i -E 's|^([[:space:]]*)off // lid-toggle[[:space:]]*$|\\1// lid-toggle|' ~/.config/niri/config.kdl; notify-send -u normal 'Turn on laptop devices'";
    }
}

offにするようにしてから、今のところ問題は再発してない。

chrome/electronがハングするのは別問題なので、今度はそっちを究明したい。