どうしようかなぁ・・・

pclinuxos-ZEN-mini-2011-7 の日本語化作業をしている過程で気が付いたことなのですが、X 起動時に GDM_LANG という環境変数が設定されている場合には、/etc/sysconfig/i18n や ~/.i18n の内容を全く読んでくれません。

具体的には、/etc/X11/Xsession から呼び出されている /etc/profile.d/10lang.sh の 15〜19 行目で $GDM_LANG による判定が行われています。

拙作のインプットメソッド切り替えツールの setime では、/etc/sysconfig/i18n または ~/.i18n にインプットメソッドに関する環境変数を記述していますが、X 起動時にこれらのファイルが読み込まれないと日本語入力が出来なくなってしまいます。

実際、pclinuxos-ZEN-mini-2011-7 の日本語化作業では setime で ibus を入力メソッドとして設定したのですが、ユーザーログインしてみると ibus は起動していませんでした。(ちなみに root でログインした場合には何故か $GDM_LANG が設定されておらず、ibus は正常に動作していました)

デフォルトのディスプレイマネージャーが gdm である ZEN-mini 版や gnome 版では、GDM_LANG という環境変数が設定されている可能性があり、その場合には現在のままの setime ではインプットメソッドを切り替えるという本来の役目を果たすことができません。

現時点で考えられるこの問題への回避策は次の3通りかなと思います。(他に良い方法が有ればアドバイスをお願いします)

  1. インプットメソッドに関する環境変数の設定を ~/.bash_profile に記述する。
  2. インプットメソッドに関する環境変数の設定を /usr/share/X11/xdm/Xsession に記述すると共に、/etc/xdg/autostart/ 下に自動起動用の desktop ファイルを配置する。
  3. /etc/profile.d/10lang.sh の 15〜19行目をコメントアウトして、$GDM_LANG の設定の有無にかかわらず常に /etc/sysconfig/i18n または ~/.i18n を強制的に読み込む様にする。

1. の場合には各ユーザー毎の設定のみとなり、システムワイドな設定ができません。
2. の場合には 1. の場合と逆でシステムワイドな設定のみとなり、ユーザー毎の設定は不可となります。setime では過去にこの方法を用いていたことがあります。
3. の場合には、ユーザー毎・システムワイド のどちらの設定にも対応できますが、/etc/profile.d/10lang.sh がアップデートされる度に修正を行う必要が出てきます。

ちなみに addlocale で日本語化を行った場合には scim-bridge がデフォルトになっていますが、その設定方法は 2. となっています。

addlocale の方法に合わせて setime でも 2. の回避策を採るのがベターなのかなとも思いますが、ユーザー毎の設定が出来ないというのがちょっと気になり、1, の方法も捨て難いと迷っています。さーて、どうしましょうかね・・・

PCLinuxOS | comments (19) | -

コメント

pclos9 | 2011/07/25 03:55 PM
~/.config/autostartの下に起動のdesktoppファイルを置くと個別設定になります。
/etc/xdg/autostartと同じdesktopファイルがあるときは~/.config/autostartの方が優先されます。
環境変数の設定は確認してませんが~/.xsession当たりに記述すればいいかな…
ううん、あまり自信がありません。
pclos9 | 2011/07/25 04:51 PM
ps.
環境変数の設定は~/.bash_profileでいいと思います。
tomcat | 2011/07/25 07:05 PM
アドバイスありがとうございます。

> ~/.config/autostartの下に起動のdesktoppファイルを置くと個別設定になります。

実際に試してみました。この方法で確かにユーザー個別に設定することができます。がしかし、希望する動作とはなってくれません。

/usr/share/X11/xdm/Xsession と /etc/xdg/autostart/ 下の desktop ファイルで scim-bridge が設定されいる環境で、~/.config/autostart 下に ibus 起動用の desktop ファイルを置いてみました。

この場合、確かに ibus は起動してくれますが、同時に scim-bridge も起動してしまいました。
環境変数も ~/.bash_profile で設定されたものは無視され、/usr/share/X11/xdm/Xsession の記述内容が有効となってしまいました。(~/.bash_profile よりも /usr/share/X11/xdm/Xsession の方が後から実行されてる?)

