0010 입력기를 바꾼 뒤 아무것도 안 들어감

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

0008과 0009가 쫓던 그 증상의 진짜 원인입니다. 창이 포커스를 가진 채로 한글 입력기로 바꾸면 그때부터 입력이 통째로 삼켜져서, 한글은 물론 영문도 나오지 않았습니다. 다른 곳을 클릭했다 입력창을 다시 누르면 그제야 돌아왔는데, 변환이 틀린 것이 아니라 입력이 갈 곳이 없었습니다.

되는 경우와 안 되는 경우를 한 추적 안에 담고 입력한 문자로 경계를 표시해 갈라보니, 차이는 한 군데뿐이었습니다.

안 될 때:  WM_IME_SELECT 4,  WM_IME_SETCONTEXT 0
될 때:     WM_IME_SELECT 0,  WM_IME_SETCONTEXT 4

imm32의 ime_internal_msg를 보면 그대로 적혀 있습니다.

case IME_INTERNAL_ACTIVATE:          // 포커스를 얻을 때
    ImmSetActiveContext( hwnd, himc, TRUE );   // → WM_IME_SETCONTEXT

case IME_INTERNAL_HKL_ACTIVATE:      // 레이아웃이 바뀔 때
    ImmEnumInputContext( 0, enum_activate_layout, 0 );
    SendMessageW( hwnd, WM_IME_SELECT, TRUE, lparam );   // IME UI 창에만

레이아웃이 바뀌는 것은 포커스 변경이 아니기 때문에, 이미 포커스를 가진 창은 자기에게 한 번도 활성화된 적 없는 입력 문맥을 든 채로 남습니다. 입력기가 만들어낸 것이 닿을 곳이 없습니다. 클릭하면 되는 이유도 여기서 나오는데, 클릭은 포커스 변경이라 위쪽 갈래가 둘을 묶어주기 때문입니다.

레이아웃이 바뀔 때에도 포커스된 창에 묶어주도록 고쳤습니다. 같은 재현을 다시 돌리면 WM_IME_SETCONTEXT가 0에서 64로 바뀝니다.