🔧

LightDM Greeter on Arch Linux のテーマ設定

2022/08/28に公開

LightDM Greeter のテーマを、ログイン画面+ロック画面に適用していく話です。

環境

  • ディストリビューション: Arch Linux
  • ディスプレイマネージャー: LightDM
  • デスクトップ環境: Xfce
$ uname -a
Linux x1-carbon-gen10-arch 5.19.4-arch1-1 #1 SMP PREEMPT_DYNAMIC Thu, 25 Aug 2022 17:31:12 +0000 x86_64 GNU/Linux
$ cat /etc/os-release
NAME="Arch Linux"
PRETTY_NAME="Arch Linux"
ID=arch
BUILD_ID=rolling
ANSI_COLOR="38;2;23;147;209"
HOME_URL="https://archlinux.org/"
DOCUMENTATION_URL="https://wiki.archlinux.org/"
SUPPORT_URL="https://bbs.archlinux.org/"
BUG_REPORT_URL="https://bugs.archlinux.org/"
LOGO=archlinux-logo
$ lightdm --version
lightdm 1.32.0
$ xfce4-about

前提

LightDM のサービスが起動していることを確認します。

$ systemctl status lightdm

※そもそも GUI 起動できている時点でほぼ間違いなく起動しているのですが、一応。

Webkit2 Greeter をインストールする

LightDM 用に様々な Greeter が作られていますが、今回はカスタマイズ性やらなにやらで良さそうな lightdm-webkit2-greeter をインストールします。

AUR からインストールできます。

$ yay -S lightdm-webkit2-greeter

glorious テーマをインストールする

その前に経緯

Webkit2 Greeter 用のテーマも色々と転がっていますが、GitHub で star の多かった glorious を使ってみることにしました。

…が、ちょっとキーバインドを追加したかったので、Fork して調整したものを使うことにしました。

https://github.com/23prime/lightdm-webkit2-theme-glorious

ただし、このテーマ、そんなに積極的にメンテナンスされている雰囲気ではないです。
試しにインストールしてみた AUR の最新版はちゃんと動いているのですが、今の master ブランチは結構バグが多くて、Pull Request も滞留しているようです。
※これは文句ではなく、現状はこうだという話です。私は全世界の優れた開発者を尊敬しています。本当です。

このため、最新のリリースコミットまで巻き戻して、そこから変更を加えていきました。

インストールする

Fork したものを Clone し、usr/share/lightdm-webkit/themes/glorious というディレクトリ名で配置します。

$ git clone git@github.com:23prime/lightdm-webkit2-theme-glorious.git
$ cd lightdm-webkit2-theme-glorious/
$ sudo cp -r . /usr/share/lightdm-webkit/themes/glorious

設定ファイルを書き換える

LightDM 系の設定ファイルは /etc/lightdm にあります。
今回は lightdm.conflightdm-webkit2-greeter.conf を書き換えます。

念の為バックアップ

設定がおかしいと GUI が起動しなくなったりして面倒になる可能性があるので、オリジナルのバックアップを取っておきます。

$ cd /etc/lightdm/
$ sudo cp lightdm.conf lightdm.conf.orig
$ sudo cp lightdm-webkit2-greeter.conf lightdm-webkit2-greeter.conf.orig

Greeter を指定する

lightdm.confgreeter-session の行をアンコメントし、

greeter-session=lightdm-webkit2-greeter

のように書き換えます。

sed でやるならこんな感じ。

$ sudo sed -i 's/^\(#?greeter\)-session\s*=\s*\(.*\)/greeter-session = lightdm-webkit2-greeter #\1/ #\2g' /etc/lightdm/lightdm.conf

テーマを指定する

lightdm-webkit2-greeter.confwebkit_theme debug_mode を下記のようにします。

webkit_theme = glorious
debug_mode = true

sed でやるならこんな感じ。

$ sudo sed -i 's/^webkit_theme\s*=\s*\(.*\)/webkit_theme = glorious #\1/g' /etc/lightdm/lightdm-webkit2-greeter.conf
$ sudo sed -i 's/^debug_mode\s*=\s*\(.*\)/debug_mode = true/g' /etc/lightdm/lightdm-webkit2-greeter.conf

ユーザーアイコンを表示させる

適当な画像ファイルを /var/lib/AccountsService/icons/<username>.png として配置します。

$ cp /path/to/xxx.png /var/lib/AccountsService/icons/`whoami`.png

/var/lib/AccountsService/users/<username> を編集し、↑の画像のパスを Icon に指定します。

Icon=/var/lib/AccountsService/icons/<username>.png

これで再ログインします。

