Sway

提供: ArchWiki
2021年12月1日 (水) 12:06時点におけるKusanaginoturugi (トーク | 投稿記録)による版 (→‎アイドリング: 手順に修正)
ナビゲーションに移動 検索に移動

関連記事

sway (SirCmpwn's Wayland window manager) は i3 と互換性のある Wayland コンポジタを作成しようという試みです。公式ウェブサイト より:

Sway は Wayland において Xorg の i3 ウィンドウマネージャの代わりとなるウィンドウマネージャです。既存の i3 設定で動作し i3 の機能のほとんどをサポートしています。

インストール

swaysway パッケージでインストールできます。最新の開発版は wlroots-gitAURsway-gitAUR でインストールできます。swaywlroots に緻密に依存しているので、sway 更新時には wlroots も更新するのが望ましいです。

ノート: NVIDIA を含む、すべての専用グラフィックスドライバは サポートされていません。(ただし、一部の機能は、wlroots-eglstreams-gitAURによって提供されます。)

また、画面をロックする swaylock や、アイドル時間管理デーモンの swayidle もインストールできます。

デフォルトのアプリケーションランチャーは dmenu であり、ターミナルエミュレータは alacritty です。インストールするか、あるいは設定ファイルで別のアプリケーションに変更するかを、初回起動の前に行なうことが望ましいです。

sway の起動

ヒント: ウィンドウ装飾ライブラリなど設定する必要がある環境変数については Wayland#GUI ライブラリを参照。

ターミナルから

ターミナルに sway と入力すれば sway が起動します。

TTY ログイン時に自動起動

X と同様に、Sway はシェル初期化ファイルに以下を追加することで開始できます。(コマンドシェル#ログインシェルを参照):

if [ -z $DISPLAY ] && [ "$(tty)" == "/dev/tty1" ]; then
  exec sway
fi

詳細については、xinitrc#ログイン時に X を自動起動 を参照してください。

ディスプレイマネージャを使う

ノート: Sway は公式にはディスプレイマネージャをサポートしていません。

sway のセッションは /usr/share/wayland-sessions/sway.desktop にあります。GDMSDDM などのディスプレイマネージャは自動的にセッションを認識します。

ディスプレイマネージャを通して、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_LAYOUTXKB_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) を参照してください。

ヒント: waybar は sway に含まれているバー (swaybar) の代替になります。

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 "2:14:ETPS/2_Elantech_Touchpad" {
    tap enabled
    natural_scroll enabled
}

デバイスの識別子は以下のコマンドで確認できます:

$ swaymsg -t get_inputs

上記のコマンドの出力には、"/" などの記号をエスケープするために "\" が付いていることがあります (例: "2:14:ETPS\/2_Elantech_Touchpad")。設定に追加するときはエスケープを取り除いてください。

アクセラレーションなど他のオプションについては sway-input(5) で詳細を確認できます。

HiDPI

設定ファイルの output コマンドでディスプレイのスケールファクタを設定してください。スケールファクタは小数でも指定できます。HiDPI ディスプレイの場合は 2 などに設定してください。

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

brightnessctl を使うことで輝度を制御できます。輝度や色補正を制御するユーティリティについてはバックライトを見てください。

ロック画面がアクティブなときにキーバインドを実行できるようにするには、--locked パラメーターを bindsym に追加します。

bindsym --locked XF86AudioPlay exec playerctl play-pause
ヒント: wevAUR は、Wayland の xorg-xev と同様の機能を提供するツールです。
ノート: systemd は、電源キーやふたの開閉などの特別なキーや、閉じるイベントを処理します。これらは、sway で設定されたものと干渉する可能性があります。systemd での設定方法の詳細については、loginctl(1) および logind.conf(5)} を参照してください。

グラフィカルインジケーターバー

明るさや音量などのパーセント値設定の現在のレベルを、調整時にグラフィックバーで示すことが望ましい場合があります。sway でこの機能を提供するための良い選択肢は wobAUR (あるいはwob-gitAUR) で、人気のあるXツールの機能のサブセットで、レイヤシェルプロトコルを実装するネイティブの Wayland ユーティリティとして機能します。使用例については、 project website を参照してください。

アイドリング

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' \
	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'
ノート: systemd も sway で設定されたイベントと競合する可能性のあるアイドルイベントを処理します。構成方法の詳細については、loginctl(1) および logind.conf(5) を参照してください。

フローティングウィンドウ

