背景
qtile はタイル型ウィンドウマネージャの一つである。 Python で書かれていること、X と Wayland の両方をサポートしていることが特徴である。 qtile 以外では X サポートの i3 や、i3 を Wayland 用代替することを目指して開発されている sway などがタイル型ウィンドウマネージャとしては有名である。
今回ひょんなことからプライマリのコンピュータに Debian をインストールすることにした。 いつもどおり qtile をインストールしようとしたが、せっかくなので wayland を使ってみることにした。 ただし、wayland や qtile にはいくつかの不安があった。
まず、wayland では (raspberry pi os 経由で) IME がうまく動かないことを聞いていた。 加えて、qtile は wlroots >= 0.17.0, < 0.18.0 を要求する [1]。 wlroots は wayland compositor を作成・ビルドするためのライブラリである。 しかし、Debian booworm のパッケージマネージャで入ってくるのは 0.15.1 であった [2]。 現在 testing 状態の trixie なら 0.17.4 が入るが、プライマリのコンピュータを testing にするのは気が引けたこと、 個別に新しい deb パッケージをインストールすると依存関係が破壊されることを考えてなるべくパッケージマネージャを使うのは避けたかった。
以上を解決して Debian Bookworm で qtile as a wayland compositor を動作させるために取った手順を本記事で解説する。
依存パッケージと qtile のビルド
一部の qtile 依存パッケージ、例えば wlroots の python binding である pywlroots はそれが (ただの) binding であるがゆえに c library を呼び出す。したがって CFFI 経由の c コンパイルと wlroots とのリンクが必要になる。これらは pip コマンド中に行われることに注意が必要だ。
wlroots のビルド
ビルド手順は Dockerfile にまとめた。
https://github.com/RollMan/wlroots-build-docker
ポイントは、x11-backend と xwayland を有効にすること。Xorg ネイティブなアプリは Wayland 環境下で起動しないので X サーバーが Wayland クライアントとして動作するようにする。
個別に不要な機能は各自 Dockerfile のサブモジュールのビルドに関する記述を消去することで無効化できる。
以上でビルドした wlroots 等 (libwayland-server
を含む) を対象のコンピュータに展開しておく。
今回はホームディレクトリ以下に展開することを前提とする。特に、$HOME/.local/
以下とする。
Python 仮想環境の準備
pyenv をインストールし、適当な python をインストールする。また site-packages の仮想環境も準備する。
依存関係のパッケージのインストール
qtlie のドキュメントに従って依存関係のパッケージをインストールする。 ただし、wayland 関係の APT パッケージ・PyPI モジュールのインストールはここではスキップする。
https://docs.qtile.org/en/stable/manual/install/index.html
ここで、たとえば libpangocairo をインストールすると依存関係として libwayland-server
などがついてきてしまう。
この後の手順でパッケージ版の wayland がリンクされると qtile が起動しないので、それらがビルドされないようにうまいことやる必要がある。
また、X 関係もインストールされてしまうが結局 xwayland 関係で必要になるのでしょうがない。
pywlroots のビルド
まずは pywlroots をビルドする。
LDFLAGS=-L$HOME/.local/lib/x86_64-linux-gnu/ \
C_INCLUDE_PATH=$HOME/.local/include \
CPLUS_INCLUDE_PATH=$C_INCLUDE_PATH \
CPATH=$C_INCLUDE_PATH \
python -m pip install \
--no-cache-dir \
--upgrade \
--force-reinstall \
--config-setting backend=wayland \
--no-binary :all: \
--ignore-installed \
--config-settings="--global-option=build_ext" --config-settings="--global-option=--include-dirs=$HOME/.local/include" --config-settings="--global-option=--library-dirs=$HOME/.local/lib/x86_64-linux-gnu/" \
pywlroots
一見、qtile のソースコード上で python -m pip pip install .
すればこれらの依存パッケージも自動で解決してインストールされそうだが、そうはいかない。
pywlroots のインストールには先程独自でビルドしたライブラリをリンクしたり、include ファイルを参照しないといけないので環境変数やオプションが必要になる。
詳しい調査はしていないが、qtile のインストール時にこれらの環境変数やオプションを指定するとキャッシュが効かず余計な時間がかかるばかりか、完成したバイナリの wayland support が無効にされている。おそらく、bookworm package 版の wayland が何らかの理由でリンクされてしまうものと思われる。
qtile のビルド
qtile のソースディレクトリに入って以下を実行する。
python -m pip install .
特に pywlroots が再ビルドされないように、キャッシュが使用されることに気をつける。
共有ライブラリの検索パスの設定
/etc/ld.so.conf.d/wayland.conf
に $HOME/.local/lib:$HOME/.local/lib/x86_64-linug-gnu/
を追加する。
せっかくライブラリをホーム以下に配置したのだからこの設定もユーザーワイズにしたかったが、やりかたがわからなかった。
LD_LIBRARY_PATH
は一時的に使うもので、$HOME/.profile
等に記述すると無視されるようだ [3]。
Secure-execution mode For security reasons, if the dynamic linker determines that a binary should be run in secure-execution mode, the effects of some environment variables are voided or modified, and furthermore those environment variables are stripped from the environment, so that the program does not even see the definitions. Some of these environment variables affect the operation of the dynamic linker itself, and are described below. Other environment variables treated in this way include: GCONV_PATH, GETCONF_DIR, HOSTALIASES, LOCALDOMAIN, LD_AUDIT, LD_DEBUG, LD_DEBUG_OUTPUT, LD_DYNAMIC_WEAK, LD_HWCAP_MASK, LD_LIBRARY_PATH, LD_ORIGIN_PATH, LD_PRELOAD, LD_PROFILE, LD_SHOW_AUXV, LOCALDOMAIN, LOCPATH, MALLOC_TRACE, NIS_PATH, NLSPATH, RESOLV_HOST_CONF, RES_OPTIONS, TMPDIR, and TZDIR.
.bashrc
に書けば動くという記述を見つけたが、原理に反する気がするため今のようにしている。
ここまでできれば、qtile ドキュメントの通り
qtile start -b wayland
すれば qtile が起動する。
qtile 自動起動の設定
以上で tty にログインし qtile start -b wayland
すればグラフィカルなインターフェースが使えるようになったが、
せっかくなので Display Manager をインストールして自動でログインと qtile の起動ができるようにした。
ポイントは起動プロファイルで python virtual environment のアクティベーションをすることである。
具体的には、lightdm を使い、そのデスクトップセッションエントリの起動スクリプトで仮想環境を有効化した。 lightdm を bookworm でインストールすると x 関係のパッケージと libwayland 関係のパッケージが入ってくるので、注意。
cat > /usr/share/wayland-sessions/qtile-wayland.desktop << EEOF
[Desktop Entry]
Name=Qtile (Wayland)
Comment=Qtile Session
Exec=/home/user/.local/bin/qtile-venv-entry
Type=Application
Keywords=wm;tiling
EEOF
cat ~/.local/bin/qtile-venv-entry
#!/bin/sh
. $HOME/.profile # .profile に pyenv がインストールされている前提。
eval "$(pyenv init -)"
pyenv shell qtile
export LD_LIBRARY_PATH=$HOME/.local/lib/x86_64-linux-gnu/ # これをやめたい
qtile start -b wayland $*
ついでに、家のデスクトップコンピュータなので起動時の自動ログインも設定してしまう。
sed 's/^autologin-user=.*/autologin-user=user/' /etc/lightdm/lightdm.conf
IME の対応
基本的に、wayland のプロトコルとして IME の対応は存在するので (text-input-v{1,2,3}
)
IME がうまく動かない場合はアプリ側に原因があることが多い。
更に、qtile は text-input-v{1,2,3}
をサポートしていない [4] ので
wayland ネイティブアプリでは IME は動作しない。
個人的に、wayland native なターミナルエミュレータである foot を使っているが、この上では IME は使えない。
IME を使って日本語を入力したい場合は、GTK/Qt で書かれているアプリを使う。
例えば、commit message は gvim (vim-gtk3
as a APT package) を使っている。
IME で究極的に困っても、gvim と :term
を組み合わせればたいていなんとかなる。
セッションロックの対応
今回は家のデスクトップコンピュータなのでセッションをロックすることはさほど重要ではないが、 出先で使用するラップトップ等にインストールする場合は重要である。 悪意のある第三者によって卒業論文に指導教官への悪口を埋め込まれかねない。
wayland では ext_session_lock_manager_v1
というモダンなセッションロックのためのプロトコルが存在するが、
qtile では対応していない [5]。
したがって、swaylock
[6] や waylock
[7] などのセッションロックアプリは使えない。
一方で qtile はレガシーなロックプロトコルをサポートしているので
それらのバージョンを下げて使ったり、
またもっと下げて wayland のプロトコルに依存しない (堅牢性が下がるらしい。画面を白く塗っているだけだったりする?)
バージョンを使うととりあえずのワークアラウンドにはなりそうだ。
その他デスクトップに必要な対応
キーボード2つ使う人向けのパッチ: https://github.com/qtile/qtile/pull/5032
fcitx5 を qtile の autostart で起動する。
kanshi を qtile の autostart で起動して、 2 枚目のモニターの配置を修正する。 wayland-randr などを使うと qtile が何故か起動しなくなる。 おそらく本当は display manager を起動する前に実行するべきなのだろうが、 lightdm の dispsetup に設定してもうまく行かなかったためこのようになっている。
pulseaudio をインストールする。ディスプレイマネージャを一緒に入れれば (要検証)
apt install
するだけで pulseaudio も自動起動してくれて、優秀。
感想
使い勝手は非常にいい感じ。 特に最近、プライマリコンピュータの Windows 11 で Super キーを押した後のアプリ検索が効かなくて困っていた。 いつも Super → gvim や Super → google chrome とタイプしてアプリを起動していたのでこれができないと結構ストレスフル。 ueli をインストールしてみたものの、クセで Logo キーを押してしまう。 こっちなら困ったら自分で直せばいいので楽。
常用して 10 年くらいになるのラップトップのプロセッサ i5-6200U は windows 11 に対応していない (無理やりインストールはできるらしい) ので、windows 10 のサポートが切れたらラップトップにはまた debian & qtile を入れようと思う。 ラップトップは月に一度も使わないので、新しく買うことはないだろう。 その際にはセッションロックに注意したい。 ネックである MS Office まわりはどうにかうまいことしたい。 手としては、windows を vm で起動して、RDP export of indivisual app で office apps を linux desktop に飛ばす [8] というのがあるらしい。 wine は未だエラーが起きがちのよう (頑張れ) [9] だ。 昔は必要に応じて再起動してブートを切り替えていたが、 うまいことやって Debian 一本で色々できるようにしておきたい (e.g., MS Office, zoom, slack huddle, e-tax (←これどうにかならん?))。 ただ鉄拳 8 だけはどうしてもリブートが必要か。仕事中にできないようになるわけなのでいいことか。
References
- [1] https://docs.qtile.org/en/stable/manual/wayland.html
- [2] https://packages.debian.org/source/bookworm/wlroots
- [3] https://man7.org/linux/man-pages/man8/ld.so.8.html
- [4] https://github.com/qtile/qtile/issues/4623
- [5] https://github.com/qtile/qtile/discussions/4158
- [6] https://github.com/swaywm/swaylock
- [7] https://git.sr.ht/~ifreund/waylock
- [8] https://www.reddit.com/r/linux/comments/uw5chq/comment/i9pgelq/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button
- [9] https://www.reddit.com/r/linux/comments/uw5chq/serious_how_do_you_guys_use_microsoft_office/?utm_source=share&utm_medium=web3x&utm_name=web3xcss&utm_term=1&utm_content=share_button