static gunichar lx_tn_engine_get_prev_surrounding_char (LxTNEngine *lx_tn_engine, IBusEngine *ibus_engine) { if (is_client_support_surrounding (ibus_engine)) { IBusText *surrounding; guint cursor_pos; guint anchor_pos; gunichar *u_surrounding; gunichar ret = 0; ibus_engine_get_surrounding_text (ibus_engine, &surrounding, &cursor_pos, &anchor_pos); u_surrounding = g_utf8_to_ucs4 (ibus_text_get_text (surrounding), -1, NULL, NULL, NULL); if (u_surrounding) { ret = (cursor_pos > 0) ? u_surrounding[cursor_pos - 1] : 0; g_free (u_surrounding); } return ret; } return 0; }
static gboolean lx_tn_engine_convert_seq (LxTNEngine *lx_tn_engine, IBusEngine *ibus_engine, gunichar input_char) { if (is_client_support_surrounding (ibus_engine)) { IBusText *surrounding; guint cursor_pos; guint anchor_pos; LxTNConv conv; ibus_engine_get_surrounding_text (ibus_engine, &surrounding, &cursor_pos, &anchor_pos); if (lx_tn_im_conversion (ibus_text_get_text (surrounding), cursor_pos, anchor_pos, input_char, &conv)) { IBusText *text; ibus_engine_delete_surrounding_text (ibus_engine, conv.del_offset, -conv.del_offset); text = ibus_text_new_from_static_string (conv.commit_text); ibus_engine_commit_text (ibus_engine, text); return TRUE; } } return FALSE; }
static void ibus_hangul_engine_enable (IBusEngine *engine) { parent_class->enable (engine); ibus_engine_get_surrounding_text (engine, NULL, NULL, NULL); }
static void FcitxThaiGetPrevCell(FcitxThai* thai, struct thcell_t* res) { th_init_cell(res); if (is_client_support_surrounding(IBUS_ENGINE(libthai_engine))) { IBusText* surrounding; guint cursor_pos; guint anchor_pos; const gchar* s; gchar* tis_text = NULL; ibus_engine_get_surrounding_text(IBUS_ENGINE(libthai_engine), &surrounding, &cursor_pos, &anchor_pos); s = ibus_text_get_text(surrounding); cursor_pos = g_utf8_offset_to_pointer(s, cursor_pos) - s; while (*s) { const gchar* t; tis_text = g_convert(s, cursor_pos, "TIS-620", "UTF-8", NULL, NULL, NULL); if (tis_text) break; t = g_utf8_next_char(s); cursor_pos -= (t - s); s = t; } if (tis_text) { gint char_index; char_index = g_utf8_pointer_to_offset(s, s + cursor_pos); th_prev_cell((thchar_t*) tis_text, char_index, res, TRUE); g_free(tis_text); } } else { /* retrieve from the fallback buffer */ th_prev_cell(libthai_engine->char_buff, libthai_engine->buff_tail, res, TRUE); } }
static void ibus_m17n_engine_callback (MInputContext *context, MSymbol command) { IBusM17NEngine *m17n = NULL; m17n = context->arg; g_return_if_fail (m17n != NULL); /* the callback may be called in minput_create_ic, in the time * m17n->context has not be assigned, so need assign it. */ if (m17n->context == NULL) { m17n->context = context; } if (command == Minput_preedit_start) { ibus_engine_hide_preedit_text ((IBusEngine *)m17n); } else if (command == Minput_preedit_draw) { ibus_m17n_engine_update_preedit (m17n); } else if (command == Minput_preedit_done) { ibus_engine_hide_preedit_text ((IBusEngine *)m17n); } else if (command == Minput_status_start) { ibus_engine_hide_preedit_text ((IBusEngine *)m17n); } else if (command == Minput_status_draw) { gchar *status; status = ibus_m17n_mtext_to_utf8 (m17n->context->status); if (status && strlen (status)) { IBusText *text; text = ibus_text_new_from_string (status); ibus_property_set_label (m17n->status_prop, text); ibus_property_set_visible (m17n->status_prop, TRUE); } else { ibus_property_set_label (m17n->status_prop, NULL); ibus_property_set_visible (m17n->status_prop, FALSE); } ibus_engine_update_property ((IBusEngine *)m17n, m17n->status_prop); g_free (status); } else if (command == Minput_status_done) { } else if (command == Minput_candidates_start) { ibus_engine_hide_lookup_table ((IBusEngine *) m17n); ibus_engine_hide_auxiliary_text ((IBusEngine *) m17n); } else if (command == Minput_candidates_draw) { ibus_m17n_engine_update_lookup_table (m17n); } else if (command == Minput_candidates_done) { ibus_engine_hide_lookup_table ((IBusEngine *) m17n); ibus_engine_hide_auxiliary_text ((IBusEngine *) m17n); } else if (command == Minput_set_spot) { } else if (command == Minput_toggle) { } else if (command == Minput_reset) { } /* ibus_engine_get_surrounding_text is only available in the current git master (1.3.99+) */ #ifdef HAVE_IBUS_ENGINE_GET_SURROUNDING_TEXT else if (command == Minput_get_surrounding_text && (((IBusEngine *) m17n)->client_capabilities & IBUS_CAP_SURROUNDING_TEXT) != 0) { IBusText *text; guint cursor_pos, nchars, nbytes; MText *mt, *surround; int len, pos; ibus_engine_get_surrounding_text ((IBusEngine *) m17n, &text, &cursor_pos); nchars = ibus_text_get_length (text); nbytes = g_utf8_offset_to_pointer (text->text, nchars) - text->text; mt = mconv_decode_buffer (Mcoding_utf_8, text->text, nbytes); g_object_unref (text); len = (long) mplist_value (m17n->context->plist); if (len < 0) { pos = cursor_pos + len; if (pos < 0) pos = 0; surround = mtext_duplicate (mt, pos, cursor_pos); } else if (len > 0) { pos = cursor_pos + len; if (pos > nchars) pos = nchars; surround = mtext_duplicate (mt, cursor_pos, pos); } else { surround = mtext (); } m17n_object_unref (mt); mplist_set (m17n->context->plist, Mtext, surround); m17n_object_unref (surround); } #endif /* !HAVE_IBUS_ENGINE_GET_SURROUNDING_TEXT */ else if (command == Minput_delete_surrounding_text && (((IBusEngine *) m17n)->client_capabilities & IBUS_CAP_SURROUNDING_TEXT) != 0) { int len; len = (long) mplist_value (m17n->context->plist); if (len < 0) ibus_engine_delete_surrounding_text ((IBusEngine *) m17n, len, -len); else if (len > 0) ibus_engine_delete_surrounding_text ((IBusEngine *) m17n, 0, len); } }
static void ibus_hangul_engine_update_hanja_list (IBusHangulEngine *hangul) { gchar* hanja_key; gchar* preedit_utf8; const ucschar* hic_preedit; UString* preedit; int lookup_method; IBusText* ibus_text = NULL; guint cursor_pos = 0; guint anchor_pos = 0; if (hangul->hanja_list != NULL) { hanja_list_delete (hangul->hanja_list); hangul->hanja_list = NULL; } hic_preedit = hangul_ic_get_preedit_string (hangul->context); hanja_key = NULL; lookup_method = LOOKUP_METHOD_PREFIX; preedit = ustring_dup (hangul->preedit); ustring_append_ucs4 (preedit, hic_preedit, -1); if (ustring_length(preedit) > 0) { preedit_utf8 = ustring_to_utf8 (preedit, -1); if (word_commit || hangul->hanja_mode) { hanja_key = preedit_utf8; lookup_method = LOOKUP_METHOD_PREFIX; } else { gchar* substr; ibus_engine_get_surrounding_text ((IBusEngine *)hangul, &ibus_text, &cursor_pos, &anchor_pos); substr = h_ibus_text_get_substring (ibus_text, cursor_pos - 64, cursor_pos); if (substr != NULL) { hanja_key = g_strconcat (substr, preedit_utf8, NULL); g_free (preedit_utf8); } else { hanja_key = preedit_utf8; } lookup_method = LOOKUP_METHOD_SUFFIX; } } else { ibus_engine_get_surrounding_text ((IBusEngine *)hangul, &ibus_text, &cursor_pos, &anchor_pos); if (cursor_pos != anchor_pos) { // If we have selection in surrounding text, we use that. hanja_key = h_ibus_text_get_substring (ibus_text, cursor_pos, anchor_pos); lookup_method = LOOKUP_METHOD_EXACT; } else { hanja_key = h_ibus_text_get_substring (ibus_text, cursor_pos - 64, cursor_pos); lookup_method = LOOKUP_METHOD_SUFFIX; } } if (hanja_key != NULL) { hangul->hanja_list = ibus_hangul_engine_lookup_hanja_table (hanja_key, lookup_method); hangul->last_lookup_method = lookup_method; g_free (hanja_key); } ustring_delete (preedit); if (ibus_text != NULL) g_object_unref (ibus_text); }