Common input method
Cim stands for Common input method.
Input methods in Linux and BSD environments are currently fragmented. There are numerous standards such as XIM, Gtk-IM, Qt-IM, and Wayland-IM.
Cim is software designed to integrate these disparate input methods.
Historically, Gtk and Qt input methods have operated as plugins, a proven approach that has worked reliably for decades. However, because these modules depend on Gtk and Qt respectively, they cannot be used by X-only, Java, Wayland-only, or console-only applications.
Cim solves this by providing a common input method via a C API, removing the dependency on specific GUI toolkits like Gtk. Because Cim is built with a pure C API and has no heavy dependencies, it can be utilized by various programming languages and applications.
How it works
cim.h contains the necessary interfaces and type definitions.
- Location of Plugins
Input method plugins that implement the Cim input context API should be placed as follows:
/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
- Symbolic Link Configuration
It is recommended to select input plugins via a symbolic link rather than environment variables. Environment variables may not always be set depending on the startup context. Additionally, the symbolic link approach simplifies the creation of configuration tools.
~/.config/cim.so acts as a symbolic link pointing to the active input method plugin (e.g., ibus, fcitx, nimf, uim).
ln -sf /usr/lib/input.d/im-sample.so ~/.config/cim.so
- Usage
Once configured, when an application or GUI toolkit calls the Cim input context API, the input method operates transparently.
To switch the input method to fcitx, simply update the symbolic link:
ln -sf /usr/lib/input.d/im-fcitx.so ~/.config/cim.so
This architecture allows XIM, GTK-IM, QT-IM, and Wayland-IM to be replaced and integrated. Furthermore, this approach addresses input issues in sandboxed environments like Snap or Flatpak. If applications or toolkits support the Cim API, they can easily access the input method via $HOME/.config/cim.so.
Integration is Practically Possible
Even if display servers (Wayland) or GUI toolkits (Gtk, Qt) do not natively adopt Cim, input methods can still be integrated using bridge modules that implement Cim.
To use Cim in this manner, set the following environment variables:
QT_IM_MODULE="cim"
GTK_IM_MODULE="cim"
XMODIFIERS="@im=cim"
The following bridge plugins allow third-party input methods (nimf, ibus, fcitx, uim) to be called via ~/.config/cim.so:
/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
Since XIM and Wayland-IM require inter-process communication, a daemon (cimd) is required. cimd loads cim-xim.so and cim-wayland.so, which in turn call the Cim input context API.
/usr/local/bin/cimd
/usr/local/lib/cimd/plugins/cim-xim.so
/usr/local/lib/cimd/plugins/cim-wayland.so
This setup makes integration technically feasible today. Note that while Flatpak and Snap applications can use input methods via ~/.config/cim.so, strict sandboxing policies may require contacting Flatpak or Snap developers if access issues arise.
Benefits for Input Tool Developers
Assuming the Cim ecosystem (plugins and daemon) is in place, input tool (IME) developers no longer need to implement separate modules for Gtk-IM, Qt-IM, XIM, and Wayland-IM. simply implementing the Cim input context API enables text input across Gtk, Qt, X, and Wayland applications.
Technical Support for Cim / 1 year
Download
Cim is distributed as source code.
cim-2.0.0-2025.12.07.tar.bz2
cim-1.0.0-2024.01.25.tar.bz2
cim-0.0.1-2023.08.02.tar.bz2
cim-0.0-20230610.tar.bz2