Merge IMControlClient function into PanelClient 27/17527/1
authorHaifeng Deng <haifeng.deng@samsung.com>
Tue, 3 Sep 2013 11:15:18 +0000 (19:15 +0800)
committerJihoon Kim <jihoon48.kim@samsung.com>
Fri, 7 Mar 2014 02:26:27 +0000 (11:26 +0900)
Change-Id: I625377ea840970ed077d004b502144337f25f461

12 files changed:
ism/extras/efl_immodule/isf_imf_context.cpp
ism/extras/efl_immodule/isf_imf_control.cpp
ism/extras/efl_immodule/isf_imf_control.h
ism/extras/efl_immodule/isf_imf_control_ui.cpp
ism/extras/efl_immodule/isf_imf_control_ui.h
ism/src/isf_imcontrol_client.cpp
ism/src/isf_imcontrol_client.h
ism/src/scim_panel_agent.cpp
ism/src/scim_panel_agent.h
ism/src/scim_panel_client.cpp
ism/src/scim_panel_client.h
ism/src/scim_trans_commands.h

index c59d029..09619f4 100644 (file)
@@ -266,7 +266,7 @@ static int                                              _context_count
 
 static IMEngineFactoryPointer                           _fallback_factory;
 static IMEngineInstancePointer                          _fallback_instance;
-static PanelClient                                      _panel_client;
+PanelClient                                             _panel_client;
 static int                                              _panel_client_id            = 0;
 
 static Ecore_Fd_Handler                                *_panel_iochannel_read_handler = 0;
@@ -306,7 +306,8 @@ static int      __current_numlock_mask = Mod2Mask;
 #define SHIFT_MODE_ENABLE 0x9fe7
 #define SHIFT_MODE_DISABLE 0x9fe8
 
-extern Ecore_IMF_Context *input_panel_ctx;
+extern Ecore_IMF_Input_Panel_State  input_panel_state;
+extern Ecore_IMF_Context           *input_panel_ctx;
 
 // A hack to shutdown the immodule cleanly even if im_module_exit () is not called when exiting.
 class FinalizeHandler
@@ -1092,7 +1093,7 @@ isf_imf_context_del (Ecore_IMF_Context *ctx)
                 input_panel_state == ECORE_IMF_INPUT_PANEL_STATE_SHOW) {
                 ecore_imf_context_input_panel_hide (ctx);
                 input_panel_event_callback_call (ECORE_IMF_INPUT_PANEL_STATE_EVENT, ECORE_IMF_INPUT_PANEL_STATE_HIDE);
-                isf_imf_context_input_panel_send_will_hide_ack ();
+                isf_imf_context_input_panel_send_will_hide_ack (ctx);
             }
         }
 
@@ -1231,7 +1232,6 @@ isf_imf_context_focus_in (Ecore_IMF_Context *ctx)
 
     if (context_scim && context_scim->impl) {
         _focused_ic = context_scim;
-        isf_imf_context_control_focus_in (ctx);
 
         _panel_client.send ();
 
@@ -1872,8 +1872,7 @@ isf_imf_context_filter_event (Ecore_IMF_Context *ctx, Ecore_IMF_Event_Type type,
                         caps_mode_check (ctx, EINA_FALSE, EINA_TRUE);
                         ret = EINA_TRUE;
                     }
-                }
-                else {
+                } else {
                     if (key.code == SCIM_KEY_space ||
                         key.code == SCIM_KEY_KP_Space)
                         autoperiod_insert (ctx);
@@ -2471,11 +2470,19 @@ panel_slot_longpress_candidate (int context, int index)
 }
 
 static void
-panel_slot_update_client_id (int context, int client_id)
+panel_slot_update_ise_input_context (int context, int type, int value)
+{
+    SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
+
+    process_update_input_context (type, value);
+}
+
+static void
+panel_slot_update_isf_candidate_panel (int context, int type, int value)
 {
-    SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << " context=" << context << " client_id=" << client_id << "\n";
+    SCIM_DEBUG_FRONTEND(1) << __FUNCTION__ << "...\n";
 
-    _panel_client_id = client_id;
+    process_update_input_context (type, value);
 }
 
 /* Panel Requestion functions. */
@@ -2634,6 +2641,12 @@ panel_initialize (void)
     }
 
     if (_panel_client.open_connection (_config->get_name (), display_name) >= 0) {
+        if (_panel_client.get_client_id (_panel_client_id)) {
+            _panel_client.prepare (0);
+            _panel_client.register_client (_panel_client_id);
+            _panel_client.send ();
+        }
+
         int fd = _panel_client.get_connection_number ();
 
         _panel_iochannel_read_handler = ecore_main_fd_handler_add (fd, ECORE_FD_READ, panel_iochannel_handler, NULL, NULL, NULL);
@@ -2650,9 +2663,16 @@ panel_initialize (void)
         }
 
         if (_focused_ic) {
-            _panel_client.prepare (_focused_ic->id);
-            panel_req_focus_in (_focused_ic);
-            _panel_client.send ();
+            scim_usleep (2000000);  // Wait for ISE ready
+            Ecore_IMF_Context *ctx = _focused_ic->ctx;
+            _focused_ic = 0;
+            if (input_panel_state == ECORE_IMF_INPUT_PANEL_STATE_SHOW) {
+                input_panel_state = ECORE_IMF_INPUT_PANEL_STATE_HIDE;
+                isf_imf_context_focus_in (ctx);
+                ecore_imf_context_input_panel_show (ctx);
+            } else {
+                isf_imf_context_focus_in (ctx);
+            }
         }
 
         return true;
@@ -2820,7 +2840,7 @@ initialize (void)
     bool                    socket = true;
     String                  config_module_name = "simple";
 
-    SCIM_DEBUG_FRONTEND(1) << "Initializing Ecore ISF IMModule...\n";
+    LOGD ("Initializing Ecore ISF IMModule...\n");
 
     // Get system language.
     _language = scim_get_locale_language (scim_get_current_locale ());
@@ -2935,7 +2955,8 @@ initialize (void)
     _panel_client.signal_connect_candidate_more_window_show    (slot (panel_slot_candidate_more_window_show));
     _panel_client.signal_connect_candidate_more_window_hide    (slot (panel_slot_candidate_more_window_hide));
     _panel_client.signal_connect_longpress_candidate           (slot (panel_slot_longpress_candidate));
