Qt5.5 で uim を使う


PR が早速取り込まれましたので、この記事に書いたパッチが不要になりました。
素直にオリジナルのリポジトリの master をクローンし、以下の「基本のビルド方法」を実行するだけで素直に動きます。
PRからマージまで20分。早。(;゜Д゜)

3 行で

  • Qt5 対応版が欲しかったため、 GitHub から uim のソースを持ってきた。
  • ビルドしても動いてくれなかった1
  • 修正してみた。 (私的リポジトリ)

はじめに

私は、デスクトップ環境として KDE を利用しており、日本語入力には uim を利用しています。
先日、そろそろ KDE4 のサポート切るよ、とのアナウンスがあったため、 KDE5 Plasma への移行を開始しました。
しかし、残念ながら Gentoo の portage ツリーに含まれている uim (app-i18n/uim) は Qt5 に対応していません。
そこで、GitHub からクローンしてきた uim をビルドしようとしたのですが、うまく動いてくれません。
いろいろと試行錯誤し、何とか動くものがつくれたので記事を書いてみました。

自環境

  • ディストリビューション: Gentoo Linux
  • アーキテクチャ: amd64
  • Qt: 5.5.1-r1
  • gcc: 4.9.3
  • ベースにした uim のリビジョン: 8e5a01085785d294cb93c892b613e8c48baa6c2a

基本のビルド方法

  1. git clone する。
  2. ./make-wc.sh する。引数は ./configure に渡すものと同じで OK。追加のソースを取得するので、インターネット接続ができるようにしておくこと。
  3. make する。
  4. make install する。(もちろんスーパーユーザーで)

実行例:
wake-wc.sh の引数がやたらと長くなっていますが、これは好みの設定をいろいろと行っているため。
キモは --with-qt5--with-qt5-immodule を指定することです。

$ git clone https://github.com/uim/uim
  ...
$ ./make-wc.sh --prefix=/usr --enable-default-toolkit=qt5 --with-qt5 --with-qt5-immodule --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --sysconfdir=/etc --localstatedir=/var/lib --without-qt4 --without-qt4-immodule --disable-qt4-qt3support --with-skk --enable-openssl   --with-anthy-utf8 --enable-notify=libnotify
  ...
$ make
  ...
$ sudo make install
  ...

インストールできたけど動かない!

無事ビルド・インストールできたら、 libuimplatforminputcontextplugin.so という名前のファイルが所定のディレクトリ内に格納されているはずです。(自環境では、 /usr/lib64/qt5/plugins/platforminputcontexts/libuimplatforminputcontextplugin.so)
さて、この状態で、環境変数 QT_IM_MODULEuim に設定して Qt5 プログラムを立ち上げれば uim が使えるようになっているはずですが、 Shift-Space ……スカ。あれ? キー間違えたかなと思いつつ Control-Space ……スカ。全く有効になってくれません。 GTK2 プログラムなんかは全く問題なく uim が使えています2

原因と対策

以下と全く同じ現象のようでした。

Qt5 doesn't load plugin #6

というわけでパッチ。注釈に書いた1通り、他にもちょろちょろ変えていたのですが、ベースリビジョンを変更したら一行パッチになってしまいました。

diff --git a/qt4/immodule/plugin.h b/qt4/immodule/plugin.h
index 4b097ed..66ad880 100644
--- a/qt4/immodule/plugin.h
+++ b/qt4/immodule/plugin.h
@@ -54,7 +54,7 @@ class UimInputContextPlugin : public QPlatformInputContextPlugin
     Q_OBJECT
 #if QT_VERSION >= 0x050000
     Q_PLUGIN_METADATA(IID
-        "org.qt-project.Qt.QPlatformInputContextFactoryInterface"
+        QPlatformInputContextFactoryInterface_iid
         FILE "../../qt5/immodule/uim.json")
 #endif
 public:

これを行い、再度 makemake install を行うと無事 Qt5 プログラムで uim が使えるようになりました。

私的リポジトリに修正後のソースを置いてみました。

その他の問題

  • 何だか uim-helper-server が暴走気味です。Chromium が固まったりします。 uim-helper-server を kill すれば治ります。
  • uim-toolbar-qt5 の 設定ボタンを押すと uim-pref-qt4 を起動しようとしているのには気付いていますが直していません。
  • uim-candwin-qt5 さん……

PR しないの?

出してみました
Qt5 で動かすのを最優先にしているため、この変更で他ビルド (特に Qt4) がどのように影響を受けるか分かっていないので、もうちょっと整理できるまでするつもりはないです……と書こうとしたのですが、気付くと一行パッチに。これは PR すべきか……


  1. 実は、作業を始めた頃にはビルドも通らずあれこれ変更していたのですが、その後、この記事を書くために最新版を pull してきたらビルドが素直に通るようになっていたので、問題はこれだけになりました。 

  2. もちろん GTK_IM_MODULE=uim した状態で。