Open19

Sway WMを導入

kat0hkat0h

偉大なる先駆者
https://wiki.archlinux.jp/index.php/Sway
https://aodag.dev/posts/2021-12-16-sway/
https://riq0h.jp/2021/04/10/091649/
https://zenn.dev/haxibami/articles/wayland-sway-install#入力メソッド
https://inthisfucking.world/sway/
https://mako-note.com/ja/sway-desktop-environment-in-archlinux/
https://soyuka.me/make-screen-sharing-wayland-sway-work/
https://mako-note.com/ja/sway-desktop-environment-in-archlinux/

まずデフォルトのコンフィグをコピーしてくる
なんだかi3よりコメントが沢山書いてあったり親切な印象

cp /etc/sway/config ~/.config/sway/config

自分はconfigファイルをdotfilesマネージャで管理したいのでシンボリックリンクを貼った

ディスプレイマネージャーはManjaroKDE付属のSDDMを使うが、これは上手く動作しているように見える
Swayの起動エントリは/usr/share/wayland-sessions/sway.desktopに生成されている
これはswayコマンドをexecさせるだけなので、仮想コンソールからそのまま起動しても問題ない
この記事によると環境変数はSwayの起動前に設定する必要がある&&KDEとSwayの環境を分離したいためswayコマンドをwrapしたswayonコマンドを新たに作成した

swayon
#!/bin/sh

export XDG_SESSION_TYPE=wayland
export XDG_CURRENT_DESKTOP=sway
export XDG_CURRENT_SESSION=sway
export LIBSEAT_BACKEND=logind
export QT_QPA_PLATFORM=wayland
# export GDK_DPI_SCALE=1.5
# export QT_SCALE_FACTOR=1.5
export MOZ_ENABLE_WAYLAND=1
export WINIT_UNIX_BACKEND=x11

exec sway

Tips

yay -Ql <package>でパッケージが生成?するファイル名の一覧を取得できる
デフォルトの設定ファイルを探すのに便利

Wayland周りの設定はHyprlandのWikiも参考になりそうです
https://wiki.hyprland.org/

kat0hkat0h

ディスプレイ

HiDPiディスプレイを使っているのでスケーリングはマスト
あいにくSwayは少数スケーリングを非推奨にしているが、全然普通に動く
XWaylandの表示がにじむらしいが、どうせターミナルとブラウザーしか使わないので気にしない

