プログラミング
Waylandでの複数のマウスカーソル
Multiple Mouse Cursors in Wayland (blinry.org)
要約
この記事は、LinuxおよびWayland環境におけるマルチシート(複数のユーザーが単一のデスクトップ環境を共有し、それぞれが独立した入力デバイスを持つこと)の現在のサポート状況を調査したものです。筆者は、ペアプログラミングやゲームなど、複数のマウスカーソルが協調して動作する可能性を探求し、Waylandプロトコル、コンポジタ、GUIライブラリ、アプリケーションにおけるサポートの現状と課題を詳細に解説しています。
全文翻訳
Waylandでのマルチシート 2026-07-28 / blinry / CC BY-SA 4.0 / tech, software
1台のコンピュータに複数のマウスを接続し、1つのデスクトップ環境内に複数のマウスカーソルを表示するというアイデアに魅了されてきました!この3週間、LinuxとWaylandでそれが現在どれだけサポートされているかを調査しました。驚くほど素晴らしい結果が得られました。このブログ記事と同時に、私は「マルチシート」サポートを追加または改善する、いくつかの小さなツールとパッチ済みのライブラリを公開しています。しかし、このパズルの多くのピースはまだ不完全または欠落しています。ブログ記事全体を通して、私は「📝」の絵文字でいくつかの「オープンプロジェクトのアイデア」をマークしました。この記事を公開することで、この分野を一緒に探求し、拡大することに興味のある人々を見つけたいと思っています。もしあなたがそうなら、ぜひ連絡してください!(はい、私のデフォルトのマウスカーソルは亀です。)
なぜこれが必要なのでしょうか?
これはコンピュータのやや難解な使い方であることは認めます。しかし、聞いてください:ペアプログラミングに便利です。一人がドキュメントを閲覧している間に、もう一人が別のウィンドウでバグを修正できます!ゲームにも楽しいです!複数のコントローラーを使用するのが普通ですが、複数のマウスではどうでしょうか?このスタイルのマルチプレイヤーコンピューティングは、複雑な同期アルゴリズムを必要とせずに、アプリケーション内でのコラボレーションを非常に自然に促進します。
概要
さまざまなソフトウェアにおける「マルチシート」の現在のサポート状況の概要を以下に示します:
コア Wayland プロトコル 5 ★★★★★ 深く統合されています!
Weston 3 ★★★☆☆ シートの動的な再設定が容易ではありません。
sway 4 ★★★★☆ デバイスをシートから切り離せません (#3491)。
niri 1 ★☆☆☆☆ まだサポートされていません (#3159)。
River 4 ★★★★☆ ext-transient-seat-v1 のサポートがありません (#1497)。
GTK 4 ★★★★☆ アプリ実行中に新しいシートが登録されません。
SDL 3 ★★★☆☆ 絶対座標モードのマウスでシート情報がありません (#16027)、シート情報はデバイス名経由のみです。
wayvnc 5 ★★★★★ ext-transient-seat-v1 をサポートしています。
目次
用語
論理シート
物理シート
Wayland プロトコル
Wayland コンポジタ
Weston
sway
River
niri
グラフィックスライブラリ
GTK
SDL
LÖVE
アプリケーション
マルチシート GTK テキストウィジェット
LÖVE 物理プレイグラウンド
ターミナルエミュレータ
ブラウザ
VNC セットアップ
用語
この記事では「シート」という言葉を頻繁に使用します。これは、同じユーザーによって使用されるようにグループ化された入力デバイスを説明します。たとえば、1台のコンピュータの前に2人の人がいて、それぞれが自分自身のマウスとキーボードを持っているとします。このセットアップでは、2つの「シート」があり、各シートには1つのマウスと1つのキーボードがあります:
seat0 ラップトップのタッチパッド ラップトップのキーボード
seat1 外付けマウス 外付けキーボード
ただし注意してください – 人々はこの言葉を2つの異なる方法で使用します:
論理シート
私が興味を持っているシートの種類は、時には「論理シート」と呼ばれます。これは、複数の人が1台のコンピュータの前にいて、それぞれが自分自身のマウス/キーボードを持っているが、同じデスクトップ環境を制御している状態です。つまり、デスクトップには複数のマウスカーソルが表示されます!人々はウィンドウを互いに「手渡す」ことができ、ホワイトボードアプリケーションに一緒に描画したり、同じソフトウェア内で直接協力したりできます。(これらすべてが現在可能であるということではありませんが、概念的には!)この概念をより良く表す用語があると思います – この投稿のタイトルでは、「マルチプレイヤー」を選びました。これは、主に協力する複数の人々に関するものであることを明確にするためです。また、「マルチカーソル」や「マルチポインター」(キーボードコンポーネントが欠けている)という言葉も目にしました。
物理シート
「シート」という言葉は、別の意味を持つこともあります。これは「物理シート」と呼ばれます:
これは、複数の人がそれぞれ独立したセットアップを持っているセットアップを指します:画面、キーボード、マウス。彼らは実際には互いにやり取りしませんが、入力および出力デバイスは単一のコンピュータに接続されています。これはWikipediaのマルチシート構成の記事で参照されているものです。しかし、この記事はそれについてではありません。Linuxでの現在のサポート状況についてさらに知っているなら、あなた自身のブログ記事を書くことをお勧めします!
概要
私はLinux、特にWayland(最新のグラフィカルディスプレイシステム)での状況のみを調査しました。X11(X Window System)には、数年前に私が楽しんだMulti-Pointer X(MPX)という独自のマルチシート拡張機能があります。しかし、現時点では、私は日常のコンピュータ使用でWaylandコンポジタに移行しました。そして、Waylandには複数のシートのための優れた組み込みサポートがあることがわかりました!マルチユーザーシステムの設定方法、関連するWaylandプロトコル、そして最終的に現在のアプリケーションサポートがどのようになっているかについて説明します。
難しいのは、マルチシートサポートがすべてのレイヤーに存在する必要があることです:
Waylandコンポジタ(通常はウィンドウマネージャを含みます)。
Waylandプロトコル。
グラフィカルアプリケーションが使用するGUIライブラリ。
グラフィカルプログラム自体。
オプションで、リモートで協力することを許可したい場合は、接続を許可するために使用するプログラム(VNCサーバーなど)にもマルチシートサポートが必要です。
後で設定方法を示します!
したがって、Waylandプロトコル自体から始めて、これらのすべてのレイヤーを見ていきます。
Wayland プロトコル
この深淵は、Waylandが実際には何であるかを初めて深く調べたときでした!その核心は、プロトコルの集まりです。コアWaylandプロトコル(グラフィカルプログラムとWaylandコンポジタが互いに通信するために使用するもの)が、深く統合されたマルチシートサポートを持っていることを発見して本当に嬉しかったです:すべての入力イベントはwl_pointerまたはwl_keyboardに接続されており、それらはさらにwl_seatに接続されています。そして、このシートに関する情報を使用して入力イベントを「グループ化」できます!シートが出現/消滅したときにトリガーされるイベントもあります。
Wayland コンポジタ
しかし、コンポジタ(ウィンドウを管理し、その内容を描画するプログラム)は、これらの概念をクライアントアプリケーションと通信するためにどれほどうまく使用しているでしょうか?いくつか試してみました:
Weston
WestonはWaylandコンポジタのリファレンス実装であり、freedesktop.orgのWaylandチームによって保守されています。これは、真のマルチシートサポートを備えた最初のコンポジタでした!複数のマウスカーソルを持つことができ、それぞれが独立してウィンドウを移動できます!Westonはシートごとのウィンドウフォーカスも実装しています。これは、シートがマウスとキーボードを持っている場合、マウスがウィンドウにフォーカスでき、キーボードがそれにキーストロークを送信することを意味します – そして異なるシートが同時に異なるウィンドウにフォーカスできます。
これを使って遊んでいて見つけた楽しいエッジケースがいくつかあります:
一度カーソルがウィンドウのリサイズ/移動を開始すると、それらのアクションは他のカーソルでは実行できなくなります。
一方のカーソルがメニューを開くことができ、もう一方がそれを使用できます。これはかなりうまく機能します!
一方のカーソルがウィンドウをドラッグしている間に、もう一方のカーソルがウィンドウを閉じると、2番目のカーソルが消えます!:D
これらは解決するのが非常に難しい(そして楽しい)UIの質問です!多くの場合、正しい動作が何であるかは私にはわかりません!
Westonで複数のシートを設定する方法
Westonでシートを設定するのは非常に複雑です。後続のコンポジタはそれをはるかに簡単にします!入力デバイスを複数のシートに分離するには、udevルールを使用してENV{WL_SEAT}プロパティを設定する必要があります。マウスとキーボードに同じシート名を割り当てると、それらが連携して動作します!デフォルトのシートは「default」です。
詳細な手順:
sudo libinput list-devices を使用して、入力デバイスのデバイスファイル(「/dev/input/event12」など)を見つけます。
udevadm info -a /dev/input/event12 を使用して、キャッチーな ATTRS{name} を持つ親デバイスを見つけます。
次のようなファイル /run/udev/rules.d/00-multiseat.rules を作成します:
ATTRS{name}=="マウスの名前" ENV{WL_SEAT}="second"
(テストのためには2つの=文字を使用しますが、割り当てのためには単一の=文字を使用します。)
sudo udevadm trigger を実行して、新しいルールを適用します。
これで sudo libinput list-devices を再度確認してください。デバイスの「Seat」は「seat0, second」と表示されるはずです!
sway
swayはi3のWayland再実装です。wlrootsにvでマルチシートサポートが追加されました