끝글자 버그를 고칩시다 2 - wxWidgets

Hodong Kim@Google의 이미지

https://kldp.org/node/161761 에 이어서 계속되는 글입니다.

wxWidgets 끝글자 버그

업데이트: Thu 27 Jun 2019 13:51:51

쉬울 줄 알았는데 생각보다 쉽지 않습니다.
GtkEventControllerKey, GtkPropagationPhase 를 활용해보기로 했습니다.

https://github.com/wxWidgets/wxWidgets/pull/1367

개발자분께서 수용할 수 없다고 해서 GG 쳤습니다.
개발자분의 의견을 존중합니다.
코드는 위에 링크에서 보실 수 있고 개인적으로 컴파일해서 사용하시면 되겠습니다.
감사합니다.

https://packages.debian.org/buster/libwxgtk3.0-gtk3-0v5 패키지를 찾아보니 libwxgtk3.0 라는 소스코드가 따로 있는게 아니라
http://deb.debian.org/debian/pool/main/w/wxwidgets3.0/wxwidgets3.0_3.0.4+dfsg.orig.tar.xz 소소코드로부터 만들어진 패키지임을 알 수 있습니다.
이 방대한 코드에 놀랄 필요가 없습니다. wxWidgets 는 리눅스에서 사용하기 위해 gtk 를 사용한다는 것을 알 수 있고 gtk 는 입력 방법으로 https://developer.gnome.org/gtk3/stable/GtkIMContext.html 을 사용합니다. 따라서 그 함수들을 검색하면 됩니다.
검색하는 방법은

grep -nHIrF -- gtk_im_context_

이렇게 찾으면 됩니다. geany 에서 찾으면 편합니다.
해당 버그는 마우스 클릭할 때 입력기를 reset 하지 않아서 발생하는 버그입니다.
확인해보니 GtkEntry, GtkTextView 는 문제가 없는데, wxWidgets 에서 GtkEntry, GtkTextView 에 있는 GtkIMContext 를 잘못 다루어 버그가 발생한 것이었습니다. 그래서 GtkEntry, GtkTextView 가 키 이벤트를 처리하도록 다음처럼 코드를 수정합니다.
단순히 return false 함으로써 해결되었습니다.

diff --git a/src/gtk/textctrl.cpp b/src/gtk/textctrl.cpp
index 02bd068..6a53aeb 100644
--- a/src/gtk/textctrl.cpp
+++ b/src/gtk/textctrl.cpp
@@ -862,24 +862,7 @@ GtkEntry *wxTextCtrl::GetEntry() const
 
 int wxTextCtrl::GTKIMFilterKeypress(GdkEventKey* event) const
 {
-    if (IsSingleLine())
-        return wxTextEntry::GTKIMFilterKeypress(event);
-
-    int result;
-#if GTK_CHECK_VERSION(2, 22, 0)
-#ifndef __WXGTK3__
-    result = false;
-    if (gtk_check_version(2,22,0) == NULL)
-#endif
-    {
-        result = gtk_text_view_im_context_filter_keypress(GTK_TEXT_VIEW(m_text), event);
-    }
-#else // GTK+ < 2.22
-    wxUnusedVar(event);
-    result = false;
-#endif // GTK+ 2.22+
-
-    return result;
+    return false;
 }
 
 // ----------------------------------------------------------------------------
diff --git a/src/gtk/textentry.cpp b/src/gtk/textentry.cpp
index d4eb406..6bb6d59 100644
--- a/src/gtk/textentry.cpp
+++ b/src/gtk/textentry.cpp
@@ -417,21 +417,7 @@ void wxTextEntry::SendMaxLenEvent()
 
 int wxTextEntry::GTKIMFilterKeypress(GdkEventKey* event) const
 {
-    int result;
-#if GTK_CHECK_VERSION(2, 22, 0)
-#ifndef __WXGTK3__
-    result = false;
-    if (gtk_check_version(2,22,0) == NULL)
-#endif
-    {
-        result = gtk_entry_im_context_filter_keypress(GetEntry(), event);
-    }
-#else // GTK+ < 2.22
-    wxUnusedVar(event);
-    result = false;
-#endif // GTK+ 2.22+
-
-    return result;
+    return false;
 }

그 후 컴파일한 다음 poedit, 4pane 을 실행해보니 버그가 해결되었음을 알 수 있습니다.
끝글자 버그는 단순한 버그입니다. 기술적으로 어려운 점은 없는데 어플을 컴파일하는데 시간이 오래 걸리고 어플 프로젝트에 버그 리포팅하고 개발자들을 이해시키고 답변을 기다리고 패치가 적용되는데까지 오랜 시간이 걸린다는 것이 어려운 점이죠.

데비안 Buster 사용자분들은 아래 파일을 설치하시면 되겠습니다.
https://kldp.org/files/libwxgtk3.0-gtk3-0v5_3.0.4%2Bdfsg-8.1_amd64.deb