-    _panel_client.signal_connect_update_client_id              (slot (panel_slot_update_client_id));
+    _panel_client.signal_connect_update_ise_input_context      (slot (panel_slot_update_ise_input_context));
+    _panel_client.signal_connect_update_isf_candidate_panel    (slot (panel_slot_update_isf_candidate_panel));
 
     if (!panel_initialize ()) {
         std::cerr << "Ecore IM Module: Cannot connect to Panel!\n";
@@ -2945,7 +2966,7 @@ initialize (void)
 static void
 finalize (void)
 {
-    SCIM_DEBUG_FRONTEND(1) << "Finalizing Ecore ISF IMModule...\n";
+    LOGD ("Finalizing Ecore ISF IMModule...\n");
 
     // Reset this first so that the shared instance could be released correctly afterwards.
     _default_instance.reset ();
@@ -3659,10 +3680,10 @@ slot_commit_string (IMEngineInstanceBase *si,
                     }
                     converted[0] = utf8_wcstombs (str).at (0);
                     if (uppercase) {
-                        if(converted[0] >= 'a' && converted[0] <= 'z')
+                        if (converted[0] >= 'a' && converted[0] <= 'z')
                             converted[0] -= 32;
                     } else {
-                        if(converted[0] >= 'A' && converted[0] <= 'Z')
+                        if (converted[0] >= 'A' && converted[0] <= 'Z')
                             converted[0] += 32;
                     }
 
index f8416a9..b2f0d1c 100644 (file)
@@ -24,6 +24,7 @@
 
 #define Uses_SCIM_TRANSACTION
 #define Uses_ISF_IMCONTROL_CLIENT
+#define Uses_SCIM_PANEL_CLIENT
 
 #include <stdio.h>
 #include <Ecore.h>
@@ -40,319 +41,175 @@ using namespace scim;
 #define IMFCONTROLERR(str...) printf(str)
 
 
-static Ecore_Fd_Handler *_read_handler = 0;
-static IMControlClient   _imcontrol_client;
+extern PanelClient       _panel_client;
 
 
-extern void ecore_ise_process_data (Transaction &trans, int cmd);
-
-
-static int isf_socket_wait_for_data_internal (int socket_id, int timeout)
-{
-    fd_set fds;
-    struct timeval tv;
-    struct timeval begin_tv;
-    int ret;
-
-    int m_id = socket_id;
-
-    if (timeout >= 0) {
-        gettimeofday (&begin_tv, 0);
-        tv.tv_sec = timeout / 1000;
-        tv.tv_usec = (timeout % 1000) * 1000;
-    }
-
-    while (1) {
-        FD_ZERO (&fds);
-        FD_SET (m_id, &fds);
-
-        ret = select (m_id + 1, &fds, NULL, NULL, (timeout >= 0) ? &tv : NULL);
-        if (timeout > 0) {
-            int elapsed;
-            struct timeval cur_tv;
-            gettimeofday (&cur_tv, 0);
-            elapsed = (cur_tv.tv_sec - begin_tv.tv_sec) * 1000 +
-                      (cur_tv.tv_usec - begin_tv.tv_usec) / 1000;
-            timeout = timeout - elapsed;
-            if (timeout > 0) {
-                tv.tv_sec = timeout / 1000;
-                tv.tv_usec = (timeout % 1000) * 1000;
-            } else {
-                tv.tv_sec = 0;
-                tv.tv_usec = 0;
-                timeout = 0;
-            }
-        }
-        if (ret > 0) {
-            return ret;
-        } else if (ret == 0) {
-            if (timeout == 0)
-                return ret;
-            else
-                continue;
-        }
-
-        if (errno == EINTR)
-            continue;
-
-        return ret;
-    }
-}
-
-static Eina_Bool ecore_ise_input_handler (void *data, Ecore_Fd_Handler *fd_handler)
-{
-    int cmd;
-    int timeout = 0;
-    Transaction trans;
-
-    if (fd_handler == NULL)
-        return ECORE_CALLBACK_RENEW;
-
-    int fd = ecore_main_fd_handler_fd_get (fd_handler);
-    if (_imcontrol_client.is_connected () &&
-        isf_socket_wait_for_data_internal (fd, timeout) > 0) {
-        trans.clear ();
-        if (!trans.read_from_socket (fd, timeout)) {
-            IMFCONTROLERR ("%s:: read_from_socket() may be timeout \n", __FUNCTION__);
-            _isf_imf_control_finalize ();
-            return ECORE_CALLBACK_CANCEL;
-        }
-
-        if (trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REQUEST) {
-            while (trans.get_command (cmd)) {
-                ecore_ise_process_data (trans, cmd);
-            }
-        }
-        return ECORE_CALLBACK_RENEW;
-    }
-    IMFCONTROLERR ("ecore_ise_input_handler is failed!!!\n");
-    _isf_imf_control_finalize ();
-    return ECORE_CALLBACK_CANCEL;
-}
-
-static void connect_panel (void)
-{
-    if (!_imcontrol_client.is_connected ()) {
-        _imcontrol_client.open_connection ();
-        int fd = _imcontrol_client.get_panel2imclient_connection_number ();
-        if (fd > 0) {
-            _read_handler = ecore_main_fd_handler_add (fd, ECORE_FD_READ, ecore_ise_input_handler, NULL, NULL, NULL);
-        }
-    }
-}
-
-void _isf_imf_control_finalize (void)
-{
-    IMFCONTROLDBG ("%s ...\n", __FUNCTION__);
-
-    _imcontrol_client.close_connection ();
-
-    if (_read_handler) {
-        ecore_main_fd_handler_del (_read_handler);
-        _read_handler = 0;
-    }
-}
-
 int _isf_imf_context_input_panel_show (int client_id, int context, void *data, int length, bool &input_panel_show)
 {
     int temp = 0;
-    connect_panel ();
-    _imcontrol_client.prepare ();
-    _imcontrol_client.show_ise (client_id, context, data, length, &temp);
+    _panel_client.prepare (context);
+    _panel_client.show_ise (client_id, context, data, length, &temp);
     input_panel_show = (bool)temp;
     return 0;
 }
 
 int _isf_imf_context_input_panel_hide (int client_id, int context)
 {
-    connect_panel ();
-    _imcontrol_client.prepare ();
-    _imcontrol_client.hide_ise (client_id, context);
-    _imcontrol_client.send ();
+    _panel_client.prepare (context);
+    _panel_client.hide_ise (client_id, context);
+    _panel_client.send ();
     return 0;
 }
 
-int _isf_imf_context_control_panel_show (void)
+int _isf_imf_context_control_panel_show (int context)
 {
-    connect_panel ();
-    _imcontrol_client.prepare ();
-    _imcontrol_client.show_control_panel ();
-    _imcontrol_client.send ();
+    _panel_client.prepare (context);
+    _panel_client.show_control_panel ();
+    _panel_client.send ();
     return 0;
 }
 
-int _isf_imf_context_control_panel_hide (void)
+int _isf_imf_context_control_panel_hide (int context)
 {
-    connect_panel ();
-    _imcontrol_client.prepare ();
-    _imcontrol_client.hide_control_panel ();
-    _imcontrol_client.send ();
+    _panel_client.prepare (context);
+    _panel_client.hide_control_panel ();
+    _panel_client.send ();
     return 0;
 }
 
-int _isf_imf_context_input_panel_language_set (Ecore_IMF_Input_Panel_Lang lang)
+int _isf_imf_context_input_panel_language_set (int context, Ecore_IMF_Input_Panel_Lang lang)
 {
-    connect_panel ();
-    _imcontrol_client.prepare ();
-    _imcontrol_client.set_ise_language (lang);
-    _imcontrol_client.send ();
+    _panel_client.prepare (context);
+    _panel_client.set_ise_language (lang);
+    _panel_client.send ();
     return 0;
 }
 
-int _isf_imf_context_input_panel_language_locale_get (char **locale)
+int _isf_imf_context_input_panel_language_locale_get (int context, char **locale)
 {
-    connect_panel ();
-    _imcontrol_client.prepare ();
-    _imcontrol_client.get_ise_language_locale (locale);
+    _panel_client.prepare (context);
+    _panel_client.get_ise_language_locale (locale);
     return 0;
 }
 
-int _isf_imf_context_input_panel_imdata_set (const void *data, int len)
+int _isf_imf_context_input_panel_imdata_set (int context, const void *data, int len)
 {
-    connect_panel ();
-    _imcontrol_client.prepare ();
-    _imcontrol_client.set_imdata ((const char *)data, len);
-    _imcontrol_client.send ();
+    _panel_client.prepare (context);
+    _panel_client.set_imdata ((const char *)data, len);
+    _panel_client.send ();
     return 0;
 }
 
-int _isf_imf_context_input_panel_imdata_get (void *data, int *len)
+int _isf_imf_context_input_panel_imdata_get (int context, void *data, int *len)
 {
-    connect_panel ();
-    _imcontrol_client.prepare ();
-    _imcontrol_client.get_imdata ((char *)data, len);
+    _panel_client.prepare (context);
+    _panel_client.get_imdata ((char *)data, len);
     return 0;
 }
 
-int _isf_imf_context_input_panel_geometry_get (int *x, int *y, int *w, int *h)
+int _isf_imf_context_input_panel_geometry_get (int context, int *x, int *y, int *w, int *h)
 {
-    connect_panel ();
-    _imcontrol_client.prepare ();
-    _imcontrol_client.get_ise_window_geometry (x, y, w, h);
+    _panel_client.prepare (context);
+    _panel_client.get_ise_window_geometry (x, y, w, h);
     return 0;
 }
 
-int _isf_imf_context_input_panel_return_key_type_set (Ecore_IMF_Input_Panel_Return_Key_Type type)
+int _isf_imf_context_input_panel_return_key_type_set (int context, Ecore_IMF_Input_Panel_Return_Key_Type type)
 {
-    connect_panel ();
-    _imcontrol_client.prepare ();
-    _imcontrol_client.set_return_key_type ((int)type);
-    _imcontrol_client.send ();
+    _panel_client.prepare (context);
+    _panel_client.set_return_key_type ((int)type);
+    _panel_client.send ();
     return 0;
 }
 
-int _isf_imf_context_input_panel_return_key_type_get (Ecore_IMF_Input_Panel_Return_Key_Type &type)
+int _isf_imf_context_input_panel_return_key_type_get (int context, Ecore_IMF_Input_Panel_Return_Key_Type &type)
 {
     int temp = 0;
-    connect_panel ();
-    _imcontrol_client.prepare ();
-    _imcontrol_client.get_return_key_type (temp);
+    _panel_client.prepare (context);
+    _panel_client.get_return_key_type (temp);
     type = (Ecore_IMF_Input_Panel_Return_Key_Type)temp;
     return 0;
 }
 
-int _isf_imf_context_input_panel_return_key_disabled_set (Eina_Bool disabled)
+int _isf_imf_context_input_panel_return_key_disabled_set (int context, Eina_Bool disabled)
 {
-    connect_panel ();
-    _imcontrol_client.prepare ();
-    _imcontrol_client.set_return_key_disable ((int)disabled);
-    _imcontrol_client.send ();
+    _panel_client.prepare (context);
+    _panel_client.set_return_key_disable ((int)disabled);
+    _panel_client.send ();
     return 0;
 }
 
-int _isf_imf_context_input_panel_return_key_disabled_get (Eina_Bool &disabled)
+int _isf_imf_context_input_panel_return_key_disabled_get (int context, Eina_Bool &disabled)
 {
     int temp = 0;
-    connect_panel ();
-    _imcontrol_client.prepare ();
-    _imcontrol_client.get_return_key_disable (temp);
+    _panel_client.prepare (context);
+    _panel_client.get_return_key_disable (temp);
     disabled = (Eina_Bool)temp;
     return 0;
 }
 
-int _isf_imf_context_input_panel_layout_set (Ecore_IMF_Input_Panel_Layout layout)
+int _isf_imf_context_input_panel_layout_set (int context, Ecore_IMF_Input_Panel_Layout layout)
 {
-    int layout_temp = layout;
-
-    connect_panel ();
-    _imcontrol_client.prepare ();
-    _imcontrol_client.set_layout (layout_temp);
-    _imcontrol_client.send ();
+    _panel_client.prepare (context);
+    _panel_client.set_layout (layout);
+    _panel_client.send ();
     return 0;
 }
 
-int _isf_imf_context_input_panel_layout_get (Ecore_IMF_Input_Panel_Layout *layout)
+int _isf_imf_context_input_panel_layout_get (int context, Ecore_IMF_Input_Panel_Layout *layout)
 {
     int layout_temp;
-
-    connect_panel ();
-    _imcontrol_client.prepare ();
-    _imcontrol_client.get_layout (&layout_temp);
+    _panel_client.prepare (context);
+    _panel_client.get_layout (&layout_temp);
 
     *layout = (Ecore_IMF_Input_Panel_Layout)layout_temp;
     return 0;
 }
 
-int _isf_imf_context_input_panel_caps_mode_set (unsigned int mode)
-{
-    connect_panel ();
-
-    _imcontrol_client.prepare ();
-    _imcontrol_client.set_caps_mode (mode);
-    _imcontrol_client.send ();
-    return 0;
-}
-
-int _isf_imf_context_candidate_window_geometry_get (int *x, int *y, int *w, int *h)
+int _isf_imf_context_input_panel_caps_mode_set (int context, unsigned int mode)
 {
-    connect_panel ();
-    _imcontrol_client.prepare ();
-    _imcontrol_client.get_candidate_window_geometry (x, y, w, h);
+    _panel_client.prepare (context);
+    _panel_client.set_caps_mode (mode);
+    _panel_client.send ();
     return 0;
 }
 
-int _isf_imf_context_control_focus_in (void)
+int _isf_imf_context_candidate_window_geometry_get (int context, int *x, int *y, int *w, int *h)
 {
-    connect_panel ();
-    _imcontrol_client.prepare ();
-    _imcontrol_client.focus_in ();
-    _imcontrol_client.send ();
+    _panel_client.prepare (context);
+    _panel_client.get_candidate_window_geometry (x, y, w, h);
     return 0;
 }
 
-int _isf_imf_context_control_focus_out (void)
+int _isf_imf_context_input_panel_send_will_show_ack (int context)
 {
-    connect_panel ();
-    _imcontrol_client.prepare ();
-    _imcontrol_client.focus_out ();
-    _imcontrol_client.send ();
+    _panel_client.prepare (context);
+    _panel_client.send_will_show_ack ();
+    _panel_client.send ();
     return 0;
 }
 
-int _isf_imf_context_input_panel_send_will_show_ack (void)
+int _isf_imf_context_input_panel_send_will_hide_ack (int context)
 {
-    connect_panel ();
-    _imcontrol_client.prepare ();
-    _imcontrol_client.send_will_show_ack ();
-    _imcontrol_client.send ();
+    _panel_client.prepare (context);
+    _panel_client.send_will_hide_ack ();
+    _panel_client.send ();
     return 0;
 }
 
-int _isf_imf_context_input_panel_send_will_hide_ack (void)
+int _isf_imf_context_set_hardware_keyboard_mode (int context)
 {
-    connect_panel ();
-    _imcontrol_client.prepare ();
-    _imcontrol_client.send_will_hide_ack ();
-    _imcontrol_client.send ();
+    _panel_client.prepare (context);
+    _panel_client.set_hardware_keyboard_mode ();
+    _panel_client.send ();
     return 0;
 }
 
-int _isf_imf_context_input_panel_send_candidate_will_hide_ack (void)
+int _isf_imf_context_input_panel_send_candidate_will_hide_ack (int context)
 {
-    connect_panel ();
-    _imcontrol_client.prepare ();
-    _imcontrol_client.send_candidate_will_hide_ack ();
-    _imcontrol_client.send ();
+    _panel_client.prepare (context);
+    _panel_client.send_candidate_will_hide_ack ();
+    _panel_client.send ();
     return 0;
 }
 
index 256bef5..7391305 100644 (file)
@@ -32,37 +32,33 @@ extern "C"
 {
 #endif /* __cplusplus */
 
-    /* non UI related works */
-    void _isf_imf_control_finalize (void);
-
     int _isf_imf_context_input_panel_show (int client_id, int context, void *data, int length, bool &input_panel_show);
     int _isf_imf_context_input_panel_hide (int client_id, int context);
-    int _isf_imf_context_control_panel_show (void);
-    int _isf_imf_context_control_panel_hide (void);
+    int _isf_imf_context_control_panel_show (int context);
+    int _isf_imf_context_control_panel_hide (int context);
 
-    int _isf_imf_context_input_panel_language_set (Ecore_IMF_Input_Panel_Lang lang);
-    int _isf_imf_context_input_panel_language_locale_get (char **locale);
+    int _isf_imf_context_input_panel_language_set (int context, Ecore_IMF_Input_Panel_Lang lang);
+    int _isf_imf_context_input_panel_language_locale_get (int context, char **locale);
 
-    int _isf_imf_context_input_panel_imdata_set (const void *data, int len);
-    int _isf_imf_context_input_panel_imdata_get (void *data, int *len);
-    int _isf_imf_context_input_panel_geometry_get (int *x, int *y, int *w, int *h);
-    int _isf_imf_context_input_panel_layout_set (Ecore_IMF_Input_Panel_Layout layout);
-    int _isf_imf_context_input_panel_layout_get (Ecore_IMF_Input_Panel_Layout *layout);
-    int _isf_imf_context_input_panel_return_key_type_set (Ecore_IMF_Input_Panel_Return_Key_Type type);
-    int _isf_imf_context_input_panel_return_key_type_get (Ecore_IMF_Input_Panel_Return_Key_Type &type);
-    int _isf_imf_context_input_panel_return_key_disabled_set (Eina_Bool disabled);
-    int _isf_imf_context_input_panel_return_key_disabled_get (Eina_Bool &disabled);
-    int _isf_imf_context_input_panel_caps_mode_set (unsigned int mode);
+    int _isf_imf_context_input_panel_imdata_set (int context, const void *data, int len);
+    int _isf_imf_context_input_panel_imdata_get (int context, void *data, int *len);
+    int _isf_imf_context_input_panel_geometry_get (int context, int *x, int *y, int *w, int *h);
+    int _isf_imf_context_input_panel_layout_set (int context, Ecore_IMF_Input_Panel_Layout layout);
+    int _isf_imf_context_input_panel_layout_get (int context, Ecore_IMF_Input_Panel_Layout *layout);
+    int _isf_imf_context_input_panel_return_key_type_set (int context, Ecore_IMF_Input_Panel_Return_Key_Type type);
+    int _isf_imf_context_input_panel_return_key_type_get (int context, Ecore_IMF_Input_Panel_Return_Key_Type &type);
+    int _isf_imf_context_input_panel_return_key_disabled_set (int context, Eina_Bool disabled);
+    int _isf_imf_context_input_panel_return_key_disabled_get (int context, Eina_Bool &disabled);
+    int _isf_imf_context_input_panel_caps_mode_set (int context, unsigned int mode);
 
-    int _isf_imf_context_candidate_window_geometry_get (int *x, int *y, int *w, int *h);
+    int _isf_imf_context_candidate_window_geometry_get (int context, int *x, int *y, int *w, int *h);
 
-    int _isf_imf_context_control_focus_in (void);
-    int _isf_imf_context_control_focus_out (void);
+    int _isf_imf_context_input_panel_send_will_show_ack (int context);
+    int _isf_imf_context_input_panel_send_will_hide_ack (int context);
 
-    int _isf_imf_context_input_panel_send_will_show_ack (void);
-    int _isf_imf_context_input_panel_send_will_hide_ack (void);
+    int _isf_imf_context_set_hardware_keyboard_mode (int context);
 
-    int _isf_imf_context_input_panel_send_candidate_will_hide_ack (void);
+    int _isf_imf_context_input_panel_send_candidate_will_hide_ack (int context);
 
 #ifdef __cplusplus
 }
index f9ab240..56e9a79 100644 (file)
@@ -49,7 +49,7 @@ static Ecore_X_Window     _rootwin;
 static unsigned int       hw_kbd_num = 0;
 static Ecore_Timer       *hide_timer = NULL;
 static Ecore_Timer       *will_show_timer = NULL;
-static Ecore_IMF_Input_Panel_State input_panel_state = ECORE_IMF_INPUT_PANEL_STATE_HIDE;
+Ecore_IMF_Input_Panel_State input_panel_state = ECORE_IMF_INPUT_PANEL_STATE_HIDE;
 static Ecore_IMF_Input_Panel_State notified_state = ECORE_IMF_INPUT_PANEL_STATE_HIDE;
 static int                hide_context_id = -1;
 static Evas              *active_context_canvas = NULL;
@@ -62,17 +62,35 @@ static Eina_Bool          will_hide = EINA_FALSE;
 
 static void _send_input_panel_hide_request ();
 
+static Ecore_IMF_Context *_get_using_ic (Ecore_IMF_Input_Panel_Event type, int value) {
+    Ecore_IMF_Context *using_ic = NULL;
+    if (show_req_ic)
+        using_ic = show_req_ic;
+    else if (get_focused_ic ())
+        using_ic = get_focused_ic ()->ctx;
+
+    if (type == ECORE_IMF_INPUT_PANEL_STATE_EVENT &&
+        value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
+        if (hide_req_ic) {
+            using_ic = hide_req_ic;
+        }
+    }
+    return using_ic;
+}
+
 static void _render_post_cb (void *data, Evas *e, void *event_info)
 {
+    LOGD ("[_render_post_cb]\n");
     evas_event_callback_del_full (e, EVAS_CALLBACK_RENDER_POST, _render_post_cb, NULL);
     conformant_reset_done = EINA_TRUE;
-    isf_imf_context_input_panel_send_will_hide_ack ();
+    isf_imf_context_input_panel_send_will_hide_ack (_get_using_ic (ECORE_IMF_INPUT_PANEL_STATE_EVENT, ECORE_IMF_INPUT_PANEL_STATE_SHOW));
 }
 
 static void _candidate_render_post_cb (void *data, Evas *e, void *event_info)
 {
+    LOGD ("[%s]\n", __func__);
     evas_event_callback_del_full (e, EVAS_CALLBACK_RENDER_POST, _candidate_render_post_cb, NULL);
-    isf_imf_context_input_panel_send_candidate_will_hide_ack ();
+    isf_imf_context_input_panel_send_candidate_will_hide_ack (_get_using_ic (ECORE_IMF_INPUT_PANEL_STATE_EVENT, ECORE_IMF_INPUT_PANEL_STATE_SHOW));
 }
 
 static void _clear_will_show_timer ()
@@ -122,11 +140,9 @@ static Eina_Bool _prop_change (void *data, int ev_type, void *ev)
             conformant_reset_done = EINA_FALSE;
             LOGD ("[ECORE_X_VIRTUAL_KEYBOARD_STATE_ON] geometry x : %d, y : %d, w : %d, h : %d\n", sx, sy, sw, sh);
         }
-    }
-    else {
+    } else {
         if (event->win != _rootwin) return ECORE_CALLBACK_PASS_ON;
         if (event->atom != prop_x_ext_keyboard_exist) return ECORE_CALLBACK_PASS_ON;
-
         if (!ecore_x_window_prop_card32_get (event->win, prop_x_ext_keyboard_exist, &val, 1) > 0)
             return ECORE_CALLBACK_PASS_ON;
 
@@ -182,19 +198,7 @@ static void _save_current_xid (Ecore_IMF_Context *ctx)
 
 static void _event_callback_call (Ecore_IMF_Input_Panel_Event type, int value)
 {
-    Ecore_IMF_Context *using_ic = NULL;
-
-    if (show_req_ic)
-        using_ic = show_req_ic;
-    else if (get_focused_ic ())
-        using_ic = get_focused_ic ()->ctx;
-
-    if (type == ECORE_IMF_INPUT_PANEL_STATE_EVENT &&
-        value == ECORE_IMF_INPUT_PANEL_STATE_HIDE) {
-        if (hide_req_ic) {
-            using_ic = hide_req_ic;
-        }
-    }
+    Ecore_IMF_Context *using_ic = _get_using_ic (type, value);
 
     switch (type) {
         case ECORE_IMF_INPUT_PANEL_STATE_EVENT:
@@ -240,7 +244,7 @@ static void _event_callback_call (Ecore_IMF_Input_Panel_Event type, int value)
 
     if (type == ECORE_IMF_INPUT_PANEL_STATE_EVENT &&
         value == ECORE_IMF_INPUT_PANEL_STATE_WILL_SHOW) {
-        isf_imf_context_input_panel_send_will_show_ack ();
+        isf_imf_context_input_panel_send_will_show_ack (using_ic);
     }
 
     if (type == ECORE_IMF_CANDIDATE_PANEL_STATE_EVENT &&
@@ -249,7 +253,7 @@ static void _event_callback_call (Ecore_IMF_Input_Panel_Event type, int value)
         if (active_context_canvas && _conformant_get ())
             evas_event_callback_add (active_context_canvas, EVAS_CALLBACK_RENDER_POST, _candidate_render_post_cb, NULL);
         else
-            isf_imf_context_input_panel_send_candidate_will_hide_ack ();
+            isf_imf_context_input_panel_send_candidate_will_hide_ack (using_ic);
     }
 }
 
@@ -390,7 +394,7 @@ void isf_imf_context_control_panel_show (Ecore_IMF_Context *ctx)
     if (IfInitContext == false) {
         _isf_imf_context_init ();
     }
-    _isf_imf_context_control_panel_show ();
+    _isf_imf_context_control_panel_show (_get_context_id (ctx));
 }
 
 void isf_imf_context_control_panel_hide (Ecore_IMF_Context *ctx)
@@ -398,7 +402,7 @@ void isf_imf_context_control_panel_hide (Ecore_IMF_Context *ctx)
     if (IfInitContext == false) {
         _isf_imf_context_init ();
     }
-    _isf_imf_context_control_panel_hide ();
+    _isf_imf_context_control_panel_hide (_get_context_id (ctx));
 }
 
 void isf_imf_input_panel_init (void)
@@ -438,8 +442,6 @@ void isf_imf_input_panel_shutdown (void)
 
     _clear_will_show_timer ();
     _clear_hide_timer ();
-
-    _isf_imf_control_finalize ();
 }
 
 void isf_imf_context_input_panel_show (Ecore_IMF_Context* ctx)
@@ -603,7 +605,7 @@ void isf_imf_context_input_panel_language_set (Ecore_IMF_Context *ctx, Ecore_IMF
 
     if (context_scim == get_focused_ic ()) {
         LOGD ("language mode : %d\n", language);
-        _isf_imf_context_input_panel_language_set (language);
+        _isf_imf_context_input_panel_language_set (_get_context_id (ctx), language);
     }
 }
 
@@ -620,7 +622,7 @@ void isf_imf_context_input_panel_language_locale_get (Ecore_IMF_Context *ctx, ch
         _isf_imf_context_init ();
 
     if (locale)
-        _isf_imf_context_input_panel_language_locale_get (locale);
+        _isf_imf_context_input_panel_language_locale_get (_get_context_id (ctx), locale);
 }
 
 void isf_imf_context_input_panel_caps_mode_set (Ecore_IMF_Context *ctx, unsigned int mode)
@@ -628,7 +630,7 @@ void isf_imf_context_input_panel_caps_mode_set (Ecore_IMF_Context *ctx, unsigned
     if (!IfInitContext)
         _isf_imf_context_init ();
     LOGD ("ctx : %p, mode : %d\n", ctx, mode);
-    _isf_imf_context_input_panel_caps_mode_set (mode);
+    _isf_imf_context_input_panel_caps_mode_set (_get_context_id (ctx), mode);
 }
 
 void isf_imf_context_input_panel_caps_lock_mode_set (Ecore_IMF_Context *ctx, Eina_Bool mode)
