예전에 유닉스 시대에는 입력 방식이 xim 으로 통일된 방식이었는데…
현재는 리눅스에서 입력 방식이 중구난방(xim, gtk im, qt im, clutter im, wayland 등)이라서 어려운 것고요…
응용 프로그램 및 입력기에서 각각의 입력 방식을 지원해야 하므로 어려운 점이 있고,
게다가 응용 프로그램의 주류 개발자들이 대부분 영미권 사람들이라 CJK(중국어,일본어,한국어) 입력 방식에 대한 이해가 부족하여 버그 보고를 해도 개발자들이 이해를 하지 못하여 못 고쳐주는 부분이 대부분입니다.
시간이 지나면 해결되겠지… 저도 이런 생각으로 5년이 지났지만 아무도 입력기 프레임워크(ibus, fcitx 등)의 끝글자 버그를 고쳐주지 않았습니다. 그래서 결국 다솜 입력기를 만들게 되었습니다…
저뿐만 아니라 다른 프로그래머들의 프로그래밍 능력이 미숙하여 발생하는 버그는 아닙니다.
특히 한국어 관련한 버그는 여러가지 이유로 참여가 부족하여 해결이 안 되고 있다고 보시면 됩니다.
주류 개발자들은 각종 후원금(기부금) 및 회사 월급을 받으면서 개발하므로 사정이 괜찮을 것으로 짐작됩니다.
무슨 말이냐면 어떤 프로그램 GPL, LGPL 등 각종 오픈소스 라이선스 소스코드 헤더를 보면 Copyright Redhat 또는 intel 등 회사이름이 들어가는데… 그 회사에서 월급을 받는 개발자가 만들었을 것이라 추측할 수 있습니다.
그 대부분의 개발자들이 아마도 영미권 사람들일 것이라고 추정할 수 있습니다. 그 사람들이 CJK 권 사람이라면 끝글자 버그를 그냥 두지 않았겠죠. 자기들이 사용하면서 불편을 겪을게 뻔하니까요.
다솜 입력기 1.0 을 사용하면 이클립스 끝글자 버그가 나타나지 않는데(회피됨) 대신 우클릭 문제가 발생합니다.
https://github.com/dasom-im/dasom/issues/9
이거는 다솜 입력기의 후킹 부분이 응용 프로그램의 정상 작동을 방해하는 것이므로 다솜 입력기 버그입니다.
그래서 이벤트 후킹하는 코드를 변경하여 1.0.1 버전에 적용하였습니다.
다솜 입력기 1.0.1 사용할 때 발생하는 이클립스 끝글자 버그는 다솜 입력기의 버그가 아닙니다.
https://github.com/dasom-im/dasom-jeongeum/issues/2
그리고 nabi 는 XIM 입력기입니다.
다솜도 XIM 입력기 기능이 있습니다. eclipse 구동할 때(일반적인 경우) 다솜에 있는 gtk im 모듈이 작동되는데…
/usr/lib/x86_64-linux-gnu/gtk-3.0/3.0.0/immodules/im-dasom-gtk3.so
/usr/lib/x86_64-linux-gnu/gtk-2.0/2.10.0/immodules/im-dasom-gtk2.so
아래처럼 하면 다솜 입력기의 XIM 기능이 사용됩니다.
무슨 말이냐면 eclipse 가 im-dasom-gtk3.so, im-dasom-gtk2.so 을 사용하지 않고 X 서버에 접속하여 키값을 X 서버에 전송하여 X 서버는 다솜 XIM 서버(dasom-daemon 은 다솜 프로토콜과 XIM 프로토콜을 동시에 처리합니다)에 접속하여 키값을 다솜에 넘겨주고 다솜은 그 값을 처리하여 X 서버에 보내고 X 서버는 처리된 결과값을 응용 프로그램에 보냅니다.
hodong@debian:~$ export | grep dasom
declare -x GTK_IM_MODULE="dasom"
declare -x QT4_IM_MODULE="dasom"
declare -x QT_IM_MODULE="dasom"
declare -x XMODIFIERS="@im=dasom"
hodong@debian:~$ GTK_IM_MODULE="xim"
hodong@debian:~$ eclipse
hodong@debian:~$
위에 처럼 하여 다솜 XIM 을 사용할 경우 eclipse 끝글자 버그는 나타나지 않습니다.
그리고 imhangul 은 gtk im module 입니다.
/usr/lib/x86_64-linux-gnu/gtk-3.0/3.0.0/immodules/im-dasom-gtk3.so 요런 거죠…
imhangul 사용시 이클립스 끝글자 버그는 나타나지 않는데… 그것은…
gtk_key_snooper_install() 함수로 이벤트를 후킹하여 그럴 겁니다.
무슨 말이냐면 이클립스보다 먼저 키 이벤트를 imhangul 이 받아서 처리한 후에 이클립스로 결과를 리턴합니다.
원래는 이클립스가 키 이벤트를 먼저 받고 그걸 imhangul 에 건내주고 imhangul 이 그걸 처리해서 이클립스에 결과를 리턴해야 하는 겁니다.
[code:7idt3tpj]guint
gtk_key_snooper_install (GtkKeySnoopFunc snooper,
gpointer func_data);
gtk_key_snooper_install has been deprecated since version 3.4 and should not be used in newly-written code.
Key snooping should not be done. Events should be handled by widgets.
Installs a key snooper function, which will get called on all key events before delivering them normally.
Parameters
snooper a GtkKeySnoopFunc
func_data data to pass to snooper .
Returns
a unique id for this key snooper for use with gtk_key_snooper_remove().[/code:7idt3tpj]
많은 응용 프로그램들이 이렇게 입력 관련 버그가 있어서 다솜 입력기에도 그걸 회피하고자 이벤트를 후킹하는 방식을 사용합니다.
gtk_key_snooper_install() 함수는 deprecated since version 3.4 때문에 사용하지 않습니다.
(deprecated 뜻: 중요도가 떨어져 더이상 사용되지 않고 사라질)
대신,
다솜 1.0 에서 gdk_event_handler_set(), gtk_main_do_event() 를 사용했었는데 부작용(이클립스 우클릭 문제 https://github.com/dasom-im/dasom/issues/9 )이 있어서
다솜 1.0.1 에서는 gdk_window_add_filter(), gdk_window_remove_filter() 를 사용합니다.
부작용은 아직 발견되지 않았고, 최근 inkscape 사용할 경우 inkscape 죽는 현상을 발견하였습니다.
https://plus.google.com/106795824057033 ... RtC4Z7beyy
이는 프로그래밍 미숙으로 발생된 버그는 아니고, gtk, gdk 핵심 부분(이벤트 핸들링)에 대한 api 설명이 없어서 발생한 프로그래밍 버그입니다. 해결 방법을 찾았고 좀 정리하고 테스트한 후에 commit 하여 반영할 계획입니다. 아울러 하는김에 이클립스 끝글자 버그 회피 방법도 다시 살펴볼 계획입니다.
이클립스 실행시에
gtk_im_context_set_client_window (GtkIMContext *context,
GdkWindow *window); 함수가 작동하는데,
다솜 입력기에서 그 함수를 구현하고 있고 구현한 함수가 실행됨을 확인하였는데, 이클립스 사용할 경우 다솜 입력기 gdk 이벤트 후킹 기능이 작동하지 않아서, 이클립스가 gtk_im_context_set_client_window (context, NULL) 이렇게 NULL 값을 넣는 건 아닌가… 추측만할 뿐입니다.
좀더 확인해보고,
gdk_window_add_filter (GdkWindow *window,
GdkFilterFunc function,
gpointer data);
에 window 인자에 NULL 을 넣어서… api 문서에 따르면 ‘Pass NULL for window to get all events for all windows, instead of events for a specific window.’ 이렇게 나와 있는데, 위험하지만 이 방법을 시도해 볼 생각입니다.
빠르게 개발할 것 같으면 여러 사람들이 사용할 수 있게끔 그 코드를 바로 commit 하여 버그가 올라오면 그 때 또 고치면 됩니다. 이런 개발 방법은 테스트 시간은 줄여주지만, 사용자분들이 많은 불편을 겪게 될 것이므로 이런 개발 방법을 사용하지 않고,
시간이 오래 걸리더라도 제가 최소 1주일 이상을 직접 사용해보고 그후에 commit 하는 과정을 거치게 됩니다.
응용 프로그램 및 배포판이 iceweasel, geany, eclipse, gedit, libreoffice, inkscape 등 많다보니 테스트에 굉장히 많은 시간이 소비됩니다.
우분투 14.04, 15.04, 15.10, 데비안 jessie 최소 4종, 최소 5종의 프로그램, 각 테스트에 10~30분 소요…
4 * 5 * (10~30분) = 200분~600분(기본 테스트에 3시간~10시간 소요됨)
그래서 개발이 늦어지는 것이니 양해 부탁드립니다.
그리고 배포판 4종에 대해 deb 파일을 만들려면 32비트, 64비트가 있으니 8종의 리눅스를 버추얼박스에 설치 및 업데이트, git 다운로드 검파일해야 됩니다. 1종에 대한 deb 파일을 만들려면 2~3시간 소요되므로 8종이면 16시간~24시간 소요됩니다.
그래서 쉽게 릴리즈 엄두도 못내고 있습니다. SSD 비용도 장난아니고… 120GB 사용하다가 9월말 릴리즈 준비 때문에 240GB 구입했고, 용량 부족해서 11월말이나 12월 초에 SSD 480GB 구입 예정입니다.
버박에 10종 이상의 리눅스를 설치했는데 80GB 정도 차지하고 용량 부족으로 모두 삭제하였습니다. 개발하면서 이렇게 수십만원씩 장비값도 들어가고…
주말이 알바 못나가서 발생되는 손실액만해도… 매달 최소 20만원(보통 40만원 정도 손실 발생됨)에 달합니다.
다솜 입력기 개발하면서 1월부터 10월말까지 손실 본 금액이 500만원이 넘어갑니다. 수면 부족으로 인한 건강 문제도 있고요.
이런 개인적인 사정이 있습니다.
궁극적으로는… 통합된 linux im api standard 가 나와서 모든 응용 프로그램 및 입력기가 linux im api standard 를 지원하는 방향으로 가야겠죠.
C++ 은 호환성 때문에 탈락, ibus 는 비동기 방식의 필연적 버그 때문에 탈락,…
그 비전을 다솜 입력기가 제시하고 싶습니다.