wxWigdets 프로젝트에 패치를 보냈습니다.
Let GTK itself handle key events
https://github.com/wxWidgets/wxWidgets/pull/1357

Forums: 
Hodong Kim@Google의 이미지

wxWigdets 프로젝트에 패치를 보냈습니다.
Let GTK itself handle key events
https://github.com/wxWidgets/wxWidgets/pull/1357
고쳐질 수 있도록 관심 가져주시길 바랍니다.
저쪽에서 이거 해달라 저거 해달라는 요청이 있을 수 있고 그에 대한 적절한 답변을 해드리거나 테스트를 해드려야 합니다.
끝글자 버그라는게 어려운 버그가 아닙니다.
이렇게 개쉬운 버그입니다.

Hodong Kim@Google의 이미지

다음 강의에는 마메 mame 소스를 확인해보겠습니다.
https://gitlab.com/nimf-i18n/nimf/issues/53

hodong@debian:~/Downloads/mame_0.206+dfsg.1.orig/mame-mame0206$ grep XOpenIM -R
3rdparty/SDL2/src/video/x11/SDL_x11sym.h:SDL_X11_SYM(XIM,XOpenIM,(Display* a,struct _XrmHashBucketRec* b,char* c,char* d),(a,b,c,d),return)
3rdparty/SDL2/src/video/x11/SDL_x11video.c:        /* Set the locale, and call XSetLocaleModifiers before XOpenIM so that 
3rdparty/SDL2/src/video/x11/SDL_x11video.c:        data->im = X11_XOpenIM(data->display, NULL, data->classname, data->classname);
3rdparty/bgfx/examples/common/entry/entry_x11.cpp:			im = XOpenIM(m_display, NULL, NULL, NULL);

얼핏 보니 SDL 버그일 것 같습니다.
해당 버그가 아직도 존재하는지, SDL 버그인지 다음 번에 확인해보겠습니다.
Hodong Kim@Google의 이미지

방금 테스트해봤는데 속도 저하가 발생하지 않는 것 같습니다.
mame 버그가 고쳐진거 같습니다. krita 한글 버그도 고쳐진 거 같고,
geany 에 있는 끝글자 버그만 고치면 제가 알고 있는 각종 어플의 끝글자 버그는 모두 고쳐지게 됩니다. 다음 번에는 geany 에 있는 끝글자 버그를 고치겠습니다.
리눅스 어플에 예상외로 끝글자 버그가 없군요. nimf (구 다솜) 프로젝트 시작할 때가 2015년인데 4년 동안 여러 변화가 있었네요. 대박입니다

Hodong Kim@Google의 이미지

끝글자 버그를 고칩시다 3 - scintilla
https://kldp.org/node/161763

Hodong Kim@Google의 이미지

단순히 return false; 했더니 복붙, 잘붙에서 다른 문제가 발생하는 것 같습니다.
이 부분은 좀더 테스트를 해봐야겠습니다.
풀리케 잘못 올렸다고 두려워할 거/걱정할 거 없습니다.
This patch seems to have a slight problem in its behavior. I will test it again.
이런 식으로 사실대로 얘기해주면 됩니다.
계속 여기에 매달릴 수 없으니 생업에 매진하다가 시간날 때 다시 함 보면 되죠.
wxWidgets 을 사용하는 어플/라이브러리들이 상당히 많습니다.
이 버그에 영향을 받는거죠. 이렇게 라이브러리/툴킷에 있는 한글 버그는 필수적으로 해결되어야 합니다.
그리고 이러한 버그를 고쳐나가는 과정과 해당 링크를 공유해야 합니다.
이러한 데이터가 쌓이면 다음에 다른 어플에서 버그가 발생했을 때,
버그에 대한 링크를 줄줄이 참고 자료로 활용할 수 있게 됩니다.
이런 식으로 말이죠.

https://sourceforge.net/p/scintilla/bugs/2111/
https://github.com/geany/geany/pull/2197
https://github.com/wxWidgets/wxWidgets/pull/1357
https://bugs.chromium.org/p/chromium/issues/detail?id=966148
https://bugs.eclipse.org/bugs/show_bug.cgi?id=371397
https://bugs.documentfoundation.org/show_bug.cgi?id=117008
https://github.com/ibus/ibus/issues/1282

댓글 첨부 파일: 
첨부파일 크기
Image icon wxwidget.png122.72 KB
Hodong Kim@Google의 이미지

금방 쉽게 끝날 거라 생각했는데 생각보다 쉽진 않았네요 ㅠㅠ
패치를 업데이트 했습니다. 관심있는 분들 함 보세요.
입력 관련 버그를 어떻게 고치는지 방법을 함 보세요.
앞으로 한글 버그는 우리 스스로 이렇게 고쳐나가야 하는 것입니다.
우리 스스로 고치지 않으면 한글 버그가 5년, 10년 방치되는 것입니다.

댓글 첨부 파일: 
첨부파일 크기
Plain text icon im-patch.txt22.92 KB

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.