diff --git a/legacy/edje/src/bin/edje_cc_handlers.c b/legacy/edje/src/bin/edje_cc_handlers.c index a912507f96..77f5373437 100644 --- a/legacy/edje/src/bin/edje_cc_handlers.c +++ b/legacy/edje/src/bin/edje_cc_handlers.c @@ -83,6 +83,7 @@ static void st_collections_group_parts_part_type(void); static void st_collections_group_parts_part_effect(void); static void st_collections_group_parts_part_mouse_events(void); static void st_collections_group_parts_part_repeat_events(void); +static void st_collections_group_parts_part_ignore_flags(void); static void st_collections_group_parts_part_pointer_mode(void); static void st_collections_group_parts_part_precise_is_inside(void); static void st_collections_group_parts_part_use_alternate_font_metrics(void); @@ -222,6 +223,7 @@ New_Statement_Handler statement_handlers[] = {"collections.group.parts.part.effect", st_collections_group_parts_part_effect}, {"collections.group.parts.part.mouse_events", st_collections_group_parts_part_mouse_events}, {"collections.group.parts.part.repeat_events", st_collections_group_parts_part_repeat_events}, + {"collections.group.parts.part.ignore_flags", st_collections_group_parts_part_ignore_flags}, {"collections.group.parts.part.pointer_mode", st_collections_group_parts_part_pointer_mode}, {"collections.group.parts.part.precise_is_inside", st_collections_group_parts_part_precise_is_inside}, {"collections.group.parts.part.use_alternate_font_metrics", st_collections_group_parts_part_use_alternate_font_metrics}, @@ -1382,6 +1384,7 @@ st_collections_group_data_item(void) type: IMAGE; mouse_events: 1; repeat_events: 0; + ignore_flags: NONE; clip_to: "anotherpart"; source: "groupname"; pointer_mode: AUTOGRAB; @@ -1412,6 +1415,7 @@ ob_collections_group_parts_part(void) ep->type = EDJE_PART_TYPE_IMAGE; ep->mouse_events = 1; ep->repeat_events = 0; + ep->ignore_flags = EVAS_EVENT_FLAG_NONE; ep->pointer_mode = EVAS_OBJECT_POINTER_MODE_AUTOGRAB; ep->precise_is_inside = 0; ep->use_alternate_font_metrics = 0; @@ -1551,6 +1555,37 @@ st_collections_group_parts_part_repeat_events(void) ep->repeat_events = parse_bool(0); } +/** + @page edcref + @property + ignore_flags + @parameters + [FLAG] ... + @effect + Specifies whether events with the given flags should be ignored, + i.e., will not have the signals emitted to the parts. Multiple flags + must be separated by spaces, the effect will be ignoring all events + with one of the flags specified. Possible flags: + @li NONE (default value, no event will be ignored) + @li ON_HOLD + @endproperty +*/ +static void +st_collections_group_parts_part_ignore_flags(void) +{ + Edje_Part_Collection *pc; + Edje_Part *ep; + + check_min_arg_count(1); + + pc = evas_list_data(evas_list_last(edje_collections)); + ep = evas_list_data(evas_list_last(pc->parts)); + ep->ignore_flags = parse_flags(0, + "NONE", EVAS_EVENT_FLAG_NONE, + "ON_HOLD", EVAS_EVENT_FLAG_ON_HOLD, + NULL); +} + /** @page edcref @property diff --git a/legacy/edje/src/lib/Edje_Edit.h b/legacy/edje/src/lib/Edje_Edit.h index 92e5c0248e..ffdbb0c1e5 100644 --- a/legacy/edje/src/lib/Edje_Edit.h +++ b/legacy/edje/src/lib/Edje_Edit.h @@ -383,6 +383,22 @@ edje_edit_part_repeat_events_set( * If set to 0 the events received will not propagate to other parts.*/ ); +/**Get ignore_flags for part.*/ +EAPI Evas_Event_Flags ///@return event flags ignored +edje_edit_part_ignore_flags_get( + Evas_Object *obj, ///< The edje object + const char *part ///< The name of the part +); + +/**Set repeat_events for part. */ +EAPI void +edje_edit_part_ignore_flags_set( + Evas_Object *obj, ///< The edje object + const char *part, ///< The name of the part + Evas_Event_Flags ignore_flags ///< event flags to be ignored +); + + //@} /******************************************************************************/ /************************** STATES API ************************************/ diff --git a/legacy/edje/src/lib/edje_callbacks.c b/legacy/edje/src/lib/edje_callbacks.c index 07d1f3857c..0cb45bf691 100644 --- a/legacy/edje/src/lib/edje_callbacks.c +++ b/legacy/edje/src/lib/edje_callbacks.c @@ -34,7 +34,7 @@ _edje_mouse_in_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) ev = event_info; ed = data; rp = evas_object_data_get(obj, "real_part"); - if (!rp) return; + if (!rp || !(rp->part->ignore_flags & ev->event_flags)) return; _edje_emit(ed, "mouse,in", rp->part->name); return; e = NULL; @@ -50,7 +50,7 @@ _edje_mouse_out_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) ev = event_info; ed = data; rp = evas_object_data_get(obj, "real_part"); - if (!rp) return; + if (!rp || !(rp->part->ignore_flags & ev->event_flags)) return; _edje_emit(ed, "mouse,out", rp->part->name); return; e = NULL; @@ -63,20 +63,28 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) Edje *ed; Edje_Real_Part *rp; char buf[256]; + int ignored; ev = event_info; ed = data; rp = evas_object_data_get(obj, "real_part"); if (!rp) return; - if (ev->flags & EVAS_BUTTON_TRIPLE_CLICK) - snprintf(buf, sizeof(buf), "mouse,down,%i,triple", ev->button); - else if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK) - snprintf(buf, sizeof(buf), "mouse,down,%i,double", ev->button); - else - snprintf(buf, sizeof(buf), "mouse,down,%i", ev->button); + + ignored = rp->part->ignore_flags & ev->event_flags; + _edje_ref(ed); _edje_freeze(ed); - _edje_emit(ed, buf, rp->part->name); + + if (!ignored) + { + if (ev->flags & EVAS_BUTTON_TRIPLE_CLICK) + snprintf(buf, sizeof(buf), "mouse,down,%i,triple", ev->button); + else if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK) + snprintf(buf, sizeof(buf), "mouse,down,%i,double", ev->button); + else + snprintf(buf, sizeof(buf), "mouse,down,%i", ev->button); + _edje_emit(ed, buf, rp->part->name); + } if (rp->events_to) { @@ -101,8 +109,11 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) events->y = ev->canvas.y - y - events->h / 2; } - snprintf(buf, sizeof(buf), "mouse,down,%i", ev->button); - _edje_emit(ed, buf, events->part->name); + if (!ignored) + { + snprintf(buf, sizeof(buf), "mouse,down,%i", ev->button); + _edje_emit(ed, buf, events->part->name); + } ed->dirty = 1; } _edje_recalc(ed); @@ -123,7 +134,8 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) { rp->drag.val.x = dx; rp->drag.val.y = dy; - _edje_emit(ed, "drag", rp->part->name); + if (!ignored) + _edje_emit(ed, "drag", rp->part->name); ed->dirty = 1; rp->drag.need_reset = 1; _edje_recalc(ed); @@ -139,7 +151,8 @@ _edje_mouse_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) rp->drag.down.x = ev->canvas.x; if (rp->part->dragable.y) rp->drag.down.y = ev->canvas.y; - _edje_emit(ed, "drag,start", rp->part->name); + if (!ignored) + _edje_emit(ed, "drag,start", rp->part->name); } rp->drag.down.count++; } @@ -162,22 +175,32 @@ _edje_mouse_up_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) Edje *ed; Edje_Real_Part *rp; char buf[256]; + int ignored; ev = event_info; ed = data; rp = evas_object_data_get(obj, "real_part"); if (!rp) return; - snprintf(buf, sizeof(buf), "mouse,up,%i", ev->button); + ignored = rp->part->ignore_flags & ev->event_flags; + _edje_ref(ed); _edje_freeze(ed); - _edje_emit(ed, buf, rp->part->name); + + if (!ignored) + { + snprintf(buf, sizeof(buf), "mouse,up,%i", ev->button); + _edje_emit(ed, buf, rp->part->name); + } if (rp->events_to) { rp = rp->events_to; - snprintf(buf, sizeof(buf), "mouse,up,%i", ev->button); - _edje_emit(ed, buf, rp->part->name); + if (!ignored) + { + snprintf(buf, sizeof(buf), "mouse,up,%i", ev->button); + _edje_emit(ed, buf, rp->part->name); + } } if ((rp->part->dragable.x) || (rp->part->dragable.y)) @@ -189,11 +212,12 @@ _edje_mouse_up_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) { rp->drag.need_reset = 1; ed->dirty = 1; - _edje_emit(ed, "drag,stop", rp->part->name); + if (!ignored) + _edje_emit(ed, "drag,stop", rp->part->name); } } } - if ((rp->still_in) && (rp->clicked_button == ev->button)) + if ((rp->still_in) && (rp->clicked_button == ev->button) && (!ignored)) { snprintf(buf, sizeof(buf), "mouse,clicked,%i", ev->button); _edje_emit(ed, buf, rp->part->name); @@ -214,6 +238,7 @@ _edje_mouse_move_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) Evas_Event_Mouse_Move *ev; Edje *ed; Edje_Real_Part *rp; + int ignored; ev = event_info; ed = data; @@ -221,8 +246,11 @@ _edje_mouse_move_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) if (!rp) return; if (rp->events_to) rp = rp->events_to; + ignored = rp->part->ignore_flags & ev->event_flags; + _edje_ref(ed); - _edje_emit(ed, "mouse,move", rp->part->name); + if (!ignored) + _edje_emit(ed, "mouse,move", rp->part->name); if (rp->still_in) { @@ -267,7 +295,8 @@ _edje_mouse_move_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) { rp->drag.val.x = dx; rp->drag.val.y = dy; - _edje_emit(ed, "drag", rp->part->name); + if (!ignored) + _edje_emit(ed, "drag", rp->part->name); ed->dirty = 1; _edje_recalc(ed); } @@ -290,7 +319,8 @@ _edje_mouse_wheel_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) ev = event_info; ed = data; rp = evas_object_data_get(obj, "real_part"); - if (!rp) return; + if (!rp || !(rp->part->ignore_flags & ev->event_flags)) return; + snprintf(buf, sizeof(buf), "mouse,wheel,%i,%i", ev->direction, (ev->z < 0) ? (-1) : (1)); _edje_emit(ed, buf, rp->part->name); return; diff --git a/legacy/edje/src/lib/edje_data.c b/legacy/edje/src/lib/edje_data.c index a62790d88d..323960cdbb 100644 --- a/legacy/edje/src/lib/edje_data.c +++ b/legacy/edje/src/lib/edje_data.c @@ -358,6 +358,7 @@ _edje_edd_setup(void) EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "effect", effect, EET_T_CHAR); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "mouse_events", mouse_events, EET_T_CHAR); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "repeat_events", repeat_events, EET_T_CHAR); + EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "ignore_flags", ignore_flags, EET_T_INT); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "pointer_mode", pointer_mode, EET_T_CHAR); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "precise_is_inside", precise_is_inside, EET_T_CHAR); EET_DATA_DESCRIPTOR_ADD_BASIC(_edje_edd_edje_part, Edje_Part, "clip_to_id", clip_to_id, EET_T_INT); diff --git a/legacy/edje/src/lib/edje_edit.c b/legacy/edje/src/lib/edje_edit.c index 0497f566cc..9fa3566a21 100644 --- a/legacy/edje/src/lib/edje_edit.c +++ b/legacy/edje/src/lib/edje_edit.c @@ -921,6 +921,7 @@ edje_edit_part_add(Evas_Object *obj, const char* name, unsigned char type) ep->name = evas_stringshare_add(name); ep->mouse_events = 1; ep->repeat_events = 0; + ep->ignore_flags = EVAS_EVENT_FLAG_NONE; ep->pointer_mode = EVAS_OBJECT_POINTER_MODE_AUTOGRAB; ep->precise_is_inside = 0; ep->use_alternate_font_metrics = 0; @@ -1299,6 +1300,23 @@ edje_edit_part_repeat_events_set(Evas_Object *obj, const char *part, unsigned ch evas_object_repeat_events_set(rp->object, 0); } +EAPI Evas_Event_Flags +edje_edit_part_ignore_flags_get(Evas_Object *obj, const char *part) +{ + GET_RP_OR_RETURN(0); + return rp->part->ignore_flags; +} + +EAPI void +edje_edit_part_ignore_flags_set(Evas_Object *obj, const char *part, Evas_Event_Flags ignore_flags) +{ + GET_RP_OR_RETURN(); + if (!rp->object) return; + printf("Set ignore_flags for part: %s [%#x]\n", part, ignore_flags); + + rp->part->ignore_flags = ignore_flags; +} + EAPI const char * edje_edit_part_source_get(Evas_Object *obj, const char *part) { diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index e8079b48de..7178b51235 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -486,6 +486,7 @@ struct _Edje_Part unsigned char effect; /* 0 = plain... */ unsigned char mouse_events; /* it will affect/respond to mouse events */ unsigned char repeat_events; /* it will repeat events to objects below */ + Evas_Event_Flags ignore_flags; unsigned char precise_is_inside; unsigned char use_alternate_font_metrics; char pointer_mode;