結果、日本語入力モードに入る際には scim-bridge の方が動作してしまい、ibus を使用することができませんでした。

希望する動作は、scim-bridge は全く起動せずに ibus のみが起動してこれを使用できることですので、残念ながら ~/.config/autostart の下に起動用の desktopp ファイルを置く方法では、希望する動作を叶えることができませんでした。

もう少し色々と試してみようと思います。
pclos9 | 2011/07/25 09:53 PM
ZEN-miniを持ってないのでよくわからないのですが、2010-gnomeを引っ張りだしてライブCDで起動していますが、
システムー設定ー自動起動するアプリケーションというメニューがありますか?
ないときはターミナルからgnome-session-propertiesと入力してください。
自動起動するアプリケーションにscim-bridgeを起動するものがあるのでそのチェックを外してみてください。
再ログインしてscim-bridgeが起動してなかったらOKです。
~/.config/autostartにibusを起動するdesktopファイルを作成すれば(scim-bridgeを起動するdesktopファイルとは別名にする)希望する動作を実現できます。
~/.config/autostartの下に/etc/xdg/autostartのものと同じファイル名のdesktopファイルができていてこの中に
X-GNOME-Autostart-enabled=false
という記述があってこれがscim-bridgeの起動を無効にしてます。
これは現在のユーザーだけscim-brisgeが無効で別のユーザーでは有効です。
pclos9 | 2011/07/25 09:57 PM
たびたびすいません。
環境変数は~/.xsessionに記述して有効になりませんか?
tomcat | 2011/07/26 12:17 AM
再度のアドバイスありがとうございます。
お手を煩わさせてしまった様で、申し訳ありません。m(_ _)m

「自動起動するアプリケーション」から scim-bridge を無効にしていますが、何故か scim-bridge が起動してきます。orz

> ~/.config/autostartにibusを起動するdesktopファイルを作成すれば
> (scim-bridgeを起動するdesktopファイルとは別名にする)希望する動作を実現できます。

ibus.desktop というファイル名で ~/.config/autostart 下に置いています。
ibusは起動していますのでこのファイルには問題は無いと考えています。

> ~/.config/autostartの下に/etc/xdg/autostartのものと同じファイル名の
> desktopファイルができていてこの中に
> X-GNOME-Autostart-enabled=false
> という記述があってこれがscim-bridgeの起動を無効にしてます。

こちらでもお書きになっているのと同じ状態になっていますが、何故か scim-bridge が起動してきます。
うーん、なぜなんだ・・・

> 環境変数は~/.xsessionに記述して有効になりませんか?

はい、有効になってくれません。

ユーザー個別の設定は諦めて、システムワイドな設定のみで行こうかなと思ってみたりしています。
pclos9 | 2011/07/26 01:03 AM
明示的に起動してなくても環境変数がscimに設定されているとGTKアプリを起動しただけでscim-bridgeは起動します。
($XIM_PROGRAMに設定されてるものを起動する)
環境変数をibusに変更することの方が重要です
2011.7のZEN-miniはよくわかりませんが、2010-gnomeでは
/usr/share/X11/xdm/Xsessionは/etc/X11/Xsessionを呼んでいるだけです。
/etc/X11/Xsessionは~/.xsessionがあれば実行します。
そのへんをみれば設定されない理由がわかるはずです。
~/.xsessionは実行属性は付けてますね。
tomcat | 2011/07/26 07:10 PM
> 明示的に起動してなくても環境変数がscimに設定されているとGTKアプリを起動しただけで
> scim-bridgeは起動します。

ログイン後、デスクトップが表示された段階で既に scim-bridge は起動しています。
多分、次に書いていることと関係があると思います。

> /usr/share/X11/xdm/Xsessionは/etc/X11/Xsessionを呼んでいるだけです。

addlocae-3.7-6 以降では、日本語化の際に /usr/share/X11/xdm/Xsession に下記の設定が書きこまれる様になりました。

export XMODIFIERS=@im=SCIM
export GTK_IM_MODULE=scim-bridge
export QT_IM_MODULE=xim

これらの設定については、/usr/bin/addlocale を覗いて頂ければ(最新版だと1771行目辺りから)ご理解頂けると思います。
で、この設定が在るが為に、scim-bridge が常に起動してくるのではないかと考えています。
勿論、この設定をコメントアウトしてしまえば scim-bridge は起動して来なくなりますが、それでは他のユーザーが scim-brdige を使えなくなってしまいます。

