タイル型 Wayland コンポジター MangoWC のすすめ
ずっとタイル型ウィンドウマネージャーの awesome を使っていたんですが、Wayland への移行を機に「Wayland に対応していて」「FreeBSD でも使えて」awesome と同様に「マスター・スタック・レイアウト」が可能なタイル型ウィンドウマネージャーを探したところ、 Mango Wayland Compositor (以下 MangoWC) というトロピカルな名前のウィンドウマネージャー (Wayland では「コンポジター」というらしい) にたどり着きました。これが個人的にかなり好印象だったので、カスタマイズ方法等をまとめてみました。
なお、MangoWC のインストールや基本的な設定については次の記事を参照してください。
- FreeBSD 14.3 をインストールする (その 4): MangoWC / foot / Waybar / Fcitx5 / Anthy / Firefoxhttps://retrotecture.jp/freebsd/freebsd14_3_basicapps.html
目次
タイル型ウィンドウマネージャとは
図 1 のように、ユーザーが立ち上げたアプリを自動的に並べてくれるウィンドウマネージャーのことをタイル型ウィンドウマネージャーといいます。この例ではターミナル (foot) 2 個とブラウザ (Firefox) を起動しています。
MangoWC 公式サイトのトップにあるアニメーションがわかりやすいかもしれないです。
MangoWC の良いところ・残念なところ
良いところ:
- 軽量 (らしい)
他のウィンドウマネージャーと比較したわけではないですが、6 年くらい前の平凡なスペックのノートパソコンでストレスなく動いてます。ただしブラー (ぼかし) やシャドーなどの視覚効果は無効にして使っているので、それらを有効にしたときにどうなるかはわかりません。 - マスター・スタック・レイアウト
- その他のレイアウトにも対応。スクローリングなど
- ウィンドウのレイアウトをアプリごとに細かく制御できる。「あれはフローティングにする」とか、「これは〇番のタグ (ワークスペース) で開く」とか
- アニメーションが思いのほかきびきび動いて楽しい
- awesome に比べて設定が楽 (結局 Lua は身につかなかった…)
- IPC サポート
残念なところ: は特にないんですが、強いて挙げるなら、
- awesome と違ってタスクバーを自前で持っていない
タスクバーは Waybar などの外部アプリを別途用意する必要があります。 - タグの個数を変えられない
タグ数は 9 個で固定みたいです。どうしても変えたければ自分でコンパイルし直さなければならないみたいです。9 個もあっても私の脳みそが追いつかないので 4 個くらいでいいんですけど…… - タグの循環ができない
1 → 2 → 3 → ... とタグを順番に切り替えていって、9 番目のタグでさらに「→」したら 1 番に戻ってくれるとうれしいんですけど、そうはならないみたいです。
その他:
公式リポジトリの Mango's Vision を読んだ感じ、開発者自身は MangoWC はすでに成熟しており、今後大幅な機能追加は必要ないと考えているみたいです。個人的にはそういうスタンスは結構好きです。
外観のカスタマイズ
ここからは冒頭のスクリーンショットのような感じにしていきます。まずは外観のカスタマイズから始めます。
不要な視覚効果を無効化する
ブラー (ぼかし) やシャドーのような視覚効果は、個人的には不要だと思うので無効にします。
blur=0
shadows=0
アニメーションの設定
アニメーションは、最初は不要かなと思ったんですが、実際に見てみると思いのほか楽しかったので、ある程度残すことにしました。
animations=1
layer_animations=0
animation_type_open=slide
animation_type_close=slide
animation_fade_in=0
animation_fade_out=0
tag_animation_direction=1
animation_duration_move=100
animation_duration_open=100
animation_duration_tag=0
animation_duration_close=100
animation_duration_focus=0
- 1 行目: アニメーション有効
- 2 行目: レイヤーアニメーション (たぶんタスクバーとか通知とかの UI 関係) 無効
- 3,4 行目: ウィンドウが開いたり閉じたりしたときのアニメーションタイプ。slide のほかに zoom、fade、none がある
- 5,6 行目: フェード効果無効
- 7 行目: タグ (ワークスペース) を切り替えたときのアニメーションの方向 (0: 垂直方向、1: 水平方向)
- 8 ~ 12 行目: アニメーション時間の設定 (単位: ミリ秒)。デフォルトよりも短めに変更した
ウィンドウの角っこに丸みをつけない
デフォルトだとウィンドウの四隅が丸っこくなっており、その半径は border_radius で調整することができます。この値を 0 にすれば、完全に矩形なウィンドウになります。
border_radius=0
ウィンドウ周囲の余白調整
ウィンドウ間の余白は、水平方向、垂直方向それぞれ gappih、gappiv で設定します。デフォルトは 5 ピクセルです。また、ウィンドウとスクリーン外周との間の余白は、水平方向、垂直方向それぞれ gappoh、gappov で設定します。デフォルトは 10 ピクセルです。
私は貧乏人の性 (さが) でウィンドウを 1 ピクセルでも広く使いたいことから、いずれも 0 ピクセルに設定しています。
gappih=0
gappiv=0
gappoh=0
gappov=0
ウィンドウの境界線の幅
ウィンドウの境界線の幅はデフォルトで 4 ピクセルに設定されています。私は貧乏人の性 (さが) でウィンドウを 1 ピクセルでも広く使いたいことから、2 ピクセルに設定しています (1 ピクセルだとさすがに細すぎた)。
borderpx=2
非アクティブなウィンドウを目立たなくする
focused_opacity および unfocused_opacity により、アクティブなウィンドウと非アクティブなウィンドウそれぞれの不透明度を 0.0 ~ 1.0 の値で設定することができます。これを利用して、フォーカスが外れたら不透明度を下げてウィンドウを目立たなくするといったことができます。下の例ではそういったことは特に行わず、どちらも不透明度 100% にしています。
focused_opacity=1.0
unfocused_opacity=1.0
マスター・スタック・レイアウトの設定
マスター・スタック・レイアウトに関係する設定項目は次の 4 つです。
- new_is_master: 0 か 1 のブール値。1 のとき、新規生成のウィンドウがマスター領域に配置される
- default_mfact: マスター領域とスタック領域の面積比 (0.0 ~ 1.0)
- default_nmaster: マスターウィンドウの個数
- smartgaps: 0 か 1 のブール値。1 のとき、ウィンドウが 1 個しかない場合はギャップをなくす
設定例:
new_is_master=1
default_mfact=0.55
default_nmaster=1
smartgaps=0
色の設定
rootcolor=0x2b2b2bff
bordercolor=0x444444ff
focuscolor=0x478384ff
maximizescreencolor=0x89aa61ff
urgentcolor=0xad401fff
scratchpadcolor=0x516c93ff
globalcolor=0xb153a7ff
overlaycolor=0x14a57cff
色については、背景色である rootcolor とアクティブになったウィンドウの枠の色である focuscolor を少し変更しました。あとは今のところデフォルトのままです。
| 設定項目 | デフォルト (RGBA) | 変更後 (RGBA) | 色名称 |
|---|---|---|---|
| rootcolor | 0x201b14ff | 0x2b2b2bff | 黒 |
| focuscolor | 0xc9b890ff | 0x478384ff | 青碧 |
ついでに、Waybar のタグの色も調整します。
- どのタグも文字の色を 0xffffffff にする。
- アクティブなタグの背景色を 上記の focuscolor に合わせる。
#tags button {
padding: 0 0.4rem; /*More horizontal padding for text */
font-weight: normal;
+ color: @theme_selected_fg_color;
}
-@define-color theme_selected_bg_color #8fbcbb;
+@define-color theme_selected_bg_color #478384;
Waybar に関するその他の設定は別の記事に書いています:
- FreeBSD 14.3 をインストールする (その 4): MangoWC / foot / Waybar / Fcitx5 / Anthy / Firefoxhttps://retrotecture.jp/freebsd/freebsd14_3_basicapps.html
入力デバイスの設定
このあたりはよくわからないので、当たり障りのないようにデフォルトのままです。
repeat_rate=25
repeat_delay=600
numlockon=0
xkb_rules_layout=us
- repeat_rate: キーを長押ししたときに、その文字が 1 秒間に何回入力されるか
- repeat_delay: 何ミリ秒長押ししたらリピートを開始するか
- numlockon: よくわかりません
- xkb_rules_laout: XKB (X Keyboard Extension) で定義されているらしいレイアウトコード (us とか jp とか) を指定すると思われる
キーバインディング
修飾キーとしては Super (Meta)、Ctrl、Alt、Shift が使えますが、Ctrl は Emacs に不可欠だし、Alt は私の知るだけでも Blender が使うしで (まあ FreeBSD で Blender を使うかは微妙だが)、実質 MangoWC に残されているのは Super と Super + Shift だけかなと思ってます。キーシーケンスが限られるので、割り当てる機能も厳選しなくてはなりません。で、私は下記の表のようにしました (設定ファイルの中身は本稿の最後にまとめて掲載します)。
ウィンドウ
| コマンド | パラメーター | キーバインド | デフォルト | 説明 |
|---|---|---|---|---|
| killclient | ― | Super + K | Alt + Q | クライアントを終了させる |
| togglefloating | ― | Super + Backslash | Alt + Backslash | ウィンドウのフロート化 |
| togglefullscreen | ― | Super + Y | Alt + F | ウィンドウのフルスクリーン化 |
| togglemaximizescreen | ― | Super + U | Alt + A | ウィンドウの最大化 |
| minimized | ― | Super + I | 同じ | ウィンドウの最小化 |
| restore_minimized | ― | Super + Shift + I | 同じ | ウィンドウの最小化を解除 |
| toggle_scratchpad | ― | Super + Z | Alt + Z | 最小化したウィンドウを一時的に表示 |
| toggle_named_scratchpad | (*1) | Super + Space | ― | (*1) |
| toggleoverview | ― | Alt + Tab | 同じ | すべてのウィンドウを俯瞰する |
| resizewin | -50,+0 | Super + H | Ctrl + Alt + Left | ウィンドウを左方向へ広げる |
| resizewin | +50,+0 | Super + L | Ctrl + Alt + Right | ウィンドウを右方向へ広げる |
(*1) スクラッチパッドは一時的になんか作業したいってときに使える機能です。例えば電卓を起動して計算するとか、音量パネルでスピーカーの音量を調節するとか。そういうアプリの appid、タイトル、コマンドを「appid,title,cmd」のように CSV で与えます。例えば次のようにして Super + Space キーでターミナルソフト (foo terminal) を起動することができます。
bind=SUPER,space,toggle_named_scratchpad,foot-scratchpad,none,foot --app-id=foot-scratchpad
この例では appid として「foot-scratchpad」を与えています。後述の「ウィンドウルール」を作って適用すると、スクラッチパッドのウィンドウサイズを任意に指定したり、フロート化して画面の真ん中に表示させたりすることができるんですが、その際にこの ID が必要になります。
フォーカスと移動
| コマンド | パラメーター | キーバインド | デフォルト | 説明 |
|---|---|---|---|---|
| focusstack | next | Super + N | Super + Tab | フォーカスを次のウィンドウへ |
| focusstack | prev | Super + P | ― | フォーカスを前のウィンドウへ |
| exchange_client | up | Super + Shift + Up | 同じ | 上のウィンドウと位置を入替え |
| exchange_client | down | Super + Shift + Down | 同じ | 下のウィンドウと位置を入替え |
| exchange_client | left | Super + Shift + Left | 同じ | 左のウィンドウと位置を入替え |
| exchange_client | right | Super + Shift + Right | 同じ | 右のウィンドウと位置を入替え |
| zoom | ― | Super + M | ― | ウィンドウをマスター領域へ |
exchange_client コマンドには、デフォルトに加えて vi 風のキーバインドも加えました。
| コマンド | パラメーター | キーバインド | デフォルト | 説明 |
|---|---|---|---|---|
| exchange_client | up | Super + Shift + K | Super + Shift + Up | 上のウィンドウと位置を入替え |
| exchange_client | down | Super + Shift + J | Super + Shift + Down | 下のウィンドウと位置を入替え |
| exchange_client | left | Super + Shift + H | Super + Shift + Left | 左のウィンドウと位置を入替え |
| exchange_client | right | Super + Shift + L | Super + Shift + Right | 右のウィンドウと位置を入替え |
タグ (ワークスペース)
ここのパラメーターの書式はやや複雑なので、詳細は公式ドキュメントを参照してください。
- Tags & Monitorshttps://mangowm.github.io/docs/bindings/keys#tags--monitors
Super + 数字キーで対応する番号のタグに切り替えます。それに加えて、Emacs 風に Super + A で 1 番のタグに、Super + E で 9 番のタグに移動できるようにしました。
| コマンド | パラメーター | キーバインド | デフォルト | 説明 |
|---|---|---|---|---|
| view | 1,0 | Super + 1 | Ctrl + 1 | 1 番のタグを表示 |
| view | 2,0 | Super + 2 | Ctrl + 2 | 2 番のタグを表示 |
| ... | ... | ... | ... | ... |
| view | 9,0 | Super + 9 | Ctrl + 9 | 9 番のタグを表示 |
| view | 1,0 | Super + A | Ctrl + 1 | 1 番のタグを表示 |
| view | 9,0 | Super + E | Ctrl + 9 | 9 番のタグを表示 |
タグを順番にたどるためのコマンド群です:
| コマンド | パラメーター | キーバインド | デフォルト | 説明 |
|---|---|---|---|---|
| viewtoleft | 0 | Super + Shift + Left | Super + Left | 前のタグへ |
| viewtoleft_have_client | 0 | Super + Left | Ctrl + Left | クライアントを持つ前のタグへ |
| viewtoright | 0 | Super + Shift + Right | Super + Right | 次のタグへ |
| viewtoright_have_client | 0 | Super + Right | Ctrl + Right | クライアントを持つ次のタグへ |
これも同じコマンド群ですが Emacs 風のキーバインドを追加しました:
| コマンド | パラメーター | キーバインド | デフォルト | 説明 |
|---|---|---|---|---|
| viewtoleft | 0 | Super + Shift + B | Super + Left | 前のタグへ |
| viewtoleft_have_client | 0 | Super + B | Ctrl + Left | クライアントを持つ前のタグへ |
| viewtoright | 0 | Super + Shift + F | Super + Right | 次のタグへ |
| viewtoright_have_client | 0 | Super + F | Ctrl + Right | クライアントを持つ次のタグへ |
クライアントを指定したタグへ移動する設定です:
| コマンド | パラメーター | キーバインド | デフォルト | 説明 |
|---|---|---|---|---|
| tagsilent | 1,0 | Super + Shift + 1 | ― | クライアントを 1 番のタグへ移動 |
| tagsilent | 2,0 | Super + Shift + 2 | ― | クライアントを 2 番のタグへ移動 |
| ... | ... | ... | ... | ... |
| tagsilent | 9,0 | Super + Shift + 9 | ― | クライアントを 9 番のタグへ移動 |
tagsilent コマンドの代わりに tag コマンドを使うこともできます。両者の違いは、移動後にフォーカスするかどうかです。
- tag コマンド: クライアントを指定したタグへ移動してフォーカスする。
- tagsilent コマンド: クライアントを指定したタグへ移動するがフォーカスしない。
スクリーンショット
スクリーンショットの撮影には次のキーを割り当てています。
- PrtSc: フルスクリーンを撮る
- Super + PrtSc: フォーカスウィンドウを撮る
- Super + Shift + S: 指定範囲を撮る
詳細は次の記事を参照してください。
- Wayland & MangoWC 環境でのスクリーンショットの撮りかたhttps://retrotecture.jp/freebsd/wayland_screenshot.html
システム
| コマンド | パラメーター | キーバインド | デフォルト | 説明 |
|---|---|---|---|---|
| reload_config | ― | Super + R | 同じ | 設定ファイル再読み込み |
| spawn | foot | Super + Enter | Alt + Enter | ターミナル起動 |
| spawn | wlogout | Super + X | ― | ログアウトメニュー起動 |
| quit | ― | Super + Q | Super + M | MangoWC 終了 |
タグルール
タグルールは 1 ~ 9 番のタグを指定してルールを課すためのコマンドです。タグごとにレイアウトを変えたりすることができますが、私は単にすべてのタグをタイルレイアウトにしています。
tagrule=id:1,layout_name:tile
tagrule=id:2,layout_name:tile
...
tagrule=id:9,layout_name:tile
tile のほかには scroller、grid、deck、monocle、center_tile、vertical_tile、vertical_scroller を指定できるみたいです。
ウィンドウルール
ウィンドウルールは特定のアプリを指定してルールを課すためのコマンドです。アプリごとにウィンドウサイズを指定したり、どのタグで開くかを指定できたりします。ここでは例を 2 つほど挙げます。
スクラッチパッド
toggle_named_scratchpad コマンドを実行したときに開くウィンドウに適用するルールの例です。上のほうで foo terminal を appid = "foot-scratchpad" で起動するように設定したので、そのウィンドウに適用されます。ウィンドウをフロートにして中央に配置し、サイズを 1280x800 にせよといっています。
windowrule=isnamedscratchpad:1,float,center,width:1280,height:800,appid:foot-scratchpad
この設定でスクラッチパッドを起動すると図 2 のようになります。「あー、円周率って 3.1……いくつだっけ? bc コマンドで 4 * arctan(1) を計算して思い出すか」みたいなシチュエーションです。
Inkscape を最大化して、指定のタグに開く
Inkscape のようなお絵かきソフトは常に最大化した状態で起動したいと考えるかもしれません。その場合は次のようにします。
windowrule=tags:9,force_maximize:1,appid:org.inkscape.Inkscape
この例では、appid = "org.inkscape.Inkscape" のウィンドウを最大化して 9 番のタグに送ります。
appid を調べるには mmsg コマンドを使います。Inkscape を起動しておき、次のように -w -c オプションを付けて mmsg コマンドを実行します。で、マウスカーソルを Inkscape のウィンドウに持っていってフォーカスすると、mmsg コマンドがその appid を教えてくれます。
% mmsg -w -c
eDP-1 title 新規ドキュメント 1 - Inkscape
eDP-1 appid org.inkscape.Inkscape
title を指定してもいいんですが、ご覧のようにファイル名が入っていたりして面倒くさそうなので、appid で指定するのがいいんじゃないかなと思います。
外部コマンドの実行
外部コマンドを実行するには exec-once コマンドを使います。
exec-once=waybar -c ~/.config/mango/waybar/config.jsonc -s ~/.config/mango/waybar/style.css
exec-once=fcitx5 -r -d 2> ~/log/fcitx5.log
exec-once=backlight 20
この例では Waybar と Fcitx5 を起動し、LCD のバックライトを 20% まで下げています。
設定ファイルの全文
ここまでをまとめた設定ファイルの全行を掲載します。
# Window effect
blur=0
shadows = 0
# Animation Configuration(support type:zoom,slide)
# tag_animation_direction: 1-horizontal,0-vertical
animations=1
layer_animations=0
animation_type_open=slide
animation_type_close=slide
animation_fade_in=0
animation_fade_out=0
tag_animation_direction=1
animation_duration_move=100
animation_duration_open=100
animation_duration_tag=0
animation_duration_close=100
animation_duration_focus=0
border_radius=0
focused_opacity=1.0
unfocused_opacity=1.0
# Master-Stack Layout Setting
new_is_master=1
default_mfact=0.55
default_nmaster=1
smartgaps=0
# keyboard
repeat_rate=25
repeat_delay=600
numlockon=0
xkb_rules_layout=us
# Appearance
gappih=0
gappiv=0
gappoh=0
gappov=0
borderpx=2
rootcolor=0x2b2b2bff
bordercolor=0x444444ff
focuscolor=0x478384ff
maximizescreencolor=0x89aa61ff
urgentcolor=0xad401fff
scratchpadcolor=0x516c93ff
globalcolor=0xb153a7ff
overlaycolor=0x14a57cff
# layout support:
# tile,scroller,grid,deck,monocle,center_tile,vertical_tile,vertical_scroller
tagrule=id:1,layout_name:tile
tagrule=id:2,layout_name:tile
tagrule=id:3,layout_name:tile
tagrule=id:4,layout_name:tile
tagrule=id:5,layout_name:tile
tagrule=id:6,layout_name:tile
tagrule=id:7,layout_name:tile
tagrule=id:8,layout_name:tile
tagrule=id:9,layout_name:tile
# Key Bindings
# key name refer to `xev` or `wev` command output,
# mod keys name: super,ctrl,alt,shift,none
# reload config
bind=SUPER,r,reload_config
# menu and terminal
bind=SUPER,Return,spawn,foot
# exit
bind=SUPER,q,quit
bind=SUPER,k,killclient
# switch window focus
bind=SUPER,n,focusstack,next
bind=SUPER,p,focusstack,prev
# swap window
# arrow keys
bind=SUPER+SHIFT,Up,exchange_client,up
bind=SUPER+SHIFT,Down,exchange_client,down
bind=SUPER+SHIFT,Left,exchange_client,left
bind=SUPER+SHIFT,Right,exchange_client,right
# vi like bindings
bind=SUPER+SHIFT,k,exchange_client,up
bind=SUPER+SHIFT,j,exchange_client,down
bind=SUPER+SHIFT,h,exchange_client,left
bind=SUPER+SHIFT,l,exchange_client,right
bind=SUPER,m,zoom,
# switch window status
bind=SUPER,o,toggleoverview,
bind=SUPER,backslash,togglefloating,
bind=SUPER,u,togglemaximizescreen,
bind=SUPER,y,togglefullscreen,
bind=SUPER,i,minimized,
bind=SUPER+SHIFT,I,restore_minimized
bind=SUPER,z,toggle_scratchpad
bind=SUPER,space,toggle_named_scratchpad,foot-scratchpad,none,foot --app-id=foot-scratchpad
# tag switch
# arrow keys
bind=SUPER+SHIFT,Left,viewtoleft,0
bind=SUPER,Left,viewtoleft_have_client,0
bind=SUPER+SHIFT,Right,viewtoright,0
bind=SUPER,Right,viewtoright_have_client,0
# emacs like bindings
bind=SUPER,b,viewtoleft,0
bind=SUPER+SHIFT,b,viewtoleft_have_client,0
bind=SUPER,f,viewtoright,0
bind=SUPER+SHIFT,f,viewtoright_have_client,0
bind=SUPER,1,view,1,0
bind=SUPER,2,view,2,0
bind=SUPER,3,view,3,0
bind=SUPER,4,view,4,0
bind=SUPER,5,view,5,0
bind=SUPER,6,view,6,0
bind=SUPER,7,view,7,0
bind=SUPER,8,view,8,0
bind=SUPER,9,view,9,0
bind=SUPER,a,view,1,0
bind=SUPER,e,view,9,0
# tag: move client to the tag and focus it
# tagsilent: move client to the tag and not focus it
bind=SUPER+SHIFT,1,tagsilent,1,0
bind=SUPER+SHIFT,2,tagsilent,2,0
bind=SUPER+SHIFT,3,tagsilent,3,0
bind=SUPER+SHIFT,4,tagsilent,4,0
bind=SUPER+SHIFT,5,tagsilent,5,0
bind=SUPER+SHIFT,6,tagsilent,6,0
bind=SUPER+SHIFT,7,tagsilent,7,0
bind=SUPER+SHIFT,8,tagsilent,8,0
bind=SUPER+SHIFT,9,tagsilent,9,0
# resizewin
bind=SUPER,h,resizewin,-50,+0
bind=SUPER,l,resizewin,+50,+0
# emacslike mode indicator (Unicode: 1F134)
bind=SUPER+ALT+SHIFT,e,spawn_shell,pkill -75 waybar # -SIGRTMIN+10
# screenshot
bind=NONE,Print,spawn_shell,~/bin/screenshot.sh all
bind=SUPER,Print,spawn_shell,~/bin/screenshot.sh win
bind=SUPER+SHIFT,s,spawn_shell,~/bin/screenshot.sh reg
layerrule=noanim:1,noblur:1,layer_name:selection
# window rule
windowrule=isnamedscratchpad:1,float,center,width:1280,height:800,appid:foot-scratchpad
windowrule=tags:8,force_maximize:1,appid:org.inkscape.Inkscape
exec-once=waybar -c ~/.config/mango/waybar/config.jsonc -s ~/.config/mango/waybar/style.css
exec-once=fcitx5 -r -d 2> ~/log/fcitx5.log
exec-once=backlight 20

