window_tracker: listen to atspi:window events instead of e-17 module
authorLukasz Stanislawski <l.stanislaws@samsung.com>
Wed, 17 Dec 2014 15:00:22 +0000 (16:00 +0100)
committerLukasz Stanislawski <l.stanislaws@samsung.com>
Wed, 17 Dec 2014 15:00:22 +0000 (16:00 +0100)
include/window_tracker.h
src/main.c
src/navigator.c
src/window_tracker.c

index 1f4754e..a36fd28 100644 (file)
@@ -1,7 +1,6 @@
-#include <eldbus-1/Eldbus.h>
 #include <atspi/atspi.h>
 
-void window_tracker_init(Eldbus_Connection *conn);
+void window_tracker_init(void);
 void window_tracker_shutdown(void);
 
 typedef void (*Window_Tracker_Cb) (void *data, AtspiAccessible *window);
index 7c39767..d928fe8 100755 (executable)
@@ -21,7 +21,6 @@ static void _init_modules(void *data, const Eldbus_Message *msg, Eldbus_Pending
       ERROR("error geting arguments _init_modules");
    Eldbus_Connection *a11y_conn = eldbus_address_connection_get(a11y_bus_address);
    
-   window_tracker_init(a11y_conn); 
    gesture_tracker_init(a11y_conn);
    navigator_init();
 }
@@ -40,7 +39,6 @@ static int app_create(void *data)
 static int app_terminate(void *data)
 {
     eldbus_connection_unref(a11y_conn);
-    window_tracker_shutdown();
     gesture_tracker_shutdown();
     navigator_shutdown();
     eldbus_shutdown();
index 9b4163c..b6631fc 100644 (file)
@@ -714,6 +714,7 @@ void navigator_init(void)
    // register on gesture_getected
    gesture_tracker_register(on_gesture_detected, NULL);
    // register on active_window
+   window_tracker_init();
    window_tracker_register(on_window_activate, NULL);
    window_tracker_active_window_request();
    app_tracker_init();
@@ -730,4 +731,5 @@ void navigator_shutdown(void)
      }
    object_cache_shutdown();
    app_tracker_shutdown();
+   window_tracker_shutdown();
 }
index c0ffc66..3ceb4eb 100644 (file)
@@ -2,46 +2,32 @@
 #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++) {
@@ -52,43 +38,33 @@ AtspiAccessible* _get_active_win(void)
           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)
@@ -99,13 +75,6 @@ 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);
 }