http://kldp.org/node/93540#comment-440828
에서 말씀하신 것처럼 reset 메소드를 불러주어야 하지만
모든 프로그램에서 reset 을 불러주길 기대하는 것은 어렵기 때문에
뭔가 입력기 차원에서 해결이 안될까 하고 약간의 실험을 해보았습니다.
static Bool
nabi_handler_unset_ic_focus(XIMS ims, IMChangeFocusStruct *data)
함수에서
void nabi_ic_flush(NabiIC *ic) 함수를 불러주면
다른 윈도우로 포커스가 갈 때는 마지막 글자 입력이 flush가 되는데
같은 윈도우에서 자식 위젯이 입력 포커스를 가지면 글자가 사라졌습니다.
(예:Leafpad 에서 메뉴->검색->찾기)
그래서 위 nabi_ic_flush 함수를 추가해주고 브레이킹 포인트를 걸고 좀 살펴보니
static void
nabi_ic_commit_utf8(NabiIC *ic, const char *utf8_str) 함수
IMCommitString(nabi_server->xims, (XPointer)&commit_data); 이 부분에서
포커스가 다른 윈도우가 아닌 자식 위젯에 포커스가 가면
마지막 글자가 flush 가 되는 것이 아니라 사라져 버렸습니다.
제가 xim 을 잘 모르는 관계로...^^; 불가능한 것을 원하는 것인지 모르겠습니다만
뭔가 nabi_handler_unset_ic_focus 에서 처리를 해주면
입력기 차원에서 마지막 글자 문제를 해결할 수 있을 것 같은데
제가 잘 못 생각하는 것일까요?
--
참고사항:
Leafpad 몇 개 띄워 놓고 실험했습니다.
그리고 위처럼 실험하면
한글 입력 상태에서 윈도우가 포커스를 한 번 잃었다 다시 얻으면 첫 글자가 영문으로 입력되었습니다.
그래서 이리저리 궁리하다 황당한(?) 방법을 사용했는데
nabi_handler_set_ic_focus 함수에 아래 코드를 추가했습니다. ^^;
if (ic->mode == NABI_INPUT_MODE_COMPOSE) {
Display *dpy = gdk_x11_get_default_xdisplay();
XTestFakeKeyEvent( dpy, XKeysymToKeycode( dpy, XK_Control_L), True, 0);
XTestFakeKeyEvent( dpy, XKeysymToKeycode( dpy, XK_Control_L), False, 0);
}
또한 위 XTestFakeKeyEvent 함수 때문에 configure.ac 에 아래도 추가했습니다.
AC_CHECK_LIB(Xtst,XTestFakeKeyEvent,,AC_MSG_ERROR([
*** We need the libXtst development library to build this program.]))