#define KEYBOARD_TRACKER_H_
#include "screen_reader.h"
+
/*
* @brief Creates listener and initializes eldbus.
*
* @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);
/**
/*
* @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
*
*
* @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
/**
* @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);
int voice_type;
} Voice_Info;
+typedef void (*Window_Tracker_Cb) (void *data, AtspiAccessible *window);
typedef enum
{
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;
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;
+#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
#include "keyboard_tracker.h"
#include "logger.h"
#include "screen_reader_tts.h"
+#include "window_tracker.h"
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] = {
}
#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);
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();
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);
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();
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);
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: {
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',
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);
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);
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);
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);
//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);
.gesture_adapter_data = NULL,
.system_data = NULL,
.app_tracker_ctx = NULL,
+ .window_tracker_data = NULL,
//Set by vconf
.run_service = 1,
#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;
}
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);
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;
}