マルディスプレイ関連はwdisplaysコマンドを使うと都合が良い
よくある設定画面を使って画面配置を調整できる
ただし、設定の永続化はしてくれないのでヘルパーでも設定しておこう(#TODO)

configファイルでは次のように指定する
画面の名前はwdisplaysで調べるのが手っ取り早い

output <display> scale 1.25

arandrはXWaylandの画面を認識してしまうので注意

kat0hkat0h

入力周り

Waylandはマウスやトラックパッド、キーボードをLibinputを用いてハンドリングしている...らしい
便利なのがトラックパッド(Thinkpadに付いてたsynaptics)で、macOSでもあるようなジェスチャによるページ遷移や慣性スクロールなどが利用できる(Firefoxで確認)
正直これだけでもWaylandを使う価値がある

設定はconfigファイルから出来るらしい 超便利

クリップボード

Waylandの設計はセキュリティのために、クリップボードの内容はコピー元のアプリケーションが終了すると削除される

neovim

neovimでクリップボードを使うには wl-clipboardを導入する

キーボード

例の如く、Caps_lockとControlを入れ替える
Caps_lockは誰も幸せにしない

input * {
    xkb_options "ctrl:swapcaps"
}

トラックポイント

アクセラレーションプロファイルをflatにする
トラックポイントは傾いただけ動くべきで加速度はいらない

input type:pointer {
    accel_profile flat
    pointer_accel 0.3
    scroll_factor 0.5
}

トラックパッド

アクセラレーションプロファイルをadaptiveにする
macOSからの移行組なので、加速度は欲しい
正直移動量を算出する式?はmacOSの方が良くできている
確か変えられたと思うので調整してみるのもありかもしれない

input type:touchpad {
    tap enabled
    natural_scroll enabled
    accel_profile adaptive
    pointer_accel 0
    scroll_factor 0.3
    click_method none
}
項目 意味
tap enabled/disabled (トラックパッド)タップtoクリックを有効にするか
accel_profile flat/adaptive いわゆる加速度
pointer_ accel -1< >1 ポインターの速度
scroll_factor (多分) -1< >1 スクロールの速度
click_method none/button_areas/clickfinger トラックパッドの下部をタップした際の動作

https://man.archlinux.org/man/sway-input.5
ほかの設定項目は上記ページから探すとよい

kat0hkat0h

Waylandとの互換性に起因する問題

Electron

VSCodeを小数スケーリング付きのSway上で実行すると表示がぼやけることがある
これは、VSCodeを画面に描画するElectronを動かすChromiumがXWayland上で実行されているためである
一時しか使わないアプリケーションであればこのままで問題ないが、VSCodeのような日常的に使うアプリケーションでは我慢ならないので、修正する必要がある

コンソールから起動する際はcodeコマンドに--ozone-platform-hint=autoを付けるとよい
その他の場合は後ほど追記する

自分はVimを使うのでどうでもよい

Electron全般に対する設定として、.config/electron-flags.confを使う方法も存在する(要検証)

Chrome

Linuxを使うのならFirefoxを利用したいところだが、Google Chromeを使う場合は次のコマンドで起動させると良い
これによりozoneがWaylandネイティブで起動し、タッチパッドジェスチャによるページ遷移が可能になる
chrome://flagsで永続化できる(要検証)

google-chrome-stable --ozone-platform-hint=auto --enable-features=TouchpadOverscrollHistoryNavigation

手元ではChromeでfcitx5が使えない

2023/02/21追記
--gtk-version=4をつけると動くようになるそうです(ならない場合もあるなぜ)
soracatさんありがとうございます!

設定が必要そうな雰囲気がする

Firefox

export MOZ_ENABLE_WAYLAND=1

kat0hkat0h

org.freedesktop.secrets

しーくれっとすとあ?を設定する
今回はKDEをサブ環境に持っているので、KDE Walletsを使う
(gnome-keyringでもいいらしい)

exec /usr/lib/pam_kwallet_init
kat0hkat0h

音量のコントロール

ManjaroLinuxは標準でPulseAudioを使う
Swayからはpamixer経由で音量をコントロールする

予めPATHに適当なコマンドを用意しておく
このコマンドでwobを使うと、ミュートにした際バーが赤色になる
便利なのでおすすめ

#!/bin/sh

ISMUTE=`pamixer --get-mute | awk '{if($0=="true"){print 1}else{print 0}}'`

if [ $ISMUTE -eq "1" ]; then
  pactl get-sink-volume @DEFAULT_SINK@ | awk 'NR==1{print 100+substr($5, 1, length($5)-1)}'
else
  pactl get-sink-volume @DEFAULT_SINK@ | awk 'NR==1{print substr($5, 1, length($5)-1)}'
fi
# 音量調整
bindsym XF86AudioRaiseVolume exec pamixer -i 5 && nowvol > $WOBSOCK
bindsym XF86AudioLowerVolume exec pamixer -d 5 && nowvol > $WOBSOCK
bindsym XF86AudioMute exec pamixer -t && nowvol > $WOBSOCK

ところでThinkPadのキーボードにはMuteの状態を示すインジケーターが付いているが、これはきちんと動作した
これは誰が制御しているのだろう

インジケーターはwob(AUR)で表示できる

set $WOBSOCK $XDG_RUNTIME_DIR/wob.sock
exec rm -f $WOBSOCK && mkfifo $WOBSOCK && tail -f $WOBSOCK | wob

ソケットを作って、

bindsymの後ろに

pactl get-sink-volume @DEFAULT_SINK@ | awk 'NR==1{print substr($5, 1, length($5)-1)} > $WOBSOCK

でも付けておくとよい

現状音量が限界突破するので注意 pamixerを使えばOK

出力先の変更はAlsamixerから弄ればいいのかな?

kat0hkat0h

輝度のコントロール

/sys/class/backlight/<device>/brightnessに値を書き込むことで明るさを調整できるが、面倒なのでラッパーコマンドであるlightパッケージを使用する

brightnessへのアクセスには管理者権限が必要だが、ログインしているユーザーをvideoグループに追加すると一般ユーザでもアクセス出来るようになる

bindsym XF86MonBrightnessUp exec light -A 10
bindsym XF86MonBrightnessDown exec light -U 10

wobを使うなら、

light | sed 's/\..*//' > $WOBSOCK

とでも書いておくとよろし

kat0hkat0h

rootでGUIアプリを開く

Gtk-WARNING **: 22:38:14.297: cannot open display:
このエラーはsudo -Eで防げる

timeshift

btrfsで高速スナップショット
.desktopから起動されるのはtimeshift-launcherだがうまく起動しないので、ターミナルから

sudo -E timeshift-gtk

でひとまず起動できる

-Eフラグはユーザーの環境変数を引き継ぐオプション
そのままだとtimeshift側がディスプレイを見付けられないらしい

kat0hkat0h

Firefox

Vixen + TreeStyleTab + UserCSSでSwayに最適化

これはmacOSのスクリーンショット

body {
	background-image: url("./img/background.gif");
}

H1 {
	color: white;
	font-size: large;
	background: #666666;
	padding-top: 2px;
	border-top: #cccccc 2px solid;
	border-bottom: #333333 2px solid;
	padding-bottom: 2px;
	padding-left: 1em;
	border-left: #cccccc 2px solid;
	border-right: #333333 2px solid;
	padding-right: 2px;
}

H2 {
	color: white;
	font-size: medium;
	background: #666666;
	padding-top: 2px;
	border-top: #cccccc 2px solid;
	border-bottom: #333333 2px solid;
	padding-bottom: 2px;
	padding-left: 1em;
	border-left: #cccccc 2px solid;
	border-right: #333333 2px solid;
	padding-right: 2px;
	margin-right: 30%;
}

DIV.note {
	background: #ffdddd;
	border: outset thin #ffcccc;
	border-top: 0px;
	border-left: 0px;
}

H2.note {
	font-size: medium;
	background: #886666;
	padding-top: 2px;
	border-top: #ddcccc 2px solid;
	border-bottom: #443333 2px solid;
	padding-bottom: 2px;
	padding-left: 1em;
	border-left: #ddcccc 2px solid;
	border-right: #443333 2px solid;
	padding-right: 2px;
	margin-right: 30%;
}

table {
	background-color: #FFFFFF;
}
kat0hkat0h

Wofi

Xorgでいうところのrofi
Alfredやspotlightみたいなやつ...らしい

yay -S wofi

ひとまず、dmenuの代替として動作させる

set $menu dmenu_path | wofi -d | xargs swaymsg exec --
kat0hkat0h

フォント

日本人なので中華フォントは避けたい
まずシステム全体に適用するフォントを設定する

/etc/fonts/local.conf
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
    <alias>
        <family>serif</family>
        <prefer>
            <family>Noto Serif</family>
        </prefer>
    </alias>
    <alias>
        <family>sans-serif</family>
        <prefer>
            <family>Noto Sans</family>
            <family>Noto Sans CJK JP</family>
        </prefer>
    </alias>
    <alias>
        <family>monospace</family>
        <prefer>
            <family>Noto Sans Mono CJK JP</family>
        </prefer>
    </alias>
</fontconfig>

本当はヒラギノフォントを使いたいが、コンフィグの可搬性が低下するのでNotoフォントで妥協

また、ユーザー単位ではフォントは~/.fontsにインストールする

システムに認識されているかどうかはfc-listコマンドで確かめる
fc-list | grep $USER | sort | less

font pango:<name> 8
kat0hkat0h

Waybar

そろそろオシャレなバーが欲しいところ

yay -S waybar

bar {
    swaybar_command waybar
}

デフォルトのbarを消し忘れないこと

デフォルトの設定は/etc/xdg/waybarにある

kat0hkat0h

テーマ

https://wiki.archlinux.jp/index.php/Qt_と_GTK_アプリケーションの外観の統合

nwg-look

https://choreonoid.org/ja/manuals/latest/install/setup-qt.html
環境変数はswayonで定義した

デファルトでは、等幅フォントが変なものになっているので元に戻す
ターミナルがおかしくなる (ManjaroのデフォはNerd patched Hack)

カーソル

Waylandのカオスがそこにある
Adwairaに合わせたのだが、Waybarに入ると小さくなる

なんやねん

kat0hkat0h

電源管理

Mac移行民からすると、サスペンド時に電源が持たなすぎてストレスがマッハ

tlpをインストールする(systemctlから有効化することを忘れないこと)

また、CPU周波数を制御するためにcpupower-guiを導入した
が、うまくうごかないので面倒になってやめた

kat0hkat0h

無線

KDEに付属してきたツールをそのまま利用した
コンソールからも起動できる
特に設定はいらなかった

KDE以外の環境であれば、nmtuiが便利

kat0hkat0h

Stacer
↑色々クリーニングしてくれる便利ツール