inthisfucking.world

💩🌎

swayのすゝめ

Sway overview

Swayというtiling Wayland compositorをご存知でしょうか。所謂デスクトップ環境というものです。Wayland compositorというくらいですから、Waylandを前提としたもので、X11で動作するものではありません (X11のアプリケーションを動かす事はできます)。

何年も開発が続いていましたが、2019年の3月くらいに1.0がリリースされました (indiegogoで募った資金で一箇所に集まってのハッカソンを経て)。日本語では情報が少ないので、自分がはまったSwayの設定などに関して書きます。

SwayはどういうWayland compositorなのか

Swayは、基本的に多くの操作がキーボードのみで行えるようになっています。ソフトウェアを起動する、アプリケーションのウィンドウの配置を変える (タブにしたりタイル状に並べたり)、アプリケーションのウィンドウのサイズを変更する、Swayの設定ファイルを再度読み込んだり、Swayを終了したり、全てキーボードのみで操作可能です。コンピュータで行う主な作業がターミナルでコードを書くことような人には、とても使いやすいデスクトップ環境であると思います。

私はエディタにvimを使っていますが、vimと同様のkey bindingで色々な操作が行えるのが素晴らしいです。

インストールする

この記事では、インストールに関して詳しくは説明しません。Linuxのディストリビューションによっても異なりますので、公式のサイトを見つつ、使っているLinuxのディストリビューションのWikiなどを見てみることをお薦めします。

使いやすいように設定する

Swayはi3と互換性のあるWayland compositorです。もし既にi3を使っている方であれば、多くの設定がそのまま使用できるようです。

私はi3を使っていた訳ではないので、デフォルトの設定ファイルから始めました。/etc/sway/configなどにあると思われる設定ファイルを、~/.config/sway/configにコピーします。

Swayは、デフォルトの設定ファイルのままで起動しても何をどうして良いのかよく分かりません。起動するとデスクトップ環境が表示されますが、クリックするメニューもなにありません。

まず一番最初に設定するべきなのが、modifierです。キーボードによる全ての操作を、modifierと他のキーを組み合わせて行うことになります。私は、super (Mod4)modifierとしています。

set $mod Mod4

次に設定するべきなのが、ターミナルを起動するためのキーを決めることです。ターミナルを起動するのも、modifierと指定したキーを押すことで操作します。デフォルトではtに設定されています。

bindsym $mod+t exec $term

最後に、上で設定したキーが押された際に起動するターミナルを指定します。私はkittyを指定しています。

set $term kitty

ここで一旦、設定ファイルに行った変更を反映させるために、設定ファイルを再度読み込みましょう。デフォルトだと、modifier+Shift+cで設定ファイルを再度読み込めます。

早速modifier+tなどのターミナルを起動するためのキーを押して、指定したターミナルが起動するか確かめましょう。無事指定したターミナルが起動したら、とりあえず安心です。最悪何をして良いか分からなくなっても、ターミナルにアクセスがあればどうにかなります。

私の設定ファイルはこちらになります。ウィンドウの枠の色などは、Nordを参考にしています。

Waybar

Swayは、swaybarというソフトウェアを使って、所謂デスクトップの一番上や下に表示されるメニューのようなものを表示します。

swaybar

swaybarそのものはとても単純で、標準入力から改行を区切りとした文字列を渡すと、それらが表示されるようです。流石にそれだと色々面倒なので、私はWaybarというソフトウェアを使ってメニューバーを設定しています。Waybarは設定ファイルを持っており、その設定ファイルで色々指定するとそれに従った形でswaybarを使ってメニューバーを表示してくれます。

Waybarは、~/.config/waybarディレクトリ以下にconfigstyle.cssという設定ファイルを期待します。configでは何を表示するか、style.cssではconfigで指定したものの見た目などを設定します。基本的にはデフォルトのままでもそれなりに綺麗な見た目になりますが、私は必要の無いものを削除して、時間と日付の表示を変更しました。

私のconfigとstyle.cssです。環境によっては文字化けしているかも知れませんが、Font Awesomeの文字を使っています。Font Awesomeをインストールすると正しく表示されると思います。

tips

このセクションでは、Swayを使っていて学んだことを書きます。

Waylandをサポートしたものを使う

SwayはWayland compositorです。XWayland経由でX11のアプリケーションも使用できますが、Waylandだけで完結する方が綺麗なので、出来るだけWaylandをサポートしたソフトウェアのみを使うようにしています。以下が、その過程で問題があったソフトウェアの一覧とその解決策です。

ターミナル

私はずっとGnome Terminalを使っていました。タブも日本語入力も対応していて素晴らしいターミナルです。Gnome TerminalはWaylandをサポートしているのでそのまま問題なく使えます。

ただ、Gnomeの外でGnomeに関に対する依存も減らしたかったので、kittyを使っています。GPUを利用するターミナルなので、それなりのビデオカードを搭載している環境であれば、それなりの恩恵を受けられるかも知れません。kittyは、ウィンドウの枠やタイトルバーを排除でき、ターミナルだけを表示できます。それが気に入っています。

rofi

最初に引っかかったのがランチャーです。デフォルトでdmenuが使われるような設定になっていますが、上手く動作しませんでした。私はrofiを使うことで解決させました。

set $menu dmenu_path | rofi -dmenu | xargs swaymsg exec

