[screen reader] Code refactoring: app tracker 04/238404/3
authorBartlomiej Grzelewski <b.grzelewski@samsung.com>
Mon, 13 Jul 2020 14:00:08 +0000 (16:00 +0200)
committerBartlomiej Grzelewski <b.grzelewski@samsung.com>
Tue, 14 Jul 2020 11:08:16 +0000 (13:08 +0200)
* reduce nuber of global values inside app tracker

Change-Id: Id6ca05453b40275801f4030e1ecf7f0912df5512

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

index 03b9f1a7116f1963cc25c17b943d00c4f19a391f..a434db24891cdd88e3149c94d76b76a2fae34d8c 100644 (file)
@@ -3,7 +3,10 @@
 
 #include <string.h>
 #include <atspi/atspi.h>
-#include "navigator.h"
+
+#include <navigator.h>
+
+typedef struct _App_Tracker_Data App_Tracker_Data;
 
 /**
  * @brief Callback
@@ -15,9 +18,9 @@ typedef void (*AppTrackerEventCB)(AtspiAccessible *root, AtspiRole role, void *u
  */
 typedef void (*AppTrackerEventWithDefaultLabelInfoCB)(AtspiAccessible *root, AtspiRole role, void *user_data, Eina_Bool default_label_enabled);
 
-void app_tracker_new_obj_highlighted_callback_register(AppTrackerEventCB cb, void *user_data);
+void app_tracker_new_obj_highlighted_callback_register(App_Tracker_Data *apd, AppTrackerEventCB cb, void *user_data);
 
-void* app_tracker_new_obj_highlighted_callback_unregister();
+void* app_tracker_new_obj_highlighted_callback_unregister(App_Tracker_Data* atd);
 
 /**
  * @brief Initialize app tracker module.
@@ -27,12 +30,12 @@ void* app_tracker_new_obj_highlighted_callback_unregister();
  * @param default_label_cb - a handler which produce default label text that is spoken when the active window changes
  * @return init count.
  */
-int app_tracker_init(AppTrackerEventWithDefaultLabelInfoCB view_content_changed_cb, Navigator_Data *nd);
+App_Tracker_Data* app_tracker_init(AppTrackerEventWithDefaultLabelInfoCB view_content_changed_cb, Navigator_Data *nd);
 
 /**
  * @brief Shutdown app tracker module
  */
