devilhorns pushed a commit to branch master.

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

commit c61efa7c55d1be23651482b6225afac3ac5c3491
Author: Seunghun Lee <[email protected]>
Date:   Mon Jan 5 09:09:59 2015 -0500

    wl_drm: Add event handler for session activation signal.
    
    Summary:
    Compositor need to change the compositing mode to offscreen or render state 
depend on session activation state.
    this patch is for it.
    
    Test Plan:
    (1) Run enlightenment on X.
    (2) Change another VT.
    (3) Run enlightenment on wayland and drm.
    (4) Change the VT to enlightenment which is ran (1).
    enlightenment on wayland will not render during session deactivation state.
    
    Reviewers: zmike, devilhorns
    
    Reviewed By: devilhorns
    
    Subscribers: cedric
    
    Differential Revision: https://phab.enlightenment.org/D1816
---
 src/modules/wl_drm/e_mod_main.c | 59 ++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 58 insertions(+), 1 deletion(-)

diff --git a/src/modules/wl_drm/e_mod_main.c b/src/modules/wl_drm/e_mod_main.c
index b1b74c8..6d1d5ec 100644
--- a/src/modules/wl_drm/e_mod_main.c
+++ b/src/modules/wl_drm/e_mod_main.c
@@ -1,8 +1,57 @@
 #include "e.h"
-/* #include <Ecore_Drm.h> */
+#include <Ecore_Drm.h>
 
 EAPI E_Module_Api e_modapi = { E_MODULE_API_VERSION, "Wl_Drm" };
 
+static Ecore_Event_Handler *activate_handler;
+static Eina_Bool session_state = EINA_FALSE;
+
+static Eina_Bool
+_e_mod_drm_cb_activate(void *data, int type EINA_UNUSED, void *event)
+{
+   Ecore_Drm_Event_Activate *e;
+   E_Comp *c;
+
+   if ((!event) || (!data)) goto end;
+   e = event;
+   c = data;
+
+   if (e->active)
+     {
+        E_Client *ec;
+
+        if (session_state) goto end;
+        session_state = EINA_TRUE;
+
+        ecore_evas_show(c->ee);
+        E_CLIENT_FOREACH(c, ec)
+          {
+             if (ec->visible && (!ec->input_only))
+               e_comp_object_damage(ec->frame, 0, 0, ec->w, ec->h);
+          }
+        e_comp_render_queue(c);
+        e_comp_shape_queue_block(c, 0);
+        ecore_event_add(E_EVENT_COMPOSITOR_ENABLE, NULL, NULL, NULL);
+     }
+   else
+     {
+        session_state = EINA_FALSE;
+        ecore_evas_hide(c->ee);
+        edje_file_cache_flush();
+        edje_collection_cache_flush();
+        evas_image_cache_flush(c->evas);
+        evas_font_cache_flush(c->evas);
+        evas_render_dump(c->evas);
+
+        e_comp_render_queue(c);
+        e_comp_shape_queue_block(c, 1);
+        ecore_event_add(E_EVENT_COMPOSITOR_DISABLE, NULL, NULL, NULL);
+     }
+
+end:
+   return ECORE_CALLBACK_PASS_ON;
+}
+
 EAPI void *
 e_modapi_init(E_Module *m)
 {
@@ -86,6 +135,11 @@ e_modapi_init(E_Module *m)
     * happens to jive with what drm does */
    e_comp_wl_input_keymap_set(comp->wl_comp_data, NULL, NULL, NULL);
 
+   activate_handler =
+      ecore_event_handler_add(ECORE_DRM_EVENT_ACTIVATE,
+                              _e_mod_drm_cb_activate, comp);
+
+
    return m;
 }
 
@@ -95,5 +149,8 @@ e_modapi_shutdown(E_Module *m EINA_UNUSED)
    /* shutdown ecore_drm */
    /* ecore_drm_shutdown(); */
 
+   if (activate_handler) ecore_event_handler_del(activate_handler);
+   activate_handler = NULL;
+
    return 1;
 }

-- 


Reply via email to