On Wed, Apr 8, 2009 at 5:37 PM, Julien Cristau <jcris...@debian.org> wrote: > On Sat, 2009-03-21 at 13:00 +0700, Theppitak Karoonboonyanan wrote: >> Summarized patches:
>> Minimum: >> - 020_th_TH_iso8859-11_ct.diff: Fixes conversion which >> blocks SCIM. > > can you provide an appropriate commit message for this? > http://www.x.org/wiki/Development/Documentation/SubmittingPatches has > some guidelines. (needs to explain what this fixes and why) > I'll push it upstream then. >> Medium seriousness: >> - 022_Thai_xim_surr_conv.diff: Fixes surrounding text >> retrieval for Thai XIM (good for GTK+, needed for KDE 3). >> >> Minor: >> - 021_Thai_xim_num_caps.diff: Makes Thai XIM work when >> NumLock/CapsLock is on. >> > Same as above re: commit message, and I'll push this upstream too. Thanks for the offering. I've reformatted the 3 patches according to the guidelines. Regards, -- Theppitak Karoonboonyanan http://linux.thai.net/~thep/
From e5223cd4a182fc2f6b0ff6c0cad770fba603853d Mon Sep 17 00:00:00 2001 From: Theppitak Karoonboonyanan <t...@linux.thai.net> Date: Thu, 9 Apr 2009 11:25:25 +0700 Subject: [PATCH] CharSet-to-CompoundText Conversion Failed for Thai Locales X.Org Bug 16475 <http://bugs.freedesktop.org/show_bug.cgi?id=16475> Signed-off-by: Theppitak Karoonboonyanan <t...@linux.thai.net> SCIM fails to commit Thai input characters on Thai locales, because it commits string in compound text form, which was converted via XwcTextListToTextProperty(). But the XLC_LOCALE for th_TH and th_TH.UTF-8 declares cs1's ct_encoding as TIS620-0:GR, which was commented out in src/xlibi18n/lcCT.c default_ct_data, in favor of ISO8859-11 ESC sequence. So, declaring cs1 as ISO8859-11:GR instead makes it work. Besides, for th_TH.UTF-8, adding cs2 class with ISO10646-1 encoding also adds support for UTF-8 input. And, along discussion in the bug, a similar problem was found for fontset, too, by causing delays on X apps startups on systems without tis620-0 fonts. This is normally the case, as mkfontdir and mkfontscale generate iso8859-11 entries by default for Thai X fonts. So, Thai fontset charset is also patched. --- nls/th_TH.UTF-8/XLC_LOCALE.pre | 12 +++++++++--- nls/th_TH/XLC_LOCALE.pre | 6 +++--- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/nls/th_TH.UTF-8/XLC_LOCALE.pre b/nls/th_TH.UTF-8/XLC_LOCALE.pre index 9f1caf7..caede14 100644 --- a/nls/th_TH.UTF-8/XLC_LOCALE.pre +++ b/nls/th_TH.UTF-8/XLC_LOCALE.pre @@ -27,8 +27,8 @@ fs1 { } XCOMM fs1 class (Thai) fs2 { - charset TIS620-0:GR - font TIS620-0:GR + charset ISO8859-11:GR + font ISO8859-11:GR } END XLC_FONTSET @@ -69,7 +69,13 @@ cs1 { length 1 wc_encoding \x30000000 - ct_encoding TIS620-0:GR + ct_encoding ISO8859-11:GR +} + +XCOMM cs2 class +cs2 { + side none + ct_encoding ISO10646-1 } END XLC_XLOCALE diff --git a/nls/th_TH/XLC_LOCALE.pre b/nls/th_TH/XLC_LOCALE.pre index 7d55d85..c67d683 100644 --- a/nls/th_TH/XLC_LOCALE.pre +++ b/nls/th_TH/XLC_LOCALE.pre @@ -16,8 +16,8 @@ fs0 { } XCOMM fs1 class (Thai) fs1 { - charset TIS620-0:GR - font TIS620-0:GR + charset ISO8859-11:GR + font ISO8859-11:GR } END XLC_FONTSET @@ -61,7 +61,7 @@ cs1 { #else wc_encoding \x00008080 #endif - ct_encoding TIS620-0:GR + ct_encoding ISO8859-11:GR } END XLC_XLOCALE -- 1.6.2.2
From a2dde094e00d9955d57ff9af7d9c3dc265e68cf8 Mon Sep 17 00:00:00 2001 From: Theppitak Karoonboonyanan <t...@linux.thai.net> Date: Thu, 9 Apr 2009 11:47:55 +0700 Subject: [PATCH] Thai XIM not filters when NumLock or CapsLock is on X.Org Bug 12517 <http://bugs.freedesktop.org/show_bug.cgi?id=12517> Signed-off-by: Theppitak Karoonboonyanan <t...@linux.thai.net> The Thai XIM component in libx11 activated on 'th*' locales normally filters input sequence according to orthographic rules. However, when NumLock/CapsLock is on, this stops working. All sequences are passed through. This is caused by missing masks in _XimThaiFilter(), which normally screens out certain special keys from entering orthographic rules. Unfortunately, this included events with NumLock/CapsLock on. Negating the masks from the check allows the events to be tested by the rules. --- modules/im/ximcp/imThaiFlt.c | 18 +++++++++++++++++- 1 files changed, 17 insertions(+), 1 deletions(-) diff --git a/modules/im/ximcp/imThaiFlt.c b/modules/im/ximcp/imThaiFlt.c index 368ea5c..42a30d7 100644 --- a/modules/im/ximcp/imThaiFlt.c +++ b/modules/im/ximcp/imThaiFlt.c @@ -1236,6 +1236,22 @@ ThaiFltReplaceInput(Xic ic, unsigned char new_char, KeySym symbol) return True; } +Private unsigned +NumLockMask(Display *d) +{ + int i; + XModifierKeymap *map = XGetModifierMapping (d); + KeyCode numlock_keycode = XKeysymToKeycode (d, XK_Num_Lock); + if (numlock_keycode == NoSymbol) + return 0; + + for (i = 0; i < 8; i++) { + if (map->modifiermap[map->max_keypermod * i] == numlock_keycode) + return 1 << i; + } + return 0; +} + /* * Filter function for TACTIS */ @@ -1267,7 +1283,7 @@ _XimThaiFilter(Display *d, Window w, XEvent *ev, XPointer client_data) XwcLookupString((XIC)ic, &ev->xkey, wbuf, sizeof(wbuf) / sizeof(wbuf[0]), &symbol, NULL); - if ((ev->xkey.state & (AllMods & ~ShiftMask)) || + if ((ev->xkey.state & (AllMods & ~(ShiftMask|LockMask|NumLockMask(d)))) || ((symbol >> 8 == 0xFF) && ((XK_BackSpace <= symbol && symbol <= XK_Clear) || (symbol == XK_Return) || -- 1.6.2.2
From 1cf0fb16dc7fb2c3a14377d6b566af607db47b53 Mon Sep 17 00:00:00 2001 From: Theppitak Karoonboonyanan <t...@linux.thai.net> Date: Thu, 9 Apr 2009 12:01:07 +0700 Subject: [PATCH] Thai XIM not retrieve MB surrounding on UTF-8 LC X.Org But 12759 <http://bugs.freedesktop.org/show_bug.cgi?id=12759> Signed-off-by: Theppitak Karoonboonyanan <t...@linux.thai.net> On th_TH.UTF-8 locale, Thai XIM rejects all combining characters for GTK+ apps that use X Input Method. This is because GTK+ imxim immodule passes surrounding text in locale encoding, which is UTF-8 for UTF-8 locales. But current Thai XIM in Xlib assumes the multi-byte StringConversionText response for the StringConversionCallback to always be TIS-620, by retrieving a single byte and using it as-is. If the Thai XIM tries to convert the multi-byte text based on locale codeset before using it, it will work again. --- modules/im/ximcp/imThaiFlt.c | 32 ++++++++++++++++++++++++++++---- 1 files changed, 28 insertions(+), 4 deletions(-) diff --git a/modules/im/ximcp/imThaiFlt.c b/modules/im/ximcp/imThaiFlt.c index 42a30d7..645f0e6 100644 --- a/modules/im/ximcp/imThaiFlt.c +++ b/modules/im/ximcp/imThaiFlt.c @@ -560,13 +560,37 @@ IC_RealGetPreviousChar(Xic ic, unsigned short pos) { c = 0; } else { + Xim im; + XlcConv conv; + int from_left; + int to_left; + char *from_buf; + char *to_buf; + + im = (Xim) XIMOfIC((XIC)ic); if (screc.text->encoding_is_wchar) { - c = ucs2tis(screc.text->string.wcs[0]); - XFree(screc.text->string.wcs); + conv = _XlcOpenConverter(im->core.lcd, XlcNWideChar, + im->core.lcd, XlcNCharSet); + from_buf = (char *) screc.text->string.wcs; + from_left = screc.text->length * sizeof(wchar_t); } else { - c = screc.text->string.mbs[0]; - XFree(screc.text->string.mbs); + conv = _XlcOpenConverter(im->core.lcd, XlcNMultiByte, + im->core.lcd, XlcNCharSet); + from_buf = screc.text->string.mbs; + from_left = screc.text->length; } + to_buf = (char *)&c; + to_left = 1; + + _XlcResetConverter(conv); + if (_XlcConvert(conv, (XPointer *)&from_buf, &from_left, + (XPointer *)&to_buf, &to_left, NULL, 0) < 0) + { + c = (unsigned char) b->mb[b->tree[(ic)->private.local.context].mb]; + } + _XlcCloseConverter(conv); + + XFree(screc.text->string.mbs); } XFree(screc.text); return c; -- 1.6.2.2