raster pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=4aad39ce037ff231889544b59875256018ebdbb9

commit 4aad39ce037ff231889544b59875256018ebdbb9
Author: Mike Blumenkrantz <[email protected]>
Date:   Tue Jun 26 12:25:38 2018 +0900

    ecore-evas-x: set draw_block until the window receives a configure event 
(#2)
    
    Summary:
    drawing a non-override window before receiving a configure event results
    in an unsized window, breaking spec. it also prevents ecore-evas resize
    callbacks from triggering, yielding undefined returns from functions which
    attempt to get the geometry of the ecore-evas
    
    this patch improves upon the previous version by handling the case of 
windows
    which are created with the correct initial size, bypassing an initial 
configure
    event
    
    there is still a lot of work to be done in this engine to 
improve/consolidate
    resize-related code and ensure protocol correctness
    
    ref T7008
    fix T6907
    
    Reviewers: devilhorns, ManMower
    
    Subscribers: cedric, #committers
    
    Tags: #efl
    
    Maniphest Tasks: T7008, T6907
    
    Differential Revision: https://phab.enlightenment.org/D6275
---
 src/modules/ecore_evas/engines/x/ecore_evas_x.c | 57 ++++++++++++++++++++++---
 1 file changed, 51 insertions(+), 6 deletions(-)

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 3d88e9aae3..4cfafcdd67 100644
--- a/src/modules/ecore_evas/engines/x/ecore_evas_x.c
+++ b/src/modules/ecore_evas/engines/x/ecore_evas_x.c
@@ -53,7 +53,7 @@
 
 static int _ecore_evas_init_count = 0;
 
-static Ecore_Event_Handler *ecore_evas_event_handlers[13];
+static Ecore_Event_Handler *ecore_evas_event_handlers[14];
 
 static int leader_ref = 0;
 static Ecore_X_Window leader_win = 0;
@@ -131,6 +131,8 @@ struct _Ecore_Evas_Engine_Data_X11 {
         unsigned long colormap; // store colormap used to create pixmap
      } pixmap;
    Eina_Bool destroyed : 1; // X window has been deleted and cannot be used
+   Eina_Bool fully_obscured : 1; // X window is fully obscured
+   Eina_Bool configured : 1; // X window has been configured
 };
 
 static Ecore_Evas_Interface_X11 * _ecore_evas_x_interface_x11_new(void);
@@ -1065,18 +1067,44 @@ _ecore_evas_x_event_visibility_change(void *data 
EINA_UNUSED, int type EINA_UNUS
    edata = ee->engine.data;
    if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
 //   printf("VIS CHANGE OBSCURED: %p %i\n", ee, e->fully_obscured);
+   edata->fully_obscured = e->fully_obscured;
    if (e->fully_obscured)
      {
         /* FIXME: round trip */
         if (!ecore_x_screen_is_composited(edata->screen_num))
-          ee->draw_block = EINA_TRUE;
+          ee->draw_block = !edata->configured;
+     }
+   else if (ee->draw_block)
+     {
+        if (!edata->configure_coming)
+          edata->configured = 1;
+        ee->draw_block = !edata->configured;
      }
-   else
-     ee->draw_block = EINA_FALSE;
    return ECORE_CALLBACK_PASS_ON;
 }
 
 static Eina_Bool
+_ecore_evas_x_event_window_create(void *data EINA_UNUSED, int type 
EINA_UNUSED, void *event)
+{
+   Ecore_X_Event_Window_Create *e = event;
+   Ecore_Evas *ee;
+   Ecore_Evas_Engine_Data_X11 *edata;
+
+   ee = ecore_event_window_match(e->win);
+   if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
+   edata = ee->engine.data;
+   if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
+   if (!ee->draw_block) return ECORE_CALLBACK_RENEW;
+   if ((ee->req.w == e->w) && (ee->req.h == e->h))
+     {
+        /* window created with desired size: canvas can be drawn */
+        ee->draw_block = EINA_FALSE;
+        edata->configured = EINA_TRUE;
+     }
+   return ECORE_CALLBACK_RENEW;
+}
+
+static Eina_Bool
 _ecore_evas_x_event_client_message(void *data EINA_UNUSED, int type 
EINA_UNUSED, void *event)
 {
    Ecore_Evas *ee;
@@ -1622,6 +1650,18 @@ _ecore_evas_x_event_window_configure(void *data 
EINA_UNUSED, int type EINA_UNUSE
    if (!ee) return ECORE_CALLBACK_PASS_ON; /* pass on event */
    edata = ee->engine.data;
    if (e->win != ee->prop.window) return ECORE_CALLBACK_PASS_ON;
+   if (!edata->configured)
+     {
+        if (edata->fully_obscured)
+          {
+             /* FIXME: round trip */
+             if (!ecore_x_screen_is_composited(edata->screen_num))
+               ee->draw_block = EINA_FALSE;
+          }
+        else
+          ee->draw_block = EINA_FALSE;
+     }
+   edata->configured = 1;
    if (edata->direct_resize) return ECORE_CALLBACK_PASS_ON;
 
    pointer = evas_default_device_get(ee->evas, EFL_INPUT_DEVICE_TYPE_MOUSE);
@@ -2019,6 +2059,9 @@ _ecore_evas_x_init(void)
    ecore_evas_event_handlers[12] =
      ecore_event_handler_add(ECORE_X_EVENT_CLIENT_MESSAGE,
                              _ecore_evas_x_event_client_message, NULL);
+   ecore_evas_event_handlers[13] =
+     ecore_event_handler_add(ECORE_X_EVENT_WINDOW_CREATE,
+                             _ecore_evas_x_event_window_create, NULL);
    ecore_event_evas_init();
    return _ecore_evas_init_count;
 }
@@ -2211,11 +2254,10 @@ _ecore_evas_x_resize(Ecore_Evas *ee, int w, int h)
           }
      }
 
+   if ((!changed) && (ee->w == w) && (ee->h == h)) return;
    _ecore_evas_x_shadow_update(ee);
    if (edata->direct_resize)
      {
-        if ((ee->w == w) && (ee->h == h)) return;
-
         ee->w = w;
         ee->h = h;
         if (changed) edata->configure_reqs++;
@@ -2338,6 +2380,7 @@ _ecore_evas_x_move_resize(Ecore_Evas *ee, int x, int y, 
int w, int h)
           }
         else
           {
+             if ((!changed) && (ee->w == w) && (ee->h == h)) return;
              edata->configure_coming = 1;
              if (changed) edata->configure_reqs++;
              if (ee->prop.window) ecore_x_window_resize(ee->prop.window, vw, 
vh);
@@ -4667,6 +4710,8 @@ ecore_evas_gl_x11_options_new_internal(const char 
*disp_name, Ecore_X_Window par
    _ecore_evas_x_aux_hints_update(ee);
    _ecore_evas_x_sync_set(ee);
 
+   ee->draw_block = 1;
+
    ee->engine.func->fn_render = _ecore_evas_x_render;
    ecore_x_input_multi_select(ee->prop.window);
 

-- 


Reply via email to