discomfitor pushed a commit to branch master.

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

commit aad88716a4bd42b1466426fe6f9c229163cc3236
Author: Mike Blumenkrantz <[email protected]>
Date:   Wed Jan 22 16:45:53 2014 -0500

    fix compositor grab tracking
    
    it's possible to have multiple/recursive grabs, so the number of grabs 
active needs to be tracked
    
    T820
---
 src/bin/e_comp.c | 33 +++++++++++++++++++++++++++++++--
 src/bin/e_comp.h |  2 ++
 2 files changed, 33 insertions(+), 2 deletions(-)

diff --git a/src/bin/e_comp.c b/src/bin/e_comp.c
index d626e8f..278eaa6 100644
--- a/src/bin/e_comp.c
+++ b/src/bin/e_comp.c
@@ -1711,13 +1711,42 @@ e_comp_e_object_layer_get(const E_Object *obj)
 EAPI Eina_Bool
 e_comp_grab_input(E_Comp *c, Eina_Bool mouse, Eina_Bool kbd)
 {
-   return e_grabinput_get((!!mouse) * c->ee_win, 0, (!!kbd) * c->ee_win);
+   Eina_Bool ret = EINA_FALSE;
+   Ecore_Window mwin = 0, kwin = 0;
+
+   mouse = !!mouse;
+   kbd = !!kbd;
+   if (mouse || c->input_mouse_grabs)
+     mwin = c->ee_win;
+   if (kbd || c->input_mouse_grabs)
+     kwin = c->ee_win;
+   if ((c->input_mouse_grabs && c->input_key_grabs) ||
+       e_grabinput_get(mwin, 0, kwin))
+     {
+        ret = EINA_TRUE;
+        c->input_mouse_grabs += mouse;
+        c->input_key_grabs += kbd;
+     }
+   return ret;
 }
 
 EAPI void
 e_comp_ungrab_input(E_Comp *c, Eina_Bool mouse, Eina_Bool kbd)
 {
-   e_grabinput_release((!!mouse) * c->ee_win, (!!kbd) * c->ee_win);
+   Ecore_Window mwin = 0, kwin = 0;
+
+   mouse = !!mouse;
+   kbd = !!kbd;
+   if (mouse && (c->input_mouse_grabs == 1))
+     mwin = c->ee_win;
+   if (kbd && (c->input_key_grabs == 1))
+     kwin = c->ee_win;
+   if (c->input_mouse_grabs)
+     c->input_mouse_grabs -= mouse;
+   if (c->input_key_grabs)
+     c->input_key_grabs -= kbd;
+   if ((!mwin) || (!kwin)) return;
+   e_grabinput_release(mwin, kwin);
    evas_event_feed_mouse_out(c->evas, 0, NULL);
    evas_event_feed_mouse_in(c->evas, 0, NULL);
 }
diff --git a/src/bin/e_comp.h b/src/bin/e_comp.h
index dd86913..1ee47a5 100644
--- a/src/bin/e_comp.h
+++ b/src/bin/e_comp.h
@@ -101,6 +101,8 @@ struct _E_Comp
    Ecore_Window  cm_selection; //FIXME: move to comp_x ?
 
    int depth;
+   unsigned int    input_key_grabs;
+   unsigned int    input_mouse_grabs;
 
    Ecore_Cb        grab_cb;
    Ecore_Cb        bindings_grab_cb;

-- 


Reply via email to