概要
Wayland環境では、アプリケーションがウィンドウを前面に表示するにはXDG Activationプロトコルが必要 XDG Activationトークンを使ったウィンドウアクティベーションの仕組み KWinの「フォーカス奪取防止」機能の違いと進化 QtやKDEアプリケーションの対応状況 今後の課題と改善点
Waylandとウィンドウアクティベーションの仕組み
- Wayland では、アプリケーションが勝手にウィンドウを前面に出すことができない設計
- ウィンドウを前面に表示するには XDG Activationプロトコル の利用が必須
- アプリケーションは自らフォーカスを奪うことはできず、 フォーカスを受け取る ことのみ可能
- 例:チャットアプリがリンクを開く場合
- XDG Activationトークン をコンポジタから取得
- システムにURLを開くよう依頼し、トークンを渡す
- ブラウザはこのトークンを使いウィンドウをアクティベート
XDG Activationトークンの詳細
- トークンは 単なる文字列 で、アプリ間で自由に受け渡し可能
- 新規アプリ起動時は XDG_ACTIVATION_TOKEN 環境変数として渡される
- 既存アプリの場合は、 activation-tokenプロパティ がDBus経由で送信
- 古いプロトコル(通知、トレイアイコン、PolKit等)は既存仕様を変更できないため、呼び出し直前にトークンを設定する仕組みを追加
トークンの有無とコンポジタの制御
- トークンがあっても 必ずウィンドウを前面にできるわけではない
- コンポジタはトークンを 無効化 したり、アクティベーション要求を 拒否 可能
- リクエストには、ウィンドウ、入力イベントのシリアル、アプリIDなどの情報を添付可能
- 情報が不十分・不一致の場合は、アクティベーションが拒否される可能性が高い
Qt・KDEアプリケーションの対応状況
- QtやKDE Frameworks など多くのツールキット・アプリは既に対応済み
- 例:QWindowのrequestActivateはトークンがあれば利用し、なければ新たに取得
- ApplicationLauncherJobやOpenUrlJobも自動でトークンを取得してから処理を進行
- KDBusServiceはDBus経由でトークン受信時、自動で環境変数を設定
KWinのフォーカス奪取防止とその進化
- KWin-X11には focus stealing prevention (フォーカス奪取防止)機能あり
- _NET_WM_USER_TIMEを利用した複雑なヒューリスティクスで制御
- X11ではアプリがXSetInputFocusを使い、KWinが後から検知・修正するため、一瞬だけでもフォーカスが変わる場合あり
- Waylandではより厳密に制御可能
XDG Activation未対応の課題と改善
- 一部アプリやツールが XDG Activation未対応 のまま
- XではforceActiveWindowでごまかせたが、Waylandでは正しく修正が必要
- KWinの「Extreme」レベルのフォーカス奪取防止設定でテスト推奨
- 最近の修正例
- Dolphinが新規インスタンス起動時にトークンを破棄していた問題修正
- KRunner、KickoffなどのPlasmoidポップアップがアクティベーション要求しなかった問題修正
- LayerShell-Qtのshow時にアクティベーション要求追加
- PlasmaやKGlobalAccelなど特権クライアントのトークン取得問題修正
- 修飾キーのみの押下はフォーカス奪取防止の判定対象外に変更
DBusRunner仕様の改善と今後の展望
- DBusRunner仕様 にSetActivationTokenメソッドを追加、Run直前に呼び出し
- BalooやKClockランナーが既存ウィンドウを正しく前面表示可能に
- recent documents runnerやplaces runnerもOpenUrlJobにファイルタイプを渡すよう改善
- KRunnerでの完全な解決にはさらなる対応が必要
- 今後はKWinのフォーカス奪取防止をWaylandで標準有効化し、アプリ側の修正進捗に応じて厳格化予定