공통 입력 방식

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는 선택 사항이며, 제공되는 경우 성공한 initfini는 호스트 연결(host attachment) 단위로 균형을 이룹니다.

활성 플러그인 선택

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

~/.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

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

테스트나 통제된 배포 환경에서는 CIM_PLUGIN 환경 변수에 절대 경로를 지정하여 심볼릭 링크를 일시적으로 덮어쓸 수 있습니다.

Cim 사용하기

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

첫 번째 CimIcHandle(입력 컨텍스트)이 생성되면 Cim 런타임은 선택된 플러그인을 로드하고 호스트 연결(host attachment)을 초기화한 뒤 입력기 작업을 해당 플러그인에 위임합니다.

하나의 호스트 연결(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 런타임의 심볼은 주변 프로세스로 노출하지 않습니다.

데몬 기반 입력 시스템

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

이러한 환경에서는 다음과 같은 데몬 구조를 사용할 수 있습니다. 다만 아래 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년

연중무휴 이메일 지원 $ 30

다운로드

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

최신 소스 코드 — GitHub 공개 저장소