[screen reader] Code refactoring - 009 - window_tracker 25/89925/1
authorLukasz Wlazly <l.wlazly@partner.samsung.com>
Thu, 8 Sep 2016 06:35:10 +0000 (08:35 +0200)
committerm.detko <m.detko@samsung.com>
Mon, 26 Sep 2016 11:36:10 +0000 (13:36 +0200)
Change-Id: I9477bdf3f83f4b4807f7e8b6fb56f8081bd40879

include/keyboard_tracker.h
include/navigator.h
include/screen_reader.h
include/window_tracker.h
src/keyboard_tracker.c
src/main.c
src/navigator.c
src/screen_reader.c
src/window_tracker.c

index 82b11f641588c5819742d1372f1dee948fee5497..f12a4006ce653b4d8e0373293797f60dea2f1125 100644 (file)
@@ -2,6 +2,7 @@
 #define KEYBOARD_TRACKER_H_
 
 #include "screen_reader.h"
+
 /*
  * @brief Creates listener and initializes eldbus.
  *
@@ -12,7 +13,6 @@
  * @note Registers asynchronic listener on back button.
  * @note Keyboard gesture recognition and broadcasting on dbus is unused and should be removed.
  */
-
 Keyboard_Tracker_Data* keyboard_tracker_init(void);
 
 /**
@@ -66,7 +66,7 @@ Eina_Bool keyboard_geometry_get(const Keyboard_Tracker_Data *ktd, int *x, int *y
 /*
  * @brief Return EINA_TRUE if the top window is Quickpanel Window
  *
- * @param ktd internal data struct
+ * @param sd internal data struct of screen reader
  * @param x int coordinate
  * @param y int coordinate
  *
@@ -74,7 +74,7 @@ Eina_Bool keyboard_geometry_get(const Keyboard_Tracker_Data *ktd, int *x, int *y
  *
  * @note If SCREEN_READER_TV is undefined returns EINA_FALSE
  */
-Eina_Bool keyboard_event_status(const Keyboard_Tracker_Data *ktd, int x, int y);
+Eina_Bool keyboard_event_status(Service_Data *sd, int x, int y);
 
 /*
  * @brief Emits signal to eldbus interface
index 2f0bca00bd5911d397ef9adf20959038a9e03fd5..09b819b28f6abd7592a0373028abf84e52be000c 100644 (file)
@@ -26,7 +26,7 @@ Navigator_Data *navigator_init(Service_Data *sd);
 /**
  * @brief Closes all subservices opened in initialization
  *
- * @param sd internal data struct
+ * @param sd internal data struct of screen reader
  */
 void navigator_shutdown(Service_Data *sd);
 
index 81776aa84bd987e1583cdcd81a22909ec37015c6..ea613eef1c8d526bbddb1b1633248c78196841e1 100644 (file)
@@ -23,6 +23,7 @@ typedef struct
    int voice_type;
 } Voice_Info;
 