-void app_tracker_shutdown(void);
+void app_tracker_shutdown(App_Tracker_Data *atd);
 
 typedef enum {
        APP_TRACKER_CONTEXT_VALID,
@@ -44,8 +47,8 @@ typedef enum {
 /**
  * @brief Check if current active window context is valid
  */
-AppTrackerContextValidility app_tracker_context_valid_check(void);
+AppTrackerContextValidility app_tracker_context_valid_check(App_Tracker_Data *atd);
 
-void app_tracker_scroll_gesture_required_object_info_send(void);
+void app_tracker_scroll_gesture_required_object_info_send(App_Tracker_Data* atd);
 
 #endif /* end of include guard: APP_TRACKER_H_ */
index 51bd98d0ee337be2d5ea36ca5fe110463a9496b1..c48dac7e2c8f3a832d2bf5177731d31a36d619a2 100644 (file)
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
-#include "app_tracker.h"
-#include "screen_reader_tts.h"
-#include "window_tracker.h"
-#include "logger.h"
 #include <ctype.h>
-#include "navigator.h"
-#include "utils.h"
+
+#include <app_tracker.h>
+#include <logger.h>
+#include <navigator.h>
+#include <screen_reader_tts.h>
+#include <utils.h>
+#include <window_tracker.h>
 
 #ifndef SCREEN_READER_TV
-#include "granularity_read.h"
+#include <granularity_read.h>
 #endif
 
 typedef struct {
@@ -32,31 +32,31 @@ typedef struct {
 } EventCallbackData;
 
 // structure defining context of active window
-typedef struct {
+struct _App_Tracker_Data {
        AtspiAccessible *root; // accessibility node of active window
        EventCallbackData *view_content_changed_ecd; // callback that rebuilds navigation context on significant changes of visible UI
        guint timer; // used for defered execution of view_content_changed_ecd callback
-} AppTrackerData;
+       AtspiEventListener *listener;
+
+       AppTrackerEventCB new_obj_highlighted_callback;
+       void *new_obj_highlighted_callback_user_data;
+#ifndef SCREEN_READER_TV
+       Ecore_Timer *read_timer;
+       AtspiAccessible *read_timer_user_data;
+
+       AtspiAccessible *prev_highlighted_obj;
+       AtspiAccessible *scroll_gesture_required_obj;
+#endif
+};
 
 #ifndef SCREEN_READER_TV
 static void app_tracker_context_switch(void *data, AtspiAccessible *root);
-static AtspiAccessible *_scroll_gesture_required_obj = NULL;
 #endif
 
 #define APP_TRACKER_INVACTIVITY_TIMEOUT 200
 #define HIGHLIGHT_UPDATE_READ_TIMEOUT 0.1
 
-static int _init_count;
-static AppTrackerData *atd = NULL;
-static AtspiEventListener *_listener;
-static AppTrackerEventCB _new_obj_highlighted_callback;
-static void *_new_obj_highlighted_callback_user_data = NULL;
 extern bool keyboard_feedback;
-#ifndef SCREEN_READER_TV
-Ecore_Timer *read_timer = NULL;
-AtspiAccessible *prev_highlighted_obj = NULL;
-#endif
-
 static gboolean _on_timeout_rebuild_navigation_context(gpointer user_data)
 {
        DEBUG("START");
@@ -65,7 +65,7 @@ static gboolean _on_timeout_rebuild_navigation_context(gpointer user_data)
                return FALSE;
        }
 
-       AppTrackerData *atd = (AppTrackerData *)user_data;
+       App_Tracker_Data *atd = (App_Tracker_Data *)user_data;
 
        if (!atd->root || object_has_defunct_state(atd->root)) {
                ERROR("Cannot rebuild navigation context. Active window is defunct.");
@@ -165,13 +165,13 @@ static void _read_value(AtspiValue *value)
        tts_speak(buf, EINA_TRUE);
 }
 
-static void timer_reschedule(void)
+static void timer_reschedule(App_Tracker_Data *atd)
 {
 #ifndef SCREEN_READER_TV
-       if (read_timer) {
+       if (atd->read_timer) {
                DEBUG("Remove read timer before navigation context rebuilding");
-               ecore_timer_del(read_timer);
-               read_timer = NULL;
+               ecore_timer_del(atd->read_timer);
+               atd->read_timer = NULL;
        }
 #endif
 
@@ -184,9 +184,11 @@ static void timer_reschedule(void)
 static Eina_Bool _read_cb(void *data)
 {
        DEBUG("START");
-       AtspiAccessible *current_obj = (AtspiAccessible *)data;
+       App_Tracker_Data *atd = (App_Tracker_Data*)data;
+       AtspiAccessible *current_obj = atd->read_timer_user_data;
        generate_what_to_read_and_speak(get_pointer_to_service_data_struct()->navigator_data, current_obj, EINA_TRUE);
-       read_timer = NULL;
+       atd->read_timer = NULL;
+       atd->read_timer_user_data = NULL; /* It's on to clean it as we cancel next call. */
        sound_n_vibration_feedback_generate(current_obj);
        return ECORE_CALLBACK_CANCEL;
 }
@@ -210,7 +212,7 @@ static Eina_Bool _is_valid_status(gint event_detail)
 }
 
 #ifndef SCREEN_READER_TV
-static void _object_needs_scroll_gesture_send(AtspiAccessible *obj)
+static void _object_needs_scroll_gesture_send(App_Tracker_Data *atd, AtspiAccessible *obj)
 {
        Eldbus_Connection *conn;
        Eldbus_Object *dobj;
@@ -220,7 +222,7 @@ static void _object_needs_scroll_gesture_send(AtspiAccessible *obj)
        int highlighted_object_x = -1;
        int highlighted_object_y = -1;
 
-       if (!_scroll_gesture_required_obj && !(obj))
+       if (!atd->scroll_gesture_required_obj && !(obj))
                return;
 
        eldbus_init();
@@ -244,7 +246,7 @@ static void _object_needs_scroll_gesture_send(AtspiAccessible *obj)
                highlighted_object_y = rect->y + rect->height / 2;
                g_free(rect);
        }
-       _scroll_gesture_required_obj = obj;
+       atd->scroll_gesture_required_obj = obj;
 
        eldbus_proxy_call(proxy, "ObjectNeedsScrollGesture", NULL, NULL, -1, "ii", highlighted_object_x, highlighted_object_y);
 
@@ -258,16 +260,23 @@ fail_obj:
 }
 #endif
 
-static void _on_atspi_event_cb(const AtspiEvent *event)
+static void _on_atspi_event_cb(AtspiEvent *event, void *user_data)
 {
        AtspiAccessible *new_highlighted_obj = NULL;
        if (!event)
                return;
+
        if (!event->source) {
                ERROR("empty event source");
                return;
        }
 
+       if (!user_data) {
+               ERROR("user_data could not be NULL");
+               return;
+       }
+
+       App_Tracker_Data *atd = (App_Tracker_Data*)user_data;
        AtspiRole role = atspi_accessible_get_role(event->source, NULL);
        if (role == ATSPI_ROLE_DESKTOP_FRAME)
                return;
@@ -280,24 +289,30 @@ static void _on_atspi_event_cb(const AtspiEvent *event)
 #ifndef SCREEN_READER_TV
                if (event->detail1) {//Update highlight object only when grab is called
                        new_highlighted_obj = event->source;
-                       if (read_timer) ecore_timer_del(read_timer);
-                       read_timer = ecore_timer_add(HIGHLIGHT_UPDATE_READ_TIMEOUT, _read_cb, new_highlighted_obj);
-                       prev_highlighted_obj = new_highlighted_obj;
+                       if (atd->read_timer) {
+                               ecore_timer_del(atd->read_timer);
+                               atd->read_timer_user_data = NULL;
+                       }
+
+                       atd->read_timer_user_data = new_highlighted_obj;
+                       atd->read_timer = ecore_timer_add(HIGHLIGHT_UPDATE_READ_TIMEOUT, _read_cb, atd);
+                       atd->prev_highlighted_obj = new_highlighted_obj;
                        /* send - scroll gesture required info */
                        if (event->detail2)
-                               _object_needs_scroll_gesture_send(event->source);
+                               _object_needs_scroll_gesture_send(atd, event->source);
                } else {
-                       if (read_timer && prev_highlighted_obj == event->source) {
-                               gchar *id = atspi_accessible_get_unique_id(prev_highlighted_obj, NULL);
+                       if (atd->read_timer && atd->prev_highlighted_obj == event->source) {
+                               gchar *id = atspi_accessible_get_unique_id(atd->prev_highlighted_obj, NULL);
                                DEBUG("Prev highlighted %s lost highlight", id);
                                g_free(id);
-                               ecore_timer_del(read_timer);
-                               read_timer = NULL;
+                               ecore_timer_del(atd->read_timer);
+                               atd->read_timer = NULL;
+                               atd->read_timer_user_data = NULL;
                        }
 
                        granularity_read_text_list_init();
                        /* unset _scroll_gesture_requrired_obj */
-                       _object_needs_scroll_gesture_send(NULL);
+                       _object_needs_scroll_gesture_send(atd, NULL);
                }
 #endif
        } else if (!g_strcmp0(event->type, "object:active-descendant-changed")) {
@@ -318,7 +333,7 @@ static void _on_atspi_event_cb(const AtspiEvent *event)
                        } else if (role == ATSPI_ROLE_PAGE_TAB) {
                                // refresh default label for newly showing page tab
                                DEBUG("Refreshing TAB");
-                               timer_reschedule();
+                               timer_reschedule(atd);
                        } else if (object_has_modal_role(role)) {
                                // push modal to base_root stack
                                DEBUG("Pushing modal: ROLE: %d", role);
@@ -337,7 +352,7 @@ static void _on_atspi_event_cb(const AtspiEvent *event)
                                        free(text_to_speak);
                                }
                                else {
-                                       timer_reschedule();
+                                       timer_reschedule(atd);
                                }
                        }
                } else { /* Not Showing */
@@ -351,10 +366,10 @@ static void _on_atspi_event_cb(const AtspiEvent *event)
                                //TODO: check if source is same with modals->data
                                // pop modal
                                DEBUG("Pop modal");
-                               timer_reschedule();
+                               timer_reschedule(atd);
                        } else if (flat_navi_context_current_get(navigator_get_flat_navi_context(atd->view_content_changed_ecd->user_data)) == event->source) {
                                DEBUG("Current highlighted object becomes not-showing");
-                               timer_reschedule();
+                               timer_reschedule(atd);
                        }
                }
        }
