swayでwayland

2021-12-16 linux sway wayland

pyspa Advent Calendar 2021 の16日目のエントリです。 15日目は@ymotongpooGoのリリースプロセスとブランチ戦略でした。

waylandにしよう

ある日X serverの調子が悪いのかディスプレイマネージャーからログイン後すぐにログアウトしてしまうようになった。 bspwmを使っていて発生したがopenboxに変えたりしても状況変わらず。 コンソールから立ち上げたりしてもエラーが出てるわけでもなく、原因がわからないままにふと試しに入れていたswayを起動したらちゃんと動いた。なぜかwaylandは動くのである。 そういうことならもうwaylandに移行してみるかと新たなヤックの群れに立ち向かうことにした。 (※debian sidにて作業した記録です。)

sway

お試しでいれてみたswayだがこれはwaylandコンポジターの1種でi3wmのようなタイル型のレイアウトでウィンドウを扱うもの。 というか設定ファイルはほとんどi3と同じでwayland向けの設定が追加されているくらいのものである。

キーボード設定とか

ひとまずディスプレイマネージャーを切って、コンソールからの立ち上げでいろいろ設定していくことにする。 waylandはx serverの役割とウィンドウマネージャーの役割をコンポジターが受け持っているので、そこらへんの設定も必要になる。 システムの設定は /etc/sway/config にあった。 ユーザーの設定ファイルは ~/.config/sway/confing になるのでこっちにコピーして修正していくことにしよう。

$ mkdir ~/.config/sway
$ cp /etc/sway/config ~/.config/sway

ひとまずキーボードをjp106に設定しよう。あとCAPSをCTRLにしておく。

input * {
        xkb_layout "jp"
        xkb_options "ctrl:swapcaps"
}

あとトラックパッドでタップ設定とナチュラルスクロールの設定とかもしておく。

input type:touchpad {
        tap enabled
        natural_scroll enabled
}

タスクバーとかランチャーとか

swayにはswaybarというタスクバーが標準でついてくるが、まあいろいろ追加できるwaybarというものがあるのでそっちに交換する。 waybarはwlrootsを使っているコンポジターと相性がいいらしいので採用。 ランチャーについてはbspwmrofiを使っていたがwaylandにポーティングかなんかしたwofiというのがあったので採用。 通知についてはdunstからmakoに変更。 まとめるとこんな感じ

  • タスクバー: waybar
  • ランチャー: wofi
  • デスクトップ通知: mako

waybarについてはexecするのではなくbarの設定でコマンド指定する。

bar {
    swaybar_command waybar
}

wofiはキーバインドで実行できるようにしておく。

set $menu wofi -G --show drun | xargs swaymsg exec --

makoは単純にexecで実行しておけばオーケー。

exec mako

ということで最低限の作業環境は確保できただろう。

日本語入力

fcitxがwaylandに対応しているらしいので一応最新のfcitx5にしておいた。 以下の環境変数を設定しておけば日本語入力は問題ない。

GTK_IM_MODULE=fcitx
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx

まあ、いつもどおりの設定で実際のところgtk, qtはXでもwaylandでも独自のモジュールで日本語変換できるし、xwaylandのおかげでXIMも動いている。 実のところwayland nativeなinput methodプロトコルが今どうなってるのかよくわからない。 ツールキット使ってないアプリの日本語入力はしばらくは諦めたほうがいいかもしれない。

wlgreeter

さてコンソールからswayを立ち上げてうまく動いてたのでディスプレイマネージャーを設定し直す。 せっかくなのでwaylandで動くものにしようと探すとgreetdというものが目に止まった。 greetd自体はセッション管理だけでgreeterというログインプロンプトを出すプログラムを別途使うようになっている。 wlgreeterはwaylandで動くgreeterとのこと。 こういう役割分担してるものは結構好みなので早速導入。

まずgreetdをREADMEの通りにgreeterユーザーの追加や設定ファイルを配置する。

wlgreeterはwaylandコンポジターの機能は持ってないので別途コンポジターを立ち上げてあげないといけない。 cageとか小さなコンポジターを使う方法もあるけど、swayを使ってもいいらしい。 これもwlgreeterのドキュメントの通りに設定してあっさり動いた。

[terminal]
vt = 1

[default_session]
command = "sway --config /etc/greetd/sway-config"

user = "greeter"
exec "wlgreet --command sway; swaymsg exit"

bindsym Mod4+shift+e exec swaynag \
	-t warning \
	-m 'What do you want to do?' \
	-b 'Poweroff' 'systemctl poweroff' \
	-b 'Reboot' 'systemctl reboot'

include /etc/sway/config.d/*

環境変数など

コンソールから立ち上げた場合はログインシェルが動いてるので .profile で環境変数を設定してしまえばいいが、greetdからログインした場合はどうなっているのだろう。 pam_environment を設定しているのでこれがうまく動いているようなのだが、ほんとにこれでいいのかは未検証。

まとめ

  • sway, wofi, waybar, mako を使った軽量なデスクトップ構築
  • 日本語入力はgtk,qt,xwaylandのおかげでだいたいなんとかなる
  • greetdはお試し中