Qt5.5 で uim を使う

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

## 3 行で

 - Qt5 対応版が欲しかったため、 GitHub から uim のソースを持ってきた。
 - ビルドしても動いてくれなかった[^1]。
 - 修正してみた。 ([私的リポジトリ](https://github.com/yoh2/uim/tree/fix-qt5-iid))

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

## はじめに

私は、デスクトップ環境として [KDE](https://www.kde.org/) を利用しており、日本語入力には [uim](https://github.com/uim/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_MODULE` を `uim` に設定して Qt5 プログラムを立ち上げれば uim が使えるようになっているはずですが、 Shift-Space ……スカ。あれ？ キー間違えたかなと思いつつ Control-Space ……スカ。全く有効になってくれません。 GTK2 プログラムなんかは全く問題なく uim が使えています[^2]。

[^2]: もちろん `GTK_IM_MODULE=uim` した状態で。

## 原因と対策

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

[Qt5 doesn't load plugin #6](https://github.com/fcitx/fcitx-qt5/issues/6)

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

```diff
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:
```

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

![uim-qt5.png](https://qiita-image-store.s3.amazonaws.com/0/108915/7fa74779-bf70-e8ac-da1a-209905d67a33.png)

私的リポジトリに[修正後のソース](https://github.com/yoh2/uim/tree/fix-qt5-iid)を置いてみました。


## その他の問題

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

## PR しないの？

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