Skip to content

기묘한 GTK의 세계

Riey edited this page Mar 2, 2021 · 6 revisions

GTK의 묘한 동작들을 정리해봤습니다. 제가 잘못 구현했을수도 있으니 그렇다면 알려주시길 바랍니다 💦

filter-keypress

아무것도 안하고 그냥 FALSE를 반환할시에 KEY_PRESS 이밴트가 2번 들어옵니다. Imgur

firefox

입력기 ID와 환경변수에 따라서 이밴트를 열심히 다르게 처리합니다 따라서 다른 입력기를 따라 한다고 꼭 그 동작이 제 입력기에도 적용되진 않습니다

https://github.com/mozilla/gecko-dev/blob/master/widget/gtk/IMContextWrapper.cpp#L839

하지만 제일 묘한것은 preedit-end 시그널을 보낸뒤에 filter-keypress가 FALSE를 반환하면 키가 씹힌다는 것입니다

간단한 예제로 주소창에 한글 ㄱㄴ[ㄷ]를(ㄷ은 preedit 상태) 치고 엔터를 누르면 ㄱㄴㄷ가 검색되는게 아니라 그냥 preedit이 끝나고 주소창에 ㄱㄴㄷ만 남아있습니다

해결 방법은 FALSE를 바로 반환하지 않고 state에 1 << 25 따위의 플래그를 넣은뒤에 gdk_event_put등으로 다시 이밴트 루프에 태워서 그 이밴트에 대해 FALSE를 다시 반환해야 합니다. 🤦‍

gedit

이 녀석은 commit을 해야만 써지기 때문에 filter-keypress를 FALSE로 반환시키면 아무것도 입력되지 않습니다 영어 문자도 직접 commit 해야만 합니다.

libreoffice-calc

calc의 셀에 포커스를 주고 아무거나 입력하면 바로 덧씌워집니다 이건 기묘하다기 보단 그냥 좀 특별한 동작인건데

문제는 commit할때 빈 문자열을 보내버리면 그냥 그 셀이 통째로 지워집니다 보내지 않도록 조심해야합니다.

Clone this wiki locally