@@ -654,7 +656,7 @@ void isf_imf_context_input_panel_imdata_set (Ecore_IMF_Context *ctx, const void*
     EcoreIMFContextISF *context_scim = (EcoreIMFContextISF *)ecore_imf_context_data_get (ctx);
 
     if (context_scim == get_focused_ic ())
-        _isf_imf_context_input_panel_imdata_set (data, length);
+        _isf_imf_context_input_panel_imdata_set (_get_context_id (ctx), data, length);
 }
 
 /**
@@ -668,7 +670,7 @@ void isf_imf_context_input_panel_imdata_get (Ecore_IMF_Context *ctx, void* data,
 {
     if (!IfInitContext)
         _isf_imf_context_init ();
-    _isf_imf_context_input_panel_imdata_get (data, length);
+    _isf_imf_context_input_panel_imdata_get (_get_context_id (ctx), data, length);
 }
 
 /**
@@ -685,7 +687,7 @@ void isf_imf_context_input_panel_geometry_get (Ecore_IMF_Context *ctx, int *x, i
 {
     if (!IfInitContext)
         _isf_imf_context_init ();
-    _isf_imf_context_input_panel_geometry_get (x, y, w, h);
+    _isf_imf_context_input_panel_geometry_get (_get_context_id (ctx), x, y, w, h);
 
     LOGD ("ctx : %p, x : %d, y : %d, w : %d, h : %d\n", ctx, *x, *y, *w, *h);
 }
@@ -705,7 +707,7 @@ void isf_imf_context_input_panel_return_key_type_set (Ecore_IMF_Context *ctx, Ec
 
     if (context_scim == get_focused_ic ()) {
         LOGD ("Return key type : %d\n", type);
-        _isf_imf_context_input_panel_return_key_type_set (type);
+        _isf_imf_context_input_panel_return_key_type_set (_get_context_id (ctx), type);
     }
 }
 
@@ -725,7 +727,7 @@ Ecore_IMF_Input_Panel_Return_Key_Type isf_imf_context_input_panel_return_key_typ
 
     Ecore_IMF_Input_Panel_Return_Key_Type type = ECORE_IMF_INPUT_PANEL_RETURN_KEY_TYPE_DEFAULT;
     if (context_scim == get_focused_ic ())
-        _isf_imf_context_input_panel_return_key_type_get (type);
+        _isf_imf_context_input_panel_return_key_type_get (_get_context_id (ctx), type);
 
     return type;
 }
@@ -745,7 +747,7 @@ void isf_imf_context_input_panel_return_key_disabled_set (Ecore_IMF_Context *ctx
 
     if (context_scim == get_focused_ic ()) {
         LOGD ("Return key disabled : %d\n", disabled);
-        _isf_imf_context_input_panel_return_key_disabled_set (disabled);
+        _isf_imf_context_input_panel_return_key_disabled_set (_get_context_id (ctx), disabled);
     }
 }
 
@@ -765,7 +767,7 @@ Eina_Bool isf_imf_context_input_panel_return_key_disabled_get (Ecore_IMF_Context
 
     Eina_Bool disabled = EINA_FALSE;
     if (context_scim == get_focused_ic ())
-        _isf_imf_context_input_panel_return_key_disabled_get (disabled);
+        _isf_imf_context_input_panel_return_key_disabled_get (_get_context_id (ctx), disabled);
 
     return disabled;
 }
@@ -786,7 +788,7 @@ isf_imf_context_input_panel_layout_set (Ecore_IMF_Context *ctx, Ecore_IMF_Input_
 
     if (context_scim == get_focused_ic ()) {
         LOGD ("layout type : %d\n", layout);
-        _isf_imf_context_input_panel_layout_set (layout);
+        _isf_imf_context_input_panel_layout_set (_get_context_id (ctx), layout);
         imengine_layout_set (ctx, layout);
     }
 }
@@ -803,7 +805,7 @@ Ecore_IMF_Input_Panel_Layout isf_imf_context_input_panel_layout_get (Ecore_IMF_C
     Ecore_IMF_Input_Panel_Layout layout;
     if (!IfInitContext)
         _isf_imf_context_init ();
-    _isf_imf_context_input_panel_layout_get (&layout);
+    _isf_imf_context_input_panel_layout_get (_get_context_id (ctx), &layout);
 
     return layout;
 }
@@ -847,49 +849,21 @@ void isf_imf_context_candidate_window_geometry_get (Ecore_IMF_Context *ctx, int
 {
     if (!IfInitContext)
         _isf_imf_context_init ();
-    _isf_imf_context_candidate_window_geometry_get (x, y, w, h);
+    _isf_imf_context_candidate_window_geometry_get (_get_context_id (ctx), x, y, w, h);
 
     LOGD ("ctx : %p, x : %d, y : %d, w : %d, h : %d\n", ctx, *x, *y, *w, *h);
 }
 
-/**
- * This method should be called when focus in
- *
- * @param[in] ctx a #Ecore_IMF_Context
- */
-void isf_imf_context_control_focus_in (Ecore_IMF_Context *ctx)
+void isf_imf_context_input_panel_send_will_show_ack (Ecore_IMF_Context *ctx)
 {
     if (IfInitContext == false) {
         _isf_imf_context_init ();
     }
-    /* Set the current XID of the active window into the root window property */
-    _save_current_xid (ctx);
-    _isf_imf_context_control_focus_in ();
-}
 
-/**
- * This method should be called when focus out
- *
- * @param[in] ctx a #Ecore_IMF_Context
- */
-void isf_imf_context_control_focus_out (Ecore_IMF_Context *ctx)
-{
-    if (IfInitContext == false) {
-        _isf_imf_context_init ();
-    }
-    _isf_imf_context_control_focus_out ();
-}
-
-void isf_imf_context_input_panel_send_will_show_ack ()
-{
-    if (IfInitContext == false) {
-        _isf_imf_context_init ();
-    }
-
-    _isf_imf_context_input_panel_send_will_show_ack ();
+    _isf_imf_context_input_panel_send_will_show_ack (_get_context_id (ctx));
 }
 
-void isf_imf_context_input_panel_send_will_hide_ack ()
+void isf_imf_context_input_panel_send_will_hide_ack (Ecore_IMF_Context *ctx)
 {
     if (IfInitContext == false) {
         _isf_imf_context_init ();
@@ -898,28 +872,36 @@ void isf_imf_context_input_panel_send_will_hide_ack ()
     if (_conformant_get ()) {
         if (conformant_reset_done && received_will_hide_event) {
             LOGD ("Send will hide ack\n");
-            _isf_imf_context_input_panel_send_will_hide_ack ();
+            _isf_imf_context_input_panel_send_will_hide_ack (_get_context_id (ctx));
             conformant_reset_done = EINA_FALSE;
             received_will_hide_event = EINA_FALSE;
         }
-    }
-    else {
-        _isf_imf_context_input_panel_send_will_hide_ack ();
+    } else {
+        _isf_imf_context_input_panel_send_will_hide_ack (_get_context_id (ctx));
     }
 }
 
-void isf_imf_context_input_panel_send_candidate_will_hide_ack ()
+void isf_imf_context_set_hardware_keyboard_mode (Ecore_IMF_Context *ctx)
 {
     if (IfInitContext == false) {
         _isf_imf_context_init ();
     }
 
-    LOGD ("Send candidate will hide ack\n");
-    _isf_imf_context_input_panel_send_candidate_will_hide_ack ();
+    hw_kbd_num = 1;
+    SECURE_LOGD ("The number of connected H/W keyboard : %d\n", hw_kbd_num);
+    _isf_imf_context_set_hardware_keyboard_mode (_get_context_id (ctx));
+}
+
+void isf_imf_context_input_panel_send_candidate_will_hide_ack (Ecore_IMF_Context *ctx)
+{
+    if (IfInitContext == false) {
+        _isf_imf_context_init ();
+    }
+    _isf_imf_context_input_panel_send_candidate_will_hide_ack (_get_context_id (ctx));
 }
 
 /**
- * process command message, ISM_TRANS_CMD_ISE_PANEL_SHOWED of ecore_ise_process_event ()
+ * process input panel show message
  */
 static bool _process_ise_panel_showed (void)
 {
@@ -936,7 +918,7 @@ static bool _process_ise_panel_showed (void)
 }
 
 /**
- * process command message, ISM_TRANS_CMD_ISE_PANEL_HIDED of ecore_ise_process_event ()
+ * process input panel hide message
  */
 static bool _process_ise_panel_hided (void)
 {
@@ -950,22 +932,16 @@ static bool _process_ise_panel_hided (void)
     _event_callback_call (ECORE_IMF_INPUT_PANEL_STATE_EVENT, ECORE_IMF_INPUT_PANEL_STATE_HIDE);
 
     received_will_hide_event = EINA_TRUE;
-    isf_imf_context_input_panel_send_will_hide_ack ();
+    isf_imf_context_input_panel_send_will_hide_ack (_get_using_ic (ECORE_IMF_INPUT_PANEL_STATE_EVENT, ECORE_IMF_INPUT_PANEL_STATE_HIDE));
 
     return true;
 }
 
 /**
- * process command message, ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT of gtk_ise_process_event ()
+ * process input panel related message
  */
-static bool _process_update_input_context (Transaction &trans)
+bool process_update_input_context (int type, int value)
 {
-    uint32 type;
-    uint32 value;
-
-    if (!(trans.get_data (type) && trans.get_data (value)))
-        return false;
-
     if (type == (uint32)ECORE_IMF_INPUT_PANEL_STATE_EVENT) {
         switch (value) {
             case ECORE_IMF_INPUT_PANEL_STATE_HIDE:
@@ -988,41 +964,6 @@ static bool _process_update_input_context (Transaction &trans)
 
     _event_callback_call ((Ecore_IMF_Input_Panel_Event)type, (int)value);
 
-    if (type == ECORE_IMF_INPUT_PANEL_STATE_EVENT &&
-        value == ECORE_IMF_INPUT_PANEL_STATE_WILL_SHOW) {
-        isf_imf_context_input_panel_send_will_show_ack ();
-    }
-
     return true;
 }
 
-/**
- * process ISE data of command message with ISF
- *
- * @param[in] trans packet data to be processed
- * @param[in] cmd command ID that defines with ISF
- */
-void ecore_ise_process_data (Transaction &trans, int cmd)
-{
-    switch (cmd) {
-    case ISM_TRANS_CMD_ISE_PANEL_SHOWED : {
-        _process_ise_panel_showed ();
-        break;
-    }
-    case ISM_TRANS_CMD_ISE_PANEL_HIDED : {
-        _process_ise_panel_hided ();
-        break;
-    }
-    case ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT : {
-        _process_update_input_context (trans);
-        break;
-    }
-    case ISM_TRANS_CMD_UPDATE_ISF_CANDIDATE_PANEL : {
-        _process_update_input_context (trans);
-        break;
-    }
-    default :
-        break;
-    }
-}
-
index 782d090..b9da9bb 100644 (file)
@@ -32,9 +32,9 @@ extern "C"
 {
 #endif /* __cplusplus */
     void input_panel_event_callback_call (Ecore_IMF_Input_Panel_Event type, int value);
-    int hw_keyboard_num_get ();
+    int  hw_keyboard_num_get ();
+    bool process_update_input_context (int type, int value);
 
-    /* non UI related works */
     void isf_imf_input_panel_init ();
     void isf_imf_input_panel_shutdown ();
     void isf_imf_context_input_panel_show (Ecore_IMF_Context *ctx);
@@ -61,11 +61,11 @@ extern "C"
     void isf_imf_context_input_panel_caps_lock_mode_set (Ecore_IMF_Context *ctx, Eina_Bool mode);
     void isf_imf_context_candidate_window_geometry_get (Ecore_IMF_Context *ctx, int *x, int *y, int *w, int *h);
 
-    void isf_imf_context_control_focus_in (Ecore_IMF_Context *ctx);
-    void isf_imf_context_control_focus_out (Ecore_IMF_Context *ctx);
-    void isf_imf_context_input_panel_send_will_show_ack ();
-    void isf_imf_context_input_panel_send_will_hide_ack ();
-    void isf_imf_context_input_panel_send_candidate_will_hide_ack ();
+    void isf_imf_context_input_panel_send_will_show_ack (Ecore_IMF_Context *ctx);
+    void isf_imf_context_input_panel_send_will_hide_ack (Ecore_IMF_Context *ctx);
+    void isf_imf_context_set_hardware_keyboard_mode (Ecore_IMF_Context *ctx);
+
+    void isf_imf_context_input_panel_send_candidate_will_hide_ack (Ecore_IMF_Context *ctx);
 
 #ifdef __cplusplus
 }
index 2011a22..fd76ef1 100644 (file)
@@ -133,240 +133,18 @@ public:
         return false;
     }
 
-
-    void show_ise (int client_id, int context, void *data, int length, int *input_panel_show) {
-        int cmd;
-        uint32 temp;
-        m_trans.put_command (ISM_TRANS_CMD_SHOW_ISE_PANEL);
-        m_trans.put_data ((uint32)client_id);
-        m_trans.put_data ((uint32)context);
-        m_trans.put_data ((const char *)data, (size_t)length);
-        m_trans.write_to_socket (m_socket_imclient2panel);
-        if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout))
-            IMCONTROLERR ("%s:: read_from_socket() may be timeout \n", __FUNCTION__);
-        if (m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
-                m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
-                m_trans.get_data (temp)) {
-            if (input_panel_show)
-                *input_panel_show = temp;
-        } else {
-            IMCONTROLERR ("%s:: get_command() or get_data() may fail!!!\n", __FUNCTION__);
-            if (input_panel_show)
-                *input_panel_show = false;
-        }
-    }
-
-    void hide_ise (int client_id, int context) {
-        m_trans.put_command (ISM_TRANS_CMD_HIDE_ISE_PANEL);
-        m_trans.put_data ((uint32)client_id);
-        m_trans.put_data ((uint32)context);
-    }
-
-    void show_control_panel (void) {
-        m_trans.put_command (ISM_TRANS_CMD_SHOW_ISF_CONTROL);
-    }
-
-    void hide_control_panel (void) {
-        m_trans.put_command (ISM_TRANS_CMD_HIDE_ISF_CONTROL);
-    }
-
-    void set_mode (int mode) {
-        m_trans.put_command (ISM_TRANS_CMD_SET_ISE_MODE);
-        m_trans.put_data (mode);
-    }
-
-    void set_imdata (const char* data, int len) {
-        m_trans.put_command (ISM_TRANS_CMD_SET_ISE_IMDATA);
-        m_trans.put_data (data, len);
-    }
-
-    void get_imdata (char* data, int* len) {
-        int cmd;
-        size_t datalen = 0;
-        char* data_temp = NULL;
-
-        m_trans.put_command (ISM_TRANS_CMD_GET_ISE_IMDATA);
-        m_trans.write_to_socket (m_socket_imclient2panel);
-        if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout))
-            IMCONTROLERR ("%s:: read_from_socket() may be timeout \n", __FUNCTION__);
-
-        if (m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
-                m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
-                m_trans.get_data (&data_temp, datalen)) {
-            memcpy (data, data_temp, datalen);
-            *len = datalen;
-        } else {
-            IMCONTROLERR ("%s:: get_command() or get_data() may fail!!!\n", __FUNCTION__);
-        }
-        delete [] data_temp;
-    }
-
-    void get_ise_window_geometry (int* x, int* y, int* width, int* height) {
-        int cmd;
-        uint32 x_temp = 0;
-        uint32 y_temp = 0;
-        uint32 w_temp = 0;
-        uint32 h_temp = 0;
-
-        m_trans.put_command (ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY);
-        m_trans.write_to_socket (m_socket_imclient2panel);
-
-        if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout))
-            IMCONTROLERR ("%s:: read_from_socket() may be timeout \n", __FUNCTION__);
-
-        if (m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
-            m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
-            m_trans.get_data (x_temp) &&
-            m_trans.get_data (y_temp) &&
-            m_trans.get_data (w_temp) &&
-            m_trans.get_data (h_temp)) {
-            *x = x_temp;
-            *y = y_temp;
-            *width = w_temp;
-            *height = h_temp;
-        } else {
-            IMCONTROLERR ("%s:: get_command() or get_data() may fail!!!\n", __FUNCTION__);
-        }
-    }
-
-    void get_candidate_window_geometry (int* x, int* y, int* width, int* height) {
-        int cmd;
-        uint32 x_temp = 0;
-        uint32 y_temp = 0;
-        uint32 w_temp = 0;
-        uint32 h_temp = 0;
-
-        m_trans.put_command (ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY);
-        m_trans.write_to_socket (m_socket_imclient2panel);
-
-        if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout))
-            IMCONTROLERR ("%s::read_from_socket () may be timeout \n", __FUNCTION__);
-
-        if (m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
-            m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
-            m_trans.get_data (x_temp) &&
-            m_trans.get_data (y_temp) &&
-            m_trans.get_data (w_temp) &&
-            m_trans.get_data (h_temp)) {
-            *x = x_temp;
-            *y = y_temp;
-            *width = w_temp;
-            *height = h_temp;
-        } else {
-            IMCONTROLERR ("%s::get_command () or get_data () is failed!!!\n", __FUNCTION__);
-        }
-    }
-
-    void get_ise_language_locale (char **locale) {
-        int cmd;
-        size_t datalen = 0;
-        char  *data = NULL;
-
-        m_trans.put_command (ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE);
-        m_trans.write_to_socket (m_socket_imclient2panel);
-        if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout))
-            IMCONTROLERR ("%s::read_from_socket () may be timeout \n", __FUNCTION__);
-
-        if (m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
-            m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
-            m_trans.get_data (&data, datalen)) {
-            if (locale)
-                *locale = strndup (data, datalen);
-        } else {
-            IMCONTROLERR ("%s::get_command () or get_data () is failed!!!\n", __FUNCTION__);
-            if (locale)
-                *locale = strdup ("");
-        }
-        if (data)
-            delete [] data;
-    }
-
-    void set_return_key_type (int type) {
-        m_trans.put_command (ISM_TRANS_CMD_SET_RETURN_KEY_TYPE);
-        m_trans.put_data (type);
-    }
-
-    void get_return_key_type (int &type) {
-        int cmd;
-        uint32 temp;
-
-        m_trans.put_command (ISM_TRANS_CMD_GET_RETURN_KEY_TYPE);
-        m_trans.write_to_socket (m_socket_imclient2panel);
-        if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout))
-            IMCONTROLERR ("%s:: read_from_socket() may be timeout \n", __FUNCTION__);
-
-        if (m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
-                m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
-                m_trans.get_data (temp)) {
-            type = temp;
-        } else {
-            IMCONTROLERR ("%s:: get_command() or get_data() may fail!!!\n", __FUNCTION__);
-        }
-    }
-
-    void set_return_key_disable (int disabled) {
-        m_trans.put_command (ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE);
-        m_trans.put_data (disabled);
-    }
-
-    void get_return_key_disable (int &disabled) {
-        int cmd;
-        uint32 temp;
-
-        m_trans.put_command (ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE);
-        m_trans.write_to_socket (m_socket_imclient2panel);
-        if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout))
-            IMCONTROLERR ("%s:: read_from_socket() may be timeout \n", __FUNCTION__);
-
-        if (m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
-                m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
-                m_trans.get_data (temp)) {
-            disabled = temp;
-        } else {
-            IMCONTROLERR ("%s:: get_command() or get_data() may fail!!!\n", __FUNCTION__);
-        }
-    }
-
-    void set_layout (int layout) {
-        m_trans.put_command (ISM_TRANS_CMD_SET_LAYOUT);
-        m_trans.put_data (layout);
-    }
-
-    void get_layout (int* layout) {
-        int cmd;
-        uint32 layout_temp;
-
-        m_trans.put_command (ISM_TRANS_CMD_GET_LAYOUT);
-        m_trans.write_to_socket (m_socket_imclient2panel);
-        if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout))
-            IMCONTROLERR ("%s:: read_from_socket() may be timeout \n", __FUNCTION__);
-
-        if (m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
-                m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
-                m_trans.get_data (layout_temp)) {
-            *layout = layout_temp;
-        } else {
-            IMCONTROLERR ("%s:: get_command() or get_data() may fail!!!\n", __FUNCTION__);
-        }
-    }
-
-    void set_ise_language (int language) {
-        m_trans.put_command (ISM_TRANS_CMD_SET_ISE_LANGUAGE);
-        m_trans.put_data (language);
-    }
-
     void set_active_ise_by_uuid (const char* uuid) {
         int cmd;
         m_trans.put_command (ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_UUID);
         m_trans.put_data (uuid, strlen(uuid)+1);
         m_trans.write_to_socket (m_socket_imclient2panel);
         if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout))
