derekf pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=0a185d3efd51e3af2ba45b2ed1c8ec67d1eedd60

commit 0a185d3efd51e3af2ba45b2ed1c8ec67d1eedd60
Author: Derek Foreman <[email protected]>
Date:   Wed Oct 4 13:46:34 2017 -0500

    ecore_wl2: Add new API to latch window state for updates
    
    Add an API to call at the beginning of render to latch state at
    that moment, and use it for the wayland engine.
---
 src/lib/ecore_wl2/Ecore_Wl2.h                             | 15 +++++++++++++++
 src/lib/ecore_wl2/ecore_wl2_private.h                     |  1 +
 src/lib/ecore_wl2/ecore_wl2_window.c                      |  9 +++++++++
 .../engines/wayland/ecore_evas_wayland_common.c           |  1 +
 4 files changed, 26 insertions(+)

diff --git a/src/lib/ecore_wl2/Ecore_Wl2.h b/src/lib/ecore_wl2/Ecore_Wl2.h
index 288ffda65b..70edf4d719 100644
--- a/src/lib/ecore_wl2/Ecore_Wl2.h
+++ b/src/lib/ecore_wl2/Ecore_Wl2.h
@@ -1957,6 +1957,21 @@ EAPI void ecore_wl2_display_flush(Ecore_Wl2_Display 
*display);
 
 EAPI Eina_Bool ecore_wl2_window_resizing_get(Ecore_Wl2_Window *window);
 
+/**
+ * Latch window state at the start of an update
+ *
+ * When async render takes place we continue to dispatch wayland
+ * events from the main loop. We need to defer any changes to
+ * window state from those events until the update is complete.
+ *
+ * Events deferred during an update will automatically fire
+ * immediately after the caller calls ecore_wl2_window_commit.
+ *
+ * @param window
+ * @since 1.21
+ */
+EAPI void ecore_wl2_window_update_begin(Ecore_Wl2_Window *window);
+
 # endif
 
 # undef EAPI
diff --git a/src/lib/ecore_wl2/ecore_wl2_private.h 
b/src/lib/ecore_wl2/ecore_wl2_private.h
index 743c05bf2f..ff78a82579 100644
--- a/src/lib/ecore_wl2/ecore_wl2_private.h
+++ b/src/lib/ecore_wl2/ecore_wl2_private.h
@@ -233,6 +233,7 @@ struct _Ecore_Wl2_Window
         unsigned int count;
      } wm_rot;
    Eina_Bool has_buffer : 1;
+   Eina_Bool updating : 1;
 };
 
 struct _Ecore_Wl2_Output
diff --git a/src/lib/ecore_wl2/ecore_wl2_window.c 
b/src/lib/ecore_wl2/ecore_wl2_window.c
index ed9732df72..9b223190ce 100644
--- a/src/lib/ecore_wl2/ecore_wl2_window.c
+++ b/src/lib/ecore_wl2/ecore_wl2_window.c
@@ -1408,6 +1408,7 @@ ecore_wl2_window_commit(Ecore_Wl2_Window *window, 
Eina_Bool flush)
         wl_surface_commit(window->surface);
         ecore_wl2_display_flush(window->display);
      }
+   window->updating = EINA_FALSE;
 }
 
 EAPI Eina_Bool
@@ -1468,3 +1469,11 @@ ecore_wl2_window_resizing_get(Ecore_Wl2_Window *window)
 
    return window->req_config.resizing;
 }
+
+EAPI void ecore_wl2_window_update_begin(Ecore_Wl2_Window *window)
+{
+   EINA_SAFETY_ON_NULL_RETURN(window);
+   EINA_SAFETY_ON_TRUE_RETURN(window->updating);
+
+   window->updating = EINA_TRUE;
+}
diff --git a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c 
b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c
index e2e6cec967..4d32bfae5a 100644
--- a/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c
+++ b/src/modules/ecore_evas/engines/wayland/ecore_evas_wayland_common.c
@@ -1710,6 +1710,7 @@ _ecore_evas_wl_common_render_flush_pre(void *data, Evas 
*evas, void *event EINA_
 
    if (!ecore_wl2_window_shell_surface_exists(wdata->win)) return;
 
+   ecore_wl2_window_update_begin(wdata->win);
    if (wdata->win->zxdg_configure_ack && wdata->win->req_config.serial &&
        (wdata->win->req_config.serial != wdata->win->set_config.serial))
      wdata->win->zxdg_configure_ack(wdata->win->zxdg_surface,

-- 


Reply via email to