rofiは、dmenuに渡すデータをそのまま渡して動作するモードがあり、それを使うとそのままdmenu_pathからpipeしたデータが使えます。UIも、themeをそれなりのものにすれば綺麗です。

rofi

Redshift

Redhatのあれではなく、こちらのRedshiftです。RedshiftはWaylandに対応していませんが、wlrootsで動作するようにforkされたものがあります。Arch Linuxの場合は、redshift-wlr-gamma-controlがそのforkを使ったパッケージです。このforkを使うと、Swayの環境でRedshiftが動作します。

ちなみにSwayは、freedesktop.orgが定めたデスクトップ環境におけるautostartの方法をサポートしていません (~/.config/autostartディレクトリ以下に置いたスクリプトをデスクトップ環境の起動時に自動で実行するもの)。Swayの作者の一人であるDrew DeVaultさんによると、サポートする予定もないそうです。

この場合、一番単純にRedshiftを起動する方法は、Swayの設定ファイルに書くことです。

exec redshift

screen lock

ある程度の時間の間にコンピュータを使っていない場合は、自動でスクリーンをロックして、アンロックする際にはパスワードが必要であって欲しいものです。swayidleswaylockでそれが実現できます。

私は5分間何もしていない場合に、スクリーンロックをかけるようにしています。こちらもRedshift同様、autostartの方法がないのでSwayの設定ファイルに書いています。

exec swayidle -w \
  timeout 300 'swaylock -f -c 000000' \
  timeout 301 'swaymsg "output * dpms off"' \
            resume 'swaymsg "output * dpms on"' \
  before-sleep 'swaylock -f -c 000000' \

swaylockがまたハードコアで、パスワードを入力する画面が必要最低限でとてもかっこよいです。

swaylock

X11に依存したアプリケーション (例: ChromeやElectronを使ったもの)

私は明示的に~/.zshrcexport GDK_BACKEND=waylandとしているので、アプリケーションによっては正しく起動しません。例えばChromeやElectronを使用しているアプリケーションです。その場合は、X11を使う旨を明示的に示した上でアプリケーションを起動させましょう。

$ GDK_BACKEND=x11 code

GUIのあるJavaのアプリケーション (例: Android Studio)

Android Studioは何故か正しく描写されません。以下のように起動すると正しく描写されます。 

$ _JAVA_AWT_WM_NONREPARENTING=1 /path/to/studio.sh

gnome-keyring-daemonを使ったsshのprivate keyの管理

私は、Swayに移行する前はGnomeを使っていました。Swayに移行して面倒だったのが、git pullする時などに毎回最初にsshのprivate keyのpassphraseを聞かれることでした。原因は、以前はGnomeが起動する際にgnome-keyring-daemonが自動で起動していたのですが、Swayでは意図的に起動させない限り自動で起動しないことにあります。つまり、Swayが起動するタイミングでgnome-keyring-daemonを起動させれば問題は解決します。

gnome-keyring-daemonを正しく起動させるのは結構複雑で、最初に特定のオプションの元で起動させた後にevalするようです。最終的には、Linuxが起動した後にコンソール経由でログインした際にgnome-keyring-daemonが起動するようにして、~/.zshrcSSH_AUTH_SOCKをexportすることにしました。

コンソール経由でログインした際にgnome-keyring-daemonが起動するようにする方法は、こちらを参考にしてください。

/etc/pam.d/login

#%PAM-1.0
 
auth       required     pam_securetty.so
auth       requisite    pam_nologin.so
auth       include      system-local-login
# この下の行を追加
auth       optional     pam_gnome_keyring.so
account    include      system-local-login
session    include      system-local-login
# この下の行も追加
session    optional     pam_gnome_keyring.so auto_start

その後に、~/.zshrcなどのログインの後に実行されるファイルにて、以下を実行します。

eval $(/usr/bin/gnome-keyring-daemon --start --components=pkcs11,secrets,ssh)
export SSH_AUTH_SOCK

これを~/.config/sway/configでやってしまうと、exportがSwayのプロセスで実行されるようで、意図した効果が得られませんでした。

trayは開発中

現時点 (2019年5月5日) では、Swayはまだtrayに対応していません。私は日本語入力にFcitxを使用していますが、trayにアイコンが表示されないだけで正しく動作はしています。

trayがなくて一番困っているのは、新しいwifiのアクセスポイントを利用する場合です。swaybarで表示されているwifiのアイコンをクリックしても電波の強さが表示されるだけの設定になっているため、苦し紛れにnmcliを使っています。

misc

その他、Swayに関係していて、私が興味のあるものを書いておきます。

wlroots

Swayのチームは、Swayを開発する過程で、wlrootsというWayland compositorを書くためのライブラリも開発しています。実際に、現在のSwaywlrootsを使って実装されています。

まだまだWayland compositorが少ない今、自分で作りたい場合はwlrootsを使うと色々楽だと思います。wlrootsの前はwlcが使われていました。wlcはとても簡潔なので、Waylandの仕組みを理解するためにコードを読むのは良いでしょう。

wio

Swayの開発者の一人であるさんは、最近WioというSwayとは別のWayland compositorを発表しました。Plan 9のデスクトップ環境のクローンのようです。Swayはどうなるのかなと少し不安になりました。