Attached is a proposed patch to fix the XIM protocol in Thai XIM.
It's composed of:
- a patch to use safe values in Thai XIM which should work regardless of
  the signness of XIMStringConversionPosition, and in accordance with
  the re-interpretation of the protocol,
- a patch to Xlib.h to change typedef of XIMStringConversionPosition
  to (signed) short.

I have also prepared another patch for GTK+ imxim, which depends on
whether the latter patch to Xlib.h is applied. I'll post it as a follow-up
to GNOME bug #101814 soon.

-Thep.

On Mon, Feb 17, 2003 at 11:02:45PM +0700, Theppitak Karoonboonyanan wrote:
> Since the release date of XFree86 4.3.0 is very close, I think this
> issue needs clarification, rather than leaving it partially done.
> 
> If there is no objection, I will patch Xlib.h so
> XIMStringConversionPosition becomes (signed) short.
> 
> However, another question is raised:
> 
> How is the backward range boundary counted?
> 
> For example: given a text buffer
>   ABC|DE
>  [012|34] <-- index
> where '|' means caret position (currently 3),
> if I want to retrieve "BC", how should I pass the parameter?
>   a) position = 0, factor = 2, dir = BackwardChar
>   b) position = -1, factor = 2, dir = BackwardChar
> For a):
> because saying "starting position = 0" means absolute index 3, counting
> backward by factor 2 we get (3,1), sorting the range we get (1,3), and
> "BC" is got.
> For b):
> "starting position = -1" means absolute index 2, counting backward by
> factor 2 we get (2,0), and "CB" is got in that direction, meaning "BC" in
> logical order.
>  
> Thanks,
> -Thep.
diff -Nuar xc/lib/X11/imThaiFlt.c xc.thximconv3/lib/X11/imThaiFlt.c
--- xc/lib/X11/imThaiFlt.c      2003-02-20 17:14:49.000000000 +0700
+++ xc.thximconv3/lib/X11/imThaiFlt.c   2003-02-20 17:20:52.000000000 +0700
@@ -602,11 +602,11 @@
 #define IC_GetContextChar(ic) \
                (IC_RealGetPreviousChar(ic,2))
 #define IC_DeletePreviousChar(ic) \
-               (IC_RealDeletePreviousChar(ic,1))
+               (IC_RealDeletePreviousChar(ic))
 
 Private unsigned char
 #if NeedFunctionPrototypes
-IC_RealGetPreviousChar(Xic ic, XIMStringConversionPosition pos)
+IC_RealGetPreviousChar(Xic ic, unsigned short pos)
 #else
 IC_RealGetPreviousChar(ic, pos)
   Xic ic;
@@ -619,10 +619,13 @@
         XIMStringConversionCallbackStruct screc;
         unsigned char c;
 
-        screc.position = pos;
+        /* Use a safe value of position = 0 and stretch the range to desired
+         * place, as XIM protocol is unclear here whether it could be negative
+         */
+        screc.position = 0;
         screc.direction = XIMBackwardChar;
         screc.operation = XIMStringConversionRetrieval;
-        screc.factor = 1;
+        screc.factor = pos;
         screc.text = 0;
 
         (cb->callback)((XIC)ic, cb->client_data, (XPointer)&screc);
@@ -651,11 +654,10 @@
 
 Private unsigned char
 #if NeedFunctionPrototypes
-IC_RealDeletePreviousChar(Xic ic, XIMStringConversionPosition pos)
+IC_RealDeletePreviousChar(Xic ic)
 #else
-IC_RealDeletePreviousChar(ic, pos)
+IC_RealDeletePreviousChar(ic)
   Xic ic;
-  XIMStringConversionPosition pos;
 #endif
 {
     XICCallback* cb = &ic->core.string_conversion_callback;
@@ -664,7 +666,7 @@
         XIMStringConversionCallbackStruct screc;
         unsigned char c;
 
-        screc.position = pos;
+        screc.position = 0;
         screc.direction = XIMBackwardChar;
         screc.operation = XIMStringConversionSubstitution;
         screc.factor = 1;
diff -Nuar xc/lib/X11/Xlib.h xc.thximconv3/lib/X11/Xlib.h
--- xc/lib/X11/Xlib.h   2003-02-20 17:16:07.000000000 +0700
+++ xc.thximconv3/lib/X11/Xlib.h        2003-02-20 17:14:08.000000000 +0700
@@ -1303,7 +1303,7 @@
     } string; 
 } XIMStringConversionText;
 
-typedef        unsigned short  XIMStringConversionPosition;
+typedef        short           XIMStringConversionPosition;
 
 typedef        unsigned short  XIMStringConversionType;
 

Reply via email to