discomfitor pushed a commit to branch enlightenment-0.19.

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

commit 714353be4788c5d650e64a36c3f83f4ec017a43a
Author: Mike Blumenkrantz <zm...@osg.samsung.com>
Date:   Tue Sep 8 18:37:44 2015 -0400

    add extreme hacks to enforce nocomp stacking policies
    
    if windows set to "Always on Top" exist while the option to allow
    windows over fullscreen windows is enabled, enabling nocomp will
    result in the above windows being stuck over the nocomp window
    
    instead, force the nocomp window to be the top-most window in all cases,
    and then put it back if another object appears on the screen over it
    
    fix T2703
---
 src/bin/e_comp.c | 39 +++++++++++++++++++++++++++++++++++++--
 1 file changed, 37 insertions(+), 2 deletions(-)

diff --git a/src/bin/e_comp.c b/src/bin/e_comp.c
index 1f32ea5..a016721 100644
--- a/src/bin/e_comp.c
+++ b/src/bin/e_comp.c
@@ -241,7 +241,15 @@ _e_comp_cb_nocomp_begin(E_Comp *c)
    INF("NOCOMP %p: frame %p", ecf, ecf->frame);
    c->nocomp = 1;
 
-   evas_object_raise(ecf->frame);
+   {
+      Eina_Bool fs;
+
+      fs = c->nocomp_ec->fullscreen;
+      c->nocomp_ec->fullscreen = 0;
+      c->nocomp_ec->layer = E_LAYER_CLIENT_PRIO;
+      evas_object_layer_set(c->nocomp_ec->frame, E_LAYER_CLIENT_PRIO);
+      c->nocomp_ec->fullscreen = fs;
+   }
    e_client_redirected_set(ecf, 0);
 
    //ecore_evas_manual_render_set(c->ee, EINA_TRUE);
@@ -345,6 +353,22 @@ _e_comp_nocomp_end(E_Comp *c)
    c->nocomp_want = 0;
    E_FREE_FUNC(c->nocomp_delay_timer, ecore_timer_del);
    _e_comp_cb_nocomp_end(c);
+   
+   if (c->nocomp_ec)
+     {
+        if (c->nocomp_ec->fullscreen)
+          {
+             E_Layer layer = MAX(c->nocomp_ec->saved.layer, 
E_LAYER_CLIENT_NORMAL);
+
+             if (!e_config->allow_above_fullscreen)
+               layer = E_LAYER_CLIENT_FULLSCREEN;
+             else if (e_config->mode.presentation)
+               layer = E_LAYER_CLIENT_TOP;
+             c->nocomp_ec->fullscreen = 0;
+             evas_object_layer_set(c->nocomp_ec->frame, layer);
+             c->nocomp_ec->fullscreen = 1;
+          }
+     }
    c->nocomp_ec = NULL;
 }
 
@@ -834,6 +858,16 @@ _e_comp_free(E_Comp *c)
 //////////////////////////////////////////////////////////////////////////
 
 static Eina_Bool
+_e_comp_object_add(void *d EINA_UNUSED, int t EINA_UNUSED, E_Event_Comp_Object 
*ev)
+{
+   E_Comp *c = e_comp_util_evas_object_comp_get(ev->comp_object);
+   if ((!c->nocomp) || (!c->nocomp_ec)) return ECORE_CALLBACK_RENEW;
+   if (evas_object_layer_get(ev->comp_object) > MAX(c->nocomp_ec->saved.layer, 
E_LAYER_CLIENT_NORMAL))
+     _e_comp_nocomp_end(c);
+   return ECORE_CALLBACK_RENEW;
+}
+
+static Eina_Bool
 _e_comp_override_expire(void *data)
 {
    E_Comp *c = data;
@@ -1084,6 +1118,7 @@ out:
 
    E_LIST_HANDLER_APPEND(handlers, ECORE_EVENT_KEY_DOWN, _e_comp_key_down, 
NULL);
    E_LIST_HANDLER_APPEND(handlers, ECORE_EVENT_SIGNAL_USER, 
_e_comp_signal_user, NULL);
+   E_LIST_HANDLER_APPEND(handlers, E_EVENT_COMP_OBJECT_ADD, 
_e_comp_object_add, NULL);
 
    E_LIST_HANDLER_APPEND(handlers, E_EVENT_ZONE_MOVE_RESIZE, 
_e_comp_cb_zone_change, NULL);
    E_LIST_HANDLER_APPEND(handlers, E_EVENT_ZONE_ADD, _e_comp_cb_zone_change, 
NULL);
@@ -1576,7 +1611,7 @@ E_API void
 e_comp_override_add(E_Comp *c)
 {
    c->nocomp_override++;
-   if ((c->nocomp_override > 0) && (c->nocomp)) _e_comp_cb_nocomp_end(c);
+   if ((c->nocomp_override > 0) && (c->nocomp)) _e_comp_nocomp_end(c);
 }
 
 #if 0

-- 


Reply via email to