/home/amgsk

XWaylandでアプリを起動する

· amgsk

まだ多くのアプリケーションはWaylandに対応しておらず、起動することが難しかったり、またUIの描画が崩れたりする。 そんなときはXWaylandを用いてアプリを起動するように指定すれば、多くの場合は問題なく使用できる。

XWaylandは、Waylandコンポジター上でX11アプリケーションを動作させるための互換レイヤーであり、Wayland環境でもXWaylandが有効であればX11向けのアプリケーションをそのまま実行できる。

そのやり方を紹介。

アプリケーションのツールキットを調べる

desktopエントリで適切な環境変数を指定するには、対象のアプリがGTK・Qt・Electronのどれで実装されているかを知る必要がある。 パッケージ名にqtgtkがついてるならそれを信用すればよい。

パッケージの依存関係から判別する

Arch Linuxならpacmanで依存関係を確認するのが最も手軽。

1
pacman -Qi dbeaver | grep Depends

依存パッケージにgtk3gtk4があればGTK、qt5-baseqt6-baseがあればQt。

リンクしているライブラリから判別する

バイナリがリンクしている共有ライブラリを確認する方法もある。

1
ldd $(which someapp) | grep -iE 'gtk|qt'

Electronアプリの見分け方

Electronアプリはインストールディレクトリにresources/app.asarが存在する。

1
ls /usr/lib/<appname>/resources/app.asar

また、実行中のプロセスのコマンドラインに--type=rendererなどChromium由来のフラグが含まれていることでも判別できる。

desktopエントリでの指定

~/.local/share/applications配下に、以下のようなdesktopエントリを作成する。 Exec内で環境変数を指定し、X11バックエンドで起動させる。

GTKアプリケーションの場合

GTKアプリケーションはGDK_BACKEND=x11を指定する。

desktopエントリ (GTK)
1
2
3
4
5
6
7
8
9
[Desktop Entry]
Name=DBeaver Community (For Wayland)
Comment=Universal Database Tool
Exec=env GDK_BACKEND=x11 GDK_SCALE=1 GDK_DPI_SCALE=1.5 dbeaver %f
Icon=dbeaver
Terminal=false
Type=Application
Categories=Development;Database;IDE;
StartupWMClass=DBeaver

Qtアプリケーションの場合

QtアプリケーションはQT_QPA_PLATFORM=xcbを指定する。

desktopエントリ (Qt)
1
2
3
4
5
6
[Desktop Entry]
Name=SomeQtApp (For Wayland)
Exec=env QT_QPA_PLATFORM=xcb someqtapp
Icon=someqtapp
Terminal=false
Type=Application

Electronアプリケーションの場合

Electronアプリケーションは起動フラグで制御できる。 逆にWayland上でネイティブに動かしたい場合は--ozone-platform=waylandを指定するが、XWayland経由にしたい場合はこのフラグを外すだけでよい。

desktopエントリ (Electron)
1
2
3
4
5
[Desktop Entry]
Name=SomeElectronApp (For Wayland)
Exec=someelectronapp --ozone-platform=x11
Terminal=false
Type=Application

コマンドラインからの指定

desktopエントリを作らずとも、コマンドラインから環境変数を渡して直接起動することもできる。

1
2
3
4
5
# GTKアプリ
GDK_BACKEND=x11 dbeaver

# Qtアプリ
QT_QPA_PLATFORM=xcb someqtapp

XWaylandで動作しているか確認する

Waylandコンポジターが提供するコマンドで、各ウィンドウがXWayland経由かどうかを確認できる。

Hyprlandの場合はhyprctl clientsで一覧を取得し、xwaylandフィールドを見る。

1
hyprctl clients | grep -E 'class:|xwayland:'

Swayの場合はswaymsgでウィンドウツリーを確認する。

1
swaymsg -t get_tree | grep -E '"app_id"|"shell"'

shell"xwayland"であればXWayland経由、app_idが設定されていればWaylandネイティブで動作している。

HiDPI環境での注意点

XWayland経由のアプリケーションはHiDPI環境で表示がぼやけたり、スケーリングが正しく適用されないことがある。 GTKアプリではGDK_SCALEGDK_DPI_SCALEで調整できる。

1
env GDK_BACKEND=x11 GDK_SCALE=1 GDK_DPI_SCALE=1.5 dbeaver

QtアプリではQT_SCALE_FACTORで調整する。

1
env QT_QPA_PLATFORM=xcb QT_SCALE_FACTOR=1.5 someqtapp

EOF