Wine Wayland、ポインタワープ新方式へ

Linuxで一人称視点シューターを動かすと、視点を回した瞬間にカクついたり、カメラが画面中央に張り付いたりする。その原因がWayland側にあり、Wineのネイティブドライバが今週その症状を根本から書き換えた。

Wine Wayland、ポインタワープ新方式へ

Linuxで一人称視点シューターを動かすと、視点を回した瞬間にカクついたり、カメラが画面中央に張り付いたりする。その原因がWayland側にあり、Wineのネイティブドライバが今週その症状を根本から書き換えた。


マージされたのは「カーソルの動かし方」そのもの

WineのGitLab上で、マージリクエスト!10830「winewayland: Use wp_pointer_warp_v1 for SetCursorPos when available」がmasterに取り込まれた。タイトルが示す通り、SetCursorPosの実装をまるごと新しいプロトコルに差し替える内容となる。

Windowsアプリケーションがマウスカーソルを任意の座標へ飛ばすとき、内部ではSetCursorPosというAPIが呼ばれる。FPSで視点を回すとき、ウィンドウ内のUI要素にカーソルを自動配置するとき、無限にパンするマップ操作をするとき、どれもこのAPIが裏で動いている

ところがWayland環境では、長らくこのAPIに対応する手段がなかった。専用のワーププロトコルが存在しなかったためだ。

「ロックして、ヒントを置いて、解除する」という回避策

Wineの既存実装は、zwp_locked_pointer_v1という別のプロトコルが持つset_cursor_position_hintの副作用を利用していた。マージリクエストの本文にはこう書かれている。

既存のSetCursorPos実装は、zwp_locked_pointer_v1set_cursor_position_hintが持つ副作用を悪用している。ポインタを一瞬ロックし、座標ヒントを設定して、すぐ解除する仕組みだ。コンポジタはヒントをロック対象サーフェスの境界内に切り詰めるため、その範囲外への移動要求は黙って捨てられる。さらにロックと解除のサイクルには微妙なタイミング問題と副作用が残る。

要するに「カーソルをワープさせる専用の道がないので、ロック機能の置き土産を借りる」というやり方だった。ウィンドウの外にカーソルを飛ばしたい場面では、座標が黙って無視される。FPSでカメラが中央に張り付いてしまう症状の正体はここにある。一瞬のロック・解除がフレーム単位で連発されれば、入力の遅延や挙動の揺らぎも出る。

2025年6月に登場した専用プロトコル

この袋小路を抜ける道は、2025年6月に開放された。wayland-protocols 1.45がstagingにwp_pointer_warp_v1を追加したのだ。

このグローバルインターフェースは、アプリケーションがwl_surfaceに対する相対座標へポインタの移動を要求できるようにする。

直接的なカーソルワープのプリミティブが、ロックも解除もなしに手に入った。SDLは公開直後に対応を済ませている。コンポジタ側もKWin 6.4以降、Mutter 49以降、wlroots 0.19以降がすでに実装済みだ。

舞台は揃っていた。あとはWineが乗り換えるだけだった。

ザカリア・ハブリのマージリクエスト

書き換えを進めたのはザカリア・ハブリ(Zakaria HABRI)。約1週間前にマージリクエストを提出し、議論と修正を経て、Wineプロジェクトのリードであるアレクサンドル・ジュリアード(Alexandre Julliard)が今週はじめにマージした。

差分のテスト記録も具体的だ。

KWin 6.6.4(Plasma Wayland環境)では、プロトコルが広告され、新しい経路が発火する。WINEDEBUG=+waylanddrvwarp_pointer hwnd=...のトレースを確認した。niri 26.04(プロトコル未対応)ではフォールバック経路がそのまま動作する。

新しい経路が機能することと、未対応コンポジタでも壊れないことの両方が確認されている。

既存の回避策はフォールバックとして残る

新プロトコルに対応していないコンポジタや、何らかの問題でワープが拒否された場合のために、既存のロック/ヒント方式は予備の経路として残された。wp_pointer_warp_v1を広告するコンポジタ上でのみ新方式が動き、そうでなければ従来通り動く。

この設計は地味だが重要だ。Wine Waylandドライバはまだ実験段階のユーザーが多く、DISPLAY=を外して試している人もいれば、Xwayland経由で使っている人もいる。コンポジタごとの対応状況にもばらつきがある。「対応なら使う、なければ従来通り」の二段構えで、どの環境でも体感が下がらないようにしてある。

反映は2日後のWine 11.9

Wineは2週間ごとの開発リリースを続けている。直近のWine 11.8は5月1日に公開された。次のWine 11.9は5月15日、つまり今週金曜の予定だ。マージは間に合っているため、wp_pointer_warp_v1対応はそこに含まれる。


Wineの安定版は年1回。2026年1月に出たWine 11.0がWayland対応を「実験段階の先」へ押し上げたが、SetCursorPos周りの挙動は依然として粗い部分が残っていた。今回の差し替えで、ネイティブWayland環境でWindowsゲームを動かす際の最大級の不満点のひとつが解消される。

ValveはWine 11ベースのProton 11をベータ提供中だ。Proton側がWine 11.9相当の改善を取り込むのはもう少し先になる。安定版のWine 12は2027年1月の予定で、それまでは2週間ごとの開発リリースが改善の入り口になる。

Steam DeckやArchベースの環境でWaylandセッションを常用しているユーザーにとって、来週からの2週間は静かな転換点になる。FPSの視点が滑らかに動いた瞬間、誰もそれを「Waylandの新プロトコルのおかげ」とは思わない。入力処理の改善は、気づかれないときに最もよく効いている。


参照元

他参照

関連記事

この記事を共有する