今まで放置してきた XDM 設定周り諸々

今回は今までずっと放置してきた XDM のダサいログイン画面を変更しました。特にログイン Window はおっきいし文字の色は初心者がベタがきする HTML 並のフォントの色だしで、見れたものじゃなかったりします。まぁ自分がいじればセンスの有る無しは横に置いといて、納得は出来ると思います。 Window のサイズ変えるだけでもマシになりますし...てな訳で変更の為に行なったログを書きだしておきます。

XDM のログイン画面での背景を変更したかったので、使いたい画像を適当に用意しました。ですが、そのままだと画像のサイズが合わなかった為リサイズすることにしました。僕の環境は現在 StumpWM を入れてる為画像の編集が GUI でやりにくかったりします。特に GUI の部分がセパレートしてる GIMP とかは使いづらいなんてものじゃないです。とは言え最後に使ったのは 1 年以上前なので今は知りませんが...。そのため CUI でリサイズを行いたかったのです。何でもコマンドを使って操作する癖をつける意味もあります。使ったコマンドは mogrify という ImageMagick に内包されているコマンドで画像の一括変換に使われるものだそうです。へー。

参考ページ

使っている端末の解像度は 1440x900 なので、それに合わせてリサイズ。ですが、解像度の縦横比が一般的な比率では無いため多少の引き伸ばしを我慢して縦横非無視しました。

$ mogrify -geometry 1440x900! -quality 100 hoge.huga

geometry は色んなコマンドでも使うので説明要らずだったりかもですが、X 軸 x Y 軸の長さを指定してサイズを決めます。なのでそのまま解像度を指定しています。! は縦横比を無視する時に使うもので、無ければ基本的に縦横比にしたがって変換されます。
quality は [0-100] の間で指定するモノで圧縮率を指定するもののようです。デフォルトは 75 らしく、画質を落とされるのは困るので 100 にしました。最後に変換したいファイルを指定して実行すれば変換終了です。因みにこの変換の仕方ですと元ファイルに上書きされるので元ファイルを残したい場合はバックアップをとるか他の方法を探す必要があります。

これで壁紙用の画像も用意出来たので、XDM の設定に入ります。XDM の設定用ファイルはいくつかあるのですが、ログイン画面の変更にともなって編集するファイルは Xresources と Xsetup くらいでした。

参考ページ

XDM スクリーンショット


先ずは壁紙の設定から。

/etc/X11/xdm/Xsetup

#!/bin/sh
#
# This script is run as root before showing login widget.

#xsetroot -solid rgb:8/8/8
if [ -x /usr/bin/xsetbg ]; then
  /usr/bin/xsetbg -center -geometry /path/to/file.hoge
fi
#sh /bin/to/path/xdm_ss.sh &

先ほど作成した画像を xsetbg によって背景に設定しています。Xsetup はログイン認証が始まる前に動作するシェルなので、ログイン認証時に使用したい GUI 等をここで呼び出しておくことが出来ます。参考にしたページでは時計の設定等も行われていたのでガジェットを出しておくのもいいのかも知れません。
因みに XDM のログイン認証画面のスクリーンショットは Xsetup にスクリプトを挿入して認証画面に入ってから動作するように仕込んで撮りました。

xdm_ss.sh XDM スクリーンショットスクリプト

#!/usr/bin/sh
sleep 10
xwd -out /save/to/path/xdm_ss.jpg


ここからは Xresources によってログイン画面の変更の話に入ります。

/etc/X11/xdm/Xresources - ログイン画面: ログイン認証 Window 入力フォームキーバインド設定 -

