static int _init_count;
static GList *_roots;
static AtspiEventListener *_listener;
+static AppTrackerEventCB _new_obj_highlighted_callback;
static int _is_descendant(AtspiAccessible * ancestor, AtspiAccessible * descendant)
{
return ret;
}
+static Eina_Bool _object_has_highlighted_state(AtspiAccessible * obj)
+{
+ if (!obj)
+ return EINA_FALSE;
+
+ Eina_Bool ret = EINA_FALSE;
+
+ AtspiStateSet *ss = atspi_accessible_get_state_set(obj);
+
+ if (atspi_state_set_contains(ss, ATSPI_STATE_HIGHLIGHTED))
+ ret = EINA_TRUE;
+ g_object_unref(ss);
+ return ret;
+}
+
static void _subtree_callbacks_call(SubTreeRootData * std)
{
DEBUG("START");
_print_event_object_info(event);
+ AtspiAccessible *new_highlighted_obj = NULL;
+
+ if (!strcmp(event->type, "object:state-changed:highlighted"))
+ new_highlighted_obj = event->source;
+ else if (!strcmp(event->type, "object:active-descendant-changed"))
+ new_highlighted_obj = atspi_accessible_get_child_at_index(event->source, event->detail1, NULL);
+
+ if (new_highlighted_obj && _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, NULL);
+ g_object_unref(new_highlighted_obj);
+ new_highlighted_obj = NULL;
+ }
+
for (l = _roots; l != NULL; l = l->next) {
std = l->data;
static int _app_tracker_init_internal(void)
{
DEBUG("START");
+ _new_obj_highlighted_callback = 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:visible", NULL);
atspi_event_listener_register(_listener, "object:state-changed:defunct", NULL);
+ atspi_event_listener_register(_listener, "object:state-changed:highlighted", NULL);
atspi_event_listener_register(_listener, "object:bounds-changed", NULL);
atspi_event_listener_register(_listener, "object:visible-data-changed", NULL);
+ atspi_event_listener_register(_listener, "object:active-descendant-changed", NULL);
return 0;
}
{
atspi_event_listener_deregister(_listener, "object:state-changed:showing", NULL);
atspi_event_listener_deregister(_listener, "object:state-changed:visible", NULL);
+ atspi_event_listener_deregister(_listener, "object:state-changed:highlighted", NULL);
atspi_event_listener_deregister(_listener, "object:bounds-changed", NULL);
atspi_event_listener_deregister(_listener, "object:state-changed:defunct", NULL);
atspi_event_listener_deregister(_listener, "object:visible-data-changed", NULL);
+ atspi_event_listener_deregister(_listener, "object:active-descendant-changed", NULL);
g_object_unref(_listener);
_listener = NULL;
-
+ _new_obj_highlighted_callback = NULL;
g_list_free_full(_roots, _free_rootdata);
_roots = NULL;
}
DEBUG("END");
}
+void app_tracker_new_obj_highlighted_callback_register(AppTrackerEventCB cb)
+{
+ _new_obj_highlighted_callback = cb;
+}
+
void app_tracker_callback_unregister(AtspiAccessible * app, AppTrackerEventCB cb, void *user_data)
{
DEBUG("START");
g_free(std);
}
}
+
+void app_tracker_new_obj_highlighted_callback_unregister(AppTrackerEventCB cb)
+{
+ _new_obj_highlighted_callback = NULL;
+}
return strdup("ATSPI_STATE_LAST_DEFINED");
case ATSPI_STATE_MODAL:
return strdup("ATSPI_STATE_MODAL");
+ case ATSPI_STATE_HIGHLIGHTED:
+ return strdup("ATSPI_STATE_HIGHLIGHTED");
+ case ATSPI_STATE_HIGHLIGHTABLE:
+ return strdup("ATSPI_STATE_HIGHLIGHTABLE");
default:
return strdup("\0");
}
DEBUG("END");
}
+static void _new_highlighted_obj_changed(AtspiAccessible * new_highlighted_obj, void *user_data)
+{
+ DEBUG("context: %p, current: %p, new_highlighted_obj: %p", context, flat_navi_context_current_get(context), new_highlighted_obj);
+ if (context && flat_navi_context_current_get(context) != new_highlighted_obj) {
+ flat_navi_context_current_set(context, g_object_ref(new_highlighted_obj));
+ }
+}
+
void clear(gpointer d)
{
AtspiAccessible **data = d;
// register on active_window
dbus_gesture_adapter_init();
app_tracker_init();
+ app_tracker_new_obj_highlighted_callback_register(_new_highlighted_obj_changed);
window_tracker_init();
window_tracker_register(on_window_activate, NULL);
window_tracker_active_window_request();
return;
}
}
- DEBUG("i: %i, ev->multi.device: %i", i, ev->multi.device);
int dx = ev->root.x - cov->flick_gesture.x_org[i];
int dy = ev->root.y - cov->flick_gesture.y_org[i];
Ecore_X_Window wins[1] = { win };
Ecore_X_Window under = ecore_x_window_at_xy_with_skip_get(x, y, wins, sizeof(wins) / sizeof(wins[0]));
_get_root_coords(under, &rx, &ry);
- DEBUG("Starting scroll: %d %d", x - rx, y - ry);
ecore_x_mouse_in_send(under, x - rx, y - ry);
ecore_x_window_focus(under);
ecore_x_mouse_down_send(under, x - rx, y - ry, 1);
void continue_scroll(int x, int y)
{
- DEBUG("Continuing scroll: %d %d", x - rx, y - ry);
ecore_x_mouse_move_send(scrolled_win, x - rx, y - ry);
}
void end_scroll(int x, int y)
{
- DEBUG("Ending scroll : %d %d", x - rx, y - ry);
ecore_x_mouse_up_send(scrolled_win, x - rx, y - ry, 1);
ecore_x_mouse_out_send(scrolled_win, x - rx, y - ry);
}