static void draw_lookup_table() { set_im_window(LookupTableWin, lookup_table_win); if (!lookup_table_win.w) return; draw_margin(lookup_table_win, COLOR_BG); unsigned i, x = lookup_table_win.x + MARGIN, y = lookup_table_win.y + MARGIN; for (i = 0; ; i++) { IBusText *text = ibus_lookup_table_get_candidate(lookup_table, i); if (!text) break; char buf[8]; snprintf(buf, sizeof(buf), "%d.", i + 1); draw_text(x, y, COLOR_FG, COLOR_BG, buf, strlen(buf)); x += FW(2); draw_text(x, y, i == lookup_table->cursor_pos ? COLOR_ACTIVE_CANDIDATE : COLOR_FG, COLOR_BG, text->text, strlen(text->text)); x += FW(text_width(text->text)); char space = ' '; draw_text(x, y, COLOR_FG, COLOR_BG, &space, 1); x += FW(1); } unsigned endx = lookup_table_win.x + lookup_table_win.w - MARGIN; if (x < endx) { Rectangle rect = { x, y, endx - x, FH(1) }; fill_rect(rect, COLOR_BG); } }
static void calculate_lookup_win() { if (!lookup_table) { lookup_table_win.w = 0; return; } unsigned i, w = 0; for (i = 0; ; i++) { IBusText *text = ibus_lookup_table_get_candidate(lookup_table, i); if (!text) break; w += text_width(text->text); } lookup_table_win.x = cursor_x; lookup_table_win.y = get_cursor_y() + WIN_INTERVAL + GAP; lookup_table_win.w = FW(w + 3 * lookup_table->page_size) + 2 * MARGIN; lookup_table_win.h = WIN_HEIGHT; if (lookup_table_win.x + lookup_table_win.w > SW) { if (lookup_table_win.w > SW) lookup_table_win.x = 0; else lookup_table_win.x = SW - lookup_table_win.w; } }
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); } }