char *locale;
XIM_Im_Info *im_info;
int preedit_length;
- int preedit_size;
int preedit_cursor;
Eina_Unicode *preedit_chars;
Eina_Bool use_preedit;
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);
}
}
- if(imf_context_data->preedit_length)
- {
- imf_context_data->preedit_length = 0;
- ecore_imf_context_preedit_changed_event_add(ctx);
- }
-
XFree (result);
#endif
}
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);
}
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)
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(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];
- }
+ 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);
+ }
- 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
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);
}
}