【小ネタ】keyd のレイヤーが切り替わったことを Waybar に表示する
「 keyd を FreeBSD で使いたい (3) 【(一応) 完結編】 」の記事で FreeBSD でも keyd が使えるようになったのはいいんですが、レイヤーが切り替わったことを視覚的に知りたいなと思い、Waybar の隅っこに簡易的なインジケーターを作ってみました。
やること
例として CapsLock キーをタップするたびに図 1 のようなインジケーター 🄴 (ユニコード文字の SQUARED LATIN CAPITAL LETTER E (U+1F134)) を点けたり消したりしてみます。
背景として、CapsLock キーをタップしたら Emacs 風のキーバインドが有効になるように keyd を設定したのですが、そのキーバインドに切り替わったかどうかを視覚的に知りたかったという事情があります。
- 【無料・無責任】キーリマッピングツール keyd 入門講座【完全図解?】https://retrotecture.jp/freebsd/mm_keyd_lesson.html
で、これを実現するには keyd、MangoWC、Waybar の連携が必要で、それぞれ下記の記事のように設定が済んでいるものとします。
- keyd を FreeBSD で使いたい (3) 【(一応) 完結編】https://retrotecture.jp/freebsd/enter_the_keyd3.html
- FreeBSD 14.3 をインストールする (その 4): MangoWC / foot / Waybar / Fcitx5 / Anthy / Firefoxhttps://retrotecture.jp/freebsd/freebsd14_3_basicapps.html
処理の流れ
処理の流れは図 2 のようになります。
- ユーザーが Ctrl キーをタップするたびに keyd が Emacs 風レイヤーをトグルし、同時にキーシーケンス Meta + Alt + Shift + E を出力する。→ keyd の設定
- Wayland コンポジター MangoWC のキーバインドで、Meta + Alt + Shift + E が押されたら Waybar にシグナルを送るように設定する。→ MangoWC の設定
- Waybar がシグナルを受信したら keyd の現在のレイヤーを取得し、Emacs 風レイヤーだったらインジケーターを点灯する。→ Waybar の設定
以下、各工程をもう少し詳しく説明します。
1. keyd の設定
keyd は次のように設定してあります。
[ids]
*
[main]
capslock = overloadt(control, togglem(emacslike, macro(M-A-S-e)), 100)
...
[emacslike]
[emacslike+control]
include emacslike
Ctrl キー (というか CapsLock キー) をタップするたびに emacslike レイヤーがトグルします。そしてそのたびに macro(M-A-S-e) を実行してキーシーケンス Meta + Alt + Shift + E を出力します。このようなややこしいキーシーケンスにした理由は、単に他のアプリのショートカットとかぶるのを避けるためです。
keyd の設定に関して詳細は次の記事を参照してください。
- 【無料・無責任】キーリマッピングツール keyd 入門講座【完全図解?】https://retrotecture.jp/freebsd/mm_keyd_lesson.html
2. MangoWC の設定
keyd の仮想キーボードが出力した Meta + Alt + Shift + E は、Wayland コンポジター MangoWC で受け取ります。MangoWC の設定ファイル ~/.config/mango/config.conf でキーバインドを次のように設定します。
bind=SUPER+ALT+SHIFT,e,spawn_shell,pkill -75 waybar # -SIGRTMIN+10
これは「Meta + Alt + Shift + E を受け取ったら waybar にシグナル 75 を送信せよ」という意味になります。75 というのは、ユーザー定義シグナルの最小値 SIGRTMIN (FreeBSD の場合は 65。他の OS では異なると思うので要注意) に適当な値 10 を足した値です。
MangoWC の設定に関しては次の記事を参照してください。
- FreeBSD 14.3 をインストールする (その 4): MangoWC / foot / Waybar / Fcitx5 / Anthy / Firefoxhttps://retrotecture.jp/freebsd/freebsd14_3_basicapps.html
- タイル型 Wayland コンポジター MangoWC のすすめhttps://retrotecture.jp/freebsd/mangowc.html
3. Waybar の設定
MangoWC が発信したシグナルを Waybar で受信するには、設定ファイルに次のように追記します。
{
...
"modules-right": [
+ "custom/emacslike",
...
],
...
+ "custom/emacslike": {
+ "exec": "~/bin/emacslike-indicator.sh",
+ "signal": 10,
+ "format": "{}"
+ },
...
}
4 行目で Waybar の右エリアに custom/emacslike モジュールを追加しています。8 ~ 12 行目がモジュールの定義です。意味は「シグナル 10 (= 75 - SIGRTMIN) を受信したら ~/bin/emacslike-indicator.sh を実行して、その結果を {} の中に放り込め」となります。{} の中に放り込んだ文字列が Waybar の右エリアに表示されます。
シェルスクリプトの場所とファイル名は何でもいいんですが、中身は次のように書きます。
#!/bin/sh
layers=`timeout 0.01 keyd listen`
case "$layers" in
*+emacs*) echo -n $'\U0001F134';; # SQUARED LATIN CAPITAL LETTER E
*) echo -n '';;
esac
3 行目では現在の keyd のレイヤーを keyd listen コマンドで取得しています。keyd listen コマンドは Ctrl + C で終了させないかぎりずっと listen し続けます。シェルスクリプトの場合はそれだと困るので、ちょっと強引ですがタイムアウトを設けて強制的に終了させ、結果を変数 layers に格納しています。
5 ~ 8 行目で layers をチェックしています。layers にはどんな値が入っているのか?ちょっと手動で確認してみましょう。 CapsLock キーを 1 回タップしてから keyd listen すると、現在は emacslike レイヤーにいるのでこうなります:
/main
+emacslike
Ctrl + C キーで keyd listen を終了させて、今度は 2 回 CapsLock キーをタップします。いったん emacslike レイヤーに切り替わったのち、抜けて main レイヤーに戻るので、keyd listen するとこうなります:
/main
このことから、emacslike レイヤーにいる場合は変数 layers に「/main\n+emacslike」みたいな文字列が入っていると期待されます。それをチェックしているのが 6 行目です。で、パターンにマッチしていた場合は echo コマンドで 🄴 を出力します。
このスクリプトを実行できるようにしておきましょう。
% chmod +x ~/bin/emacslike-indicator.sh
なお、Waybar の設定に関しては次の記事を参照してください。
- FreeBSD 14.3 をインストールする (その 4): MangoWC / foot / Waybar / Fcitx5 / Anthy / Firefoxhttps://retrotecture.jp/freebsd/freebsd14_3_basicapps.html
また、keyd listen コマンドに関しては次の記事を参照してください。
- 【無料・無責任】キーリマッピングツール keyd 入門講座【完全図解?】https://retrotecture.jp/freebsd/mm_keyd_lesson.html
という小ネタでした。

