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; }
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); } }
void ibus_engine_update_lookup_table_fast (IBusEngine *engine, IBusLookupTable *table, gboolean visible) { IBusLookupTable *new_table; IBusText *text; gint page_begin; gint i; if (table->candidates->len < table->page_size << 2) { ibus_engine_update_lookup_table (engine, table, visible); return; } page_begin = (table->cursor_pos / table->page_size) * table->page_size; new_table = ibus_lookup_table_new (table->page_size, 0, table->cursor_visible, table->round); for (i = page_begin; i < page_begin + table->page_size && i < table->candidates->len; i++) { ibus_lookup_table_append_candidate (new_table, ibus_lookup_table_get_candidate (table, i)); } for (i = 0; (text = ibus_lookup_table_get_label (table, i)) != NULL; i++) { ibus_lookup_table_append_label (new_table, text); } ibus_lookup_table_set_cursor_pos (new_table, ibus_lookup_table_get_cursor_in_page (table)); ibus_lookup_table_set_orientation (new_table, ibus_lookup_table_get_orientation (table)); ibus_engine_update_lookup_table (engine, new_table, visible); if (g_object_is_floating (table)) { g_object_unref (table); } }
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); } }