-            IMCONTROLERR ("%s:: read_from_socket() may be timeout \n", __FUNCTION__);
+            std::cerr << __func__ << " read_from_socket() may be timeout \n";
 
         if (m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
                 m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK) {
         } else {
-            IMCONTROLERR ("%s:: get_command() or get_data() may fail!!!\n", __FUNCTION__);
+            std::cerr << __func__ << " get_command() or get_data() may fail!!!\n";
         }
     }
 
@@ -377,14 +155,14 @@ public:
         m_trans.put_command (ISM_TRANS_CMD_GET_ACTIVE_ISE);
         m_trans.write_to_socket (m_socket_imclient2panel);
         if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout))
-            IMCONTROLERR ("%s:: read_from_socket() may be timeout \n", __FUNCTION__);
+            std::cerr << __func__ << " read_from_socket() may be timeout \n";
 
         if (m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
                 m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
                 m_trans.get_data (strTemp)) {
             uuid = strTemp;
         } else {
-            IMCONTROLERR ("%s:: get_command() or get_data() may fail!!!\n", __FUNCTION__);
+            std::cerr << __func__ << " get_command() or get_data() may fail!!!\n";
         }
     }
 
@@ -398,7 +176,7 @@ public:
         m_trans.put_command (ISM_TRANS_CMD_GET_ISE_LIST);
         m_trans.write_to_socket (m_socket_imclient2panel);
         if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout))
-            IMCONTROLERR ("%s:: read_from_socket() may be timeout \n", __FUNCTION__);
+            std::cerr << __func__ << " read_from_socket() may be timeout \n";
 
         if (m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
                 m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
@@ -406,7 +184,7 @@ public:
             *count = count_temp;
         } else {
             *count = 0;
-            IMCONTROLERR ("%s:: get_command() or get_data() may fail!!!\n", __FUNCTION__);
+            std::cerr << __func__ << " get_command() or get_data() may fail!!!\n";
         }
 
         if (count_temp > 0) {
@@ -432,7 +210,7 @@ public:
         m_trans.put_data (String (uuid));
         m_trans.write_to_socket (m_socket_imclient2panel);
         if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout))
-            IMCONTROLERR ("%s:: read_from_socket() may be timeout \n", __FUNCTION__);
+            std::cerr << __func__ << " read_from_socket() may be timeout \n";
 
         if (m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
                 m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
@@ -443,7 +221,7 @@ public:
             type     = tmp_type;
             option   = tmp_option;
         } else {
-            IMCONTROLERR ("%s:: get_command() or get_data() may fail!!!\n", __FUNCTION__);
+            std::cerr << __func__ << " get_command() or get_data() may fail!!!\n";
         }
     }
 
@@ -453,37 +231,16 @@ public:
         m_trans.put_command (ISM_TRANS_CMD_RESET_ISE_OPTION);
         m_trans.write_to_socket (m_socket_imclient2panel);
         if (!m_trans.read_from_socket (m_socket_imclient2panel, m_socket_timeout))
-            IMCONTROLERR ("%s:: read_from_socket() may be timeout \n", __FUNCTION__);
+            std::cerr << __func__ << " read_from_socket() may be timeout \n";
 
         if (m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
                 m_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK) {
             ;
         } else {
-            IMCONTROLERR ("%s:: get_command() is failed!!!\n", __FUNCTION__);
+            std::cerr << __func__ << " get_command() is failed!!!\n";
         }
     }
 
-    void set_caps_mode (int mode) {
-        m_trans.put_command (ISM_TRANS_CMD_SET_CAPS_MODE);
-        m_trans.put_data (mode);
-    }
-
-    void focus_in (void) {
-        m_trans.put_command (SCIM_TRANS_CMD_FOCUS_IN);
-    }
-
-    void focus_out (void) {
-        m_trans.put_command (SCIM_TRANS_CMD_FOCUS_OUT);
-    }
-
-    void send_will_show_ack (void) {
-        m_trans.put_command (ISM_TRANS_CMD_SEND_WILL_SHOW_ACK);
-    }
-
-    void send_will_hide_ack (void) {
-        m_trans.put_command (ISM_TRANS_CMD_SEND_WILL_HIDE_ACK);
-    }
-
     void set_active_ise_to_default (void) {
         m_trans.put_command (ISM_TRANS_CMD_RESET_DEFAULT_ISE);
     }
@@ -537,91 +294,6 @@ IMControlClient::send (void)
     return m_impl->send ();
 }
 
-void IMControlClient::show_ise (int client_id, int context, void *data, int length, int *input_panel_show)
-{
-    m_impl->show_ise (client_id, context, data,length, input_panel_show);
-}
-
-void IMControlClient::hide_ise (int client_id, int context)
-{
-    m_impl->hide_ise (client_id, context);
-}
-
-void IMControlClient::show_control_panel (void)
-{
-    m_impl->show_control_panel ();
-}
-
-void IMControlClient::hide_control_panel (void)
-{
-    m_impl->hide_control_panel ();
-}
-
-void IMControlClient::set_mode (int mode)
-{
-    m_impl->set_mode (mode);
-}
-
-void IMControlClient::set_imdata (const char* data, int len)
-{
-    m_impl->set_imdata (data, len);
-}
-
-void IMControlClient::get_imdata (char* data, int* len)
-{
-    m_impl->get_imdata (data, len);
-}
-
-void IMControlClient::get_ise_window_geometry (int* x, int* y, int* width, int* height)
-{
-    m_impl->get_ise_window_geometry (x, y, width, height);
-}
-
-void IMControlClient::get_candidate_window_geometry (int* x, int* y, int* width, int* height)
-{
-    m_impl->get_candidate_window_geometry (x, y, width, height);
-}
-
-void IMControlClient::get_ise_language_locale (char **locale)
-{
-    m_impl->get_ise_language_locale (locale);
-}
-
-void IMControlClient::set_return_key_type (int type)
-{
-    m_impl->set_return_key_type (type);
-}
-
-void IMControlClient::get_return_key_type (int &type)
-{
-    m_impl->get_return_key_type (type);
-}
-
-void IMControlClient::set_return_key_disable (int disabled)
-{
-    m_impl->set_return_key_disable (disabled);
-}
-
-void IMControlClient::get_return_key_disable (int &disabled)
-{
-    m_impl->get_return_key_disable (disabled);
-}
-
-void IMControlClient::set_layout (int layout)
-{
-    m_impl->set_layout (layout);
-}
-
-void IMControlClient::get_layout (int* layout)
-{
-    m_impl->get_layout (layout);
-}
-
-void IMControlClient::set_ise_language (int language)
-{
-    m_impl->set_ise_language (language);
-}
-
 void IMControlClient::set_active_ise_by_uuid (const char* uuid)
 {
     m_impl->set_active_ise_by_uuid (uuid);
@@ -647,31 +319,6 @@ void IMControlClient::reset_ise_option (void)
     m_impl->reset_ise_option ();
 }
 
