Qt와 GTK에서 마우스 클릭 시 입력기 모듈에 보내는 요청 시퀀스가 좀 달랐음.

GTK에서는 일부 위젯 한정으로 텍스트 편집 중 마우스를 클릭했을 때 입력기에 reset 신호를 보내고 나서 preedit text(한국어에서는 입력 중인 글자)를 그대로 커밋해 버리는데 Qt는 마우스가 클릭되었다는 신호만 보내고 말아서 입력기가 저걸 어떻게 처리하느냐에 따라 behavior 자체가 완전히 달라짐.


참고로 내가 찾아본 몇 가지 입력기는 마우스 이벤트를 받았을 때 이렇게 처리한다고 함.

  • fcitx: preedit text 바깥 영역을 클릭한 경우에만 commit, 나머지 케이스는 무시. 이마저도 Qt 모듈 쪽에서 처리해서 입력기 내부 버퍼는 그대로 남아 있음
  • uim: 아예 무시
  • ibus: 어디를 클릭하든 commit(Qt 버전이 충분히 높은 경우 한정)
  • nimf: 입력기 모듈로 Qt가 직접 보내주는 이벤트를 무시하는 대신 global event filter를 통해 애플리케이션 내 모든 마우스 이벤트를 모니터링해서 reset 신호를 보냄


Nimf의 경우 "GDK 키 이벤트 후킹하기" 옵션을 켜면 입력기 관련 처리가 제대로 구현되지 않은 GTK 위젯을 쓰는 프로그램에서도 마우스 이벤트를 알아서 처리해 줘서 Qt나 GTK를 쓰는 어지간한 프로그램에서는 버그가 잘 안 나는 편이라던데 난 아직 안 써봐서 모르겠음.