static void ibus_hangul_engine_init (IBusHangulEngine *hangul) { IBusProperty* prop; IBusText* label; IBusText* tooltip; hangul->context = hangul_ic_new (hangul_keyboard->str); hangul_ic_connect_callback (hangul->context, "transition", ibus_hangul_engine_on_transition, hangul); hangul->preedit = ustring_new(); hangul->hanja_list = NULL; hangul->hangul_mode = TRUE; hangul->hanja_mode = FALSE; hangul->last_lookup_method = LOOKUP_METHOD_PREFIX; hangul->prop_list = ibus_prop_list_new (); g_object_ref_sink (hangul->prop_list); label = ibus_text_new_from_string (_("Hanja lock")); tooltip = ibus_text_new_from_string (_("Enable/Disable Hanja mode")); prop = ibus_property_new ("hanja_mode", PROP_TYPE_TOGGLE, label, NULL, tooltip, TRUE, TRUE, PROP_STATE_UNCHECKED, NULL); g_object_ref_sink (prop); ibus_prop_list_append (hangul->prop_list, prop); hangul->prop_hanja_mode = prop; label = ibus_text_new_from_string (_("Setup")); tooltip = ibus_text_new_from_string (_("Configure hangul engine")); prop = ibus_property_new ("setup", PROP_TYPE_NORMAL, label, "gtk-preferences", tooltip, TRUE, TRUE, PROP_STATE_UNCHECKED, NULL); ibus_prop_list_append (hangul->prop_list, prop); hangul->table = ibus_lookup_table_new (9, 0, TRUE, FALSE); g_object_ref_sink (hangul->table); g_signal_connect (config, "value-changed", G_CALLBACK(ibus_config_value_changed), hangul); }
void refresh_aux_text(IBusChewingEngine * self) { if (!ibus_chewing_engine_has_capabilite(self, IBUS_CAP_AUXILIARY_TEXT)) { return; } IBUS_CHEWING_LOG(INFO, "refresh_aux_text()"); gchar *auxStr; if (self->auxText != NULL) { g_object_unref(self->auxText); } if (chewing_aux_Length(self->icPreEdit->context) > 0) { auxStr = chewing_aux_String(self->icPreEdit->context); IBUS_CHEWING_LOG(INFO, "update_aux_text() auxStr=%s", auxStr); } else { IBUS_CHEWING_LOG(INFO, "update_aux_text() bpmf_check=%x", ibus_chewing_bopomofo_check(self-> icPreEdit->context)); gchar *bpmfStr = ibus_chewing_pre_edit_get_bopomofo_string(self->icPreEdit); IBUS_CHEWING_LOG(INFO, "update_aux_text() bpmfStr=%s", bpmfStr); self->auxText = g_object_ref_sink(ibus_text_new_from_string(bpmfStr)); g_free(bpmfStr); } }
guint ibus_chewing_lookup_table_update(IBusLookupTable * iTable, IBusChewingProperties * iProperties, ChewingContext * context) { ibus_chewing_lookup_table_resize(iTable, iProperties, context); IBusText *iText = NULL; guint i; gint choicePerPage = chewing_cand_ChoicePerPage(context); gint totalChoice = chewing_cand_TotalChoice(context); gint currentPage = chewing_cand_CurrentPage(context); IBUS_CHEWING_LOG(INFO, "***** ibus_chewing_lookup_table_update(): choicePerPage=%d, totalChoice=%d, currentPage=%d", choicePerPage, totalChoice, currentPage); chewing_cand_Enumerate(context); for (i = 0; i < choicePerPage; i++) { if (chewing_cand_hasNext(context)) { gchar *candidate = chewing_cand_String(context); iText = g_object_ref_sink(ibus_text_new_from_string(candidate)); ibus_lookup_table_append_candidate(iTable, iText); g_free(candidate); g_object_unref(iText); } else { break; } } return i; }
IBusText *decorate_pre_edit(IBusChewingPreEdit * icPreEdit, IBusCapabilite capabilite) { gchar *preEdit = ibus_chewing_pre_edit_get_pre_edit(icPreEdit); IBusText *iText = g_object_ref_sink(ibus_text_new_from_string(preEdit)); gint chiSymbolCursor = chewing_cursor_Current(icPreEdit->context); IBUS_CHEWING_LOG(DEBUG, "decorate_pre_edit() cursor=%d preEdit=%s", chiSymbolCursor, preEdit); gint charLen = (gint) g_utf8_strlen(preEdit, -1); gint cursorRight = chiSymbolCursor + icPreEdit->bpmfLen; IBUS_CHEWING_LOG(DEBUG, "decorate_pre_edit() charLen=%d cursorRight=%d", charLen, cursorRight); IntervalType it; chewing_interval_Enumerate(icPreEdit->context); /* Add double lines on chewing interval that contains cursor */ /* Add single line on other chewing interval */ while (chewing_interval_hasNext(icPreEdit->context)) { chewing_interval_Get(icPreEdit->context, &it); if (it.from <= chiSymbolCursor && chiSymbolCursor <= it.to) { ibus_text_append_attribute(iText, IBUS_ATTR_TYPE_UNDERLINE, IBUS_ATTR_UNDERLINE_DOUBLE, it.from, it.to + 1); } else { ibus_text_append_attribute(iText, IBUS_ATTR_TYPE_UNDERLINE, IBUS_ATTR_UNDERLINE_SINGLE, it.from, it.to + 1); } } if (!mkdg_has_flag(capabilite, IBUS_CAP_SURROUNDING_TEXT) || !mkdg_has_flag(capabilite, IBUS_CAP_AUXILIARY_TEXT)) { /* Cannot change color when if the client is not capable * of showing surrounding text or auxiliary text */ return iText; } /* Show current cursor in red */ ibus_text_append_attribute(iText, IBUS_ATTR_TYPE_BACKGROUND, 0x00ff0000, chiSymbolCursor, chiSymbolCursor + 1); return iText; }
static void ibus_m17n_engine_init (IBusM17NEngine *m17n) { IBusText* label; IBusText* tooltip; m17n->prop_list = ibus_prop_list_new (); g_object_ref_sink (m17n->prop_list); m17n->status_prop = ibus_property_new ("status", PROP_TYPE_NORMAL, NULL, NULL, NULL, TRUE, FALSE, 0, NULL); g_object_ref_sink (m17n->status_prop); ibus_prop_list_append (m17n->prop_list, m17n->status_prop); #ifdef HAVE_SETUP label = ibus_text_new_from_string ("Setup"); tooltip = ibus_text_new_from_string ("Configure M17N engine"); m17n->setup_prop = ibus_property_new ("setup", PROP_TYPE_NORMAL, label, "gtk-preferences", tooltip, TRUE, TRUE, PROP_STATE_UNCHECKED, NULL); g_object_ref_sink (m17n->setup_prop); ibus_prop_list_append (m17n->prop_list, m17n->setup_prop); #endif /* HAVE_SETUP */ m17n->table = ibus_lookup_table_new (9, 0, TRUE, TRUE); g_object_ref_sink (m17n->table); m17n->context = NULL; }
void refresh_outgoing_text(IBusChewingEngine * self) { gchar *outgoingStr = ibus_chewing_pre_edit_get_outgoing(self->icPreEdit); IBUS_CHEWING_LOG(INFO, "refresh_outgoing_text() outgoingStr=|%s|", outgoingStr); if (self->outgoingText) { g_object_unref(self->outgoingText); } self->outgoingText = g_object_ref_sink(ibus_text_new_from_string(outgoingStr)); IBUS_CHEWING_LOG(DEBUG, "refresh_outgoing_text() outgoingText=|%s|", self->outgoingText->text); }
static void ibus_hangul_engine_update_lookup_table_ui (IBusHangulEngine *hangul) { guint cursor_pos; const char* comment; IBusText* text; // update aux text cursor_pos = ibus_lookup_table_get_cursor_pos (hangul->table); comment = hanja_list_get_nth_comment (hangul->hanja_list, cursor_pos); text = ibus_text_new_from_string (comment); ibus_engine_update_auxiliary_text ((IBusEngine *)hangul, text, TRUE); // update lookup table ibus_engine_update_lookup_table ((IBusEngine *)hangul, hangul->table, TRUE); }
gboolean ibus_handwrite_engine_commit_text(IBusHandwriteEngine * engine , int index) { MatchedChar * matched; int number = ibus_handwrite_recog_getmatch(engine->engine,&matched,0); if(number > index ) { ibus_engine_commit_text(IBUS_ENGINE(engine),ibus_text_new_from_string(matched[index].chr)); ibus_handwrite_recog_clear_stroke(engine->engine); engine->needclear = TRUE; engine->currentstroke.segments = 0; g_free(engine->currentstroke.points); engine->currentstroke.points = NULL; return TRUE; } engine->needclear = FALSE; return FALSE; }
static void ibus_hangul_engine_apply_hanja_list (IBusHangulEngine *hangul) { HanjaList* list = hangul->hanja_list; if (list != NULL) { int i, n; n = hanja_list_get_size (list); ibus_lookup_table_clear (hangul->table); for (i = 0; i < n; i++) { const char* value = hanja_list_get_nth_value (list, i); IBusText* text = ibus_text_new_from_string (value); ibus_lookup_table_append_candidate (hangul->table, text); } ibus_lookup_table_set_cursor_pos (hangul->table, 0); ibus_hangul_engine_update_lookup_table_ui (hangul); lookup_table_set_visible (hangul->table, 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_m17n_engine_update_lookup_table (IBusM17NEngine *m17n) { ibus_lookup_table_clear (m17n->table); if (m17n->context->candidate_list && m17n->context->candidate_show) { IBusText *text; MPlist *group; group = m17n->context->candidate_list; gint i = 0; gint page = 1; IBusM17NEngineClass *klass = (IBusM17NEngineClass *) G_OBJECT_GET_CLASS (m17n); while (1) { gint len; if (mplist_key (group) == Mtext) len = mtext_len ((MText *) mplist_value (group)); else len = mplist_length ((MPlist *) mplist_value (group)); if (i + len > m17n->context->candidate_index) break; i += len; group = mplist_next (group); page ++; } if (mplist_key (group) == Mtext) { MText *mt; gunichar *buf; glong nchars, i; mt = (MText *) mplist_value (group); ibus_lookup_table_set_page_size (m17n->table, mtext_len (mt)); buf = ibus_m17n_mtext_to_ucs4 (mt, &nchars); for (i = 0; i < nchars; i++) { ibus_lookup_table_append_candidate (m17n->table, ibus_text_new_from_unichar (buf[i])); } g_free (buf); } else { MPlist *p; p = (MPlist *) mplist_value (group); ibus_lookup_table_set_page_size (m17n->table, mplist_length (p)); for (; mplist_key (p) != Mnil; p = mplist_next (p)) { MText *mtext; gchar *buf; mtext = (MText *) mplist_value (p); buf = ibus_m17n_mtext_to_utf8 (mtext); if (buf) { ibus_lookup_table_append_candidate (m17n->table, ibus_text_new_from_string (buf)); g_free (buf); } } } ibus_lookup_table_set_cursor_pos (m17n->table, m17n->context->candidate_index - i); ibus_lookup_table_set_orientation (m17n->table, klass->lookup_table_orientation); text = ibus_text_new_from_printf ("( %d / %d )", page, mplist_length (m17n->context->candidate_list)); ibus_engine_update_lookup_table ((IBusEngine *)m17n, m17n->table, TRUE); ibus_engine_update_auxiliary_text ((IBusEngine *)m17n, text, TRUE); } else { ibus_engine_hide_lookup_table ((IBusEngine *)m17n); ibus_engine_hide_auxiliary_text ((IBusEngine *)m17n); } }
static void ibus_hangul_engine_commit_current_candidate (IBusHangulEngine *hangul) { guint cursor_pos; const char* key; const char* value; const ucschar* hic_preedit; glong key_len; glong hic_preedit_len; glong preedit_len; IBusText* text; cursor_pos = ibus_lookup_table_get_cursor_pos (hangul->table); key = hanja_list_get_nth_key (hangul->hanja_list, cursor_pos); value = hanja_list_get_nth_value (hangul->hanja_list, cursor_pos); hic_preedit = hangul_ic_get_preedit_string (hangul->context); key_len = g_utf8_strlen(key, -1); preedit_len = ustring_length(hangul->preedit); hic_preedit_len = ucschar_strlen (hic_preedit); if (hangul->last_lookup_method == LOOKUP_METHOD_PREFIX) { if (preedit_len == 0 && hic_preedit_len == 0) { /* remove surrounding_text */ if (key_len > 0) { ibus_engine_delete_surrounding_text ((IBusEngine *)hangul, -key_len , key_len); } } else { /* remove ibus preedit text */ if (key_len > 0) { glong n = MIN(key_len, preedit_len); ustring_erase (hangul->preedit, 0, n); key_len -= preedit_len; } /* remove hic preedit text */ if (key_len > 0) { hangul_ic_reset (hangul->context); key_len -= hic_preedit_len; } } } else { /* remove hic preedit text */ if (hic_preedit_len > 0) { hangul_ic_reset (hangul->context); key_len -= hic_preedit_len; } /* remove ibus preedit text */ if (key_len > preedit_len) { ustring_erase (hangul->preedit, 0, preedit_len); key_len -= preedit_len; } else if (key_len > 0) { ustring_erase (hangul->preedit, 0, key_len); key_len = 0; } /* remove surrounding_text */ if (key_len > 0) { ibus_engine_delete_surrounding_text ((IBusEngine *)hangul, -key_len , key_len); } } /* clear preedit text before commit */ ibus_hangul_engine_clear_preedit_text (hangul); text = ibus_text_new_from_string (value); ibus_engine_commit_text ((IBusEngine *)hangul, text); ibus_hangul_engine_update_preedit_text (hangul); }