skip menu and go to main content

body start

Nabi - the Easy Hangul XIM

  약간의 추가 질문... 3 ]

09.07.11-23:39:01

309768

Submitted by prime wizard

 

View1488

 

제가 답변 주신 내용을 100% 이해는 잘 못하고 있습니다만

그냥 드는 단순한 생각으로 이렇게 생각했던 것이었습니다.
일단 Leafpad 두 개를 띄워놓고 나비 로그를 보면

두 Leafpad 윈도우 사이를 왔다 갔다 할 때도
nabi_handler_unset_ic_focus, nabi_handler_set_ic_focus 이 연달아 불려지고

한 Leafpad 윈도우에서 자식 위젯(예:메뉴->검색->찾기 )에 포커스가 갈 때도 연달아 불려지는 것을 보고

nabi_handler_unset_ic_focus 에
void nabi_ic_flush(NabiIC *ic) 함수를 삽입해 보았고

두 Leafpad 윈도우 사이를 왔다 갔다 할 때는 잘 동작을 했고
다만 한 Leafpad 윈도우에서 자식 위젯(예:메뉴->검색->찾기 )에 포커스가 갈 때만 flush 가 안돼서
이 둘의 차이점을 알 수 있으면 이 문제를 해결할 수 있지 않을까 생각했습니다.
(유효한 XIC를 알 수 없다면 백업해 두는 방법도 포함)

말씀하시는 뜻이 nabi_handler_unset_ic_focus 가 불려질 때는 이미 XIC가 유효하지 않다는 뜻인가요?
그리고 XTestFakeKeyEvent 처럼 fake reset을 발생시킬 방법이 존재할 수 없는 것인가요?

Comments on this artfact

3 Comments

prime

제가 답변 주신 내용을 100% 이해는 잘 못하고 있습니다만

그냥 드는 단순한 생각으로 이렇게 생각했던 것이었습니다.
일단 Leafpad 두 개를 띄워놓고 나비 로그를 보면

두 Leafpad 윈도우 사이를 왔다 갔다 할 때도
nabi_handler_unset_ic_focus, nabi_handler_set_ic_focus 이 연달아 불려지고

한 Leafpad 윈도우에서 자식 위젯(예:메뉴->검색->찾기 )에 포커스가 갈 때도 연달아 불려지는 것을 보고

nabi_handler_unset_ic_focus 에
void nabi_ic_flush(NabiIC *ic) 함수를 삽입해 보았고

두 Leafpad 윈도우 사이를 왔다 갔다 할 때는 잘 동작을 했고
다만 한 Leafpad 윈도우에서 자식 위젯(예:메뉴->검색->찾기 )에 포커스가 갈 때만 flush 가 안돼서
이 둘의 차이점을 알 수 있으면 이 문제를 해결할 수 있지 않을까 생각했습니다.
(유효한 XIC를 알 수 없다면 백업해 두는 방법도 포함)

말씀하시는 뜻이 nabi_handler_unset_ic_focus 가 불려질 때는 이미 XIC가 유효하지 않다는 뜻인가요?
그리고 XTestFakeKeyEvent 처럼 fake reset을 발생시킬 방법이 존재할 수 없는 것인가요?

09.07.11-23:39:01

Choe Hwanjin

많은 관심에 감사드립니다.

1. 말씀하시는 뜻이 nabi_handler_unset_ic_focus 가 불려질 때는 이미 XIC가 유효하지 않다는 뜻인가요?
예. 게다가 그 상태에서 commit이나 기타 동작을 하게 되면 xim client의 동작을 보장할수 없다는
이야기 였습니다. 따라서 안정적인 방법이 아닌 것입니다. 쉽게 말해 그렇게 구현하면 어떤 프로그램에서
어떤 오작동이 일어날지 예측할 수 없다는 것이지요.

2. 그리고 XTestFakeKeyEvent 처럼 fake reset을 발생시킬 방법이 존재할 수 없는 것인가요?
XTestFakeKeyEvent로 ctrl 키 이벤트를 보내는 것은 reset을 부르게 만드는 것은 아닙니다.
이 상황은 위에서 말한 대로 focus 상태가 바뀐 후 글자 입력을 시켰기 때문에 프로토콜이
꼬여서 이후 focused XIC에서 글자 입력에 문제가 생기는 것입니다. 이것을 fake 키 입력을
보내 해결하는 것입니다.

중요한 것은 어플리케이션이 reset함수를 부르느냐인데, 이것은 어플리케이션에 코드가 구현되어야
하는 문제입니다. 예를 들어, 예전에는 mozilla, firefox에서는 아예 reset 함수를 부르는 코드가
없었습니다.

그렇다고 하더라도 그런 류의 일반적이지 않은 workaround 코드는 결국에 가서는
버그와 마찬가지가 되기 때문에 피하려고 하는 것입니다.
만일 ctrl 키가 눌릴때 특정 동작을 하는 프로그램이 있다면 그 프로그램에는 이런 코드가
버그가 될 것입니다. 앞으로 그런 류의 프로그램이 나올지 안나올지 모르는 것이니까요.

안타깝게도 아직까지 근본적인 방법 말고, 별다른 좋은 방법을 찾지 못하고 있습니다.
다른 좋은 방법이 있을지 계속해서 연구가 필요할 것 같네요.

추신:
글을 올리실때 이전 글에 답글을 달면 스레드를 유지하실 수 있습니다.

09.07.12-23:07:34

prime

새 글이 올라가는 것을 보고 지우고 나서 기존 스레드에 답글을 달려 했으나
지우는 방법을 모르는 관계로(^^;)...

암튼 답변 감사드립니다. 저도 다른 방법을 생각해 봐야 겠습니다.

09.07.13-12:45:38