[debian-devel 00263] Busterデフォルトデスクトップへのim-config対応について

YOSHINO Yoshihito yy.y.ja.jp @ gmail.com
2019年 3月 8日 (金) 01:27:57 JST


青木さん みなさま

よしのです

現状 Buster の日本語デスクトップ環境(主にデフォルトの uim + im-config + GNOME Wayland + gdm3
+ systemd-logind + systemd)ではそのままだと日本語入力ができません(関連 Bug#877312)

超長いので,先にお願いです

以下を踏まえて,im-config パッケージに手を入れて入力できるようにしてみたのでお試しください.
特に gdm3 を使っている方に GNOME に限らず Xorg の様々な環境でお試しいただきたいです.
注意点としては,~/.gnomerc, ~/.xsessionrc, ~/.xprofile, ~/.profile で uim
などを起動していた方は二重起動になる可能性があります.そうなった場合は,その IM 関連の行を削除して再ログインすればいいはずです.
なお ~/.xinitrc, ~/.xsession, ~/.Xsession で自分でウィンドウマネージャなど上げてる方は影響ないはずです.

https://salsa.debian.org/yyoshino-guest/im-config

ビルド済みのものも置いておきます

https://yyoshino-guest.pages.debian.net/tmp-im-config/im-config_0.39~~test1-0.1_all.deb
( https://yyoshino-guest.pages.debian.net/tmp-im-config/im-config_0.39~~test1-0.1_amd64.changes
)

以下に課題と対応案を整理します

1) ログイン直後の初期化

前提として

- 入力対象アプリには GTK_IM_MODULE などの環境変数を設定
- デーモンやツールバーを起動