@@ -615,121 +630,106 @@ static void _on_atspi_event_cb(const AtspiEvent *event)
                }
        }
 
-       if (new_highlighted_obj && _new_obj_highlighted_callback && object_has_highlighted_state(new_highlighted_obj)) {
+       if (new_highlighted_obj && atd->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, role, _new_obj_highlighted_callback_user_data);
+               atd->new_obj_highlighted_callback(new_highlighted_obj, role, atd->new_obj_highlighted_callback_user_data);
                g_object_unref(new_highlighted_obj);
                new_highlighted_obj = NULL;
        }
        DEBUG("END");
 }
 
-static int _app_tracker_init_internal(AppTrackerEventWithDefaultLabelInfoCB view_content_changed_cb, Navigator_Data *nd)
+App_Tracker_Data*
+app_tracker_init(AppTrackerEventWithDefaultLabelInfoCB view_content_changed_cb, Navigator_Data *nd)
 {
-       DEBUG("START");
+       DEBUG("Alocating active window context");
+       App_Tracker_Data *atd = g_new(App_Tracker_Data, 1);
        if (!atd) {
-               DEBUG("Alocating active window context");
-               atd = g_new(AppTrackerData, 1);
-               DEBUG("Context allocated");
-               atd->view_content_changed_ecd = g_new(EventCallbackData, 1);
-               DEBUG("Callback allocated");
-               atd->view_content_changed_ecd->user_data = nd;
-               atd->view_content_changed_ecd->func = view_content_changed_cb;
-               DEBUG("View content changed callback set func=%p data=%p", view_content_changed_cb, nd);
-               atd->root = NULL;
-               atd->timer = 0;
-               subroot = NULL;
+               ERROR("Memory allocation failed");
+               return NULL;
+       }
+       DEBUG("Context allocated");
+       atd->view_content_changed_ecd = g_new(EventCallbackData, 1);
+       DEBUG("Callback allocated");
+       atd->view_content_changed_ecd->user_data = nd;
+       atd->view_content_changed_ecd->func = view_content_changed_cb;
+       DEBUG("View content changed callback set func=%p data=%p", view_content_changed_cb, nd);
+       atd->root = NULL;
+       atd->timer = 0;
+       subroot = NULL;
 #ifndef SCREEN_READER_TV
-               window_tracker_init();
-               DEBUG("Registering app_tracker_context_switch=%p, for atd=%p", app_tracker_context_switch, atd);
-               window_tracker_register(app_tracker_context_switch, atd);
-               /* This function does not affect
-               window_tracker_active_window_request();
-               */
+       atd->read_timer = NULL;
+       atd->read_timer_user_data = NULL;
+       atd->prev_highlighted_obj = NULL;
+       atd->scroll_gesture_required_obj = NULL;
+       window_tracker_init();
+       DEBUG("Registering app_tracker_context_switch=%p, for atd=%p", app_tracker_context_switch, atd);
+       window_tracker_register(app_tracker_context_switch, atd);
+       /* This function does not affect
+          window_tracker_active_window_request();
+       */
 #endif
-       }
-       _new_obj_highlighted_callback = NULL;
-       _new_obj_highlighted_callback_user_data = 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:highlighted", NULL);
-       atspi_event_listener_register(_listener, "object:state-changed:animated", NULL);
-       atspi_event_listener_register(_listener, "object:state-changed:checked", NULL);
-       atspi_event_listener_register(_listener, "object:state-changed:selected", NULL);
-       atspi_event_listener_register(_listener, "object:bounds-changed", NULL);
-       atspi_event_listener_register(_listener, "object:active-descendant-changed", NULL);
-       atspi_event_listener_register(_listener, "object:property-change:accessible-name", NULL);
-       atspi_event_listener_register(_listener, "object:property-change:accessible-value", NULL);
-       atspi_event_listener_register(_listener, "object:text-changed:insert", NULL);
-       atspi_event_listener_register(_listener, "object:text-changed:delete", NULL);
-       atspi_event_listener_register(_listener, "object:move-outed", NULL);
-
-       return 0;
-}
 
