GTK+での日本語入力について


ここではGTK+ における日本語入力についてまとめてみました.

 GTKにおいて文字を入力することのできるWidgetはGtkEntryとGtkText (およびGtkEntryの派生WidgetであるGtkSpenButton)です.
 Gtk+1.1.7よりどちらともにMultiByteのTextが扱えるようになりました. ただ, localeの設定をきちんとしていないといけません. 以下にlocaleの設定方法について述べます.

 localeの設定

FreeBSD(2.x)の場合


  1. FONTSETを使用する

     gtkはfontsetが指定されていればXDrawString16()を, fontで指定されていればXDrawString()を呼び出すようになっています. 日本語を表示させるにはXDrawString16()を呼び出さないといけないので fontsetを指定しなければいけません. これはrcファイルを 書きかえることで対応できます.
    例えばgtk/testgtkのrcファイルはgtk/testgtkrcとte文字 のlocaleに対応していませんので「libxpg4」を リンクする必要があります.
     gtk/testgtk.cをコンパイルする時を例にとってみると

    gcc -lxpg4 `gtk-config --libs` `gtk-config --cflags` testgtk -o .libs/testgtk

    と libxpg4をlinkするように指定します. gtk-configにpatchをあてて -lxpg4 を追加できるようにするのもいいかも知れません.


  2. localeを確認する.

     上の1,2だけでentryの日本語入力は可能です. ただ アプリケーションを立ちあげた時に

    locale not supported by C library

    とエラーメッセージがでてくるかも知れません. ここで /usr/share/locale/ja_JP.EUC に LC_COLLATE,LC_TYPE,LC_TIMEの3つのファイルがあることを確認してください. おそらく初期状態ではLC_TYPEしかありませんので

    LC_COLLATE -> ../en_US.ISO_8859-1/LC_COLLATE
    LC_TYPE
    LC_TIME -> ../en_US.ISO_8859-1/LC_TIME

    と linkをはってください. (最近のversionでどうなっているかまでは確認していません)

     ここでもしかすると

    /usr/share/locale/ja_JP.EUC -> /usr/share/locale/en_US.ISO_8859-1

    となってる人がいるかも知れません(Netscapeの日本語化の為に このようにしている人も多いと思います) これではGTKで日本語がでませんので netscapeだけ別のlocaleを読むように します. 具体的には

    # mkdir /usr/local/netscape/locale
    # ln -s /usr/share/locale/en_US.ISO_8859-1 /usr/loca/netscape/locale/ja_JP.EUC

    として, Netscapeを起動するときには

    % env PATH_LOCALE=/usr/local/netscape/locale netscape

    とするようにしてください.





Linuxの場合


 最近のディストリビューションではlibc6(glib2)に移行してしまった状態です. libcのversionを簡単に調べる方法は…誰か知りません?


Linux (libc5/X_LOCALEを使用する場合)

  1. FONTSETを使用する

     FreeBSDの場合と同じです. ということでpaste
     gtkはfontsetが指定されていればXDrawString16()を, fontで指定されていればXDrawString()を呼び出すようになっています. 日本語を表示させるにはXDrawString16()を呼び出さないといけないので fontsetを指定しなければいけません. これはrcファイルを 書きかえることで対応できます.
    例えばgtk/testgtkのrcファイルはgtk/testgtkrcというのがありますので,

    style "default"
    {
    # fontset = "-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*,*"
    font = "-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*"
    }

    ここの fontsetの前の#を取り, font = の行を#でコメントアウトします. うまく表示されない場合は ,*"ではなく,*--14-*" とした方がいいのかも知れません.


  2. XSetlocaleを呼び出すようにする

     LinuxはOSのsetlocale()でなくXのXSetlocale()を使用します. よってGTK+を-DX_LOCALEつきでmakeしないといけません.
    configureでうまくいけばいいのですが, うまくいかないようなので

    # configure --with-locale=ja_JP.EUC

    としたほうがよさそうです. gtk/Makefile, gdk/Makefileに-DX_LOCATEが ちゃんとついていることを確認してください.



  3. XLC_LOCALEにpatchをあてる.

    XFree86 3.3.2以降ではこの作業は必要ありません.
     /usr/X11R6/lib/X11/locale/ja/XLC_LOCALEに以下のpatchをあてます. (XFree86 3.3.2のLOCALEと変更してもかまいません)

    --- XLC_LOCALE.orig     Fri Dec 12 02:54:25 1997
    +++ XLC_LOCALE     Fri Dec 12 02:54:03 1997
    @@ -35,6 +35,7 @@
            }
            font    {
                    primary         JISX0201.1976-0:GR
    +               substitute      JISX0201.1976-0:GR
                    vertical_rotate all
            }
     }

Linux (glibc2の場合)


 FONTSETの設定のみで問題ありません. ただglibc2は まだ不信な挙動をすることがあります. 詳しくは各ディストリビュート のFAQを読むといいと思います.
glibc2.0の場合は2byte locateに対応していませんので libwbcmsと日本語localeを入れる必要があります.

 glibc2.1はlibwbcmsは必要ありませんが, 日本語localeは別packageになっていることが多いようです.

 最近 Linuxにおけるlocaleの見解がでたようで ja_JP.eucJPが公式のlocaleらしいです.


MkLinux/LinuxPPC


 基本的にはLinuxと同じですが, MkLinux DR2.1についてくるXはXIMまわりがうまく動いていないようです. X11R6.3-01-n1以降に入れ替えてください. あとはLinuxと同じです.
LinuxPPC R5からglibc2.1ベースになったので, glibcのlocaleが使えると思います. ただ, RedHat 6baseのようなので, 日本語のlocaleが無いのが問題ですが….


Solaris


 一番localeまわりがしっかりしていると言われているので FontSetの設定のみで大丈夫だと思います.



その他のUNIX系OS


 その他のOSも基本的に同じで

  1. FONTでなくFONTSETを使用する
  2. OSのlocaleが使えない場合にはXのlocaleを使用する

の2点で日本語の入力が可能になります.

Windows/BeOS


 Gtk+ for Windowsはi18nには対応していないらしいです. ということで日本語は無理のようです. BeOS版は試していないのでわかりません.



その他の注意点


 WindowManagerの設定によるのですが, kinput2を起動させた 場合, kinput2の入力ウィンドウにForcusがあたってしまい ます. EntryをクリックしてForcusをあてなおしてから入力 してください.(これって面倒だよねぇ)
GTK+1.1.7あたりからでしょうか, 無理矢理GtkEntryにforcusを当てるようになってしまいました. WindowManagerの設定によってはforcusの取り合いになるかも知れません. kinput2のwindowはnoforcusにしておいたほうがいいかもしれません.


 動作確認を行った環境