Add optimization_hint for ISEs 11/180811/3
authorJi-hoon Lee <dalton.lee@samsung.com>
Mon, 28 May 2018 11:21:44 +0000 (20:21 +0900)
committerJihoon Kim <jihoon48.kim@samsung.com>
Wed, 20 Jun 2018 06:34:04 +0000 (15:34 +0900)
Change-Id: Ib81c0cdf95cef9527bcbe285d3690fc2b658491a

15 files changed:
ism/modules/panelagent/ecoresocket/ecore_socket_panel_agent_module.cpp
ism/src/isf_control.cpp
ism/src/isf_imcontrol_client.cpp
ism/src/isf_imcontrol_client.h
ism/src/isf_info_manager.cpp
ism/src/isf_info_manager.h
ism/src/isf_message_queue.h
ism/src/isf_panel_agent_base.cpp
ism/src/isf_panel_agent_base.h
ism/src/isf_panel_agent_manager.cpp
ism/src/isf_panel_agent_manager.h
ism/src/scim_helper.cpp
ism/src/scim_helper.h
ism/src/scim_trans_commands.h
ism/src/scim_utility.h

index e266c93..c6d5a64 100644 (file)
@@ -835,6 +835,17 @@ private:
         m_send_trans.write_to_socket(client_socket);
     }
 
+    void set_helper_optimization_hint(int client, uint32 context, const String& uuid, uint32& hint) {
+        Socket client_socket(client);
+        m_send_trans.clear();
+        m_send_trans.put_command(SCIM_TRANS_CMD_REPLY);
+        m_send_trans.put_data(context);
+        m_send_trans.put_data(uuid);
+        m_send_trans.put_command(ISM_TRANS_CMD_SET_OPTIMIZATION_HINT);
+        m_send_trans.put_data(hint);
+        m_send_trans.write_to_socket(client_socket);
+    }
+
     void finalize_content_helper(int client, uint32 context, const String& uuid, String& text, uint32& cursor_pos) {
         LOGD("client id:%d", client);
 
@@ -3214,8 +3225,8 @@ private:
                     trans.put_command(SCIM_TRANS_CMD_OK);
                     trans.write_to_socket(client_socket);
                     m_info_manager->hide_helper_ise ();
-                } else if (cmd == ISM_TRANS_CMD_LAUNCH_ISE) {
-                    m_info_manager->launch_helper_ise();
+                } else if (cmd == ISM_TRANS_CMD_PRELAUNCH_ISE) {
+                    m_info_manager->prelaunch_helper_ise();
 
                     Transaction trans;
                     Socket client_socket(client_id);
index cb44448..877a58f 100644 (file)
@@ -590,7 +590,7 @@ EXAPI int isf_control_prelaunch_ise (void)
         return -1;
 
     imcontrol_client.prepare ();
-    if (!imcontrol_client.launch_helper_ise ()) {
+    if (!imcontrol_client.prelaunch_helper_ise ()) {
         LOGW ("launch_helper_ise failed");
         ret = -1;
     }
index a767c6b..6d1e8a8 100644 (file)
@@ -578,9 +578,9 @@ public:
         }
     }
 
-    bool launch_helper_ise (void) {
+    bool prelaunch_helper_ise (void) {
         int cmd;
-        m_trans.put_command (ISM_TRANS_CMD_LAUNCH_ISE);
+        m_trans.put_command (ISM_TRANS_CMD_PRELAUNCH_ISE);
         m_trans.write_to_socket (m_socket_imclient2panel);
         if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout)) {
             std::cerr << __func__ << " read_from_socket() may be timeout \n";
@@ -733,9 +733,9 @@ bool IMControlClient::hide_helper_ise (void)
     return m_impl->hide_helper_ise ();
 }
 
-bool IMControlClient::launch_helper_ise (void)
+bool IMControlClient::prelaunch_helper_ise (void)
 {
-    return m_impl->launch_helper_ise ();
+    return m_impl->prelaunch_helper_ise ();
 }
 
 void IMControlClient::set_socket_connect_timeout (int msec)
index 0a43a61..6a202df 100644 (file)
@@ -67,7 +67,7 @@ public:
     bool hide_helper_ise (void);
     void enable_remote_input (void);
     void disable_remote_input (void);
-    bool launch_helper_ise (void);
+    bool prelaunch_helper_ise (void);
     void set_socket_connect_timeout (int msec);
 };
 
index bc69500..781fca1 100644 (file)
@@ -1392,6 +1392,22 @@ public:
         return false;
     }
 
