use event grabber for gadget editors to improve event detection

fixes some cases where clicking the background didn't dismiss the editor
and allows for clicking on non-gadget parts of the editor
This commit is contained in:
Mike Blumenkrantz 2017-06-30 10:25:23 -04:00
parent 1fe4555d7b
commit 89aa89f3a6
1 changed files with 47 additions and 18 deletions

View File

@ -127,6 +127,7 @@ static void _gadget_object_finalize(E_Gadget_Config *zgc);
static Eina_Bool _gadget_object_create(E_Gadget_Config *zgc);
static void _editor_pointer_site_init(E_Gadget_Site_Orient orient, Evas_Object *site, Evas_Object *editor, Eina_Bool );
static void _gadget_drop_handler_moveresize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED);
static void _edit_site_del(void *data, Evas *e, Evas_Object *obj, void *event_info);
static Eina_Bool
_editor_site_visible(void)
@ -369,7 +370,7 @@ _gadget_wizard_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *even
E_Gadget_Config *zgc = data;
if (zgc->cfg_object == obj) zgc->cfg_object = NULL;
if (zgc->site->editor) evas_object_show(zgc->site->editor);
if (desktop_editor) evas_object_show(desktop_editor);
}
static Eina_Bool
@ -389,7 +390,7 @@ _gadget_object_create(E_Gadget_Config *zgc)
if (!zgc->cfg_object)
{
added = 1;
if (zgc->site->editor) evas_object_show(zgc->site->editor);
if (desktop_editor) evas_object_show(desktop_editor);
return EINA_FALSE;
}
e_comp_grab_input(1, 1);
@ -398,7 +399,7 @@ _gadget_object_create(E_Gadget_Config *zgc)
return EINA_TRUE;
}
}
if (zgc->site->editor) evas_object_show(zgc->site->editor);
if (desktop_editor) evas_object_show(desktop_editor);
if ((zgc->zone >= 0) && (!e_comp_zone_number_get(zgc->zone))) return EINA_FALSE;
/* if id is < 0, gadget creates dummy config for demo use
* if id is 0, gadget creates new config and returns id
@ -2007,8 +2008,12 @@ static void
_editor_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
{
Evas_Object *site = evas_object_data_get(obj, "__gadget_site");
ZGS_GET(site);
zgs->editor = NULL;
if (site)
{
evas_object_event_callback_del(site, EVAS_CALLBACK_DEL, _edit_site_del);
ZGS_GET(site);
zgs->editor = NULL;
}
evas_object_event_callback_del_full(data, EVAS_CALLBACK_RESIZE, _editor_resize, obj);
}
@ -2050,6 +2055,7 @@ _editor_pointer_button(Gadget_Item *active, int t EINA_UNUSED, Ecore_Event_Mouse
evas_object_smart_callback_call(active->site, "gadget_site_dropped", pointer_site);
e_comp_canvas_feed_mouse_up(0);
evas_object_pass_events_set(active->site, 0);
evas_object_pass_events_set(desktop_editor, 0);
elm_object_disabled_set(active->editor, 1);
e_comp_object_util_del_list_remove(active->editor, pointer_site);
}
@ -2078,6 +2084,7 @@ _editor_pointer_button(Gadget_Item *active, int t EINA_UNUSED, Ecore_Event_Mouse
zgc = eina_list_data_get(zgs->gadgets);
e_comp_canvas_feed_mouse_up(0);
evas_object_pass_events_set(zgc->orig->site->layout, 0);
evas_object_pass_events_set(desktop_editor, 0);
if (zzgs)
{
/* fake the moving gadget as being on the pointer site */
@ -2169,7 +2176,8 @@ _editor_gadget_new(void *data, Evas_Object *obj, void *event_info)
E_Gadget_Site_Orient orient;
ZGS_GET(gi->site);
evas_object_hide(zgs->editor);
evas_object_hide(desktop_editor);
evas_object_pass_events_set(desktop_editor, 1);
orient = e_gadget_site_orient_get(gi->site);
_editor_pointer_site_init(orient, gi->site, gi->editor, 0);
e_comp_object_util_del_list_append(gi->editor, pointer_site);
@ -2303,7 +2311,11 @@ e_gadget_editor_add(Evas_Object *parent, Evas_Object *site)
elm_object_item_tooltip_content_cb_set(item, _editor_tooltip_content, gi, NULL);
}
evas_object_event_callback_add(list, EVAS_CALLBACK_DEL, _editor_del, parent);
ZGS_GET(site);
evas_object_event_callback_add(site, EVAS_CALLBACK_DEL, _edit_site_del, zgs);
evas_object_data_set(list, "__gadget_site", site);
/* FIXME: embedded editors? */
zgs->editor = list;
added = 0;
return list;
}
@ -2352,8 +2364,7 @@ e_gadget_site_edit(Evas_Object *site)
evas_object_show(comp_object);
evas_object_resize(comp_object, zone->w / 2, zone->h / 2);
e_comp_object_util_center_on_zone(comp_object, zone);
/* FIXME: embedded editors? */
zgs->editor = comp_object;
return comp_object;
}
@ -2374,10 +2385,21 @@ _edit_end()
e_comp_ungrab_input(1, 1);
}
static void
_edit_site_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
{
E_Gadget_Site *zgs = data;
evas_object_data_del(zgs->editor, "__gadget_site");
zgs->editor = NULL;
_edit_end();
}
static void
_gadget_desklock_del(void)
{
e_desklock_hide();
desktop_editor = NULL;
_edit_end();
}
@ -2437,9 +2459,13 @@ _gadget_desklock_handler(void *d EINA_UNUSED, int t EINA_UNUSED, E_Event_Comp_Ob
if (strncmp(name, "desklock", 8)) return ECORE_CALLBACK_RENEW;
evas_object_layer_set(ev->comp_object, DESKLOCK_DEMO_LAYER - 1);
site = e_gadget_site_auto_add(E_GADGET_SITE_ORIENT_NONE, name);
evas_object_propagate_events_set(site, 0);
evas_object_smart_member_add(site, desktop_rect);
evas_object_smart_callback_add(site, "gadget_moved", _gadget_moved, NULL);
evas_object_layer_set(site, DESKLOCK_DEMO_LAYER);
comp_object = e_gadget_site_edit(site);
desktop_editor = comp_object = e_gadget_site_edit(site);
evas_object_propagate_events_set(comp_object, 0);
evas_object_smart_member_add(comp_object, desktop_rect);
e_comp_object_util_del_list_append(ev->comp_object, comp_object);
memset(&n, 0, sizeof(E_Notification_Notify));
@ -2455,14 +2481,13 @@ _gadget_desklock_handler(void *d EINA_UNUSED, int t EINA_UNUSED, E_Event_Comp_Ob
E_API void
e_gadget_site_desklock_edit(void)
{
desktop_rect = evas_object_rectangle_add(e_comp->evas);
evas_object_color_set(desktop_rect, 0, 0, 0, 0);
desktop_rect = evas_object_event_grabber_add(e_comp->evas);
evas_object_resize(desktop_rect, e_comp->w, e_comp->h);
evas_object_layer_set(desktop_rect, DESKLOCK_DEMO_LAYER);
evas_object_layer_set(desktop_rect, E_LAYER_MAX - 100);
evas_object_show(desktop_rect);
E_LIST_HANDLER_APPEND(desktop_handlers, E_EVENT_COMP_OBJECT_ADD, _gadget_desklock_handler, NULL);
E_LIST_HANDLER_APPEND(desktop_handlers, ECORE_EVENT_KEY_DOWN, _gadget_desklock_key_handler, NULL);
E_LIST_HANDLER_APPEND(desktop_handlers, ECORE_EVENT_MOUSE_BUTTON_UP, _gadget_desklock_mouse_up_handler, NULL);
evas_object_event_callback_add(desktop_rect, EVAS_CALLBACK_MOUSE_UP, _gadget_desklock_mouse_up_handler, NULL);
e_desklock_demo();
e_comp_grab_input(1, 1);
}
@ -2502,17 +2527,21 @@ e_gadget_site_desktop_edit(Evas_Object *site)
ZGS_GET(site);
desktop_rect = evas_object_rectangle_add(e_comp->evas);
desktop_rect = evas_object_event_grabber_add(e_comp->evas);
evas_object_event_callback_add(desktop_rect, EVAS_CALLBACK_DEL, _edit_end, NULL);
evas_object_color_set(desktop_rect, 0, 0, 0, 0);
evas_object_resize(desktop_rect, e_comp->w, e_comp->h);
evas_object_layer_set(desktop_rect, E_LAYER_DESKTOP);
evas_object_layer_set(desktop_rect, E_LAYER_MAX - 100);
evas_object_show(desktop_rect);
evas_object_propagate_events_set(site, 0);
evas_object_smart_member_add(site, desktop_rect);
E_LIST_HANDLER_APPEND(desktop_handlers, ECORE_EVENT_KEY_DOWN, _gadget_desktop_key_handler, zgs);
E_LIST_HANDLER_APPEND(desktop_handlers, ECORE_EVENT_MOUSE_BUTTON_UP, _gadget_desktop_mouse_up_handler, NULL);
evas_object_event_callback_add(site, EVAS_CALLBACK_DEL, _edit_end, NULL);
evas_object_event_callback_add(desktop_rect, EVAS_CALLBACK_MOUSE_UP, _gadget_desktop_mouse_up_handler, NULL);
desktop_editor = e_gadget_site_edit(site);
evas_object_propagate_events_set(desktop_editor, 0);
evas_object_smart_member_add(desktop_editor, desktop_rect);
evas_object_smart_callback_add(site, "gadget_moved", _gadget_moved, NULL);
evas_object_show(desktop_editor);