e_process: added a E_PROCESS_ACT_NO_VISIBLE_WINDOWS in E_Process_Action enumeration 43/96143/3
authorDoyoun Kang <doyoun.kang@samsung.com>
Tue, 8 Nov 2016 04:26:01 +0000 (13:26 +0900)
committerGwanglim Lee <gl77.lee@samsung.com>
Tue, 8 Nov 2016 07:40:14 +0000 (23:40 -0800)
There was a requirement that the specified process wants to get an event when process' windows are all unviewable.
So, we added E_PROCESS_ACT_NO_VISIBLE_WINDOWS enumeration and sent it when process' all windows were hidden.

Change-Id: I903ad5cd4923a191e6cd8f891d4f1b8f61e30275

src/bin/e_process.c
src/bin/e_process.h

index ae63ad9081162165d3ff238f0cc6a73085f4d663..88886c852527c913bd44cfe298c4e0e2ccd52e46 100644 (file)
@@ -9,6 +9,7 @@ static void       _e_process_client_info_del(E_Client *ec);
 
 static Eina_Bool  _e_process_cb_client_add(void *data EINA_UNUSED, int type EINA_UNUSED, void *event);
 static Eina_Bool  _e_process_cb_client_remove(void *data EINA_UNUSED, int type EINA_UNUSED, void *event);
+static Eina_Bool  _e_process_cb_client_hide(void *data EINA_UNUSED, int type EINA_UNUSED, void *event);
 static Eina_Bool  _e_process_cb_client_iconify(void *data EINA_UNUSED, int type EINA_UNUSED, void *event);
 static Eina_Bool  _e_process_cb_client_uniconify(void *data EINA_UNUSED, int type EINA_UNUSED, void *event);
 static Eina_Bool  _e_process_cb_client_visibility_change(void *data EINA_UNUSED, int type EINA_UNUSED, void *event);
@@ -16,6 +17,9 @@ static Eina_Bool  _e_process_cb_client_focus_in(void *data EINA_UNUSED, int type
 
 static void       _e_process_cb_hook_visibility(void *d EINA_UNUSED, E_Client *ec);
 
+static Eina_Bool  _e_process_windows_visible_get(pid_t pid, Eina_Bool *visible);
+static void       _e_process_windows_act_no_visible_update(pid_t pid);
+
 static Eina_Bool  _e_process_freeze_condition_check(pid_t pid);
 static Eina_Bool  _e_process_freeze(pid_t pid);
 static Eina_Bool  _e_process_thaw(pid_t pid);
@@ -179,6 +183,31 @@ _e_process_cb_client_remove(void *data EINA_UNUSED, int type EINA_UNUSED, void *
    return ECORE_CALLBACK_PASS_ON;
 }
 
+static Eina_Bool
+_e_process_cb_client_hide(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
+{
+   E_Event_Client *ev;
+   E_Client *ec;
+   Eina_Bool visible;
+   pid_t pid;
+
+   ev = event;
+   if (!ev) return ECORE_CALLBACK_PASS_ON;
+
+   ec = ev->ec;
+   if (!ec) return ECORE_CALLBACK_PASS_ON;
+
+   pid = ec->netwm.pid;
+
+   if (_e_process_windows_visible_get(pid, &visible))
+     {
+        if (!visible)
+          _e_process_windows_act_no_visible_update(pid);
+     }
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+
 static Eina_Bool
 _e_process_cb_client_iconify(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
 {
@@ -311,6 +340,49 @@ _e_process_cb_hook_visibility(void *d EINA_UNUSED, E_Client *ec)
      }
 }
 
+static Eina_Bool
+_e_process_windows_visible_get(pid_t pid, Eina_Bool *visible)
+{
+   E_Process *pinfo = NULL;
+   E_Client *ec = NULL;
+   Eina_Bool exist_visible = EINA_FALSE;
+   Eina_List *l;
+
+   if (pid <= 0) return EINA_FALSE;
+   if (!visible) return EINA_FALSE;
+
+   pinfo = _e_process_find(_e_process_manager, pid);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(pinfo, EINA_FALSE);
+
+   if (!pinfo->ec_list) return EINA_FALSE;
+
+   EINA_LIST_FOREACH(pinfo->ec_list, l, ec)
+     {
+        if (ec->visible && !ec->iconic)
+          {
+             exist_visible = EINA_TRUE;
+             break;
+          }
+     }
+
+   *visible = exist_visible;
+   return EINA_TRUE;
+}
+
+static void
+_e_process_windows_act_no_visible_update(pid_t pid)
+{
+   E_Process *pinfo = NULL;
+
+   if (pid <= 0) return;
+
+   pinfo = _e_process_find(_e_process_manager, pid);
+   EINA_SAFETY_ON_NULL_RETURN(pinfo);
+
+   ELOGF("PROCESS", "ACTION WINDOWS_HIDDEN. PID:%d", NULL, NULL, pinfo->pid);
+   _e_process_action_change(pinfo, E_PROCESS_ACT_NO_VISIBLE_WINDOWS);
+}
+
 static Eina_Bool
 _e_process_freeze_condition_check(pid_t pid)
 {
@@ -402,6 +474,8 @@ _e_process_state_change(E_Process *epro, E_Process_State state)
           }
         else if (state == E_PROCESS_STATE_BACKGROUND)
           {
+             ELOGF("PROCESS", "ACTION WINDOWS_HIDDEN. PID:%d", NULL, NULL, epro->pid);
+             _e_process_action_change(epro, E_PROCESS_ACT_NO_VISIBLE_WINDOWS);
              ELOGF("PROCESS", "ACTION BACKGROUND. PID:%d", NULL, NULL, epro->pid);
              _e_process_action_change(epro, E_PROCESS_ACT_BACKGROUND);
           }
@@ -498,6 +572,7 @@ e_process_init(void)
 
    E_LIST_HANDLER_APPEND(_e_process_ec_handlers, E_EVENT_CLIENT_ADD, _e_process_cb_client_add, NULL);
    E_LIST_HANDLER_APPEND(_e_process_ec_handlers, E_EVENT_CLIENT_REMOVE, _e_process_cb_client_remove, NULL);
+   E_LIST_HANDLER_APPEND(_e_process_ec_handlers, E_EVENT_CLIENT_HIDE, _e_process_cb_client_hide, NULL);
    E_LIST_HANDLER_APPEND(_e_process_ec_handlers, E_EVENT_CLIENT_ICONIFY, _e_process_cb_client_iconify, NULL);
    E_LIST_HANDLER_APPEND(_e_process_ec_handlers, E_EVENT_CLIENT_UNICONIFY, _e_process_cb_client_uniconify, NULL);
    E_LIST_HANDLER_APPEND(_e_process_ec_handlers, E_EVENT_CLIENT_VISIBILITY_CHANGE, _e_process_cb_client_visibility_change, NULL);
index 90ae40e1ee9fe1aed95d1d4071baf18842585619..93c251eff3c65ccef350207d251a666bc1721061 100644 (file)
@@ -9,6 +9,7 @@ typedef enum _E_Process_Action
    E_PROCESS_ACT_BACKGROUND = 4,
    E_PROCESS_ACT_ACTIVATE = 5,
    E_PROCESS_ACT_DEACTIVATE = 6,
+   E_PROCESS_ACT_NO_VISIBLE_WINDOWS = 7,
 } E_Process_Action;
 
 typedef enum _E_Process_State