공통 입력 방식

Cim은 Common Input Method의 약자이다.

Linux 및 BSD 환경에서 입력기 시스템은 현재 분열되어 있다. 애플리케이션과 GUI 툴킷은 XIM, Gtk-IM, Qt-IM, Wayland-IM과 같은 서로 다른 표준에 의존하고 있으며, 이로 인해 통합이 복잡하고 일관성이 떨어진다.

Cim은 이러한 서로 다른 입력기 인터페이스를 통합하기 위해 설계된 소프트웨어이다.

Cim은 특정 GUI 툴킷에 입력기를 묶는 대신, 애플리케이션과 프레임워크가 일관된 방식으로 입력기를 사용할 수 있도록 툴킷 독립적인 C API를 제공한다.

Cim은 최소한의 의존성을 가진 작은 C 라이브러리로 구현되어 있기 때문에 다음과 같은 다양한 환경에서 사용할 수 있다.

  • GUI 툴킷
  • 터미널 애플리케이션
  • 콘솔 프로그램
  • 샌드박스 환경의 애플리케이션
  • 다양한 프로그래밍 언어로 작성된 소프트웨어

이러한 특징 덕분에 Cim은 다양한 환경에서 텍스트 입력을 위한 공통 기반이 될 수 있다.

아키텍처

Cim은 플러그인 아키텍처를 사용한다.

애플리케이션은 다음과 같은 공개 Cim API 라이브러리에 링크한다.

libcim.so

실제 입력기 구현은 플러그인 모듈에서 제공된다.

/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

각 플러그인은 cim.h에 정의된 Cim 입력 컨텍스트 API를 구현한다.

플러그인은 여러 방식으로 구현될 수 있다.

  • 네이티브 엔진 플러그인 완전한 IME 엔진을 직접 구현하는 방식

  • 프레임워크 브리지 플러그인 ibus나 fcitx 같은 기존 입력기 프레임워크와 Cim을 연결하는 방식

  • 서비스 기반 플러그인 데몬 또는 외부 서비스와 통신하는 방식

구현 방식과 관계없이 모든 플러그인은 cim_plugin이라는 작은 디스크립터를 제공하며, 여기에는 입력 컨텍스트 생성과 관리를 설명하는 CimIcVTable이 포함된다.

활성 플러그인 선택

활성 플러그인은 다음 심볼릭 링크를 통해 선택된다.

~/.config/cim/plugin

이 링크는 사용할 플러그인 모듈을 가리킨다.

예시:

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

fcitx로 변경하려면 다음과 같이 하면 된다.

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

이 방식은 애플리케이션 실행 환경에 따라 항상 존재하지 않을 수 있는 환경 변수에 의존하지 않기 때문에 더 안정적이다. 또한 그래픽 설정 도구를 구현하기에도 더 용이하다.

Cim 사용하기

설정이 완료되면 애플리케이션이나 GUI 툴킷은 단순히 Cim API를 호출하면 된다.

CimIcHandle(입력 컨텍스트)이 생성되면 libcim.so는 선택된 플러그인을 로드하고 모든 작업을 해당 플러그인에 위임한다.

하나의 플러그인 인스턴스에서 여러 입력 컨텍스트를 생성할 수 있으며, 마지막 컨텍스트가 제거되면 플러그인 모듈은 자동으로 언로드된다.

이 설계는 런타임을 가볍게 유지하면서도 다양한 플러그인 구현을 가능하게 한다.

기존 툴킷과의 통합

디스플레이 서버나 GUI 툴킷이 Cim을 직접 지원하지 않더라도 브리지 모듈을 통해 통합할 수 있다.

일반적인 환경 변수:

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

예시 브리지 모듈:

/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을 사용할 수 있다.

데몬 기반 입력 시스템

XIM이나 Wayland 입력기와 같은 일부 시스템은 프로세스 간 통신을 필요로 한다.

이러한 환경에서는 Cim이 데몬을 사용할 수 있다.

/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를 한 번 구현하는 것만으로 이 모든 환경을 지원할 수 있다.

또 다른 중요한 장점은 낮은 통합 비용(low-friction integration)이다.

libhangul, librime, libanthy, libpinyin 같은 많은 IME 라이브러리는 이미 핵심 입력 로직을 제공하고 있다. 이러한 경우 기존 기능을 CimIcVTable을 통해 노출하는 작은 적응 계층만으로 Cim 플러그인을 구현할 수 있다.

upstream 프로젝트가 Cim 지원을 직접 추가하지 않더라도, 비교적 적은 코드로 독립적인 브리지 플러그인을 구현할 수 있다.

이러한 유연성 덕분에 Cim은 기존 입력기 생태계와 큰 구조 변경 없이 통합될 수 있다.

요약

Cim은 다음을 제공한다.

  • 툴킷 독립적인 입력기 API
  • 단순한 플러그인 아키텍처
  • 기존 IME 구현을 위한 낮은 통합 비용
  • 브리지 모듈을 통한 기존 입력기 프레임워크와의 호환성

입력기 API를 GUI 툴킷과 디스플레이 서버로부터 분리함으로써 Cim은 Linux 및 BSD 환경에서 보다 일관되고 이식성 있는 텍스트 입력 환경을 가능하게 한다.

Cim 기술 지원 / 1년

연중무휴 이메일 지원 $ 30

다운로드

Cim은 소스 코드 형태로 배포됩니다.

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