discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=f43489113746ee1b6c566e853f276419e49b3691

commit f43489113746ee1b6c566e853f276419e49b3691
Author: Mike Blumenkrantz <zm...@osg.samsung.com>
Date:   Thu Oct 27 11:22:27 2016 -0400

    redo session recovery handling to use separate E_Remember
    
    I tried to be too clever with the initial implementation of this and it was
    a lot more complex and nonfunctional than expected
---
 src/bin/e_client.h             |  1 +
 src/bin/e_comp_wl_extensions.c | 42 +++++++++++++++++++++---------------------
 src/bin/e_remember.c           | 31 ++++++++++++++++++++-----------
 src/bin/e_remember.h           |  1 +
 4 files changed, 43 insertions(+), 32 deletions(-)

diff --git a/src/bin/e_client.h b/src/bin/e_client.h
index 1508e27..981cd57 100644
--- a/src/bin/e_client.h
+++ b/src/bin/e_client.h
@@ -671,6 +671,7 @@ struct E_Client
    Ecore_Timer               *raise_timer;
    E_Client_Move_Intercept_Cb move_intercept_cb;
    E_Remember                *remember;
+   E_Remember                *sr_remember;
 
    Efreet_Desktop            *desktop;
    E_Exec_Instance           *exe_inst;
diff --git a/src/bin/e_comp_wl_extensions.c b/src/bin/e_comp_wl_extensions.c
index fb5b18f..ea9833d 100644
--- a/src/bin/e_comp_wl_extensions.c
+++ b/src/bin/e_comp_wl_extensions.c
@@ -38,18 +38,15 @@ _e_comp_wl_session_recovery_get_uuid(struct wl_client 
*client EINA_UNUSED, struc
    uuid_generate(u);
    uuid_unparse_lower(u, uuid);
    zwp_e_session_recovery_send_create_uuid(resource, surface, uuid);
-   if (ec->remember)
-     e_remember_unuse(ec->remember);
-   else
+   if (ec->sr_remember)
      {
-        ec->remember = e_remember_find_usable(ec);
-        if (ec->remember)
-          e_remember_apply(ec->remember, ec);
+        e_remember_unuse(ec->sr_remember);
+        e_remember_del(ec->sr_remember);
      }
    eina_stringshare_replace(&ec->uuid, uuid);
-   ec->remember = e_remember_new();
-   e_remember_use(ec->remember);
-   ec->remember->apply = E_REMEMBER_APPLY_POS | E_REMEMBER_APPLY_SIZE | 
E_REMEMBER_APPLY_DESKTOP |
+   ec->sr_remember = e_remember_new();
+   e_remember_use(ec->sr_remember);
+   ec->sr_remember->apply = E_REMEMBER_APPLY_POS | E_REMEMBER_APPLY_SIZE | 
E_REMEMBER_APPLY_DESKTOP |
                          E_REMEMBER_APPLY_LAYER | E_REMEMBER_APPLY_ZONE | 
E_REMEMBER_APPLY_UUID;
    e_remember_update(ec);
 }