ちなみに現行の setime-0.33 では、i18n ファイルによる設定を用いる為に、setime パッケージのインストール時に上記の Xsession に書きこまれた設定を削除しています。

> /etc/X11/Xsessionは~/.xsessionがあれば実行します。

確かに仰る通りなのですが、やはり .xsession に記述された環境変数は設定されません。(実行属性は付けてます)
.xsession 実行中には設定されている模様ですが、.xsession の実行後には元に戻ってしまっています。考えてみれば、これはスクリプトの動作としては当然なのかもしれません。
pclos9 | 2011/07/26 09:50 PM
>.xsession 実行中には設定されている模様ですが、.xsession の実行
後には元に戻ってしまっています。考えてみれば、これはスクリプトの
動作としては当然なのかもしれません。

スクリプトを単に呼んでいるのはなく展開してるので設定は有効です。

. $HOME/.xsession

(頭のピリオドに注意)
と記述してあるはずです。
これはincludeのような動作になりスクリプトが挿入され実行されます。
実行した後も環境変数の設定は有効です。

>addlocae-3.7-6 以降では、日本語化の際に /usr/share/X11/xdm/Xsession に下記の設定が書きこまれる様になりました。

これは". /etc/X11/Xsession"の前ですか?後ですか?
後だと上書きされてうまくありません。
pclos9 | 2011/07/26 09:56 PM
先頭のピリオドの後にはスペースが空いています
フォントによってはわかりにくいかもしれないので
tomcat | 2011/07/26 10:28 PM
> スクリプトを単に呼んでいるのはなく展開してるので設定は有効です。

/etc/X11/Xsession で .xsession を呼び出しているのは149行目の
exec $CK_XINIT_SESSION /bin/sh -c "$HOME/.xsession"
のみですね。
この記述では環境変数の設定は .xsession の実行後には残らないのでは?
実際、設定されていませんし。
(私とpclos9さんとでは、見ている /etc/X11/Xsession の内容が異なっている?)

> これは". /etc/X11/Xsession"の前ですか?後ですか?

前です。
ちなみに、addlocae-3.7-6 以降で日本語化を行った後の /usr/share/X11/xdm/Xsession の内容は下記の様になっています。

------------------------------------------
#!/bin/bash -login

export XMODIFIERS=@im=SCIM
export GTK_IM_MODULE=scim-bridge
export QT_IM_MODULE=xim

exec /etc/X11/Xsession \$*

# Xsession ends here
------------------------------------------
tomcat | 2011/07/26 10:45 PM
すみません、/usr/share/X11/xdm/Xsession の内容に転記間違いがありました。

(誤) exec /etc/X11/Xsession \$*
(正) exec /etc/X11/Xsession $*
pclos9 | 2011/07/26 11:25 PM
execでは確かに環境変数は引き継がれませんね。
gnome-2010.11から変更になっています。

ちょっと確認して欲しいのですが、
/usr/share/X11/xdm/Xsessionを以下のように修正してみて
どうなりますか

#!/bin/bash -login

export XMODIFIERS=@im=SCIM
export GTK_IM_MODULE=scim-bridge
export QT_IM_MODULE=xim

if [ -x $HOME/.xsession ]; then
. $HOME/.xsession
fi

exec /etc/X11/Xsession $*

# Xsession ends here
tomcat | 2011/07/27 12:00 AM
おお、上手く動作しています!
システムワイドではscim-bridgeのままで、個別にibusに設定したユーザーではibusで正常に日本語入力が行えています。
これでシステムワイドと個別設定の両方に対応できそうです。
頂いたアドバイスを取り入れて setime の修正に入りたいと思います。

長々とお時間を取らせてしまい申し訳ありませんでした。本当にありがとうございました。
pclos9 | 2011/07/27 12:37 AM
setimeを修正しなくていける方法があります

/ust/share/X11/xdm/Xsessionを次のように修正します

#!/bin/bash -login

export XMODIFIERS=@im=SCIM
export GTK_IM_MODULE=scim-bridge
export QT_IM_MODULE=xim

