discomfitor pushed a commit to branch enlightenment-0.20.

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

commit 1a71696c3a6b344d75461f31ed46b50335fd158e
Author: Mike Blumenkrantz <zm...@osg.samsung.com>
Date:   Fri Feb 19 17:56:26 2016 -0500

    pre-remove pixmap from x11 clients during del hook
    
    this breaks the compositor!
    
    ref 0ca200513e4d46542192762ffdc2481a32e8db63
---
 src/bin/e_client.c | 11 +++++++----
 src/bin/e_comp_x.c |  7 +++++++
 2 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/bin/e_client.c b/src/bin/e_client.c
index 2d2d7fb..bd490b4 100644
--- a/src/bin/e_client.c
+++ b/src/bin/e_client.c
@@ -462,9 +462,12 @@ _e_client_revert_focus(E_Client *ec)
 static void
 _e_client_free(E_Client *ec)
 {
-   if (e_pixmap_free(ec->pixmap))
-     e_pixmap_client_set(ec->pixmap, NULL);
-   ec->pixmap = NULL;
+   if (ec->pixmap)
+     {
+        if (e_pixmap_free(ec->pixmap))
+          e_pixmap_client_set(ec->pixmap, NULL);
+        ec->pixmap = NULL;
+     }
 
    e_comp_object_redirected_set(ec->frame, 0);
    e_comp_object_render_update_del(ec->frame);
@@ -639,6 +642,7 @@ _e_client_del(E_Client *ec)
    evas_object_focus_set(ec->frame, 0);
 
    E_FREE_FUNC(ec->ping_poller, ecore_poller_del);
+   eina_hash_del_by_key(clients_hash[e_pixmap_type_get(ec->pixmap)], 
&ec->pixmap);
    /* must be called before parent/child clear */
    _e_client_hook_call(E_CLIENT_HOOK_DEL, ec);
    E_FREE(ec->comp_data);
@@ -664,7 +668,6 @@ _e_client_del(E_Client *ec)
    EINA_LIST_FREE(ec->group, child)
      child->leader = NULL;
 
-   eina_hash_del_by_key(clients_hash[e_pixmap_type_get(ec->pixmap)], 
&ec->pixmap);
    e_comp->clients = eina_list_remove(e_comp->clients, ec);
    e_comp_object_render_update_del(ec->frame);
 }
diff --git a/src/bin/e_comp_x.c b/src/bin/e_comp_x.c
index 10d8efc..d5ec68c 100644
--- a/src/bin/e_comp_x.c
+++ b/src/bin/e_comp_x.c
@@ -4621,7 +4621,14 @@ _e_comp_x_hook_client_del(void *d EINA_UNUSED, E_Client 
*ec)
              e_pixmap_free(e_comp_x_client_pixmap_get(ec));
           }
      }
+   else
 #endif
+     {
+        if (e_pixmap_free(ec->pixmap))
+          e_pixmap_client_set(ec->pixmap, NULL);
+        ec->pixmap = NULL;
+     }
+
    if (post_clients)
      post_clients = eina_list_remove(post_clients, ec);
 

-- 


Reply via email to