コード例 #1
0
ファイル: scim_panel_client.cpp プロジェクト: dancor/scim
    int  open_connection        (const String &config, const String &display)
    {
        SocketAddress addr (scim_get_default_panel_socket_address (display));

        if (m_socket.is_connected ()) close_connection ();

        bool ret;
        int count = 0;

        // Try three times.
        while (1) {
            if ((ret = m_socket.connect (addr)) == false) {
                scim_usleep (100000);
                launch_panel (config, display);
                for (int i = 0; i < 200; ++i) {
                    if (m_socket.connect (addr)) {
                        ret = true;
                        break;
                    }
                    scim_usleep (100000);
                }
            }
 
            if (ret && scim_socket_open_connection (m_socket_magic_key, String ("FrontEnd"), String ("Panel"), m_socket, m_socket_timeout))
                break;

            m_socket.close ();

            if (count++ >= 3) break;

            scim_usleep (100000);
        }

        return m_socket.get_id ();
    }
コード例 #2
0
ファイル: scim_panel_client.cpp プロジェクト: dancor/scim
    bool prepare                (int icid)
    {
        if (!m_socket.is_connected ()) return false;

        int cmd;
        uint32 data;

        if (m_send_refcount <= 0) {
            m_current_icid = icid;
            m_send_trans.clear ();
            m_send_trans.put_command (SCIM_TRANS_CMD_REQUEST);
            m_send_trans.put_data (m_socket_magic_key);
            m_send_trans.put_data ((uint32) icid);

            m_send_trans.get_command (cmd);
            m_send_trans.get_data (data);
            m_send_trans.get_data (data);
            m_send_refcount = 0;
        }

        if (m_current_icid == icid) {
            m_send_refcount ++;
            return true;
        }
        return false;
    }
コード例 #3
0
ファイル: scim_panel_client.cpp プロジェクト: dancor/scim
    bool send                   ()
    {
        if (!m_socket.is_connected ()) return false;

        if (m_send_refcount <= 0) return false;

        m_send_refcount --;

        if (m_send_refcount > 0) return false;

        if (m_send_trans.get_data_type () != SCIM_TRANS_DATA_UNKNOWN)
            return m_send_trans.write_to_socket (m_socket, 0x4d494353);

        return false;
    }
コード例 #4
0
ファイル: scim_panel_client.cpp プロジェクト: dancor/scim
    bool filter_event           ()
    {
        Transaction recv;

        if (!m_socket.is_connected () || !recv.read_from_socket (m_socket, m_socket_timeout))
            return false;

        int cmd;
        uint32 context = (uint32)(-1);

        if (!recv.get_command (cmd) || cmd != SCIM_TRANS_CMD_REPLY)
            return true;

        // No context id available, so there will be some global command.
        if (recv.get_data_type () == SCIM_TRANS_DATA_COMMAND) {
            while (recv.get_command (cmd)) {
                switch (cmd) {
                    case SCIM_TRANS_CMD_RELOAD_CONFIG:
                        m_signal_reload_config ((int)context);
                        break;
                    case SCIM_TRANS_CMD_EXIT:
                        m_signal_exit ((int)context);
                        break;
                    default:
                        break;
                }
            }
            return true;
        }

        // Now for context related command.
        if (!recv.get_data (context))
            return true;

        while (recv.get_command (cmd)) {
            switch (cmd) {
                case SCIM_TRANS_CMD_UPDATE_LOOKUP_TABLE_PAGE_SIZE:
                    {
                        uint32 size;
                        if (recv.get_data (size))
                            m_signal_update_lookup_table_page_size ((int) context, (int) size);
                    }
                    break;
                case SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_UP:
                    {
                        m_signal_lookup_table_page_up ((int) context);
                    }
                    break;
                case SCIM_TRANS_CMD_LOOKUP_TABLE_PAGE_DOWN:
                    {
                        m_signal_lookup_table_page_down ((int) context);
                    }
                    break;
                case SCIM_TRANS_CMD_TRIGGER_PROPERTY:
                    {
                        String property;
                        if (recv.get_data (property))
                            m_signal_trigger_property ((int) context, property);
                    }
                    break;
                case SCIM_TRANS_CMD_PROCESS_HELPER_EVENT:
                    {
                        String target_uuid;
                        String helper_uuid;
                        Transaction trans;
                        if (recv.get_data (target_uuid) && recv.get_data (helper_uuid) && recv.get_data (trans))
                            m_signal_process_helper_event ((int) context, target_uuid, helper_uuid, trans);
                    }
                    break; 
                case SCIM_TRANS_CMD_MOVE_PREEDIT_CARET:
                    {
                        uint32 caret;
                        if (recv.get_data (caret))
                            m_signal_move_preedit_caret ((int) context, (int) caret);
                    }
                    break;
                case SCIM_TRANS_CMD_SELECT_CANDIDATE:
                    {
                        uint32 item;
                        if (recv.get_data (item))
                            m_signal_select_candidate ((int) context, (int) item);
                    }
                    break;
                case SCIM_TRANS_CMD_PROCESS_KEY_EVENT:
                    {
                        KeyEvent key;
                        if (recv.get_data (key))
                            m_signal_process_key_event ((int) context, key);
                    }
                    break;
                case SCIM_TRANS_CMD_COMMIT_STRING:
                    {
                        WideString wstr;
                        if (recv.get_data (wstr))
                            m_signal_commit_string ((int) context, wstr);
                    }
                    break;
                case SCIM_TRANS_CMD_FORWARD_KEY_EVENT:
                    {
                        KeyEvent key;
                        if (recv.get_data (key))
                            m_signal_forward_key_event ((int) context, key);
                    }
                    break;
                case SCIM_TRANS_CMD_PANEL_REQUEST_HELP:
                    {
                        m_signal_request_help ((int) context);
                    }
                    break;
                case SCIM_TRANS_CMD_PANEL_REQUEST_FACTORY_MENU:
                    {
                        m_signal_request_factory_menu ((int) context);
                    }
                    break;
                case SCIM_TRANS_CMD_PANEL_CHANGE_FACTORY:
                    {
                        String sfid;
                        if (recv.get_data (sfid))
                            m_signal_change_factory ((int) context, sfid);
                    }
                    break;
                default:
                    break;
            }
        }
        return true;
    }
コード例 #5
0
ファイル: scim_panel_client.cpp プロジェクト: dancor/scim
 bool has_pending_event      () const
 {
     return m_socket.is_connected () && m_socket.wait_for_data (0) > 0;
 }
コード例 #6
0
ファイル: scim_panel_client.cpp プロジェクト: dancor/scim
 bool is_connected           () const
 {
     return m_socket.is_connected ();
 }