+    bool set_helper_optimization_hint(const String& uuid, uint32& hint) {
+        HelperClientIndex::iterator it = m_helper_client_index.find(m_current_helper_uuid);
+
+        if (it != m_helper_client_index.end()) {
+            int client;
+            uint32 context;
+            uint32 ctx;
+            get_focused_context(client, context);
+            ctx = get_helper_ic(client, context);
+            m_panel_agent_manager.set_helper_optimization_hint(it->second.id, ctx, uuid, hint);
+            return true;
+        }
+
+        return false;
+    }
+
     //ISM_TRANS_CMD_SHOW_ISF_CONTROL
     void show_isf_panel (int client_id) {
         SCIM_DEBUG_MAIN (4) << "InfoManager::show_isf_panel ()\n";
@@ -1492,9 +1508,26 @@ public:
 #endif
     }
 
-    void launch_helper_ise (void) {
-        SCIM_DEBUG_MAIN (4) << "InfoManager::launch_helper_ise ()\n";
-        m_signal_start_default_ise ();
+    void prelaunch_helper_ise (void) {
+        SCIM_DEBUG_MAIN (4) << "InfoManager::prelaunch_helper_ise ()\n";
+
+        /* NOTE :
+         * Currenlty the SHOW_PREPARE hint is delivered only to the already-running ISEs.
+         * If the newly launched ise also has to be notified of given optimization hint,
+         * we'll need to mark the hint somewhere and send the message when a newly launched
+         * ise connects to the panel.
+         */
+        HelperClientIndex::iterator it = m_helper_client_index.find(m_current_helper_uuid);
+        if (it != m_helper_client_index.end()) {
+            int    client;
+            uint32 context;
+            uint32 ctx;
+            get_focused_context(client, context);
+            ctx = get_helper_ic(client, context);
+            m_panel_agent_manager.set_helper_optimization_hint(it->second.id, ctx, m_current_helper_uuid, ISE_OPTIMIZATION_HINT_SHOW_PREPARE);
+        }
+
+        m_signal_start_default_ise();
     }
 
     void set_default_ise (const DEFAULT_ISE_T& ise) {
@@ -1894,7 +1927,6 @@ public:
     //ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE
     void set_ise_return_key_disable (int client_id, uint32 disabled) {
         SCIM_DEBUG_MAIN (4) << __func__ << "\n";
-
         if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode || m_current_helper_option & ISM_HELPER_PROCESS_KEYBOARD_KEYEVENT)
             set_helper_return_key_disable (m_current_helper_uuid, disabled);
     }
@@ -2065,6 +2097,13 @@ public:
             set_helper_prediction_hint_data (m_current_helper_uuid, key, value);
     }
 
+    //ISM_TRANS_CMD_SET_OPTIMIZATION_HINT
+    void set_optimization_hint(int client_id, uint32 hint) {
+        SCIM_DEBUG_MAIN(4) << "InfoManager::set_optimization_hint ()\n";
+        if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode || m_current_helper_option & ISM_HELPER_PROCESS_KEYBOARD_KEYEVENT)
+            set_helper_optimization_hint(m_current_helper_uuid, hint);
+    }
+
     //ISM_TRANS_CMD_EXPAND_CANDIDATE
     void expand_candidate () {
         LOGD ("");
@@ -4613,9 +4652,9 @@ void InfoManager::hide_helper_ise (void)
 }
 
 //ISM_TRANS_CMD_LAUNCH_ISE from ISF control
-void InfoManager::launch_helper_ise (void)
+void InfoManager::prelaunch_helper_ise (void)
 {
-    m_impl->launch_helper_ise ();
+    m_impl->prelaunch_helper_ise ();
 }
 
 //SCIM_TRANS_CMD_PROCESS_KEY_EVENT
@@ -4889,6 +4928,12 @@ void InfoManager::set_prediction_hint_data (int client_id, String key, String va
     m_impl->set_prediction_hint_data (client_id, key, value);
 }
 
+//ISM_TRANS_CMD_SET_OPTIMIZATION_HINT
+void InfoManager::set_optimization_hint(int client_id, uint32 hint)
+{
+    m_impl->set_optimization_hint(client_id, hint);
+}
+
 //ISM_TRANS_CMD_EXPAND_CANDIDATE
 void InfoManager::expand_candidate ()
 {
index 5464c95..f729968 100644 (file)
@@ -615,8 +615,8 @@ public:
     //ISM_TRANS_CMD_HIDE_ISE_PANEL from ISF control
     void hide_helper_ise (void);
 
-    //ISM_TRANS_CMD_LAUNCH_ISE
-    void launch_helper_ise (void);
+    //ISM_TRANS_CMD_PRELAUNCH_ISE
+    void prelaunch_helper_ise (void);
 
     //SCIM_TRANS_CMD_PROCESS_KEY_EVENT
     bool process_key_event (KeyEvent& key, uint32 serial);
@@ -753,6 +753,9 @@ public:
     //ISM_TRANS_CMD_SET_PREDICTION_HINT_DATA
     void set_prediction_hint_data (int client_id, String key, String value);
 
+    //ISM_TRANS_CMD_SET_OPTIMIZATION_HINT
+    void set_optimization_hint(int client_id, uint32 hint);
+
     //ISM_TRANS_CMD_EXPAND_CANDIDATE
     void expand_candidate ();
 
index 16d4e46..0619d2e 100644 (file)
@@ -758,6 +758,18 @@ protected:
     String m_value;
 };
 
