diff options
author | Jihoon Kim <jihoon48.kim@samsung.com> | 2014-10-01 19:45:10 +0900 |
---|---|---|
committer | Jihoon Kim <jihoon48.kim@samsung.com> | 2014-10-06 08:19:55 +0900 |
commit | 1ca436f48ad9e874a7d4581ac3bf8448d73c9d8b (patch) | |
tree | 672d3e20ab998759d5e3978ed1268d0dab8262c6 | |
parent | 6c74e367cb490feb63a2ac67f3bcb14df2c5730a (diff) | |
download | efl-1ca436f48ad9e874a7d4581ac3bf8448d73c9d8b.tar.gz |
ecore_imf/ibus : provide to get surrounding text
It's important for languages such as Thai where only some sequences of characters are allowed.
@fix
-rw-r--r-- | src/modules/ecore_imf/ibus/ibus_imcontext.c | 57 |
1 files changed, 56 insertions, 1 deletions
diff --git a/src/modules/ecore_imf/ibus/ibus_imcontext.c b/src/modules/ecore_imf/ibus/ibus_imcontext.c index c735ce2153..c7cedeb66a 100644 --- a/src/modules/ecore_imf/ibus/ibus_imcontext.c +++ b/src/modules/ecore_imf/ibus/ibus_imcontext.c @@ -214,6 +214,53 @@ _ecore_imf_ibus_process_key_event_done(GObject *object, free(event); } +static void +_request_surrounding_text(IBusIMContext *ibusimcontext) +{ + EINA_SAFETY_ON_NULL_RETURN(ibusimcontext); + EINA_SAFETY_ON_NULL_RETURN(ibusimcontext->ibuscontext); + EINA_SAFETY_ON_NULL_RETURN(ibusimcontext->ctx); + + if ((ibusimcontext->caps & IBUS_CAP_SURROUNDING_TEXT) != 0 && + ibus_input_context_needs_surrounding_text(ibusimcontext->ibuscontext)) + { + char *surrounding = NULL; + int cursor_pos; + IBusText *ibustext; + + EINA_LOG_DBG ("requesting surrounding text...\n"); + + if (ecore_imf_context_surrounding_get(ibusimcontext->ctx, + &surrounding, + &cursor_pos)) + { + if (!surrounding) + return; + + if (cursor_pos < 0) + { + free(surrounding); + return; + } + + ibustext = ibus_text_new_from_string (surrounding); + + ibus_input_context_set_surrounding_text(ibusimcontext->ibuscontext, + ibustext, + cursor_pos, + cursor_pos); + + free(surrounding); + } + else + { + ibusimcontext->caps &= ~IBUS_CAP_SURROUNDING_TEXT; + ibus_input_context_set_capabilities(ibusimcontext->ibuscontext, + ibusimcontext->caps); + } + } +} + EAPI void ecore_imf_context_ibus_add(Ecore_IMF_Context *ctx) { @@ -242,7 +289,7 @@ ecore_imf_context_ibus_add(Ecore_IMF_Context *ctx) ibusimcontext->ibuscontext = NULL; ibusimcontext->has_focus = EINA_FALSE; - ibusimcontext->caps = IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_FOCUS | IBUS_CAP_SURROUNDING_TEXT; + ibusimcontext->caps = IBUS_CAP_PREEDIT_TEXT | IBUS_CAP_FOCUS | IBUS_CAP_SURROUNDING_TEXT;; ibusimcontext->ctx = ctx; s = getenv("IBUS_ENABLE_SYNC_MODE"); @@ -342,6 +389,8 @@ ecore_imf_context_ibus_filter_event(Ecore_IMF_Context *ctx, Ecore_IMF_Event_Type if (ev->timestamp == 0) return EINA_FALSE; + _request_surrounding_text(ibusimcontext); + keycode = ecore_x_keysym_keycode_get(ev->key); keysym = XStringToKeysym(ev->key); state = _ecore_imf_modifier_to_ibus_modifier(ev->modifiers) | @@ -397,6 +446,8 @@ ecore_imf_context_ibus_focus_in(Ecore_IMF_Context *ctx) if (ibusimcontext->ibuscontext) ibus_input_context_focus_in(ibusimcontext->ibuscontext); + _request_surrounding_text(ibusimcontext); + if (_focus_im_context != ctx) _focus_im_context = ctx; } @@ -614,6 +665,8 @@ _ecore_imf_context_ibus_commit_text_cb(IBusInputContext *ibuscontext EINA_UNUSED { ecore_imf_context_commit_event_add(ibusimcontext->ctx, text->text); ecore_imf_context_event_callback_call(ibusimcontext->ctx, ECORE_IMF_CALLBACK_COMMIT, (void *)commit_str); + + _request_surrounding_text(ibusimcontext); } } @@ -831,6 +884,8 @@ _ecore_imf_context_ibus_show_preedit_text_cb(IBusInputContext *ibuscontext EINA_ // call preedit changed ecore_imf_context_preedit_changed_event_add(ibusimcontext->ctx); ecore_imf_context_event_callback_call(ibusimcontext->ctx, ECORE_IMF_CALLBACK_PREEDIT_CHANGED, NULL); + + _request_surrounding_text(ibusimcontext); } static void |