static void ibus_hangul_engine_flush (IBusHangulEngine *hangul) { const gunichar *str; IBusText *text; ibus_hangul_engine_hide_lookup_table (hangul); str = hangul_ic_flush (hangul->context); ustring_append_ucs4 (hangul->preedit, str, -1); if (ustring_length (hangul->preedit) != 0) { /* clear preedit text before commit */ ibus_hangul_engine_clear_preedit_text (hangul); str = ustring_begin (hangul->preedit); text = ibus_text_new_from_ucs4 (str); ibus_engine_commit_text ((IBusEngine *) hangul, text); ustring_clear(hangul->preedit); } ibus_hangul_engine_update_preedit_text (hangul); }
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_unikey_engine_commit_string(IBusEngine *engine, const gchar *string) { IBusText *text; text = ibus_text_new_from_static_string(string); ibus_engine_commit_text(engine, text); }
static void ibus_m17n_engine_commit_string (IBusM17NEngine *m17n, const gchar *string) { IBusText *text; text = ibus_text_new_from_static_string (string); ibus_engine_commit_text ((IBusEngine *)m17n, text); ibus_m17n_engine_update_preedit (m17n); }
void parent_commit_text(IBusEngine * iEngine) { IBusChewingEngine *self = IBUS_CHEWING_ENGINE(iEngine); IBUS_CHEWING_LOG(MSG, "* parent_commit_text(-): outgoingText=%s", self->outgoingText->text); #ifdef UNIT_TEST printf("* parent_commit_text(-, %s)\n", self->outgoingText->text); #else ibus_engine_commit_text(iEngine, self->outgoingText); #endif }
static gboolean lx_tn_engine_commit_char (LxTNEngine *lx_tn_engine, IBusEngine *ibus_engine, gunichar new_char) { IBusText *text; text = ibus_text_new_from_unichar (new_char); ibus_engine_commit_text (ibus_engine, text); return TRUE; }
static void ibus_unikey_engine_commit(IBusEngine* engine) { unikey = (IBusUnikeyEngine*)engine; if (unikey->preeditstr->length() > 0) { IBusText *text; text = ibus_text_new_from_static_string(unikey->preeditstr->c_str()); ibus_engine_commit_text(engine, text); } ibus_unikey_engine_clean_buffer(engine); }
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 gboolean ibus_hangul_engine_process_key_event (IBusEngine *engine, guint keyval, guint keycode, guint modifiers) { IBusHangulEngine *hangul = (IBusHangulEngine *) engine; guint mask; gboolean retval; const ucschar *str; if (modifiers & IBUS_RELEASE_MASK) return FALSE; // if we don't ignore shift keys, shift key will make flush the preedit // string. So you cannot input shift+key. // Let's think about these examples: // dlTek (2 set) // qhRdmaqkq (2 set) if (keyval == IBUS_Shift_L || keyval == IBUS_Shift_R) return FALSE; // If hanja key has any modifiers, we ignore that modifier keyval, // or we cannot make the hanja key work. // Because when we get the modifier key alone, we commit the // current preedit string. So after that, even if we get the // right hanja key event, we don't have preedit string to be changed // to hanja word. // See this bug: http://code.google.com/p/ibus/issues/detail?id=1036 if (hanja_key_list_has_modifier(&hanja_keys, keyval)) return FALSE; if (hanja_key_list_match(&hanja_keys, keyval, modifiers)) { if (hangul->hanja_list == NULL) { ibus_hangul_engine_update_lookup_table (hangul); } else { ibus_hangul_engine_hide_lookup_table (hangul); } return TRUE; } if (hangul->hanja_list != NULL) { retval = ibus_hangul_engine_process_candidate_key_event (hangul, keyval, modifiers); if (hangul->hanja_mode) { if (retval) return TRUE; } else { return TRUE; } } // If we've got a key event with some modifiers, commit current // preedit string and ignore this key event. // So, if you want to add some key event handler, put it // before this code. // Ignore key event with control, alt, super or mod5 mask = IBUS_CONTROL_MASK | IBUS_MOD1_MASK | IBUS_MOD3_MASK | IBUS_MOD4_MASK | IBUS_MOD5_MASK; if (modifiers & mask) { ibus_hangul_engine_flush (hangul); return FALSE; } if (keyval == IBUS_BackSpace) { retval = hangul_ic_backspace (hangul->context); if (!retval) { guint preedit_len = ustring_length (hangul->preedit); if (preedit_len > 0) { ustring_erase (hangul->preedit, preedit_len - 1, 1); retval = TRUE; } } ibus_hangul_engine_update_preedit_text (hangul); if (hangul->hanja_mode) { if (ibus_hangul_engine_has_preedit (hangul)) { ibus_hangul_engine_update_lookup_table (hangul); } else { ibus_hangul_engine_hide_lookup_table (hangul); } } } else { // We need to normalize the keyval to US qwerty keylayout, // because the korean input method is depend on the position of // each key, not the character. We make the keyval from keycode // as if the keyboard is US qwerty layout. Then we can assume the // keyval represent the position of the each key. // But if the hic is in transliteration mode, then we should not // normalize the keyval. bool is_transliteration_mode = hangul_ic_is_transliteration(hangul->context); if (!is_transliteration_mode) { if (keymap != NULL) keyval = ibus_keymap_lookup_keysym(keymap, keycode, modifiers); } // ignore capslock if (modifiers & IBUS_LOCK_MASK) { if (keyval >= 'A' && keyval <= 'z') { if (isupper(keyval)) keyval = tolower(keyval); else keyval = toupper(keyval); } } retval = hangul_ic_process (hangul->context, keyval); str = hangul_ic_get_commit_string (hangul->context); if (word_commit || hangul->hanja_mode) { const ucschar* hic_preedit; hic_preedit = hangul_ic_get_preedit_string (hangul->context); if (hic_preedit != NULL && hic_preedit[0] != 0) { ustring_append_ucs4 (hangul->preedit, str, -1); } else { IBusText *text; const ucschar* preedit; ustring_append_ucs4 (hangul->preedit, str, -1); if (ustring_length (hangul->preedit) > 0) { /* clear preedit text before commit */ ibus_hangul_engine_clear_preedit_text (hangul); preedit = ustring_begin (hangul->preedit); text = ibus_text_new_from_ucs4 ((gunichar*)preedit); ibus_engine_commit_text (engine, text); } ustring_clear (hangul->preedit); } } else { if (str != NULL && str[0] != 0) { IBusText *text; /* clear preedit text before commit */ ibus_hangul_engine_clear_preedit_text (hangul); text = ibus_text_new_from_ucs4 (str); ibus_engine_commit_text (engine, text); } } ibus_hangul_engine_update_preedit_text (hangul); if (hangul->hanja_mode) { ibus_hangul_engine_update_lookup_table (hangul); } if (!retval) ibus_hangul_engine_flush (hangul); } return retval; }
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); }