discomfitor pushed a commit to branch master.

commit 569b2fd86a398048478fbaf0850854afee5c1761
Author: Mike Blumenkrantz <[email protected]>
Date:   Wed Jul 24 13:58:57 2013 +0100

    ecore-evas-x no longer uses X windows after receiving a destroy event
---
 ChangeLog                                       |  4 ++++
 NEWS                                            |  1 +
 src/modules/ecore_evas/engines/x/ecore_evas_x.c | 17 +++++++++++------
 3 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 0918441..4e41710 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2013-07-18  Mike Blumenkrantz
+
+        * Ecore-Evas: fix usage of underlying X window after it has received a 
destroy event
+
 2013-07-22 Jiyoun Park
 
         * Evas: fix infinite loop if app use ecore evas image
diff --git a/NEWS b/NEWS
index 0149286..caf8ee5 100644
--- a/NEWS
+++ b/NEWS
@@ -340,6 +340,7 @@ Fixes:
     * Ecore_Evas:
      - Fix build of Ecore_Evas_Extn on Solaris.
      - Fix many memory problems with ecore_evas_extn.
+     - Fix usage of underlying X window after it has received a destroy event
     * Ecore_X:
      - Fix possible memory corruption in xrandr EDID functions.
      - Fix x11 error sync issue with ecore_x_image_get().
diff --git a/src/modules/ecore_evas/engines/x/ecore_evas_x.c 
b/src/modules/ecore_evas/engines/x/ecore_evas_x.c
index 260ae40..d4733d5 100644
--- a/src/modules/ecore_evas/engines/x/ecore_evas_x.c
+++ b/src/modules/ecore_evas/engines/x/ecore_evas_x.c
@@ -95,6 +95,7 @@ struct _Ecore_Evas_Engine_Data_X11 {
         void *visual; // store visual used to create pixmap
         unsigned long colormap; // store colormap used to create pixmap
      } pixmap;
+   Eina_Bool destroyed : 1; // X window has been deleted and cannot be used
 };
 
 static Ecore_Evas_Interface_X11 * _ecore_evas_x_interface_x11_new(void);
@@ -152,8 +153,9 @@ static void
 _ecore_evas_x_group_leader_unset(Ecore_Evas *ee)
 {
    Ecore_Evas_Engine_Data_X11 *edata = ee->engine.data;
-   ecore_x_window_prop_property_del(ee->prop.window,
-                                    ECORE_X_ATOM_WM_CLIENT_LEADER);
+   if (!edata->destroyed)
+     ecore_x_window_prop_property_del(ee->prop.window,
+                                      ECORE_X_ATOM_WM_CLIENT_LEADER);
    if (edata->leader == leader_win)
      {
         leader_ref--;
@@ -224,8 +226,8 @@ _ecore_evas_x_sync_set(Ecore_Evas *ee)
           }
         edata->sync_counter = 0;
      }
-   if (sync_counter != edata->sync_counter)
-   ecore_x_e_comp_sync_counter_set(ee->prop.window, edata->sync_counter);
+   if ((!edata->destroyed) && (sync_counter != edata->sync_counter))
+     ecore_x_e_comp_sync_counter_set(ee->prop.window, edata->sync_counter);
 }
 
 static void
@@ -1259,12 +1261,15 @@ _ecore_evas_x_event_window_destroy(void *data 
EINA_UNUSED, int type EINA_UNUSED,
 {
    Ecore_Evas *ee;
    Ecore_X_Event_Window_Destroy *e;
+   Ecore_Evas_Engine_Data_X11 *edata;
 
    e = event;
    ee = ecore_event_window_match(e->win);
    if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
    if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
+   edata = ee->engine.data;
    if (ee->func.fn_destroy) ee->func.fn_destroy(ee);
+   edata->destroyed = 1;
    _ecore_evas_x_sync_clear(ee);
    ecore_evas_free(ee);
    return ECORE_CALLBACK_PASS_ON;
@@ -1649,7 +1654,8 @@ _ecore_evas_x_free(Ecore_Evas *ee)
    _ecore_evas_x_sync_set(ee);
    if (edata->win_shaped_input)
      ecore_x_window_free(edata->win_shaped_input);
-   if (ee->prop.window) ecore_x_window_free(ee->prop.window);
+   ecore_event_window_unregister(ee->prop.window);
+   if (ee->prop.window && (!edata->destroyed)) 
ecore_x_window_free(ee->prop.window);
    if (edata->pmap) ecore_x_pixmap_free(edata->pmap);
    if (edata->mask) ecore_x_pixmap_free(edata->mask);
    if (edata->gc) ecore_x_gc_free(edata->gc);
@@ -1658,7 +1664,6 @@ _ecore_evas_x_free(Ecore_Evas *ee)
    edata->mask = 0;
    edata->gc = 0;
    edata->damages = NULL;
-   ecore_event_window_unregister(ee->prop.window);
    while (edata->win_extra)
      {
         Ecore_X_Window *winp;

-- 

------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk

Reply via email to