From: Enlightenment S. <no-...@en...> - 2011-12-20 09:50:07
|
Log: From: Jihoon Kim <imf...@gm...> Subject: [E-devel] [PATCH] support to get style attribute of XIM module ATM, edje entry doesn't display the style of preedit string such as underline, reverse, and Highlight. It's because XIM module doesn't provide the style attribute. This patch is made for providing the style attibute information to entry or other editable widget. Author: raster Date: 2011-12-20 01:49:55 -0800 (Tue, 20 Dec 2011) New Revision: 66381 Trac: http://trac.enlightenment.org/e/changeset/66381 Modified: trunk/ecore/ChangeLog trunk/ecore/src/modules/immodules/xim/ecore_imf_xim.c Modified: trunk/ecore/ChangeLog =================================================================== --- trunk/ecore/ChangeLog 2011-12-20 09:37:52 UTC (rev 66380) +++ trunk/ecore/ChangeLog 2011-12-20 09:49:55 UTC (rev 66381) @@ -425,3 +425,8 @@ 2011-12-20 Carsten Haitzler (The Rasterman) * Fix probable leak for g_static_mutex's on some architectures + +2011-12-20 Jihoon Kim + + * Add XIM attribute support to Ecore_IMF + Modified: trunk/ecore/src/modules/immodules/xim/ecore_imf_xim.c =================================================================== --- trunk/ecore/src/modules/immodules/xim/ecore_imf_xim.c 2011-12-20 09:37:52 UTC (rev 66380) +++ trunk/ecore/src/modules/immodules/xim/ecore_imf_xim.c 2011-12-20 09:49:55 UTC (rev 66381) @@ -23,6 +23,8 @@ static Eina_List *open_ims = NULL; #endif +#define FEEDBACK_MASK (XIMReverse | XIMUnderline | XIMHighlight) + typedef struct _XIM_Im_Info XIM_Im_Info; struct _XIM_Im_Info { @@ -51,6 +53,7 @@ Eina_Bool finalizing; Eina_Bool has_focus; Eina_Bool in_toplevel; + XIMFeedback *feedbacks; XIMCallback preedit_start_cb; XIMCallback preedit_done_cb; @@ -63,6 +66,12 @@ void imf_context_data_destroy(Ecore_IMF_Context_Data *imf_context_data); #ifdef ENABLE_XIM +static void add_feedback_attr (Eina_List **attrs, + const char *str, + XIMFeedback feedback, + int start_pos, + int end_pos); + static void reinitialize_ic(Ecore_IMF_Context *ctx); static void reinitialize_all_ics(XIM_Im_Info *info); static void set_ic_client_window(Ecore_IMF_Context *ctx, @@ -99,6 +108,19 @@ XPointer call_data); #endif +static unsigned int +utf8_offset_to_index(const char *str, int offset) +{ + int index = 0; + int i; + for (i = 0; i < offset; i++) + { + eina_unicode_utf8_get_next(str, &index); + } + + return index; +} + static void _ecore_imf_context_xim_add(Ecore_IMF_Context *ctx) { @@ -204,6 +226,43 @@ } static void +_ecore_imf_context_xim_preedit_string_with_attributes_get(Ecore_IMF_Context *ctx, + char **str, + Eina_List **attrs, + int *cursor_pos) +{ + EINA_LOG_DBG("in"); + + Ecore_IMF_Context_Data *imf_context_data = ecore_imf_context_data_get(ctx); + + _ecore_imf_context_xim_preedit_string_get(ctx, str, cursor_pos); + + if (!attrs) return; + if (!imf_context_data || !imf_context_data->feedbacks) return; + + int i = 0; + XIMFeedback last_feedback = 0; + int start = -1; + + for (i = 0; i < imf_context_data->preedit_length; i++) + { + XIMFeedback new_feedback = imf_context_data->feedbacks[i] & FEEDBACK_MASK; + + if (new_feedback != last_feedback) + { + if (start >= 0) + add_feedback_attr (attrs, *str, last_feedback, start, i); + + last_feedback = new_feedback; + start = i; + } + } + + if (start >= 0) + add_feedback_attr (attrs, *str, last_feedback, start, i); +} + +static void _ecore_imf_context_xim_focus_in(Ecore_IMF_Context *ctx) { EINA_LOG_DBG("in"); @@ -291,11 +350,18 @@ XFree(preedit_attr); + if (imf_context_data->feedbacks) + { + free(imf_context_data->feedbacks); + imf_context_data->feedbacks = NULL; + } + 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); } @@ -333,6 +399,36 @@ } static void +add_feedback_attr (Eina_List **attrs, + const char *str, + XIMFeedback feedback, + int start_pos, + int end_pos) +{ + Ecore_IMF_Preedit_Attr *attr = NULL; + + unsigned int start_index = utf8_offset_to_index (str, start_pos); + unsigned int end_index = utf8_offset_to_index (str, end_pos); + + if (feedback & FEEDBACK_MASK) + { + attr = (Ecore_IMF_Preedit_Attr *)calloc(1, sizeof(Ecore_IMF_Preedit_Attr)); + attr->start_index = start_index; + attr->end_index = end_index; + *attrs = eina_list_append(*attrs, (void *)attr); + } + + if (feedback & XIMUnderline) + attr->preedit_type = ECORE_IMF_PREEDIT_TYPE_SUB1; + + if (feedback & XIMReverse) + attr->preedit_type = ECORE_IMF_PREEDIT_TYPE_SUB2; + + if (feedback & XIMHighlight) + attr->preedit_type = ECORE_IMF_PREEDIT_TYPE_SUB3; +} + +static void _ecore_imf_context_xim_cursor_location_set (Ecore_IMF_Context *ctx, int x, int y, int w, int h) { @@ -608,7 +704,7 @@ .use_preedit_set = _ecore_imf_context_xim_use_preedit_set, .input_mode_set = NULL, .filter_event = _ecore_imf_context_xim_filter_event, - .preedit_string_with_attributes_get = NULL, + .preedit_string_with_attributes_get = _ecore_imf_context_xim_preedit_string_with_attributes_get, .prediction_allow_set = NULL, .autocapital_type_set = NULL, .control_panel_show = NULL, @@ -712,6 +808,13 @@ XDestroyIC(imf_context_data->ic); free(imf_context_data->preedit_chars); + + if (imf_context_data->feedbacks) + { + free(imf_context_data->feedbacks); + imf_context_data->feedbacks = NULL; + } + free(imf_context_data->locale); free(imf_context_data); } @@ -811,6 +914,7 @@ Eina_Unicode *new_text = NULL; Eina_UStrbuf *preedit_bufs = NULL; int new_text_length; + int i = 0; preedit_bufs = eina_ustrbuf_new(); if(imf_context_data->preedit_chars) { @@ -854,6 +958,20 @@ imf_context_data->preedit_length = eina_unicode_strlen(imf_context_data->preedit_chars); + if (imf_context_data->feedbacks) + { + free(imf_context_data->feedbacks); + imf_context_data->feedbacks = NULL; + } + + if (imf_context_data->preedit_length > 0) + { + imf_context_data->feedbacks = calloc(imf_context_data->preedit_length, sizeof(XIMFeedback)); + + for (i = 0; i < imf_context_data->preedit_length; i++) + imf_context_data->feedbacks[i] = t->feedback[i]; + } + ecore_imf_context_preedit_changed_event_add(ctx); } |
From: Enlightenment S. <no-...@en...> - 2012-06-23 08:14:30
|
Log: fix xim immodule crash. Author: raster Date: 2012-06-23 01:14:23 -0700 (Sat, 23 Jun 2012) New Revision: 72716 Trac: http://trac.enlightenment.org/e/changeset/72716 Modified: trunk/ecore/ChangeLog trunk/ecore/src/modules/immodules/xim/ecore_imf_xim.c Modified: trunk/ecore/ChangeLog =================================================================== --- trunk/ecore/ChangeLog 2012-06-23 07:21:44 UTC (rev 72715) +++ trunk/ecore/ChangeLog 2012-06-23 08:14:23 UTC (rev 72716) @@ -767,3 +767,9 @@ 2012-06-22 Vincent Torri * ecore_exe: fix compilation on fedora 18. + +2012-06-23 Carsten Haitzler (The Rasterman) + + * Fix small problem with xim module and if xim input context is + destroyed. causes crashes next focus. track ic and set to NULL. + Modified: trunk/ecore/src/modules/immodules/xim/ecore_imf_xim.c =================================================================== --- trunk/ecore/src/modules/immodules/xim/ecore_imf_xim.c 2012-06-23 07:21:44 UTC (rev 72715) +++ trunk/ecore/src/modules/immodules/xim/ecore_imf_xim.c 2012-06-23 08:14:23 UTC (rev 72716) @@ -27,9 +27,13 @@ #define FEEDBACK_MASK (XIMReverse | XIMUnderline | XIMHighlight) typedef struct _XIM_Im_Info XIM_Im_Info; + +typedef struct _Ecore_IMF_Context_Data Ecore_IMF_Context_Data; + struct _XIM_Im_Info { Ecore_X_Window win; + Ecore_IMF_Context_Data *user; char *locale; XIM im; Eina_List *ics; @@ -39,7 +43,6 @@ Eina_Bool supports_cursor : 1; }; -typedef struct _Ecore_IMF_Context_Data Ecore_IMF_Context_Data; struct _Ecore_IMF_Context_Data { Ecore_X_Window win; @@ -56,6 +59,8 @@ Eina_Bool in_toplevel; XIMFeedback *feedbacks; + XIMCallback destroy_cb; + XIMCallback preedit_start_cb; XIMCallback preedit_done_cb; XIMCallback preedit_draw_cb; @@ -74,7 +79,6 @@ int end_pos); static void reinitialize_ic(Ecore_IMF_Context *ctx); -static void reinitialize_all_ics(XIM_Im_Info *info); static void set_ic_client_window(Ecore_IMF_Context *ctx, Ecore_X_Window window); static int preedit_start_callback(XIC xic, @@ -1335,16 +1339,6 @@ } static void -reinitialize_all_ics(XIM_Im_Info *info) -{ - Eina_List *tmp_list; - Ecore_IMF_Context *ctx; - - EINA_LIST_FOREACH (info->ics, tmp_list, ctx) - reinitialize_ic(ctx); -} - -static void set_ic_client_window(Ecore_IMF_Context *ctx, Ecore_X_Window window) { @@ -1364,6 +1358,8 @@ XIM_Im_Info *info; info = imf_context_data->im_info; info->ics = eina_list_remove(info->ics, imf_context_data); + if (imf_context_data->im_info) + imf_context_data->im_info->user = NULL; imf_context_data->im_info = NULL; } @@ -1377,6 +1373,8 @@ imf_context_data->im_info->ics = eina_list_prepend(imf_context_data->im_info->ics, imf_context_data); + if (imf_context_data->im_info) + imf_context_data->im_info->user = imf_context_data; } } @@ -1555,9 +1553,12 @@ XPointer call_data __UNUSED__) { XIM_Im_Info *info = (XIM_Im_Info *)client_data; + Eina_List *tmp_list; + Ecore_IMF_Context *ctx; + + if (info->user) info->user->ic = NULL; info->im = NULL; - - reinitialize_all_ics(info); +// reinitialize_ic(ctx); xim_info_try_im(info); return; |