試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

STed2が「Cannot open display. Aborting.」となって起動できない件についてとその対処

エラーメッセージ

$ sted2
MIDI Music Composer STed 2.07m + 20021104 Copyright 1990-97 TURBO
Cannot open display. Aborting.

手元のGentoo Linuxで試したところ、このエラーで起動できず、環境変数DISPLAYを未定義にすることでncurses版を起動することはできたが、日本語が化けるため、英語で使うのが無難なのだが

$ LC_MESSAGES=C env -u DISPLAY sted2

X Window System版と比べると見づらく、操作がうまくいかない部分もある。

どこでエラーになっている?

エラー自体は、(邪道な方法かもしれないが)ソースにputs()関数を色々なところに追加して場所を特定したところ、
[引用]ファイル名: sted2-20021104/sted2/sub/xwin.c

int Setup_FontSet( void ) {

  XFontSetExtents *e;
  char **miss, *def;
  int n_miss;
  XRectangle i_ret, l_ret;


  if ( font_name[0]==0 ) strcpy( font_name, XSTed_Default_Font );
  XSTed_fs = XCreateFontSet ( XSTed_d, font_name,
                              &miss, &n_miss, &def);

  if ( n_miss > 0 ) return -1;

このXCreateFontSet()関数が失敗したところまでは分かったのだが、対処の方法が分からなかった。

解決策

(ディストリによっては「libx11-dev」などの開発パッケージをインストールした上で)
http://www.nabble.com/Re%3A-3.9-8VM%E7%94%A8%E3%81%AESqueakImmX11Plugin%E3%83%91%E3%83%83%E3%83%81-p8959897.html
のテストプログラムをビルド(gcc [保存したファイル].c -o [実行ファイル名] -lX11)して実行し、色々なパターンを渡して出力を得たところ、XCreateFontSet()の3番目の引数のポインタが指すint型変数の値(sted2-20021104/sted2/sub/xwin.cの例だと変数n_miss)が0を越えてもフォントは見つかり、表示される(XCreateFontSet()の戻り値もNULLではない)ことが分かった。つまり、

--- sted2-20021104.orig/sted2/sub/xwin.c
+++ sted2-20021104/sted2/sub/xwin.c
@@ -341,7 +341,7 @@
   XSTed_fs = XCreateFontSet ( XSTed_d, font_name,
                               &miss, &n_miss, &def);
 
-  if ( n_miss > 0 ) return -1;
+  if (XSTed_fs == NULL) return -1;
 
   e = XExtentsOfFontSet( XSTed_fs );
   XmbTextExtents( XSTed_fs, "A", 1, &i_ret, &l_ret ); 

とするのが正しいのではないか、ということになる。*1
実際、修正後にビルドした結果としても、条件付きで無事に起動するようになったことが確認できた。
sedを使用したソース修正例としては

$ sed -i 's/n_miss > 0/XSTed_fs == NULL/' sted2/sub/xwin.c

のようになる。

起動の追加条件について

STed2の設定ファイル*2のフォント設定部分で、該当フォントが使用できる必要がある。
そのままではまだエラーになる場合、設定ファイルを開いて

ファイル名: ~/.sted2rc もしくは [インストール先]/lib/sted/sted2.cnf

*#font_name=-\*-fixed-\*-r-normal--12-\*-\*-\*
*#font_name=-\*-fixed-\*-r-normal--14-\*-\*-\*
#font_name=-\*-fixed-\*-r-normal--16-\*-\*-\*
*#font_name=-\*-fixed-\*-r-normal--18-\*-\*-\*
*#font_name=-\*-fixed-\*-r-normal--20-\*-\*-\*
*#font_name=-\*-fixed-\*-r-normal--24-\*-\*-\*

となっている部分を見つけたら、コメント記号(アスタリスク)の付く項目を変えて他のフォント設定が有効になるようにするか、PCF*3フォントを追加してみる。あるいは、フォントセットのパターンを書き換える。
うまくいかない場合、上のテストプログラムを使用して試すのもよい。
手元のGentoo Linuxでは、16ドットでのフォント表示ができなかったため、media-fonts/font-jis-misc*4milkjfフォントを追加したところ、16ドットでも起動するようになった。
関連記事:

font-jis-misc(jiskan16)だけだと

X Error of failed request:  BadValue (integer parameter out of range for operation)
  Major opcode of failed request:  1 (X_CreateWindow)
  Value in failed request:  0x0
  Serial number of failed request:  32
  Current serial number in output stream:  34

となってしまった(この状態では、テストプログラムの検出フォントが「-jis-fixed-medium-r-normal--16-110-100-100-c-160-jisx0208.1983-0」の1つだけしか出ないが、そのせいかもしれない)。

画像はmilkjf+font-jis-miscでの表示(16ドット)で、テストプログラムの結果は

$ [実行ファイル名] "-*-fixed-*-r-normal--16-*-*-*"
pattern: -*-fixed-*-r-normal--16-*-*-*
default:
missing: KSC5601.1987-0
missing: GB2312.1980-0
found: -milkjf-fixed-bold-r-normal--16-150-75-75-c-80-iso8859-1,-milkjf-fixed-bold-r-normal--16-150-75-75-c-80-iso8859-1,-jis-fixed-medium-r-normal--16-110-100-100-c-160-jisx0208.1983-0,-milkjf-fixed-bold-r-normal--16-150-75-75-c-80-jisx0201.1976-0,-misc-fixed-bold-r-normal--16-116-100-100-c-0-iso10646-1

のようになっている。

Vine Linux 4.2では、設定の必要がなく、既定の16ドットで動作している(ビルドには「XOrg-devel」パッケージが必要)。

しかし、見ての通り、そのままでは音符の位置がずれている(Gentoo上でも同様)。この件に関しては別の記事で扱う。

*1:ただし、下にも書いてあるように、フォント構成によってはX Errorが出たりもするため、他のチェックも必要なのかもしれない

*2:既定の場所は/usr/local/lib/sted/sted2.cnfで、このファイルを${HOME}/.sted2rcという名前でコピーし、編集することで設定変更ができる

*3:ビットマップフォントの形式の1つ

*4:Debian/Ubuntuでは「xfonts-base」に含まれる・ファイル名はjiskan16.pcf.gzjiskan24.pcf.gz