#include "window_tracker.h"
#include "logger.h"
-#define BUS "com.samsung.EModule"
-#define INTERFACE "com.samsung.WindowTracker"
-#define PATH "/com/samsung/WindowTracker"
-#define METHOD "GetActiveWindow"
-#define SIGNAL "ActiveWindowChanged"
-
-static Eldbus_Connection *a11y_conn;
-static Eldbus_Proxy *man;
-static Eldbus_Object *object;
static Window_Tracker_Cb user_cb;
static void *user_data;
+static AtspiEventListener *listener;
+static AtspiAccessible *last_active_win;
-static void _get_active_win_from_pid(int pid)
+static void
+_on_atspi_window_cb(const AtspiEvent *event)
{
- int i;
- AtspiAccessible *desktop = atspi_get_desktop(0);
- atspi_accessible_set_cache_mask(desktop, ATSPI_CACHE_NONE);
- for (i = 0; i < atspi_accessible_get_child_count(desktop, NULL); i++) {
- AtspiAccessible *app = atspi_accessible_get_child_at_index(desktop, i, NULL);
- if(atspi_accessible_get_process_id(app, NULL) == pid) {
- int j;
- for (j = 0; j < atspi_accessible_get_child_count(app, NULL); j++) {
- AtspiAccessible *win = atspi_accessible_get_child_at_index(app, j, 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))
- {
- user_cb(user_data, win);
- return;
- }
- }
- }
- }
- user_cb(user_data, NULL);
+ if (!strcmp(event->type, "window:activate"))
+ {
+ last_active_win = event->source;
+ if (user_cb) user_cb(user_data, event->source);
+ }
+ else if (!strcmp(event->type, "window:deactivate"))
+ {
+ if ((last_active_win == event->source) &&
+ user_cb)
+ user_cb(user_data, NULL);
+ }
}
-AtspiAccessible* _get_active_win(void)
+static AtspiAccessible*
+_get_active_win(void)
{
int i, j;
+ last_active_win = NULL;
AtspiAccessible *desktop = atspi_get_desktop(0);
for (i = 0; i < atspi_accessible_get_child_count(desktop, NULL); i++) {
AtspiRole role = atspi_accessible_get_role(win, NULL);
if ((atspi_state_set_contains(states, ATSPI_STATE_ACTIVE)) && (role == ATSPI_ROLE_WINDOW))
- return win;
+ {
+ g_object_unref(states);
+ last_active_win = win;
+ break;
+ }
+ g_object_unref(states);
}
}
- return NULL;
+ return last_active_win;
}
-static void _get_win(void *data, const Eldbus_Message *msg, Eldbus_Pending *pending EINA_UNUSED)
+void window_tracker_init(void)
{
- int pid, id;
-
- if(! eldbus_message_arguments_get(msg, "ii", &pid, &id))
- ERROR("error geting arguments _get_win");
- _get_active_win_from_pid(pid);
+ listener = atspi_event_listener_new_simple(_on_atspi_window_cb, NULL);
+ atspi_event_listener_register(listener, "window:activate", NULL);
+ atspi_event_listener_register(listener, "window:deactivate", NULL);
}
-static void active_window_changed(void *context EINA_UNUSED, const Eldbus_Message *msg)
-{
- int pid, id;
-
- if(!eldbus_message_arguments_get(msg, "ii", &pid, &id))
- ERROR("error geting arguments active_window_changed");
- _get_active_win_from_pid(pid);
-}
-
-void window_tracker_init(Eldbus_Connection *conn)
-{
- a11y_conn = conn;
- eldbus_connection_ref(conn);
- object = eldbus_object_get(conn, BUS, PATH);
- man = eldbus_proxy_get(object, INTERFACE);
- eldbus_proxy_signal_handler_add(man, SIGNAL, active_window_changed, NULL);
-}
void window_tracker_shutdown(void)
{
- eldbus_proxy_unref(man);
- eldbus_object_unref(object);
- eldbus_connection_unref(a11y_conn);
+ atspi_event_listener_deregister(listener, "window:activate", NULL);
+ atspi_event_listener_deregister(listener, "window:deactivate", NULL);
+ g_object_unref(listener);
+ listener = NULL;
+ user_cb = NULL;
+ user_data = NULL;
+ last_active_win = NULL;
}
void window_tracker_register(Window_Tracker_Cb cb, void *data)
void window_tracker_active_window_request(void)
{
- if(!a11y_conn) {
- ERROR("window_tracker not initialized!");
- return;
- }
- if(!user_cb) {
- ERROR("window_tracker not registered!");
- return;
- }
- eldbus_proxy_call(man, METHOD, _get_win, NULL, -1, "");
+ _get_active_win();
+ if (user_cb) user_cb(user_data, last_active_win);
}