Hi JihoonKim, and EFL developers.

I attach a patch for fixing some XIM module bugs.

  - fix showing previous preedit string bug.
  - delete compile warning(thanks JihoonKim)
  -  fix some sequence issue to send preedit changed event and commit
event.(thanks JihoonKim)

Please review this patch?

Regards.

2011年7月22日23:52 Naruto TAKAHASHI <tnar...@gmail.com>:
> Hi, JihoonKim.
>
> I talked to you how fix "preedit draw callback " direction on IRC.
> I repeat to talk this stuff for didn't see this talk.
>
> Your patch behavior is no problem.
> But Preedit Draw Callback needs insert, delete, and replace by
> referencing Preedit Draw Callback argument.
> (detail: 
> http://static.cray-cyber.org/Documentation/NEC_SX_R10_1/G1AE02E/CHAP13.HTML#13.18.6.
> Preedit Draw Callback)
>
> I'm trying to fix too easy routine by using Eina_UStrBuf, now.
>
> So, please wait this.
> Off course, I merge deleting comple warning of your patch with thanks. :)
>
> Thanks.
>
> 2011/7/17 Jihoon Kim <imfin...@gmail.com>:
>> Hi, Naruto.
>> As I told you last Friday on IRC, I guess there are some bugs in your xim
>> immodule.
>> For example, in case that I'd like to input '私の' (watasino), the preedit
>> string was got from your immodule like below
>> '私のしの'.
>> In addition, there are some sequence issue to send preedit changed event and
>> commit event.
>> I've tried to fix this problem and send you the patch.
>> (I've tested on elementary_test > entry)
>> If you don't mind uploading this patch to svn, I'll request Maintainers to
>> upload this patch.
>> Thanks.
>> On Sun, Jul 10, 2011 at 2:51 AM, Naruto TAKAHASHI <tnar...@gmail.com> wrote:
>>>
>>> Hi Mike.
>>>
>>> Thanks, feedback. I merged it to xim/Makefile.am.
>>>
>>> I attach a source code for using XIM module debug.
>>> This program can check a below behaviors.
>>>
>>>  - toggle enable and disable XIM
>>>  - commit string from XIM
>>>
>>> Another test, by using Desktop Entry Editor's text field.
>>> (Enlightenment Main->Settings->Settings Panel->New Application)
>>>
>>> When executing test program, set ECORE_IMF_MODULE=xim.
>>>
>>> Thanks.
>>>
>>> 2011/7/8 Mike McCormack <mj.mccorm...@samsung.com>:
>>> > On 07/08/2011 03:15 PM, Naruto TAKAHASHI wrote:
>>> >> Hi, All.
>>> >>
>>> >> I attached some patches of XIM module of ecore_imf.
>>> >>
>>> >> As far as I know, EFL has not having official ecore_imf module in E
>>> >> repository. And ecore_x has XIM code but is unavailable condition.
>>> >> So I moved XIM code of ecore_x as ecore_imf module.
>>> >>
>>> >> please review this patches.
>>> >
>>> > Hello Naruto,
>>> >
>>> > Looks like nice work.
>>> >
>>> > I applied your patches to my ecore and built, but there was a build
>>> > error (fix below):
>>> >
>>> > make[5]: Entering directory
>>> > `/home/mike/git/e/ecore/src/modules/immodules/xim'
>>> >  CC     xim_la-ecore_imf_xim.lo
>>> > ecore_imf_xim.c:5:18: error: Evas.h: No such file or directory
>>> > ecore_imf_xim.c: In function ‘_ecore_x_event_reverse_locks’:
>>> > ecore_imf_xim.c:359: warning: suggest braces around empty body in an
>>> > ‘if’ statement
>>> > ecore_imf_xim.c: In function ‘preedit_start_callback’:
>>> > ecore_imf_xim.c:662: warning: unused parameter ‘xic’
>>> > ecore_imf_xim.c:664: warning: unused parameter ‘call_data’
>>> >
>>> > How can I test it?
>>> >
>>> > thanks,
>>> >
>>> > Mike
>>> >
>>> >
>>> >
>>> > diff --git a/ecore/src/modules/immodules/xim/Makefile.am
>>> > b/ecore/src/modules/immodules/xim/Makefile.am
>>> > index 006035c..cc0682d 100644
>>> > --- a/ecore/src/modules/immodules/xim/Makefile.am
>>> > +++ b/ecore/src/modules/immodules/xim/Makefile.am
>>> > @@ -12,6 +12,7 @@ AM_CPPFLAGS = \
>>> >  -I$(top_builddir)/src/lib/ecore_imf \
>>> >  -DPACKAGE_LIB_DIR=\"$(libdir)\" \
>>> >  -DPACKAGE_DATA_DIR=\"$(datadir)/$(PACKAGE)\" \
>>> > +@EVAS_CFLAGS@ \
>>> >  @EINA_CFLAGS@
>>> >
>>> >  pkgdir = $(libdir)/ecore/immodules
>>> >
>>> >
>>> >
>>> > ------------------------------------------------------------------------------
>>> > All of the data generated in your IT infrastructure is seriously
>>> > valuable.
>>> > Why? It contains a definitive record of application performance,
>>> > security
>>> > threats, fraudulent activity, and more. Splunk takes this data and makes
>>> > sense of it. IT sense. And common sense.
>>> > http://p.sf.net/sfu/splunk-d2d-c2
>>> > _______________________________________________
>>> > enlightenment-devel mailing list
>>> > enlightenment-devel@lists.sourceforge.net
>>> > https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
>>> >
>>>
>>>
>>>
>>> --
>>> Naruto TAKAHASHI
>>> tnar...@gmail.com
>>>
>>>
>>> ------------------------------------------------------------------------------
>>> All of the data generated in your IT infrastructure is seriously valuable.
>>> Why? It contains a definitive record of application performance, security
>>> threats, fraudulent activity, and more. Splunk takes this data and makes
>>> sense of it. IT sense. And common sense.
>>> http://p.sf.net/sfu/splunk-d2d-c2
>>> _______________________________________________
>>> enlightenment-devel mailing list
>>> enlightenment-devel@lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel
>>>
>>
>>
>
>
>
> --
> Naruto TAKAHASHI
> tnar...@gmail.com
>



-- 
Naruto TAKAHASHI
tnar...@gmail.com
diff --git a/ecore/src/modules/immodules/xim/ecore_imf_xim.c b/ecore/src/modules/immodules/xim/ecore_imf_xim.c
index 2445fb7..9d3de2f 100644
--- a/ecore/src/modules/immodules/xim/ecore_imf_xim.c
+++ b/ecore/src/modules/immodules/xim/ecore_imf_xim.c
@@ -45,7 +45,6 @@ struct _Ecore_IMF_Context_Data
    char          *locale;
    XIM_Im_Info   *im_info;
    int            preedit_length;
-   int            preedit_size;
    int            preedit_cursor;
    Eina_Unicode  *preedit_chars;
    Eina_Bool      use_preedit;
@@ -282,6 +281,14 @@ _ecore_imf_context_xim_reset(Ecore_IMF_Context *ctx)
 
    XFree(preedit_attr);
 
+   if(imf_context_data->preedit_length)
+     {
+        imf_context_data->preedit_length = 0;
+        free(imf_context_data->preedit_chars);
+        imf_context_data->preedit_chars = NULL;
+        ecore_imf_context_preedit_changed_event_add(ctx);
+     }
+
    if(result)
      {
          char *result_utf8 = strdup(result);
@@ -292,12 +299,6 @@ _ecore_imf_context_xim_reset(Ecore_IMF_Context *ctx)
            }
      }
 
-   if(imf_context_data->preedit_length)
-     {
-        imf_context_data->preedit_length = 0;
-        ecore_imf_context_preedit_changed_event_add(ctx);
-     }
-
    XFree (result);
 #endif
 }
@@ -358,8 +359,10 @@ _ecore_x_event_reverse_locks(unsigned int state)
    if(state & ECORE_IMF_KEYBOARD_LOCK_CAPS)
      locks |= LockMask;
 
+#if 0                           /* FIXME: add mask. */
    if(state & ECORE_IMF_KEYBOARD_LOCK_SCROLL)
-     ;  /* XXX */
+     ;
+#endif
 
    return locks;
 }
@@ -666,14 +669,15 @@ imf_context_data_destroy(Ecore_IMF_Context_Data *imf_context_data)
    if(imf_context_data->ic)
      XDestroyIC(imf_context_data->ic);
 
+   free(imf_context_data->preedit_chars);
    free(imf_context_data->locale);
    free(imf_context_data);
 }
 
 static int
-preedit_start_callback(XIC      xic,
+preedit_start_callback(XIC      xic __UNUSED__,
                        XPointer client_data,
-                       XPointer call_data)
+                       XPointer call_data __UNUSED__)
 {
    EINA_LOG_DBG("in");
    Ecore_IMF_Context *ctx = (Ecore_IMF_Context *)client_data;
@@ -687,9 +691,9 @@ preedit_start_callback(XIC      xic,
 }
 
 static void
-preedit_done_callback(XIC      xic,
+preedit_done_callback(XIC      xic __UNUSED__,
                       XPointer client_data,
-                      XPointer call_data)
+                      XPointer call_data __UNUSED__)
 {
    EINA_LOG_DBG("in");
    Ecore_IMF_Context *ctx = (Ecore_IMF_Context *)client_data;
@@ -699,6 +703,8 @@ preedit_done_callback(XIC      xic,
    if(imf_context_data->preedit_length)
      {
         imf_context_data->preedit_length = 0;
+        free(imf_context_data->preedit_chars);
+        imf_context_data->preedit_chars = NULL;
         ecore_imf_context_preedit_changed_event_add(ctx);
      }
 
@@ -708,7 +714,7 @@ preedit_done_callback(XIC      xic,
 
 /* FIXME */
 static int
-xim_text_to_utf8(Ecore_IMF_Context *ctx,
+xim_text_to_utf8(Ecore_IMF_Context *ctx __UNUSED__,
                  XIMText           *xim_text,
                  char             **text)
 {
@@ -750,27 +756,25 @@ xim_text_to_utf8(Ecore_IMF_Context *ctx,
 }
 
 static void
-preedit_draw_callback(XIC                           xic,
+preedit_draw_callback(XIC                           xic __UNUSED__,
                       XPointer                      client_data,
                       XIMPreeditDrawCallbackStruct *call_data)
 {
    EINA_LOG_DBG("in");
+   Eina_Bool ret = EINA_FALSE;
    Ecore_IMF_Context *ctx = (Ecore_IMF_Context *)client_data;
    Ecore_IMF_Context_Data *imf_context_data = ecore_imf_context_data_get(ctx);
    XIMText *t = call_data->text;
    char *tmp;
    Eina_Unicode *new_text = NULL;
-   int new_length;
+   Eina_UStrbuf *preedit_bufs = NULL;
    int new_text_length;
-   int diff;
-   int chg_first;
-   int chg_length;
-   int i;
 
-   /* XXX */
-   chg_first = CLAMP(call_data->chg_first, 0, imf_context_data->preedit_length);
-   chg_length = CLAMP(call_data->chg_length, 0,
-                      imf_context_data->preedit_length - chg_first);
+   preedit_bufs = eina_ustrbuf_new();
+   if(imf_context_data->preedit_chars) {
+      ret = eina_ustrbuf_append(preedit_bufs, imf_context_data->preedit_chars);
+      if(ret == EINA_FALSE) goto done;
+   }
 
    new_text_length = xim_text_to_utf8(ctx, t, &tmp);
    if(tmp)
@@ -780,56 +784,41 @@ preedit_draw_callback(XIC                           xic,
         free(tmp);
      }
 
-   diff = new_text_length - chg_length;
-   new_length = imf_context_data->preedit_length + diff;
-   if(new_length > imf_context_data->preedit_size)
-     {
-        Eina_Unicode *tmp_chars = NULL;
-        imf_context_data->preedit_size = new_length;
+   if(t == NULL) {
+      /* delete string */
+      ret = eina_ustrbuf_remove(preedit_bufs,
+                                call_data->chg_first, call_data->chg_length);
+   } else if(call_data->chg_length == 0) {
+      /* insert string */
+      ret = eina_ustrbuf_insert(preedit_bufs, new_text, call_data->chg_first);
+   } else if(call_data->chg_length > 0) {
+      /* replace string */
+      ret = eina_ustrbuf_remove(preedit_bufs,
+                                call_data->chg_first, call_data->chg_length);
+      if(ret == EINA_FALSE) goto done;
+
+      ret = eina_ustrbuf_insert_n(preedit_bufs, new_text, 
+                                  new_text_length, call_data->chg_first);
+      if(ret == EINA_FALSE) goto done;
+   } else {
+      ret = EINA_FALSE;
+   }
+
+ done:
+   if(ret == EINA_TRUE) {
+      free(imf_context_data->preedit_chars);
+      imf_context_data->preedit_chars = 
+          eina_ustrbuf_string_steal(preedit_bufs);
+      imf_context_data->preedit_length =
+          eina_unicode_strlen(imf_context_data->preedit_chars);
+   }
 
-        if(imf_context_data->preedit_chars)
-          {
-             tmp_chars = eina_unicode_strdup(imf_context_data->preedit_chars);
-             free(imf_context_data->preedit_chars);
-             imf_context_data->preedit_chars = calloc(new_length + 1,
-                                                      sizeof(Eina_Unicode));
-             eina_unicode_strcpy(imf_context_data->preedit_chars, tmp_chars);
-             free(tmp_chars);
-          }
-        else {
-             imf_context_data->preedit_chars = calloc(new_length + 1,
-                                                      sizeof(Eina_Unicode));
-          }
-        // XXX feedback?
-     }
-
-   if(diff < 0)
-     {
-        for(i = chg_first + chg_length; i < imf_context_data->preedit_length; i++) {
-             imf_context_data->preedit_chars[i + diff] =
-               imf_context_data->preedit_chars[i];
-          }
-     }
-   else {
-        for(i = imf_context_data->preedit_length - 1; i >= chg_first + chg_length; i--) {
-             imf_context_data->preedit_chars[i + diff] =
-               imf_context_data->preedit_chars[i];
-          }
-     }
-
-   for(i = 0; i < new_text_length; i++) {
-        imf_context_data->preedit_chars[chg_first + i] = new_text[i];
-     }
-
-   imf_context_data->preedit_length += diff;
    free(new_text);
-
-   if(imf_context_data->finalizing == EINA_FALSE)
-     ecore_imf_context_preedit_changed_event_add(ctx);
+   eina_ustrbuf_free(preedit_bufs);
 }
 
 static void
-preedit_caret_callback(XIC                            xic,
+preedit_caret_callback(XIC                            xic __UNUSED__,
                        XPointer                       client_data,
                        XIMPreeditCaretCallbackStruct *call_data)
 {
@@ -937,6 +926,8 @@ reinitialize_ic(Ecore_IMF_Context *ctx)
         if(imf_context_data->preedit_length)
           {
              imf_context_data->preedit_length = 0;
+             free(imf_context_data->preedit_chars);
+             imf_context_data->preedit_chars = NULL;
              ecore_imf_context_preedit_changed_event_add(ctx);
           }
      }
@@ -1053,8 +1044,8 @@ xim_info_try_im(XIM_Im_Info *info)
 }
 
 static void
-xim_info_display_closed(Ecore_X_Display *display,
-                        int              is_error,
+xim_info_display_closed(Ecore_X_Display *display __UNUSED__,
+                        int              is_error __UNUSED__,
                         XIM_Im_Info     *info)
 {
    Eina_List *ics, *tmp_list;
@@ -1085,7 +1076,7 @@ xim_info_display_closed(Ecore_X_Display *display,
 static void
 xim_instantiate_callback(Display *display,
                          XPointer client_data,
-                         XPointer call_data)
+                         XPointer call_data __UNUSED__)
 {
    XIM_Im_Info *info = (XIM_Im_Info *)client_data;
    XIM im = NULL;
@@ -1146,9 +1137,9 @@ setup_im(XIM_Im_Info *info)
 }
 
 static void
-xim_destroy_callback(XIM      xim,
+xim_destroy_callback(XIM      xim __UNUSED__,
                      XPointer client_data,
-                     XPointer call_data)
+                     XPointer call_data __UNUSED__)
 {
    XIM_Im_Info *info = (XIM_Im_Info *)client_data;
    info->im = NULL;
------------------------------------------------------------------------------
Storage Efficiency Calculator
This modeling tool is based on patent-pending intellectual property that
has been used successfully in hundreds of IBM storage optimization engage-
ments, worldwide.  Store less, Store more with what you own, Move data to 
the right place. Try It Now! http://www.accelacomm.com/jaw/sfnl/114/51427378/
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to