From de0385120318c128a0a73c3c22b1e43e121fc494 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Sat, 23 Jun 2012 08:14:23 +0000 Subject: [PATCH] fix xim immodule crash. SVN revision: 72716 --- legacy/ecore/ChangeLog | 6 ++++ .../src/modules/immodules/xim/ecore_imf_xim.c | 29 ++++++++++--------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/legacy/ecore/ChangeLog b/legacy/ecore/ChangeLog index 549ad19ce8..2296f821c7 100644 --- a/legacy/ecore/ChangeLog +++ b/legacy/ecore/ChangeLog @@ -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. + diff --git a/legacy/ecore/src/modules/immodules/xim/ecore_imf_xim.c b/legacy/ecore/src/modules/immodules/xim/ecore_imf_xim.c index 8789b6785b..23e373c379 100644 --- a/legacy/ecore/src/modules/immodules/xim/ecore_imf_xim.c +++ b/legacy/ecore/src/modules/immodules/xim/ecore_imf_xim.c @@ -27,9 +27,13 @@ static Eina_List *open_ims = NULL; #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 @@ struct _XIM_Im_Info 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 @@ struct _Ecore_IMF_Context_Data 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 @@ static void add_feedback_attr(Eina_List **attrs, 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, @@ -1334,16 +1338,6 @@ reinitialize_ic(Ecore_IMF_Context *ctx) } } -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 @@ set_ic_client_window(Ecore_IMF_Context *ctx, 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 @@ set_ic_client_window(Ecore_IMF_Context *ctx, 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 @@ xim_destroy_callback(XIM xim __UNUSED__, XPointer call_data __UNUSED__) { XIM_Im_Info *info = (XIM_Im_Info *)client_data; - info->im = NULL; + Eina_List *tmp_list; + Ecore_IMF_Context *ctx; - reinitialize_all_ics(info); + if (info->user) info->user->ic = NULL; + info->im = NULL; +// reinitialize_ic(ctx); xim_info_try_im(info); return;