0008 입력기를 바꾸면 키보드 그룹이 0으로 남음

From 카카오톡 on Wine
Jump to navigationJump to search

입력창에 포커스를 둔 채로 한글 입력기로 바꾸면 그때부터 한글이 들어가지 않다가, 다른 곳을 한 번 클릭했다 입력창을 다시 누르면 그제야 됐습니다.

Wayland 단은 멀쩡해서, 추적에는 조합이 그대로 찍혀 있습니다.

text_input_preedit_string text "\xe3\x85\x87"   (ㅇ)
post_ime_update comp_str L"\3147"

막힌 곳은 키보드 그룹이었습니다. 한 번의 재현에서 이렇게 나옵니다.

keyboard_handle_keymap       4     전환마다 온다
keyboard_handle_modifiers    1     그룹을 고쳐줄 유일한 길
activate_keyboard_hkl        2     둘 다 text_input_enter에 붙음

keyboard_handle_keymap은 끝에서 set_current_xkb_group(0)을 부르는데, 새로 만든 xkb_state가 그룹 0이니 그 자체는 틀린 것이 아닙니다. 올바른 그룹은 뒤따라오는 modifiers가 알려주게 되어 있습니다.

그런데 그 keyboard_handle_modifiers가 일을 하기도 전에 돌아가고 있었습니다.

if (!wayland_keyboard_get_focused_hwnd()) return;

그룹은 창의 속성이 아니라 seat의 속성입니다. 우리 창이 키보드를 들고 있지 않은 사이에 온 그룹 변경은 그대로 버려지고, 남는 것은 키맵이 0으로 되돌려놓은 값뿐입니다. 입력 소스를 바꿀 때마다 키맵이 새로 오기 때문에, 그 틈이 늘 열려 있습니다.

다시 클릭하면 되는 이유도 여기에 있습니다. 클릭은 포커스 변경이고, text_input_enter가 이 자리에서 정해진 값을 가지고 레이아웃을 세웁니다.

그래서 포커스가 어떻든 그룹은 따라가게 두고, 알려줄 창이 있을 때만 알려주도록 고쳤습니다. 나중에 포커스를 얻는 창은 그때 가서 듣습니다.

이것만으로는 한글이 들어가지 않았습니다. 진짜 원인은 0010입니다.