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();
    }
}
Example #2
0
    ~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 ();
}
Example #4
0
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);
}
Example #5
0
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);
}
Example #6
0
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);
}
Example #7
0
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 ();
}
Example #9
0
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 ();
}
Example #11
0
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));
}
Example #12
0
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);
}
Example #13
0
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);
}
Example #14
0
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);
}
Example #15
0
    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;
    }
Example #16
0
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);
}
Example #17
0
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);
}
Example #18
0
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);
}
Example #19
0
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);
}
Example #20
0
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 ();
}
Example #22
0
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 ();
}
Example #23
0
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 ();
}
Example #26
0
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;
}
Example #27
0
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;
}
Example #29
0
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;
    }
}
Example #30
0
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;
}