フローティングウィンドウまたはウィンドウの割り当てを有効にするには、アプリケーションを開き、app_idclassinstance、および 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 を使用して X11class または wm_name 属性を検索するのと似ています。

クリップボード

この記事あるいはセクションは クリップボード と合併することが議論されています。
ノート: Not specific to Sway. (議論: トーク:Sway#)

デフォルトでは、ウィンドウを閉じるとクリップボードは空になります。これは意外なデフォルトの動作だったりします。

クリップボードの内容をウィンドウ間で共有するには、 "クリップボードマネージャ" をインストールする必要があります。

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
ノート: アプリケーションによっては設定が Wayland ネイティブで動作させることが必要な場合や、大抵のプロプライエタリなアプリケーションなどでは全く Wayland に対応していないことがあります。今のところそのようなアプリケーションが使えるように XWayland は無効化しないことが推奨されます。

ヒントとテクニック

CapsLock/NumLock の有効化

CapsLock や NumLock を有効にするには:

~/.config/sway/config
input * xkb_capslock enable
input * xkb_numlock enable
ノート: これらのオプションを有効にすると、sway 設定ファイル Bugzilla 1652820 をリロードしたときに Firefox がクラッシュする可能性があります。

現在のキーボードレイアウト

現在のキーボードレイアウトは、次のようにして取得できます。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 rightswaynagmode--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_themeDefault, Adwaita, Simple-and-Soft などに置きかえ、my_cursor_size48 などに置きかえます。 変更を反映させるにはアプリケーションを再起動してください。 さらなる詳細はカーソルテーマsway-input(5) を参照。

ノート: Wayland ではクライアント側でカーソルテーマが決定されます。アプリケーションが$XCURSOR_SIZE, $XCURSOR_THEME 環境変数を参照しないこともありえます。

systemd を使用した sway 固有のデーモンの管理

この記事あるいはセクションは systemd/ユーザー と合併することが議論されています。
ノート: The graphical-session.target should be described generally on the systemd page. systemd/ユーザー#Xorg と systemd is flagged for expansion. (議論: トーク:Sway#)

一部のサービス/デーモン (swayidlekansiなど) は、現在のウィンドウマネージャが 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://github.com/emersion/kanshi
BindsTo=sway-session.target

[Service]
Type=simple
ExecStart=/usr/bin/kanshi

[Install]
WantedBy=sway-session.target

このサービスを有効にすると (--user フラグを使用) 、Sway が実行されている場合にのみアクティブになり、Sway が停止した場合には非アクティブになります。

$ systemctl --user enable --now kanshi.service

起動後の画面解像度の変更

グラフィカルプログラム wdisplaysAUR またはターミナルプログラム wlr-randrAUR を使って、回転、解像度を変更し、ディスプレイを配置します。

既知の問題

アプリケーションランチャー

ヒント: Sway の wiki には 既知のアプリケーションランチャーのリスト もあります。

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-gitAURrofi の派生形で、Wayland で動作します。また、X11 セッションで起動する必要がある場合は -x11 フラグがあります。

wofi はコマンド・ランチャーで、rofi と同じ機能の一部を提供します、wofi には、SSH モードやウィンドウ切り替えモードなど、rofi の機能の一部が欠けています。これは wlroutes ライブラリに基づいており、レンダリングには GTK3 を使用していて、 sway にはとてもよく効きます。

仮想環境で使う

Sway は VirtualBoxVMware ESXi 上でも動作するものの、場合によっては設定が必要です。

Sway を tty から起動できない

3D アクセラレーションを有効にする必要があります。VMware#Intel と Optimus で 3D グラフィックを有効化 を参照してください。

マウスカーソルが表示されない

VMSVGA グラフィックコントローラーを使うとカーソルが表示されません。Sway 起動時に 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

これは swaymsgSWAYSOCK のソケットに接続できないことを意味しています。

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に設定してアプリケーションを起動します。

rofidmenu などのランチャーからアプリケーションを起動する場合は、 デスクトップエントリ#環境変数の修正 に示すように、アプリケーションのデスクトップエントリを変更してください。

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 を参照してください。

Sway v1.6 で nouveau を使うとゴミが表示される

nouveau を使用して Nvidia GPU に接続された1つ以上のディスプレイに破損したイメージが表示されて、正しく起動しない場合は、sway を開始する前にWLR_DRM_NO_MODIFIERS=1 を設定してみてください。

$ WLR_DRM_NO_MODIFIERS=1 sway

根本的な問題は Mesa の未解決の nouveau バグに関連しており、今後のアップデートで修正されるはずです。[3]

参照