elementary: use Edje to enable accessibility on TEXTBLOCK.

Patch by Kim Shinwoo <kimcinoo.efl@gmail.com>.


SVN revision: 72841
This commit is contained in:
Cedric BAIL 2012-06-26 05:54:45 +00:00
parent b5e474ebb1
commit d78b70af51
7 changed files with 192 additions and 30 deletions

View File

@ -84,7 +84,7 @@
the items over max number are located in more panel. the items over max number are located in more panel.
The APIs are added for this feature.(elm_toolbar_more_item_get, elm_toolbar_items_max_set/get) The APIs are added for this feature.(elm_toolbar_more_item_get, elm_toolbar_items_max_set/get)
2012-05-22 Carsten Haitzler (The Rasterman) 2012-05-22 Carsten Haitzler (The Rasterman)
* Add skeleton for handling remote commands access controls. * Add skeleton for handling remote commands access controls.
@ -92,46 +92,46 @@
* Map: Add elm_map_overlays_get & elm_map_overlay_visible_get functions. * Map: Add elm_map_overlays_get & elm_map_overlay_visible_get functions.
2012-05-24 Michal Pakula vel Rutka 2012-05-24 Michal Pakula vel Rutka
* Add ability to use cnp helper code on non-elm widget objects by * Add ability to use cnp helper code on non-elm widget objects by
falling back to ecore-evas to get the window id. falling back to ecore-evas to get the window id.
2012-05-24 Tae-Hwan Kim (Bluezery) 2012-05-24 Tae-Hwan Kim (Bluezery)
* Add "loaded" signal for elm_map. * Add "loaded" signal for elm_map.
2012-05-25 Rob Bradford 2012-05-25 Rob Bradford
* Refactor X11 specific code to use ecore_evas_*_window_get functions * Refactor X11 specific code to use ecore_evas_*_window_get functions
so that the driver for the Ecore_Evas will be checked. so that the driver for the Ecore_Evas will be checked.
2012-05-28 Mike Blumenkrantz 2012-05-28 Mike Blumenkrantz
* Fix sizing calc error in list item homogenizing * Fix sizing calc error in list item homogenizing
2012-05-28 Carsten Haitzler (The Rasterman) 2012-05-28 Carsten Haitzler (The Rasterman)
* Made elm_object_focus_set() fall back to evbas_object_focus_set() * Made elm_object_focus_set() fall back to evbas_object_focus_set()
if the object is not an elm widget. if the object is not an elm widget.
2012-05-29 Mike Blumenkrantz 2012-05-29 Mike Blumenkrantz
* Prepending items to a genlist no longer causes the selected item to * Prepending items to a genlist no longer causes the selected item to
scroll out of the viewport scroll out of the viewport
* Collapsing tree items in genlist now animate properly * Collapsing tree items in genlist now animate properly
2012-05-29 Rob Bradford 2012-05-29 Rob Bradford
* Move X related window items into their own substruct of * Move X related window items into their own substruct of
_Elm_Win_Smart_Data to allow grouping based on engine. _Elm_Win_Smart_Data to allow grouping based on engine.
2012-05-29 Rob Bradford 2012-05-29 Rob Bradford
* Move X related cursor items into their own substruct of Elm_Cursor * Move X related cursor items into their own substruct of Elm_Cursor
to make supporting cursors on other platforms cleaner. to make supporting cursors on other platforms cleaner.
2012-05-30 Rob Bradford 2012-05-30 Rob Bradford
* Add support for setting the cursor under Wayland: * Add support for setting the cursor under Wayland:
* Introduce a configure option and #define to as per other engines * Introduce a configure option and #define to as per other engines
@ -140,91 +140,94 @@
* Call into Ecore to set the cursor when the mouse enters the desired * Call into Ecore to set the cursor when the mouse enters the desired
widget. widget.
2012-05-30 Mike Blumenkrantz 2012-05-30 Mike Blumenkrantz
* Fix even/odd signals for genlist items * Fix even/odd signals for genlist items
2012-05-30 Thiep Ha 2012-05-30 Thiep Ha
* Entry: Add 3 APIs which are elm_entry_text_style_user_push/pop/peek * Entry: Add 3 APIs which are elm_entry_text_style_user_push/pop/peek
and test functions for these APIs. and test functions for these APIs.
2012-05-31 WooHyun Jung 2012-05-31 WooHyun Jung
* child_can_focus should be EINA_FALSE only when all children in the object * child_can_focus should be EINA_FALSE only when all children in the object
tree are not focusable. Before this fix, it was EINA_FALSE when all sub tree are not focusable. Before this fix, it was EINA_FALSE when all sub
objects were not focusable. (i.e. didn't check whole object tree) objects were not focusable. (i.e. didn't check whole object tree)
2012-06-01 Mike Blumenkrantz 2012-06-01 Mike Blumenkrantz
* Re-setting the current mirrored mode state no longer causes a full recalc * Re-setting the current mirrored mode state no longer causes a full recalc
2012-06-07 Jaehwan Kim 2012-06-07 Jaehwan Kim
* Toolbar: Remove the APIs elm_toolbar_items_max_set/get. * Toolbar: Remove the APIs elm_toolbar_items_max_set/get.
Instead of them, add the APIs elm_toolbar_standard_priority_set/get. Instead of them, add the APIs elm_toolbar_standard_priority_set/get.
The items which are lower than standard priority are located in more menu or panel. The items which are lower than standard priority are located in more menu or panel.
2012-06-08 Jaehwan Kim 2012-06-08 Jaehwan Kim
* Add elm_object_scroll_hold/freeze_get. * Add elm_object_scroll_hold/freeze_get.
2012-06-12 ChunEon Park(Hermet) 2012-06-12 ChunEon Park (Hermet)
* Fixed Transit wipe effect flickering. * Fixed Transit wipe effect flickering.
2012-06-12 Carsten Haitzler (The Rasterman) 2012-06-12 Carsten Haitzler (The Rasterman)
* Add elm_win_size_base_set/get, elm_win_size_step_set/get for hinting * Add elm_win_size_base_set/get, elm_win_size_step_set/get for hinting
sizing of windows. Useful for terminals. sizing of windows. Useful for terminals.
2012-06-12 Mike Blumenkrantz 2012-06-12 Mike Blumenkrantz
* Map no longer saves its files to directories outside of the user's home directory * Map no longer saves its files to directories outside of the user's home directory
2012-06-14 Seunggyun Kim 2012-06-14 Seunggyun Kim
* Fix elm_config_font_overlay_apply() to also apply rescaling properly. * Fix elm_config_font_overlay_apply() to also apply rescaling properly.
2012-06-14 Jaehwan Kim 2012-06-14 Jaehwan Kim
* Toolbar : Add the reorder feature when the more panel is shown. * Toolbar : Add the reorder feature when the more panel is shown.
After the item is long-pressed, it can be moved. After the item is long-pressed, it can be moved.
2012-06-14 Michael Bouchaud 2012-06-14 Michael Bouchaud
* Add an enum to Elm_Calendar_Mark_Repeat_Type: * Add an enum to Elm_Calendar_Mark_Repeat_Type:
ELM_CALENDAR_LAST_DAY_OF_MONTH ELM_CALENDAR_LAST_DAY_OF_MONTH
2012-06-15 Michael Bouchaud 2012-06-15 Michael Bouchaud
* elm_progressbar: elm_progressbar_format_function_set to add a callback * elm_progressbar: elm_progressbar_format_function_set to add a callback
function to format the unit string. function to format the unit string.
2012-06-16 Davide Andreoli 2012-06-16 Davide Andreoli
* elm_map: add elm_map_overlay_del_cb_set to be notify when * elm_map: add elm_map_overlay_del_cb_set to be notify when
an overlay is deleted. an overlay is deleted.
2012-06-21 Daniel Juyung Seo (SeoZ) 2012-06-21 Daniel Juyung Seo (SeoZ)
* Genlist: Fixed a bug with decorate all mode + tree effect. Delete tree * Genlist: Fixed a bug with decorate all mode + tree effect. Delete tree
effect animator and set the effect mode to none when decorate all mode is effect animator and set the effect mode to none when decorate all mode is
set. set.
2012-06-23 Daniel Willmann 2012-06-23 Daniel Willmann
* elm_progressbar: Add "changed" signal to be emitted when the value * elm_progressbar: Add "changed" signal to be emitted when the value
is changed. is changed.
2012-06-25 Daniel Juyung Seo (SeoZ) 2012-06-25 Daniel Juyung Seo (SeoZ)
* Genlist: Fixed tree expand bug. Check item type when an item is requested * Genlist: Fixed tree expand bug. Check item type when an item is requested
to be expanded/contracted. to be expanded/contracted.
2012-06-25 Carsten Haitzler (The Rasterman) 2012-06-25 Carsten Haitzler (The Rasterman)
* add elm_cnp_selection_loss_callback_set() so you know when you * add elm_cnp_selection_loss_callback_set() so you know when you
lose a selection as a client lose a selection as a client
* improve robustness of cnp to track target object deletions. * improve robustness of cnp to track target object deletions.
2012-06-26 Shinwoo Kim (kimcinoo)
* Use Edje to enable accessibility on TEXTBLOCK.