このとき、下記 PR によると、一度ユーザー一覧メニューから自分のユーザーを選択しないとアイコンが表示されないようです。
バグか仕様かは不明。

https://github.com/manilarome/lightdm-webkit2-theme-glorious/pull/50/files

別の方法

アイコン画像は ~/.face にする方法もあるそうです。
しかし、配置場所が一長一短な感じなのと、多分 greeter-hide-users=false とかを書かないとダメそうだったので、このやり方にはしませんでした。

ロック画面も同じテーマにする

ロック画面を目にする機会の方が明らかに多いので、ログイン画面よりもテーマを入れる価値がありそうです。

light-locker をインストールする

$ yay -S light-locker

試しに light-locker でロックしてみます。

$ light-locker &
$ light-locker-command --lock

これで、先に設定したテーマの画面になれば成功です。

バックグラウンドジョブとして起動した light-locker は終了させます。

$ jobs
[1]  + running    light-locker
$ kill %1

light-locker を自動起動させる

light-locker が起動していない状態でロックコマンドを打つと、エラーになります。(それはそう)

$ light-locker-command --lock
** Message: 17:09:55.247: Received error message from the locker: GDBus.Error:org.freedesktop.DBus.Error.ServiceUnknown: The name org.freedesktop.ScreenSaver was not provided by any .service files

systemd で起動しておきたい気分ですが、ユーザーセッションの取得か何かの問題?で、うまくいっていないようです。

https://github.com/the-cavalry/light-locker/pull/153

ということで、Xfce の自動開始アプリケーションとして設定してやることにしました。

ちなみに設定ファイルの実体は ~/.config/autostart/ にあります。

$ cat ~/.config/autostart/light-locker.desktop
[Desktop Entry]
Encoding=UTF-8
Version=0.9.4
Type=Application
Name=light-locker
Comment=
Exec=/usr/sbin/light-locker
OnlyShowIn=XFCE;
RunHook=0
StartupNotify=false
Terminal=false
Hidden=false

これで再ログイン(心配なら再起動)してみて、light-locker が起動していれば OK です。

$ ps -e | grep light-locker
 764278 ?        00:00:00 light-locker  

これで light-locker-command --lock だけでロックできるようになっています。

Xfce のロックコマンドに light-locker を設定する

xfce4-session/general/LockCommand に、文字通りロックコマンドを設定してやります。

デフォルトだと何も設定されていません。

$ xfconf-query -c xfce4-session -lvp /general/LockCommand
/general/LockCommand  

xfconf-query というコマンドで設定してやります。

$ xfconf-query --create -c xfce4-session -p /general/LockCommand -t string -s "light-locker-command --lock"

確認します。

$ xfconf-query -c xfce4-session -lvp /general/LockCommand
/general/LockCommand  light-locker-command --lock

よさそう。これで xflock4 コマンドでロックしたときに、LightDM のテーマになります。

$ xflock4

デフォルトのロック画面を無効にする

ここまでの設定だと、サスペンドしたときに

  1. light-locker のログイン画面
  2. デフォルト(xfce4-screensaver)のログイン画面

の両方を通過してしまう可能性があります。

これは大変煩わしいので、後者は無効化しておきます。
GUI で可能です。

※CLI でも可能です。

$ xfconf-query --create -c xfce4-screensaver -p /lock/enabled -t bool -s 'false'

これでサスペンドして復帰しようとすると、light-locker のログイン画面だけになります。

$ xfce4-session-logout --suspend

ちなみに

xflock4 はシンプルな作りで、

  • xfce4-session/general/LockCommand にセットしたコマンド
  • xfce4-screensaver-command --lock
  • xscreensaver-command -lock
  • gnome-screensaver-command --lock

を順に舐めて、ヒットしたらロックして終了、みたいな感じです。

$ cat `which xflock4`
...
# First test for the command set in the session's xfconf channel
LOCK_CMD=$(xfconf-query -c xfce4-session -p /general/LockCommand)

# Lock by xscreensaver or gnome-screensaver, if a respective daemon is running
for lock_cmd in \
    "$LOCK_CMD" \
    "xfce4-screensaver-command --lock" \
    "xscreensaver-command -lock" \
    "gnome-screensaver-command --lock"
do
    if [ ! -z "$lock_cmd" ]; then
        $lock_cmd >/dev/null 2>&1 && exit
    fi
done
...

今回設定したコマンドは↓これで取得しているということですね。

$ xfconf-query -c xfce4-session -p /general/LockCommand

書き忘れたこと

  • xfce4-screensaver ごと無効化してもいいのか?した方がいいのか?

参考

Discussion