@@ -64,11 +61,14 @@ _e_comp_wl_session_recovery_set_uuid(struct wl_client 
*client EINA_UNUSED, struc
    if (e_object_is_del(E_OBJECT(ec))) return;
    if (ec->internal || ec->uuid) return; //FIXME: error
    eina_stringshare_replace(&ec->uuid, uuid);
-   rem = e_remember_find_usable(ec);
-   if ((!rem) || (rem == ec->remember)) return;
-   if (ec->remember)
-     e_remember_unuse(ec->remember);
-   ec->remember = rem;
+   rem = e_remember_sr_find(ec);
+   if ((!rem) || (rem == ec->sr_remember)) return;
+   if (ec->sr_remember)
+     {
+        e_remember_unuse(ec->sr_remember);
+        e_remember_del(ec->sr_remember);
+     }
+   ec->sr_remember = rem;
    e_remember_use(rem);
    e_remember_apply(rem, ec);
    ec->re_manage = 1;
@@ -82,15 +82,15 @@ _e_comp_wl_session_recovery_destroy_uuid(struct wl_client 
*client EINA_UNUSED, s
    ec = wl_resource_get_user_data(surface);
    if (!eina_streq(ec->uuid, uuid)) return; //FIXME: error
    eina_stringshare_replace(&ec->uuid, NULL);
-   if (ec->remember)
+   if (ec->sr_remember)
      {
-        e_remember_unuse(ec->remember);
-        e_remember_del(ec->remember);
+        e_remember_unuse(ec->sr_remember);
+        e_remember_del(ec->sr_remember);
      }
-   ec->remember = e_remember_find_usable(ec);
-   if (!ec->remember) return;
-   e_remember_use(ec->remember);
-   e_remember_apply(ec->remember, ec);
+   ec->sr_remember = e_remember_sr_find(ec);
+   if (!ec->sr_remember) return;
+   e_remember_use(ec->sr_remember);
+   e_remember_apply(ec->sr_remember, ec);
 }
 
 static void
diff --git a/src/bin/e_remember.c b/src/bin/e_remember.c
index 081bff2..409348b 100644
--- a/src/bin/e_remember.c
+++ b/src/bin/e_remember.c
@@ -16,7 +16,7 @@ struct _E_Remember_List
 /* local subsystem functions */
 static void        _e_remember_free(E_Remember *rem);
 static void        _e_remember_update(E_Client *ec, E_Remember *rem);
-static E_Remember *_e_remember_find(E_Client *ec, int check_usable);
+static E_Remember *_e_remember_find(E_Client *ec, int check_usable, Eina_Bool 
sr);
 static void        _e_remember_cb_hook_pre_post_fetch(void *data, E_Client 
*ec);
 static void        _e_remember_cb_hook_eval_post_new_client(void *data, 
E_Client *ec);
 static void        _e_remember_init_edd(void);
@@ -562,7 +562,7 @@ e_remember_find_usable(E_Client *ec)
 {
    E_Remember *rem;
 
-   rem = _e_remember_find(ec, 1);
+   rem = _e_remember_find(ec, 1, 0);
    return rem;
 }
 
@@ -571,10 +571,16 @@ e_remember_find(E_Client *ec)
 {
    E_Remember *rem;
 
-   rem = _e_remember_find(ec, 0);
+   rem = _e_remember_find(ec, 0, 0);
    return rem;
 }
 
+E_API E_Remember *
+e_remember_sr_find(E_Client *ec)
+{
+   return _e_remember_find(ec, 1, 1);
+}
+
 E_API void
 e_remember_match_update(E_Remember *rem)
 {
@@ -666,9 +672,9 @@ E_API void
 e_remember_update(E_Client *ec)
 {
    if (ec->new_client) return;
-   if (!ec->remember) return;
-   if (ec->remember->keep_settings) return;
-   _e_remember_update(ec, ec->remember);
+   if (((!ec->remember) || ec->remember->keep_settings) && (!ec->sr_remember)) 
return;
+   if (ec->remember) _e_remember_update(ec, ec->remember);
+   if (ec->sr_remember) _e_remember_update(ec, ec->sr_remember);
    e_config_save_queue();
 }
 
@@ -797,7 +803,7 @@ _e_remember_update(E_Client *ec, E_Remember *rem)
 
 /* local subsystem functions */
 static E_Remember *
-_e_remember_find(E_Client *ec, int check_usable)
+_e_remember_find(E_Client *ec, int check_usable, Eina_Bool sr)
 {
    Eina_List *l = NULL;
    E_Remember *rem;
@@ -862,11 +868,14 @@ _e_remember_find(E_Client *ec, int check_usable)
         if ((check_usable) && (!e_remember_usable_get(rem)))
           continue;
 
-        if (!eina_streq(rem->uuid, ec->uuid)) continue;
-        if (rem->uuid)
+        if (sr)
           {
-             if (rem->pid != ec->netwm.pid) continue;
-             return rem;
+             if (!eina_streq(rem->uuid, ec->uuid)) continue;
+             if (rem->uuid)
+               {
+                  if (rem->pid != ec->netwm.pid) continue;
+                  return rem;
+               }
           }
 
         if (ec->netwm.name) title = ec->netwm.name;
diff --git a/src/bin/e_remember.h b/src/bin/e_remember.h
index 5f0bae4..5c97f2d 100644
--- a/src/bin/e_remember.h
+++ b/src/bin/e_remember.h
@@ -123,6 +123,7 @@ E_API void        e_remember_unuse(E_Remember *rem);
 E_API void        e_remember_del(E_Remember *rem);
 E_API E_Remember *e_remember_find(E_Client *ec);
 E_API E_Remember *e_remember_find_usable(E_Client *ec);
+E_API E_Remember *e_remember_sr_find(E_Client *ec);
 E_API void        e_remember_match_update(E_Remember *rem);
 E_API void        e_remember_update(E_Client *ec);
 E_API int         e_remember_default_match_set(E_Remember *rem, E_Client *ec);

-- 


Reply via email to