그 동안 제가 끝글자 버그를 잡지 않고 방치한 이유
우선 책임, 의무가 없습니다. 제가 해당 어플 개발자도 아닐 뿐더러 오픈소스가 원래가 유지보수 의무, 보증 책임이 없습니다. 이렇게 개떡 같은 게 오픈소스입니다.
전 과거 libhwp 하냐고 시간이 없었고, 지금은 nimf 개발하냐고, 밥 먹고 사냐고 시간이 없습니다. 그리고 제가 겪는 문제가 아닙니다.
컴퓨터가 저사양 노트북입니다. 컴파일 시간이 아마 10시간 정도 걸릴 거에요.
저 시간 없어요. 한가한 사람 아닙니다. 아침 06시 40분 기상해서 집에 오면 22시 30분 정도됩니다. 구라가 아니라 진짜로 컴퓨터 살 돈도 없어요.
nimf 에 GTK, Qt 어플에 있는 끝글자 버그를 무력화시킬 수 있는 옵션이 있습니다.
이 옵션은 마우스 클릭할 때 im 을 리셋하지 않는 버그에만 유용합니다. geany, eclipse 같은 어플에 유용합니다. XIM 어플에 유용하지 않고, preedit 를 draw 하는 부분이 없거나 그 부분에 버그가 있는 어플 krita, inkscape, wine 이런 어플에는 유용하지 않습니다.
끝글자 버그는 초보자도 고칠 수 있는 아주 단순한 버그에요.
입력기에게 일을 시키거나 정보를 주고 받는 API 가 있습니다.
GTK 는 gtk_im_context_*
https://developer.gnome.org/gtk3/stable/GtkIMContext.html
Qt
http://doc.qt.io/qt-5/qinputmethodevent.html
http://doc.qt.io/archives/qt-4.8/qinputcontext.html
http://doc.qt.io/qt-5/eventsandfilters.html
XIM
https://linux.die.net/man/3/xopenim
https://linux.die.net/man/3/xcreateic
등의 함수가 있습니다.
그래서 리브레오피스의 끝글자 버그를 잡으려고 한다면, 리브레오피스 소스코드를 다운받아서 바다처럼 광대한 소스코드량에 놀랄 필요가 없이,
grep 명령어로 XOpenIM, XCreateIC 이러한 함수를 찾으면 입력과 관련된 파일이 어느 것인지 금방 파악할 수 있습니다.
그렇게 작성한 패치입니다.
hodong@debian:~/Downloads/libreoffice-5.2.7.2$ git diff
diff --git a/vcl/unx/generic/app/i18n_ic.cxx b/vcl/unx/generic/app/i18n_ic.cxx
index a67e589..fedf1de 100644
--- a/vcl/unx/generic/app/i18n_ic.cxx
+++ b/vcl/unx/generic/app/i18n_ic.cxx
@@ -618,6 +618,17 @@ SalI18N_InputContext::UnsetICFocus( SalFrame* pFrame )
}
}
+void
+SalI18N_InputContext::ResetIC()
+{
+ if ( mbUseable && (maContext != nullptr) && maClientData.pFrame )
+ {
+ char *text;
+ text = Xutf8ResetIC( maContext );
+ free (text);
+ }
+}
+
// multi byte input method only
void
diff --git a/vcl/unx/generic/window/salframe.cxx b/vcl/unx/generic/window/salframe.cxx
index 061abbf..50326c1 100644
--- a/vcl/unx/generic/window/salframe.cxx
+++ b/vcl/unx/generic/window/salframe.cxx
@@ -2653,6 +2653,7 @@ long X11SalFrame::HandleMouseEvent( XEvent *pEvent )
}
else if( pEvent->type == ButtonPress )
{
+ mpInputContext->ResetIC();
// see if the user clicks outside all of the floats
// if yes release the grab
bool bInside = false;
코드 몇 줄 되지도 않습니다. 컴퓨터가 저사양 노트북이라 컴파일은 해보지 않아서 작동 여부는 저도 모릅니다. 하지만 이클립스 등 어플에서 마우스 클릭할 때 reset 하지 않아서 발생하는 끝글자 버그는 저러한 방식으로 고치면 됩니다. 언어 문법만 알면 고칠 수 있는 버그입니다.
초보 개발자도 할 수 있는 걸 아무도 고쳐주지 않아 수년 간 방치되고 있는 것이죠.
krita, inkscape, wine 어플은 폰트를 draw 하는 코드가 있습니다. 그 부분에 버그가 있는 것이니 로직 버그를 수정하면 됩니다.
사람들이 끝글자 버그에 대해 엉뚱하게도 저를 탓하여 geany, eclipse, libreoffice 에 발생하는 끝글자 버그를 모두 고치려 했으나, 제 컴퓨터가 저사양 노트북이라 컴파일하는데 아마 10시간 정도 걸릴 거에요. 컴퓨터 구입하려면 또 손실 발생하고 시간 빼앗겨 더 열폭할 거 같아서 여기까지만 하겠습니다.
끝글자 버그가 저렇게 초보 개발자도 고칠 수 있는 아주 단순한 버그에요.
저렇게 단순한 버그가 왜 수 년간 방치되고 있는지 이해를 하지 못하겠습니다.
애초 geany, libreoffice, eclipse 끝글자 버그를 모두 고치려 했으나 컴퓨터 살 돈도 없고 더 하다간 개짜증 나서 돌아가실 것 같아 안 고치고 방치하겠습니다.
저 버그가 몇 년 더 방치되는지 한 번 지켜보겠습니다.
저를 열심히 욕하고 탓하세요!!
제가 nimf 개발 외에는 컴퓨터를 쓸 일이 없어요.
저는 직업이 개발자도 아니고, 오픈소스 개발자도 아닐 뿐더러 그렇게 소개한 적도 없고 오픈소스 관계자도 아닙니다.
오픈소스가 이렇게 개떡같은 거라 컴퓨터 갖다 버리고 앞으로 관심 끄고 살거에요.
사실 컴퓨터 갖다 버리고 관심 끄고 살고 있었어요. 개인 이메일 절대 보내지 마세요.
개인 이메일 보내면 낚여서 개짜증 나서 다시 나타나겠지만...
서로 욕하시고 욕 쳐 드시면서 시작할거라는 거 알고 계세요.
님들끼리 잘 해보세요.
https://bugs.documentfoundation.org/show_bug.cgi?id=117008
답글삭제cogniti@gmail.com 2018-09-03 22:17:33 UTC
I have no time to compile and test it.
hodong@debian:~/Downloads/libreoffice-5.2.7.2$ git diff
diff --git a/vcl/unx/generic/app/i18n_ic.cxx b/vcl/unx/generic/app/i18n_ic.cxx
index a67e589..fedf1de 100644
--- a/vcl/unx/generic/app/i18n_ic.cxx
+++ b/vcl/unx/generic/app/i18n_ic.cxx
@@ -618,6 +618,17 @@ SalI18N_InputContext::UnsetICFocus( SalFrame* pFrame )
}
}
+void
+SalI18N_InputContext::ResetIC()
+{
+ if ( mbUseable && (maContext != nullptr) && maClientData.pFrame )
+ {
+ char *text;
+ text = Xutf8ResetIC( maContext );
+ free (text);
+ }
+}
+
// multi byte input method only
void
diff --git a/vcl/unx/generic/window/salframe.cxx b/vcl/unx/generic/window/salframe.cxx
index 061abbf..50326c1 100644
--- a/vcl/unx/generic/window/salframe.cxx
+++ b/vcl/unx/generic/window/salframe.cxx
@@ -2653,6 +2653,7 @@ long X11SalFrame::HandleMouseEvent( XEvent *pEvent )
}
else if( pEvent->type == ButtonPress )
{
+ mpInputContext->ResetIC();
// see if the user clicks outside all of the floats
// if yes release the grab
bool bInside = false;
저 사실 오픈소스 안티에요.
저 끌어들이지 마세요.
나머지는 님들끼리 알아서 하세요.
저는 딱 여기까지만 하겠습니다.
지금도 어이가 없는게 누가 누구한테 오픈소스 자세 운운하는 건지...
답글삭제웃겨 진짜... 아휴 개짜증나 그러게 이걸 왜 오픈소스로 공개해가지고.
그냥 프리웨어 이런 걸로 공개할 걸.