Sway
関連記事
sway (SirCmpwn's Wayland window manager) は i3 と互換性のある Wayland コンポジタを作成しようという試みです。公式ウェブサイト より:
- Sway は Wayland において Xorg の i3 ウィンドウマネージャの代わりとなるウィンドウマネージャです。既存の i3 設定で動作し i3 の機能のほとんどをサポートしています。
インストール
sway は sway パッケージでインストールできます。最新の開発版は sway-gitAUR でインストールできます。sway は wlroots に緻密に依存しているので、sway 更新時には wlroots も更新するのが望ましいです。
また、画面をロックする swaylock や、アイドル時間管理デーモンの swayidle もインストールできます。
デフォルトのアプリケーションランチャーは dmenu であり、ターミナルエミュレータは foot です。インストールするか、あるいは設定ファイルで別のアプリケーションに変更するかを、初回起動の前に行なうことが望ましいです。
sway の起動
Sway を起動する前に、キーボード、マウス、グラフィックカードなどのハードウェアデバイスにアクセスする必要があります。 sd-login(3) で説明されているように、これらのハードウェアデバイスのコレクションはシートと呼ばれます。
Arch Linux では、Sway は次のどちらかを使ってシートにアクセスすることができます。
- systemd-logind(8) と polkit または
- seatd これは、wlroots の依存関係として Sway と一緒にインストールされます。
polkit
がすでにシステムにインストールされている場合、Sway は自動的にあなたのシートにアクセスできるはずです。
また、polkit
がシステムにインストールされておらず、代わりに seatd を使用したい場合は、seat ユーザーグループに自分を追加し、seatd.service
を 開始/有効化し、再ログインして、以下の方法のいずれかを選択して Sway を起動することができます。
手動
Linux コンソールで sway
と入力すれば sway が起動します。
TTY ログイン時に自動起動
X と同様に、Sway はシェル初期化ファイルに以下を追加することで開始できます。(コマンドシェル#ログインシェルを参照):
if [ -z $DISPLAY ] && [ "$(tty)" == "/dev/tty1" ]; then exec sway fi
詳細については、xinitrc#ログイン時に X を自動起動 を参照してください。
ディスプレイマネージャを使う
sway のセッションは /usr/share/wayland-sessions/sway.desktop
にあります。GDM や SDDM などのディスプレイマネージャは自動的にセッションを認識します。
ディスプレイマネージャを通して、systemd ユーザーサービス として sway を開始することも可能です。
あるいは、テキストベースのセッションマネージャを使うこともできます。ディスプレイマネージャ#コンソールを参照してください。
設定
i3 を既に使っている場合、i3 の設定を ~/.config/sway/config
にコピーすればそのまま動作します。i3 を使ったことがない場合は、サンプル設定ファイルを ~/.config/sway/config
にコピーしてください。サンプル設定ファイルは /etc/sway/config
にあります。ただし DFALLBACK_CONFIG_DIR
フラグが設定されている場合は存在しません。設定方法は sway(5) を見てください。
キーマップ
デフォルトでは、sway は US QWERTY キーマップで起動します。キーマップを書き換えるには:
~/.config/sway/config
input * { xkb_layout "us,de,ru" xkb_variant "colemak,,typewriter" xkb_options "grp:win_space_toggle" } input <identifier> xkb_model "pc101"
なお、Sway は起動時に XKB_DEFAULT_LAYOUT
や XKB_DEFAULT_VARIANT
などの環境変数を読み込みますが、環境変数よりも設定ファイルの内容が優先されます。
詳細は sway-input(5) および xkeyboard-config(7) を参照してください。
キーのオートリピート設定
Typematic Delay (オートリピート開始までの時間) と Typematic Rate (1秒間のリピート回数) は、input
セクションに以下の行を加えると変更できます。設定項目について詳しくはコンソールでのキーボード設定#typematic delay と rate の調整を参照してください。
~/.config/sway/config
input <identifier> repeat_delay 300 input <identifier> repeat_rate 30
ステータスバー
sway には pure Wayland 環境で動作する swaybar がデフォルトのステータスバーとして同梱されています。swaybar はシェルスクリプトや他のプログラムを呼び出して、ステータスバーに情報を表示することができます。詳細については、sway-bar(5) や swaybar-protocol(7) を参照してください。
i3status のインストールは、 Wayland で実用的なデフォルトのステータスバーを取得するためのオプションです。sway の設定の末尾に以下のスニペットを追加するだけで表示できます:
~/.config/sway/config
bar { status_command i3status }
i3status をカラー出力させたい場合、i3status の設定の以下の部分を調整してください:
~/.config/i3status/config
general { colors = true interval = 5 }
どちらの例でも、システム全体にインストールされた設定ファイルはユーザーディレクトリにコピーされるので、それを修正してください。
壁紙
Sway 1.1 以降、壁紙機能は swaybg に分割され、output
コマンドを動作させるのに必要です。
以下の行を sway の設定の最後に追加することで、全ての画面 ("*"
という名前にマッチする画面) で背景画像を設定できます:
~/.config/sway/config
output "*" background /path/to/image.jpg fill
ファイルの名前やパスは適当に置き換えて下さい。
また、背景は単一色にもできます:
output * bg #000000 solid_color
swaybg コマンドの GTK3 フロントエンドとして azoteAUR を使うことができます。
入力デバイス
特定の入力デバイスの設定を調整することができます。例えば、タッチパッドの tap-to-click とナチュナルスクロールを有効にするには、以下の input ブロックを追加:
~/.config/sway/config
input type:touchpad { tap enabled natural_scroll enabled }
特定のタッチパッドの設定をセットするには、swaymsg -t get_inputs
を使用して、デバイスの Identifier を取得し、type:touchpad
の代わりにそれを使用します。
アクセラレーションなど他のオプションについては sway-input(5) で詳細を確認できます。
HiDPI
設定ファイルの output
コマンドでディスプレイのスケールファクタを設定してください。スケールファクタは小数でも指定できます。HiDPI ディスプレイの場合は 2 などに設定してください。
~/.config/sway/config
output <name> scale <factor>
ディスプレイの名前は以下のコマンドで確認できます:
$ swaymsg -t get_outputs
カスタムキーバインド
キーボードの特殊なキーを使ってコマンドを実行することができます。例えば、ボリュームや画面の明るさを制御するには:
~/.config/sway/config
bindsym XF86AudioRaiseVolume exec pactl set-sink-volume $(pacmd list-sinks |awk '/* index:/{print $3}') +5% bindsym XF86AudioLowerVolume exec pactl set-sink-volume $(pacmd list-sinks |awk '/* index:/{print $3}') -5% bindsym XF86AudioMute exec pactl set-sink-mute $(pacmd list-sinks |awk '/* index:/{print $3}') toggle bindsym XF86MonBrightnessDown exec brightnessctl set 5%- bindsym XF86MonBrightnessUp exec brightnessctl set +5% bindsym XF86AudioPlay exec playerctl play-pause bindsym XF86AudioNext exec playerctl next bindsym XF86AudioPrev exec playerctl previous bindsym XF86Search exec bemenu-run
詳細や代替ユーティリティについては、PulseAudio#キーボードのボリュームコントロール、Advanced Linux Sound Architecture#キーボードのボリュームコントロール、バックライト#バックライトユーティリティ、MPRIS を参照してください。
ロック画面がアクティブなときにキーバインドを実行できるようにするには、--locked
パラメーターを bindsym に追加します。
bindsym --locked XF86AudioPlay exec playerctl play-pause
グラフィカルインジケーターバー
明るさや音量などのパーセント値設定の現在のレベルを、調整時にグラフィックバーで示すことが望ましい場合があります。sway でこの機能を提供するための良い選択肢は wobAUR (あるいはwob-gitAUR) で、人気のあるXツールの機能のサブセットで、レイヤシェルプロトコルを実装するネイティブの Wayland ユーティリティとして機能します。使用例については、 project website を参照してください。
Overview of workspaces
If you are using a lot of workspaces with a lot of windows and cannot follow what is where any more, then sovAUR can come in handy. It is an overlay that shows schemas for all workspaces to make navigation in sway easier. It shows program names, window titles, supports multi-output setup. See the project page for more information.
アイドリング
Sway には、アイドルセッションを処理するための専用のアイドル管理デーモン swayidle があります。デーモンを起動してパラメータ化する方法はいくつかあります。最も簡単な方法は、sway 自体の設定を使用することです。swayidle
は、timeout
(別名 idling)、resume
(resume from sleep) 、before-sleep
などのイベントを構成するための多数の引数を受け取ります。イベントの詳細と詳細については、swayidle(1) を参照してください。その後、各イベントにアクションを割り当てることができます。イベントに複数のアクションを割り当てるには、トリガーを繰り返すだけです。
次の例では、swayidle
30分後に画面をロックし、5/2後に画面をオフにします。
~/.config/sway/config
exec swayidle -w \ timeout 1800 'swaylock -f' \ timeout 1805 'swaymsg "output * dpms off"' \ resume 'swaymsg "output * dpms on"'
ロックされたスクリーンをもっと早く、例えば10秒後にオフにするには、ロックマネージャのプロセスリストを grep し、以下のように swaymsg "output * dpms off"
を実行します。
timeout 10 'if pgrep -x swaylock; then swaymsg "output * dpms off"; fi'
再生中のメディアを一時停止または一時停止する前に画面をロックするには、swayidle コマンドの次の手順を修正します。
before-sleep 'playerctl pause' before-sleep 'swaylock'
フローティングウィンドウ
フローティングウィンドウまたはウィンドウの割り当てを有効にするには、アプリケーションを開き、app_id
、class
、instance
、および title
属性を使用して、フローティングウィンドウの割り当てを有効にします。次のコマンドは、開いているすべてのウィンドウのプロパティを一覧表示します。
$ swaymsg -t get_tree
開いているすべてのウィンドウの app_id
のみを取得するには、次を使用します。
$ swaymsg -t get_tree | grep "app_id"
フォーカスのあるウィンドウの app_id
を取得するには、次を使用します。
$ swaymsg -t get_tree | jq -r '..|try select(.focused == true)'
一部のウィンドウで app_id
が null になる場合は、class
属性または instance
属性 (あるいはその両方) を使用して、フローティングモード/ウィンドウの割り当てを有効にする必要があります。出力を検索して、ウィンドウの細かいルールを作成できます。
~/.config/sway/config
for_window [app_id="galculator"] floating enable assign [class="firefox"] -> 3 assign [class="^Urxvt$" instance="^htop$"] -> 9
これは、xorg-xprop を使用して X11 の class
または wm_name
属性を検索するのと似ています。
複数のモニターを使用する場合、フローティングスクラッチパッドウィンドウが大きくなりすぎて、複数のモニターをカバーする可能性があります。このコマンドはフローティングウィンドウを中央に配置し、現在のモニターのサイズの 80% のサイズに変更します。
$ swaymsg move position center; swaymsg resize set 80ppt 80ppt
クリップボード
デフォルトでは、ウィンドウを閉じるとクリップボードは空になります。これは意外なことにデフォルトの動作だったりします。
クリップボードの内容をウィンドウ間で共有するには、 "クリップボードマネージャ" をインストールする必要があります。
Wayland 用に設計されたクリップボードマネージャの一例は、clipmanAUR または clipman-gitAUR からインストールできる clipman です。
Sway で clipman を起動するには、設定ファイルに次の行を追加します。
~/.config/sway/config
exec wl-paste -t text --watch clipman store
Xresources
sway で使用するには .Xresources
を .Xdefaults
にコピーしてください。
XWayland
詳細と利用可能なパッケージの概要については、Wayland#XWayland を参照してください。
XWayland の使用はデフォルトで有効になっています。
一方、XWayland を無効化し、Sway の純粋な Wayland セッションを使うには次のようにします:
~/.config/sway/config
xwayland disable
別の wlroots レンダラーを使用する
環境変数 WLR_RENDERER
を指定することにより、別の wlroots renderer を使用することができます。利用可能なレンダラーの一覧は、wlroots ドキュメントにあります。
ヒントとテクニック
最初に CapsLock/NumLock を有効にする
デフォルトでは、sway は起動時に最初に CapsLock
と NumLock
キーを無効にします。代わりに、起動時にこれらを有効にするには、キーボード入力設定の xkb_capslock
または xkb_numlock
あるいはその両方を enable
に設定します。例えば、すべてのキーボードで有効にするには、sway 設定に次の行を追加します。
~/.config/sway/config
input * xkb_capslock enable input * xkb_numlock enable
いずれの場合も、キーボードの該当するキーを押すことで CapsLock
と NumLock
を切り替えることができます。
現在のキーボードレイアウト
現在のキーボードレイアウトは、次のようにして取得できます。kbd_identifier
は、キーボードの識別子で置き換える必要があります。
$ swaymsg -t get_inputs | jq -r '.[] | select(.identifier == "kbd_identifier") | .xkb_active_layout_name'
コンポーズキー
PrintScreen
をコンポーズキーとして設定するには、
$ swaymsg 'input * xkb_options compose:prsc'
コンポーズキーの組み合わせは、XCompose ファイルで設定することもできます。この変更を有効にするには、アプリケーションを再起動する必要があります。
/usr/include/X11/keysymdef.h
でキーの名前を調べたり、xev(1) のようなデバッガ xkbcli-interactive-wayland(1) (/usr/lib/xkbcommon/
フォルダ中) を使ったりすることができます。
バックライト切り替え
ディスプレイの電源をオフ (またはオン) にするには (例:Pause
)、次のスクリプトを Sway config
でバインドします。
#!/bin/sh read lcd < /tmp/lcd if [ "$lcd" -eq "0" ]; then swaymsg "output * dpms on" echo 1 > /tmp/lcd else swaymsg "output * dpms off" echo 0 > /tmp/lcd fi
画面キャプチャと画面共有
こちらを参照 スクリーンキャャプチャ#Wayland
色温度調整
こちらを参照 バックライト#Wayland.
キーボードを使用して swaynag を制御する
既定の警告/プロンプトプログラムである Swaynag は、sway に付属しており、ユーザーによるマウス操作のみをサポートしています。キーボードショートカットによる対話を有効にするには、swaynagmodeAUR などのヘルパープログラムを使用します。
Swaynag モードは、まず swaynag を起動し、次のボタンの選択、プロンプトの削除、選択したボタンの受け入れなどのアクションをトリガーするシグナルを待機します。これらのシグナルは、制御引数 (swaynagmode--select right
や swaynagmode--confirm
など) を指定して swaynagmode スクリプト自体の別のインスタンスを起動することで送信されます。
デフォルトでは、Swaynagmode は初期化時にスウェイモード nag
をトリガーし、終了時に default
をトリガーします。これにより、sway 構成でキーバインディングを簡単に定義できます。
~/.config/sway/config
set $nag exec swaynagmode mode "nag" { bindsym { Ctrl+d mode "default" Ctrl+c $nag --exit q $nag --exit Escape $nag --exit Return $nag --confirm Tab $nag --select prev Shift+Tab $nag --select next Left $nag --select next Right $nag --select prev Up $nag --select next Down $nag --select prev } }
sway バージョン1.2以降では、モード名で大文字と小文字が区別されることに注意してください。
swaynagmode を使用するように sway を設定するには、設定コマンド swaynag_command swaynagmode
を使用します。
カーソルテーマとカーソルの大きさ
カーソルテーマ やカーソルの大きさを変更するには:
~/.config/sway/config
seat seat0 xcursor_theme my_cursor_theme my_cursor_size
my_cursor_theme
は Default
, Adwaita
, Simple-and-Soft
などに置きかえ、my_cursor_size
は 48
などに置きかえます。
echo $XCURSOR_SIZE
と echo $XCURSOR_THEME
でこれらの値を調べることができます。
変更を反映させるにはアプリケーションを再起動してください。
systemd を使用した sway 固有のデーモンの管理
一部のサービス/デーモン (swayidle や kansiなど) は、現在のウィンドウマネージャが Sway の場合にのみ開始し、Sway が停止したときにこれらのサービスを停止したい場合があります。これを行うには、sway-session.target
を作成し、sway-session.target
が必要とするデーモン/サービスを作成します。この systemd ターゲットは、ユーザーターゲットである必要があります (systemd/ユーザー を参照) 例:
~/.config/systemd/user/sway-session.target
[Unit] Description=Sway compositor session Documentation=man:systemd.special BindsTo=graphical-session.target Wants=graphical-session-pre.target After=graphical-session-pre.target
次に、Sway の設定ファイル(たとえば、~/.config/sway/config
に行を追加するか、/etc/sway/config.d/
に新しいファイルを追加して) 次の行を追加します。
~/.config/sway/config
... ... ... exec_always "systemctl --user import-environment; systemctl --user start sway-session.target"
設定ファイルの上記の行追加で、Sway が起動するたびに sway-session.target
もアクティブになります。
最後に、目的のサービスを sway-session.target
にリンクします。たとえば、kansi (または kansi-gitAUR) サービスを追加するには、次のように入力します。
~/.config/systemd/user/kanshi.service
[Unit] Description=Dynamic output configuration for Wayland compositors Documentation=https://sr.ht/~emersion/kanshi BindsTo=sway-session.target [Service] Type=simple ExecStart=/usr/bin/kanshi [Install] WantedBy=sway-session.target
このユーザーユニットを有効化は、Sway が動作している時のみ有効で、Sway が停止すると無効になります。
sway-session.target
ファイルの作成と環境のインポートは、sway-systemd-gitAUR をインストールすることでも行うことができます。sway-systemd はサービスを cgroup に分けるだけでなく、各 GUI アプリケーションを独自の cgroup に配置します。これにより、個々のアプリケーションに対して cgroup 単位のリソース制約を課すことができます。sway-systemd README を参照してください。
起動後の画面解像度の変更
グラフィカルプログラム wdisplaysAUR またはターミナルプログラム wlr-randrAUR を使って、回転、解像度を変更し、ディスプレイを配置します。
ヘッドレス出力の作成
物理的なビデオインターフェイスに関連しない出力を作成する、 HEADLESS-1、HEADLESS-2 など。
$ swaymsg create_output
新しい出力の説明を表示します。
$ swaymsg -pt get_outputs | grep -A 10 HEADLESS
新しい出力を、たとえば output
コマンドで設定します。
~/.config/sway/config
output HEADLESS-1 { pos 1920,0 mode 1280x720@75Hz }
既知の問題
アプリケーションランチャー
i3-dmenu-desktop dmenu、および rofi はすべて Sway では比較的うまく機能しますが、すべて XWayland で実行されており、カーソルをネイティブの Wayland ウィンドウに移動すると応答しなくなるという同じ問題があります。この問題の理由は、Wayland のクライアント/ウィンドウが画面のフォーカスを持っていない限り、入力デバイスにアクセスできないためです。XWayland サーバ自体が Wayland コンポジタのクライアントであるためで、XWayland クライアントの1つは、ユーザ入力にアクセスするためのフォーカスを持っている必要があります。しかし、クライアントの1つがフォーカスを取得すると、入力を収集し、X11 プロトコルを介してすべての XWayland クライアントが利用できるようにします。そのため、XWayland のウィンドウにカーソルを移動して Esc キーを押すと問題が解決し、pkill
を実行しても問題が解決する場合があります。
bemenu は、デスクトップファイルを起動するための Wayland ネイティブの組み合わせを提供するために、オプションでj4-dmenu-desktopAUR と組み合わせることができる (i3-dmenu-desktop のように) Wayland dmenu のネイティブの代替品です。
j4-dmenu-desktop --dmenu='bemenu -i --nb "#3f3f3f" --nf "#dcdccc" --fn "pango:DejaVu Sans Mono 12"' --term='termite'
XWayland を無効にしない場合は、BEMENU_BACKEND
環境変数を "wayland" に設定する必要があります。
フローティングターミナルと fzf を使用して独自のビルドを行うこともできます (GitHub の問題 を参照)
また、plasma-workspace パッケージが提供する krunner
バイナリもランチャーとして機能し、XWayland とネイティブ Wayland の両方をサポートします。
rofi-lbonn-wayland-gitAUR は rofi の派生形で、Wayland で動作します。また、X11 セッションで起動する必要がある場合は -x11
フラグがあります。
wofi はコマンド・ランチャーで、rofi と同じ機能の一部を提供します、wofi には、SSH モードやウィンドウ切り替えモードなど、rofi の機能の一部が欠けています。これは wlroutes ライブラリに基づいており、レンダリングには GTK3 を使用していて、 sway にはとてもよく効きます。
仮想環境で使う
Sway は VirtualBox や VMware ESXi の両方で動作します。
Sway を tty から起動できない
3D アクセラレーションを有効にする必要があります。VMware#Intel と Optimus で 3D グラフィックを有効化 を参照してください。
マウスカーソルが表示されない
特定のグラフィックスドライバー(VMSVGA グラフィックコントローラーやのプロプライエタリ NVIDIA ドライバーなど)を使うとカーソルが表示されません。これは、[1] で説明されているようにソフトウェアカーソルを使用して修正できます。
$ export WLR_NO_HARDWARE_CURSORS=1
Sway Socket Not Detected
ターミナルマルチプレクサ (例: GNU Screen や tmux) の中で swaymsg -t get_outputs
などのように swaymsg
を使ったときに、以下のようなメッセージが返ってくることがあります:
sway socket not detected. ERROR: Unable to connect to
これは swaymsg
が SWAYSOCK
のソケットに接続できないことを意味しています。
SWAYSOCK
の現在の値を確認するには:
$ env | fgrep SWAYSOCK SWAYSOCK=/run/user/1000/sway-ipc.1000.4981.sock
最初の sway ソケットにアタッチしてみて、コマンドを再実行してみてください:
$ export SWAYSOCK=$(ls /run/user/*/sway-ipc.*.sock | head -n 1)
上記のエラーを解決するには、マルチプレクサの外でコマンドを実行する必要があります。
Unable to retrieve socket path
tty から swaymsg -t
を実行すると、
Unable to retrieve socket path
というメッセージが表示されます。これは SWAYLOCK
環境変数が Sway 起動後に設定されるためで、swaymsg
は Sway 内のターミナルで実行してください。
キー割り当てとキーボードレイアウト
デフォルトでは、複数のキーボードレイアウト {{ic|input * xkb_layout "us,ru"} を使用している場合、セカンダリレイアウトを切り替えたときにバインディングが壊れることがあります。
https://github.com/swaywm/sway/pull/3058, のおかげで、以下のように --to-code
行に --to-code
キーを追加するだけで済みます。
bindsym --to-code { $mod+$left focus left $mod+$down focus down $mod+$up focus up $mod+$right focus right }
または、変数 set$mybind bindsym--to-code
を作成し、bindsym
のすべてのインスタンスを $mybind
で置き換えることもできます。$mybind$mod+w thing
Java アプリケーション
一部の Java ベースのアプリケーション (IntelliJ、CLion、PyCharm などの JetBrains エディタ) を開くと、空白の画面が表示されます。これを軽減するには、_JAVA_AWT_WM_NONREPARENTING
環境変数を1に設定してアプリケーションを起動します。
rofi や dmenu などのランチャーからアプリケーションを起動する場合は、 デスクトップエントリ#環境変数の修正 に示すように、アプリケーションのデスクトップエントリを変更してください。
Java アプリケーションに関するいくつかの問題は、OpenJDK11 および Sway 1.5 で修正されました。ただし、一部のアプリケーションでは、新しいバージョンの OpenJDK を使用するために追加の構成が必要です。Android Studio の場合は、STUDIO_JDK=/usr/lib/jvm/java-11-openjdk/
を設定する必要があります。 [2]
ボーダーでスクロール
アプリケーションのボーダー上でマウスのスクロールホイールを使用するとクラッシュする場合は、app_id
(例:Firefox) に border none
を設定してください。
Program cannot open display
起動時にProgram cannot open display というエラーメッセージが表示されてプログラムがクラッシュする場合は、使用しているプログラムが X11 プログラムである可能性があります。XWayland 互換性レイヤを使って Wayland で X11 プログラムを実行することができます。詳細は Sway#XWayland を参照してください。