+typedef void (*Window_Tracker_Cb) (void *data, AtspiAccessible *window);
 
 typedef enum
 {
@@ -49,6 +50,8 @@ typedef struct _Gestures_Config Gestures_Config;
 
 typedef struct _Cover Cover;
 
+typedef struct _Window_Tracker_Data Window_Tracker_Data;
+
 typedef struct Screen_Reader_System_Data_s Screen_Reader_System_Data_t;
 
 typedef struct _Keyboard_Tracker_Data Keyboard_Tracker_Data;
@@ -59,6 +62,7 @@ typedef struct _Service_Data
        Flat_Navi_Context *flat_navi_context;
        Screen_Reader_System_Data_t *system_data;
        Keyboard_Tracker_Data* keyboard_tracker_data;
+       Window_Tracker_Data *window_tracker_data;
 
        //Set by vconf
        bool run_service;
index a36fd2820c0c6ba147b358894f7dba212be9895f..6bc06124b0b2104eae33061c263a3edc531c9899 100644 (file)
@@ -1,8 +1,46 @@
+#ifndef WINDOW_TRACKER_H
+#define WINDOW_TRACKER_H
+
 #include <atspi/atspi.h>
+#include "screen_reader.h"
+
+/**
+ * @brief Creates new listener and assignes it to events
+ *
+ * @param sd internal data struct of screen reader
+ */
+Window_Tracker_Data *window_tracker_init(void);
+
+/*
+ * @brief Deregisters events listener and frees listener object
+ *
+ * @param wtd internal data struct of window tracker
+ */
+void window_tracker_shutdown(Window_Tracker_Data *wtd);
+
+/**
+ * @brief Registers callback function for listener
+ *
+ * @param wtd internal data struct of window tracker
+ * @param cb pointer to function
+ * @param data additional data required by function
+ */
+void window_tracker_register(Window_Tracker_Data *wtd, Window_Tracker_Cb cb, void *data);
+
+/*
+ * @brief Sets top window and invokes for it function registered by window_tracker_register()
+ *
+ * @param wtd internal data struct of window tracker
+ */
+void window_tracker_active_window_request(Window_Tracker_Data *wtd);
 
-void window_tracker_init(void);
-void window_tracker_shutdown(void);
+/*
+ * @brief Passes top_win object
+ *
+ * @param wtd internal data struct of window tracker
+ *
+ * @return AtspiAccessible object
+ */
+AtspiAccessible *window_tracker_top_win_get(Window_Tracker_Data *wtd);
 
-typedef void (*Window_Tracker_Cb) (void *data, AtspiAccessible *window);
-void window_tracker_register(Window_Tracker_Cb cb, void *data);
-void window_tracker_active_window_request(void);
+#endif // WINDOW_TRACKER_H
index 74298f2d9b01c3bc06d009cd43fc2d8788205ab6..824697c40dbf82a63b201197250ff41f983b4b72 100644 (file)
@@ -24,6 +24,7 @@
 #include "keyboard_tracker.h"
 #include "logger.h"
 #include "screen_reader_tts.h"
+#include "window_tracker.h"
 
 struct _Keyboard_Tracker_Data
 {
@@ -50,10 +51,6 @@ struct _Keyboard_Tracker_Data
 
 #ifndef X11_ENABLED
 
-#ifndef SCREEN_READER_TV
-extern AtspiAccessible *top_win;
-#endif
-
 #define KB_GESTURE_SIGNAL 0
 static const Eldbus_Signal signals[] = {
        [KB_GESTURE_SIGNAL] = {
@@ -166,7 +163,7 @@ static void root_xwindow_property_tracker_unregister(Keyboard_Tracker_Data *ktd)
 }
 #endif
 
-static gboolean async_keyboard_cb(const AtspiDeviceEvent * stroke, void *data)
+static gboolean async_keyboard_cb(const AtspiDeviceEvent *stroke, void *data)
 {
        DEBUG("AT-SPI DEVICE EVENT: ID(%d) STRING(%s) TYPE(%d) HW_CODE(%d) MODIFIERS(%d) TIMESTAMP(%d)",
                        stroke->id, stroke->event_string,stroke->type,stroke->hw_code, stroke->modifiers, stroke->timestamp);
@@ -178,7 +175,7 @@ static gboolean async_keyboard_cb(const AtspiDeviceEvent * stroke, void *data)
                return FALSE;
 }
 
-static void keyboard_changed_cb(keynode_t * node, void *user_data)
+static void keyboard_changed_cb(keynode_t *node, void *user_data)
 {
        Service_Data *sd = get_pointer_to_service_data_struct();
 
@@ -343,15 +340,26 @@ Eina_Bool keyboard_geometry_get(const Keyboard_Tracker_Data *ktd, int *x, int *y
        return EINA_TRUE;
 }
 
-Eina_Bool keyboard_event_status(const Keyboard_Tracker_Data *ktd, const int x, const int y)
+Eina_Bool keyboard_event_status(Service_Data *sd, const int x, const int y)
 {
 #ifndef SCREEN_READER_TV
-       if (!ktd)
+       if (!sd) {
+               ERROR("NULL context parameter");
                return EINA_FALSE;
+       }
+
+       Keyboard_Tracker_Data *ktd = sd->keyboard_tracker_data;
+       Window_Tracker_Data *wtd = sd->window_tracker_data;
+
+       if (!ktd || !wtd) {
+               ERROR("NULL context parameter");
+               return EINA_FALSE;
+       }
+
        gchar* name = NULL;
        if (ktd->prev_keyboard_state == VCONFKEY_ISF_INPUT_PANEL_STATE_SHOW) {
-               if (top_win)
-                       name = atspi_accessible_get_name(top_win, NULL);
+               if (window_tracker_top_win_get(wtd))
+                       name = atspi_accessible_get_name(window_tracker_top_win_get(wtd), NULL);
                if (name && strcmp(name, "Quickpanel Window")) {
                        if ((y >= ktd->keyboardY) && (y <= (ktd->keyboardY + ktd->keyboardH)) && (x >= ktd->keyboardX) && (x <= (ktd->keyboardX + ktd->keyboardW))) {
                                g_free(name);
index 79158a4e2c46f7419b884af234a20b83b04c9444..ae9f3cc90aac3ce4e709c063548a8b7d761c8d32 100644 (file)
@@ -218,6 +218,10 @@ void set_signal_handler()
 static int app_create(void *data)
 {
        Service_Data *sd = (Service_Data *)data;
+       if (sd == NULL) {
+               ERROR("NULL pointer passed");
+               return -1;
+       }
 
        elm_init(0, NULL);
        atspi_init();
index 75c70f0a82185ebcabcfd6e4c6487d828b5a773a..fd1a0929d9b16ea223a37657ef090057f3a5920b 100644 (file)
@@ -585,6 +585,10 @@ char *generate_trait(AtspiAccessible * obj)
                int children_count = _find_popup_list_children_count(obj);
                char trait[HOVERSEL_TRAIT_SIZE];
 
+               snprintf(trait, HOVERSEL_TRAIT_SIZE, _("IDS_TRAIT_POPUP"));
+               strncat(ret, trait, sizeof(ret) - strlen(ret) - 1);
+               strncat(ret, ", ", sizeof(ret) - strlen(ret) - 1);
+
                if (children_count > 0) {
                        snprintf(trait, HOVERSEL_TRAIT_SIZE, _("IDS_TRAIT_SHOWING"));
                        strncat(ret, trait, sizeof(ret) - strlen(ret) - 1);
@@ -598,10 +602,9 @@ char *generate_trait(AtspiAccessible * obj)
                        strncat(ret, trait, sizeof(ret) - strlen(ret) - 1);
                        strncat(ret, ", ", sizeof(ret) - strlen(ret) - 1);
                }
-               if (_has_activate_action(obj)) {
-                       snprintf(trait, HOVERSEL_TRAIT_SIZE, _("IDS_TRAIT_POPUP_CLOSE"));
-                       strncat(ret, trait, sizeof(ret) - strlen(ret) - 1);
-               }
+
+               snprintf(trait, HOVERSEL_TRAIT_SIZE, _("IDS_TRAIT_POPUP_CLOSE"));
+               strncat(ret, trait, sizeof(ret) - strlen(ret) - 1);
                break;
        }
        case ATSPI_ROLE_COMBO_BOX: {
@@ -1137,7 +1140,7 @@ static void _current_highlight_object_set(Navigator_Data *nd, AtspiAccessible *
                        haptic_vibrate_start(HAPTIC_VIBRATE_DURATION, HAPTIC_VIBRATE_INTENSITY);
 
                role = atspi_accessible_get_role(obj, NULL);
-               if (role != ATSPI_ROLE_PAGE_TAB && role != ATSPI_ROLE_POPUP_MENU && role != ATSPI_ROLE_DIALOG) { /* ctxpopup outline does not show highlight frame */
+               if (role != ATSPI_ROLE_PAGE_TAB && role != ATSPI_ROLE_POPUP_MENU) { /* ctxpopup outline does not show highlight frame */
                        if (role == ATSPI_ROLE_UNKNOWN) {
                                /* to support elm_access used for embedded toolkit,
                                probably have to check more such as attribute 'type',
@@ -2625,7 +2628,7 @@ static void on_gesture_detected(void *data, const Eldbus_Message *msg)
                                break;
                        }
 #else
-                       keyboard_status = keyboard_event_status(sd->keyboard_tracker_data, info->x_end, info->y_end);
+                       keyboard_status = keyboard_event_status(sd, info->x_end, info->y_end);
                        if (keyboard_status)
                                {
                                        keyboard_signal_emit(sd->keyboard_tracker_data, info->type, info->x_end, info->y_end);
@@ -2676,7 +2679,7 @@ static void on_gesture_detected(void *data, const Eldbus_Message *msg)
                        break;
                }
 #else
-               keyboard_status = keyboard_event_status(sd->keyboard_tracker_data, info->x_end, info->y_end);
+               keyboard_status = keyboard_event_status(sd, info->x_end, info->y_end);
                if (keyboard_status)
                        {
                                keyboard_signal_emit(sd->keyboard_tracker_data, info->type, info->x_end, info->y_end);
@@ -2694,7 +2697,7 @@ static void on_gesture_detected(void *data, const Eldbus_Message *msg)
                        break;
                }
 #else
-               keyboard_status = keyboard_event_status(sd->keyboard_tracker_data, info->x_end, info->y_end);
+               keyboard_status = keyboard_event_status(sd, info->x_end, info->y_end);
                if (keyboard_status)
                        {
                                keyboard_signal_emit(sd->keyboard_tracker_data, info->type, info->x_end, info->y_end);
@@ -2977,9 +2980,9 @@ Navigator_Data *navigator_init(Service_Data *sd)
        sd->gesture_adapter_data = dbus_gesture_adapter_init();
        app_tracker_init();
        app_tracker_new_obj_highlighted_callback_register(_new_highlighted_obj_changed, sd->app_tracker_ctx);
-       window_tracker_init();
-       window_tracker_register(on_window_activate, sd);
-       window_tracker_active_window_request();
+       sd->window_tracker_data = window_tracker_init();
+       window_tracker_register(sd->window_tracker_data, on_window_activate, sd);
+       window_tracker_active_window_request(sd->window_tracker_data);
        smart_notification_init();
 #ifndef SCREEN_READER_TV
        sd->system_data = system_notifications_init(sd);
@@ -3016,7 +3019,7 @@ void navigator_shutdown(Service_Data *sd)
        //app_tracker_shutdown(sd->app_tracker_ctx);
 
        app_tracker_shutdown(sd->app_tracker_ctx);
-       window_tracker_shutdown();
+       window_tracker_shutdown(sd->window_tracker_data);
        smart_notification_shutdown();
 #ifndef SCREEN_READER_TV
        system_notifications_shutdown(sd->system_data);
index c10d6103ad5ab42874f50284033c2fbf25504a5f..6cc266d41135cb8b30f50d1e58ec8528dec99ab6 100644 (file)
@@ -39,6 +39,7 @@ Service_Data service_data = {
        .gesture_adapter_data = NULL,
        .system_data = NULL,
        .app_tracker_ctx = NULL,
+       .window_tracker_data = NULL,
 
        //Set by vconf
        .run_service = 1,
index a2adfc11644e409f274ed09a94487add373196ee..23acc0d36944a1736ba89faa73afe837236c9a50 100644 (file)
 #include <Ecore_X_Atoms.h>
 #endif
 
-static Window_Tracker_Cb user_cb;
-static void *user_data;
-static AtspiEventListener *listener;
-static AtspiAccessible *last_active_win;
-AtspiAccessible *top_win;
-
-static void _on_atspi_window_cb(const AtspiEvent * event)
+struct _Window_Tracker_Data
+{
+       Window_Tracker_Cb user_cb;
+       void *user_data;
+       AtspiEventListener *listener;
+       AtspiAccessible *last_active_win;
+       AtspiAccessible *top_win;
+};
+
+static void _on_atspi_window_cb(const AtspiEvent *event)
 {
+       Service_Data *sd = get_pointer_to_service_data_struct();
+       if (!sd) {
+               ERROR("NULL context");
+               return;
+       }
+
+       Window_Tracker_Data *wtd = sd->window_tracker_data;
+       if (!wtd) {
+               ERROR("NULL context parameter");
+               return;
+       }
+
        gchar *name = atspi_accessible_get_name(event->source, NULL);
+       Window_Tracker_Cb user_cb = wtd->user_cb;
+
        DEBUG("Event: %s: %s", event->type, name);
 
-       if (!strcmp(event->type, "window:activate") && last_active_win != event->source)        //if we got activate 2 times
+       if (!strcmp(event->type, "window:activate") && wtd->last_active_win != event->source)   //if we got activate 2 times
        {
-               if (user_cb)
-                       user_cb(user_data, event->source);
-               last_active_win = event->source;
-               top_win = last_active_win;
+               if (wtd->user_cb)
+                       user_cb(wtd->user_data, event->source);
+               wtd->last_active_win = event->source;
+               wtd->top_win = wtd->last_active_win;
        }
 
        if (!strcmp(event->type, "object:state-changed:visible") && !strcmp(name, "Quickpanel Window"))
        {
                if (event->detail1)
                {
-                       if (user_cb)
-                               user_cb(user_data, event->source);
-                       top_win = event->source;
+                       if (wtd->user_cb)
+                               user_cb(wtd->user_data, event->source);
+                       wtd->top_win = event->source;
                }
                else
                {
-                       if (user_cb)
-                               user_cb(user_data, last_active_win);
-                       top_win = last_active_win;
+                       if (wtd->user_cb)
+                               user_cb(wtd->user_data, wtd->last_active_win);
+                       wtd->top_win = wtd->last_active_win;
                }
        }
 
        g_free(name);
 }
 
-static AtspiAccessible *_get_active_win(void)
+static AtspiAccessible *_get_active_win(Window_Tracker_Data *wtd)
 {
        DEBUG("START");
        int i, j, desktop_children_count, app_children_count;
-       last_active_win = NULL;
+
+       if (wtd == NULL) {
+               ERROR("WINDOW TRACKER DATA NOT FOUND");
+               return NULL;
+       }
+
+       wtd->last_active_win = NULL;
        AtspiAccessible *desktop = atspi_get_desktop(0);
-       if (!desktop) {
+       if (desktop == NULL) {
                ERROR("DESKTOP NOT FOUND");
                return NULL;
        }
@@ -100,12 +123,12 @@ static AtspiAccessible *_get_active_win(void)
                        AtspiStateSet *states = atspi_accessible_get_state_set(win);
                        AtspiRole role = atspi_accessible_get_role(win, NULL);
                        if ((atspi_state_set_contains(states, ATSPI_STATE_ACTIVE)) && (role == ATSPI_ROLE_WINDOW))
-                               last_active_win = win;
+                               wtd->last_active_win = win;
 
                        g_object_unref(states);
                        g_object_unref(win);
 
-                       if (last_active_win)
+                       if (wtd->last_active_win)
                                break;
                }
                g_object_unref(app);
@@ -115,47 +138,91 @@ static AtspiAccessible *_get_active_win(void)
                        i = -1;
                        active_window_pid = 0;
                }
-               if (last_active_win)
+               if (wtd->last_active_win)
                        break;
        }
        g_object_unref(desktop);
-       DEBUG("END last_active_win: %p", last_active_win);
-       top_win = last_active_win;
-       return last_active_win;
+       DEBUG("END last_active_win: %p", wtd->last_active_win);
+       wtd->top_win = wtd->last_active_win;
+       return wtd->last_active_win;
 }
 
-void window_tracker_init(void)
+Window_Tracker_Data *window_tracker_init(void)
 {
        DEBUG("START");
-       listener = atspi_event_listener_new_simple(_on_atspi_window_cb, NULL);
-       atspi_event_listener_register(listener, "window:activate", NULL);
-       atspi_event_listener_register(listener, "object:state-changed:visible", NULL);
+       Window_Tracker_Data *wtd = calloc(1, sizeof(Window_Tracker_Data));
+
+       if (wtd == NULL) {
+               ERROR("calloc(1,%d) failed", sizeof(Window_Tracker_Data));
+               return NULL;
+       }
+
+       wtd->listener = atspi_event_listener_new_simple(_on_atspi_window_cb, NULL);
+
+       if (wtd->listener == NULL) {
+               ERROR("Listener was not created");
+               free(wtd);
+               return NULL;
+       }
+
+       atspi_event_listener_register(wtd->listener, "window:activate", NULL);
+       atspi_event_listener_register(wtd->listener, "object:state-changed:visible", NULL);
+
+       return wtd;
 }
 
-void window_tracker_shutdown(void)
+void window_tracker_shutdown(Window_Tracker_Data *wtd)
 {
        DEBUG("START");
-       atspi_event_listener_deregister(listener, "window:activate", NULL);
-       atspi_event_listener_deregister(listener, "object:state-changed:visible", NULL);
-       g_object_unref(listener);
-       listener = NULL;
-       user_cb = NULL;
-       user_data = NULL;
-       last_active_win = NULL;
-       top_win = NULL;
+
+       if (wtd == NULL) {
+               ERROR("NULL context");
+               return;
+       }
+
+       if (wtd->listener == NULL) {
+               WARNING("No listener in context");
+       } else {
+               atspi_event_listener_deregister(wtd->listener, "window:activate", NULL);
+               atspi_event_listener_deregister(wtd->listener, "object:state-changed:visible", NULL);
+               g_object_unref(wtd->listener);
+       }
+
+       free(wtd);
 }
 
-void window_tracker_register(Window_Tracker_Cb cb, void *data)
+void window_tracker_register(Window_Tracker_Data *wtd, Window_Tracker_Cb cb, void *data)
 {
        DEBUG("START");
-       user_cb = cb;
-       user_data = data;
+
+       if (wtd == NULL) {
+               ERROR("NULL context");
+               return;
+       }
+
+       wtd->user_cb = cb;
+       wtd->user_data = data;
 }
 
-void window_tracker_active_window_request(void)
+void window_tracker_active_window_request(Window_Tracker_Data *wtd)
 {
        DEBUG("START");
-       _get_active_win();
+
+       if (wtd == NULL) {
+               ERROR("NULL context");
+               return;
+       }
+
+       Window_Tracker_Cb user_cb = wtd->user_cb;
+       _get_active_win(wtd);
        if (user_cb)
-               user_cb(user_data, last_active_win);
+               user_cb(wtd->user_data, wtd->last_active_win);
+}
+
+AtspiAccessible *window_tracker_top_win_get(Window_Tracker_Data *wtd)
+{
+       if (wtd == NULL)
+               return NULL;
+
+       return wtd->top_win;
 }