Linux IME 연동

IBus, Fcitx 연동 구조, preedit·commit 전달, 브라우저가 composition으로 넘기는 방식

Linux에서 IME는 IBus 또는 Fcitx 같은 입력기 프레임워크를 통해 앱에 preedit·commit을 전달한다. 웹 에디터는 브라우저가 이 정보를 CompositionEvent로 변환하므로, 대부분 composition 이벤트만 처리하면 된다. Linux 전용 IME를 만들거나 composition이 다르게 오는 퀴크를 파악할 때 아래 구조를 참고한다.


1. IBus

1.1 구조

  • IBusD-Bus 기반 입력기 프레임워크다. 입력기 엔진(한글: ibus-hangul, 일본어: ibus-mozc 등)이 조합을 수행하고, IBus 데몬이 **앱(클라이언트)**과 엔진 사이에서 preedit·commit을 중개한다.
  • **앱(툴킷)**은 IBusInputContext를 통해 CommitText, UpdatePreeditText 등 시그널을 받는다. preedit은 문자열·속성(밑줄 등)·커서 위치로 전달된다.

1.2 브라우저

  • Chromium: Linux에서 IBus 또는 Fcitx를 사용한다. 툴킷(GTK 등) 또는 자체 브릿지로 preedit·commit을 받아 CompositionEvent(compositionstart / compositionupdate / compositionend)로 페이지에 전달한다.
  • Firefox: 마찬가지로 IBus/Fcitx와 연동해 composition 이벤트를 생성한다.
  • 결과: 웹 페이지에서는 OS별 차이가 브라우저가 흡수되므로, composition 3종 + insertText 처리만 하면 Linux에서도 동작한다. 다만 composition이 발생하지 않고 insertText만 오는 조합(특정 엔진·설정)이 있을 수 있으므로, composition 시나리오별 처리 규칙의 “composition 없이 insertText만 오는 경우” 대응이 필요하다.

2. Fcitx / Fcitx 5

2.1 구조

  • FcitxInputContext 단위로 preedit·commit을 앱에 전달한다. Fcitx 5에서는 fcitx-hangul 등 엔진이 libhangul로 조합을 수행하고, InputContextCommitString, UpdatePreedit 등 콜백으로 앱에 넘긴다.
  • X11Wayland 모두 지원한다. Wayland에서는 text-input 프로토콜 등으로 IME와 클라이언트가 통신할 수 있다.

2.2 브라우저

  • Chromium·Firefox는 Fcitx를 지원한다. preedit·commit을 받아 CompositionEvent로 변환. 웹 개발자 입장에서는 IBus와 동일하게 composition 이벤트만 처리하면 된다.

3. XIM (레거시)

  • **XIM (X Input Method)**는 X11 시대의 입력기 프로토콜이다. 키 이벤트를 IME에 넘기고, preedit·commit 문자열을 받는 방식. 현재 대부분의 데스크톱 환경은 IBus 또는 Fcitx를 쓰며, XIM은 레거시 앱용으로만 남아 있다.
  • 웹 브라우저는 XIM을 직접 쓰지 않고 IBus/Fcitx 경로를 사용한다.

4. 에디터 구현자 관점

  • : Linux에서 composition 이벤트Windows/macOS와 동일한 순서로 오는지 여부는 브라우저 구현에 따른다. composition 없이 insertText만 오는 엔진·설정이 있으면 트러블슈팅의 “composition 없이 insertText” 대응으로 처리한다.
  • 네이티브 앱: GTK는 GtkIMContext(IBus 연동), Qt는 QPlatformInputContext로 IBus/Fcitx와 연동한다. 각 툴킷 문서 참고.
  • 참고: IME 구현 상세 §4에도 Linux 요약이 있다.

5. 참고 링크