-static void _app_tracker_data_free(AppTrackerData *atd)
-{
-       if (atd->timer)
-               g_source_remove(atd->timer);
-       g_object_unref(atd->root);
-       g_free(atd);
+       atd->new_obj_highlighted_callback = NULL;
+       atd->new_obj_highlighted_callback_user_data = NULL;
+       atd->listener = atspi_event_listener_new(_on_atspi_event_cb, atd, NULL);
+
+       atspi_event_listener_register(atd->listener, "object:state-changed:showing", NULL);
+       atspi_event_listener_register(atd->listener, "object:state-changed:highlighted", NULL);
+       atspi_event_listener_register(atd->listener, "object:state-changed:animated", NULL);
+       atspi_event_listener_register(atd->listener, "object:state-changed:checked", NULL);
+       atspi_event_listener_register(atd->listener, "object:state-changed:selected", NULL);
+       atspi_event_listener_register(atd->listener, "object:bounds-changed", NULL);
+       atspi_event_listener_register(atd->listener, "object:active-descendant-changed", NULL);
+       atspi_event_listener_register(atd->listener, "object:property-change:accessible-name", NULL);
+       atspi_event_listener_register(atd->listener, "object:property-change:accessible-value", NULL);
+       atspi_event_listener_register(atd->listener, "object:text-changed:insert", NULL);
+       atspi_event_listener_register(atd->listener, "object:text-changed:delete", NULL);
+       atspi_event_listener_register(atd->listener, "object:move-outed", NULL);
+
+       return atd;
 }
 