xlogin*login.translations: #override \
	Ctrl<Key>R: abort-display()\n\
	<Key>F1: set-session-argument(failsafe) finish-field()\n\
	Ctrl<key>h: delete-previous-character()\n\
	<Key>Delete: delete-character()\n\
	<Key>Left: move-backward-character()\n\
	<Key>Right: move-forward-character()\n\
	<Key>Home: move-to-begining()\n\
	<Key>End: move-to-end()\n\
	Ctrl<Key>KP_Enter: set-session-argument(failsafe) finish-field()\n\
	<Key>KP_Enter: set-session-argument() finish-field()\n\
	Ctrl<Key>Return: set-session-argument(failsafe) finish-field()\n\
	<Key>Return: set-session-argument() finish-field()

この設定ではログイン画面での入力フォームのキーバインドを変更しています。Emacs 癖がついていたので Ctrl-h で BackSpace になってくれないと結構不便だったりしてたんでこれは助かります。


/etc/X11/xdm/Xresources - ログイン画面: ログイン認証 Window 表示文字列設定 -

!xlogin*greeting: Welcome to CLIENTHOST
xlogin*greeting: Login to ThinkPad X201s
!xlogin*namePrompt: \040\040\040\040\040\040\040Login:
!xlogin*fail: Login incorrect

xlogin*greeting では : 以降の文字列を greet の範囲にそのまま表示するのですが、 CLIENTHOST は端末の名前に置き換えて表示されます。行頭に ! を入れるとコメントアウトになるので僕は設定を消さず、コメントアウトして表示を変更しています。greet という文字列がつく設定はすべて greet 範囲の設定になります。因みに Login 等の文字列が表示されている上にボーダーラインがあるのですが、その枠内が greet の範囲っぽいです。

xlogin*namePrompt: は : 以降の文字列を Login Name 入力のフォームのラベルとして設定します。デフォルトは "Login: " です。
xlogin*fail: は : 以降の文字列をログイン失敗時に表示します。


/etc/X11/xdm/Xresources - ログイン画面: フォント設定 -

!#if WIDTH > 800
!xlogin*greetFont: -adobe-helvetica-bold-o-normal--24-240-75-75-p-138-iso8859-1
!xlogin*font: -adobe-helvetica-medium-r-normal--18-180-75-75-p-98-iso8859-1
!xlogin*promptFont: -adobe-helvetica-bold-r-normal--18-180-75-75-p-103-iso8859-1
!xlogin*failFont: -adobe-helvetica-bold-r-normal--18-180-75-75-p-103-iso8859-1
!xlogin*greetFace:	Serif-24:bold:italic
!xlogin*face: 		Helvetica-18
!xlogin*promptFace: 	Helvetica-18:bold
!xlogin*failFace: 	Helvetica-18:bold
!#else
xlogin*greetFont: -adobe-helvetica-bold-o-normal--17-120-100-100-p-92-iso8859-1
xlogin*font: -adobe-helvetica-medium-r-normal--12-120-75-75-p-67-iso8859-1
xlogin*promptFont: -adobe-helvetica-bold-r-normal--12-120-75-75-p-70-iso8859-1
xlogin*failFont: -adobe-helvetica-bold-o-normal--14-140-75-75-p-82-iso8859-1
xlogin*greetFace:	Serif-18:bold:italic
xlogin*face:		Helvetica-12
xlogin*promptFace:	Helvetica-12:bold
xlogin*failFace:	Helvetica-14:bold
!#endif

この設定ではフォントの設定を行っています。コメントアウトした以外はデフォルトのまま使っています。ここは WIDTH > 800 で分岐させています。ただ、この部分の検証を殆ど行っていないのと情報が少ない事もあり、WIDTH の値が何処からとられているのか分からないです。考えられるのは設定されている X の解像度か、もしくはログイン認証の Window の横幅かです。
まぁ端末の設定を行う上で汎用な設定を作る必要性はそんなに高くないので分岐は無しにして、フォントサイズを小さくしました。因みに特にこだわりが無かったのでフォントはデフォルトを使用しています。


/etc/X11/xdm/Xresources - ログイン画面: ログイン認証 Window と色の設定 -

