From aad88716a4bd42b1466426fe6f9c229163cc3236 Mon Sep 17 00:00:00 2001 From: Mike Blumenkrantz Date: Wed, 22 Jan 2014 16:45:53 -0500 Subject: [PATCH] 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 d626e8f4b..278eaa6fb 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 dd869131c..1ee47a5b9 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;