共通入力メソッド

Cim は Common Input Method(共通入力メソッド) の略です。

Linux および BSD 環境では、入力メソッドの仕組みが現在断片化されています。 アプリケーションや GUI ツールキットは XIM、Gtk-IM、Qt-IM、Wayland-IM など異なる標準に依存しており、そのため統合が複雑で一貫性に欠けます。

Cim は これらの異なる入力メソッドインターフェースを統合するために設計されたソフトウェア です。

Cim は入力メソッドを特定の GUI ツールキットに結び付けるのではなく、アプリケーションやフレームワークが一貫した方法で入力メソッドを利用できる ツールキット非依存の C API を提供します。

Cim の公開インターフェースは、cim.h で定義された 安定した C ABI を中心に設計されています。そのため、次のようなさまざまな環境で同じ入力メソッド境界を利用できます。

  • GUI ツールキット
  • ターミナルアプリケーション
  • コンソールプログラム
  • サンドボックス環境のアプリケーション
  • さまざまなプログラミング言語で書かれたソフトウェア

このため Cim は 多様な環境におけるテキスト入力の共通基盤 として利用できます。

アーキテクチャ

Cim は プラグインアーキテクチャ を採用しています。

アプリケーションは次のいずれかの形式の公開 Cim API ライブラリを利用できます。

libcim.a
libcim.so

libcim.a は位置独立な static-pic 形式で、共有モジュールへ組み込むことができます。libcim.so は再配置可能(relocatable)な共有ライブラリ形式です。 非 PIC の静的ライブラリはサポートされません。

実際の入力メソッド実装は プラグインモジュール によって提供されます。

次のパスは、プラグインの配置方法を示す です。現在の公開リポジトリが、ここに挙げたすべてのプラグインを実装または配布していることを意味するものではありません。

/usr/lib/input.d/im-sample.so
/usr/lib/input.d/im-nimf.so
/usr/lib/input.d/im-ibus.so
/usr/lib/input.d/im-uim.so
/usr/lib/input.d/im-fcitx.so

現在の公開ツリーには、ネイティブのサンプルプラグインとして im-libhangul.so が含まれています。

各プラグインは cim.h で定義された Cim 入力コンテキスト API を実装します。

プラグインはさまざまな方法で実装できます。

  • ネイティブエンジンプラグイン 完全な IME エンジンを直接実装する方式です。

  • フレームワークブリッジプラグイン ibus や fcitx など既存の入力メソッドフレームワークと Cim を接続する方式です。

  • サービスベースプラグイン デーモンや外部サービスと通信する方式です。

実装方法に関係なく、すべてのプラグインは cim_plugin という小さなディスクリプタを公開し、 その中で入力コンテキストの生成と管理方法を示す CimIcVTable を提供します。

現在の公開 ABI バージョンは 2.1.1 です。プラグインは cim_plugin に Cim API のバージョンを記録し、major バージョンに互換性がない場合、Cim はそのプラグインを拒否します。 CimIcVTablecreatedestroy は必須です。プラグインの initfini コールバックは任意であり、提供される場合は、成功した各ホスト接続(host attachment)の初期化に対応する終了処理が 1 回行われます。

アクティブなプラグインの選択

アクティブなプラグインは次のシンボリックリンクによって選択されます。

~/.config/cim/plugin

このリンクは使用するプラグインモジュールを指します。

例:

mkdir -p ~/.config/cim
ln -sf /usr/lib/input.d/im-sample.so ~/.config/cim/plugin

たとえば fcitx ブリッジプラグイン が実装され、次のパスにインストールされている場合は、このように選択できます。これは使用例であり、現在の公開リポジトリが im-fcitx.so を提供していることを意味しません。

ln -sf /usr/lib/input.d/im-fcitx.so ~/.config/cim/plugin

この仕組みは、アプリケーションの起動環境によっては常に存在するとは限らない環境変数への依存を避けられます。 また、GUI 設定ツールも作りやすくなります。

テストや管理された配布環境では、CIM_PLUGIN 環境変数に絶対パスを指定して、このシンボリックリンクを一時的に上書きできます。

Cim の利用

設定が完了すると、アプリケーションや GUI ツールキットは単に Cim API を呼び出すだけでよくなります。

最初の CimIcHandle(入力コンテキスト)が生成されると、Cim ランタイムは選択されたプラグインをロードし、ホスト接続(host attachment)を初期化して、入力メソッドの処理をそのプラグインへ委譲します。

1 つのホスト接続(host attachment)内で複数の入力コンテキストを生成できます。最後のコンテキストが破棄されると、Cim はそのホスト接続を終了し、プラグインをアンロードします。

