void HangulInstance::select_candidate (unsigned int index) { SCIM_DEBUG_IMENGINE(2) << "select_candidate.\n"; if ((int)index >= m_lookup_table.get_current_page_size ()) return; WideString candidate = m_lookup_table.get_candidate_in_current_page(index); WideString commit_str = candidate; WideString preedit = get_preedit_string(); if (is_hanja_mode() || m_factory->m_commit_by_word) { // prefix method int len = m_surrounding_text.length(); if (len > 0) delete_surrounding_text(-len, len); if (candidate.length() <= m_surrounding_text.length()) { len = m_surrounding_text.length() - candidate.length(); commit_str.append(m_surrounding_text, candidate.length(), len); m_surrounding_text.erase(0, candidate.length()); } else if (candidate.length() <= m_surrounding_text.length() + preedit.length()) { len = candidate.length() - m_surrounding_text.length(); if (len > (int)m_preedit.length()) { m_preedit.clear(); hangul_ic_reset(m_hic); } else { m_preedit.erase(0, len); } m_surrounding_text.clear(); } else { m_preedit.clear(); hangul_ic_reset(m_hic); m_surrounding_text.clear(); } } else { // suffix method if (candidate.length() > preedit.length()) { int len = candidate.length() - preedit.length(); delete_surrounding_text(-len, len); } hangul_ic_reset(m_hic); m_surrounding_text.clear(); } commit_string(commit_str); hangul_update_preedit_string (); if (is_hanja_mode()) { update_candidates(); } else { delete_candidates(); } }
~StandardIMGlobal () { SCIM_DEBUG_IMENGINE(1) << "Destroy StandardIMGlobal.\n"; for (int i = 0; i < m_nr_modules; ++i) { if (m_modules [i].valid () && m_module_ime_funcs [i].finalize){ m_module_ime_funcs [i].finalize (); } } delete [] m_module_ims; delete [] m_module_ime_funcs; delete [] m_modules; }
void CannaInstance::focus_in () { SCIM_DEBUG_IMENGINE(2) << "focus_in.\n"; register_properties (m_canna_jrkanji.get_properties ()); if (m_canna_jrkanji.preedit_string_visible ()) m_canna_jrkanji.show_preedit_string (); if (m_canna_jrkanji.aux_string_visible ()) m_canna_jrkanji.show_aux_string (); }
void StandardIMInstance::focus_in () { if (!m_ok) return; SCIM_DEBUG_IMENGINE(2) << "focus_in.\n"; hide_preedit_string (); hide_aux_string (); hide_lookup_table (); __global->focus_in (m_factory->get_module_id (), &m_input_context); }
void SocketInstance::lookup_table_page_down () { Transaction trans; global->init_transaction (trans); SCIM_DEBUG_IMENGINE(1) << "lookup_table_page_up (" << m_peer_id << ")\n"; trans.put_command (SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN); trans.put_data (m_peer_id); commit_transaction (trans); }
void SocketInstance::reset () { Transaction trans; global->init_transaction (trans); SCIM_DEBUG_IMENGINE(1) << "reset (" << m_peer_id << ")\n"; trans.put_command (SCIM_TRANS_CMD_RESET); trans.put_data (m_peer_id); commit_transaction (trans); }
void SocketInstance::focus_out () { Transaction trans; global->init_transaction (trans); SCIM_DEBUG_IMENGINE(1) << "focus_out (" << m_peer_id << ")\n"; trans.put_command (SCIM_TRANS_CMD_FOCUS_OUT); trans.put_data (m_peer_id); commit_transaction (trans); }
void HangulInstance::lookup_table_page_up () { if (!m_lookup_table.number_of_candidates () || !m_lookup_table.get_current_page_start ()) return; SCIM_DEBUG_IMENGINE(2) << "lookup_table_page_up.\n"; m_lookup_table.page_up (); update_lookup_table (m_lookup_table); hangul_update_aux_string (); }
void HangulInstance::trigger_property (const String &property) { SCIM_DEBUG_IMENGINE(2) << "trigger_property.\n"; if (property == SCIM_PROP_HANGUL_MODE) { toggle_hangul_mode(); } else if (property == SCIM_PROP_HANJA_MODE) { toggle_hanja_mode(); } else if (property.compare(0, strlen(SCIM_PROP_LAYOUT), SCIM_PROP_LAYOUT) == 0) { int pos = strlen(SCIM_PROP_LAYOUT) + 1; int len = property.length() - pos; change_keyboard_layout(property.substr(pos, len)); } }
void CannaInstance::reset () { SCIM_DEBUG_IMENGINE(2) << "reset.\n"; m_canna_jrkanji.reset (); update_preedit_caret (0); update_preedit_string (utf8_mbstowcs ("")); update_aux_string (utf8_mbstowcs ("")); m_lookup_table.clear (); hide_preedit_string (); hide_lookup_table (); hide_aux_string (); }
StandardIMFactory::StandardIMFactory (int module_id, const IME_InputMethod &input_method) : m_module_id (module_id), m_input_method (input_method) { SCIM_DEBUG_IMENGINE(1) << "Create StandardIM Factory :\n"; if (m_input_method.encoding && strlen (m_input_method.encoding) > 0 && String (m_input_method.encoding) != "UTF-8" && m_iconv.set_encoding (m_input_method.encoding)) m_utf8 = false; else m_utf8 = true; set_languages (String (m_input_method.languages)); }
bool StandardIMInstance::process_key_event (const KeyEvent& key) { if (!m_ok) return false; SCIM_DEBUG_IMENGINE(2) << "process_key_event.\n"; IME_KeyEvent imekey; imekey.code = key.code; imekey.mask = key.mask; imekey.unicode= key.get_unicode_code (); return __global->process_key_event (m_factory->get_module_id (), &m_input_context, &imekey); }
void SocketInstance::update_client_capabilities (unsigned int cap) { Transaction trans; global->init_transaction (trans); SCIM_DEBUG_IMENGINE(1) << "update_client_capabilities (" << m_peer_id << ", " << cap << ")\n"; trans.put_command (SCIM_TRANS_CMD_UPDATE_CLIENT_CAPABILITIES); trans.put_data (m_peer_id); trans.put_data ((uint32) cap); commit_transaction (trans); }
void SocketInstance::select_candidate (unsigned int item) { Transaction trans; global->init_transaction (trans); SCIM_DEBUG_IMENGINE(1) << "select_candidate (" << m_peer_id << ")\n"; trans.put_command (SCIM_TRANS_CMD_SELECT_CANDIDATE); trans.put_data (m_peer_id); trans.put_data ((uint32) item); commit_transaction (trans); }
uint32 scim_imengine_module_init (const ConfigPointer &config) { SCIM_DEBUG_IMENGINE(1) << "Initialize Hangul Engine\n"; _scim_config = config; keyboard_layout_2.set_label(_("2bul")); keyboard_layout_32.set_label(_("3bul 2bul-shifted")); keyboard_layout_3f.set_label(_("3bul Final")); keyboard_layout_39.set_label(_("3bul 390")); keyboard_layout_3s.set_label(_("3bul No-Shift")); keyboard_layout_3y.set_label(_("3bul Yetgeul")); return 1; }
void SocketInstance::trigger_property (const String &property) { Transaction trans; global->init_transaction (trans); SCIM_DEBUG_IMENGINE(1) << "trigger_property (" << m_peer_id << ", " << property << ")\n"; trans.put_command (SCIM_TRANS_CMD_TRIGGER_PROPERTY); trans.put_data (m_peer_id); trans.put_data (property); commit_transaction (trans); }
void SocketInstance::update_lookup_table_page_size (unsigned int page_size) { Transaction trans; global->init_transaction (trans); SCIM_DEBUG_IMENGINE(1) << "update_lookup_table_page_size (" << m_peer_id << ")\n"; trans.put_command (SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE); trans.put_data (m_peer_id); trans.put_data ((uint32) page_size); commit_transaction (trans); }
bool SocketInstance::process_key_event (const KeyEvent& key) { Transaction trans; global->init_transaction (trans); SCIM_DEBUG_IMENGINE(1) << "process_key_event (" << m_peer_id << ")\n"; trans.put_command (SCIM_TRANS_CMD_PROCESS_KEY_EVENT); trans.put_data (m_peer_id); trans.put_data (key); return commit_transaction (trans); }
void SocketInstance::move_preedit_caret (unsigned int pos) { Transaction trans; global->init_transaction (trans); SCIM_DEBUG_IMENGINE(1) << "move_preedit_caret (" << m_peer_id << ")\n"; trans.put_command (SCIM_TRANS_CMD_MOVE_PREEDIT_CARET); trans.put_data (m_peer_id); trans.put_data ((uint32) pos); commit_transaction (trans); }
void SocketInstance::process_helper_event (const String &helper_uuid, const Transaction &helper_trans) { Transaction trans; global->init_transaction (trans); SCIM_DEBUG_IMENGINE(1) << "process_helper_event (" << m_peer_id << ", " << helper_uuid << ")\n"; trans.put_command (SCIM_TRANS_CMD_PROCESS_HELPER_EVENT); trans.put_data (m_peer_id); trans.put_data (helper_uuid); trans.put_data (helper_trans); commit_transaction (trans); }
void HangulInstance::lookup_table_page_down () { if (m_lookup_table.number_of_candidates () <= 0 || m_lookup_table.get_current_page_start () + m_lookup_table.get_current_page_size () >= (int)m_lookup_table.number_of_candidates ()) return; SCIM_DEBUG_IMENGINE(2) << "lookup_table_page_down.\n"; m_lookup_table.page_down (); update_lookup_table (m_lookup_table); hangul_update_aux_string (); }
void HangulInstance::focus_in () { SCIM_DEBUG_IMENGINE(2) << "focus_in.\n"; register_all_properties(); if (m_lookup_table.number_of_candidates ()) { update_lookup_table (m_lookup_table); show_lookup_table (); } else { hide_lookup_table (); } hangul_update_aux_string (); }
SocketInstance::~SocketInstance () { Transaction trans; SCIM_DEBUG_IMENGINE(1) << "Destroy IMEngine Instance " << m_peer_id << ".\n"; m_signal_reconnect_connection.disconnect (); if (m_peer_id >= 0) { global->init_transaction (trans); trans.put_command (SCIM_TRANS_CMD_DELETE_INSTANCE); trans.put_data (m_peer_id); commit_transaction (trans); } }
void HangulInstance::flush() { SCIM_DEBUG_IMENGINE(2) << "flush.\n"; hide_preedit_string(); WideString wstr = m_preedit; const ucschar *str = hangul_ic_flush(m_hic); while (*str != 0) wstr.push_back (*str++); if (wstr.length()) commit_string(wstr); delete_candidates (); m_preedit.clear(); }
void HangulInstance::focus_in () { SCIM_DEBUG_IMENGINE(2) << "focus_in.\n"; register_all_properties(); hangul_ic_select_keyboard(m_hic, m_factory->m_keyboard_layout.c_str()); if (m_lookup_table.number_of_candidates ()) { update_lookup_table (m_lookup_table); show_lookup_table (); } else { hide_lookup_table (); } hangul_update_aux_string (); }
bool SocketInstance::commit_transaction (Transaction &trans) { SCIM_DEBUG_IMENGINE(2) << " commit_transaction:\n"; bool ret = false; if (m_peer_id >= 0) { if (global->send_transaction (trans)) { while (1) { if (!global->receive_transaction (trans)) break; if (!do_transaction (trans, ret)) return ret; } } } if (global->create_connection ()) reset (); return ret; }
StandardIMInstance::StandardIMInstance (StandardIMFactory *factory, const String &encoding, int id) : IMEngineInstanceBase (factory, encoding, id), m_factory (factory), m_show_lookup_table (false), m_ok (false) { SCIM_DEBUG_IMENGINE(1) << "Create StandardIM Instance: " << factory->get_uuid () << "\n"; m_input_context.id = id; m_input_context.uuid = factory->m_input_method.uuid; m_input_context.charset = strdup (encoding.c_str ()); m_input_context.private_data = 0; m_ok = __global->create_input_context (m_factory->get_module_id (), &m_input_context); if (m_ok) __global->add_instance (this); }
bool CannaInstance::process_key_event (const KeyEvent& key) { SCIM_DEBUG_IMENGINE(2) << "process_key_event.\n"; KeyEvent newkey; // ignore key release. if (key.is_key_release ()) { return true; } // ignore modifier keys if (key.code == SCIM_KEY_Shift_L || key.code == SCIM_KEY_Shift_R || key.code == SCIM_KEY_Control_L || key.code == SCIM_KEY_Control_R || key.code == SCIM_KEY_Alt_L || key.code == SCIM_KEY_Alt_R) return false; if (m_canna_jrkanji.process_key_event (key)) return true; return false; }
void StandardIMInstance::process_helper_event (const String &helper_uuid, const Transaction &trans) { if (!m_ok) return; SCIM_DEBUG_IMENGINE(2) << "process_helper_event.\n"; TransactionReader reader(trans); char *buf = NULL; size_t bufsize; int cmd; reader.get_command (cmd); if (cmd == SCIM_TRANS_CMD_HELPER_DATA) { reader.get_data(&buf, bufsize); __global->process_helper_event (m_factory->get_module_id (), &m_input_context, helper_uuid.c_str (), buf, bufsize); delete [] buf; } }
bool SocketInstance::do_transaction (Transaction &trans, bool &ret) { int cmd = -1; bool cont = false; ret = false; SCIM_DEBUG_IMENGINE(2) << " Do transaction:\n"; if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY) { while (trans.get_command (cmd)) { switch (cmd) { case SCIM_TRANS_CMD_SHOW_PREEDIT_STRING: { SCIM_DEBUG_IMENGINE(3) << " show_preedit_string ()\n"; show_preedit_string (); break; } case SCIM_TRANS_CMD_SHOW_AUX_STRING: { SCIM_DEBUG_IMENGINE(3) << " show_aux_string ()\n"; show_aux_string (); break; } case SCIM_TRANS_CMD_SHOW_LOOKUP_TABLE: { SCIM_DEBUG_IMENGINE(3) << " show_lookup_table ()\n"; show_lookup_table (); break; } case SCIM_TRANS_CMD_HIDE_PREEDIT_STRING: { SCIM_DEBUG_IMENGINE(3) << " hide_preedit_string ()\n"; hide_preedit_string (); break; } case SCIM_TRANS_CMD_HIDE_AUX_STRING: { SCIM_DEBUG_IMENGINE(3) << " hide_aux_string ()\n"; hide_aux_string (); break; } case SCIM_TRANS_CMD_HIDE_LOOKUP_TABLE: { SCIM_DEBUG_IMENGINE(3) << " hide_lookup_table ()\n"; hide_lookup_table (); break; } case SCIM_TRANS_CMD_UPDATE_PREEDIT_CARET: { uint32 caret; if (trans.get_data (caret)) { SCIM_DEBUG_IMENGINE(3) << " update_preedit_caret (" << caret << ")\n"; update_preedit_caret (caret); } break; } case SCIM_TRANS_CMD_UPDATE_PREEDIT_STRING: { WideString str; AttributeList attrs; if (trans.get_data (str) && trans.get_data (attrs)) { SCIM_DEBUG_IMENGINE(3) << " update_preedit_string ()\n"; update_preedit_string (str, attrs); } break; } case SCIM_TRANS_CMD_UPDATE_AUX_STRING: { WideString str; AttributeList attrs; if (trans.get_data (str) && trans.get_data (attrs)) { SCIM_DEBUG_IMENGINE(3) << " update_aux_string ()\n"; update_aux_string (str, attrs); } break; } case SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE: { CommonLookupTable table; if (trans.get_data (table)) { SCIM_DEBUG_IMENGINE(3) << " update_lookup_table ()\n"; update_lookup_table (table); } break; } case SCIM_TRANS_CMD_COMMIT_STRING: { WideString str; if (trans.get_data (str)) { SCIM_DEBUG_IMENGINE(3) << " commit_string ()\n"; commit_string (str); } break; } case SCIM_TRANS_CMD_FORWARD_KEY_EVENT: { KeyEvent key; if (trans.get_data (key)) { SCIM_DEBUG_IMENGINE(3) << " forward_key_event ()\n"; forward_key_event (key); } break; } case SCIM_TRANS_CMD_REGISTER_PROPERTIES: { PropertyList proplist; if (trans.get_data (proplist)) { SCIM_DEBUG_IMENGINE(3) << " register_properties ()\n"; // Load icon files of these properties from remote SocketFrontEnd. for (PropertyList::iterator it = proplist.begin (); it != proplist.end (); ++it) it->set_icon (global->load_icon (it->get_icon ())); register_properties (proplist); } break; } case SCIM_TRANS_CMD_UPDATE_PROPERTY: { Property prop; if (trans.get_data (prop)) { SCIM_DEBUG_IMENGINE(3) << " update_property ()\n"; // Load the icon file of this property from remote SocketFrontEnd. prop.set_icon (global->load_icon (prop.get_icon ())); update_property (prop); } break; } case SCIM_TRANS_CMD_BEEP: { SCIM_DEBUG_IMENGINE(3) << " beep ()\n"; beep (); break; } case SCIM_TRANS_CMD_START_HELPER: { String helper_uuid; if (trans.get_data (helper_uuid)) { SCIM_DEBUG_IMENGINE(3) << " start_helper (" << helper_uuid << ")\n"; start_helper (helper_uuid); } break; } case SCIM_TRANS_CMD_STOP_HELPER: { String helper_uuid; if (trans.get_data (helper_uuid)) { SCIM_DEBUG_IMENGINE(3) << " stop_helper (" << helper_uuid << ")\n"; stop_helper (helper_uuid); } break; } case SCIM_TRANS_CMD_SEND_HELPER_EVENT: { String helper_uuid; Transaction temp_trans; if (trans.get_data (helper_uuid) && trans.get_data (temp_trans)) { SCIM_DEBUG_IMENGINE(3) << " send_helper_event (" << helper_uuid << ")\n"; send_helper_event (helper_uuid, temp_trans); } break; } case SCIM_TRANS_CMD_OK: { SCIM_DEBUG_IMENGINE(3) << " ret = true\n"; ret = true; break; } case SCIM_TRANS_CMD_GET_SURROUNDING_TEXT: { WideString text; int cursor; uint32 maxlen_before; uint32 maxlen_after; Transaction temp_trans; if (trans.get_data (maxlen_before) && trans.get_data (maxlen_after)) { global->init_transaction (temp_trans); if (get_surrounding_text (text, cursor, (int) maxlen_before, (int) maxlen_after)) { temp_trans.put_command (SCIM_TRANS_CMD_GET_SURROUNDING_TEXT); temp_trans.put_data (text); temp_trans.put_data ((uint32) cursor); } else { temp_trans.put_command (SCIM_TRANS_CMD_FAIL); } global->send_transaction (temp_trans); } cont = true; break; } case SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT: { uint32 offset; uint32 len; Transaction temp_trans; if (trans.get_data (offset) && trans.get_data (len)) { global->init_transaction (temp_trans); if (delete_surrounding_text ((int) offset, (int) len)) { temp_trans.put_command (SCIM_TRANS_CMD_DELETE_SURROUNDING_TEXT); temp_trans.put_command (SCIM_TRANS_CMD_OK); } else { temp_trans.put_command (SCIM_TRANS_CMD_FAIL); } global->send_transaction (temp_trans); } cont = true; break; } default: SCIM_DEBUG_IMENGINE(3) << " Strange cmd: " << cmd << "\n";; } } } else { SCIM_DEBUG_IMENGINE(3) << " Failed to get cmd: " << cmd << "\n"; } SCIM_DEBUG_IMENGINE(2) << " End of Do transaction\n"; return cont; }