redo bryce eventing

post events are way harder and I don't know why I didn't do this in the
first place?

fix T5974
This commit is contained in:
Mike Blumenkrantz 2017-10-06 11:37:50 -04:00
parent 990c0f1005
commit d7060c7c6f
1 changed files with 38 additions and 65 deletions

View File

@ -11,6 +11,7 @@ typedef struct Bryce
Eina_Stringshare *name; Eina_Stringshare *name;
Evas_Object *bryce; Evas_Object *bryce;
Evas_Object *events;
Evas_Object *layout; Evas_Object *layout;
Evas_Object *site; Evas_Object *site;
Evas_Object *scroller; Evas_Object *scroller;
@ -35,7 +36,6 @@ typedef struct Bryce
unsigned int autohide_blocked; unsigned int autohide_blocked;
Eina_List *popups; Eina_List *popups;
void *event_info; void *event_info;
Ecore_Job *menu_job;
uint64_t last_timestamp; uint64_t last_timestamp;
/* config: do not bitfield! */ /* config: do not bitfield! */
@ -64,7 +64,7 @@ static E_Action *menu_act;
static Eina_List *handlers; static Eina_List *handlers;
static void _bryce_act_menu_job(void *data); static void _bryce_menu(Bryce *b);
#define BRYCE_GET(obj) \ #define BRYCE_GET(obj) \
Bryce *b; \ Bryce *b; \
@ -499,12 +499,13 @@ _bryce_moveresize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event
E_Zone *zone; E_Zone *zone;
int size; int size;
evas_object_geometry_get(obj, &x, &y, &w, &h);
evas_object_geometry_set(b->events, x, y, w, h);
if (b->autohide) if (b->autohide)
{ {
E_FREE_LIST(b->zone_obstacles, e_object_del); E_FREE_LIST(b->zone_obstacles, e_object_del);
return; return;
} }
evas_object_geometry_get(obj, &x, &y, &w, &h);
if (b->orient == E_GADGET_SITE_ORIENT_HORIZONTAL) if (b->orient == E_GADGET_SITE_ORIENT_HORIZONTAL)
size = h; size = h;
else else
@ -586,76 +587,44 @@ _bryce_moveresize(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event
_bryce_autosize(b); _bryce_autosize(b);
} }
static Eina_Bool static void
_bryce_mouse_down_post(void *data, Evas *e EINA_UNUSED) _bryce_mouse_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
{ {
Bryce *b = data; Bryce *b = data;
Evas_Event_Mouse_Down *ev; Evas_Event_Mouse_Down *ev = event_info;
ev = b->event_info; if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
b->event_info = NULL;
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_TRUE;
if (e_bindings_mouse_down_evas_event_handle(E_BINDING_CONTEXT_ANY, b->e_obj_inherit, ev)) if (e_bindings_mouse_down_evas_event_handle(E_BINDING_CONTEXT_ANY, b->e_obj_inherit, ev))
return EINA_FALSE; {
if (ev->button != 3) return EINA_TRUE; ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
return;
}
if (ev->button != 3) return;
b->last_timestamp = ev->timestamp; b->last_timestamp = ev->timestamp;
if (!b->menu_job) _bryce_menu(b);
b->menu_job = ecore_job_add(_bryce_act_menu_job, b); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
return EINA_FALSE;
} }
static void static void
_bryce_mouse_down(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info) _bryce_mouse_up(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
{ {
Bryce *b = data; Bryce *b = data;
Evas_Event_Mouse_Up *ev = event_info;
if (b->event_info == event_info) return; if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
b->event_info = event_info; if (e_bindings_mouse_up_evas_event_handle(E_BINDING_CONTEXT_ANY, b->e_obj_inherit, ev))
evas_post_event_callback_push(e, _bryce_mouse_down_post, b); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
}
static Eina_Bool
_bryce_mouse_up_post(void *data, Evas *e EINA_UNUSED)
{
Bryce *b = data;
Evas_Event_Mouse_Up *ev;
ev = b->event_info;
b->event_info = NULL;
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_TRUE;
return !e_bindings_mouse_up_evas_event_handle(E_BINDING_CONTEXT_ANY, b->e_obj_inherit, ev);
} }
static void static void
_bryce_mouse_up(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info) _bryce_mouse_wheel(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info)
{ {
Bryce *b = data; Bryce *b = data;
Evas_Event_Mouse_Wheel *ev = event_info;
if (b->event_info == event_info) return; if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
b->event_info = event_info; if (e_bindings_wheel_evas_event_handle(E_BINDING_CONTEXT_ANY, b->e_obj_inherit, ev))
evas_post_event_callback_push(e, _bryce_mouse_up_post, b); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD;
}
static Eina_Bool
_bryce_mouse_wheel_post(void *data, Evas *e EINA_UNUSED)
{
Bryce *b = data;
Evas_Event_Mouse_Wheel *ev;
ev = b->event_info;
b->event_info = NULL;
if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return EINA_TRUE;
return !e_bindings_wheel_evas_event_handle(E_BINDING_CONTEXT_ANY, b->e_obj_inherit, ev);
}
static void
_bryce_mouse_wheel(void *data, Evas *e, Evas_Object *obj EINA_UNUSED, void *event_info)
{
Bryce *b = data;
if (b->event_info == event_info) return;
b->event_info = event_info;
evas_post_event_callback_push(e, _bryce_mouse_wheel_post, b);
} }
static void static void
@ -694,8 +663,8 @@ _bryce_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *
e_object_del(obs); e_object_del(obs);
} }
evas_object_del(b->autohide_event); evas_object_del(b->autohide_event);
E_FREE_FUNC(b->events, evas_object_del);
E_FREE_FUNC(b->calc_job, ecore_job_del); E_FREE_FUNC(b->calc_job, ecore_job_del);
E_FREE_FUNC(b->menu_job, ecore_job_del);
E_FREE_FUNC(b->autohide_timer, ecore_timer_del); E_FREE_FUNC(b->autohide_timer, ecore_timer_del);
ecore_timer_del(b->save_timer); ecore_timer_del(b->save_timer);
EINA_LIST_FREE(b->popups, p) EINA_LIST_FREE(b->popups, p)
@ -940,6 +909,10 @@ _bryce_create(Bryce *b, Evas_Object *parent)
Evas_Object *ly, *bryce, *scr; Evas_Object *ly, *bryce, *scr;
b->e_obj_inherit = E_OBJECT_ALLOC(E_Object, E_BRYCE_TYPE, _bryce_object_free); b->e_obj_inherit = E_OBJECT_ALLOC(E_Object, E_BRYCE_TYPE, _bryce_object_free);
b->events = evas_object_rectangle_add(e_comp->evas);
evas_object_color_set(b->events, 0, 0, 0, 0);
evas_object_name_set(b->events, "b->events");
evas_object_show(b->events);
e_object_data_set(b->e_obj_inherit, b); e_object_data_set(b->e_obj_inherit, b);
b->layout = ly = elm_layout_add(parent); b->layout = ly = elm_layout_add(parent);
_bryce_style_apply(b); _bryce_style_apply(b);
@ -950,6 +923,9 @@ _bryce_create(Bryce *b, Evas_Object *parent)
elm_object_part_content_set(ly, "e.swallow.content", scr); elm_object_part_content_set(ly, "e.swallow.content", scr);
evas_object_show(ly); evas_object_show(ly);
b->bryce = bryce = e_comp_object_util_add(ly, _bryce_shadow_type(b)); b->bryce = bryce = e_comp_object_util_add(ly, _bryce_shadow_type(b));
evas_object_repeat_events_set(evas_object_smart_parent_get(ly), 1);
evas_object_smart_member_add(b->events, bryce);
evas_object_lower(b->events);
evas_object_data_set(bryce, "comp_skip", (void*)1); evas_object_data_set(bryce, "comp_skip", (void*)1);
evas_object_layer_set(bryce, b->layer); evas_object_layer_set(bryce, b->layer);
evas_object_lower(bryce); evas_object_lower(bryce);
@ -967,9 +943,9 @@ _bryce_create(Bryce *b, Evas_Object *parent)
evas_object_event_callback_add(bryce, EVAS_CALLBACK_RESTACK, _bryce_restack, b); evas_object_event_callback_add(bryce, EVAS_CALLBACK_RESTACK, _bryce_restack, b);
evas_object_event_callback_add(bryce, EVAS_CALLBACK_MOVE, _bryce_moveresize, b); evas_object_event_callback_add(bryce, EVAS_CALLBACK_MOVE, _bryce_moveresize, b);
evas_object_event_callback_add(bryce, EVAS_CALLBACK_RESIZE, _bryce_moveresize, b); evas_object_event_callback_add(bryce, EVAS_CALLBACK_RESIZE, _bryce_moveresize, b);
evas_object_event_callback_add(bryce, EVAS_CALLBACK_MOUSE_DOWN, _bryce_mouse_down, b); evas_object_event_callback_add(b->events, EVAS_CALLBACK_MOUSE_DOWN, _bryce_mouse_down, b);
evas_object_event_callback_add(bryce, EVAS_CALLBACK_MOUSE_UP, _bryce_mouse_up, b); evas_object_event_callback_add(b->events, EVAS_CALLBACK_MOUSE_UP, _bryce_mouse_up, b);
evas_object_event_callback_add(bryce, EVAS_CALLBACK_MOUSE_WHEEL, _bryce_mouse_wheel, b); evas_object_event_callback_add(b->events, EVAS_CALLBACK_MOUSE_WHEEL, _bryce_mouse_wheel, b);
_bryce_zone_setup(b); _bryce_zone_setup(b);
_bryce_autohide_setup(b); _bryce_autohide_setup(b);
@ -1011,15 +987,13 @@ _bryce_act_resize(E_Object *obj, const char *params, E_Binding_Event_Wheel *ev)
} }
static void static void
_bryce_act_menu_job(void *data) _bryce_menu(Bryce *b)
{ {
Bryce *b = data;
E_Menu *m; E_Menu *m;
int x, y; int x, y;
m = e_menu_new(); m = e_menu_new();
_bryce_menu_populate(b, m); _bryce_menu_populate(b, m);
b->menu_job = NULL;
evas_pointer_canvas_xy_get(e_comp->evas, &x, &y); evas_pointer_canvas_xy_get(e_comp->evas, &x, &y);
e_menu_activate_mouse(m, e_zone_current_get(), x, y, 1, 1, E_MENU_POP_DIRECTION_AUTO, b->last_timestamp); e_menu_activate_mouse(m, e_zone_current_get(), x, y, 1, 1, E_MENU_POP_DIRECTION_AUTO, b->last_timestamp);
_bryce_popup(b, m->comp_object); _bryce_popup(b, m->comp_object);
@ -1032,8 +1006,7 @@ _bryce_act_menu(E_Object *obj, const char *params EINA_UNUSED, E_Binding_Event_M
if (obj->type != E_BRYCE_TYPE) return EINA_FALSE; if (obj->type != E_BRYCE_TYPE) return EINA_FALSE;
b = e_object_data_get(obj); b = e_object_data_get(obj);
b->last_timestamp = ev->timestamp; b->last_timestamp = ev->timestamp;
if (!b->menu_job) _bryce_menu(b);
b->menu_job = ecore_job_add(_bryce_act_menu_job, b);
return EINA_TRUE; return EINA_TRUE;
} }