Added listening of object:state-changed:highlighted to app_tracker
authorTomasz Olszak <t.olszak@samsung.com>
Mon, 24 Aug 2015 15:53:42 +0000 (17:53 +0200)
committerTomasz Olszak <t.olszak@samsung.com>
Thu, 27 Aug 2015 08:54:44 +0000 (10:54 +0200)
elementary can change highlighted object on its own (e.g fastscroll
can highlight first element in search list). Screen reader needs to update
currently highlighted element in flat navi context.

Change-Id: I4d299d533510b2fab92b2d07dee61c6ef6ed5a19

include/app_tracker.h
src/app_tracker.c
src/flat_navi.c
src/navigator.c
src/screen_reader_gestures.c

index 3845eee..8e2ad7c 100644 (file)
@@ -17,6 +17,7 @@ typedef void (*AppTrackerEventCB)(AtspiAccessible *root, void *user_data);
  * @param user_data pointer passed to cb function.
  */
 void app_tracker_callback_register(AtspiAccessible *app, AppTrackerEventCB cb, void *user_data);
+void app_tracker_new_obj_highlighted_callback_register(AppTrackerEventCB cb);
 
 /**
  * @brief Unregister listener on given event type.
@@ -26,6 +27,7 @@ void app_tracker_callback_register(AtspiAccessible *app, AppTrackerEventCB cb, v
  * @param user_data pointer passed to cb function.
  */
 void app_tracker_callback_unregister(AtspiAccessible *app, AppTrackerEventCB cb, void *user_data);