する必要がある.ただし GNOME は ibus 向けに独自 D-Bus API を提供しているようなので,GNOME + ibus は
GTK_IM_MODULE を設定しなくても基本動くようだが,GNOME の GSettings に ibus の設定を行う必要がある(関連
Bug#654307)

環境変数は(最後に呼ばれる最も優先されるものから順に)

(a) ~/.xsessionrc など /etc/X11/Xsession.d/* が読み込むシェルスクリプトなど
(a') ~/.xinitrc など startx/xinit が実行するシェルスクリプトなど
(b) ~/.xprofile など一部のディスプレイマネージャ(現状 gdm3)が読み込むシェルスクリプト
(c) ~/.profile などログインシェルまたはディスプレイマネージャが読み込むシェルスクリプト
(d) /usr/share/gdm/env.d/* といったディスプレイマネージャ固有の方法
(e) ~/.pam_environment などで PAM environment に設定したものを(一部の)ディスプレイマネージャ(例 sddm)が読み込む
(f) ~/.config/environment.d/*.conf などで systemd --user の activation
environment に設定したものを(一部の)ディスプレイマネージャ(現状 gdm3)が読み込む

などの方法で設定できる.起動方法は主に

- シェルでバックグラウンド実行する
- XDG Autostart の *.desktop ファイルで Exec 指定する(GNOME デスクトップなど XDG
Autostart 対応のウィンドウマネージャのみ)

がある.

その上で Xorg では

(A1) im-config パッケージの /etc/X11/Xsession.d/70im-config_launch が読み込む
/etc/X11/xinit/xinputrc, ~/.xinputrc などのシェルスクリプトで設定 + im-launch
で起動,ただし他の方法(下記など)で設定済みだったら(設定も起動も)何もしない(デフォルト)
(A2) (GNOME セッションの場合)/etc/X11/Xsession.d/55gnome-session_gnomerc
が読み込むシェルスクリプト ~/.gnomerc で設定+起動
(A3) ~/.xsessionrc など /etc/X11/Xsession.d/* が読み込むシェルスクリプトで設定+起動
(A4) ~/.xsession など /etc/X11/Xsession.d/* が実行するシェルスクリプトなどで設定+起動
(A') ~/.xinitrc など startx/xinit が実行するシェルスクリプトなどで設定+起動
(B) ~/.xprofile など一部ディスプレイマネージャの Xsession ラッパー(現状 gdm3 の
/etc/gdm3/Xsession)が読み込むシェルスクリプトで設定+起動
(C1) ログインシェル相当(~/.profile など)で設定+起動
(C2) ログインシェル相当 (/etc/profile.d/*.sh) で設定+起動,ただし他の方法で設定済みだったら何もしない(参考:
Ubuntu の暫定デフォルト)
(D)(gdm3 の場合)/usr/share/gdm/env.d/カスタム で設定 +
~/.config/autostart/カスタム.desktop で起動
(E) pam_env(7) (~/.pam_environment) で設定 +
~/.config/autostart/カスタム.desktop で起動(gdm3 では conffile
書き換えない限り使えない,sddm では可能.参考: Ubuntu では可能)
(F')(systemd + systemd-logind + gdm3
の場合)/usr/lib/systemd/user/graphical-session-pre.target.wants/
などに置いたユニットが /bin/sh を立ち上げて以下を行う.がうまく動かないらしい(参考: まだ Ubuntu
のデフォルトだが,なぜかこの target が呼ばれず動かないため (C2) の暫定対応をしているらしい)
   1. /etc/X11/Xsession.d/* を読み込んで設定したい環境変数を計算(この時点ではこの /bin/sh プロセス内にのみ設定)
   2. その環境変数の状態で im-launch 相当を実行して起動
   3. dbus-update-activation-environment --systemd 変数名 を実行して systemd
--user の activation environment に設定すると gdm3 がそれをインポートして環境変数に設定
(F1)(systemd (>= 233) + systemd-logind + gdm3 の場合)systemd --user が
~/.config/environment.d/カスタム.conf などを読み込んで systemd --user の activation
environment に設定すると gdm3 がそれをインポートして環境変数に設定 +
~/.config/autostart/カスタム.desktop で起動
(F2)(systemd (>= 233) + systemd-logind + gdm3 の場合)systemd --user が
/etc/systemd/user-environment-generators/* などを実行して systemd --user の
activation environment に設定すると gdm3 がそれをインポートして環境変数に設定 +
/etc/xdg/autostart/*.desktop で起動

などの方法があった.

しかし主に新デフォルトでは

- (a) つまり (A1),(A2),(A3),(A4) は使えない.Wayland
自体にはスクリプトの読み込みや実行する機能がなく,/etc/X11/Xsession.d/* も読まれない
- (a') つまり (A') は使えない.startx 相当の Wayland 環境起動スクリプトは存在しない.用意するつもりもなさそう
- (b) つまり (B) は使えない.gdm3 に Wayland セッション向けの /etc/gdm3/Xsession
のようなものは存在しない.用意するつもりもなさそう
- (c) つまり (C1),(C2) は使えるが... GNOME セッションは Wayland
でも独自にログインシェルを起動するようになっているものの,Fedora
が困ったから無理やり付けたらしくあまり使ってほしくなさそうだし,全ログインシェルで呼ばれる /etc/profile.d/*.sh
にシェル自体と関係ないパッケージが置きたくない...(Ubuntu でも temporary だと書いてある)
- (d) つまり (D) は im-config パッケージでは使えない./usr/share/gdm/env.d/
で設定する場合,スクリプトが置けない,ユーザー毎・デスクトップセッション毎にも設定できない.また当然 gdm3 以外では使えない.なお現状
sddm の Wayland セッションにはパッケージで設定する機能がなさそう
- (e) つまり (E) は少なくとも im-config パッケージでは使えない.まず gdm3 では pam_env(7) で
user_readenv=1 を指定していないので使えない.sddm や Ubuntu の gdm3
は指定しているが,使う場合でもスクリプトは置けない.pam_env.so を基にした pam
モジュール作ればどんなロジックも書けるのかもしれないが,あまりに認証と無関係なモジュールでは...
- (f) つまり (F1),(F2) は使えるが... systemd --user の activation environment を使う場合,
-- 一番最初に実行されるため必ず設定するしかなく,その後にユーザーが (c)
などで設定しようとすると設定済みの変数すべてを漏れなく上書きまたは unset しなければならなくなる
-- Xorg ではこれを使わず今まで通り設定するようにしたかったが不可能.一番最初に実行されるため Wayland なのか Xorg
なのか区別ができないので,使うのなら Xorg であっても使わざるを得ない
-- gdm3 以外は対応していない
-- systemd --user に対応しない logind(現状 elogind,つまり sysvinit-core 上など)では使えない
-- これは単一デスクトップセッションの生存期間よりも長いので,同一ユーザーはログアウトしても以前の設定内容が残ったままのことがあるのかもしれない

という状況で,新デフォルトを使い物になるようにするには,問題点はいくつもあるが (F2) の (f) で設定 + .desktop で起動とするしかなさそう.
なお,新デフォルトでこのうちユーザーが自分のホームディレクトリ内で設定に使えるのは (f) の (F1) と,おそらく推奨されていない
(c) の (C1) のみ.

ここで起動については,少なくとも XDG Autostart 非対応のウィンドウマネージャがある以上,Xorg で .desktop
での起動を必須にすることはできない.つまり現実的には

- Wayland では .desktop で起動
- Xorg では /etc/X11/Xsession.d/* で起動

とするしかなさそう.なお,もともと同一シェル内でやっていた設定+起動を 何らかの方法での設定 + .desktop
での起動に分けると,他の方法(例 (F1))で設定済みだったので何もしなかった という情報(シェル変数 IM_CONFIG_PHASE が
1 でない)を .desktop
にきれいに伝えられない.環境変数にエクスポートしてしまえばとりあえず動くが,全アプリが汚染されてしまう.ファイルを作って伝える,D-Bus
activation での起動にするなどが考えられるがかなり大掛かり...
とりあえず環境変数にエクスポートしてしまうのが現実的(ちなみに Ubuntu は分けてないのになぜかエクスポートしたままにしているようで既に汚染されている模様)

また,設定については,Xorg, Wayland とも im-config パッケージは (F2) の
/usr/lib/systemd/user-environment-generators/* で設定するとして
特に Xorg のとき,他の方法で設定済みだったら(設定も起動も)何もしない
をどうやって実現するか(できる限り実現しておかないと,他の方法で別の IM を設定されても im-config
が自分の設定で起動してしまうことになる).ユーザーが

- (F1) で設定したものは((F2) の設定を 70-im-config など
30-systemd-environment-d-generator より後にくるようにしていれば)(F2)
の設定の時点で設定済みかわかるので (設定も起動も)何もしない が可能
- (C1) など (F2) の設定の時点より後で設定するものは,当然 (F2) の設定の時点で知ることは不可能なのでまずは必ず設定してしまうが,その後
-- Xorg では (A1) の /etc/X11/Xsession.d/70im-config_launch または im-launch
の時点で,まっさらな環境で /etc/X11/Xsession.d/70im-config_launch
を動かしたものと環境変数を比較すれば 設定に差分があったら起動はしない は可能
-- Wayland では (F2) の .desktop の時点で,まっさらな環境で
/etc/X11/Xsession.d/70im-config_launch を動かしたものと環境変数を比較すれば
設定に差分があったら起動はしない は可能

これによりユーザーの設定と別の IM を im-config が起動してしまうことは避けられる.
しかし,設定済みだったら を 設定に差分があったら にすると,im-config
の設定とユーザーが加えた設定結果が同じだったときは二重起動してしまうかもしれず,これは回避できないのでその場合は

- (A2),(A3),(B),(C1) のユーザーのシェルスクリプトや (F1) の カスタム.desktop
を見直してもらって起動しないようにしてもらう(im-config の自動起動だけ使うように寄せてもらう)
- im-config で none にしてもらう(ユーザーの設定+起動だけ使うように寄せてもらう)
- ローカルシステム管理者に im-config の (F2) を無効化(マスク)してもらう(ln -s /dev/null
/etc/systemd/user-environment-generators/70-im-config など).こうした場合
Wayland では何も自動設定+起動されなくなる(現状に戻る)
- ローカルシステム管理者に gdm3 をやめて lightdm などを使ってもらう.こうした場合 GNOME on Xorg
が使われることになる(GNOME Wayland は選択肢にあったとしても勝手に GNOME on Xorg が立ち上がる模様).ただし
sddm を使うと GNOME Wayland にログインできるが何も自動設定+起動されない

のいずれかくらいしかない

環境変数差分比較機能は im-launch に入れてみました

2) uim ツールバー

- Wayland ではウィンドウの位置を指定できない.コンポジター(GNOME シェル (mutter)
など)が頑張るのなら対応できる模様だが現状できない.GNOME は対応する気がなさそう
- Wayland ではウィンドウを常に最前面に表示が指定できない.コンポジターが頑張れば対応できる(実際 GNOME シェルでは
Alt+スペースメニューからウィンドウ個別には指定できる).GNOME は API を提供する気がなさそう
- GNOME Wayland の GNOME シェルでは GTK+ ウィンドウをタスクバーや Alt+Tab の一覧に載せない指定
(gtk_window_set_skip_taskbar_hint)
が無視される.現状対応する気はなさそう(https://bugzilla.gnome.org/show_bug.cgi?id=771329).この問題で困ってる他のアプリと一緒に対応を要求するしかないが,スプラッシュ画面とかで同様の問題らしいが正直どうでもいいので,もっと重要な機能で困ってるアプリがないか探す必要がある(メディアプレイヤーとか?)

これらの制限により,uim-toolbar-gtk* は Wayland だと

- ログインすると左上に起動する
- GNOME シェルのトップバーや Alt+Tab で uim-toolbar が表示され選択対象となる
- 入力対象アプリのウィンドウを最大化すると隠れる

なお,これらについては XWayland で起動する (env GDK_BACKEND=x11 uim-toolbar*) ことで回避できます

3) 対応案

とりあえず

Bug#877312 のうちデフォルトになってしまった GNOME Wayland + gdm3 には上記のようにとりあえず対処,他は放置.
Bug#654307 の GSettings の問題は放置.よって GNOME の場合,相変わらず ibus はインストールしただけでは
GNOME で設定するまで動かないようだが(デフォルトの task-korean-desktop 困ってないのかな?),uim
デフォルトであればデフォルトデスクトップはその影響を受けない.

-- 
YOSHINO Yoshihito <yy.y.ja.jp @ gmail.com>


debian-devel メーリングリストの案内