if [ -f /etc/sysconfig/i18n ]; then
. /etc/sysconfig/i18n
fi

if [ -x $HOME/.xsession ]; then
. $HOME/.xsession
fi

exec /etc/X11/Xsession $*

# Xsession ends here

setimeは今まで通り/etc/sysconfig/i18nと$HOME/.i18nを設定するだけでいいです。
addlocaleが/usr/share/X11/xdm/Xsessionを元に戻してしまうのでaddlocaleを上記の内容に設定するようにaddlocaleを修正してnoraパッケージを作成します。
そしてインストールしておきます。
もし、addlocaleがバージョンアップしたときはそれを元にnoraパッケージを毎回作成することになります。(面倒ですが)
pclos9 | 2011/07/27 12:42 AM
すいません。
訂正します

/usr/share/X11/xdm/Xsessionは以下の内容

#!/bin/bash -login

export XMODIFIERS=@im=SCIM
export GTK_IM_MODULE=scim-bridge
export QT_IM_MODULE=xim

if [ -f /etc/sysconfig/i18n ]; then
. /etc/sysconfig/i18n
fi

if [ -f $HOME/.i18n ]; then
. $HOME/.i18n
fi

exec /etc/X11/Xsession $*

# Xsession ends here

/etc/sysconfig/i18nと$HOME/.i18nに実行属性は要りません。
tomcat | 2011/07/27 09:42 PM
/usr/share/X11/xdm/Xsession で /etc/sysconfig/i18n や $HOME/.i18n を読み込ませる方法で上手く行けそうだと思ったのですが...

KDE環境では上手く動作してくれたのですが、ZEN-mini-2011-7 上では何故か上手く行かず、/etc/sysconfig/i18n や $HOME/.i18n を読み込んでくれません。うーん...

もう少し格闘してみます。(^_^;)
pclos9 | 2011/07/28 01:41 PM
ZEN-mini-2011.7で試したところなんの問題もなく動作しましたよ。
/usr/share/X11/xdm/Xsessionの中の$HOME/.18nは実行されています。

setimeでは/etc/xdg/autostart, ~/.config/autostartの下のdesktopファイルの処理は行っておかなければなりません。
たとえば個別設定でibusが指定されたときは、/etc/xdg/autostart/scim.desktopは無効化し、~/.config/autostartの下のdesktopファイルでibusを起動するようにdektopファイルを登録しなければなりません。
最初に申し上げたように/etc/xdg/autostartと~/.config/autostartに同じファイル名が存在するとき~/.config/autostartの下のdesktopファイルが優先して実行されます。
これで無効化と登録を同時に設定できます。
また、desktopファイル名を起動するIMのファイル名ごとにしておくと(たとえばscim.desktopとかibus.desktopとか)setimeの処理が煩雑になるのでim.desktopと統一した方がいいです。
mv /etc/xdg/autrostart/scim.desktop /etc/xdg/autostart/im.desktopとして話をすすめます。

例1)
個別設定をibusにする

im.desktopを~/.config/autostartに作成する(もしくは置き換える)。
内容は
[Desktop Entry]
Type=Application
Name=IBUS
Exec=ibus-daemon -x -d
Hidden=false
X-GNOME-Autostart-enabled=true

例2)
グローバル設定をuimにする
/etc/xdg/autostart/im.desktopを以下のものに置き換える。

[Desktop Entry]
Type=Application
Name=UIM
Exec=uim-xim
Hidden=false
X-GNOME-Autostart-enabled=true
tomcat | 2011/07/28 04:20 PM
別エントリに書きました様に、本日のお昼頃に setime-0.42 を野良リポジトリに投入しました。

結局、/etc/sysconfig/i18n や $HOME/.i18n を使用する方法を止め、/etc/share/X11/xdm/Xsession または $HOME/.xsession に環境変数を記述、/etc/xdg/autostart/ または $HOME/.config/autostart/ 下に自動起動用の desktop ファイルを置く方法を採用しました。

システムワイドで設定されているインプットメソッドとユーザーが個別に設定しているそれが異なる場合の対処も無事に行えていると思います。
setime-0.42 について何かお気付きの点がありましたら、ご指摘戴ければ幸いに思います。

今回は多くのアドバイスを戴き、本当にありがとうございました。

コメント フォーム