+void app_tracker_new_obj_highlighted_callback_unregister(AppTrackerEventCB cb);
 
 /**
  * @brief Initialize app tracker module.
index 838d39b..e437d37 100644 (file)
@@ -35,6 +35,7 @@ typedef struct {
 static int _init_count;
 static GList *_roots;
 static AtspiEventListener *_listener;
+static AppTrackerEventCB _new_obj_highlighted_callback;
 
 static int _is_descendant(AtspiAccessible * ancestor, AtspiAccessible * descendant)
 {
@@ -81,6 +82,21 @@ static Eina_Bool _object_has_showing_state(AtspiAccessible * obj)
        return ret;
 }
 
+static Eina_Bool _object_has_highlighted_state(AtspiAccessible * obj)
+{
+       if (!obj)
+               return EINA_FALSE;
+
+       Eina_Bool ret = EINA_FALSE;
+
+       AtspiStateSet *ss = atspi_accessible_get_state_set(obj);
+
+       if (atspi_state_set_contains(ss, ATSPI_STATE_HIGHLIGHTED))
+               ret = EINA_TRUE;
+       g_object_unref(ss);
+       return ret;
+}
+
 static void _subtree_callbacks_call(SubTreeRootData * std)
 {
        DEBUG("START");
@@ -134,6 +150,20 @@ static void _on_atspi_event_cb(const AtspiEvent * event)
 
        _print_event_object_info(event);
 
+       AtspiAccessible *new_highlighted_obj = NULL;
+
+       if (!strcmp(event->type, "object:state-changed:highlighted"))
+               new_highlighted_obj = event->source;
+       else if (!strcmp(event->type, "object:active-descendant-changed"))
+               new_highlighted_obj = atspi_accessible_get_child_at_index(event->source, event->detail1, NULL);
+
+       if (new_highlighted_obj && _new_obj_highlighted_callback && _object_has_highlighted_state(new_highlighted_obj)) {
+               DEBUG("HIGHLIGHTED OBJECT IS ABOUT TO CHANGE");
+               _new_obj_highlighted_callback(new_highlighted_obj, NULL);
+               g_object_unref(new_highlighted_obj);
+               new_highlighted_obj = NULL;
+       }
+
        for (l = _roots; l != NULL; l = l->next) {
                std = l->data;
 
@@ -167,13 +197,16 @@ static void _on_atspi_event_cb(const AtspiEvent * event)
 static int _app_tracker_init_internal(void)
 {
        DEBUG("START");
+       _new_obj_highlighted_callback = NULL;
        _listener = atspi_event_listener_new_simple(_on_atspi_event_cb, NULL);
 
        atspi_event_listener_register(_listener, "object:state-changed:showing", NULL);
        atspi_event_listener_register(_listener, "object:state-changed:visible", NULL);
        atspi_event_listener_register(_listener, "object:state-changed:defunct", NULL);
+       atspi_event_listener_register(_listener, "object:state-changed:highlighted", NULL);
        atspi_event_listener_register(_listener, "object:bounds-changed", NULL);
        atspi_event_listener_register(_listener, "object:visible-data-changed", NULL);
+       atspi_event_listener_register(_listener, "object:active-descendant-changed", NULL);
 
        return 0;
 }
@@ -196,13 +229,15 @@ static void _app_tracker_shutdown_internal(void)
 {
        atspi_event_listener_deregister(_listener, "object:state-changed:showing", NULL);
        atspi_event_listener_deregister(_listener, "object:state-changed:visible", NULL);
+       atspi_event_listener_deregister(_listener, "object:state-changed:highlighted", NULL);
        atspi_event_listener_deregister(_listener, "object:bounds-changed", NULL);
        atspi_event_listener_deregister(_listener, "object:state-changed:defunct", NULL);
        atspi_event_listener_deregister(_listener, "object:visible-data-changed", NULL);
+       atspi_event_listener_deregister(_listener, "object:active-descendant-changed", NULL);
 
        g_object_unref(_listener);
        _listener = NULL;
-
+       _new_obj_highlighted_callback = NULL;
        g_list_free_full(_roots, _free_rootdata);
        _roots = NULL;
 }
@@ -259,6 +294,11 @@ void app_tracker_callback_register(AtspiAccessible * app, AppTrackerEventCB cb,
        DEBUG("END");
 }
 
+void app_tracker_new_obj_highlighted_callback_register(AppTrackerEventCB cb)
+{
+       _new_obj_highlighted_callback = cb;
+}
+
 void app_tracker_callback_unregister(AtspiAccessible * app, AppTrackerEventCB cb, void *user_data)
 {
        DEBUG("START");
@@ -291,3 +331,8 @@ void app_tracker_callback_unregister(AtspiAccessible * app, AppTrackerEventCB cb
                g_free(std);
        }
 }
+
+void app_tracker_new_obj_highlighted_callback_unregister(AppTrackerEventCB cb)
+{
+       _new_obj_highlighted_callback = NULL;
+}
index 24bc5fa..67444e1 100644 (file)
@@ -22,7 +22,6 @@ struct _FlatNaviContext {
        AtspiAccessible *current;
        AtspiAccessible *first;
        AtspiAccessible *last;
-       AtspiAccessible *prev;
 };
 
 static const AtspiStateType required_states[] = {
@@ -546,7 +545,6 @@ FlatNaviContext *flat_navi_context_create(AtspiAccessible * root)
                return NULL;
 
        ret->root = root;
-       ret->prev = NULL;
        ret->current = _first(ret);
        return ret;
 }
index d1362f2..d3a8046 100644 (file)
@@ -173,6 +173,10 @@ char *state_to_char(AtspiStateType state)
                return strdup("ATSPI_STATE_LAST_DEFINED");
        case ATSPI_STATE_MODAL:
                return strdup("ATSPI_STATE_MODAL");
+       case ATSPI_STATE_HIGHLIGHTED:
+               return strdup("ATSPI_STATE_HIGHLIGHTED");
+       case ATSPI_STATE_HIGHLIGHTABLE:
+               return strdup("ATSPI_STATE_HIGHLIGHTABLE");
        default:
                return strdup("\0");
        }
@@ -1830,6 +1834,14 @@ static void _view_content_changed(AtspiAccessible * root, void *user_data)
        DEBUG("END");
 }
 
+static void _new_highlighted_obj_changed(AtspiAccessible * new_highlighted_obj, void *user_data)
+{
+       DEBUG("context: %p, current: %p, new_highlighted_obj: %p", context, flat_navi_context_current_get(context), new_highlighted_obj);
+       if (context && flat_navi_context_current_get(context) != new_highlighted_obj) {
+               flat_navi_context_current_set(context, g_object_ref(new_highlighted_obj));
+       }
+}
+
 void clear(gpointer d)
 {
        AtspiAccessible **data = d;
@@ -1920,6 +1932,7 @@ void navigator_init(void)
        // register on active_window
        dbus_gesture_adapter_init();
        app_tracker_init();
+       app_tracker_new_obj_highlighted_callback_register(_new_highlighted_obj_changed);
        window_tracker_init();
        window_tracker_register(on_window_activate, NULL);
        window_tracker_active_window_request();
index 81765d4..e9d8391 100644 (file)
@@ -431,7 +431,6 @@ static void _flick_gesture_mouse_move(Ecore_Event_Mouse_Move * ev, Cover * cov)
                                return;
                        }
                }
-               DEBUG("i: %i, ev->multi.device: %i", i, ev->multi.device);
 
                int dx = ev->root.x - cov->flick_gesture.x_org[i];
                int dy = ev->root.y - cov->flick_gesture.y_org[i];
@@ -637,7 +636,6 @@ void start_scroll(int x, int y)
        Ecore_X_Window wins[1] = { win };
        Ecore_X_Window under = ecore_x_window_at_xy_with_skip_get(x, y, wins, sizeof(wins) / sizeof(wins[0]));
        _get_root_coords(under, &rx, &ry);
-       DEBUG("Starting scroll: %d %d", x - rx, y - ry);
        ecore_x_mouse_in_send(under, x - rx, y - ry);
        ecore_x_window_focus(under);
        ecore_x_mouse_down_send(under, x - rx, y - ry, 1);
@@ -646,13 +644,11 @@ void start_scroll(int x, int y)
 
 void continue_scroll(int x, int y)
 {
-       DEBUG("Continuing scroll: %d %d", x - rx, y - ry);
        ecore_x_mouse_move_send(scrolled_win, x - rx, y - ry);
 }
 
 void end_scroll(int x, int y)
 {
-       DEBUG("Ending scroll : %d %d", x - rx, y - ry);
        ecore_x_mouse_up_send(scrolled_win, x - rx, y - ry, 1);
        ecore_x_mouse_out_send(scrolled_win, x - rx, y - ry);
 }