View File

@ -15,6 +15,7 @@ Additions:
* Add elm_progressbar_format_function_set API function * Add elm_progressbar_format_function_set API function
* Add elm_map_overlay_del_cb_set API function * Add elm_map_overlay_del_cb_set API function
* Add "changed" signal to the progressbar widgets * Add "changed" signal to the progressbar widgets
* Use Edje to enable accessibility on TEXTBLOCK.
Fixes: Fixes:

View File

@ -1,6 +1,44 @@
#include <Elementary.h> #include <Elementary.h>
#include "elm_priv.h" #include "elm_priv.h"
static const char ACCESS_SMART_NAME[] = "elm_access";
EVAS_SMART_SUBCLASS_NEW
(ACCESS_SMART_NAME, _elm_access, Elm_Widget_Smart_Class,
Elm_Widget_Smart_Class, elm_widget_smart_class_get, NULL);
static Evas_Object * _elm_access_add(Evas_Object *parent);
static void
_elm_access_smart_add(Evas_Object *obj)
{
EVAS_SMART_DATA_ALLOC(obj, Elm_Widget_Smart_Data);
ELM_WIDGET_CLASS(_elm_access_parent_sc)->base.add(obj);
elm_widget_can_focus_set(obj, EINA_TRUE);
}
static Eina_Bool
_elm_access_smart_on_focus(Evas_Object *obj)
{
evas_object_focus_set(obj, elm_widget_focus_get(obj));
return EINA_TRUE;
}
static void
_elm_access_smart_set_user(Elm_Widget_Smart_Class *sc)
{
sc->base.add = _elm_access_smart_add;
/* not a 'focus chain manager' */
sc->focus_next = NULL;
sc->focus_direction = NULL;
sc->on_focus = _elm_access_smart_on_focus;
return;
}
typedef struct _Mod_Api Mod_Api; typedef struct _Mod_Api Mod_Api;
struct _Mod_Api struct _Mod_Api
@ -197,6 +235,11 @@ _access_obj_hilight_resize_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Ob
//-------------------------------------------------------------------------// //-------------------------------------------------------------------------//
EAPI void
_elm_access_highlight_set(Evas_Object* obj)
{
_access_obj_over_timeout_cb(obj);
}
EAPI void EAPI void
_elm_access_clear(Elm_Access_Info *ac) _elm_access_clear(Elm_Access_Info *ac)
@ -383,6 +426,92 @@ _elm_access_object_unhilight(Evas_Object *obj)
} }
} }
static void
_content_resize(void *data, Evas *e __UNUSED__, Evas_Object *obj,
void *event_info __UNUSED__)
{
Evas_Object *accessobj;
Evas_Coord w, h;
accessobj = data;
if (!accessobj) return;
evas_object_geometry_get(obj, NULL, NULL, &w, &h);
evas_object_resize(accessobj, w, h);
}
static void
_content_move(void *data, Evas *e __UNUSED__, Evas_Object *obj,
void *event_info __UNUSED__)
{
Evas_Object *accessobj;
Evas_Coord x, y;
accessobj = data;
if (!accessobj) return;
evas_object_geometry_get(obj, &x, &y, NULL, NULL);
evas_object_move(accessobj, x, y);
}
static char *
_part_access_info_cb(void *data, Evas_Object *obj,
Elm_Widget_Item *item __UNUSED__)
{
Evas_Object *eobj = data;
if (!eobj) return NULL;
const char *part = evas_object_data_get(obj, "_elm_access_part");
const char *txt = edje_object_part_text_get(eobj, part);
if (txt) return strdup(txt);
return NULL;
}
static void
_access_obj_del(void *data __UNUSED__, Evas *e __UNUSED__,
Evas_Object *obj, void *event_info __UNUSED__)
{
char *part = evas_object_data_get(obj, "_elm_access_part");
evas_object_data_del(obj, "_elm_access_part");
if (part) free(part);
}
EAPI Evas_Object *
_elm_access_edje_object_part_object_register(Evas_Object* obj,
const Evas_Object *eobj,
const char* part)
{
Evas_Object *ao;
Evas_Object *po = (Evas_Object *)edje_object_part_object_get(eobj, part);
Evas_Coord x, y, w, h;
if (!obj || !po) return NULL;
// create access object
ao = _elm_access_add(obj);
evas_object_event_callback_add(po, EVAS_CALLBACK_RESIZE,
_content_resize, ao);
evas_object_event_callback_add(po, EVAS_CALLBACK_MOVE,
_content_move, ao);
evas_object_geometry_get(po, &x, &y, &w, &h);
evas_object_move(ao, x, y);
evas_object_resize(ao, w, h);
evas_object_show(ao);
// register access object
_elm_access_object_register(ao, po);
_elm_access_text_set(_elm_access_object_get(ao),
ELM_ACCESS_TYPE, evas_object_type_get(po));
evas_object_data_set(ao, "_elm_access_part", strdup(part));
evas_object_event_callback_add(ao, EVAS_CALLBACK_DEL,
_access_obj_del, NULL);
_elm_access_callback_set(_elm_access_object_get(ao),
ELM_ACCESS_INFO,
_part_access_info_cb, eobj);
return ao;
}
EAPI void EAPI void
_elm_access_object_hilight_disable(Evas *e) _elm_access_object_hilight_disable(Evas *e)
{ {
@ -534,3 +663,22 @@ _elm_access_2nd_click_timeout(Evas_Object *obj)
_access_2nd_click_del_cb, NULL); _access_2nd_click_del_cb, NULL);
return EINA_FALSE; return EINA_FALSE;
} }
static Evas_Object *
_elm_access_add(Evas_Object *parent)
{
Evas *e;
Evas_Object *obj;
EINA_SAFETY_ON_NULL_RETURN_VAL(parent, NULL);
e = evas_object_evas_get(parent);
if (!e) return NULL;
obj = evas_object_smart_add(e, _elm_access_smart_class_new());
if (!elm_widget_sub_object_add(parent, obj))
ERR("could not add %p as sub object of %p", obj, parent);
return obj;
}

