Set transient for option window in shared object type IME 01/246901/2
authorJihoon Kim <jihoon48.kim@samsung.com>
Fri, 30 Oct 2020 11:21:34 +0000 (20:21 +0900)
committerJihoon Kim <jihoon48.kim@samsung.com>
Thu, 5 Nov 2020 08:07:05 +0000 (17:07 +0900)
Change-Id: I0383ecbef05cab91ff50f2a5c07799e6fd682afb
Signed-off-by: Jihoon Kim <jihoon48.kim@samsung.com>
ism/extras/efl_panel/isf_panel_efl.cpp
ism/modules/panelagent/ecoresocket/ecore_socket_panel_agent_module.cpp
ism/modules/panelagent/wayland/wayland_panel_agent_module.cpp
ism/src/isf_control.cpp
ism/src/isf_imcontrol_client.cpp
ism/src/isf_info_manager.cpp
ism/src/isf_info_manager.h
ism/src/isf_panel_agent_base.cpp
ism/src/isf_panel_agent_base.h
ism/src/isf_panel_agent_manager.cpp
ism/src/isf_panel_agent_manager.h

index 39155e0..6e29501 100644 (file)
@@ -6609,7 +6609,7 @@ static bool slot_launch_option_application (String ime_appid)
 {
     String ime_setting_app = isf_pkg_get_setting_app (ime_appid);
 
-    LOGD ("IME appid : %s, IME setting app id : %s", ime_appid.c_str (), ime_setting_app.c_str ());
+    LOGD ("IME appid(%s), IME setting app id(%s)", ime_appid.c_str (), ime_setting_app.c_str ());
 
     if (ime_setting_app.length () > 0) {
         app_control_launch (ime_setting_app.c_str ());
index 3474f4c..63849d2 100644 (file)
@@ -755,7 +755,7 @@ private:
         m_send_trans.write_to_socket(client_socket);
     }
 
-    void show_helper_option_window(int client, uint32 context, const String& uuid) {
+    void show_helper_option_window(int client, uint32 context, const String& uuid, uint32 caller_pid, uint32 ime_pid) {
         LOGD ("client id:%d", client);
 
         Socket client_socket(client);
@@ -2264,7 +2264,13 @@ private:
 
                         continue;
                     } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW) {
-                        m_info_manager->show_ise_option_window(client_id);
+                        uint32 caller_pid = 0;
+                        if (!m_recv_trans.get_data(caller_pid)) {
+                            LOGW ("Failed to get pid");
+                        }
+
+                        LOGI ("caller PID : %u", caller_pid);
+                        m_info_manager->show_ise_option_window(client_id, caller_pid);
                         continue;
                     } else if (cmd == ISM_TRANS_CMD_RESUME_ISE_OPTION_WINDOW) {
                         m_info_manager->resume_ise_option_window(client_id);
@@ -3138,8 +3144,14 @@ private:
                         send_fail_reply (client_id);
                     }
                 } else if (cmd == ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW) {
+                    uint32 caller_pid = 0;
+                    if (!m_recv_trans.get_data(caller_pid)) {
+                        LOGW ("Failed to get pid");
+                    }
+
+                    LOGI ("caller PID : %u", caller_pid);
                     if (m_info_manager->check_privilege_by_sockfd(client_id, IMEMANAGER_PRIVILEGE)) {
-                        m_info_manager->show_ise_option_window(client_id);
+                        m_info_manager->show_ise_option_window(client_id, caller_pid);
                     }
                     else {
                         LOGW ("Access denied to show ise option window");
index eebb2cf..b5a0e9c 100644 (file)
@@ -137,6 +137,8 @@ struct _WSCContextISFImpl {
     }
 };
 
+static struct wl_input_method_manager *_im_manager = NULL;
+
 /* private functions */
 
 static void     panel_slot_update_preedit_caret         (int                     context,
@@ -927,9 +929,9 @@ static const struct wl_input_method_listener wsc_im_listener = {
 static bool
 _wsc_setup (struct weescim *wsc)
 {
-    Eina_Iterator *globals;
-    struct wl_registry *registry;
-    Ecore_Wl2_Global *global;
+    Eina_Iterator *globals = NULL;
+    struct wl_registry *registry = NULL;
+    Ecore_Wl2_Global *global = NULL;
 
     if (!wsc) return false;
 
@@ -952,6 +954,8 @@ _wsc_setup (struct weescim *wsc)
     EINA_ITERATOR_FOREACH(globals, global) {
         if (strcmp (global->interface, "wl_input_method") == 0)
             wsc->im = (wl_input_method*)wl_registry_bind (registry, global->id, &wl_input_method_interface, 1);
+        else if (strcmp (global->interface, "wl_input_method_manager") == 0)
+            _im_manager = (wl_input_method_manager*)wl_registry_bind (registry, global->id, &wl_input_method_manager_interface, 1);
     }
     eina_iterator_free (globals);
 
@@ -3556,6 +3560,16 @@ public:
 
         wl_input_method_context_reshow_input_panel (ic->im_ctx);
     }
+
+    void set_transient_for (uint32 caller_pid, uint32 ime_pid)
+    {
+        LOGI ("caller pid : %u, ime pid : %u", caller_pid, ime_pid);
+
+        if (_im_manager)
+            wl_input_method_manager_set_transient_for (_im_manager, caller_pid, ime_pid);
+        else
+            LOGW ("Failed to get input method manager interface");
+    }
 };
 
 extern "C" {
index af50ebc..373fdb7 100644 (file)
@@ -314,22 +314,27 @@ EXAPI int isf_control_show_ise_option_window (void)
         return -1;
 
     imcontrol_client.prepare ();
-    if (imcontrol_client.get_ise_setting_appid (ime_setting_appid)) {
-        if (app_control_launch (ime_setting_appid.c_str(), APP_CONTROL_LAUNCH_MODE_GROUP)) {
-            LOGI("Succeeded to launch IME setting app : %s", ime_setting_appid.c_str());
+    imcontrol_client.get_ise_setting_appid (ime_setting_appid);
+
+    if (!ime_setting_appid.empty ()) {
+        if (app_control_launch (ime_setting_appid.c_str (), APP_CONTROL_LAUNCH_MODE_GROUP)) {
+            LOGI("Succeeded to launch IME setting app : %s", ime_setting_appid.c_str ());
         }
         else {
-            LOGE("Failed to launch IME setting app : %s", ime_setting_appid.c_str());
+            LOGE("Failed to launch IME setting app : %s", ime_setting_appid.c_str ());
             ret = -1;
         }
     }
     else {
-        LOGD("No setting app ID");
+        LOGD("No setting app ID. Request to show option window in IME");
+        imcontrol_client.prepare ();
         imcontrol_client.show_ise_option_window ();
-    }
 
-    if (!imcontrol_client.send ())
-        ret = -1;
+        if (!imcontrol_client.send ()) {
+            LOGW("Failed to send show ise_option_window");
+            ret = -1;
+        }
+    }
 
     imcontrol_client.close_connection ();
 
index e0b326c..06e3b23 100644 (file)
@@ -29,6 +29,9 @@
 #define Uses_SCIM_HELPER_MODULE
 
 #include <string.h>
+#include <sys/types.h>
+#include <unistd.h>
+
 #include "scim.h"
 
 #define MINIMUM_TIMEOUT 100
@@ -388,6 +391,7 @@ public:
 
     void show_ise_option_window (void) {
         m_trans.put_command (ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW);
+        m_trans.put_data (getpid());
     }
 
     bool get_ise_setting_appid (String &ime_setting_appid) {
index de7611f..d2ff74a 100644 (file)
@@ -62,6 +62,7 @@
 #include <sys/times.h>
 #include <dlog.h>
 #include <unistd.h>
+#include <sys/socket.h>
 #include "scim_private.h"
 #include "scim.h"
 #include "scim_stl_map.h"
@@ -1297,7 +1298,25 @@ public:
         return false;
     }
 
-    bool show_helper_option_window (const String& uuid) {
+    int get_client_pid(int client_id)
+    {
+        Socket client_socket(client_id);
+
+        int sockfd = client_socket.get_id();
+        struct ucred ucred;
+        socklen_t len = sizeof(struct ucred);
+        if (getsockopt(sockfd, SOL_SOCKET, SO_PEERCRED, &ucred, &len) == 0) {
+            LOGI("client pid : %u", ucred.pid);
+        }
+        else {
+            LOGW("Failed to get socket infomation");
+            return 0;
+        }
+
+        return ucred.pid;
+    }
+
+    bool show_helper_option_window (const String& uuid, int caller_pid) {
         HelperClientIndex::iterator it = m_helper_client_index.find (m_current_helper_uuid);
 
         if (it != m_helper_client_index.end ()) {
@@ -1309,7 +1328,10 @@ public:
 
             if (!m_signal_launch_option_application (uuid)) {
                 LOGD ("call show helper option");
-                m_panel_agent_manager.show_helper_option_window (it->second.id, ctx, uuid);
+                int ime_pid = get_client_pid(it->second.id);
+                LOGD ("parent : %d, client : %d", caller_pid, ime_pid);
+                m_panel_agent_manager.show_helper_option_window (it->second.id, ctx, uuid, caller_pid, ime_pid);
+                m_panel_agent_manager.set_transient_for (caller_pid, ime_pid);
             }
 
             return true;
@@ -2098,14 +2120,14 @@ public:
         option = get_current_helper_option ();
     }
     //ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW
-    void show_ise_option_window (int client_id) {
+    void show_ise_option_window (int client_id, int caller_pid) {
         SCIM_DEBUG_MAIN (4) << "InfoManager::show_ise_option_window ()\n";
         String initial_uuid = scim_global_config_read (String (SCIM_GLOBAL_CONFIG_INITIAL_ISE_UUID), String (""));
         String default_uuid = scim_global_config_read (String (SCIM_GLOBAL_CONFIG_DEFAULT_ISE_UUID), String (""));
         LOGD ("prepare to show ISE option window %d [%s] [%s]", client_id, initial_uuid.c_str (), default_uuid.c_str ());
 
         if (TOOLBAR_HELPER_MODE == m_current_toolbar_mode) {
-            show_helper_option_window (m_current_helper_uuid);
+            show_helper_option_window (m_current_helper_uuid, caller_pid);
         }
     }
 
@@ -4981,9 +5003,9 @@ void InfoManager::get_active_helper_option (int client_id, _OUT_ uint32& option)
 }
 
 //ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW
-void InfoManager::show_ise_option_window (int client_id)
+void InfoManager::show_ise_option_window (int client_id, int caller_pid)
 {
-    m_impl->show_ise_option_window (client_id);
+    m_impl->show_ise_option_window (client_id, caller_pid);
 }
 
 //ISM_TRANS_CMD_GET_ISE_SETTING_APPID
index 1741944..f8d9948 100644 (file)
@@ -742,7 +742,7 @@ public:
     void get_ise_setting_appid (int client_id, String &ime_setting_appid);
 
     //ISM_TRANS_CMD_SHOW_ISE_OPTION_WINDOW
-    void show_ise_option_window (int client_id);
+    void show_ise_option_window (int client_id, int caller_pid);
 
     //ISM_TRANS_CMD_RESUME_ISE_OPTION_WINDOW
     void resume_ise_option_window (int client_id);
index 549a373..5a10db5 100644 (file)
@@ -251,7 +251,7 @@ void PanelAgentBase::set_helper_caps_mode (int client, uint32 context, const Str
 {
 }
 
-void PanelAgentBase::show_helper_option_window (int client, uint32 context, const String& uuid)
+void PanelAgentBase::show_helper_option_window (int client, uint32 context, const String& uuid, uint32 caller_pid, uint32 ime_pid)
 {
 }
 
@@ -259,6 +259,11 @@ void PanelAgentBase::resume_helper_option_window (int client, uint32 context, co
 {
 }
 
+void PanelAgentBase::set_transient_for (uint32 caller_pid, uint32 ime_pid)
+{
+
+}
+
 void PanelAgentBase::set_helper_keyboard_mode (int client, uint32 context, const String& uuid, uint32& mode)
 {
 }
index 9ce3c0b..fda6abd 100644 (file)
@@ -464,7 +464,7 @@ public:
      *
      * @return none.
      */
-    virtual void show_helper_option_window (int client, uint32 context, const String& uuid);
+    virtual void show_helper_option_window (int client, uint32 context, const String& uuid, uint32 caller_pid, uint32 ime_pid);
 
     /**
      * @brief resume_helper_option_window.
@@ -475,6 +475,8 @@ public:
      */
     virtual void resume_helper_option_window (int client, uint32 context, const String& uuid);
 
+    virtual void set_transient_for (uint32 caller_pid, uint32 ime_pid);
+
     /**
      * @brief set_helper_keyboard_mode.
      *
index 29a16f2..4e6be25 100644 (file)
@@ -96,6 +96,10 @@ public:
         else
             return m_socket;
     }
+
+    PanelAgentPointer get_panel_wl_agent () {
+        return m_wayland;
+    }
 };
 
 PanelAgentManager::PanelAgentManager ()
@@ -482,12 +486,12 @@ void PanelAgentManager::set_helper_caps_mode (int id, uint32 context_id, const S
         _p->set_helper_caps_mode (id, context_id, uuid, mode);
 }
 
-void PanelAgentManager::show_helper_option_window (int id, uint32 context_id, const String& uuid)
+void PanelAgentManager::show_helper_option_window (int id, uint32 context_id, const String& uuid, uint32 caller_pid, uint32 ime_pid)
 {
     PanelAgentPointer _p = m_impl->get_panel_agent_by_id (id);
 
     if (!_p.null ())
-        _p->show_helper_option_window (id, context_id, uuid);
+        _p->show_helper_option_window (id, context_id, uuid, caller_pid, ime_pid);
 }
 
 void PanelAgentManager::resume_helper_option_window (int id, uint32 context_id, const String& uuid)
@@ -498,6 +502,14 @@ void PanelAgentManager::resume_helper_option_window (int id, uint32 context_id,
         _p->resume_helper_option_window (id, context_id, uuid);
 }
 
+void PanelAgentManager::set_transient_for (uint32 caller_pid, uint32 ime_pid)
+{
+    PanelAgentPointer _p = m_impl->get_panel_wl_agent ();
+
+    if (!_p.null ())
+        _p->set_transient_for (caller_pid, ime_pid);
+}
+
 void PanelAgentManager::set_helper_keyboard_mode (int id, uint32 context_id, const String& uuid, uint32& mode)
 {
     PanelAgentPointer _p = m_impl->get_panel_agent_by_id (id);
index eef2830..a9d9a42 100644 (file)
@@ -268,8 +268,6 @@ public:
      */
     void trigger_property (int client, uint32 context, const String&  property);
 
-
-
     /**
      * @brief Let all FrontEnds and Helpers reload configuration.
      * @return true if the command was sent correctly.
@@ -305,8 +303,9 @@ public:
     void set_helper_input_hint (int client, uint32 context, const String& uuid, uint32& hint);
     void set_helper_bidi_direction (int client, uint32 context, const String& uuid, uint32& direction);
     void set_helper_caps_mode (int client, uint32 context, const String& uuid, uint32& mode);
-    void show_helper_option_window (int client, uint32 context, const String& uuid);
+    void show_helper_option_window (int client, uint32 context, const String& uuid, uint32 caller_pid, uint32 ime_pid);
     void resume_helper_option_window (int client, uint32 context, const String& uuid);
+    void set_transient_for (uint32 caller_pid, uint32 ime_pid);
     void set_helper_keyboard_mode (int client, uint32 context, const String& uuid, uint32& mode);
     void set_helper_prediction_hint (int client, uint32 context, const String& uuid, String& prediction_hint);
     void set_helper_prediction_hint_data (int id, uint32 context_id, const String& uuid, String& key, String& value);