fix xim immodule crash.

SVN revision: 72716
This commit is contained in:
Carsten Haitzler 2012-06-23 08:14:23 +00:00
parent 01c382407b
commit de03851203
2 changed files with 21 additions and 14 deletions

View File

@ -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.

View File

@ -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;