skip menu and go to main content

body start

Nabi - the Easy Hangul XIM

  한글 마지막 글자 입력 처리에 대해서... 2 ]

09.07.10-23:06:49

309767

Submitted by prime wizard

 

View2290

 

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.]))

Comments on this artfact

2 Comments

prime

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.]))

09.07.10-23:06:49

Choe Hwanjin

비교적 정확하게 접근하셨습니다.
말씀하신 대로 focus out 이벤트에서 flush를 해줄수 있다면 focus가 빠지는 경우에
한해서 문제를 해결할 수 있습니다.
그러나 XIM의 XIM_UNSET_IC_FOCUS는 synchronous 프로토콜이 아닙니다.
그래서 XIM 서버에서 focus out 이벤트에서 마지막 글자를 플러시 해준다고 하더라도
XIM 클라이언트는 이미 focus를 가진 XIC가 없거나 다른 XIC에서 가지고 있을 가능성이
높습니다. 그래서 focus out 이벤트에서 마지막 글자를 커밋한다고 해도
어플리케이션에서 마지막 글자가 입력될지 보장할 수 없고, 오작동 할 가능성이 높습니다.
따라서 XIM 프로토콜 상에서는 해결이 어려운 문제입니다.

그러나 gtk im module과 같이 모든 함수가 synchronous한 경우에는 focus out 이벤트에서
마지막 글자를 입력하는 것이 가능합니다. 그래서 gtk im module의 경우에는
이미 그렇게 구현하고 있습니다.

게다가 focus out에서 flush하는 경우에는 focus가 나가는 한가지 경우의 문제만
해결이 됩니다. 한 입력창 안에서 캐럿이 움직이는 경우는 focus가 빠지지 않으므로
어플리케이션이 reset 메소드를 불러주지 않는다면 대응할 수 없습니다.

따라서 focus out에서의 처리는 이 문제에 대한 해결책이 되지 못합니다.
어플리케이션에서 reset 메소드를 처리하는 것이 중요합니다.

그러나 대부분 어플리케이션에서 일부러 reset 메소드를 사용하지 않도록
코딩하고 있는 것이 가장 큰 문제라 하겠습니다.

09.07.11-15:21:14