+/* ISM_TRANS_CMD_SET_OPTIMIZATION_HINT */
+class MessageItemSetOptimizationHint : public MessageItemHelper
+{
+public:
+    MessageItemSetOptimizationHint() : m_hint(0) {}
+    virtual ~MessageItemSetOptimizationHint() {}
+
+    uint32& get_hint_ref() { return m_hint; }
+protected:
+    uint32 m_hint;
+};
+
 template <typename T>
 inline T*
 alloc_message() /* We could use memory pool in the future for performance enhancement */
@@ -1753,6 +1765,21 @@ public:
                     }
                     break;
                 }
+                case ISM_TRANS_CMD_SET_OPTIMIZATION_HINT:
+                {
+                    MessageItemSetOptimizationHint *message = alloc_message<MessageItemSetOptimizationHint>();
+                    if (message) {
+                        message->get_command_ref() = cmd;
+                        if (transaction.get_data(message->get_hint_ref())) {
+                            m_list_messages.push_back(message);
+                        }
+                        else {
+                            LOGW("wrong format of transaction\n");
+                            dealloc_message<MessageItemSetOptimizationHint>(message);
+                        }
+                    }
+                    break;
+                }
             }
         }
 
index f42a645..99f76a1 100644 (file)
@@ -279,6 +279,10 @@ void PanelAgentBase::set_helper_prediction_hint_data (int client, uint32 context
 {
 }
 
+void PanelAgentBase::set_helper_optimization_hint(int client, uint32 context, const String& uuid, uint32& hint)
+{
+}
+
 bool PanelAgentBase::process_key_event (int client, uint32 context, const String& uuid, KeyEvent& key, uint32 serial)
 {
     return false;
index 43f1078..39a27fb 100644 (file)
@@ -521,6 +521,15 @@ public:
     virtual void set_helper_prediction_hint_data (int client, uint32 context, const String& uuid, String& key, String &value);
 
     /**
+     * @brief set_helper_optimization_hint.
+     *
+     * @param
+     *
+     * @return none.
+     */
+    virtual void set_helper_optimization_hint (int client, uint32 context, const String& uuid, uint32& hint);
+
+    /**
      * @brief process_key_event.
      *
      * @param
index 9bfe8bc..6a57c4a 100644 (file)
@@ -538,6 +538,14 @@ void PanelAgentManager::set_helper_prediction_hint_data (int id, uint32 context_
         _p->set_helper_prediction_hint_data (id, context_id, uuid, key, value);
 }
 
+void PanelAgentManager::set_helper_optimization_hint(int id, uint32 context_id, const String& uuid, uint32 hint)
+{
+    PanelAgentPointer _p = m_impl->get_panel_agent_by_id(id);
+
+    if (!_p.null())
+        _p->set_helper_optimization_hint(id, context_id, uuid, hint);
+}
+
 bool PanelAgentManager::process_key_event (int id, uint32 context_id, const String& uuid, KeyEvent& key, uint32 serial)
 {
     PanelAgentPointer _p = m_impl->get_panel_agent_by_id (id);
index 818c384..c9faa9f 100644 (file)
@@ -310,6 +310,7 @@ public:
     void set_helper_keyboard_mode (int client, uint32 context, const String& uuid, uint32& mode);
     void set_helper_prediction_hint (int client, uint32 context, const String& uuid, String& prediction_hint);
     void set_helper_prediction_hint_data (int id, uint32 context_id, const String& uuid, String& key, String& value);
+    void set_helper_optimization_hint (int id, uint32 context_id, const String& uuid, uint32 hint);
     void set_helper_mime_type (int client, uint32 context, const String& uuid, String& mime_type);
     void finalize_content_helper (int client, uint32 context, const String& uuid, String& text, uint32& cursor_pos);
     bool process_key_event (int client, uint32 context, const String& uuid, KeyEvent& key, uint32 serial);
index 5b6c876..0885031 100644 (file)
@@ -230,6 +230,7 @@ public:
     HelperAgentSignalStringVoid         signal_set_prediction_hint;
     HelperAgentSignalStringVoid         signal_set_mime_type;
     HelperAgentSignalString             signal_set_prediction_hint_data;
+    HelperAgentSignalUintVoid           signal_set_optimization_hint;
 
 public:
     HelperAgentImpl (HelperAgent* thiz) : magic(0), magic_active(0), timeout(-1), focused_ic ((uint32) -1), thiz (thiz),
@@ -1478,6 +1479,12 @@ HelperAgent::handle_message (MessageItem *message)
             m_impl->signal_set_prediction_hint_data (this, 0, subclass->get_key_ref(), subclass->get_value_ref());
             break;
         }
+        case ISM_TRANS_CMD_SET_OPTIMIZATION_HINT:
+        {
+            MessageItemSetOptimizationHint *subclass = static_cast<MessageItemSetOptimizationHint*>(message);
+            m_impl->signal_set_optimization_hint(this, subclass->get_hint_ref());
+            break;
+        }
         default:
             break;
     }
@@ -3546,6 +3553,20 @@ HelperAgent::signal_connect_set_prediction_hint_data (HelperAgentSlotString *slo
     return m_impl->signal_set_prediction_hint_data.connect (slot);
 }
 
+/**
+ * @brief Connect a slot to Helper set optimization hint signal.
+ *
+ * This signal is used to send optimization hint to Helper ISE.
+ *
+ * The prototype of the slot is:
+ * void set_prediction_hint_data (const HelperAgent *agent, char *key, char *value);
+ */
+Connection
+HelperAgent::signal_connect_set_optimization_hint (HelperAgentSlotUintVoid *slot)
+{
+    return m_impl->signal_set_optimization_hint.connect (slot);
+}
+
 } /* namespace scim */
 
 /*
index ea831e1..cb42967 100644 (file)
@@ -1408,6 +1408,16 @@ public:
      * void set_prediction_hint_data (const HelperAgent *agent, char *key, char *value);
      */
     Connection signal_connect_set_prediction_hint_data              (HelperAgentSlotString              *slot);
+
+    /**
+     * @brief Connect a slot to Helper set optimization hint signal.
+     *
+     * This signal is used to send optimization hint to Helper ISE.
+     *
+     * The prototype of the slot is:
+     * void set_optimization_hint (const HelperAgent *agent, uint32 &hint);
+     */
+    Connection signal_connect_set_optimization_hint                 (HelperAgentSlotUintVoid            *slot);
 };
 
 /**  @} */