View File

@ -657,6 +657,10 @@ _elm_layout_smart_text_set(Evas_Object *obj,
ELM_LAYOUT_CLASS(ELM_WIDGET_DATA(sd)->api)->sizing_eval(obj); ELM_LAYOUT_CLASS(ELM_WIDGET_DATA(sd)->api)->sizing_eval(obj);
if (_elm_config->access_mode == ELM_ACCESS_MODE_ON && !(sub_d->obj))
sub_d->obj = _elm_access_edje_object_part_object_register
(obj, elm_layout_edje_get(obj), part);
return EINA_TRUE; return EINA_TRUE;
} }

View File

@ -1425,8 +1425,9 @@ _elm_toolbar_item_icon_update(Elm_Toolbar_Item *item)
Evas_Object *old_icon = edje_object_part_swallow_get(VIEW(item), Evas_Object *old_icon = edje_object_part_swallow_get(VIEW(item),
"elm.swallow.icon"); "elm.swallow.icon");
elm_widget_sub_object_del(VIEW(item), old_icon); elm_widget_sub_object_del(VIEW(item), old_icon);
evas_object_hide(old_icon); /* edje_object_part_unswallow(VIEW(item), old_icon); */
edje_object_part_swallow(VIEW(item), "elm.swallow.icon", item->icon); edje_object_part_swallow(VIEW(item), "elm.swallow.icon", item->icon);
evas_object_hide(old_icon);
elm_coords_finger_size_adjust(1, &mw, 1, &mh); elm_coords_finger_size_adjust(1, &mw, 1, &mh);
edje_object_size_min_restricted_calc(VIEW(item), &mw, &mh, mw, mh); edje_object_size_min_restricted_calc(VIEW(item), &mw, &mh, mw, mh);
elm_coords_finger_size_adjust(1, &mw, 1, &mh); elm_coords_finger_size_adjust(1, &mw, 1, &mh);

