Equalize the data of IMDATA interface between IME On-standby & On-demand 58/185958/2
authorSungmin Kwak <sungmin.kwak@samsung.com>
Mon, 6 Aug 2018 00:41:53 +0000 (09:41 +0900)
committerInHong Han <inhong1.han@samsung.com>
Mon, 6 Aug 2018 02:16:16 +0000 (02:16 +0000)
Send IMDATA in reshow_input_panel() if it's set after show_ise_panel()
Change-Id: Idb757c3f34f0400312c51665ed31b74f3fa68b4b

ism/src/isf_info_manager.cpp

index 6967e1910b81e2decb3fea2bf75495eb833e130d..8d5998454088ea67bba9a56836b70b4ab2ee4c69 100644 (file)
@@ -286,6 +286,8 @@ class InfoManager::InfoManagerImpl
 
     char*                               m_ise_context_buffer;
     size_t                              m_ise_context_length;
+    char*                               m_imdata_buffer;
+    size_t                              m_imdata_length;
 
     ClientRepository                    m_client_repository;
     /*
@@ -405,6 +407,21 @@ class InfoManager::InfoManagerImpl
 
     PanelAgentManager                    m_panel_agent_manager;
 
+    void delete_ise_context_buffer (void) {
+        if (m_ise_context_buffer != NULL) {
+            delete[] m_ise_context_buffer;
+            m_ise_context_buffer = NULL;
+            m_ise_context_length = 0;
+        }
+    }
+
+    void delete_imdata_buffer (void) {
+        if (m_imdata_buffer != NULL) {
+            delete[] m_imdata_buffer;
+            m_imdata_buffer = NULL;
+            m_imdata_length = 0;
+        }
+    }
 
 public:
     InfoManagerImpl ()
@@ -419,7 +436,8 @@ public:
           m_ise_exiting (false), m_is_imengine_aux (false), m_is_imengine_candidate (false),
           m_reshow_needed (false),
           m_last_socket_client (-1), m_last_client_context (0),
-          m_ise_context_buffer (NULL), m_ise_context_length (0) {
+          m_ise_context_buffer (NULL), m_ise_context_length (0),
+          m_imdata_buffer (NULL), m_imdata_length (0) {
         m_current_ise_name = String (_ ("English Keyboard"));
         m_imcontrol_repository.clear ();
         m_imcontrol_map.clear ();
@@ -430,14 +448,7 @@ public:
 
     ~InfoManagerImpl () {
         delete_ise_context_buffer ();
-    }
-
-    void delete_ise_context_buffer (void) {
-        if (m_ise_context_buffer != NULL) {
-            delete[] m_ise_context_buffer;
-            m_ise_context_buffer = NULL;
-            m_ise_context_length = 0;
-        }
+        delete_imdata_buffer ();
     }
 
     bool initialize (InfoManager* info_manager, const ConfigPointer& config, const String& display, bool resident) {
@@ -1457,10 +1468,11 @@ public:
         }
 
         /* Save ISE context for ISE panel re-showing */
+        /* The size of data can be bigger than Ise_Context size if there is IMDATA. */
         if (data && len > 0) {
+            delete_imdata_buffer ();
             delete_ise_context_buffer ();
             m_ise_context_buffer = new char [len];
-
             if (m_ise_context_buffer) {
                 m_ise_context_length = len;
                 memcpy (m_ise_context_buffer, data, m_ise_context_length);
@@ -1496,7 +1508,8 @@ public:
             m_signal_hide_ise ();
         }
 
-        /* Release ISE context buffer */
+        /* Release ISE context & IMDATA buffer */
+        delete_imdata_buffer ();
         delete_ise_context_buffer ();
     }
 
@@ -1719,6 +1732,12 @@ public:
     void set_ise_imdata (int client_id, const char*   imdata, size_t  len) {
         SCIM_DEBUG_MAIN (4) << "InfoManager::set_ise_imdata ()\n";
 
+        delete_imdata_buffer ();
+        m_imdata_buffer = new char [len];
+        if (m_imdata_buffer) {
+            m_imdata_length = len;
+            memcpy (m_imdata_buffer, imdata, m_imdata_length);
+        }
         if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode || m_current_helper_option & ISM_HELPER_PROCESS_KEYBOARD_KEYEVENT)
             set_helper_imdata (m_current_helper_uuid, imdata, len);
     }
@@ -2258,8 +2277,12 @@ public:
             m_panel_agent_manager.update_entry_metadata (focused_client, focused_context);
             uint32 ctx = get_helper_ic (focused_client, focused_context);
             bool ret = show_helper (m_current_helper_uuid, m_ise_context_buffer, m_ise_context_length, ctx);
-            if (ret)
+            if (ret) {
                 m_signal_show_ise ();
+
+                if (m_imdata_buffer && m_imdata_length > 0 && m_current_helper_option & ISM_HELPER_PROCESS_KEYBOARD_KEYEVENT)
+                    set_helper_imdata (m_current_helper_uuid, m_imdata_buffer, m_imdata_length);
+            }
         }
     }