-static void _app_tracker_shutdown_internal(void)
+void app_tracker_shutdown(App_Tracker_Data *atd)
 {
-       atspi_event_listener_deregister(_listener, "object:state-changed:showing", NULL);
-       atspi_event_listener_deregister(_listener, "object:state-changed:highlighted", NULL);
-       atspi_event_listener_deregister(_listener, "object:state-changed:animated", NULL);
-       atspi_event_listener_deregister(_listener, "object:state-changed:checked", NULL);
-       atspi_event_listener_deregister(_listener, "object:state-changed:selected", NULL);
-       atspi_event_listener_deregister(_listener, "object:bounds-changed", NULL);
-       atspi_event_listener_deregister(_listener, "object:active-descendant-changed", NULL);
-       atspi_event_listener_deregister(_listener, "object:property-change:accessible-name", NULL);
-       atspi_event_listener_deregister(_listener, "object:property-change:accessible-value", NULL);
-       atspi_event_listener_deregister(_listener, "object:text-changed:insert", NULL);
-       atspi_event_listener_deregister(_listener, "object:text-changed:delete", NULL);
-       atspi_event_listener_deregister(_listener, "object:move-outed", NULL);
-
-       g_object_unref(_listener);
-       _listener = NULL;
-       _new_obj_highlighted_callback = NULL;
-       if (_new_obj_highlighted_callback_user_data) {
-               WARNING("You should deregister _new_obj_highlighted_callback before shutdown!");
+       atspi_event_listener_deregister(atd->listener, "object:state-changed:showing", NULL);
+       atspi_event_listener_deregister(atd->listener, "object:state-changed:highlighted", NULL);
+       atspi_event_listener_deregister(atd->listener, "object:state-changed:animated", NULL);
+       atspi_event_listener_deregister(atd->listener, "object:state-changed:checked", NULL);
+       atspi_event_listener_deregister(atd->listener, "object:state-changed:selected", NULL);
+       atspi_event_listener_deregister(atd->listener, "object:bounds-changed", NULL);
+       atspi_event_listener_deregister(atd->listener, "object:active-descendant-changed", NULL);
+       atspi_event_listener_deregister(atd->listener, "object:property-change:accessible-name", NULL);
+       atspi_event_listener_deregister(atd->listener, "object:property-change:accessible-value", NULL);
+       atspi_event_listener_deregister(atd->listener, "object:text-changed:insert", NULL);
+       atspi_event_listener_deregister(atd->listener, "object:text-changed:delete", NULL);
+       atspi_event_listener_deregister(atd->listener, "object:move-outed", NULL);
+
+       g_object_unref(atd->listener);
+       atd->listener = NULL;
+
+       atd->new_obj_highlighted_callback = NULL;
+       if (atd->new_obj_highlighted_callback_user_data) {
+               WARNING("You should deregister new_obj_highlighted_callback before shutdown!");
        }
-       _new_obj_highlighted_callback_user_data = NULL;
+       atd->new_obj_highlighted_callback_user_data = NULL;
 #ifndef SCREEN_READER_TV
-       if (read_timer) ecore_timer_del(read_timer);
-       read_timer = NULL;
+       if (atd->read_timer)
+               ecore_timer_del(atd->read_timer);
+       atd->read_timer = NULL;
 #endif
-       if (atd) _app_tracker_data_free(atd);
-       atd = NULL;
-}
-
-int app_tracker_init(AppTrackerEventWithDefaultLabelInfoCB view_content_changed_cb, Navigator_Data *nd)
-{
-       DEBUG("START");
-       if (!(_init_count++))
-               if (_app_tracker_init_internal(view_content_changed_cb, nd)) {
-                       _init_count--;
-                       return -1;
-               }
-       return _init_count;
-}
+       if (atd->timer)
+               g_source_remove(atd->timer);
 
-void app_tracker_shutdown(void)
-{
-       if (_init_count == 1)
-               _app_tracker_shutdown_internal();
-       if (--_init_count < 0)
-               _init_count = 0;
+       g_object_unref(atd->root);
+       g_free(atd);
 }
 
 #ifndef SCREEN_READER_TV
 static void app_tracker_context_switch(void *data, AtspiAccessible *root)
 {
-       AppTrackerData *atd = (AppTrackerData *)data;
-       if (!_init_count || !atd) {
+       App_Tracker_Data *atd = (App_Tracker_Data *)data;
+       if (!atd) {
                ERROR("app_tracker module used without initialization");
                return;
        }
@@ -744,33 +744,33 @@ static void app_tracker_context_switch(void *data, AtspiAccessible *root)
        }
 
        /* unset _scroll_gesture_requrired_obj */
-       _object_needs_scroll_gesture_send(NULL);
+       _object_needs_scroll_gesture_send(atd, NULL);
 
        atd->root = root;
-       timer_reschedule();
+       timer_reschedule(atd);
 }
 #endif
 
-void app_tracker_new_obj_highlighted_callback_register(AppTrackerEventCB cb, void *user_data)
+void app_tracker_new_obj_highlighted_callback_register(App_Tracker_Data *atd, AppTrackerEventCB cb, void *user_data)
 {
-       if (_new_obj_highlighted_callback) {
+       if (atd->new_obj_highlighted_callback) {
                ERROR("Only one callback is allowed!");
                return;
        }
 
-       _new_obj_highlighted_callback = cb;
-       _new_obj_highlighted_callback_user_data = user_data;
+       atd->new_obj_highlighted_callback = cb;
+       atd->new_obj_highlighted_callback_user_data = user_data;
 }
 
-void* app_tracker_new_obj_highlighted_callback_unregister()
+void* app_tracker_new_obj_highlighted_callback_unregister(App_Tracker_Data *atd)
 {
-       _new_obj_highlighted_callback = NULL;
-       void *ret = _new_obj_highlighted_callback_user_data;
-       _new_obj_highlighted_callback_user_data = NULL;
+       atd->new_obj_highlighted_callback = NULL;
+       void *ret = atd->new_obj_highlighted_callback_user_data;
+       atd->new_obj_highlighted_callback_user_data = NULL;
        return ret;
 }
 
-AppTrackerContextValidility app_tracker_context_valid_check(void)
+AppTrackerContextValidility app_tracker_context_valid_check(App_Tracker_Data *atd)
 {
        if (atd->timer) {
                DEBUG("timer is active");
@@ -799,10 +799,10 @@ AppTrackerContextValidility app_tracker_context_valid_check(void)
        return APP_TRACKER_CONTEXT_NOT_VALID;
 }
 
-void app_tracker_scroll_gesture_required_object_info_send(void)
+void app_tracker_scroll_gesture_required_object_info_send(App_Tracker_Data *atd)
 {
 #ifndef SCREEN_READER_TV
-       /* If _scroll_gesture_required_obj is NULL, then send -1, -1 */
-       _object_needs_scroll_gesture_send(_scroll_gesture_required_obj);
+       /* If scroll_gesture_required_obj is NULL, then send -1, -1 */
+       _object_needs_scroll_gesture_send(atd, atd->scroll_gesture_required_obj);
 #endif
 }
index 7c06171ab77c265daf99f9cb96673b4355bed4ed..0cd6eff93c8262d3962139e1826909a776adcdf4 100644 (file)
@@ -99,6 +99,7 @@ struct _Navigator_Data {
        char *supported_gestures;
        void (*read_quickpanel_cb)(void*);
        void *read_quickpanel_data;
+       App_Tracker_Data *app_tracker_data;
 };
 
 static Eldbus_Connection *connection = NULL;
@@ -1304,7 +1305,7 @@ static void _focus_widget(Navigator_Data *nd, Gesture_Info *info)
                /* Need to check active_window_context->timer, other conditions could
                increase number of IPC, if you need to reduce IPC count, then check the
                active_window_context->timer only here in the future. */
-               AppTrackerContextValidility val = app_tracker_context_valid_check();
+               AppTrackerContextValidility val = app_tracker_context_valid_check(nd->app_tracker_data);
                if (val == APP_TRACKER_CONTEXT_NOT_VALID)
                        return;
 
@@ -1337,7 +1338,7 @@ static void _focus_next(Navigator_Data *nd)
                return;
        }
 
-       AppTrackerContextValidility val = app_tracker_context_valid_check();
+       AppTrackerContextValidility val = app_tracker_context_valid_check(nd->app_tracker_data);
        if (val == APP_TRACKER_CONTEXT_NOT_VALID)
                return;
 
@@ -1376,7 +1377,7 @@ void navigator_focus_next_visible(Navigator_Data *nd)
        while (1) {
                obj = flat_navi_context_next(nd->flat_navi_context);
 
-               AppTrackerContextValidility val = app_tracker_context_valid_check();
+               AppTrackerContextValidility val = app_tracker_context_valid_check(nd->app_tracker_data);
                if (val == APP_TRACKER_CONTEXT_VALID) {
                        DEBUG("END - found");
                        _current_highlight_object_set(nd, obj, HIGHLIGHT_FIRST);
@@ -1402,7 +1403,7 @@ void navigator_focus_prev_visible(Navigator_Data *nd)
        while (1) {
                obj = flat_navi_context_prev(nd->flat_navi_context);
 
-               AppTrackerContextValidility val = app_tracker_context_valid_check();
+               AppTrackerContextValidility val = app_tracker_context_valid_check(nd->app_tracker_data);
                if (val == APP_TRACKER_CONTEXT_VALID) {
                        DEBUG("END - found");
                        _current_highlight_object_set(nd, obj, HIGHLIGHT_FIRST);
@@ -1418,7 +1419,7 @@ void navigator_focus_prev_visible(Navigator_Data *nd)
 static void _focus_prev(Navigator_Data *nd)
 {
        DEBUG("START");
-       AppTrackerContextValidility val = app_tracker_context_valid_check();
+       AppTrackerContextValidility val = app_tracker_context_valid_check(nd->app_tracker_data);
        if (val == APP_TRACKER_CONTEXT_NOT_VALID)
                return;
 
@@ -2972,7 +2973,7 @@ static void on_gesture_detected(void *data, const Eldbus_Message *msg)
        // then the object geometry info should be sent to window manager.
        if (info->type == TWO_FINGERS_HOVER && info->state == 2) {
                DEBUG("Two fingers hover finished");
-               app_tracker_scroll_gesture_required_object_info_send();
+               app_tracker_scroll_gesture_required_object_info_send(nd->app_tracker_data);
        }
 
        /* check if object consumes gesture */
@@ -3406,8 +3407,10 @@ Navigator_Data *navigator_init()
        navigator_gestures_tracker_register(on_gesture_detected, nd);
        // register on active_window
        nd->flat_navi_context = flat_navi_context_create();
-       app_tracker_init(_view_content_changed, nd);
-       app_tracker_new_obj_highlighted_callback_register(_new_highlighted_obj_changed, nd);
+       nd->app_tracker_data = app_tracker_init(_view_content_changed, nd);
+       app_tracker_new_obj_highlighted_callback_register(nd->app_tracker_data,
+                                                         _new_highlighted_obj_changed,
+                                                         nd);
        smart_notification_init();
 #ifndef SCREEN_READER_TV
        symbol_text_hash_init();
@@ -3444,7 +3447,7 @@ void navigator_shutdown(Navigator_Data *nd)
        navigator_gestures_tracker_unregister();
        remove_utterance_cb();
 
-       app_tracker_shutdown();
+       app_tracker_shutdown(nd->app_tracker_data);
        smart_notification_shutdown();
 #ifndef SCREEN_READER_TV
        symbol_text_hash_destroy();