2026年1月19日

keyd を FreeBSD で使いたい (3) 【(一応) 完結編】

FreeBSD で keyd を使う試みの (一応) 完結編です。

本稿は本稿で完結しているので、前回までの紆余曲折は読まなくても大丈夫ですが、前提として Wayland や Sway のインストールまでは済んでいるものとします。

関連記事:

keyd が無応答になった場合の対処法

これ以降、いろいろ試すうちに設定をミスって keyd が無応答になってしまうかもしれません。そういうときのために、keyd にはパニックシーケンスが用意されています。具体的には「Esc+BS+Enter」の同時押しです。一見無応答に見えても、実は keyd のイベントループは生きていて、このシーケンスを入力することでループから脱出することができます。

問題点のおさらい

FreeBSD で keyd を使う場合に問題となるのが、keyd が作った仮想キーボードからの入力がコンソールに届かないことです。そのため、コンソール (あるいは Ly などのディスプレイマネージャー) からログインしようとしても、キーボードからの入力が棄てられてしまってログインできなくなってしまいます (その場合は前出のパニックシーケンスを入力して脱出してください)。Linux の場合はコンソールと X11/Wayland の入力系統が統合されているらしく、このような問題は発生しません。

なんか最近、KDE Plasma にディスプレイマネージャーが統合される (された?) というような話をちらっと聞いたんですが、そういう環境なら FreeBSD でも問題にならないかもしれません。

対策の概要

それでも何とか FreeBSD で使いたいなあと思ったので、ない知恵をふりしぼって次のような対策を考えました (前回参照):

  • OS 起動時に keyd をデーモンとして起動し、無効状態にしておく。
  • ログインして Sway が起動したら keyd を有効にする。
  • Sway が終了したら keyd をまた無効にする。

有効とか無効とかってなんだ?という話ですが、ここでは keyd の設定ファイル /usr/local/etc/keyd/default.conf が存在すれば「有効」、存在しなければ「無効」という意味です。keyd は /usr/local/etc/keyd/*.conf が存在しない場合、すべての入力デバイスを無視し、まったく無害な存在となります (といってもリソースはちょっと消費するでしょうが)。

あとは具体的な作業手順の話ですが、おおまかな流れは次のようになります。

  • keyd のインストール
  • 設定ファイル (default.conf) の作成
  • OS 起動時に keyd も起動するように設定
  • keyd を有効化 / 無効化するためのスクリプトを作成
  • Sway 起動用のラッパースクリプトを作成 (keyd 有効 → Sway 起動 → Sway が終了したら keyd 無効)
  • ~/.zprofile から Sway のラッパースクリプトを実行する

keyd のインストール

packages からインストールします。

# pkg install -y keyd

設定ファイル (default.conf) の作成

まずは CapsLock を Ctrl へ変更、これだけできるようにしましょう。設定ファイルは次のようになります。

/usr/local/etc/keyd/default.conf
[ids]
*

[main]
capslock = layer(control)

ちなみに keyd 的には、拡張子が .conf ならファイル名はなんでも OK なんですが、本稿では default.conf に固定して話を進めます。

OS 起動時に keyd も起動させる

OS 起動時に keyd も起動するように、sysrc コマンドを使って /etc/rc.conf に追記します。

# sysrc keyd_enable="YES"

それから、初期状態では keyd を無効にしておきたいので、/usr/local/etc/rc.d/keyd の先頭付近の適当な位置に次の 1 行を追加します。この keyd-enable.sh というのは、このあと作ります。

/usr/local/etc/rc.d/keyd (追記)
/usr/local/bin/keyd-enable.sh disable

keyd を有効化 / 無効化するためのスクリプト

スクリプトの引数に "dis(able)" が指定されたら無効化し、それ以外なら有効化します。keyd を無効にする場合は、設定ファイル default.conf を default.conf.dis にリネームして、keyd が読み込まないようにします。有効にする場合は、逆に default.conf に戻します。スクリプトの置き場所は /usr/local/bin、ファイル名は keyd-enable.sh としておきます。

/usr/local/bin/keyd-enable.sh
#!/bin/sh

conf="/usr/local/etc/keyd/default.conf"

case "$1" in
dis*)    # disable
    if [ -f "$conf" ]; then
        mv "$conf" "$conf".dis
    fi
    ;;
*)    # enable
    if [ ! -f "$conf" ]; then
        mv "$conf".dis "$conf"
    fi
    ;;
esac

このスクリプトの実行を許可します。

# chmod +x /usr/local/bin/keyd-enable.sh

ユーザーが root 権限でこのスクリプトを実行できるようにします。visudo コマンドを実行し、/etc/sudoers がエディタが開いたら下記の行を追加します。下の例では wheel グループに権限を与えているので、対象ユーザーをあらかじめ wheel グループに所属させておきます。

/etc/sudoers (追記)
%wheel ALL=(root) NOPASSWD: /usr/local/bin/keyd-enable.sh

Sway 起動用のラッパースクリプト

Sway を起動するためのラッパースクリプトを作って ~/bin/ などの適当なディレクトリに置きます。

  • keyd-enable.sh で default.conf.dis を default.conf にリネームする。
  • keyd が起動していたら keyd reload コマンドで設定ファイルをリロードする。
  • Sway をフォアグラウンドで (同期的に) 起動する。
  • Sway が終了したら keyd-enable.sh で default.conf を default.conf.dis にリネームする。
  • keyd が起動していたら keyd reload コマンドで設定ファイルをリロードする。
~/bin/start-sway.sh
#!/bin/sh

reload() {
    if [ -f /var/run/keyd.pid ]; then
        sudo keyd reload
    fi
}

sudo /usr/local/bin/keyd-enable.sh
reload

sway

sudo /usr/local/bin/keyd-enable.sh disable
reload

このスクリプトの実行を許可します。

% chmod +x ~/bin/start-sway.sh

~/.zprofile の修正

最後に ~/.zprofile から start-sway.sh を実行することで、ログインと同時に Sway が起動するようにします。

~/.zprofile
if [ "$(tty)" = "/dev/ttyv0" ]; then
    exec ~/bin/start-sway.sh
fi

ログインマネージャー Ly を使っている場合

ログインマネージャーとして Ly を使っている場合は、start-sway.sh をユーザーごとの ~/bin/ ではなく /usr/local/bin/ に作成し、実行許可属性を付けて、

# chmod +x /usr/local/bin/start-sway.sh

/usr/local/share/wayland-sessions/sway.desktop の Exec=sway の行を次のように書き換えてください。

/usr/local/share/wayland-sessions/sway.desktop (差分)
-Exec=sway
+Exec=/usr/local/bin/start-sway.sh

ここまでできたら OS を再起動してみて、ログインできること、Wayland 環境で CapsLock が Ctrl になっていることなどを確認してみてください。これでパニックシーケンスともお別れ…のはずです。

まあちょっと泥臭い感じにごまかしたみたいな感じになっちゃいましたけど、一応目的は達成したので、ここで一区切りとします。