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