-void IMControlClient::set_caps_mode (int mode)
-{
-    m_impl->set_caps_mode (mode);
-}
-
-void IMControlClient::focus_in (void)
-{
-    m_impl->focus_in ();
-}
-
-void IMControlClient::focus_out (void)
-{
-    m_impl->focus_out ();
-}
-
-void IMControlClient::send_will_show_ack (void)
-{
-    m_impl->send_will_show_ack ();
-}
-
-void IMControlClient::send_will_hide_ack (void)
-{
-    m_impl->send_will_hide_ack ();
-}
-
 void IMControlClient::set_active_ise_to_default (void)
 {
     m_impl->set_active_ise_to_default ();
@@ -681,7 +328,6 @@ void IMControlClient::send_candidate_will_hide_ack (void)
 {
     m_impl->send_candidate_will_hide_ack ();
 }
-
 };
 
 /*
index 9cd5511..cceacb4 100644 (file)
@@ -50,34 +50,11 @@ public:
     bool prepare                (void);
     bool send                   (void);
 
-    void show_ise (int client_id, int context, void *data, int length, int *input_panel_show);
-    void hide_ise (int client_id, int context);
-    void show_control_panel (void);
-    void hide_control_panel (void);
-    void set_mode (int mode);
-
-    void set_imdata (const char* data, int len);
-    void get_imdata (char* data, int* len);
-    void get_ise_window_geometry (int* x, int* y, int* width, int* height);
-    void get_candidate_window_geometry (int* x, int* y, int* width, int* height);
-    void get_ise_language_locale (char **locale);
-    void set_return_key_type (int type);
-    void get_return_key_type (int &type);
-    void set_return_key_disable (int disabled);
-    void get_return_key_disable (int &disabled);
-    void set_layout (int layout);
-    void get_layout (int* layout);
-    void set_ise_language (int language);
     void set_active_ise_by_uuid (const char* uuid);
     void get_active_ise (String &uuid);
     void get_ise_list (int* count, char*** iselist);
     void get_ise_info (const char* uuid, String &name, String &language, int &type, int &option);
     void reset_ise_option (void);
-    void set_caps_mode (int mode);
-    void focus_in (void);
-    void focus_out (void);
-    void send_will_show_ack (void);
-    void send_will_hide_ack (void);
     void set_active_ise_to_default (void);
     void send_candidate_will_hide_ack (void);
 };
index 31208f0..c3d6683 100644 (file)
@@ -156,6 +156,7 @@ typedef Signal5<bool, String, String &, String &, int &, int &>
 enum ClientType {
     UNKNOWN_CLIENT,
     FRONTEND_CLIENT,
+    FRONTEND_ACT_CLIENT,
     HELPER_CLIENT,
     HELPER_ACT_CLIENT,
     IMCONTROL_ACT_CLIENT,
@@ -250,9 +251,10 @@ class PanelAgent::PanelAgentImpl
     String                              m_last_helper_uuid;
     String                              m_current_ise_name;
     uint32                              m_current_ise_style;
-    int                                 m_current_active_imcontrol_id;
     int                                 m_pending_active_imcontrol_id;
-    int                                 m_show_request_imcontrol_id;
+    int                                 m_show_request_client_id;
+    int                                 m_active_client_id;
+    IntIntRepository                    m_panel_client_map;
     IntIntRepository                    m_imcontrol_map;
     bool                                m_should_shared_ise;
     bool                                m_ise_exiting;
@@ -339,7 +341,6 @@ class PanelAgent::PanelAgentImpl
     PanelAgentSignalStringVector        m_signal_get_language_list;
     PanelAgentSignalStringVector        m_signal_get_all_language;
     PanelAgentSignalStrStringVector     m_signal_get_ise_language;
-    PanelAgentSignalString              m_signal_set_isf_language;
     PanelAgentSignalStringISEINFO       m_signal_get_ise_info_by_uuid;
     PanelAgentSignalKeyEvent            m_signal_send_key_event;
 
@@ -358,6 +359,9 @@ class PanelAgent::PanelAgentImpl
 
     PanelAgentSignalVoid                m_signal_will_show_ack;
     PanelAgentSignalVoid                m_signal_will_hide_ack;
+
+    PanelAgentSignalVoid                m_signal_set_hardware_keyboard_mode;
+
     PanelAgentSignalVoid                m_signal_candidate_will_hide_ack;
 public:
     PanelAgentImpl ()
@@ -368,7 +372,8 @@ public:
           m_current_socket_client (-1), m_current_client_context (0),
           m_current_toolbar_mode (TOOLBAR_KEYBOARD_MODE),
           m_current_ise_style (0),
-          m_current_active_imcontrol_id (-1), m_pending_active_imcontrol_id (-1),
+          m_pending_active_imcontrol_id (-1),
+          m_active_client_id (-1),
           m_should_shared_ise (false),
           m_ise_exiting (false), m_is_imengine_aux (false), m_is_imengine_candidate (false),
           m_last_socket_client (-1), m_last_client_context (0)
@@ -376,6 +381,7 @@ public:
         m_current_ise_name = String (_("English Keyboard"));
         m_imcontrol_repository.clear ();
         m_imcontrol_map.clear ();
+        m_panel_client_map.clear ();
         m_socket_server.signal_connect_accept (slot (this, &PanelAgentImpl::socket_accept_callback));
         m_socket_server.signal_connect_receive (slot (this, &PanelAgentImpl::socket_receive_callback));
         m_socket_server.signal_connect_exception (slot (this, &PanelAgentImpl::socket_exception_callback));
@@ -505,65 +511,30 @@ public:
         m_current_toolbar_mode = mode;
     }
 
-    void update_ise_name (String &name)
-    {
-        ClientRepository::iterator iter = m_client_repository.begin ();
-
-        for (; iter != m_client_repository.end (); iter++) {
-            if (IMCONTROL_CLIENT == iter->second.type && iter->first == m_imcontrol_map[m_current_active_imcontrol_id]) {
-                Socket client_socket (iter->first);
-                Transaction trans;
-
-                trans.clear ();
-                trans.put_command (SCIM_TRANS_CMD_REQUEST);
-                trans.put_command (ISM_TRANS_CMD_ISE_CHANGED);
-                trans.put_data (name);
-
-                trans.write_to_socket (client_socket);
-                break;
-            }
-        }
-    }
-
-    void update_ise_style (uint32 &style)
-    {
-        ClientRepository::iterator iter = m_client_repository.begin ();
-
-        for (; iter != m_client_repository.end (); iter++) {
-            if (IMCONTROL_CLIENT == iter->second.type && iter->first == m_imcontrol_map[m_current_active_imcontrol_id]) {
-                Socket client_socket (iter->first);
-                Transaction trans;
-
-                trans.clear ();
-                trans.put_command (SCIM_TRANS_CMD_REQUEST);
-                trans.put_command (ISM_TRANS_CMD_UPDATE_ISE_STYLE);
-                trans.put_data (style);
-
-                trans.write_to_socket (client_socket);
-                break;
-            }
-        }
-    }
-
     void update_panel_event (int cmd, uint32 nType, uint32 nValue)
     {
-        SCIM_DEBUG_MAIN(1) << __func__ << " (" << nType << ", " << nValue << ")\n";
-        ClientRepository::iterator iter = m_client_repository.begin ();
-
-        for (; iter != m_client_repository.end (); iter++) {
-            if (IMCONTROL_CLIENT == iter->second.type && iter->first == m_imcontrol_map[m_current_active_imcontrol_id]) {
-                Socket client_socket (iter->first);
-                Transaction trans;
+        int    focused_client;
+        uint32 focused_context;
+        get_focused_context (focused_client, focused_context);
+        if (focused_client == -1 && m_active_client_id != -1) {
+            focused_client  = m_panel_client_map[m_active_client_id];
+            focused_context = 0;
+        }
 
-                trans.clear ();
-                trans.put_command (SCIM_TRANS_CMD_REQUEST);
-                trans.put_command (cmd);
-                trans.put_data (nType);
-                trans.put_data (nValue);
+        SCIM_DEBUG_MAIN(1) << __func__ << " (" << nType << ", " << nValue << "), client=" << focused_client << "\n";
 
-                trans.write_to_socket (client_socket);
-                break;
-            }
+        ClientInfo client_info = socket_get_client_info (focused_client);
+        if (client_info.type == FRONTEND_CLIENT) {
+            Socket client_socket (focused_client);
+            m_send_trans.clear ();
+            m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+            m_send_trans.put_data (focused_context);
+            m_send_trans.put_command (cmd);
+            m_send_trans.put_data (nType);
+            m_send_trans.put_data (nValue);
+            m_send_trans.write_to_socket (client_socket);
+        } else {
+            std::cerr << __func__ << " client is not existed!!!" << "\n";
         }
     }
 
@@ -694,24 +665,6 @@ public:
         return client >= 0;
     }
 
-    bool update_client_id (int client_id)
-    {
-        SCIM_DEBUG_MAIN(1) << __func__ << " (" << client_id << ")\n";
-
-        if (client_id >= 0) {
-            uint32 context = 0;
-            Socket client_socket (client_id);
-            m_send_trans.clear ();
-            m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
-            m_send_trans.put_data (context);
-            m_send_trans.put_command (ISM_TRANS_CMD_PANEL_UPDATE_CLIENT_ID);
-            m_send_trans.put_data ((uint32)client_id);
-            m_send_trans.write_to_socket (client_socket);
-        }
-
-        return client_id >= 0;
-    }
-
     bool change_factory (const String  &uuid)
     {
         SCIM_DEBUG_MAIN(1) << "PanelAgent::change_factory (" << uuid << ")\n";
@@ -1627,18 +1580,12 @@ public:
     void show_isf_panel (int client_id)
     {
         SCIM_DEBUG_MAIN(4) << "PanelAgent::show_isf_panel ()\n";
-        Transaction trans;
-        Socket client_socket (client_id);
-
         m_signal_show_panel ();
     }
 
     void hide_isf_panel (int client_id)
     {
         SCIM_DEBUG_MAIN(4) << "PanelAgent::hide_isf_panel ()\n";
-        Transaction trans;
-        Socket client_socket (client_id);
-
         m_signal_hide_panel ();
     }
 
@@ -1655,15 +1602,23 @@ public:
         bool ret = false;
         Transaction trans;
         Socket client_socket (client_id);
-        m_current_active_imcontrol_id = client_id;
-        m_show_request_imcontrol_id = client_id;
+        m_show_request_client_id = client_id;
+        m_active_client_id = client_id;
 
         uint32 client;
         uint32 context;
         if (m_recv_trans.get_data (client) && m_recv_trans.get_data (context) && m_recv_trans.get_data (&data, len)) {
             SCIM_DEBUG_MAIN(4) << __func__ << " (client:" << client << " context:" << context << ")\n";
             if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode) {
-                uint32 ctx = get_helper_ic (client, context);
+                int    focused_client;
+                uint32 focused_context;
+                get_focused_context (focused_client, focused_context);
+                if (focused_client == -1 && m_active_client_id != -1) {
+                    focused_client  = m_panel_client_map[m_active_client_id];
+                    focused_context = 0;
+                }
+
+                uint32 ctx = get_helper_ic (focused_client, focused_context);
                 ret = show_helper (m_current_helper_uuid, data, len, ctx);
             }
         }
@@ -1695,8 +1650,16 @@ public:
         uint32 context;
         if (m_recv_trans.get_data (client) && m_recv_trans.get_data (context)) {
             SCIM_DEBUG_MAIN(4) << __func__ << " (client:" << client << " context:" << context << ")\n";
-            if ((client_id == m_current_active_imcontrol_id || client_id == m_show_request_imcontrol_id) && TOOLBAR_HELPER_MODE == mode) {
-                uint32 ctx = get_helper_ic (client, context);
+            if ((m_panel_client_map[client_id] == m_current_socket_client || client_id == m_show_request_client_id) && TOOLBAR_HELPER_MODE == mode) {
+                int    focused_client;
+                uint32 focused_context;
+                get_focused_context (focused_client, focused_context);
+                if (focused_client == -1 && m_active_client_id != -1) {
+                    focused_client  = m_panel_client_map[m_active_client_id];
+                    focused_context = 0;
+                }
+
+                uint32 ctx = get_helper_ic (focused_client, focused_context);
                 hide_helper (m_current_helper_uuid, ctx);
             }
         }
@@ -1968,21 +1931,6 @@ public:
         }
     }
 
-    void set_isf_language (int client_id)
-    {
-        SCIM_DEBUG_MAIN(4) << "PanelAgent::set_isf_language ()\n";
-        char   *buf = NULL;
-        size_t  len;
-
-        if (m_recv_trans.get_data (&buf, len)) {
-            String lang (buf);
-            m_signal_set_isf_language (lang);
-        }
-
-        if (NULL != buf)
-            delete[] buf;
-    }
-
     void set_ise_imdata (int client_id)
     {
         SCIM_DEBUG_MAIN(4) << "PanelAgent::set_ise_imdata ()\n";
@@ -2268,7 +2216,6 @@ public:
         size_t  len;
         Transaction trans;
         Socket client_socket (client_id);
-        m_current_active_imcontrol_id = client_id;
 
         trans.clear ();
         trans.put_command (SCIM_TRANS_CMD_REPLY);
@@ -2339,27 +2286,6 @@ public:
             delete[] buf;
     }
 
-    void update_isf_control_status (const bool showed)
-    {
-        for (ClientRepository::iterator iter = m_client_repository.begin ();
-             iter != m_client_repository.end (); ++iter) {
-            if (IMCONTROL_CLIENT == iter->second.type && iter->first == m_imcontrol_map[m_current_active_imcontrol_id]) {
-                Socket client_socket (iter->first);
-                Transaction trans;
-
-                trans.clear ();
-                trans.put_command (SCIM_TRANS_CMD_REQUEST);
-                if (showed)
-                    trans.put_command (ISM_TRANS_CMD_ISF_CONTROL_SHOWED);
-                else
-                    trans.put_command (ISM_TRANS_CMD_ISF_CONTROL_HIDED);
-                trans.write_to_socket (client_socket);
-                break;
-            }
-        }
-        return;
-    }
-
     void set_ise_return_key_type (int client_id)
     {
         SCIM_DEBUG_MAIN(4) << __func__ << "\n";
@@ -2513,13 +2439,10 @@ public:
         m_send_trans.put_command (SCIM_TRANS_CMD_RELOAD_CONFIG);
 
         for (ClientRepository::iterator it = m_client_repository.begin (); it != m_client_repository.end (); ++it) {
-            if (it->second.type == IMCONTROL_ACT_CLIENT
-                || it->second.type == IMCONTROL_CLIENT
-                || it->second.type == HELPER_ACT_CLIENT)
-                continue;
-
-            Socket client_socket (it->first);
-            m_send_trans.write_to_socket (client_socket);
+            if (it->second.type == FRONTEND_CLIENT || it->second.type == HELPER_CLIENT) {
+                Socket client_socket (it->first);
+                m_send_trans.write_to_socket (client_socket);
+            }
         }
 
         unlock ();
@@ -2593,13 +2516,6 @@ public:
         m_signal_will_hide_ack ();
     }
 
-    void candidate_will_hide_ack (int client_id)
-    {
-        SCIM_DEBUG_MAIN(4) << "PanelAgent::will_hide_ack ()\n";
-
-        m_signal_candidate_will_hide_ack ();
-    }
-
     void reset_default_ise (int client_id)
     {
         SCIM_DEBUG_MAIN(4) << __func__ << "\n";
@@ -2611,6 +2527,20 @@ public:
             std::cerr << "Read SCIM_GLOBAL_CONFIG_INITIAL_ISE_UUID is failed!!!\n";
     }
 
+    void set_hardware_keyboard_mode (int client_id)
+    {
+        SCIM_DEBUG_MAIN(4) << "PanelAgent::set_hardware_keyboard_mode ()\n";
+
+        m_signal_set_hardware_keyboard_mode ();
+    }
+
+    void candidate_will_hide_ack (int client_id)
+    {
+        SCIM_DEBUG_MAIN(4) << "PanelAgent::will_hide_ack ()\n";
+
+        m_signal_candidate_will_hide_ack ();
+    }
+
     Connection signal_connect_reload_config              (PanelAgentSlotVoid                *slot)
     {
         return m_signal_reload_config.connect (slot);
@@ -2856,11 +2786,6 @@ public:
         return m_signal_get_ise_language.connect (slot);
     }
 
-    Connection signal_connect_set_isf_language           (PanelAgentSlotString                 *slot)
-    {
-        return m_signal_set_isf_language.connect (slot);
-    }
-
     Connection signal_connect_get_ise_info_by_uuid       (PanelAgentSlotStringISEINFO          *slot)
     {
         return m_signal_get_ise_info_by_uuid.connect (slot);
@@ -2931,10 +2856,16 @@ public:
         return m_signal_will_hide_ack.connect (slot);
     }
 
+    Connection signal_connect_set_hardware_keyboard_mode (PanelAgentSlotVoid                *slot)
+    {
+        return m_signal_set_hardware_keyboard_mode.connect (slot);
+    }
+
     Connection signal_connect_candidate_will_hide_ack    (PanelAgentSlotVoid                *slot)
     {
         return m_signal_candidate_will_hide_ack.connect (slot);
     }
+
 private:
     bool socket_check_client_connection (const Socket &client)
     {
@@ -2996,12 +2927,7 @@ private:
 
         /* If it's a new client, then request to open the connection first. */
         if (client_info.type == UNKNOWN_CLIENT) {
-            bool bSuccess = socket_open_connection (server, client);
-            if (bSuccess) {
-                ClientInfo client_info = socket_get_client_info (client_id);
-                if (client_info.type == FRONTEND_CLIENT)
-                    update_client_id (client_id);
-            }
+            socket_open_connection (server, client);
             return;
         }
 
@@ -3014,24 +2940,34 @@ private:
             !m_recv_trans.get_data (key)    || key != (uint32) client_info.key)
             return;
 
-        if (client_info.type == FRONTEND_CLIENT) {
+        if (client_info.type == FRONTEND_ACT_CLIENT) {
             if (m_recv_trans.get_data (context)) {
                 SCIM_DEBUG_MAIN (1) << "PanelAgent::FrontEnd Client, context = " << context << "\n";
                 socket_transaction_start();
                 while (m_recv_trans.get_command (cmd)) {
                     SCIM_DEBUG_MAIN (3) << "PanelAgent::cmd = " << cmd << "\n";
 
+                    if (cmd == ISM_TRANS_CMD_REGISTER_PANEL_CLIENT) {
+                        uint32 id = 0;
+                        if (m_recv_trans.get_data (id)) {
+                            SCIM_DEBUG_MAIN(4) << "    ISM_TRANS_CMD_REGISTER_PANEL_CLIENT (" << client_id << "," << "," << context << "," << id << ")\n";
+                            m_panel_client_map [client_id] = (int)id;
+                        }
+                        continue;
+                    }
+
                     if (cmd == SCIM_TRANS_CMD_PANEL_REGISTER_INPUT_CONTEXT) {
                         if (m_recv_trans.get_data (uuid)) {
                             SCIM_DEBUG_MAIN (2) << "PanelAgent::register_input_context (" << client_id << "," << "," << context << "," << uuid << ")\n";
-                            uint32 ctx = get_helper_ic (client_id, context);
+                            uint32 ctx = get_helper_ic (m_panel_client_map[client_id], context);
                             m_client_context_uuids [ctx] = uuid;
                         }
                         continue;
                     }
 
                     if (cmd == SCIM_TRANS_CMD_PANEL_REMOVE_INPUT_CONTEXT) {
-                        uint32 ctx = get_helper_ic (client_id, context);
+                        SCIM_DEBUG_MAIN(4) << "    SCIM_TRANS_CMD_PANEL_REMOVE_INPUT_CONTEXT (" << "client:" << client_id << " context:" << context << ")\n";
+                        uint32 ctx = get_helper_ic (m_panel_client_map[client_id], context);
                         m_client_context_uuids.erase (ctx);
                         if (ctx == get_helper_ic (m_current_socket_client, m_current_client_context)) {
                             lock ();
@@ -3058,7 +2994,7 @@ private:
                     }
 
                     if (cmd == SCIM_TRANS_CMD_PANEL_RESET_INPUT_CONTEXT) {
-                        socket_reset_input_context (client_id, context);
+                        socket_reset_input_context (m_panel_client_map[client_id], context);
                         continue;
                     }
 
@@ -3066,17 +3002,18 @@ private:
                         SCIM_DEBUG_MAIN(4) << "    SCIM_TRANS_CMD_FOCUS_IN (" << "client:" << client_id << " context:" << context << ")\n";
                         m_signal_focus_in ();
                         if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
-                            focus_in_helper (m_current_helper_uuid, client_id, context);
+                            focus_in_helper (m_current_helper_uuid, m_panel_client_map[client_id], context);
 
                         if (m_recv_trans.get_data (uuid)) {
                             SCIM_DEBUG_MAIN (2) << "PanelAgent::focus_in (" << client_id << "," << "," << context << "," << uuid << ")\n";
+                            m_active_client_id = client_id;
                             lock ();
                             if (m_current_socket_client >= 0) {
                                 m_last_socket_client  = m_current_socket_client;
                                 m_last_client_context = m_current_client_context;
                                 m_last_context_uuid   = m_current_context_uuid;
                             }
-                            m_current_socket_client  = client_id;
+                            m_current_socket_client  = m_panel_client_map[client_id];
                             m_current_client_context = context;
                             m_current_context_uuid   = uuid;
                             unlock ();
@@ -3089,20 +3026,85 @@ private:
                         continue;
                     }
 
+                    if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL) {
+                        show_isf_panel (client_id);
+                        continue;
+                    } else if (cmd == ISM_TRANS_CMD_HIDE_ISF_CONTROL) {
+                        hide_isf_panel (client_id);
+                        continue;
+                    } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_PANEL) {
+                        show_ise_panel (client_id);
+                        continue;
+                    } else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL) {
+                        hide_ise_panel (client_id);
+                        continue;
+                    } else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY) {
+                        get_input_panel_geometry (client_id);
+                        continue;
+                    } else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY) {
+                        get_candidate_window_geometry (client_id);
+                        continue;
+                    } else if (cmd == ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE) {
+                        get_ise_language_locale (client_id);
+                        continue;
+                    } else if (cmd == ISM_TRANS_CMD_SET_ISE_LANGUAGE) {
+                        set_ise_language (client_id);
+                        continue;
+                    } else if (cmd == ISM_TRANS_CMD_SET_ISE_IMDATA) {
+                        set_ise_imdata (client_id);
+                        continue;
+                    } else if (cmd == ISM_TRANS_CMD_GET_ISE_IMDATA) {
+                        get_ise_imdata (client_id);
+                        continue;
+                    } else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_TYPE) {
+                        set_ise_return_key_type (client_id);
+                        continue;
+                    } else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_TYPE) {
+                        get_ise_return_key_type (client_id);
+                        continue;
+                    } else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE) {
+                        set_ise_return_key_disable (client_id);
+                        continue;
+                    } else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE) {
+                        get_ise_return_key_disable (client_id);
+                        continue;
+                    } else if (cmd == ISM_TRANS_CMD_GET_LAYOUT) {
+                        get_ise_layout (client_id);
+                        continue;
+                    } else if (cmd == ISM_TRANS_CMD_SET_LAYOUT) {
+                        set_ise_layout (client_id);
+                        continue;
+                    } else if (cmd == ISM_TRANS_CMD_SET_CAPS_MODE) {
+                        set_ise_caps_mode (client_id);
+                        continue;
+                    } else if (cmd == ISM_TRANS_CMD_SEND_WILL_SHOW_ACK) {
+                        will_show_ack (client_id);
+                        continue;
+                    } else if (cmd == ISM_TRANS_CMD_SEND_WILL_HIDE_ACK) {
+                        will_hide_ack (client_id);
+                        continue;
+                    } else if (cmd == ISM_TRANS_CMD_SET_HARDWARE_KEYBOARD_MODE) {
+                        set_hardware_keyboard_mode (client_id);
+                        continue;
+                    } else if (cmd == ISM_TRANS_CMD_SEND_CANDIDATE_WILL_HIDE_ACK) {
+                        candidate_will_hide_ack (client_id);
+                        continue;
+                    }
+
                     current = last = false;
                     uuid.clear ();
 
                     /* Get the context uuid from the client context registration table. */
                     {
-                        ClientContextUUIDRepository::iterator it = m_client_context_uuids.find (get_helper_ic (client_id, context));
+                        ClientContextUUIDRepository::iterator it = m_client_context_uuids.find (get_helper_ic (m_panel_client_map[client_id], context));
                         if (it != m_client_context_uuids.end ())
                             uuid = it->second;
                     }
 