この設計により、ランタイムを軽量に保ちながら柔軟なプラグイン実装が可能になります。

既存ツールキットとの統合

ディスプレイサーバーや GUI ツールキットが Cim を直接採用していなくても、ブリッジモジュールを使って統合できます。

次は、ツールキットや入力システムとの統合で使用する 環境変数の例 です。現在の公開ツリーには GTK 3 および Qt 6 ブリッジが実装されています。XIM の設定は、将来または外部での統合例を示しています。

QT_IM_MODULE="cim"
GTK_IM_MODULE="cim"
XMODIFIERS="@im=cim"

次は、ブリッジモジュールを配置できる インストールパスの例 です。現在の公開ツリーで実際に実装されているブリッジは GTK 3 と Qt 6 です。 GTK 2、GTK 4、Qt 5 のパスは拡張例であり、現在実装されていることを意味しません。

/usr/local/lib/gtk-4.0/4.0.0/immodules/libim-cim-gtk4.so
/usr/local/lib/gtk-2.0/2.10.0/immodules/im-cim-gtk2.so
/usr/local/lib/gtk-3.0/3.0.0/immodules/im-cim-gtk3.so
/usr/local/lib/qt5/plugins/platforminputcontexts/libqt5im-cim.so
/usr/local/lib/qt6/plugins/platforminputcontexts/libqt6im-cim.so

これらのブリッジにより、既存のアプリケーションを修正することなく Cim を利用できます。

デフォルトの static-pic 構成では、現在の GTK 3 および Qt 6 ブリッジモジュールは libcim.a を組み込み、組み込まれた Cim ランタイムのシンボルを周囲のプロセスから非公開に保ちます。

デーモンベースの入力システム

XIMWayland 入力メソッド のような一部の入力システムでは、プロセス間通信が必要です。

このような環境では、Cim は次のようなデーモン形式のアーキテクチャを利用できます。ただし、以下の cimd バイナリとデーモンプラグインのパスは アーキテクチャ上の例であり、現在の公開ツリーには実装されていません

/usr/local/bin/cimd

デーモンプラグインの例:

/usr/local/lib/cimd/plugins/cim-xim.so
/usr/local/lib/cimd/plugins/cim-wayland.so

これらのコンポーネントを実装した場合、XIM または Wayland の入力イベントを Cim API 呼び出しへ変換できます。

入力メソッド開発者にとっての利点

Cim は IME 開発者の統合作業の負担を大きく軽減します。

従来、入力メソッドは次の環境ごとに個別のモジュールを実装する必要がありました。

  • Gtk-IM
  • Qt-IM
  • XIM
  • Wayland-IM

Cim では、Cim 入力コンテキスト API を共通の境界として使い、環境固有の統合層から同じ入力メソッド実装を再利用できるように設計されています。 現在の公開ツリーには GTK 3 および Qt 6 ブリッジが実装されていますが、GTK 2、GTK 4、Qt 5、XIM、Wayland の統合がすべて実装されているわけではありません。

もう一つの重要な利点は、低摩擦な統合(low-friction integration) です。

libhangul、librime、libanthy、libpinyin のような多くの IME ライブラリは、すでに中核となる入力ロジックを提供しています。 このような場合、既存の機能を CimIcVTable を通じて公開する 小さな適応層 だけで Cim プラグインを実装できます。

upstream プロジェクトが Cim サポートを直接取り込まない場合でも、比較的少ないコードで 独立したブリッジプラグイン を外部実装できます。

この柔軟性により、Cim は大きなアーキテクチャ変更を行うことなく既存の入力メソッドエコシステムに統合できます。

まとめ

Cim は次を提供します。

  • ツールキット非依存の入力メソッド API
  • シンプルなプラグインアーキテクチャ
  • バージョンが明示された安定した C ABI
  • 既存 IME 実装に対する低い統合コスト
  • ブリッジモジュールを通じて既存の入力メソッドフレームワークと互換性を持たせるためのアーキテクチャ
    • 現在の公開ツリーには GTK 3 および Qt 6 ブリッジが実装されています。
    • その他のブリッジやデーモンベースの統合は、まだすべて実装されているわけではありません。

入力メソッド API を GUI ツールキットやディスプレイサーバーから分離することで、Cim は Linux および BSD 環境において、より一貫性があり移植性の高いテキスト入力環境を実現します。

Cim 技術サポート / 1年

24時間365日メールサポート $ 30

ダウンロード

Cim はソースコード形式で配布されます。

最新のソースコード — GitHub 公開リポジトリ