View File

@ -839,6 +839,9 @@ _parent_focus(Evas_Object *obj)
_elm_widget_focus_region_show(obj); _elm_widget_focus_region_show(obj);
} }
sd->focus_order_on_calc = EINA_FALSE; sd->focus_order_on_calc = EINA_FALSE;
if (_elm_config->access_mode == ELM_ACCESS_MODE_ON)
_elm_access_highlight_set(obj);
} }
static void static void

View File

@ -551,6 +551,8 @@ EAPI void _elm_access_object_register(Evas_Object *obj, Evas_Object
EAPI void _elm_access_item_unregister(Elm_Widget_Item *item); EAPI void _elm_access_item_unregister(Elm_Widget_Item *item);
EAPI void _elm_access_item_register(Elm_Widget_Item *item, Evas_Object *hoverobj); EAPI void _elm_access_item_register(Elm_Widget_Item *item, Evas_Object *hoverobj);
EAPI Eina_Bool _elm_access_2nd_click_timeout(Evas_Object *obj); EAPI Eina_Bool _elm_access_2nd_click_timeout(Evas_Object *obj);
EAPI void _elm_access_highlight_set(Evas_Object* obj);
EAPI Evas_Object * _elm_access_edje_object_part_object_register(Evas_Object *obj, const Evas_Object *partobj, const char* part);
/**< put this as the first member in your widget item struct */ /**< put this as the first member in your widget item struct */
#define ELM_WIDGET_ITEM Elm_Widget_Item base #define ELM_WIDGET_ITEM Elm_Widget_Item base