#ifdef COLOR
xlogin*borderWidth: 1
!xlogin*width: 400
!xlogin*height: 200
xlogin*geometry: 500x200-160-35
xlogin*frameWidth: 2 
xlogin*innerFramesWidth: 2
xlogin*shdColor: #1c1c1c
xlogin*hiColor: #7c7c7c 
xlogin*background: black
xlogin*foreground: #7c7c7c
xlogin*greetColor: #7c7c7c
xlogin*failColor: red
*Foreground: #7c7c7c
*Background: #fffff0
#else
xlogin*borderWidth: 3
xlogin*frameWidth: 0
xlogin*innerFramesWidth: 1
xlogin*shdColor: black
xlogin*hiColor: black
#endif

COLOR はおそらく色の出力が出来るかどうかで振り分けている節があるので #if COLOR のブロック内に記述すれば問題ないかと思います。
xlogin*width、xlogin*height ではログイン認証の Window サイズを決めています。なのでこの値を修正すれば Window サイズは変更できます。ですが、これを決定してしまうとどうも Window の位置を変更することができなくなり、画面の中心に設定されます。そのためこの二つはコメントアウトし、xlogin*geometry を使用しました。コマンドオプションでよく見る geometry と同じ設定方法なので X 軸の長さ x Y 軸の長さで Window サイズを指定出来ます。さらに、今回は Window の位置も指定したいので、位置指定の引数も入れます。それが、XxY の後に続く -160-35 の部分です。この -160、-35 という二つの整数は座標を指定しており、[+-]X[+-]Y という並びになっています。では + とか - が何なのかというと解説を読んだわけではないので私見ですが、画面の中央をデフォルトとして捉え、画面左上隅を +0+0、左下隅を +0-0、右下を -0-0、右上を -0+0 となっていました。なので、-0-0 と指定した時には Window は右下隅にピッタリ位置取ります。そこから、与えられた数値分だけ中央に寄っていくようです。僕の設定の場合には右下の隅から中央に向かって X: 160、Y: 35 移動した位置に配置されます。
とにかく位置を設定したいなら geometry による Window 指定をしないとダメな事は覚えておきましょう。

後は CSS に近いモノがあるのでわかりやすいと思います。borderWidth は Window 内部のボーダーラインの太さを設定しています。frameWidth はフレームの外のラインの太さ、innerFramesWidth は Window 内部の入力フォームの枠の太さの設定です。xlogin*foreground、xlogin*background、はログイン認証 Window の内の入力した文字と背景の色を設定します。xlogin*shdColor はログイン認証 Window の右と下の枠、xlogin*hiColor は左と上の枠の色を設定します後はそれぞれの名前に従った箇所の色付けです。


/etc/X11/xdm/Xresources - ログイン画面: アイコンとテキスト入力フォームの設定-

#if PLANES >= 8
!xlogin*logoFileName: /usr/share/X11/xdm/pixmaps/debian.xpm
#else
!xlogin*logoFileName: /usr/share/X11/xdm/pixmaps/debianbw.xpm
#endif
xlogin*useShape: true
xlogin*logoPadding: 0

XConsole.text.geometry:	200x80
XConsole.verbose:	true
XConsole*iconic:	true
XConsole*font:		fixed

ここで出てきた PLANES が何を指しているのか全く分かりませんでした。ですが、画像を見る限りコチラも色関係かと思います。実際に使用されていた画像を見比べてみると標準は #if PLANES >= 8 のブロックみたいでした。今回僕は icon を無しにしたかったので xlogin*logoFileName をコメントアウトしました。念の為両方コメントアウトしてます。logoPadding は icon を利用しない為に不必要と判断し、0 にしました。useShape はよくわかっていないのでそのままにしてます。icon に補正を掛けるとかそんなのですかね。
XConsole.text.geometry はテキスト入力フォームのサイズを設定する項目です。他は残念ながら分かりませんでした。verbose はおそらくコマンドオプションと同じかと思いますが、他はさっぱり分かりませんでした。なんなんでしょうね。