index ec6a3c5..7dbb3b9 100644 (file)
@@ -646,7 +646,7 @@ const int ISM_REMOTE_TRANS_CMD_RECV_SURROUNDING_TEXT      = 1029;
 const int ISM_REMOTE_TRANS_CMD_RECV_INPUT_RESOURCE        = 1030;
 const int ISM_REMOTE_TRANS_CMD_CHECK_PRIVILEGE            = 1031;
 const int ISM_REMOTE_TRANS_CMD_DELETE_SURROUNDING_TEXT    = 1032;
-const int ISM_TRANS_CMD_LAUNCH_ISE                        = 1033;
+const int ISM_TRANS_CMD_PRELAUNCH_ISE                     = 1033;
 
 /* IMControl to ISE */
 const int ISM_TRANS_CMD_SET_ISE_MODE                      = 1108;
@@ -674,6 +674,7 @@ const int ISM_TRANS_CMD_SET_PREDICTION_HINT               = 1129;
 const int ISM_TRANS_CMD_SET_MIME_TYPE                     = 1130;
 const int ISM_TRANS_CMD_FINALIZE_CONTENT                  = 1131;
 const int ISM_TRANS_CMD_SET_PREDICTION_HINT_DATA          = 1132;
+const int ISM_TRANS_CMD_SET_OPTIMIZATION_HINT             = 1133;
 
 /* ISE/Panel to IMControl */
 const int ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT          = 1151;
index a007992..15dec53 100644 (file)
@@ -518,6 +518,11 @@ typedef enum
     FOUR_LINE_CANDIDATE
 } ISF_CANDIDATE_PORTRAIT_LINE_T;
 
+typedef enum
+{
+    ISE_OPTIMIZATION_HINT_NONE = 0,
+    ISE_OPTIMIZATION_HINT_SHOW_PREPARE,
+} ISE_OPTMIZATION_HINT_T;
 
 #define PROP_X_EXT_KEYBOARD_INPUT_DETECTED  "HW Keyboard Input Started"
 #define PROP_X_EXT_KEYBOARD_EXIST           "X External Keyboard Exist"