Alacritty:KoreanImeOrder
X11 에서 ibus-hangul 두벌식으로 입력할 때 글자 순서가 뒤바뀌는 문제 해결 방법
개요
Alacritty(X11)에서 ibus-hangul 두벌식으로 입력할 때 글자 순서가 뒤바뀌는 문제를 조사한 기록이다. (조사일: 2026-10-23)
결론: 아직 해결되지 않았다. Alacritty 최신 안정판 0.17.0과 master(54214706) 모두 winit 0.30.13을 쓰며, 원인으로 확인된 winit 이슈 #4777은 열려 있고 수정 PR도 없다.
환경
| 항목 | 버전 |
| OS | Ubuntu 24.04.5 LTS, X11 세션 |
| Alacritty | 0.16.1 (설치본), master |
| winit | 0.30.12 (0.16.1), 0.30.13 (0.17.0, master) |
| 입력기 | ibus 1.5.29 + ibus-hangul 1.5.5, XIM 연결 ( |
| libX11 | 1.8.7 |
증상
조합 중인 글자는 밑줄 커서로, 조합이 끝난 글자는 네모(블록) 커서로 표시된다.
- Space가 조합 중인 글자 앞에 붙는다.
-
조합이 완료되지 않았음에도 불구하고→조합 이완료되 지않았음에도 불구하 고 -
같다.→같.다,이미→이 미
-
-
조합완료→조완합 료 -
이상하게→이하상게
재현
사용자 데스크톱과 분리된 환경에서 재현했다.
- 가상 X 서버(Xvfb), 별도 D-Bus 세션, 별도 ibus-daemon(
--xim)을 띄웠다. - ibus-hangul은 GSettings keyfile 백엔드로 격리해 한글 모드로 시작했다.
- ibus, ibus-hangul, libX11 버전은 사용자 시스템과 같다.
- Alacritty에서
stty raw -echo; cat > out.txt를 실행하고,xdotool로 두벌식 키를 입력한 뒤 실제로 받은 바이트를 비교했다. - 이벤트 순서는
alacritty --print-events로 기록했다.
재현된 결과:
-
조합 이완료되지 않았음에도…,…불구하 고,조합완 료: Space가 조합 글자 앞에 붙음 -
조합완료잇 ㅏㅇ하게,조합완료이 상하 게: 조합이 중간에 끊기고 뒤 키가 먼저 처리됨
이벤트 로그
조합 중에 Space를 누르면 ibus-hangul은 조합 글자를 확정(commit)하고, Space는 처리하지 않은 키로 XIM을 통해 앱에 되돌려 보낸다(forward).
정상
Ime(Preedit("", None))
Ime(Commit("지"))
KeyboardInput { logical_key: Named(Space), text: Some(" "), state: Pressed }
실패
Ime(Preedit("이", Some((3, 3))))
Ime(Preedit("", Some((0, 0))))
Ime(Preedit("", None))
KeyboardInput { logical_key: Named(Space), text: Some(" "), state: Pressed }
Ime(Preedit("", None))
Ime(Commit("이"))
조합 글자가 먼저 지워지고(Preedit(""), 이때 밑줄 커서가 네모 커서로 바뀜), Space가 먼저 도착한 뒤 확정 글자가 늦게 들어온다.
조합이 끊기는 경우에는 Space가 입력기에 늦게 다시 들어가서, 입력기가 ㅇ ㅣ ㅅ을 먼저 처리한 뒤 Space를 받는다.
Ime(Commit("료"))
Ime(Preedit("이", Some((3, 3))))
Ime(Preedit("잇", Some((3, 3))))
Ime(Commit("잇"))
KeyboardInput { logical_key: Named(Space), ... }
Ime(Preedit("ㅏ", Some((3, 3))))
Ime(Commit("ㅏ"))
원인 확인 실험
IME 위치 갱신(set_ime_cursor_area)만 켜고 끄는 비교 빌드를 만들어 같은 입력을 반복했다. "ibus가 잠깐 멈추는 상황"은 테스트용 ibus-x11을 SIGSTOP/SIGCONT로 짧게 멈췄다 재개시켜, 밀린 키를 몰아서 처리하는 부하 상황을 흉내 낸 것이다.
| 조건 | 일반 입력 | ibus가 잠깐 멈추는 상황 |
| 원래 동작 (IME 위치 갱신 켬) | 20회 중 7회 실패 | 9회 중 5회 실패 |
| IME 위치 갱신만 끔 | 20회 중 0회 | 9회 중 0회 |
| 원래 동작 + libX11 1.8.12 | 12회 중 7회 실패 | |
IME 위치 갱신 하나로 증상이 생기고 사라진다.
원인
- Alacritty는 화면을 그릴 때마다 커서 위치를 IME에 알린다.
-
alacritty/src/display/mod.rs:1141,alacritty/src/display/mod.rs:1215 -
alacritty/src/display/window.rs:450(update_ime_position→set_ime_cursor_area)
-
- winit은 이 요청을 다음 X 이벤트 처리 직후
XSetICValues로 보내고, 입력기 응답을 동기적으로 기다린다.-
winit-0.30.13/src/platform_impl/linux/x11/event_processor.rs:87(IME 요청 처리 루프) -
winit-0.30.13/src/platform_impl/linux/x11/ime/context.rs:368(XSetICValues)
-
- 터미널은 한 글자마다 커서가 움직이므로 타이핑할 때마다 이 대기가 생긴다. winit은 같은 위치면 생략하지만, 위치가 매번 바뀌어서 효과가 없다.
- 대기 중에 도착한 확정 문자열(
XIM_COMMIT)과 되돌려 보낸 키(XIM_FORWARD_EVENT)를 libX11이 각각XPutBackEvent로 이벤트 큐 맨 앞에 끼운다. 그래서 순서가 뒤집히거나 키가 입력기로 늦게 다시 들어간다.
4번의 libX11 내부 경로는 소스(modules/im/ximcp/imDefLkup.c)를 읽고 추론한 것이다. "IME 위치 갱신이 원인"이라는 점은 위 실험으로 확인했다. 이 메커니즘은 winit #4777(베트남어 fcitx5 사례로 보고됨)과 같다.
이미 해결된 관련 문제 (이번 증상과는 별개)
- ibus: XIM 키 순서 수정 client/x11: Fix Key typing order은 ibus 1.5.29에 포함되어 있다. 이 버전에서도 증상이 나므로 원인이 아니다.
- ibus-hangul: 조합 중 Space 순서 문제(#42, ibus #1847)는 forward_key_event 방식으로 우회되어 있다. 이번 문제는 그 forward된 키가 클라이언트(winit/libX11) 쪽에서 뒤섞이는 것이다.
- GNOME Wayland: GNOME 45 mutter의 한글·공백 순서 문제(ibus-hangul #118)는 mutter MR 3536으로 수정되었다. X11 + Alacritty와는 경로가 다르다.
- libX11: 빠른 입력 시 XIM 키 순서가 뒤섞이는 문제(libX11 #198, MR 246)는 1.8.10에서 수정되었다. Ubuntu 24.04는 1.8.7이지만, 1.8.12를 빌드해 Alacritty에만 적용해도 증상이 그대로였다. libX11 업그레이드로는 해결되지 않는다.
수정 현황
| 대상 | 상태 |
| winit #4777 | 열림, 댓글 0개, 관련 PR 없음 (2026-10-19 등록) |
| winit master | 관련 수정 없음 (2026-10-21 커밋까지 확인) |
| Alacritty 0.17.0 | winit 0.30.13 사용, 변경 내역에 관련 수정 없음 |
| Alacritty master | 직접 빌드해 재현됨 |
근본 수정은 winit 쪽에서 해야 한다. #4777에 제안된 방향은 처리할 X 이벤트가 남아 있지 않을 때(XPending = 0)만 IME 위치 요청을 보내는 것이다.
우회 방법
IME 위치 갱신 끄기 (재현 환경에서 효과 확인)
Alacritty를 아래처럼 고쳐 빌드하면, 환경 변수를 줬을 때만 IME 위치 갱신을 건너뛴다. 조합 글자는 Alacritty가 직접 그리므로 잃는 것은 사실상 한자 변환 후보창 위치뿐이다.
// alacritty/src/display/window.rs
pub fn update_ime_position(&self, point: Point<usize>, size: &SizeInfo) {
if std::env::var_os("ALACRITTY_NO_IME_SPOT").is_some() {
return;
}
// ...
}
조사 중에 만든 비교 빌드는 임시 경로(/tmp/claude-1000/-home-zer0-Projects-alacritty/fcd0ab99-44d7-4831-87d3-1923a4bc58c3/scratchpad/alacritty-nospot/target/release/alacritty)에 있으며, 나중에 지워질 수 있다.
기타 (효과 미검증)
- Wayland 세션 사용: winit이 XIM 대신 text-input 프로토콜을 쓰므로 이 경로를 피할 수 있다.
- GTK 터미널 사용: gnome-terminal 등은 XIM을 거치지 않고 ibus 모듈을 직접 쓴다.
-
IBUS_ENABLE_SYNC_MODE=0으로 ibus 재시작: 예전 XIM 순서 문제의 해결책이었지만 Java 앱이 멈출 수 있고, 이번 문제에 통할지는 확실하지 않다.
See also
Favorite site
- winit #4777 – X11/XIM: moving the IME cursor area while an input method forwards keys garbles text
- libX11 MR 246 – XIM 키 순서 수정 (#198)
- ibus 497f0c7 – client/x11: Fix Key typing order
- ibus #1847 – korean: emitting a space in an incorrect order with X11 applications
- ibus-hangul #42 – 한글과 스페이스 순서가 바뀌는 문제
- ibus-hangul #118 – GNOME 45 Wayland 순서 문제
- Alacritty CHANGELOG