#define ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
#define ELM_INTERFACE_ATSPI_COMPONENT_PROTECTED
+#define ELM_INTERFACE_ATSPI_WIDGET_ACTION_PROTECTED
#define ELM_WIDGET_ITEM_PROTECTED
#include <Elementary.h>
const char SIG_WIDGET_LANG_CHANGED[] = "language,changed";
const char SIG_WIDGET_ACCESS_CHANGED[] = "access,changed";
+// TIZEN_ONLY(20161018): add highlighted/unhighlighted signal for atspi
+const char SIG_WIDGET_ATSPI_HIGHLIGHTED[] = "atspi,highlighted";
+const char SIG_WIDGET_ATSPI_UNHIGHLIGHTED[] = "atspi,unhighlighted";
+//
+
typedef struct _Elm_Event_Cb_Data Elm_Event_Cb_Data;
typedef struct _Elm_Label_Data Elm_Label_Data;
typedef struct _Elm_Translate_String_Data Elm_Translate_String_Data;
Eina_Bool preset : 1;
};
+/* TIZEN_ONLY(20160622): Override Paragraph Direction APIs */
+static void
+_elm_widget_evas_object_paragraph_direction_set_internal(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *sd, Evas_BiDi_Direction dir);
+/* END */
+
/* local subsystem globals */
static unsigned int focus_order = 0;
}
static inline Eina_Bool
+_is_focused(Evas_Object *obj)
+{
+ API_ENTRY return EINA_FALSE;
+ return sd->focused;
+}
+
+static inline Eina_Bool
_elm_scrollable_is(const Evas_Object *obj)
{
INTERNAL_ENTRY EINA_FALSE;
eo_isa(obj, ELM_INTERFACE_SCROLLABLE_MIXIN);
}
+static void
+elm_widget_disabled_internal(Eo *obj, Eina_Bool disabled);
static Eina_Bool
_on_sub_obj_del(void *data,
Eo *obj,
const Eo_Event_Description *desc EINA_UNUSED,
void *event_info EINA_UNUSED)
{
- ELM_WIDGET_DATA_GET(data, sd);
+ ELM_WIDGET_DATA_GET_OR_RETURN(data, sd, EINA_FALSE);
if (_elm_widget_is(obj))
{
- if (elm_widget_focus_get(obj)) _parents_unfocus(sd->obj);
+ if (_is_focused((Eo *)obj)) _parents_unfocus(sd->obj);
}
if (obj == sd->resize_obj)
{
{SIG_WIDGET_UNFOCUSED, ""},
{SIG_WIDGET_LANG_CHANGED, ""},
{SIG_WIDGET_ACCESS_CHANGED, ""},
+ // TIZEN_ONLY(20161018): add highlighted/unhighlighted signal for atspi
+ {SIG_WIDGET_ATSPI_HIGHLIGHTED, ""},
+ {SIG_WIDGET_ATSPI_UNHIGHLIGHTED, ""},
+ //
{NULL, NULL}
};
Evas_Object *obj EINA_UNUSED,
void *event_info)
{
+ Evas_Object *top;
+
ELM_WIDGET_DATA_GET(data, sd);
Evas_Event_Mouse_Down *ev = event_info;
- if (!(ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD))
- sd->still_in = EINA_TRUE;
+ if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
+
+ top = elm_widget_top_get(data);
+ if (top && eo_isa(top, ELM_WIN_CLASS)) _elm_win_focus_auto_hide(top);
+ sd->still_in = EINA_TRUE;
}
static void
ELM_WIDGET_DATA_GET(newest, sd2);
if (!sd2) return;
- if (!elm_widget_focus_get(newest))
+ if (!_is_focused(newest))
elm_widget_focus_steal(newest, NULL);
else
{
- if (sd2->resize_obj && elm_widget_focus_get(sd2->resize_obj))
+ if (sd2->resize_obj && _is_focused(sd2->resize_obj))
elm_widget_focused_object_clear(sd2->resize_obj);
else
{
Evas_Object *child;
EINA_LIST_FOREACH(sd2->subobjs, l, child)
{
- if (elm_widget_focus_get(child))
+ if (_is_focused(child))
{
elm_widget_focused_object_clear(child);
break;
_if_focused_revert(obj, EINA_TRUE);
elm_widget_focus_custom_chain_unset(obj);
eina_stringshare_del(sd->access_info);
+ eina_stringshare_del(sd->accessible_name);
evas_object_smart_data_set(obj, NULL);
}
Eina_Iterator *it;
Evas_Object *o;
- if (_elm_config->atspi_mode)
+ if (_elm_atspi_enabled())
{
Eo *parent;
eo_do(obj, parent = elm_interface_atspi_accessible_parent_get());
}
eina_iterator_free(it);
- if (_elm_config->atspi_mode)
+ if (_elm_atspi_enabled())
{
elm_interface_atspi_accessible_added(obj);
if (_elm_widget_onscreen_is(obj))
}
eina_iterator_free(it);
- if (_elm_config->atspi_mode)
- elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_SHOWING, EINA_FALSE);
+ if (_elm_atspi_enabled())
+ {
+ //TIZEN_ONLY(20161223) check if the parent of highlighted object is hide
+ Eo *highlighted_obj;
+ highlighted_obj = _elm_object_accessibility_currently_highlighted_get();
+ if (highlighted_obj && highlighted_obj != obj)
+ {
+ Eo *parent;
+ eo_do(highlighted_obj, parent = elm_interface_atspi_accessible_parent_get());
+ while (parent)
+ {
+ if (parent == obj)
+ {
+ elm_interface_atspi_accessible_state_changed_signal_emit(highlighted_obj, ELM_ATSPI_STATE_SHOWING, EINA_FALSE);
+ eo_do(highlighted_obj, elm_interface_atspi_component_highlight_clear());
+ break;
+ }
+ eo_do(parent, parent = elm_interface_atspi_accessible_parent_get());
+ }
+ }
+ //
+
+ elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_SHOWING, EINA_FALSE);
+ }
}
EOLIAN static void
Evas_Coord sx, sy;
eo_do(o, elm_interface_scrollable_content_region_get(&sx, &sy, NULL, NULL));
- // Get the object's on_focus_region position relative to the scroller.
+ // Get the object's on_focus_region position relative to the scroller.
Evas_Coord rx, ry;
rx = ox + x - px + sx;
ry = oy + y - py + sy;
break;
}
- if (!elm_widget_focus_region_get(o, &x, &y, &w, &h))
- {
- o = elm_widget_parent_get(o);
- continue;
- }
+ elm_widget_focus_region_get(o, &x, &y, &w, &h);
+ evas_object_geometry_get(o, &ox, &oy, NULL, NULL);
}
else
{
focus_order++;
sd->focus_order = focus_order;
+ sd->focused = EINA_TRUE;
if (sd->top_win_focused)
- {
- sd->focused = EINA_TRUE;
- eo_do(obj, elm_obj_widget_on_focus(item));
- }
+ eo_do(obj, elm_obj_widget_on_focus(item));
sd->focus_order_on_calc = EINA_FALSE;
if (_elm_config->access_mode == ELM_ACCESS_MODE_ON)
return ret;
}
+//TIZEN_ONLY(20160822): When atspi mode is dynamically switched on/off,
+//register/unregister access objects accordingly.
+// TIZEN_ONLY(20170516): connect to at-spi dbus based on org.a11y.Status.IsEnabled property
+EAPI Eina_Bool
+elm_widget_screen_reader(Evas_Object *obj,
+ Eina_Bool is_screen_reader)
+{
+ const Eina_List *l;
+ Evas_Object *child;
+ Eina_Bool ret = EINA_TRUE;
+
+ API_ENTRY return EINA_FALSE;
+ EINA_LIST_FOREACH(sd->subobjs, l, child)
+ {
+ if (elm_widget_is(child))
+ ret &= elm_widget_screen_reader(child, is_screen_reader);
+ }
+ eo_do(obj, elm_obj_widget_screen_reader(is_screen_reader));
+
+ return ret;
+}
+
EOLIAN static void
-_elm_widget_access(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd EINA_UNUSED, Eina_Bool is_access EINA_UNUSED)
+_elm_widget_screen_reader(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd EINA_UNUSED, Eina_Bool is_screen_reader EINA_UNUSED)
{
}
+//TIZEN_ONLY(20170621) handle atspi proxy connection at runtime
EAPI Eina_Bool
+elm_widget_atspi(Evas_Object *obj, Eina_Bool is_atspi)
+{
+ Eina_List *l, *children;
+ Evas_Object *child;
+ Eina_Bool ret = EINA_TRUE;
+
+ API_ENTRY return EINA_FALSE;
+ eo_do(obj, children = elm_interface_atspi_accessible_children_get());
+ EINA_LIST_FOREACH(children, l, child)
+ {
+ ret &= elm_widget_atspi(child, is_atspi);
+ }
+ eo_do(obj, elm_obj_widget_atspi(is_atspi));
+
+ return ret;
+}
+
+EOLIAN static void
+_elm_widget_atspi(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd EINA_UNUSED, Eina_Bool is_atspi EINA_UNUSED)
+{
+}
+//
+//
+//
+
+EOLIAN static void
+_elm_widget_access(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd EINA_UNUSED, Eina_Bool is_access EINA_UNUSED)
+{
+}
+
+EAPI Elm_Theme_Apply
elm_widget_theme(Evas_Object *obj)
{
const Eina_List *l;
Evas_Object *child;
Elm_Tooltip *tt;
Elm_Cursor *cur;
- Eina_Bool ret = EINA_TRUE;
+ Elm_Theme_Apply ret = ELM_THEME_APPLY_SUCCESS;
- API_ENTRY return EINA_FALSE;
+ API_ENTRY return ELM_THEME_APPLY_FAILED;
EINA_LIST_FOREACH(sd->subobjs, l, child)
if (_elm_widget_is(child))
EINA_LIST_FOREACH(sd->cursors, l, cur)
elm_cursor_theme(cur);
- Eina_Bool ret2 = EINA_FALSE;
+ Elm_Theme_Apply ret2 = ELM_THEME_APPLY_FAILED;
eo_do(obj, ret2 = elm_obj_widget_theme_apply());
ret &= ret2;
eo_do(obj, elm_obj_widget_theme_apply());
}
-EOLIAN static Eina_Bool
+EOLIAN static Elm_Theme_Apply
_elm_widget_theme_apply(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED)
{
_elm_widget_mirrored_reload(obj);
+ if (elm_widget_disabled_get(obj))
+ elm_widget_disabled_internal(obj, elm_widget_disabled_get(obj));
- elm_widget_disabled_set(obj, elm_widget_disabled_get(obj));
-
- return EINA_TRUE;
+ return ELM_THEME_APPLY_SUCCESS;
}
/**
elm_widget_theme(sobj);
}
- if (elm_widget_focus_get(sobj)) _parents_focus(obj);
+ if (_is_focused(sobj)) _parents_focus(obj);
elm_widget_display_mode_set(sobj,
evas_object_size_hint_display_mode_get(obj));
- if (_elm_config->atspi_mode && !sdc->on_create)
+ if (_elm_atspi_enabled() && !sdc->on_create)
{
Elm_Interface_Atspi_Accessible *aparent;
eo_do(sobj, aparent = elm_interface_atspi_accessible_parent_get());
if (obj == aparent)
elm_interface_atspi_accessible_children_changed_added_signal_emit(obj, sobj);
}
+
+ /* TIZEN_ONLY(20160622): Override Paragraph Direction APIs */
+ if (sdc->inherit_paragraph_direction &&
+ (sdc->paragraph_direction != evas_object_paragraph_direction_get(obj)))
+ {
+ sdc->paragraph_direction = evas_object_paragraph_direction_get(obj);
+ _elm_widget_evas_object_paragraph_direction_set_internal(sobj, sdc, sdc->paragraph_direction);
+ eo_do_super(sobj, MY_CLASS, evas_obj_paragraph_direction_set(sdc->paragraph_direction));
+ }
+ /* END */
}
end:
if (_elm_widget_is(sobj))
{
- if (elm_widget_focus_get(sobj))
+ if (_is_focused(sobj))
{
elm_widget_tree_unfocusable_set(sobj, EINA_TRUE);
elm_widget_tree_unfocusable_set(sobj, EINA_FALSE);
parent = sdp->parent_obj;
}
}
- if (_elm_config->atspi_mode && !sd->on_destroy)
+ if (_elm_atspi_enabled() && !sd->on_destroy)
{
Elm_Interface_Atspi_Accessible *aparent;
eo_do(sobj, aparent = elm_interface_atspi_accessible_parent_get());
ELM_WIDGET_DATA_GET(sobj, sdc);
sdc->parent_obj = NULL;
+
+ /* TIZEN_ONLY(20160622): Override Paragraph Direction APIs */
+ if (sdc->inherit_paragraph_direction &&
+ (sdc->paragraph_direction != EVAS_BIDI_DIRECTION_NEUTRAL))
+ {
+ sdc->paragraph_direction = EVAS_BIDI_DIRECTION_NEUTRAL;
+ _elm_widget_evas_object_paragraph_direction_set_internal(sobj, sdc, sdc->paragraph_direction);
+ eo_do_super(sobj, MY_CLASS, evas_obj_paragraph_direction_set(EVAS_BIDI_DIRECTION_NEUTRAL));
+ }
+ /* END */
}
if (sd->resize_obj == sobj) sd->resize_obj = NULL;
sd->subobjs = eina_list_remove(sd->subobjs, sobj);
- if (_elm_config->atspi_mode)
- elm_interface_atspi_accessible_children_changed_del_signal_emit(obj, sobj);
_callbacks_del(sobj, obj);
return EINA_TRUE;
if (_elm_widget_is(sd->resize_obj))
{
- if (elm_widget_focus_get(sd->resize_obj)) _parents_unfocus(obj);
+ if (_is_focused(sd->resize_obj)) _parents_unfocus(obj);
}
elm_widget_sub_object_del(obj, sd->resize_obj);
}
EOLIAN static Eina_Bool
_elm_widget_focus_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *sd)
{
- return sd->focused;
+ return (sd->focused && sd->top_win_focused);
}
EOLIAN static Eina_Bool
const Evas_Object *subobj;
const Eina_List *l;
- if (!sd->focused) return NULL;
+ if (!sd->focused || !sd->top_win_focused) return NULL;
EINA_LIST_FOREACH(sd->subobjs, l, subobj)
{
Evas_Object *fobj;
double weight = 0.0;
if (!_elm_widget_is(obj)) return EINA_FALSE;
- if (!elm_widget_focus_get(obj)) return EINA_FALSE;
+ if (!_is_focused(obj)) return EINA_FALSE;
current_focused = elm_widget_focused_object_get(obj);
return int_ret;
}
- if (!elm_widget_can_focus_get(obj) || elm_widget_focus_get(obj))
+ if (!elm_widget_can_focus_get(obj) || _is_focused((Eo *)obj))
return EINA_FALSE;
c_weight = _elm_widget_focus_direction_weight_get(base, obj, degree);
{
Eina_Bool int_ret = EINA_FALSE;
eo_do((Eo *)obj, int_ret = elm_obj_widget_focus_next(dir, next, next_item));
- if (!int_ret && elm_widget_focus_get(obj))
+ if (!int_ret && _is_focused((Eo *)obj))
{
Evas_Object *o = NULL;
if (dir == ELM_FOCUS_PREVIOUS)
else if (!elm_widget_can_focus_get(obj))
return EINA_FALSE;
- if (elm_widget_focus_get(obj))
+ if (_is_focused((Eo *)obj))
{
if (dir == ELM_FOCUS_PREVIOUS)
*next_item = sd->item_focus_previous;
|| (dir == ELM_FOCUS_RIGHT)
|| (dir == ELM_FOCUS_LEFT))
{
- if (tmp && elm_widget_focus_get(cur))
+ if (tmp && _is_focused(cur))
{
*next = tmp;
*next_item = tmp_item;
{
if (!sd->focused) return;
if (sd->resize_obj && elm_widget_is(sd->resize_obj) &&
- elm_widget_focus_get(sd->resize_obj))
+ _is_focused(sd->resize_obj))
{
eo_do(sd->resize_obj, elm_obj_widget_focused_object_clear());
}
Evas_Object *child;
EINA_LIST_FOREACH(sd->subobjs, l, child)
{
- if (_elm_widget_is(child) && elm_widget_focus_get(child))
+ if (_elm_widget_is(child) && _is_focused(child))
{
eo_do(child, elm_obj_widget_focused_object_clear());
break;
}
}
sd->focused = EINA_FALSE;
- eo_do(obj, elm_obj_widget_on_focus(NULL));
+ if (sd->top_win_focused)
+ eo_do(obj, elm_obj_widget_on_focus(NULL));
}
EOLIAN static void
if (sd)
{
if (sd->resize_obj && elm_widget_is(sd->resize_obj) &&
- elm_widget_focus_get(sd->resize_obj))
+ _is_focused(sd->resize_obj))
{
eo_do(sd->resize_obj, elm_obj_widget_focused_object_clear());
}
Evas_Object *child;
EINA_LIST_FOREACH(sd->subobjs, l, child)
{
- if (_elm_widget_is(child) && elm_widget_focus_get(child))
+ if (_elm_widget_is(child) && _is_focused(child))
{
eo_do(child, elm_obj_widget_focused_object_clear());
break;
}
}
}
+ /* TIZEN_ONLY(20161212): Some winsets should know whether it's focus target or not in _on_focus */
+ sd = eo_data_scope_get(obj, MY_CLASS);
+ sd->is_focus_target = EINA_TRUE;
+ //
_parent_focus(obj, item);
+ /* TIZEN_ONLY(20161212): Some winsets should know whether it's focus target or not in _on_focus */
+ sd->is_focus_target = EINA_FALSE;
+ //
elm_widget_focus_region_show(obj);
return;
}
+static void
+_parents_on_focus(Evas_Object *obj)
+{
+ API_ENTRY return;
+ if (!sd->focused || !sd->top_win_focused) return;
+
+ Evas_Object *o = elm_widget_parent_get(obj);
+ if (o) _parents_on_focus(o);
+ eo_do(obj, elm_obj_widget_on_focus(NULL));
+}
+
EOLIAN static void
_elm_widget_focus_restore(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED)
{
newest = elm_widget_newest_focus_order_get(obj, &newest_focus_order, EINA_TRUE);
if (newest)
- {
- elm_object_focus_set(newest, EINA_FALSE);
- elm_object_focus_set(newest, EINA_TRUE);
- }
+ _parents_on_focus(newest);
}
void
_elm_widget_top_win_focused_set(child, top_win_focused);
}
sd->top_win_focused = top_win_focused;
+
+ if (sd->focused && !sd->top_win_focused)
+ eo_do(obj, elm_obj_widget_on_focus(NULL));
}
Eina_Bool
}
}
-EOLIAN static void
-_elm_widget_disabled_set(Eo *obj, Elm_Widget_Smart_Data *sd, Eina_Bool disabled)
+static void
+elm_widget_disabled_internal(Eo *obj, Eina_Bool disabled)
{
Eina_Bool parent_state = EINA_FALSE;
- if (sd->disabled == disabled) return;
- sd->disabled = !!disabled;
if (disabled)
{
}
}
+EOLIAN static void
+_elm_widget_disabled_set(Eo *obj, Elm_Widget_Smart_Data *sd, Eina_Bool disabled)
+{
+ if (sd->disabled == disabled) return;
+ sd->disabled = !!disabled;
+
+ elm_widget_disabled_internal(obj, disabled);
+}
+
EOLIAN static Eina_Bool
_elm_widget_disabled_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *sd)
{
Evas_Coord px, py, cx, cy, nx = 0, ny = 0;
+ /* TIZEN_ONLY(20161222): Update show region geometry when entry is resized
+ Move this code to the blow to update show region geometry properly.
evas_smart_objects_calculate(evas_object_evas_get(obj));
+ */
if (!forceshow && (x == sd->rx) && (y == sd->ry) &&
(w == sd->rw) && (h == sd->rh)) return;
sd->ry = y;
sd->rw = w;
sd->rh = h;
+
+ /* TIZEN_ONLY(20161222): Update show region geometry when entry is resized */
+ /* Block nested call for evas_smart_objects_calculate() and region showing works */
+ if (sd->on_show_region_set) return;
+
+ sd->on_show_region_set = EINA_TRUE;
+
+ evas_smart_objects_calculate(evas_object_evas_get(obj));
+
+ sd->on_show_region_set = EINA_FALSE;
+
+ /* show_region geometry could be changed during processing elm_widget_show_region_set().
+ evas_smart_objects_calculate() can trigger nested show_region_set calls */
+ x = sd->rx;
+ y = sd->ry;
+ w = sd->rw;
+ h = sd->rh;
+ /* END */
+
if (sd->on_show_region)
{
sd->on_show_region
return sd->scroll_freeze;
}
+// TIZEN_ONLY(20150705): Genlist item align feature
+EAPI void
+elm_widget_scroll_item_align_enabled_set(Evas_Object *obj,
+ Eina_Bool scroll_item_align_enable)
+{
+ API_ENTRY return;
+ if (sd->scroll_item_align_enable == scroll_item_align_enable) return;
+ sd->scroll_item_align_enable = scroll_item_align_enable;
+}
+
+EAPI Eina_Bool
+elm_widget_scroll_item_align_enabled_get(const Evas_Object *obj)
+{
+ API_ENTRY return EINA_FALSE;
+ return sd->scroll_item_align_enable;
+}
+
+EAPI void
+elm_widget_scroll_item_valign_set(Evas_Object *obj,
+ const char *scroll_item_valign)
+{
+ API_ENTRY return;
+ if (sd->scroll_item_valign) eina_stringshare_del(sd->scroll_item_valign);
+ if (!scroll_item_valign) sd->scroll_item_valign = NULL;
+ else sd->scroll_item_valign = eina_stringshare_add(scroll_item_valign);
+}
+
+EAPI const char*
+elm_widget_scroll_item_valign_get(const Evas_Object *obj)
+{
+ API_ENTRY return NULL;
+ return sd->scroll_item_valign;
+}
+//
+
EOLIAN static void
_elm_widget_scale_set(Eo *obj, Elm_Widget_Smart_Data *sd, double scale)
{
_elm_widget_focus_move_policy_reload(obj);
}
+//TIZEN_ONLY(20160726): add API elm_object_part_access_object_get
+EOLIAN static Evas_Object*
+_elm_widget_part_access_object_get(const Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED, const char *part EINA_UNUSED)
+{
+ WRN("The %s widget does not implement the \"part_access_object_get\" functions.",
+ eo_class_name_get(eo_class_get(obj)));
+ return NULL;
+}
+//
+
EAPI void
elm_widget_content_part_set(Evas_Object *obj,
const char *part,
return sd->theme;
}
-EOLIAN static Eina_Bool
+EOLIAN static Elm_Theme_Apply
_elm_widget_style_set(Eo *obj, Elm_Widget_Smart_Data *sd, const char *style)
{
if (eina_stringshare_replace(&sd->style, style))
return elm_widget_theme(obj);
- return EINA_TRUE;
+ return ELM_THEME_APPLY_SUCCESS;
+}
+
+/* TIZEN_ONLY(20161223): add widget style set furnction for internal usage
+ this function is same with elm_widget_style_set
+ but it doesn't apply sub object's theme */
+Elm_Theme_Apply
+_elm_widget_style_set_internal(Evas_Object *obj, const char *style)
+{
+ Elm_Theme_Apply ret = ELM_THEME_APPLY_SUCCESS;
+
+ API_ENTRY return ELM_THEME_APPLY_FAILED;
+
+ if (eina_stringshare_replace(&sd->style, style))
+ {
+ const Eina_List *l;
+ Elm_Tooltip *tt;
+ Elm_Cursor *cur;
+
+ if (sd->hover_obj) ret &= elm_widget_theme(sd->hover_obj);
+
+ EINA_LIST_FOREACH(sd->tooltips, l, tt)
+ elm_tooltip_theme(tt);
+ EINA_LIST_FOREACH(sd->cursors, l, cur)
+ elm_cursor_theme(cur);
+
+ Elm_Theme_Apply ret2 = ELM_THEME_APPLY_FAILED;
+ eo_do(obj, ret2 = elm_obj_widget_theme_apply());
+ ret &= ret2;
+ }
+
+ return ret;
}
+/* END */
EOLIAN static const char*
_elm_widget_style_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *sd)
return EINA_FALSE;
}
-EOLIAN static Eina_Bool
+EOLIAN static Elm_Theme_Apply
_elm_widget_theme_object_set(Eo *obj, Elm_Widget_Smart_Data *sd, Evas_Object *edj, const char *wname, const char *welement, const char *wstyle)
{
- if (!_elm_theme_object_set(obj, edj, wname, welement, wstyle))
+ Elm_Theme_Apply ret = _elm_theme_object_set(obj, edj, wname, welement, wstyle);
+ if (!ret)
{
- return EINA_FALSE;
+ return ELM_THEME_APPLY_FAILED;
}
if (sd->orient_mode != -1)
eo_do(obj, elm_obj_widget_signal_emit(buf, "elm"));
}
- return EINA_TRUE;
+ return ret;
}
EOLIAN static void
EOLIAN static void
_elm_widget_focus_mouse_up_handle(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED)
{
- Evas_Object *top;
-
if (!obj) return;
if (!_is_focusable(obj)) return;
- top = elm_widget_top_get(obj);
- if (top && eo_isa(top, ELM_WIN_CLASS)) _elm_win_focus_auto_hide(top);
+
elm_widget_focus_steal(obj, NULL);
}
item->widget = widget;
item->eo_obj = eo_item;
-///TIZEN_ONLY(20170717) : expose highlight information on atspi
+ //TIZEN_ONLY(20170717) : expose highlight information on atspi
item->can_highlight = EINA_TRUE;
-///
+ //
eo_do(eo_item, eo_event_callback_add(EO_BASE_EVENT_DEL, _eo_del_cb, NULL));
evas_object_del(item->view);
eina_stringshare_del(item->access_info);
+ eina_stringshare_del(item->accessible_name);
while (item->signals)
_elm_widget_item_signal_callback_list_get(item, item->signals);
eo_do(eo_item,
elm_interface_atspi_accessible_description_set(NULL),
elm_interface_atspi_accessible_name_set(NULL),
+ //TIZEN_ONLY(20190922): add name callback, description callback.
+ elm_interface_atspi_accessible_description_cb_set(NULL, NULL),
+ elm_interface_atspi_accessible_name_cb_set(NULL, NULL),
+ //
+
+ //TIZEN_ONLY(20170405) Add gesture method to accessible interface
+ elm_interface_atspi_accessible_gesture_cb_set(NULL, NULL),
+ //
elm_interface_atspi_accessible_translation_domain_set(NULL),
- elm_interface_atspi_accessible_relationships_clear()
+ elm_interface_atspi_accessible_relationships_clear(),
+ // TIZEN_ONLY(20160930) : endless recursion fix
+ elm_interface_atspi_accessible_attributes_clear()
+ //
);
if (item->name)
eina_stringshare_del(item->name);
- if (_elm_config->atspi_mode && item->widget)
- elm_interface_atspi_accessible_children_changed_del_signal_emit(item->widget, eo_item);
-
- elm_interface_atspi_accessible_removed(eo_item);
-
if (item->atspi_custom_relations)
elm_atspi_relation_set_free(&item->atspi_custom_relations);
//TIZEN_ONLY(20150731) : add i18n support for name and description
if (item->atspi_translation_domain)
eina_stringshare_del(item->atspi_translation_domain);
- ///
+ //
+ //Tizen Only(20160728) free attribute list
+ if (item->attr_list)
+ {
+ Elm_Atspi_Attribute *attr;
+ EINA_LIST_FREE(item->attr_list, attr)
+ {
+ eina_stringshare_del(attr->key);
+ eina_stringshare_del(attr->value);
+ free(attr);
+ }
+ }
+ //
+
+//TIZEN_ONLY(20161013): clean up elm color class feature
+ if (item->color_classes)
+ ELM_SAFE_FREE(item->color_classes, eina_hash_free);
+//
EINA_MAGIC_SET(item, EINA_MAGIC_NONE);
return EINA_TRUE;
}
+const char*
+_elm_widget_accessible_plain_name_get(Evas_Object *obj, const char* name)
+{
+ char *accessible_plain_name;
+
+ API_ENTRY return NULL;
+
+ accessible_plain_name = _elm_util_mkup_to_text(name);
+ eina_stringshare_del(sd->accessible_name);
+ sd->accessible_name = eina_stringshare_add(accessible_plain_name);
+ free(accessible_plain_name);
+ return sd->accessible_name;
+}
+
+const char*
+_elm_widget_item_accessible_plain_name_get(Elm_Object_Item *item, const char* name)
+{
+ char *accessible_plain_name;
+
+ Elm_Widget_Item_Data *id = eo_data_scope_get(item, ELM_WIDGET_ITEM_CLASS);
+ if (!id) return NULL;
+
+ accessible_plain_name = _elm_util_mkup_to_text(name);
+ eina_stringshare_del(id->accessible_name);
+ id->accessible_name = eina_stringshare_add(accessible_plain_name);
+ free(accessible_plain_name);
+ return id->accessible_name;
+}
+
+//TIZEN_ONLY(20160929) : atspi: Improves how to find the can_highlight of the widget
+static Eina_Bool
+_elm_widget_can_highlight_get_by_class(Eo *obj)
+{
+ if (eo_isa(obj, ELM_WIDGET_ITEM_CLASS))
+ {
+ Elm_Widget_Item_Data *id = eo_data_scope_get(obj, ELM_WIDGET_ITEM_CLASS);
+ if (!id) return EINA_FALSE;
+ if (!id->can_highlight) return EINA_FALSE;
+ }
+ else
+ {
+ Elm_Widget_Smart_Data *wd = eo_data_scope_get(obj, ELM_WIDGET_CLASS);
+ if (!wd) return EINA_FALSE;
+ if (!wd->can_highlight) return EINA_FALSE;
+ }
+ return EINA_TRUE;
+}
+//
+
+//TIZEN_ONLY(20161107): enhance elm_atspi_accessible_can_highlight_set to set can_hihglight property to its children
+EAPI Eina_Bool
+_elm_widget_item_highlightable(Elm_Object_Item *item)
+{
+ Eo *parent;
+
+ Elm_Widget_Item_Data *id = eo_data_scope_get(item, ELM_WIDGET_ITEM_CLASS);
+ if (!id) return EINA_FALSE;
+ if (!id->can_highlight) return EINA_FALSE;
+
+ eo_do(item, parent = elm_interface_atspi_accessible_parent_get());
+ while (parent && !eo_isa(parent, ELM_ATSPI_APP_OBJECT_CLASS))
+ {
+ //TIZEN_ONLY(20160929) : atspi: Improves how to find the can_highlight of the widget
+ if (!_elm_widget_can_highlight_get_by_class(parent)) return EINA_FALSE;
+ //
+ eo_do(parent, parent = elm_interface_atspi_accessible_parent_get());
+ }
+ return EINA_TRUE;
+}
+//
+
+//TIZEN_ONLY(20170206): Add check the object is in the scroller content size
+Eina_Bool
+_accessible_object_on_scroll_is(Eo* obj)
+{
+ /* in case of genlist item, the item->view is NULL if item is unrealized.
+ this function is used to check if obj could have HIGHLIGHTABLE or not.
+ the unrealized genlist item should have HIGHLIGHTABLE state.
+ so if obj is NULL return EINA_TRUE */
+ if(!obj) return EINA_TRUE;
+
+ Evas_Object *target = obj;
+ Evas_Object *parent = NULL;
+ Evas_Coord x, y, w, h, wx, wy, ww = 0, wh = 0, nx = 0, ny = 0;
+
+ evas_object_geometry_get(target, &x, &y ,&w, &h);
+
+ if (elm_widget_is(target))
+ parent = elm_widget_parent_get(target);
+ else
+ parent = elm_widget_parent_widget_get(target);
+
+ while (parent)
+ {
+ if (eo_isa(parent, ELM_INTERFACE_SCROLLABLE_MIXIN))
+ {
+ evas_object_geometry_get(parent, &wx, &wy, NULL, NULL);
+ eo_do(parent, elm_interface_scrollable_content_size_get(&ww, &wh));
+ eo_do(parent, elm_interface_scrollable_content_pos_get(&nx, &ny));
+
+ /* widget implements scrollable interface but does not use scoller
+ in this case, use widget geometry */
+ if (ww == 0 || wh == 0)
+ {
+ INF("%s is zero sized scrollable content", eo_class_name_get(eo_class_get(parent)));
+ evas_object_geometry_get(parent, NULL, NULL, &ww, &wh);
+ }
+
+ wx -= nx;
+ wy -= ny;
+
+ if (((wx < x) && (wx + ww < x)) || ((wx > x + w) && (wx + ww > x + w)) ||
+ ((wy < y) && (wy + wh < y)) || ((wy > y + h) && (wy + wh > y + h)))
+ return EINA_FALSE;
+
+ break;
+ }
+ parent = elm_widget_parent_get(parent);
+ }
+
+ return EINA_TRUE;
+}
+//
+
EOLIAN static Elm_Atspi_State_Set
_elm_widget_item_elm_interface_atspi_accessible_state_set_get(Eo *eo_item,
Elm_Widget_Item_Data *item)
{
STATE_TYPE_SET(states, ELM_ATSPI_STATE_ENABLED);
STATE_TYPE_SET(states, ELM_ATSPI_STATE_SENSITIVE);
- STATE_TYPE_SET(states, ELM_ATSPI_STATE_VISIBLE);
}
if (_elm_widget_item_onscreen_is(eo_item))
STATE_TYPE_SET(states, ELM_ATSPI_STATE_SHOWING);
-///TIZEN_ONLY(20170717) : expose highlight information on atspi
- if (item->can_highlight)
+ //TIZEN_ONLY(20170207) : [ATSPI] enhance expose highlight information on atspi
+ /* unrealized genlist item does not have item->view,
+ and item cannot change its visibility, only widget can change the visibility */
+ if (evas_object_visible_get(item->widget))
+ STATE_TYPE_SET(states, ELM_ATSPI_STATE_VISIBLE);
+ //
+
+ //TIZEN_ONLY(20170717) : expose highlight information on atspi
+ if (_elm_widget_item_highlightable(eo_item) && _accessible_object_on_scroll_is(item->view))
STATE_TYPE_SET(states, ELM_ATSPI_STATE_HIGHLIGHTABLE);
+ else
+ STATE_TYPE_UNSET(states, ELM_ATSPI_STATE_HIGHLIGHTABLE);
- if (_elm_object_accessibility_currently_highlighted_get() == (void*)item->view)
+ if (_elm_object_accessibility_currently_highlighted_get() == (void*)item->eo_obj)
STATE_TYPE_SET(states, ELM_ATSPI_STATE_HIGHLIGHTED);
-///
+ //
return states;
}
}
EOLIAN static const Eina_List *
-_elm_widget_item_access_order_get(Eo *eo_item EINA_UNUSED, Elm_Widget_Item_Data *item)
+_elm_widget_item_access_order_get(const Eo *eo_item EINA_UNUSED, Elm_Widget_Item_Data *item)
{
return _elm_access_widget_item_access_order_get(item);
}
parent = eo_parent_get());
eo_do(obj, elm_obj_widget_parent_set(parent));
sd->on_create = EINA_FALSE;
-///TIZEN_ONLY(20170717) : expose highlight information on atspi
+ //TIZEN_ONLY(20170717) : expose highlight information on atspi
sd->can_highlight = EINA_TRUE;
-///
+ //
+ /* TIZEN_ONLY(20160622): Override Paragraph Direction APIs */
+ sd->inherit_paragraph_direction = EINA_TRUE;
+ /* END */
eo_do(obj, elm_interface_atspi_accessible_role_set(ELM_ATSPI_ROLE_UNKNOWN));
+
+ /* TIZEN_ONLY(20161117): Inherit paragraph direction from widget parent */
+ if (sd->paragraph_direction != evas_object_paragraph_direction_get(parent))
+ {
+ sd->paragraph_direction = evas_object_paragraph_direction_get(parent);
+ _elm_widget_evas_object_paragraph_direction_set_internal(obj, sd, sd->paragraph_direction);
+ eo_do_super(obj, MY_CLASS, evas_obj_paragraph_direction_set(sd->paragraph_direction));
+ }
+ /* END */
+
return obj;
}
eo_do(obj,
elm_interface_atspi_accessible_description_set(NULL),
elm_interface_atspi_accessible_name_set(NULL),
+ //TIZEN_ONLY(20190922): add name callback, description callback.
+ elm_interface_atspi_accessible_description_cb_set(NULL, NULL),
+ elm_interface_atspi_accessible_name_cb_set(NULL, NULL),
+ //
+ //TIZEN_ONLY(20170405) Add gesture method to accessible interface
+ elm_interface_atspi_accessible_gesture_cb_set(NULL, NULL),
+ //
elm_interface_atspi_accessible_translation_domain_set(NULL),
- elm_interface_atspi_accessible_relationships_clear()
+ elm_interface_atspi_accessible_relationships_clear(),
+ // TIZEN_ONLY(20160930) : endless recursion fix
+ elm_interface_atspi_accessible_attributes_clear()
+ //
);
// TIZEN_ONLY(20150709) : atspi relations api
if (sd->atspi_custom_relations)
//TIZEN_ONLY(20150717) add widget name setter
if (sd->name)
eina_stringshare_del(sd->name);
- ///
+ //
//TIZEN_ONLY(20150731) : add i18n support for name and description
if (sd->atspi_translation_domain)
eina_stringshare_del(sd->atspi_translation_domain);
- ///
+ //
+ //Tizen Only(20160728) free attribute list
+ if (sd->attr_list)
+ {
+ Elm_Atspi_Attribute *attr;
+ EINA_LIST_FREE(sd->attr_list, attr)
+ {
+ eina_stringshare_del(attr->key);
+ eina_stringshare_del(attr->value);
+ free(attr);
+ }
+ }
+ //
eo_do_super(obj, ELM_WIDGET_CLASS, eo_destructor());
sd->on_destroy = EINA_FALSE;
evas_object_focus_set(obj, EINA_TRUE);
eo_do(obj, eo_event_callback_call
(ELM_WIDGET_EVENT_FOCUSED, NULL));
- if (_elm_config->atspi_mode && !elm_widget_child_can_focus_get(obj))
+ if (_elm_atspi_enabled() && !elm_widget_child_can_focus_get(obj))
elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_FOCUSED, EINA_TRUE);
}
else
evas_object_focus_set(obj, EINA_FALSE);
eo_do(obj, eo_event_callback_call
(ELM_WIDGET_EVENT_UNFOCUSED, NULL));
- if (_elm_config->atspi_mode && !elm_widget_child_can_focus_get(obj))
+ if (_elm_atspi_enabled() && !elm_widget_child_can_focus_get(obj))
elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_FOCUSED, EINA_FALSE);
}
}
return EINA_FALSE;
}
+//TIZEN_ONLY(20170119): Show the object highlighted by highlight_grab when the object is completely out of the scroll
+void
+_elm_widget_showing_geometry_get(Eo *obj, int *x, int *y, int *w, int *h)
+{
+ Evas_Object *parent;
+ Evas_Coord px, py, sx, sy, sw, sh;
+
+ *x = 0;
+ *y = 0;
+ *w = 0;
+ *h = 0;
+
+ if (!obj) return;
+
+ evas_object_geometry_get(obj, x, y, w, h);
+
+ if (elm_widget_is(obj))
+ parent = elm_widget_parent_get(obj);
+ else
+ parent = elm_widget_parent_widget_get(obj);
+
+ while (parent)
+ {
+ if (eo_isa(parent, ELM_INTERFACE_SCROLLABLE_MIXIN))
+ {
+ evas_object_geometry_get(parent, &sx, &sy, &sw, &sh);
+ px = *x;
+ py = *y;
+ *x = *x > sx ? *x : sx;
+ *y = *y > sy ? *y : sy;
+ *w = px + *w < sx + sw ? px + *w - *x : sx + sw - *x;
+ *h = py + *h < sy + sh ? py + *h - *y : sy + sh - *y;
+ }
+ parent = elm_widget_parent_get(parent);
+ }
+}
+
+Eina_Bool
+_accessible_object_on_screen_is(Eo *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, Eina_Bool is_complete)
+{
+ if(!obj) return EINA_FALSE;
+
+ Evas_Object *target = obj;
+ Evas_Object *parent = NULL;
+ Evas_Coord px, py, sx, sy, sw, sh, ox, oy, ow, oh;
+
+ /* uninitialized data could be read */
+ ow = 0;
+ oh = 0;
+
+ if (elm_widget_is(target))
+ parent = elm_widget_parent_get(target);
+ else
+ parent = elm_widget_parent_widget_get(target);
+
+ while (parent)
+ {
+ if (eo_isa(parent, ELM_INTERFACE_SCROLLABLE_MIXIN))
+ {
+ evas_object_geometry_get(parent, &sx, &sy, &sw, &sh);
+ px = ox = x;
+ py = oy = y;
+ ow = w;
+ oh = h;
+ ox = is_complete ? ox : ox + ow;
+ oy = is_complete ? oy : oy + oh;
+ ox = ox > sx ? ox : sx;
+ oy = oy > sy ? oy : sy;
+ ow = px + ow < sx + sw ? px + ow - ox : sx + sw - ox;
+ oh = py + oh < sy + sh ? py + oh - oy : sy + sh - oy;
+ }
+ if (ow <= 0 || oh <= 0)
+ return EINA_FALSE;
+
+ parent = elm_widget_parent_get(parent);
+ }
+ return EINA_TRUE;
+}
+
+Eina_List *
+_accessible_scrollable_parent_list_get(Eo *obj)
+{
+ if(!obj) return NULL;
+
+ Evas_Object *parent = NULL;
+ Eina_List *plist = NULL;
+
+ if (elm_widget_is(obj))
+ parent = elm_widget_parent_get(obj);
+ else
+ parent = elm_widget_parent_widget_get(obj);
+
+ while (parent)
+ {
+ if (_elm_scrollable_is(parent))
+ plist = eina_list_append(plist, parent);
+
+ parent = elm_widget_parent_get(parent);
+ }
+ return plist;
+}
+
+void
+_accessible_highlight_region_show(Eo* obj)
+{
+ if (!obj) return;
+
+ Evas_Object *target = obj;
+ Evas_Object *parent = NULL;
+ Evas_Object *parent_sub = NULL;
+ Eina_List *plist, *plist_sub;
+ Eina_List *l, *l2;
+
+ Evas_Coord target_x, target_y, target_w, target_h;
+
+ evas_object_geometry_get(target, &target_x, &target_y, &target_w, &target_h);
+
+ plist = _accessible_scrollable_parent_list_get(target);
+ if (!plist) return;
+
+ EINA_LIST_FOREACH(plist, l, parent)
+ {
+ if(!_accessible_object_on_screen_is(target, target_x, target_y, target_w, target_h, EINA_TRUE))
+ {
+ plist_sub = _accessible_scrollable_parent_list_get(parent);
+ plist_sub = eina_list_prepend(plist_sub, parent);
+ EINA_LIST_FOREACH(plist_sub, l2, parent_sub)
+ {
+ Evas_Coord scroll_x = 0, scroll_y = 0;
+ Evas_Coord scroll_x_back = 0, scroll_y_back = 0;
+ Evas_Coord x, y, w, h;
+ Evas_Coord px, py;
+
+ eo_do(parent_sub, elm_interface_scrollable_content_region_get(&scroll_x_back, &scroll_y_back, NULL, NULL));
+ evas_object_geometry_get(parent_sub, &px, &py, NULL, NULL);
+ x = target_x; y = target_y; w = target_w; h = target_h;
+
+ x -= (px - scroll_x_back);
+ y -= (py - scroll_y_back);
+ switch (_elm_config->focus_autoscroll_mode)
+ {
+ case ELM_FOCUS_AUTOSCROLL_MODE_SHOW:
+ eo_do(parent_sub, elm_interface_scrollable_content_region_show(x, y, w, h));
+ break;
+ case ELM_FOCUS_AUTOSCROLL_MODE_BRING_IN:
+ eo_do(parent_sub, elm_interface_scrollable_region_bring_in(x, y, w, h));
+ break;
+ default:
+ break;
+ }
+ eo_do(parent_sub, elm_interface_scrollable_content_region_get(&scroll_x, &scroll_y, NULL, NULL));
+
+ target_x -= (scroll_x - scroll_x_back);
+ target_y -= (scroll_y - scroll_y_back);
+
+ if(_accessible_object_on_screen_is(target, target_x, target_y, target_w, target_h, EINA_FALSE))
+ break;
+ }
+ eina_list_free(plist_sub);
+ }
+ }
+
+ eina_list_free(plist);
+}
+//
+
+//TIZEN_ONLY(20171011) : atspi : During the highlight grab, out signal is not sent.
+Eina_Bool
+_elm_widget_accessibility_highlight_grabbing_get(Eo *obj)
+{
+ ELM_WIDGET_DATA_GET(obj, wd);
+ return wd->highlight_grabbing;
+}
+
+void
+_elm_widget_accessibility_highlight_grabbing_set(Eo *obj, Eina_Bool grabbing)
+{
+ ELM_WIDGET_DATA_GET(obj, wd);
+ wd->highlight_grabbing = grabbing;
+}
+//
+
//TIZEN_ONLY(20160329): atspi: implement HighlightGrab and HighlightClear methods (29e253e2f7ef3c632ac3a64c489bf569df407f30)
EOLIAN static Eina_Bool
_elm_widget_elm_interface_atspi_component_highlight_grab(Eo *obj, Elm_Widget_Smart_Data *pd EINA_UNUSED)
{
+ if(!obj) return EINA_FALSE;
+ if(!_elm_atspi_enabled())
+ return EINA_FALSE;
+ // TIZEN_ONLY(20171020) : atspi : Do not send signal, if current object and highlight object are same
+ if (_elm_object_accessibility_currently_highlighted_get() == obj)
+ return EINA_FALSE;
+ //
+
+ //TIZEN_ONLY(20171011) : atspi : During the highlight grab, out signal is not sent.
+ _elm_widget_accessibility_highlight_grabbing_set(obj, EINA_TRUE);
+ //
+
+ //TIZEN_ONLY(20170119): Show the object highlighted by highlight_grab when the object is completely out of the scroll
+ _accessible_highlight_region_show(obj);
+ //
+
elm_object_accessibility_highlight_set(obj, EINA_TRUE);
elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_HIGHLIGHTED, EINA_TRUE);
+
+ // TIZEN_ONLY(20161018): add highlighted/unhighlighted signal for atspi
+ evas_object_smart_callback_call(obj, SIG_WIDGET_ATSPI_HIGHLIGHTED, NULL);
+ //
+ //TIZEN_ONLY(20171011) : atspi : During the highlight grab, out signal is not sent.
+ _elm_widget_accessibility_highlight_grabbing_set(obj, EINA_FALSE);
+ //
return EINA_TRUE;
}
EOLIAN static Eina_Bool
_elm_widget_elm_interface_atspi_component_highlight_clear(Eo *obj, Elm_Widget_Smart_Data *pd EINA_UNUSED)
{
+ if(!_elm_atspi_enabled())
+ return EINA_FALSE;
elm_object_accessibility_highlight_set(obj, EINA_FALSE);
elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_HIGHLIGHTED, EINA_FALSE);
+
+ // TIZEN_ONLY(20161018): add highlighted/unhighlighted signal for atspi
+ evas_object_smart_callback_call(obj, SIG_WIDGET_ATSPI_UNHIGHLIGHTED, NULL);
+ //
return EINA_TRUE;
}
//
-EOLIAN static char*
-_elm_widget_elm_interface_atspi_accessible_name_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd EINA_UNUSED)
+EOLIAN static const char*
+_elm_widget_elm_interface_atspi_accessible_name_get(Eo *obj, Elm_Widget_Smart_Data *_pd)
{
- const char *ret;
+ //TIZEN_ONLY(20190922): add name callback, description callback.
+ const char *ret = NULL;
+ eo_do_super(obj, ELM_WIDGET_CLASS, ret = elm_interface_atspi_accessible_name_get());
+ if (ret) return ret;
+ //
+
//TIZEN_ONLY(20150717) add widget name setter
if (_pd->name)
{
#ifdef HAVE_GETTEXT
if (_pd->atspi_translation_domain)
- return strdup(dgettext(_pd->atspi_translation_domain, _pd->name));
- else
- return strdup(_pd->name);
-#else
- return strdup(_pd->name);
+ return dgettext(_pd->atspi_translation_domain, _pd->name);
#endif
+ return _pd->name;
}
- ///
+ //
+
+ //TIZEN_ONLY(20170110) : Ignore text from elm_object_text_set in accessible_name_get
+ Elm_Atspi_Role role;
+ eo_do(obj, role = elm_interface_atspi_accessible_role_get());
+ if(role == ELM_ATSPI_ROLE_DIALOG)
+ return NULL;
+ //
ret = elm_object_text_get(obj);
if (!ret) return NULL;
- return _elm_util_mkup_to_text(ret);
+ return _elm_widget_accessible_plain_name_get(obj, ret);
+}
+//TIZEN_ONLY(20161111) add widget/widget_item description get/set
+EOLIAN void
+_elm_widget_elm_interface_atspi_accessible_description_set(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data* _pd EINA_UNUSED, const char *description)
+{
+ if (_pd->description)
+ eina_stringshare_del(_pd->description);
+
+ _pd->description = eina_stringshare_add(description);
+}
+
+EOLIAN static const char*
+_elm_widget_elm_interface_atspi_accessible_description_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd EINA_UNUSED)
+{
+ const char *ret = NULL;
+ eo_do_super(obj, ELM_WIDGET_CLASS, ret = elm_interface_atspi_accessible_description_get());
+ if (ret) return ret;
+
+#ifdef HAVE_GETTEXT
+ if (_pd->atspi_translation_domain)
+ return dgettext(_pd->atspi_translation_domain, _pd->description);
+#endif
+ return _pd->description;
}
+//
//TIZEN_ONLY(20150713) : add atspi name setter to widget_item
EOLIAN void
-_elm_widget_item_elm_interface_atspi_accessible_name_set(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data* _pd EINA_UNUSED, char *name)
+_elm_widget_item_elm_interface_atspi_accessible_name_set(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data* _pd EINA_UNUSED, const char *name)
{
if (_pd->name)
eina_stringshare_del(_pd->name);
_pd->name = eina_stringshare_add(name);
}
-EOLIAN char*
+EOLIAN const char*
_elm_widget_item_elm_interface_atspi_accessible_name_get(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data *_pd EINA_UNUSED)
{
+ //TIZEN_ONLY(20190922): add name callback, description callback.
+ const char *ret = NULL;
+ eo_do_super(obj, ELM_WIDGET_ITEM_CLASS, ret = elm_interface_atspi_accessible_name_get());
+ if (ret) return ret;
+ //
+
if (_pd->name)
{
#ifdef HAVE_GETTEXT
if (_pd->atspi_translation_domain)
- return strdup(dgettext(_pd->atspi_translation_domain, _pd->name));
- else
- return strdup(_pd->name);
-#else
- return strdup(_pd->name);
+ return dgettext(_pd->atspi_translation_domain, _pd->name);
#endif
+ return _pd->name;
}
- ///
return NULL;
}
-///
+//
+//TIZEN_ONLY(20161111) add widget/widget_item description get/set
+EOLIAN void
+_elm_widget_item_elm_interface_atspi_accessible_description_set(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data* _pd EINA_UNUSED, const char *description)
+{
+ if (_pd->description)
+ eina_stringshare_del(_pd->description);
+
+ _pd->description = eina_stringshare_add(description);
+}
+EOLIAN const char*
+_elm_widget_item_elm_interface_atspi_accessible_description_get(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data *_pd EINA_UNUSED)
+{
+ const char *ret = NULL;
+ eo_do_super(obj, ELM_WIDGET_ITEM_CLASS, ret = elm_interface_atspi_accessible_description_get());
+ if (ret) return ret;
+
+#ifdef HAVE_GETTEXT
+ if (_pd->atspi_translation_domain)
+ return dgettext(_pd->atspi_translation_domain, _pd->description);
+#endif
+ return _pd->description;
+}
+//
+//TIZEN_ONLY(20150709) : spatially sort atspi children
static int _sort_vertically(const void *data1, const void *data2)
{
Evas_Coord y1, y2;
static Eina_List *_lines_split(Eina_List *children)
{
Eo *c;
- Eina_List *lines, *line;
+ Eina_List *lines, *line, *l;
Evas_Coord yl, y, hl, h;
lines = line = NULL;
if (!children) return NULL;
- evas_object_geometry_get(eina_list_data_get(children), NULL, &yl, NULL, &hl);
+ EINA_LIST_FOREACH(children, l, c)
+ {
+ evas_object_geometry_get(c, NULL, &yl, NULL, &hl);
+
+ /* remove child if its height == 0 */
+ if (hl != 0) break;
+ }
EINA_LIST_FREE(children, c)
{
evas_object_geometry_get(c, NULL, &y, NULL, &h);
+
+ /* remove child if its height == 0 */
+ if (h == 0 && !eo_isa(c, ELM_ATSPI_PROXY_CLASS)) continue;
+
if ((yl + (int)(0.25 * hl)) >= y)
{
//same line
}
//
+// TIZEN_ONLY(20160705) - enable atspi_proxy to work
+static void
+_proxy_widget_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+ Evas_Coord x, y;
+ Eo *proxy = data;
+
+ evas_object_geometry_get(obj, &x, &y, NULL, NULL);
+ elm_atspi_bridge_utils_proxy_offset_set(proxy, x, y);
+}
+//
+
+static Eina_Bool
+_on_widget_del(void *data, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Eo *plug = data;
+ // TIZEN_ONLY(20160705) - enable atspi_proxy to work
+ evas_object_event_callback_del_full(obj, EVAS_CALLBACK_MOVE,
+ _proxy_widget_move_cb, plug);
+ //
+ eo_del(plug);
+ return EINA_TRUE;
+}
+
+// TIZEN_ONLY(20160705) - enable atspi_proxy to work
+static Eina_Bool
+_on_proxy_connected_cb(void *data, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Coord x, y;
+ Evas_Object *widget = data;
+
+ evas_object_geometry_get(widget, &x, &y, NULL, NULL);
+ elm_atspi_bridge_utils_proxy_offset_set(obj, x, y);
+
+ evas_object_event_callback_add(widget, EVAS_CALLBACK_MOVE, _proxy_widget_move_cb, obj);
+ return EINA_TRUE;
+}
+//
+// TIZEN ONLY - END
+
+//TIZEN_ONLY(20170621) handle atspi proxy connection at runtime
+static Eo *
+_plug_type_proxy_get(Eo *obj, Evas_Object *widget)
+{
+ Eo *proxy = NULL;
+ const char *plug_id;
+ char *svcname, *svcnum;
+
+ if ((plug_id = evas_object_data_get(widget, "___PLUGID")) != NULL)
+ {
+ // TIZEN_ONLY(20160930) : endless recursion fix
+ eo_do_super(obj, MY_CLASS, elm_interface_atspi_accessible_attribute_append("___PlugID", plug_id));
+
+ proxy = evas_object_data_get(widget, "__widget_proxy");
+ if (proxy) return proxy;
+
+ if (_elm_atspi_bridge_plug_id_split(plug_id, &svcname, &svcnum))
+ {
+ proxy = _elm_atspi_bridge_utils_proxy_create(obj, svcname, atoi(svcnum), ELM_ATSPI_PROXY_TYPE_PLUG);
+ evas_object_data_set(widget, "__widget_proxy", proxy);
+ eo_do(widget, eo_event_callback_add(EO_EV_DEL, _on_widget_del, proxy));
+ eo_do(proxy, eo_event_callback_add(ELM_ATSPI_PROXY_EVENT_CONNECTED, _on_proxy_connected_cb, widget));
+ elm_atspi_bridge_utils_proxy_connect(proxy);
+ free(svcname);
+ free(svcnum);
+ }
+ }
+
+ return proxy;
+}
+
+EAPI Eo *
+elm_widget_atspi_plug_type_proxy_get(Evas_Object *obj)
+{
+ Elm_Widget_Smart_Data *wd;
+ Evas_Object *widget;
+ Eina_List *l;
+
+ wd = eo_data_scope_get(obj, ELM_WIDGET_CLASS);
+ if (!wd) return NULL;
+
+ Eo *proxy = NULL;
+ EINA_LIST_FOREACH(wd->subobjs, l, widget)
+ {
+ if (evas_object_data_get(widget, "___PLUGID"))
+ proxy = _plug_type_proxy_get(obj, widget);
+ if (proxy) break;
+ }
+ return proxy;
+}
+//
+
EOLIAN static Eina_List*
-_elm_widget_elm_interface_atspi_accessible_children_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *pd EINA_UNUSED)
+_elm_widget_elm_interface_atspi_accessible_children_get(Eo *obj, Elm_Widget_Smart_Data *pd EINA_UNUSED)
{
Eina_List *l, *accs = NULL;
Elm_Widget_Smart_Data *wd;
Evas_Object *widget;
+ // TIZEN_ONLY(20160824): Do not append a child, if its accessible parent is different with widget parent
+ Eo *parent;
+ //
wd = eo_data_scope_get(obj, ELM_WIDGET_CLASS);
if (!wd) return NULL;
EINA_LIST_FOREACH(wd->subobjs, l, widget)
{
+ const char *type = evas_object_type_get(widget);
+ // TIZEN ONLY
+ // Ugly Tizen hack to integrate AT-SPI2 accessibility provided by WebKit/Chromium with elementary one.
+ // This wrapper class should be implemented in Webkit/Chromium EFL ports
+ if (type && (!strcmp(type, "EWebView") || !strcmp(type, "WebView"))) {
+ elm_atspi_ewk_wrapper_a11y_init(obj, widget);
+ }
+ }
+
+ Eo *proxy = NULL;
+ EINA_LIST_FOREACH(wd->subobjs, l, widget)
+ {
+ // TIZEN_ONLY(20160824): Do not append a child, if its accessible parent is different with widget parent
+ if (eo_isa(widget, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN)) {
+ eo_do(widget, parent = elm_interface_atspi_accessible_parent_get());
+ if (parent && (parent != obj)) continue;
+ }
+
+ // TIZEN_ONLY(20160705) - enable atspi_proxy to work
+ /* This assumes that only one proxy exists in obj */
+ if (!proxy)
+ {
+ proxy = _plug_type_proxy_get(obj, widget);
+ if (proxy)
+ {
+ accs = eina_list_append(accs, proxy);
+ continue;
+ }
+ }
+ //
+ // TIZEN ONLY - END
if (!elm_object_widget_check(widget)) continue;
if (eo_isa(widget, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN))
accs = eina_list_append(accs, widget);
accs = NULL;
EINA_LIST_FREE(lines, line)
accs = eina_list_merge(accs, eina_list_sort(line, -1, _sort_horizontally));
- //////////////////////////////
+ //
+
+ if (proxy)
+ {
+ Eo *deputy = NULL;
+ accs = eina_list_remove(accs, proxy);
+ EINA_LIST_FOREACH(accs, l, widget)
+ {
+ if (eo_isa(widget, ELM_ACCESS_CLASS))
+ {
+ Elm_Access_Info *info = _elm_access_info_get(widget);
+ if (!info) continue;
+ if (obj == info->part_object)
+ {
+ deputy = widget;
+ break;
+ }
+ }
+ }
+
+ if (deputy)
+ {
+ accs = eina_list_append_relative(accs, proxy, deputy);
+ }
+ }
return accs;
}
return ret ? ret : pd->parent_obj;
}
+//TIZEN_ONLY(20161107): enhance elm_atspi_accessible_can_highlight_set to set can_hihglight property to its children
+EAPI Eina_Bool
+_elm_widget_highlightable(Evas_Object *obj)
+{
+ Eo *parent;
+
+ Elm_Widget_Smart_Data *wd = eo_data_scope_get(obj, ELM_WIDGET_CLASS);
+ if (!wd) return EINA_FALSE;
+ if (!wd->can_highlight) return EINA_FALSE;
+
+ eo_do(obj, parent = elm_interface_atspi_accessible_parent_get());
+ while (parent && !eo_isa(parent, ELM_ATSPI_APP_OBJECT_CLASS))
+ {
+ //TIZEN_ONLY(20160929) : atspi: Improves how to find the can_highlight of the widget
+ if (!_elm_widget_can_highlight_get_by_class(parent)) return EINA_FALSE;
+ //
+ eo_do(parent, parent = elm_interface_atspi_accessible_parent_get());
+ }
+ return EINA_TRUE;
+}
+//
+
EOLIAN static Elm_Atspi_State_Set
_elm_widget_elm_interface_atspi_accessible_state_set_get(Eo *obj, Elm_Widget_Smart_Data *pd)
{
STATE_TYPE_SET(states, ELM_ATSPI_STATE_SENSITIVE);
}
-///TIZEN_ONLY(20170717) : expose highlight information on atspi
- if (pd->can_highlight)
+ //TIZEN_ONLY(20170717) : expose highlight information on atspi
+ if (_elm_widget_highlightable(obj) && _accessible_object_on_scroll_is(obj))
STATE_TYPE_SET(states, ELM_ATSPI_STATE_HIGHLIGHTABLE);
+ else
+ STATE_TYPE_UNSET(states, ELM_ATSPI_STATE_HIGHLIGHTABLE);
if (_elm_object_accessibility_currently_highlighted_get() == (void*)pd->obj)
STATE_TYPE_SET(states, ELM_ATSPI_STATE_HIGHLIGHTED);
-///
+ //
return states;
}
+//TIZEN_ONLY(20160729): attributes_get, append APIs added/updated.
EOLIAN static Eina_List*
_elm_widget_elm_interface_atspi_accessible_attributes_get(Eo *obj, Elm_Widget_Smart_Data *pd EINA_UNUSED)
{
- Eina_List *ret = NULL;
- Elm_Atspi_Attribute *attr = calloc(1, sizeof(Elm_Atspi_Attribute));
- if (!attr) return NULL;
+ Eina_List *attr_list = NULL;
+ // TIZEN_ONLY(20160930) : endless recursion fix
+ eo_do_super(obj, MY_CLASS, attr_list = elm_interface_atspi_accessible_attributes_get());
+ //
+ //Add type and style information in addition.
+ Elm_Atspi_Attribute *attr = NULL;
+ attr = calloc(1, sizeof(Elm_Atspi_Attribute));
+ if (attr)
+ {
+ attr->key = eina_stringshare_add("type");
+ attr->value = eina_stringshare_add(elm_widget_type_get(obj));
+ attr_list = eina_list_append(attr_list, attr);
+ }
- attr->key = eina_stringshare_add("type");
- attr->value = eina_stringshare_add(evas_object_type_get(obj));
+ attr = calloc(1, sizeof(Elm_Atspi_Attribute));
+ if (attr)
+ {
+ attr->key = eina_stringshare_add("style");
+ attr->value = eina_stringshare_add(elm_widget_style_get(obj));
+ attr_list = eina_list_append(attr_list, attr);
+ }
- ret = eina_list_append(ret, attr);
- return ret;
+ return attr_list;
}
-// TIZEN_ONLY(20150709) : atspi relations api
+//TIZEN_ONLY(20150709) : atspi relations api
EOLIAN static Elm_Atspi_Relation_Set
_elm_widget_elm_interface_atspi_accessible_relation_set_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *sd)
{
return elm_atspi_relation_set_clone(&sd->atspi_custom_relations);
}
-//////////////////////////////
+
+EOLIAN static Elm_Atspi_Relation_Set
+_elm_widget_item_elm_interface_atspi_accessible_relation_set_get(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data *sd)
+{
+ return elm_atspi_relation_set_clone(&sd->atspi_custom_relations);
+}
+
+EOLIAN static void
+_elm_widget_elm_interface_atspi_accessible_relationships_clear(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *sd)
+{
+ elm_atspi_relation_set_free(&sd->atspi_custom_relations);
+ sd->atspi_custom_relations = NULL;
+}
+//
+
+EOLIAN static void
+_elm_widget_item_elm_interface_atspi_accessible_relationships_clear(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data *sd)
+{
+ elm_atspi_relation_set_free(&sd->atspi_custom_relations);
+ sd->atspi_custom_relations = NULL;
+}
+//
EOLIAN static void
_elm_widget_item_elm_interface_atspi_component_extents_get(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data *sd EINA_UNUSED, Eina_Bool screen_coords, int *x, int *y, int *w, int *h)
}
//TIZEN_ONLY(20160329): atspi: implement HighlightGrab and HighlightClear methods
+
EOLIAN static Eina_Bool
_elm_widget_item_elm_interface_atspi_component_highlight_grab(Eo *obj, Elm_Widget_Item_Data *sd)
{
+ if (!sd) return EINA_FALSE;
+ if (!sd->view) return EINA_FALSE;
+ // TIZEN_ONLY(20171020) : atspi : Do not send signal, if current object and highlight object are same
+ if (_elm_object_accessibility_currently_highlighted_get() == obj)
+ return EINA_FALSE;
+ //
- if (!obj) return EINA_FALSE;
+ //TIZEN_ONLY(20171011) : atspi : During the highlight grab, out signal is not sent.
+ _elm_widget_accessibility_highlight_grabbing_set(sd->view, EINA_TRUE);
+ //
- Evas_Object *o = elm_object_parent_widget_get(sd->view);
- if (_elm_scrollable_is(o))
- {
- Evas_Coord bx, by, bw, bh;
- Evas_Coord x, y, w, h;
- Evas_Object *w1 = elm_object_parent_widget_get(o);
- evas_object_geometry_get(sd->view, &x, &y, &w, &h);
- evas_object_geometry_get(o, &bx, &by, &bw, &bh);
- x -= bx;
- y -= by;
- switch (_elm_config->focus_autoscroll_mode)
- {
- case ELM_FOCUS_AUTOSCROLL_MODE_SHOW:
- eo_do(w1, elm_interface_scrollable_content_region_show(x, y, w, h));
- break;
- case ELM_FOCUS_AUTOSCROLL_MODE_BRING_IN:
- eo_do(w1, elm_interface_scrollable_region_bring_in(x, y, w, h));
- break;
- default:
- break;
- }
- }
+ //TIZEN_ONLY(20170119): Show the object highlighted by highlight_grab when the object is completely out of the scroll
+ _accessible_highlight_region_show(sd->view);
+ //
+
+ if (!sd->eo_obj) return EINA_FALSE;
+ elm_object_accessibility_highlight_set(sd->eo_obj, EINA_TRUE);
- elm_object_accessibility_highlight_set(sd->view, EINA_TRUE);
+ if (!obj) return EINA_FALSE;
elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_HIGHLIGHTED, EINA_TRUE);
+ //TIZEN_ONLY(20170412) Make atspi,(un)highlighted work on widget item
+ evas_object_smart_callback_call(sd->widget, SIG_WIDGET_ATSPI_HIGHLIGHTED, obj);
+ //
+ //TIZEN_ONLY(20171011) : atspi : During the highlight grab, out signal is not sent.
+ _elm_widget_accessibility_highlight_grabbing_set(sd->view, EINA_FALSE);
+ //
return EINA_TRUE;
-
}
EOLIAN static Eina_Bool
_elm_widget_item_elm_interface_atspi_component_highlight_clear(Eo *obj, Elm_Widget_Item_Data *sd)
{
if (!obj) return EINA_FALSE;
- elm_object_accessibility_highlight_set(sd->view, EINA_FALSE);
+ elm_object_accessibility_highlight_set(sd->eo_obj, EINA_FALSE);
elm_interface_atspi_accessible_state_changed_signal_emit(obj, ELM_ATSPI_STATE_HIGHLIGHTED, EINA_FALSE);
+
+ //TIZEN_ONLY(20170412) Make atspi,(un)highlighted work on widget item
+ evas_object_smart_callback_call(sd->widget, SIG_WIDGET_ATSPI_UNHIGHLIGHTED, obj);
+ //
return EINA_TRUE;
}
//
return (double)alpha / 255.0;
}
-///////////////////////////////////
//TIZEN_ONLY(20150717) add widget name setter
EOLIAN void
-_elm_widget_elm_interface_atspi_accessible_name_set(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data* _pd EINA_UNUSED, char *name)
+_elm_widget_elm_interface_atspi_accessible_name_set(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data* _pd EINA_UNUSED, const char *name)
{
if (_pd->name)
eina_stringshare_del(_pd->name);
_pd->name = eina_stringshare_add(name);
}
-///
+//
//TIZEN_ONLY(20160329): widget: improve accessibile_at_point getter (a8aff0423202b9a55dbb3843205875226678fbd6)
-EOLIAN static Eo *
-_elm_widget_elm_interface_atspi_component_accessible_at_point_get(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED, Eina_Bool screen_coords, int x, int y)
+static void
+_coordinate_system_based_point_translate(Eo *obj, Eina_Bool screen_coords, int *x, int *y)
{
- Eina_List *l, *l2, *children;
- Eo *child;
- Evas_Object *stack_item;
- Eo *compare_obj;
- int ee_x, ee_y;
+ Ecore_Evas *ee;
+ int ee_x = 0;
+ int ee_y = 0;
if (screen_coords)
{
- Ecore_Evas *ee = ecore_evas_ecore_evas_get(evas_object_evas_get(obj));
- if (!ee) return NULL;
+ ee = ecore_evas_ecore_evas_get(evas_object_evas_get(obj));
+ if (!ee) return;
+
ecore_evas_geometry_get(ee, &ee_x, &ee_y, NULL, NULL);
- x -= ee_x;
- y -= ee_y;
+ *x -= ee_x;
+ *y -= ee_y;
+ }
+}
+
+static Evas_Object *
+_parent_get(Evas_Object *obj)
+{
+ Evas_Object *parent;
+
+ parent = evas_object_smart_parent_get(obj);
+ if (!parent)
+ {
+ if (strcmp("Elm_Win", eo_class_name_get(eo_class_get(obj))))
+ parent = elm_widget_parent_get(obj);
+ }
+
+ return parent;
+}
+
+static Eina_Bool
+_is_inside(Evas_Object *obj, int x, int y)
+{
+ Eina_Bool ret = EINA_TRUE;
+ Evas_Coord cx = 0;
+ Evas_Coord cy = 0;
+ Evas_Coord cw = 0;
+ Evas_Coord ch = 0;
+ if (eo_isa(obj, ELM_WIDGET_ITEM_CLASS))
+ {
+ Elm_Widget_Item_Data *id = eo_data_scope_get(obj, ELM_WIDGET_ITEM_CLASS);
+ evas_object_geometry_get(id->view, &cx, &cy, &cw, &ch);
+ }
+ else
+ evas_object_geometry_get(obj, &cx, &cy, &cw, &ch);
+
+ /* check the point is out of bound */
+ if (x < cx || x > cx + cw || y < cy || y > cy + ch)
+ {
+ ret = EINA_FALSE;
+ }
+ return ret;
+}
+
+static Eina_Bool
+_is_ancestor_of(Evas_Object *smart_parent, Evas_Object *obj)
+{
+ Eina_Bool ret = EINA_FALSE;
+ Evas_Object *parent = elm_widget_parent_get(obj);
+ while (parent)
+ {
+ /* No need to check more, the smart_parent is parent of obj */
+ if (smart_parent == parent)
+ {
+ ret = EINA_TRUE;
+ break;
+ }
+ parent = elm_widget_parent_get(parent);
+ }
+
+ return ret;
+}
+
+static int _sort_by_size(const void *data1, const void *data2)
+{
+ Evas_Coord w, h;
+ Evas_Coord w2, h2;
+
+ evas_object_geometry_get(data1, NULL, NULL, &w, &h);
+ evas_object_geometry_get(data2, NULL, NULL, &w2, &h2);
+
+ if ((w * h) > (w2 * h2)) return 1;
+ return -1;
+}
+
+Eina_Bool
+_elm_widget_atspi_role_acceptable_check(Eo *obj)
+{
+ Elm_Atspi_Role role;
+ eo_do(obj, role = elm_interface_atspi_accessible_role_get());
+
+ switch (role)
+ {
+ case ELM_ATSPI_ROLE_APPLICATION:
+ case ELM_ATSPI_ROLE_FILLER:
+ case ELM_ATSPI_ROLE_SCROLL_PANE:
+ case ELM_ATSPI_ROLE_SPLIT_PANE:
+ case ELM_ATSPI_ROLE_WINDOW:
+ case ELM_ATSPI_ROLE_IMAGE:
+ case ELM_ATSPI_ROLE_LIST:
+ case ELM_ATSPI_ROLE_ICON:
+ case ELM_ATSPI_ROLE_TOOL_BAR:
+ case ELM_ATSPI_ROLE_REDUNDANT_OBJECT:
+ case ELM_ATSPI_ROLE_COLOR_CHOOSER:
+ case ELM_ATSPI_ROLE_TREE_TABLE:
+ case ELM_ATSPI_ROLE_PAGE_TAB_LIST:
+ case ELM_ATSPI_ROLE_PAGE_TAB:
+ case ELM_ATSPI_ROLE_SPIN_BUTTON:
+ case ELM_ATSPI_ROLE_INPUT_METHOD_WINDOW:
+ case ELM_ATSPI_ROLE_EMBEDDED:
+ case ELM_ATSPI_ROLE_INVALID:
+ case ELM_ATSPI_ROLE_NOTIFICATION:
+ case ELM_ATSPI_ROLE_DATE_EDITOR:
+ return EINA_FALSE;
+ default:
+ break;
+ }
+
+ return EINA_TRUE;
+}
+
+static Eo *
+_child_object_at_point_get(Eo *obj, int x, int y)
+{
+ Eina_List *l, *l_next, *children, *valid_children = NULL;
+ Eo *child;
+ Eo *target;
+ int count;
+
+ eo_do(obj, children = elm_interface_atspi_accessible_children_get());
+
+ EINA_LIST_FOREACH(children, l, child)
+ {
+ if (_is_inside(child, x, y))
+ valid_children = eina_list_append(valid_children, child);
+ }
+
+ EINA_LIST_FOREACH_SAFE(valid_children, l, l_next, child)
+ {
+ eo_do(child, children = elm_interface_atspi_accessible_children_get());
+
+ /* do not use unacceptable leaf node */
+ if (!_elm_widget_atspi_role_acceptable_check(child) &&
+ eina_list_count(children) == 0)
+ valid_children = eina_list_remove_list(valid_children, l);
+ }
+
+ count = eina_list_count(valid_children);
+ if (count > 0)
+ {
+ valid_children = eina_list_sort(valid_children, -1, _sort_by_size);
+ target = eina_list_nth(valid_children, 0);
+
+ return _child_object_at_point_get(target, x, y);
+ }
+
+ return obj;
+}
+
+static Eina_Bool
+_acceptable_child_is(Eo *obj)
+{
+ Elm_Atspi_Role role;
+ Eina_List *children;
+ Elm_Atspi_State_Set ss;
+
+ eo_do(obj, role = elm_interface_atspi_accessible_role_get());
+ switch (role)
+ {
+ case ELM_ATSPI_ROLE_IMAGE:
+ case ELM_ATSPI_ROLE_ICON:
+ /* remove unacceptable leaf node */
+ eo_do(obj, children = elm_interface_atspi_accessible_children_get());
+ if (!children) return EINA_FALSE;
+ break;
+
+ case ELM_ATSPI_ROLE_PANEL:
+ /* remove closed panel fron children list */
+ eo_do(obj, ss = elm_interface_atspi_accessible_state_set_get());
+ if (!STATE_TYPE_GET(ss, ELM_ATSPI_STATE_SHOWING)) return EINA_FALSE;
+ break;
+
+ default:
+ break;
}
+ return EINA_TRUE;
+}
+
+static Eo *
+_accessible_at_point_top_down_get(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED, Eina_Bool screen_coords, int x, int y)
+{
+ Eina_List *l, *l2, *children, *valid_children = NULL;
+ Eo *child;
+ Evas_Object *stack_item;
+ Eo *compare_obj;
+ // TIZEN_ONLY(20160705) - enable atspi_proxy to work
+ Eo *proxy;
+ Evas_Coord px, py, pw, ph;
+ //
+
+ _coordinate_system_based_point_translate(obj, screen_coords, &x, &y);
+
eo_do(obj, children = elm_interface_atspi_accessible_children_get());
+ EINA_LIST_FOREACH(children, l2, child)
+ {
+ if (_is_inside(child, x, y) && _acceptable_child_is(child))
+ valid_children = eina_list_append(valid_children, child);
+ }
+
+ /* If there is only one valid child at point, then return it.
+ The evas_tree_objects_at_xy_get could not find proper object,
+ if application does not have well aligned objects. */
+ if (eina_list_count(valid_children) == 1)
+ {
+ eina_list_free(children);
+ child = eina_list_nth(valid_children, 0);
+ return child;
+ }
+
/* Get evas_object stacked at given x,y coordinates starting from top */
Eina_List *stack = evas_tree_objects_at_xy_get(evas_object_evas_get(obj), NULL, x, y);
-
/* Foreach stacked object starting from top */
EINA_LIST_FOREACH(stack, l, stack_item)
{
- /* Foreach at-spi children traverse stack_item evas_objects hierarchy */
- EINA_LIST_FOREACH(children, l2, child)
+ /* Foreach at-spi valid children traverse stack_item evas_objects hierarchy */
+ EINA_LIST_FOREACH(valid_children, l2, child)
{
/* Compare object used to compare with stacked evas objects */
compare_obj = child;
{
Elm_Widget_Item_Data *id = eo_data_scope_get(child, ELM_WIDGET_ITEM_CLASS);
compare_obj = id->view;
+ if (TIZEN_PROFILE_WEARABLE)
+ {
+ Eo* it_view = evas_object_image_source_get(stack_item);
+ if (it_view && it_view == compare_obj)
+ {
+ eina_list_free(children);
+ eina_list_free(stack);
+ return child;
+ }
+ }
}
/* In case of access object compare should be 'wrapped' evas_object */
if (eo_isa(child, ELM_ACCESS_CLASS))
{
- Elm_Access_Info *info = _elm_access_info_get(child);
- compare_obj = info->part_object;
+ Elm_Access_Info *info = _elm_access_info_get(child);
+ if (!info) continue;
+ compare_obj = info->part_object;
+ }
+ /* In case of widget is registerd by elm_access_object_register */
+ Evas_Object *ao = elm_access_object_get(child);
+ if (ao)
+ {
+ eina_list_free(children);
+ eina_list_free(stack);
+ return ao;
}
+
+ /* In case of ewk wrapper object compare with internal ewk_view evas_object */
+ if (eo_isa(child, ELM_ATSPI_EWK_WRAPPER_CLASS))
+ {
+ compare_obj = elm_atspi_ewk_wrapper_ewk_view_get(child);
+ }
+
/* If spacial eo children do not have backing evas_object continue with search */
if (!compare_obj)
continue;
eina_list_free(stack);
return child;
}
- smart_parent = evas_object_smart_parent_get(smart_parent);
+
+ // TIZEN_ONLY(20160705) - enable atspi_proxy to work
+ proxy = evas_object_data_get(smart_parent, "__widget_proxy");
+ if (proxy)
+ {
+ evas_object_geometry_get(smart_parent, &px, &py, &pw, &ph);
+ if (x >= px && x <= px + pw && y >= py && y <= py +ph)
+ {
+ eina_list_free(children);
+ eina_list_free(stack);
+ return proxy;
+ }
+ }
+ //
+
+ smart_parent = _parent_get(smart_parent);
+ if (_is_ancestor_of(smart_parent, obj)) break;
}
}
}
eina_list_free(stack);
return NULL;
}
+
+static int _sort_by_repeat_events(const void *data1, const void *data2)
+{
+ Evas_Object *ao1, *ao2;
+ Eina_Bool repeat1, repeat2;
+
+ ao1 = elm_access_object_get(data1);
+ ao2 = elm_access_object_get(data2);
+
+ repeat1 = evas_object_repeat_events_get(data1);
+ repeat2 = evas_object_repeat_events_get(data2);
+
+ if (repeat1 != repeat2)
+ {
+ if (repeat1 && !ao1) return 1;
+ }
+ else
+ {
+ if (repeat1 && !ao1 && ao2) return 1;
+ }
+
+ return -1;
+}
+
+static Eo *_item_at_point_get(Evas_Object *obj, int x, int y)
+{
+ Eo *child;
+ Eina_List *l, *children;
+
+ eo_do(obj, children = elm_interface_atspi_accessible_children_get());
+
+ EINA_LIST_FOREACH(children, l, child)
+ {
+ if (_is_inside(child, x, y)) return child;
+ }
+
+ ERR("No child at point (%d, %d) on object %p", x, y, obj);
+ return NULL;
+}
+
+EOLIAN static Eo *
+_elm_widget_elm_interface_atspi_component_accessible_at_point_get(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED, Eina_Bool screen_coords, int x, int y)
+{
+ Eina_List *l;
+ Evas_Object *stack_item;
+
+ if(strcmp("Elm_Win", eo_class_name_get(eo_class_get(obj))) &&
+ strcmp("Elm_Popup", eo_class_name_get(eo_class_get(obj))) &&
+ strcmp("Elm_Panel", eo_class_name_get(eo_class_get(obj))))
+ return _accessible_at_point_top_down_get(obj, _pd, screen_coords, x, y);
+
+ _coordinate_system_based_point_translate(obj, screen_coords, &x, &y);
+
+ Eina_List *stack = evas_tree_objects_at_xy_get(evas_object_evas_get(obj), NULL, x, y);
+ stack = eina_list_sort(stack, -1, _sort_by_repeat_events);
+
+ EINA_LIST_FOREACH(stack, l, stack_item)
+ {
+ Evas_Object *smart_parent = stack_item;
+ while (smart_parent)
+ {
+ /* If parent equals to obj, it is not necessary to go upper.
+ So the top down logic would be better than NULL return. */
+ if (smart_parent == obj)
+ return _accessible_at_point_top_down_get(obj, _pd, screen_coords, x, y);
+
+ Evas_Object *ao = elm_access_object_get(smart_parent);
+ if (ao) return ao;
+
+ if (eo_isa(smart_parent, ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN))
+ {
+ Eina_Bool acceptable = EINA_FALSE;
+ Eo *item_child;
+ Elm_Atspi_Role role;
+ eo_do(smart_parent, role = elm_interface_atspi_accessible_role_get());
+ switch (role)
+ {
+ case ELM_ATSPI_ROLE_FILLER: /* ex: View of colorselector item is layout */
+ case ELM_ATSPI_ROLE_ICON:
+ case ELM_ATSPI_ROLE_IMAGE:
+ case ELM_ATSPI_ROLE_REDUNDANT_OBJECT:
+ case ELM_ATSPI_ROLE_WINDOW:
+ DBG("Go for parent: %s (%p)\n", evas_object_type_get(smart_parent), smart_parent);
+ break;
+
+ case ELM_ATSPI_ROLE_LIST:
+ item_child = _item_at_point_get(smart_parent, x, y);
+ if (TIZEN_PROFILE_WEARABLE)
+ {
+ item_child = _child_object_at_point_get(item_child, x, y);
+ return item_child;
+ }
+ return item_child;
+ break;
+
+ default:
+ acceptable = EINA_TRUE;
+ break;
+ }
+
+ if (acceptable) return smart_parent;
+ }
+
+ smart_parent = _parent_get(smart_parent);
+ }
+ }
+ return _accessible_at_point_top_down_get(obj, _pd, screen_coords, x, y);
+}
//
//TIZEN_ONLY(20150709) add relations atpi
{
elm_atspi_relation_set_relation_remove(&sd->atspi_custom_relations, type, relation_obj);
}
-///////////////////////////////////
+//
//TIZEN_ONLY(20150731) : add i18n support for name and description
EOLIAN static void
{
return _pd->atspi_translation_domain;
}
-///
+
+//TIZEN_ONLY(20160726): add API elm_atspi_accessible_can_highlight_set/get
+static Eina_Bool
+_children_highlight_check(Eo *obj)
+{
+ Eina_List *children, *l;
+ Eo *child;
+
+ if (_elm_object_accessibility_currently_highlighted_get() == (void *)obj)
+ {
+ eo_do(obj, elm_interface_atspi_component_highlight_clear());
+ return EINA_TRUE;
+ }
+
+ eo_do(obj, children = elm_interface_atspi_accessible_children_get());
+ EINA_LIST_FOREACH(children, l, child)
+ {
+ if (_children_highlight_check(child)) return EINA_TRUE;
+ }
+
+ return EINA_FALSE;
+}
+
+EOLIAN static void
+_elm_widget_elm_interface_atspi_accessible_can_highlight_set(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *_pd, Eina_Bool can_highlight)
+{
+ if (!can_highlight) _children_highlight_check(obj);
+ _pd->can_highlight = !!can_highlight;
+}
+
+EOLIAN static Eina_Bool
+_elm_widget_elm_interface_atspi_accessible_can_highlight_get(Eo *obj, Elm_Widget_Smart_Data *_pd EINA_UNUSED)
+{
+ return _elm_widget_highlightable(obj);
+}
+
+EOLIAN static void
+_elm_widget_item_elm_interface_atspi_accessible_can_highlight_set(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data *_pd, Eina_Bool can_highlight)
+{
+ if (!can_highlight) _children_highlight_check(obj);
+ _pd->can_highlight = !!can_highlight;
+}
+
+EOLIAN static Eina_Bool
+_elm_widget_item_elm_interface_atspi_accessible_can_highlight_get(Eo *obj, Elm_Widget_Item_Data *_pd EINA_UNUSED)
+{
+ return _elm_widget_item_highlightable(obj);
+}
+//
+
+//TIZEN_ONLY(20160622): Override Paragraph Direction APIs
+static void
+_elm_widget_evas_object_paragraph_direction_set_internal(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *sd, Evas_BiDi_Direction dir)
+{
+ Evas_Object *child;
+ Eina_List *l;
+
+ if (sd->on_destroy) return;
+
+ EINA_LIST_FOREACH(sd->subobjs, l, child)
+ {
+ if (_elm_widget_is(child))
+ {
+ Elm_Widget_Smart_Data *sdc = eo_data_scope_get(child, MY_CLASS);
+
+ if (sdc->inherit_paragraph_direction &&
+ (sdc->paragraph_direction != dir))
+ {
+ sdc->paragraph_direction = dir;
+ _elm_widget_evas_object_paragraph_direction_set_internal(child, sdc, dir);
+ eo_do_super(child, MY_CLASS, evas_obj_paragraph_direction_set(dir));
+ }
+ }
+
+ /* FIXME: There is no way to handle non-widget child object.
+ * If a non-widget child object has smart parent, it will get the direction
+ * from the smart parent. */
+ }
+}
+
+EOLIAN static void
+_elm_widget_evas_object_paragraph_direction_set(Eo *obj, Elm_Widget_Smart_Data *sd, Evas_BiDi_Direction dir)
+{
+ if ((!(sd->inherit_paragraph_direction) && (sd->paragraph_direction == dir)) ||
+ (sd->inherit_paragraph_direction && (dir == EVAS_BIDI_DIRECTION_INHERIT)))
+ return;
+
+ if (dir == EVAS_BIDI_DIRECTION_INHERIT)
+ {
+ sd->inherit_paragraph_direction = EINA_TRUE;
+ Evas_BiDi_Direction parent_dir = EVAS_BIDI_DIRECTION_NEUTRAL;
+
+ if (sd->parent_obj)
+ parent_dir = evas_object_paragraph_direction_get(sd->parent_obj);
+
+ if (parent_dir != sd->paragraph_direction)
+ {
+ sd->paragraph_direction = parent_dir;
+ _elm_widget_evas_object_paragraph_direction_set_internal(obj, sd, parent_dir);
+ }
+ }
+ else
+ {
+ sd->inherit_paragraph_direction = EINA_FALSE;
+ sd->paragraph_direction = dir;
+ _elm_widget_evas_object_paragraph_direction_set_internal(obj, sd, dir);
+ }
+
+ eo_do_super(obj, MY_CLASS, evas_obj_paragraph_direction_set(dir));
+}
+//
+
+
+//TIZEN_ONLY(20161013): clean up elm color class feature
+void
+_edje_color_class_free(void *data)
+{
+ Edje_Color_Class *cc = data;
+
+ if (cc->name) eina_stringshare_del(cc->name);
+ free(cc);
+}
+
+Eina_Stringshare *
+_elm_widget_edje_class_get(const Eo_Class *klass, const char *style, const char *part)
+{
+ Eina_Strbuf *buf;
+ Eina_Stringshare *str;
+
+ buf = eina_strbuf_new();
+
+ eina_strbuf_append(buf, strchr(eo_class_name_get(klass), '_') + 1);
+ eina_strbuf_tolower(buf);
+
+ if (style)
+ {
+ eina_strbuf_append_printf(buf, "/%s/%s", style, part);
+ }
+ else
+ {
+ eina_strbuf_append_printf(buf, "/%s", part);
+ }
+
+ str = eina_stringshare_add(eina_strbuf_string_get(buf));
+
+ eina_strbuf_free(buf);
+ return str;
+}
+
+/* TIZEN_ONLY(20161025): Apply color_class parent-child relationship */
+Eina_Bool
+_elm_widget_color_class_set_internal(Evas_Object *obj, Evas_Object *edje, const char *color_class,
+ int r, int g, int b, int a,
+ int r2, int g2, int b2, int a2,
+ int r3, int g3, int b3, int a3)
+{
+ Eina_Bool int_ret = EINA_TRUE;
+ Eina_Stringshare *buf;
+ int temp_color[3][4] = { { r, g, b, a },
+ { r2, g2, b2, a2 },
+ { r3, g3, b3, a3 } };
+
+ if (!color_class) return EINA_FALSE;
+
+ buf = _elm_widget_edje_class_get(eo_class_get(obj), NULL, color_class);
+
+#define TEMP_COLOR(x, y) \
+ ((temp_color[x][y] == -1) ? &temp_color[x][y] : NULL)
+
+ edje_object_color_class_get(edje, buf,
+ TEMP_COLOR(0, 0), TEMP_COLOR(0, 1), TEMP_COLOR(0, 2), TEMP_COLOR(0, 3),
+ TEMP_COLOR(1, 0), TEMP_COLOR(1, 1), TEMP_COLOR(1, 2), TEMP_COLOR(1, 3),
+ TEMP_COLOR(2, 0), TEMP_COLOR(2, 1), TEMP_COLOR(2, 2), TEMP_COLOR(2, 3));
+
+#undef TEMP_COLOR
+
+#define TEMP_COLOR(x, y) \
+ ((temp_color[x][y] == -1) ? 0 : temp_color[x][y])
+
+ int_ret &= edje_object_color_class_set(edje, buf,
+ TEMP_COLOR(0, 0), TEMP_COLOR(0, 1), TEMP_COLOR(0, 2), TEMP_COLOR(0, 3),
+ TEMP_COLOR(1, 0), TEMP_COLOR(1, 1), TEMP_COLOR(1, 2), TEMP_COLOR(1, 3),
+ TEMP_COLOR(2, 0), TEMP_COLOR(2, 1), TEMP_COLOR(2, 2), TEMP_COLOR(2, 3));
+
+#undef TEMP_COLOR
+
+ eina_stringshare_del(buf);
+
+ return int_ret;
+}
+
+Eina_Bool
+_elm_widget_color_class_get_internal(Evas_Object *obj, Evas_Object *edje, const char *color_class,
+ int *r, int *g, int *b, int *a,
+ int *r2, int *g2, int *b2, int *a2,
+ int *r3, int *g3, int *b3, int *a3)
+{
+ Eina_Bool int_ret = EINA_TRUE;
+ Eina_Stringshare *buf;
+
+ if (!color_class) return EINA_FALSE;
+
+ buf = _elm_widget_edje_class_get(eo_class_get(obj), elm_widget_style_get(obj), color_class);
+
+ int_ret &= edje_object_color_class_get(edje, buf,
+ r, g, b, a,
+ r2, g2, b2, a2,
+ r3, g3, b3, a3);
+
+ eina_stringshare_del(buf);
+
+ return int_ret;
+}
+/* END */
+
+EOLIAN Eina_Bool
+_elm_widget_class_color_set(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSED, const char *color_class, int r, int g, int b, int a)
+{
+ Evas_Object *edje;
+ Eina_Bool int_ret = EINA_TRUE;
+
+ if (!eo_isa(obj, ELM_LAYOUT_CLASS)) return EINA_FALSE;
+
+ edje = elm_layout_edje_get(obj);
+ int_ret &= _elm_widget_color_class_set_internal(obj, edje, color_class,
+ r, g, b, a,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1);
+
+ return int_ret;
+}
+
+EOLIAN Eina_Bool
+_elm_widget_class_color_get(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSED, const char *color_class, int *r, int *g, int *b, int *a)
+{
+ Evas_Object *edje;
+ Eina_Bool int_ret = EINA_TRUE;
+
+ if (!eo_isa(obj, ELM_LAYOUT_CLASS)) return EINA_FALSE;
+
+ edje = elm_layout_edje_get(obj);
+ int_ret &= _elm_widget_color_class_get_internal(obj, edje, color_class,
+ r, g, b, a,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL);
+
+ return int_ret;
+}
+
+EOLIAN Eina_Bool
+_elm_widget_class_color2_set(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSED, const char *color_class, int r, int g, int b, int a)
+{
+ Evas_Object *edje;
+ Eina_Bool int_ret = EINA_TRUE;
+
+ if (!eo_isa(obj, ELM_LAYOUT_CLASS)) return EINA_FALSE;
+
+ edje = elm_layout_edje_get(obj);
+ int_ret &= _elm_widget_color_class_set_internal(obj, edje, color_class,
+ -1, -1, -1, -1,
+ r, g, b, a,
+ -1, -1, -1, -1);
+
+ return int_ret;
+}
+
+EOLIAN Eina_Bool
+_elm_widget_class_color2_get(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSED, const char *color_class, int *r, int *g, int *b, int *a)
+{
+ Evas_Object *edje;
+ Eina_Bool int_ret = EINA_TRUE;
+
+ if (!eo_isa(obj, ELM_LAYOUT_CLASS)) return EINA_FALSE;
+
+ edje = elm_layout_edje_get(obj);
+ int_ret &= _elm_widget_color_class_get_internal(obj, edje, color_class,
+ NULL, NULL, NULL, NULL,
+ r, g, b, a,
+ NULL, NULL, NULL, NULL);
+
+ return int_ret;
+}
+
+EOLIAN Eina_Bool
+_elm_widget_class_color3_set(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSED, const char *color_class, int r, int g, int b, int a)
+{
+ Evas_Object *edje;
+ Eina_Bool int_ret = EINA_TRUE;
+
+ if (!eo_isa(obj, ELM_LAYOUT_CLASS)) return EINA_FALSE;
+
+ edje = elm_layout_edje_get(obj);
+ int_ret &= _elm_widget_color_class_set_internal(obj, edje, color_class,
+ -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ r, g, b, a);
+
+ return int_ret;
+}
+
+EOLIAN Eina_Bool
+_elm_widget_class_color3_get(Eo *obj, Elm_Widget_Smart_Data *sd EINA_UNUSED, const char *color_class, int *r, int *g, int *b, int *a)
+{
+ Evas_Object *edje;
+ Eina_Bool int_ret = EINA_TRUE;
+
+ if (!eo_isa(obj, ELM_LAYOUT_CLASS)) return EINA_FALSE;
+
+ edje = elm_layout_edje_get(obj);
+ int_ret &= _elm_widget_color_class_get_internal(obj, edje, color_class,
+ NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL,
+ r, g, b, a);
+
+ return int_ret;
+}
+
+EOLIAN void
+_elm_widget_class_color_del(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *sd, const char *color_class)
+{
+ Eina_Stringshare *buf;
+
+ if (!eo_isa(obj, ELM_LAYOUT_CLASS)) return;
+
+ buf = _elm_widget_edje_class_get(eo_class_get(obj), NULL, color_class);
+ edje_object_color_class_del(sd->resize_obj, buf);
+ eina_stringshare_del(buf);
+}
+
+EOLIAN void
+_elm_widget_class_color_clear(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *sd)
+{
+ if (!eo_isa(obj, ELM_LAYOUT_CLASS)) return;
+ edje_object_color_class_clear(sd->resize_obj);
+}
+
+#define ELM_COLOR_CLASS_UPDATE(obj, hash, cond) \
+ Evas_Object *edje = NULL; \
+ Eina_Iterator *itr; \
+ Edje_Color_Class *cc; \
+ Eina_Bool int_ret = EINA_TRUE; \
+ if (cond) return EINA_FALSE; \
+ if (eo_isa(obj, ELM_LAYOUT_CLASS)) \
+ edje = elm_layout_edje_get(obj); \
+ else if (eo_isa(obj, EDJE_OBJECT_CLASS)) \
+ edje = obj; \
+ if (!edje) return EINA_FALSE; \
+ itr = eina_hash_iterator_data_new(hash); \
+ EINA_ITERATOR_FOREACH(itr, cc) \
+ { \
+ int_ret &= edje_object_color_class_set(edje, cc->name, \
+ cc->r, cc->g, cc->b, cc->a, \
+ cc->r2, cc->g2, cc->b2, cc->a2, \
+ cc->r3, cc->g3, cc->b3, cc->a3); \
+ } \
+ eina_iterator_free(itr); \
+ return int_ret
+
+
+#define CHECK_BOUND(x) \
+ if (x > 0xff) x = 0xff; \
+ else if (x < 0) x = 0
+
+#define ELM_COLOR_CLASS_SET_START(obj, cr, cg, cb, ca) \
+ Eina_Bool int_ret = EINA_FALSE; \
+ Edje_Color_Class *cc = NULL; \
+ Eina_Stringshare *buf; \
+ buf = _elm_widget_edje_class_get(eo_class_get(obj), NULL, color_class); \
+ CHECK_BOUND(r); \
+ CHECK_BOUND(g); \
+ CHECK_BOUND(b); \
+ CHECK_BOUND(a); \
+ _elm_color_unpremul(a, &r, &g, &b); \
+ if (!sd->color_classes) \
+ sd->color_classes = eina_hash_string_small_new(_edje_color_class_free); \
+ else \
+ cc = eina_hash_find(sd->color_classes, buf); \
+ if (!cc) \
+ { \
+ cc = calloc(1, sizeof(Edje_Color_Class)); \
+ cc->name = eina_stringshare_add(buf); \
+ if (!cc->name) \
+ { \
+ free(cc); \
+ eina_stringshare_del(buf); \
+ return EINA_FALSE; \
+ } \
+ eina_hash_direct_add(sd->color_classes, cc->name, cc); \
+ } \
+ else if ((cc->cr == r) && (cc->cg == g) && \
+ (cc->cb == b) && (cc->ca == a)) \
+ { \
+ eina_stringshare_del(buf); \
+ return EINA_TRUE; \
+ } \
+ cc->cr = r; \
+ cc->cg = g; \
+ cc->cb = b; \
+ cc->ca = a; \
+ int_ret = EINA_TRUE
+
+#define ELM_COLOR_CLASS_SET_END() \
+ eina_stringshare_del(buf); \
+ return int_ret
+
+#define ELM_COLOR_CLASS_GET(obj, cr, cg, cb, ca) \
+ Eina_Bool int_ret = EINA_FALSE; \
+ Edje_Color_Class *cc; \
+ Eina_Stringshare *buf; \
+ int alpha = 0; \
+ buf = _elm_widget_edje_class_get(eo_class_get(obj), NULL, color_class); \
+ if ((!sd->color_classes) || !(cc = eina_hash_find(sd->color_classes, buf))) \
+ { \
+ if (r) *r = 0; \
+ if (g) *g = 0; \
+ if (b) *b = 0; \
+ if (a) *a = 0; \
+ int_ret = EINA_FALSE; \
+ } \
+ else \
+ { \
+ if (r) *r = cc->cr; \
+ if (g) *g = cc->cg; \
+ if (b) *b = cc->cb; \
+ if (a) *a = cc->ca; \
+ alpha = cc->ca; \
+ int_ret = EINA_TRUE; \
+ } \
+ _elm_color_premul(alpha, r, g, b); \
+ eina_stringshare_del(buf); \
+ return int_ret
+
+Eina_Bool
+_elm_widget_item_color_class_update(Elm_Widget_Item_Data *sd)
+{
+ ELM_COLOR_CLASS_UPDATE(sd->view, sd->color_classes, (!sd) || (!sd->color_classes) || (!sd->view));
+}
+
+EOLIAN Eina_Bool
+_elm_widget_item_class_color_set(Eo *obj, Elm_Widget_Item_Data *sd, const char *color_class, int r, int g, int b, int a)
+{
+ ELM_COLOR_CLASS_SET_START(obj, r, g, b, a);
+
+ int_ret &= _elm_widget_item_color_class_update(sd);
+
+ ELM_COLOR_CLASS_SET_END();
+}
+
+EOLIAN Eina_Bool
+_elm_widget_item_class_color_get(Eo *obj, Elm_Widget_Item_Data *sd, const char *color_class, int *r, int *g, int *b, int *a)
+{
+ ELM_COLOR_CLASS_GET(obj, r, g, b, a);
+}
+
+EOLIAN Eina_Bool
+_elm_widget_item_class_color2_set(Eo *obj, Elm_Widget_Item_Data *sd, const char *color_class, int r, int g, int b, int a)
+{
+ ELM_COLOR_CLASS_SET_START(obj, r2, g2, b2, a2);
+
+ int_ret &= _elm_widget_item_color_class_update(sd);
+
+ ELM_COLOR_CLASS_SET_END();
+}
+
+EOLIAN Eina_Bool
+_elm_widget_item_class_color2_get(Eo *obj, Elm_Widget_Item_Data *sd, const char *color_class, int *r, int *g, int *b, int *a)
+{
+ ELM_COLOR_CLASS_GET(obj, r2, g2, b2, a2);
+}
+
+EOLIAN Eina_Bool
+_elm_widget_item_class_color3_set(Eo *obj, Elm_Widget_Item_Data *sd, const char *color_class, int r, int g, int b, int a)
+{
+ ELM_COLOR_CLASS_SET_START(obj, r3, g3, b3, a3);
+
+ int_ret &= _elm_widget_item_color_class_update(sd);
+
+ ELM_COLOR_CLASS_SET_END();
+}
+
+EOLIAN Eina_Bool
+_elm_widget_item_class_color3_get(Eo *obj, Elm_Widget_Item_Data *sd, const char *color_class, int *r, int *g, int *b, int *a)
+{
+ ELM_COLOR_CLASS_GET(obj, r3, g3, b3, a3);
+}
+
+static Evas_Object *
+_elm_widget_item_edje_get(Eo *obj, Elm_Widget_Item_Data *sd)
+{
+ if (!sd)
+ sd = eo_data_scope_get(obj, ELM_WIDGET_ITEM_CLASS);
+
+ if (eo_isa(sd->view, ELM_LAYOUT_CLASS))
+ return elm_layout_edje_get(sd->view);
+ else if (eo_isa(sd->view, EDJE_OBJECT_CLASS))
+ return sd->view;
+
+ return NULL;
+}
+
+EOLIAN void
+_elm_widget_item_class_color_del(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data *sd, const char *color_class)
+{
+ Eina_Stringshare *buf;
+ Evas_Object *edje;
+ Edje_Color_Class *cc = NULL;
+
+ if (!color_class) return;
+
+ buf = _elm_widget_edje_class_get(eo_class_get(obj), NULL, color_class);
+ eina_hash_del(sd->color_classes, buf, cc);
+
+ edje = _elm_widget_item_edje_get(obj, sd);
+ if (edje)
+ edje_object_color_class_del(edje, buf);
+
+ eina_stringshare_del(buf);
+}
+
+EOLIAN void
+_elm_widget_item_class_color_clear(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data *sd)
+{
+ Evas_Object *edje;
+ ELM_SAFE_FREE(sd->color_classes, eina_hash_free);
+
+ edje = _elm_widget_item_edje_get(obj, sd);
+ if (!edje) return;
+
+ edje_object_color_class_clear(edje);
+}
+//
+
+/* TIZEN_ONLY(20161025): Apply color_class parent-child relationship */
+void
+_elm_widget_color_class_parent_set(Evas_Object *obj, Evas_Object *parent)
+{
+ Evas_Object *edje = NULL, *parent_edje = NULL;
+
+ if (!obj || !parent) return;
+
+ if (eo_isa(obj, ELM_LAYOUT_CLASS))
+ edje = elm_layout_edje_get(obj);
+ else if (eo_isa(obj, EDJE_OBJECT_CLASS))
+ edje = obj;
+
+ if (eo_isa(parent, ELM_LAYOUT_CLASS))
+ parent_edje = elm_layout_edje_get(parent);
+ else if (eo_isa(parent, EDJE_OBJECT_CLASS))
+ parent_edje = parent;
+
+ if (!edje || !parent_edje) return;
+
+ edje_object_color_class_parent_set(edje, parent_edje);
+}
+
+void
+_elm_widget_color_class_parent_unset(Evas_Object *obj)
+{
+ Evas_Object *edje = NULL;
+
+ if (!obj) return;
+
+ if (eo_isa(obj, ELM_LAYOUT_CLASS))
+ edje = elm_layout_edje_get(obj);
+ else if (eo_isa(obj, EDJE_OBJECT_CLASS))
+ edje = obj;
+
+ if (!edje) return;
+
+ edje_object_color_class_parent_unset(edje);
+}
+/* END */
+
+//TIZEN_ONLY(20160527): widget: add AtspiAction interface to all widgets and widget_items, add handlers for reading stopped/cancelled
+EOLIAN const Elm_Atspi_Action *
+_elm_widget_elm_interface_atspi_widget_action_elm_actions_get(Eo *obj EINA_UNUSED, Elm_Widget_Smart_Data *pd EINA_UNUSED)
+{
+ return NULL;
+}
+
+EOLIAN const Elm_Atspi_Action *
+_elm_widget_item_elm_interface_atspi_widget_action_elm_actions_get(Eo *obj EINA_UNUSED, Elm_Widget_Item_Data *pd EINA_UNUSED)
+{
+ return NULL;
+}
+//
#include "elm_widget_item.eo.c"
#include "elm_widget.eo.c"