-                    if (m_current_socket_client == client_id && m_current_client_context == context) {
+                    if (m_current_socket_client == m_panel_client_map[client_id] && m_current_client_context == context) {
                         current = true;
                         if (!uuid.length ()) uuid = m_current_context_uuid;
-                    } else if (m_last_socket_client == client_id && m_last_client_context == context) {
+                    } else if (m_last_socket_client == m_panel_client_map[client_id] && m_last_client_context == context) {
                         last = true;
                         if (!uuid.length ()) uuid = m_last_context_uuid;
                     }
@@ -3116,13 +3118,13 @@ private:
                     }
 
                     if (cmd == SCIM_TRANS_CMD_START_HELPER) {
-                        socket_start_helper (client_id, context, uuid);
+                        socket_start_helper (m_panel_client_map[client_id], context, uuid);
                         continue;
                     } else if (cmd == SCIM_TRANS_CMD_SEND_HELPER_EVENT) {
-                        socket_send_helper_event (client_id, context, uuid);
+                        socket_send_helper_event (m_panel_client_map[client_id], context, uuid);
                         continue;
                     } else if (cmd == SCIM_TRANS_CMD_STOP_HELPER) {
-                        socket_stop_helper (client_id, context, uuid);
+                        socket_stop_helper (m_panel_client_map[client_id], context, uuid);
                         continue;
                     }
 
@@ -3197,7 +3199,7 @@ private:
                         TOOLBAR_MODE_T mode = m_current_toolbar_mode;
 
                         if (TOOLBAR_HELPER_MODE == mode)
-                            focus_out_helper (m_current_helper_uuid, client_id, context);
+                            focus_out_helper (m_current_helper_uuid, m_panel_client_map[client_id], context);
 
                         if (m_current_socket_client >= 0) {
                             m_last_socket_client  = m_current_socket_client;
@@ -3212,6 +3214,27 @@ private:
                 }
                 socket_transaction_end ();
             }
+        } else if (client_info.type == FRONTEND_CLIENT) {
+            if (m_recv_trans.get_data (context)) {
+                SCIM_DEBUG_MAIN (1) << "client_info.type == FRONTEND_CLIENT\n";
+                socket_transaction_start();
+                while (m_recv_trans.get_command (cmd)) {
+                    SCIM_DEBUG_MAIN (3) << "PanelAgent::cmd = " << cmd << "\n";
+
+                    if (cmd == ISM_TRANS_CMD_GET_PANEL_CLIENT_ID) {
+                        Socket client_socket (client_id);
+
+                        Transaction trans;
+                        trans.clear ();
+                        trans.put_command (SCIM_TRANS_CMD_REPLY);
+                        trans.put_command (SCIM_TRANS_CMD_OK);
+                        trans.put_data (client_id);
+                        trans.write_to_socket (client_socket);
+                        continue;
+                    }
+                }
+                socket_transaction_end ();
+            }
         } else if (client_info.type == HELPER_CLIENT) {
             socket_transaction_start ();
             while (m_recv_trans.get_command (cmd)) {
@@ -3269,10 +3292,6 @@ private:
                 } else if (cmd == SCIM_TRANS_CMD_RELOAD_CONFIG) {
                     reload_config ();
                     m_signal_reload_config ();
-                } else if (cmd == ISM_TRANS_CMD_ISE_PANEL_HIDED) {
-                    socket_helper_update_state_hided (client_id);
-                } else if (cmd == ISM_TRANS_CMD_ISE_PANEL_SHOWED) {
-                    socket_helper_update_state_showed (client_id);
                 } else if (cmd == ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT) {
                     socket_helper_update_input_context (client_id);
                 } else if (cmd == ISM_TRANS_CMD_GET_KEYBOARD_ISE_LIST) {
@@ -3321,70 +3340,17 @@ private:
             socket_transaction_start ();
 
             while (m_recv_trans.get_command (cmd)) {
-                if (cmd == ISM_TRANS_CMD_SHOW_ISF_CONTROL)
-                    show_isf_panel (client_id);
-                else if (cmd == ISM_TRANS_CMD_HIDE_ISF_CONTROL)
-                    hide_isf_panel (client_id);
-                else if (cmd == ISM_TRANS_CMD_SHOW_ISE_PANEL)
-                    show_ise_panel (client_id);
-                else if (cmd == ISM_TRANS_CMD_HIDE_ISE_PANEL)
-                    hide_ise_panel (client_id);
-                else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY)
-                    get_input_panel_geometry (client_id);
-                else if (cmd == ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY)
-                    get_candidate_window_geometry (client_id);
-                else if (cmd == ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE)
-                    get_ise_language_locale (client_id);
-                else if (cmd == ISM_TRANS_CMD_SET_ISE_MODE)
-                    set_ise_mode (client_id);
-                else if (cmd == ISM_TRANS_CMD_SET_ISE_LANGUAGE)
-                    set_ise_language (client_id);
-                else if (cmd == ISM_TRANS_CMD_SET_ISE_IMDATA)
-                    set_ise_imdata (client_id);
-                else if (cmd == ISM_TRANS_CMD_GET_ISE_IMDATA)
-                    get_ise_imdata (client_id);
-                else if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE)
+                if (cmd == ISM_TRANS_CMD_GET_ACTIVE_ISE)
                     get_active_ise (client_id);
-                else if (cmd == ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_UUID)
+                else if (cmd == ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_UUID) {
                     set_active_ise_by_uuid (client_id);
-                else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_TYPE)
-                    set_ise_return_key_type (client_id);
-                else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_TYPE)
-                    get_ise_return_key_type (client_id);
-                else if (cmd == ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE)
-                    set_ise_return_key_disable (client_id);
-                else if (cmd == ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE)
-                    get_ise_return_key_disable (client_id);
-                else if (cmd == ISM_TRANS_CMD_GET_LAYOUT)
-                    get_ise_layout (client_id);
-                else if (cmd == ISM_TRANS_CMD_SET_LAYOUT)
-                    set_ise_layout (client_id);
-                else if (cmd == ISM_TRANS_CMD_SET_CAPS_MODE)
-                    set_ise_caps_mode (client_id);
+                }
                 else if (cmd == ISM_TRANS_CMD_GET_ISE_LIST)
                     get_ise_list (client_id);
                 else if (cmd == ISM_TRANS_CMD_GET_ISE_INFORMATION)
                     get_ise_information (client_id);
                 else if (cmd == ISM_TRANS_CMD_RESET_ISE_OPTION)
                     reset_ise_option (client_id);
-                else if (cmd == ISM_TRANS_CMD_GET_LANGUAGE_LIST)
-                    get_language_list (client_id);
-                else if (cmd == ISM_TRANS_CMD_GET_ALL_LANGUAGE_LIST)
-                    get_all_language (client_id);
-                else if (cmd == ISM_TRANS_CMD_GET_ISE_LANGUAGE)
-                    get_ise_language (client_id);
-                else if (cmd == ISM_TRANS_CMD_SET_ISF_LANGUAGE)
-                    set_isf_language (client_id);
-                else if (cmd == ISM_TRANS_CMD_RESET_ISE_CONTEXT)
-                    reset_ise_context (client_id);
-                else if (cmd == SCIM_TRANS_CMD_FOCUS_IN)
-                    m_current_active_imcontrol_id = client_id;
-                else if (cmd == ISM_TRANS_CMD_SEND_WILL_SHOW_ACK)
-                    will_show_ack (client_id);
-                else if (cmd == ISM_TRANS_CMD_SEND_WILL_HIDE_ACK)
-                    will_hide_ack (client_id);
-                else if (cmd == ISM_TRANS_CMD_SEND_CANDIDATE_WILL_HIDE_ACK)
-                    candidate_will_hide_ack (client_id);
                 else if (cmd == ISM_TRANS_CMD_RESET_DEFAULT_ISE)
                     reset_default_ise (client_id);
             }
@@ -3409,7 +3375,7 @@ private:
         uint32 key;
         String type = scim_socket_accept_connection (key,
                                                      String ("Panel"),
-                                                     String ("FrontEnd,Helper,Helper_Active,IMControl_Active,IMControl_Passive"),
+                                                     String ("FrontEnd,FrontEnd_Active,Helper,Helper_Active,IMControl_Active,IMControl_Passive"),
                                                      client,
                                                      m_socket_timeout);
 
@@ -3417,9 +3383,10 @@ private:
             ClientInfo info;
             info.key = key;
             info.type = ((type == "FrontEnd") ? FRONTEND_CLIENT :
+                        ((type == "FrontEnd_Active") ? FRONTEND_ACT_CLIENT :
                         ((type == "IMControl_Active") ? IMCONTROL_ACT_CLIENT :
                         ((type == "Helper_Active") ? HELPER_ACT_CLIENT :
-                        ((type == "IMControl_Passive") ? IMCONTROL_CLIENT : HELPER_CLIENT))));
+                        ((type == "IMControl_Passive") ? IMCONTROL_CLIENT : HELPER_CLIENT)))));
 
             SCIM_DEBUG_MAIN (4) << "Add client to repository. Type=" << type << " key=" << key << "\n";
             lock ();
@@ -3472,6 +3439,9 @@ private:
             SCIM_DEBUG_MAIN(4) << "It's a FrontEnd client.\n";
             /* The focused client is closed. */
             if (m_current_socket_client == client.get_id ()) {
+                if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
+                    hide_helper (m_current_helper_uuid);
+
                 lock ();
                 m_current_socket_client = -1;
                 m_current_client_context = 0;
@@ -3547,6 +3517,11 @@ private:
                     if (!(iter->second.option & ISM_ISE_HIDE_IN_CONTROL_PANEL))
                         socket_update_control_panel ();
             }
+        } else if (client_info.type == FRONTEND_ACT_CLIENT) {
+            SCIM_DEBUG_MAIN(4) << "It's a FRONTEND_ACT_CLIENT client.\n";
+            IntIntRepository::iterator iter2 = m_panel_client_map.find (client.get_id ());
+            if (iter2 != m_panel_client_map.end ())
+                m_panel_client_map.erase (iter2);
         } else if (client_info.type == HELPER_CLIENT) {
             SCIM_DEBUG_MAIN(4) << "It's a Helper client.\n";
 
@@ -3594,10 +3569,6 @@ private:
             SCIM_DEBUG_MAIN(4) << "It's a IMCONTROL_ACT_CLIENT client.\n";
             int client_id = client.get_id ();
 
-            if (client_id == m_current_active_imcontrol_id
-                && TOOLBAR_HELPER_MODE == m_current_toolbar_mode)
-                hide_helper (m_current_helper_uuid);
-
             IMControlRepository::iterator iter = m_imcontrol_repository.find (client_id);
             if (iter != m_imcontrol_repository.end ()) {
                 int size = iter->second.info.size ();
@@ -4700,11 +4671,6 @@ private:
                         m_send_trans.put_data (icit->second [i].second);
                     }
                     m_start_helper_ic_index.erase (icit);
-                } else {
-                    m_send_trans.put_command (SCIM_TRANS_CMD_HELPER_ATTACH_INPUT_CONTEXT);
-                    uint32 ctx = get_helper_ic (m_current_socket_client, m_current_client_context);
-                    m_send_trans.put_data (ctx);
-                    m_send_trans.put_data (info.uuid);
                 }
 
                 m_send_trans.put_command (SCIM_TRANS_CMD_UPDATE_SCREEN);
@@ -4773,48 +4739,6 @@ private:
         unlock ();
     }
 
-    void socket_helper_update_state_hided          (int client)
-    {
-        SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_update_state_hided (" << client << ")\n";
-
-        ClientRepository::iterator iter = m_client_repository.begin ();
-
-        for (; iter != m_client_repository.end (); iter++) {
-            if (IMCONTROL_CLIENT == iter->second.type && iter->first == m_imcontrol_map[m_current_active_imcontrol_id]) {
-                Socket client_socket (iter->first);
-                Transaction trans;
-
-                trans.clear ();
-                trans.put_command (SCIM_TRANS_CMD_REQUEST);
-                trans.put_command (ISM_TRANS_CMD_ISE_PANEL_HIDED);
-
-                trans.write_to_socket (client_socket);
-                break;
-            }
-        }
-    }
-
-    void socket_helper_update_state_showed          (int client)
-    {
-        SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_update_state_showed (" << client << ")\n";
-
-        ClientRepository::iterator iter = m_client_repository.begin ();
-
-        for (; iter != m_client_repository.end (); iter++) {
-            if (IMCONTROL_CLIENT == iter->second.type && iter->first == m_imcontrol_map[m_current_active_imcontrol_id]) {
-                Socket client_socket (iter->first);
-                Transaction trans;
-
-                trans.clear ();
-                trans.put_command (SCIM_TRANS_CMD_REQUEST);
-                trans.put_command (ISM_TRANS_CMD_ISE_PANEL_SHOWED);
-
-                trans.write_to_socket (client_socket);
-                break;
-            }
-        }
-    }
-
     void socket_helper_update_input_context          (int client)
     {
         SCIM_DEBUG_MAIN(4) << "PanelAgent::socket_helper_update_input_context (" << client << ")\n";
@@ -4824,22 +4748,23 @@ private:
 
         if (m_recv_trans.get_data (type) && m_recv_trans.get_data (value)) {
             m_signal_update_input_context ((int)type, (int)value);
-            ClientRepository::iterator iter = m_client_repository.begin ();
-
-            for (; iter != m_client_repository.end (); iter++) {
-                if (IMCONTROL_CLIENT == iter->second.type && iter->first == m_imcontrol_map[m_current_active_imcontrol_id]) {
-                    Socket client_socket (iter->first);
-                    Transaction trans;
 
-                    trans.clear ();
-                    trans.put_command (SCIM_TRANS_CMD_REQUEST);
-                    trans.put_command (ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT);
-                    trans.put_data (type);
-                    trans.put_data (value);
+            int    focused_client;
+            uint32 focused_context;
+            get_focused_context (focused_client, focused_context);
 
-                    trans.write_to_socket (client_socket);
-                    break;
-                }
+            ClientInfo client_info = socket_get_client_info (focused_client);
+            if (client_info.type == FRONTEND_CLIENT) {
+                Socket client_socket (focused_client);
+                m_send_trans.clear ();
+                m_send_trans.put_command (SCIM_TRANS_CMD_REPLY);
+                m_send_trans.put_data (focused_context);
+                m_send_trans.put_command (ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT);
+                m_send_trans.put_data (type);
+                m_send_trans.put_data (value);
+                m_send_trans.write_to_socket (client_socket);
+            } else {
+                std::cerr << "focused client is not existed!!!" << "\n";
             }
         }
     }
@@ -5468,18 +5393,6 @@ PanelAgent::set_current_ise_style (uint32 &style)
 }
 
 void
-PanelAgent::update_ise_name (String &name)
-{
-    m_impl->update_ise_name (name);
-}
-
-void
-PanelAgent::update_ise_style (uint32 &style)
-{
-    m_impl->update_ise_style (style);
-}
-
-void
 PanelAgent::update_candidate_panel_event (uint32 nType, uint32 nValue)
 {
     m_impl->update_panel_event (ISM_TRANS_CMD_UPDATE_ISF_CANDIDATE_PANEL, nType, nValue);
@@ -5672,12 +5585,6 @@ PanelAgent::filter_helper_manager_event    (void)
     return m_impl->filter_helper_manager_event ();
 }
 
