summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJihoon Kim <jihoon48.kim@samsung.com>2014-10-01 19:45:10 +0900
committerJihoon Kim <jihoon48.kim@samsung.com>2014-10-06 08:19:55 +0900
commit1ca436f48ad9e874a7d4581ac3bf8448d73c9d8b (patch)
tree672d3e20ab998759d5e3978ed1268d0dab8262c6
parent6c74e367cb490feb63a2ac67f3bcb14df2c5730a (diff)
downloadefl-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.c57
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