-void
-PanelAgent::update_isf_control_status      (const bool showed)
-{
-   m_impl->update_isf_control_status (showed);
-}
-
 int
 PanelAgent::send_display_name              (String &name)
 {
@@ -6015,12 +5922,6 @@ PanelAgent::signal_connect_get_ise_language           (PanelAgentSlotStrStringVe
 }
 
 Connection
-PanelAgent::signal_connect_set_isf_language           (PanelAgentSlotString              *slot)
-{
-    return m_impl->signal_connect_set_isf_language (slot);
-}
-
-Connection
 PanelAgent::signal_connect_get_ise_info_by_uuid       (PanelAgentSlotStringISEINFO       *slot)
 {
     return m_impl->signal_connect_get_ise_info_by_uuid (slot);
@@ -6105,7 +6006,13 @@ PanelAgent::signal_connect_will_hide_ack              (PanelAgentSlotVoid
 }
 
 Connection
-PanelAgent::signal_connect_candidate_will_hide_ack              (PanelAgentSlotVoid                *slot)
+PanelAgent::signal_connect_set_hardware_keyboard_mode (PanelAgentSlotVoid                *slot)
+{
+    return m_impl->signal_connect_set_hardware_keyboard_mode (slot);
+}
+
+Connection
+PanelAgent::signal_connect_candidate_will_hide_ack    (PanelAgentSlotVoid                *slot)
 {
     return m_impl->signal_connect_candidate_will_hide_ack (slot);
 }
index b3d0e31..d3dc454 100644 (file)
@@ -366,20 +366,6 @@ public:
     void get_current_ise_geometry (rectinfo &rect);
 
     /**
-     * @brief Update ISE name to IM Control.
-     *
-     * @param name The ISE name.
-     */
-    void update_ise_name (String &name);
-
-    /**
-     * @brief Update ISE style to IM Control.
-     *
-     * @param style The ISE style.
-     */
-    void update_ise_style (uint32 &style);
-
-    /**
      * @brief Send candidate panel event to IM Control.
      *
      * @param nType  The candidate panel event type.
@@ -396,13 +382,6 @@ public:
     void update_input_panel_event (uint32 nType, uint32 nValue);
 
     /**
-     * @brief Update ISE control panel status to IM Control.
-     *
-     * @param showed The control panel status.
-     */
-    void update_isf_control_status (const bool showed);
-
-    /**
      * @brief Notice helper ISE to focus out.
      *
      * @param uuid The helper ISE uuid.
@@ -1044,13 +1023,6 @@ public:
     Connection signal_connect_get_ise_language           (PanelAgentSlotStrStringVector     *slot);
 
     /**
-     * @brief Signal: Set the isf language.
-     *
-     * slot prototype: void get_ise_language (char *, std::vector<String> &);
-     */
-    Connection signal_connect_set_isf_language           (PanelAgentSlotString              *slot);
-
-    /**
      * @brief Signal: Get the ise information by uuid.
      *
      * slot prototype: bool get_ise_info_by_uuid (const String &, ISE_INFO &);
@@ -1159,11 +1131,19 @@ public:
     Connection signal_connect_will_hide_ack              (PanelAgentSlotVoid                *slot);
 
     /**
+     * @brief Signal: Set hardware mode
+     *
+     * slot prototype: void set_hardware_keyboard_mode (void);
+     */
+    Connection signal_connect_set_hardware_keyboard_mode (PanelAgentSlotVoid                *slot);
+
+    /**
      * @brief Signal: Notifies the client finished handling WILL_HIDE event for candidate
      *
      * slot prototype: void candidate_will_hide_ack (void);
      */
     Connection signal_connect_candidate_will_hide_ack    (PanelAgentSlotVoid                *slot);
+
 };
 
 /**  @} */
index cdd58d0..3554698 100644 (file)
  *
  * Modifications by Samsung Electronics Co., Ltd.
  * 1. Add new signals
- *    a. m_signal_select_aux, m_signal_reset_keyboard_ise and m_signal_update_client_id
+ *    a. m_signal_select_aux, m_signal_reset_keyboard_ise
  *    b. m_signal_update_candidate_item_layout and m_signal_update_displayed_candidate_number
  *    c. m_signal_get_surrounding_text and m_signal_delete_surrounding_text
  *    d. m_signal_show_preedit_string, m_signal_hide_preedit_string, m_signal_update_preedit_string and m_signal_update_preedit_caret
  *    e. m_signal_candidate_more_window_show, m_signal_candidate_more_window_hide, m_signal_longpress_candidate
+ *    f. m_signal_update_ise_input_context, m_signal_update_isf_candidate_panel
  * 2. Add new interface APIs in PanelClient class
  *    a. update_cursor_position () and update_surrounding_text ()
  *    b. expand_candidate (), contract_candidate () and set_candidate_style ()
- *    c. reset_input_context () and turn_on_log
+ *    c. reset_input_context () and turn_on_log ()
+ *    d. get_client_id () and register_client ()
  *
  * $Id: scim_panel_client.cpp,v 1.6 2005/06/26 16:35:33 suzhe Exp $
  *
@@ -52,6 +54,7 @@
 #include "scim.h"
 
 #include <unistd.h>
+#include <string.h>
 
 namespace scim {
 
@@ -85,9 +88,12 @@ typedef Signal2<void, int, const std::vector<uint32> &>
 class PanelClient::PanelClientImpl
 {
     SocketClient                                m_socket;
+    SocketClient                                m_socket_active;
     int                                         m_socket_timeout;
     uint32                                      m_socket_magic_key;
+    uint32                                      m_socket_magic_key_active;
     Transaction                                 m_send_trans;
+    Transaction                                 m_recv_trans;
     int                                         m_current_icid;
     int                                         m_send_refcount;
 
@@ -121,12 +127,13 @@ class PanelClient::PanelClientImpl
     PanelClientSignalVoid                       m_signal_candidate_more_window_show;
     PanelClientSignalVoid                       m_signal_candidate_more_window_hide;
     PanelClientSignalInt                        m_signal_longpress_candidate;
-    PanelClientSignalInt                        m_signal_update_client_id;
+    PanelClientSignalIntInt                     m_signal_update_ise_input_context;
+    PanelClientSignalIntInt                     m_signal_update_isf_candidate_panel;
 
 public:
     PanelClientImpl ()
         : m_socket_timeout (scim_get_default_socket_timeout ()),
-          m_socket_magic_key (0),
+          m_socket_magic_key (0), m_socket_magic_key_active (0),
           m_current_icid (-1),
           m_send_refcount (0)
     {
@@ -166,6 +173,15 @@ public:
 
             if (ret && scim_socket_open_connection (m_socket_magic_key, String ("FrontEnd"), String ("Panel"), m_socket, m_socket_timeout)) {
                 ISF_LOG (" PID=%d connect to PanelAgent (%s), connected:%d.\n", getpid (), panel_address.c_str (), count);
+                if (!m_socket_active.connect (addr))
+                    return -1;
+                if (!scim_socket_open_connection (m_socket_magic_key_active,
+                                                  String ("FrontEnd_Active"), String ("Panel"),
+                                                  m_socket_active, m_socket_timeout)) {
+                    m_socket_active.close ();
+                    m_socket_magic_key_active = 0;
+                    return -1;
+                }
                 break;
             } else {
                 std::cerr << " PID=" << getpid () << " cannot connect to PanelAgent (" << panel_address << "), connected:" << count << ".\n";
@@ -185,7 +201,9 @@ public:
     void close_connection       ()
     {
         m_socket.close ();
-        m_socket_magic_key = 0;
+        m_socket_active.close ();
+        m_socket_magic_key        = 0;
+        m_socket_magic_key_active = 0;
     }
 
     int  get_connection_number  () const
@@ -437,11 +455,18 @@ public:
                             m_signal_longpress_candidate ((int) context, (int)index);
                     }
                     break;
-                case ISM_TRANS_CMD_PANEL_UPDATE_CLIENT_ID:
+                case ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT:
+                    {
+                        uint32 type, value;
+                        if (recv.get_data (type) && recv.get_data (value))
+                            m_signal_update_ise_input_context ((int) context, (int)type, (int)value);
+                    }
+                    break;
+                case ISM_TRANS_CMD_UPDATE_ISF_CANDIDATE_PANEL:
                     {
-                        uint32 client_id;
-                        if (recv.get_data (client_id))
-                            m_signal_update_client_id ((int) context, (int)client_id);
+                        uint32 type, value;
+                        if (recv.get_data (type) && recv.get_data (value))
+                            m_signal_update_isf_candidate_panel ((int) context, (int)type, (int)value);
                     }
                     break;
                 default:
@@ -453,7 +478,7 @@ public:
 
     bool prepare                (int icid)
     {
-        if (!m_socket.is_connected ()) return false;
+        if (!m_socket_active.is_connected ()) return false;
 
         int cmd;
         uint32 data;
@@ -462,7 +487,7 @@ public:
             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 (m_socket_magic_key_active);
             m_send_trans.put_data ((uint32) icid);
 
             if (m_send_trans.get_command (cmd) &&
@@ -482,7 +507,7 @@ public:
 
     bool send                   ()
     {
-        if (!m_socket.is_connected ()) return false;
+        if (!m_socket_active.is_connected ()) return false;
 
         if (m_send_refcount <= 0) return false;
 
@@ -491,7 +516,7 @@ public:
         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 m_send_trans.write_to_socket (m_socket_active, 0x4d494353);
 
         return false;
     }
@@ -717,6 +742,357 @@ public:
         }
     }
 
+    bool post_prepare           (void)
+    {
+        if (m_socket_active.is_connected () && m_send_refcount > 0) {
+            m_send_trans.clear ();
+            m_send_trans.put_command (SCIM_TRANS_CMD_REQUEST);
+            m_send_trans.put_data (m_socket_magic_key_active);
+            m_send_trans.put_data ((uint32) m_current_icid);
+
+            return true;
+        }
+
+        return false;
+    }
+
+    bool instant_send           (void)
+    {
+        if (m_socket_active.is_connected () && m_send_refcount > 0) {
+
+            m_send_refcount --;
+
+            if (m_send_trans.get_data_type () != SCIM_TRANS_DATA_UNKNOWN)
+                return m_send_trans.write_to_socket (m_socket_active, 0x4d494353);
+        }
+
+        return false;
+    }
+
+    void show_ise               (int client_id, int icid, void *data, int length, int *input_panel_show) {
+        if (m_send_refcount > 0 && m_current_icid == icid) {
+            int cmd;
+            uint32 temp;
+            m_send_trans.put_command (ISM_TRANS_CMD_SHOW_ISE_PANEL);
+            m_send_trans.put_data ((uint32)client_id);
+            m_send_trans.put_data ((uint32)icid);
+            m_send_trans.put_data ((const char *)data, (size_t)length);
+            instant_send ();
+            if (!m_send_trans.read_from_socket (m_socket_active, m_socket_timeout))
+                std::cerr << __func__ << " read_from_socket() may be timeout \n";
+            if (m_send_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+                    m_send_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
+                    m_send_trans.get_data (temp)) {
+                if (input_panel_show)
+                    *input_panel_show = temp;
+            } else {
+                std::cerr << __func__ << " get_command() or get_data() may fail!!!\n";
+                if (input_panel_show)
+                    *input_panel_show = false;
+            }
+            post_prepare ();
+        }
+    }
+
+    void hide_ise               (int client_id, int icid) {
+        if (m_send_refcount > 0 && m_current_icid == icid) {
+            m_send_trans.put_command (ISM_TRANS_CMD_HIDE_ISE_PANEL);
+            m_send_trans.put_data ((uint32)client_id);
+            m_send_trans.put_data ((uint32)icid);
+        }
+    }
+
+    void show_control_panel (void) {
+        if (m_send_refcount > 0)
+            m_send_trans.put_command (ISM_TRANS_CMD_SHOW_ISF_CONTROL);
+    }
+
+    void hide_control_panel (void) {
+        if (m_send_refcount > 0)
+            m_send_trans.put_command (ISM_TRANS_CMD_HIDE_ISF_CONTROL);
+    }
+
+    void set_imdata (const char* data, int len) {
+        if (m_send_refcount > 0) {
+            m_send_trans.put_command (ISM_TRANS_CMD_SET_ISE_IMDATA);
+            m_send_trans.put_data (data, len);
+        }
+    }
+
+    void get_imdata (char* data, int* len) {
+        if (m_send_refcount > 0) {
+            int cmd;
+            size_t datalen = 0;
+            char* data_temp = NULL;
+
+            m_send_trans.put_command (ISM_TRANS_CMD_GET_ISE_IMDATA);
+            instant_send ();
+            if (!m_send_trans.read_from_socket (m_socket_active, m_socket_timeout))
+                std::cerr << __func__ << " read_from_socket() may be timeout \n";
+
+            if (m_send_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+                    m_send_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
+                    m_send_trans.get_data (&data_temp, datalen)) {
+                memcpy (data, data_temp, datalen);
+                *len = datalen;
+            } else {
+                std::cerr << __func__ << " get_command() or get_data() may fail!!!\n";
+            }
+            if (data_temp)
+                delete [] data_temp;
+            post_prepare ();
+        }
+    }
+
+    void get_ise_window_geometry (int* x, int* y, int* width, int* height) {
+        if (m_send_refcount > 0) {
+            int cmd;
+            uint32 x_temp = 0;
+            uint32 y_temp = 0;
+            uint32 w_temp = 0;
+            uint32 h_temp = 0;
+
+            m_send_trans.put_command (ISM_TRANS_CMD_GET_ACTIVE_ISE_GEOMETRY);
+            instant_send ();
+
+            if (!m_send_trans.read_from_socket (m_socket_active, m_socket_timeout))
+                std::cerr << __func__ << " read_from_socket() may be timeout \n";
+
+            if (m_send_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+                m_send_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
+                m_send_trans.get_data (x_temp) &&
+                m_send_trans.get_data (y_temp) &&
+                m_send_trans.get_data (w_temp) &&
+                m_send_trans.get_data (h_temp)) {
+                *x = x_temp;
+                *y = y_temp;
+                *width = w_temp;
+                *height = h_temp;
+            } else {
+                std::cerr << __func__ << " get_command() or get_data() may fail!!!\n";
+            }
+            post_prepare ();
+        }
+    }
+
+    void get_candidate_window_geometry (int* x, int* y, int* width, int* height) {
+        if (m_send_refcount > 0) {
+            int cmd;
+            uint32 x_temp = 0;
+            uint32 y_temp = 0;
+            uint32 w_temp = 0;
+            uint32 h_temp = 0;
+
+            m_send_trans.put_command (ISM_TRANS_CMD_GET_CANDIDATE_GEOMETRY);
+            instant_send ();
+
+            if (!m_send_trans.read_from_socket (m_socket_active, m_socket_timeout))
+                std::cerr << __func__ << " read_from_socket () may be timeout \n";
+
+            if (m_send_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+                m_send_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
+                m_send_trans.get_data (x_temp) &&
+                m_send_trans.get_data (y_temp) &&
+                m_send_trans.get_data (w_temp) &&
+                m_send_trans.get_data (h_temp)) {
+                *x = x_temp;
+                *y = y_temp;
+                *width = w_temp;
+                *height = h_temp;
+            } else {
+                std::cerr << __func__ << " get_command () or get_data () is failed!!!\n";
+            }
+            post_prepare ();
+        }
+    }
+
+    void get_ise_language_locale (char **locale) {
+        if (m_send_refcount > 0) {
+            int cmd;
+            size_t datalen = 0;
+            char  *data = NULL;
+
+            m_send_trans.put_command (ISM_TRANS_CMD_GET_ISE_LANGUAGE_LOCALE);
+            instant_send ();
+            if (!m_send_trans.read_from_socket (m_socket_active, m_socket_timeout))
+                std::cerr << __func__ << " read_from_socket () may be timeout \n";
+
+            if (m_send_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+                m_send_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
+                m_send_trans.get_data (&data, datalen)) {
+                if (locale)
+                    *locale = strndup (data, datalen);
+            } else {
+                std::cerr << __func__ << " get_command () or get_data () is failed!!!\n";
+                if (locale)
+                    *locale = strdup ("");
+            }
+            if (data)
+                delete [] data;
+            post_prepare ();
+        }
+    }
+
+    void set_return_key_type (int type) {
+        if (m_send_refcount > 0) {
+            m_send_trans.put_command (ISM_TRANS_CMD_SET_RETURN_KEY_TYPE);
+            m_send_trans.put_data (type);
+        }
+    }
+
+    void get_return_key_type (int &type) {
+        if (m_send_refcount > 0) {
+            int cmd;
+            uint32 temp;
+
+            m_send_trans.put_command (ISM_TRANS_CMD_GET_RETURN_KEY_TYPE);
+            instant_send ();
+            if (!m_send_trans.read_from_socket (m_socket_active, m_socket_timeout))
+                std::cerr << __func__ << " read_from_socket() may be timeout \n";
+
+            if (m_send_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+                    m_send_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
+                    m_send_trans.get_data (temp)) {
+                type = temp;
+            } else {
+                std::cerr << __func__ << " get_command() or get_data() may fail!!!\n";
+            }
+            post_prepare ();
+        }
+    }
+
+    void set_return_key_disable (int disabled) {
+        if (m_send_refcount > 0) {
+            m_send_trans.put_command (ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE);
+            m_send_trans.put_data (disabled);
+        }
+    }
+
+    void get_return_key_disable (int &disabled) {
+        if (m_send_refcount > 0) {
+            int cmd;
+            uint32 temp;
+
+            m_send_trans.put_command (ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE);
+            instant_send ();
+            if (!m_send_trans.read_from_socket (m_socket_active, m_socket_timeout))
+                std::cerr << __func__ << " read_from_socket() may be timeout \n";
+
+            if (m_send_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+                    m_send_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
+                    m_send_trans.get_data (temp)) {
+                disabled = temp;
+            } else {
+                std::cerr << __func__ << " get_command() or get_data() may fail!!!\n";
+            }
+            post_prepare ();
+        }
+    }
+
+    void set_layout (int layout) {
+        if (m_send_refcount > 0) {
+            m_send_trans.put_command (ISM_TRANS_CMD_SET_LAYOUT);
+            m_send_trans.put_data (layout);
+        }
+    }
+
+    void get_layout (int* layout) {
+        if (m_send_refcount > 0) {
+            int cmd;
+            uint32 layout_temp;
+
+            m_send_trans.put_command (ISM_TRANS_CMD_GET_LAYOUT);
+            instant_send ();
+            if (!m_send_trans.read_from_socket (m_socket_active, m_socket_timeout))
+                std::cerr << __func__ << " read_from_socket() may be timeout \n";
+
+            if (m_send_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+                    m_send_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
+                    m_send_trans.get_data (layout_temp)) {
+                *layout = layout_temp;
+            } else {
+                std::cerr << __func__ << " get_command() or get_data() may fail!!!\n";
+            }
+            post_prepare ();
+        }
+    }
+
+    void set_ise_language (int language) {
+        if (m_send_refcount > 0) {
+            m_send_trans.put_command (ISM_TRANS_CMD_SET_ISE_LANGUAGE);
+            m_send_trans.put_data (language);
+        }
+    }
+
+    void set_caps_mode (int mode) {
+        if (m_send_refcount > 0) {
+            m_send_trans.put_command (ISM_TRANS_CMD_SET_CAPS_MODE);
+            m_send_trans.put_data (mode);
+        }
+    }
+
+    void send_will_show_ack (void) {
+        if (m_send_refcount > 0)
+            m_send_trans.put_command (ISM_TRANS_CMD_SEND_WILL_SHOW_ACK);
+    }
+
+    void send_will_hide_ack (void) {
+        if (m_send_refcount > 0)
+            m_send_trans.put_command (ISM_TRANS_CMD_SEND_WILL_HIDE_ACK);
+    }
+
+    void set_hardware_keyboard_mode (void) {
+        if (m_send_refcount > 0)
+            m_send_trans.put_command (ISM_TRANS_CMD_SET_HARDWARE_KEYBOARD_MODE);
+    }
+
+    void send_candidate_will_hide_ack (void) {
+        if (m_send_refcount > 0)
+            m_send_trans.put_command (ISM_TRANS_CMD_SEND_CANDIDATE_WILL_HIDE_ACK);
+    }
+
+    bool get_client_id (int &client_id) {
+        if (!m_socket.is_connected ()) return false;
+
+        int cmd;
+        uint32 data;
+        uint32 id;
+
+        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 (0);
+
+        if (m_send_trans.get_command (cmd) &&
+            m_send_trans.get_data (data) &&
+            m_send_trans.get_data (data)) {
+            m_send_trans.put_command (ISM_TRANS_CMD_GET_PANEL_CLIENT_ID);
+            m_send_trans.write_to_socket (m_socket);
+
+            if (!m_send_trans.read_from_socket (m_socket, m_socket_timeout))
+                std::cerr << __func__ << " read_from_socket() may be timeout \n";
+
+            if (m_send_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_REPLY &&
+                    m_send_trans.get_command (cmd) && cmd == SCIM_TRANS_CMD_OK &&
+                    m_send_trans.get_data (id)) {
+                client_id = id;
+                return true;
+            } else {
+                std::cerr << __func__ << " get_command() or get_data() may fail!!!\n";
+                return false;
+            }
+        }
+
+        return false;
+    }
+
+    void register_client (int client_id) {
+        if (m_send_refcount > 0) {
+            m_send_trans.put_command (ISM_TRANS_CMD_REGISTER_PANEL_CLIENT);
+            m_send_trans.put_data (client_id);
+        }
+    }
+
 public:
     void reset_signal_handler                               (void)
     {
@@ -750,7 +1126,8 @@ public:
         m_signal_candidate_more_window_show.reset();
         m_signal_candidate_more_window_hide.reset();
         m_signal_longpress_candidate.reset();
-        m_signal_update_client_id.reset();
+        m_signal_update_ise_input_context.reset();
+        m_signal_update_isf_candidate_panel.reset();
     }
 
     Connection signal_connect_reload_config                 (PanelClientSlotVoid                    *slot)
@@ -885,9 +1262,14 @@ public:
         return m_signal_longpress_candidate.connect (slot);
     }
 
-    Connection signal_connect_update_client_id              (PanelClientSlotInt                     *slot)
+    Connection signal_connect_update_ise_input_context      (PanelClientSlotIntInt                  *slot)
+    {
+        return m_signal_update_ise_input_context.connect (slot);
+    }
+
+    Connection signal_connect_update_isf_candidate_panel    (PanelClientSlotIntInt                  *slot)
     {
-        return m_signal_update_client_id.connect (slot);
+        return m_signal_update_isf_candidate_panel.connect (slot);
     }
 
 private:
@@ -1127,6 +1509,144 @@ PanelClient::set_candidate_style    (int icid, ISF_CANDIDATE_PORTRAIT_LINE_T por
 }
 
 void
+PanelClient::show_ise               (int client_id, int icid, void *data, int length, int *input_panel_show)
+{
+    m_impl->show_ise (client_id, icid, data, length, input_panel_show);
+}
+
+void
+PanelClient::hide_ise               (int client_id, int icid)
+{
+    m_impl->hide_ise (client_id, icid);
+}
+
+void
+PanelClient::show_control_panel     (void)
+{
+    m_impl->show_control_panel ();
+}
+
+void
+PanelClient::hide_control_panel     (void)
+{
+    m_impl->hide_control_panel ();
+}
+
+void
+PanelClient::set_imdata             (const char* data, int len)
+{
+    m_impl->set_imdata (data, len);
+}
+
+void
+PanelClient::get_imdata             (char* data, int* len)
+{
+    m_impl->get_imdata (data, len);
+}
+
+void
+PanelClient::get_ise_window_geometry (int* x, int* y, int* width, int* height)
+{
+    m_impl->get_ise_window_geometry (x, y, width, height);
+}
+
+void
+PanelClient::get_candidate_window_geometry (int* x, int* y, int* width, int* height)
+{
+    m_impl->get_candidate_window_geometry (x, y, width, height);
+}
+
+void
+PanelClient::get_ise_language_locale (char **locale)
+{
+    m_impl->get_ise_language_locale (locale);
+}
+
+void
+PanelClient::set_return_key_type    (int type)
+{
+    m_impl->set_return_key_type (type);
+}
+
+void
+PanelClient::get_return_key_type    (int &type)
+{
+    m_impl->get_return_key_type (type);
+}
+
+void
+PanelClient::set_return_key_disable (int disabled)
+{
+    m_impl->set_return_key_disable (disabled);
+}
+
+void
+PanelClient::get_return_key_disable (int &disabled)
+{
+    m_impl->get_return_key_disable (disabled);
+}
+
+void
+PanelClient::set_layout             (int layout)
+{
+    m_impl->set_layout (layout);
+}
+
+void
+PanelClient::get_layout             (int* layout)
+{
+    m_impl->get_layout (layout);
+}
+
+void
+PanelClient::set_ise_language       (int language)
+{
+    m_impl->set_ise_language (language);
+}
+
+void
+PanelClient::set_caps_mode          (int mode)
+{
+    m_impl->set_caps_mode (mode);
+}
+
+void
+PanelClient::send_will_show_ack     (void)
+{
+    m_impl->send_will_show_ack ();
+}
+
+void
+PanelClient::send_will_hide_ack     (void)
+{
+    m_impl->send_will_hide_ack ();
+}
+
+void
+PanelClient::set_hardware_keyboard_mode (void)
+{
+    m_impl->set_hardware_keyboard_mode ();
+}
+
+void
+PanelClient::send_candidate_will_hide_ack (void)
+{
+    m_impl->send_candidate_will_hide_ack ();
+}
+
+bool
+PanelClient::get_client_id (int &client_id)
+{
+    return m_impl->get_client_id (client_id);
+}
+
+void
+PanelClient::register_client (int client_id)
+{
+    m_impl->register_client (client_id);
+}
+
+void
 PanelClient::reset_signal_handler                         (void)
 {
     m_impl->reset_signal_handler ();
@@ -1295,9 +1815,15 @@ PanelClient::signal_connect_longpress_candidate           (PanelClientSlotInt
 }
 
 Connection
-PanelClient::signal_connect_update_client_id              (PanelClientSlotInt                     *slot)
+PanelClient::signal_connect_update_ise_input_context      (PanelClientSlotIntInt                  *slot)
+{
+    return m_impl->signal_connect_update_ise_input_context (slot);
+}
+
+Connection
+PanelClient::signal_connect_update_isf_candidate_panel    (PanelClientSlotIntInt                  *slot)
 {
-    return m_impl->signal_connect_update_client_id (slot);
+    return m_impl->signal_connect_update_isf_candidate_panel (slot);
 }
 
 } /* namespace scim */
index a3d1d65..a0f191d 100644 (file)
  *
  * Modifications by Samsung Electronics Co., Ltd.
  * 1. Add new signals
- *    a. m_signal_select_aux, m_signal_reset_keyboard_ise and m_signal_update_client_id
+ *    a. m_signal_select_aux, m_signal_reset_keyboard_ise
  *    b. m_signal_update_candidate_item_layout and m_signal_update_displayed_candidate_number
  *    c. m_signal_get_surrounding_text and m_signal_delete_surrounding_text
  *    d. m_signal_show_preedit_string, m_signal_hide_preedit_string, m_signal_update_preedit_string and m_signal_update_preedit_caret
  *    e. m_signal_candidate_more_window_show, m_signal_candidate_more_window_hide, m_signal_longpress_candidate
+ *    f. m_signal_update_ise_input_context, m_signal_update_isf_candidate_panel
  * 2. Add new interface APIs in PanelClient class
  *    a. update_cursor_position () and update_surrounding_text ()
  *    b. expand_candidate (), contract_candidate () and set_candidate_style ()
- *    c. reset_input_context () and turn_on_log
+ *    c. reset_input_context () and turn_on_log ()
+ *    d. get_client_id () and register_client ()
  *
  * $Id: scim_panel_client.h,v 1.4 2005/06/26 16:35:33 suzhe Exp $
  */
@@ -217,6 +219,30 @@ public:
     void expand_candidate       (int icid);
     void contract_candidate     (int icid);
     void set_candidate_style    (int icid, ISF_CANDIDATE_PORTRAIT_LINE_T portrait_line, ISF_CANDIDATE_MODE_T mode);
+    void show_ise               (int client_id, int icid, void *data, int length, int *input_panel_show);
+    void hide_ise               (int client_id, int icid);
+    void show_control_panel     (void);
+    void hide_control_panel     (void);
+    void set_imdata             (const char* data, int len);
+    void get_imdata             (char* data, int* len);
+    void get_ise_window_geometry (int* x, int* y, int* width, int* height);
+    void get_candidate_window_geometry (int* x, int* y, int* width, int* height);
+    void get_ise_language_locale (char **locale);
+    void set_return_key_type    (int type);
+    void get_return_key_type    (int &type);
+    void set_return_key_disable (int disabled);
+    void get_return_key_disable (int &disabled);
+    void set_layout             (int layout);
+    void get_layout             (int* layout);
+    void set_ise_language       (int language);
+    void set_caps_mode          (int mode);
+    void send_will_show_ack     (void);
+    void send_will_hide_ack     (void);
+    void set_hardware_keyboard_mode (void);
+    void send_candidate_will_hide_ack (void);
+    bool get_client_id          (int &client_id);
+    void register_client        (int client_id);
+
     /** @} */
 
 public:
@@ -453,11 +479,18 @@ public:
     Connection signal_connect_longpress_candidate           (PanelClientSlotInt                     *slot);
 
     /**
-     * @brief Signal: update client ID
+     * @brief Signal: update ise input context
+     *
+     * slot prototype: void update_ise_input_context (int context, int type, int value);
+     */
+    Connection signal_connect_update_ise_input_context      (PanelClientSlotIntInt                  *slot);
+
+    /**
+     * @brief Signal: update isf candidate panel
      *
-     * slot prototype: void update_client_id (int context, int client_id);
+     * slot prototype: void update_isf_candidate_panel (int context, int type, int value);
      */
-    Connection signal_connect_update_client_id              (PanelClientSlotInt                     *slot);
+    Connection signal_connect_update_isf_candidate_panel    (PanelClientSlotIntInt                  *slot);
 
     /** @} */
 };
index 9a86c73..2dc6306 100644 (file)
@@ -586,7 +586,6 @@ const int SCIM_TRANS_CMD_PANEL_REQUEST_FACTORY_MENU       = 521;
 const int SCIM_TRANS_CMD_PANEL_CHANGE_FACTORY             = 522;
 const int ISM_TRANS_CMD_PANEL_RESET_KEYBOARD_ISE          = 523;
 const int ISM_TRANS_CMD_PANEL_UPDATE_KEYBOARD_ISE         = 524;
-const int ISM_TRANS_CMD_PANEL_UPDATE_CLIENT_ID            = 525;
 
 // Helper Client To Panel
 const int SCIM_TRANS_CMD_PANEL_REGISTER_HELPER            = 540;
@@ -613,19 +612,18 @@ const int ISM_TRANS_CMD_SHOW_ISE_PANEL                    = 1000;
 const int ISM_TRANS_CMD_HIDE_ISE_PANEL                    = 1001;
 const int ISM_TRANS_CMD_SHOW_ISF_CONTROL                  = 1002;
 const int ISM_TRANS_CMD_HIDE_ISF_CONTROL                  = 1003;
-const int ISM_TRANS_CMD_GET_LANGUAGE_LIST                 = 1004;
-const int ISM_TRANS_CMD_GET_ISE_LANGUAGE                  = 1005;
-const int ISM_TRANS_CMD_SET_ISF_LANGUAGE                  = 1006;
-const int ISM_TRANS_CMD_GET_ALL_LANGUAGE_LIST             = 1007;
-const int ISM_TRANS_CMD_RESET_ISE_OPTION                  = 1008;
-const int ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_UUID            = 1009;
-const int ISM_TRANS_CMD_GET_ACTIVE_ISE                    = 1010;
-const int ISM_TRANS_CMD_GET_ISE_LIST                      = 1011;
-const int ISM_TRANS_CMD_GET_ISE_INFORMATION               = 1012;
-const int ISM_TRANS_CMD_SEND_WILL_SHOW_ACK                = 1013;
-const int ISM_TRANS_CMD_SEND_WILL_HIDE_ACK                = 1014;
-const int ISM_TRANS_CMD_RESET_DEFAULT_ISE                 = 1015;
-const int ISM_TRANS_CMD_SEND_CANDIDATE_WILL_HIDE_ACK      = 1016;
+const int ISM_TRANS_CMD_RESET_ISE_OPTION                  = 1004;
+const int ISM_TRANS_CMD_SET_ACTIVE_ISE_BY_UUID            = 1005;
+const int ISM_TRANS_CMD_GET_ACTIVE_ISE                    = 1006;
+const int ISM_TRANS_CMD_GET_ISE_LIST                      = 1007;
+const int ISM_TRANS_CMD_GET_ISE_INFORMATION               = 1008;
+const int ISM_TRANS_CMD_SEND_WILL_SHOW_ACK                = 1009;
+const int ISM_TRANS_CMD_SEND_WILL_HIDE_ACK                = 1010;
+const int ISM_TRANS_CMD_RESET_DEFAULT_ISE                 = 1011;
+const int ISM_TRANS_CMD_SET_HARDWARE_KEYBOARD_MODE        = 1012;
+const int ISM_TRANS_CMD_SEND_CANDIDATE_WILL_HIDE_ACK      = 1013;
+const int ISM_TRANS_CMD_GET_PANEL_CLIENT_ID               = 1014;
+const int ISM_TRANS_CMD_REGISTER_PANEL_CLIENT             = 1015;
 
 
 /* IMControl to ISE */
@@ -644,18 +642,9 @@ const int ISM_TRANS_CMD_GET_RETURN_KEY_TYPE               = 1119;
 const int ISM_TRANS_CMD_SET_RETURN_KEY_DISABLE            = 1120;
 const int ISM_TRANS_CMD_GET_RETURN_KEY_DISABLE            = 1121;
 
-/* ISE to IMControl */
-const int ISM_TRANS_CMD_UPDATE_ISE_HIDED                  = 1127;
-const int ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT          = 1128;
-
-/* Panel to IMControl */
-const int ISM_TRANS_CMD_ISE_PANEL_SHOWED                  = 1130;
-const int ISM_TRANS_CMD_ISE_PANEL_HIDED                   = 1131;
-const int ISM_TRANS_CMD_ISF_CONTROL_SHOWED                = 1132;
-const int ISM_TRANS_CMD_ISF_CONTROL_HIDED                 = 1133;
-const int ISM_TRANS_CMD_UPDATE_ISF_CANDIDATE_PANEL        = 1134;
-const int ISM_TRANS_CMD_UPDATE_ISE_STYLE                  = 1135;
-const int ISM_TRANS_CMD_ISE_CHANGED                       = 1136;
+/* ISE/Panel to IMControl */
+const int ISM_TRANS_CMD_UPDATE_ISE_INPUT_CONTEXT          = 1151;
+const int ISM_TRANS_CMD_UPDATE_ISF_CANDIDATE_PANEL        = 1152;
 
 
 /* ISE to Panel */