X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git;a=blobdiff_plain;f=registryd%2Fdeviceeventcontroller.c;h=bdc58169cc8a6c1f183ccac2d22b4b2b5c385e38;hp=2af73aee07026cd80d557e4240e80e10b185d87c;hb=dfc071dcf2f98f282616911cb0eb1636c93f3e77;hpb=866672e4a33e0b5f043699fab555340693943596 diff --git a/registryd/deviceeventcontroller.c b/registryd/deviceeventcontroller.c index 2af73ae..bdc5816 100644 --- a/registryd/deviceeventcontroller.c +++ b/registryd/deviceeventcontroller.c @@ -53,12 +53,12 @@ #include #include -#include #include -#include #include #include +#include + #include "deviceeventcontroller.h" #include "reentrant-list.h" @@ -107,7 +107,7 @@ typedef struct { } DEControllerGrabMask; typedef struct { - char *app_path; + char *bus_name; char *path; SpiDeviceTypeCategory type; gulong types; @@ -339,24 +339,24 @@ spi_dec_clear_unlatch_pending (SpiDEController *controller) { DEControllerPrivateData *priv = g_object_get_qdata (G_OBJECT (controller), spi_dec_private_quark); - priv->xkb_latch_mask = 0; + priv->xkb_latch_mask = 0; } - + static void emit(SpiDEController *controller, const char *name, int first_type, ...) { va_list arg; va_start(arg, first_type); - spi_dbus_emit_valist(controller->registry->droute.bus, SPI_DBUS_PATH_DEC, SPI_DBUS_INTERFACE_DEC, name, first_type, arg); + spi_dbus_emit_valist(controller->bus, SPI_DBUS_PATH_DEC, SPI_DBUS_INTERFACE_DEC, name, first_type, arg); va_end(arg); } static gboolean -spi_dec_button_update_and_emit (SpiDEController *controller, +spi_dec_button_update_and_emit (SpiDEController *controller, guint mask_return) { Accessibility_DeviceEvent mouse_e; - gchar event_name[24]; + gchar event_detail[24]; gboolean is_consumed = FALSE; if ((mask_return & mouse_button_mask) != @@ -435,7 +435,7 @@ spi_dec_button_update_and_emit (SpiDEController *controller, fprintf (stderr, "Button %d %s\n", button_number, (is_down) ? "Pressed" : "Released"); #endif - snprintf (event_name, 22, "mouse:button:%d%c", button_number, + snprintf (event_detail, 22, "%d%c", button_number, (is_down) ? 'p' : 'r'); /* TODO: FIXME distinguish between physical and * logical buttons @@ -455,7 +455,7 @@ spi_dec_button_update_and_emit (SpiDEController *controller, if (!is_consumed) { dbus_uint32_t x = last_mouse_pos->x, y = last_mouse_pos->y; - emit(controller, event_name, DBUS_TYPE_UINT32, &x, DBUS_TYPE_UINT32, &y, DBUS_TYPE_INVALID); + emit(controller, SPI_DBUS_INTERFACE_EVENT_MOUSE, "button", event_detail, x, y); } else spi_dec_set_unlatch_pending (controller, mask_return); @@ -499,10 +499,10 @@ spi_dec_mouse_check (SpiDEController *controller, { // TODO: combine these two signals? dbus_uint32_t ix = *x, iy = *y; - emit(controller, "mouse_abs", DBUS_TYPE_UINT32, &ix, DBUS_TYPE_UINT32, &iy, DBUS_TYPE_INVALID); + emit(controller, SPI_DBUS_INTERFACE_EVENT_MOUSE, "abs", NULL, ix, iy); ix -= last_mouse_pos->x; iy -= last_mouse_pos->y; - emit(controller, "mouse_rel", DBUS_TYPE_UINT32, &ix, DBUS_TYPE_UINT32, &iy, DBUS_TYPE_INVALID); + emit(controller, SPI_DBUS_INTERFACE_EVENT_MOUSE, "rel", NULL, ix, iy); last_mouse_pos->x = *x; last_mouse_pos->y = *y; *moved = True; @@ -534,20 +534,19 @@ spi_dec_emit_modifier_event (SpiDEController *controller, guint prev_mask, d1 = prev_mask & key_modifier_mask; d2 = current_mask & key_modifier_mask; - emit(controller, "keyboard_modifiers", DBUS_TYPE_UINT32, &d1, DBUS_TYPE_UINT32, &d2, DBUS_TYPE_INVALID); + emit(controller, SPI_DBUS_INTERFACE_EVENT_KEYBOARD, "modifiers", NULL, d1, d2); } static gboolean spi_dec_poll_mouse_moved (gpointer data) { - SpiRegistry *registry = SPI_REGISTRY (data); - SpiDEController *controller = registry->de_controller; - int x, y; + SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER(data); + int x, y; gboolean moved; guint mask_return; mask_return = spi_dec_mouse_check (controller, &x, &y, &moved); - + if ((mask_return & key_modifier_mask) != (mouse_mask_state & key_modifier_mask)) { @@ -561,7 +560,7 @@ spi_dec_poll_mouse_moved (gpointer data) static gboolean spi_dec_poll_mouse_idle (gpointer data) { - if (! spi_dec_poll_mouse_moved (data)) + if (! spi_dec_poll_mouse_moved (data)) return TRUE; else { @@ -597,12 +596,12 @@ spi_dec_ungrab_mouse (gpointer data) #endif static void -spi_dec_init_mouse_listener (SpiRegistry *registry) +spi_dec_init_mouse_listener (SpiDEController *dec) { #ifdef GRAB_BUTTON Display *display = spi_get_display (); #endif - g_timeout_add (100, spi_dec_poll_mouse_idle, registry); + g_timeout_add (100, spi_dec_poll_mouse_idle, dec); #ifdef GRAB_BUTTON if (display) @@ -649,7 +648,7 @@ spi_dec_translate_mask (Accessibility_ControllerEventMask mask) } static DEControllerKeyListener * -spi_dec_key_listener_new (const char *app_path, +spi_dec_key_listener_new (const char *bus_name, const char *path, GSList *keys, const Accessibility_ControllerEventMask mask, @@ -657,7 +656,7 @@ spi_dec_key_listener_new (const char *app_path, const Accessibility_EventListenerMode *mode) { DEControllerKeyListener *key_listener = g_new0 (DEControllerKeyListener, 1); - key_listener->listener.app_path = g_strdup(app_path); + key_listener->listener.bus_name = g_strdup(bus_name); key_listener->listener.path = g_strdup(path); key_listener->listener.type = SPI_DEVICE_TYPE_KBD; key_listener->keys = keys; @@ -683,12 +682,12 @@ spi_dec_key_listener_new (const char *app_path, } static DEControllerListener * -spi_dec_listener_new (const char *app_path, +spi_dec_listener_new (const char *bus_name, const char *path, dbus_uint32_t types) { DEControllerListener *listener = g_new0 (DEControllerListener, 1); - listener->app_path = g_strdup(app_path); + listener->bus_name = g_strdup(bus_name); listener->path = g_strdup(path); listener->type = SPI_DEVICE_TYPE_MOUSE; listener->types = types; @@ -699,7 +698,7 @@ static DEControllerListener * spi_listener_clone (DEControllerListener *listener) { DEControllerListener *clone = g_new0 (DEControllerListener, 1); - clone->app_path = g_strdup (listener->app_path); + clone->bus_name = g_strdup (listener->bus_name); clone->path = g_strdup (listener->path); clone->type = listener->type; clone->types = listener->types; @@ -730,7 +729,7 @@ static DEControllerKeyListener * spi_key_listener_clone (DEControllerKeyListener *key_listener) { DEControllerKeyListener *clone = g_new0 (DEControllerKeyListener, 1); - clone->listener.app_path = g_strdup (key_listener->listener.app_path); + clone->listener.bus_name = g_strdup (key_listener->listener.bus_name); clone->listener.path = g_strdup (key_listener->listener.path); clone->listener.type = SPI_DEVICE_TYPE_KBD; clone->keys = keylist_clone (key_listener->keys); @@ -777,14 +776,14 @@ static void spi_listener_clone_free (DEControllerListener *clone) { g_free (clone->path); - g_free (clone->app_path); + g_free (clone->bus_name); g_free (clone); } static void spi_dec_listener_free (DEControllerListener *listener) { - g_free (listener->app_path); + g_free (listener->bus_name); g_free (listener->path); if (listener->type == SPI_DEVICE_TYPE_KBD) spi_key_listener_data_free ((DEControllerKeyListener *) listener); @@ -835,10 +834,6 @@ _deregister_keygrab (SpiDEController *controller, cur_mask->pending_remove = TRUE; } } - else - { - DBG (1, g_warning ("De-registering non-existant grab")); - } } static void @@ -917,6 +912,7 @@ spi_controller_register_device_listener (SpiDEController *controller, controller->key_listeners = g_list_prepend (controller->key_listeners, key_listener); + spi_dbus_add_disconnect_match (controller->bus, key_listener->listener.bus_name); if (key_listener->mode->global) { return spi_controller_register_global_keygrabs (controller, key_listener); @@ -926,17 +922,21 @@ spi_controller_register_device_listener (SpiDEController *controller, break; case SPI_DEVICE_TYPE_MOUSE: controller->mouse_listeners = g_list_prepend (controller->mouse_listeners, listener); + spi_dbus_add_disconnect_match (controller->bus, listener->bus_name); break; default: - DBG (1, g_warning ("listener registration for unknown device type.\n")); break; } - return FALSE; + return FALSE; } -static gboolean Accessibility_DeviceEventListener_notifyEvent(SpiRegistry *registry, DEControllerListener *listener, const Accessibility_DeviceEvent *key_event) +static gboolean +Accessibility_DeviceEventListener_notifyEvent(SpiDEController *controller, + SpiRegistry *registry, + DEControllerListener *listener, + const Accessibility_DeviceEvent *key_event) { - DBusMessage *message = dbus_message_new_method_call(listener->app_path, listener->path, "org.freedesktop.atspi.Registry", "notifyEvent"); + DBusMessage *message = dbus_message_new_method_call(listener->bus_name, listener->path, "org.freedesktop.atspi.Registry", "notifyEvent"); DBusError error; dbus_bool_t consumed = FALSE; @@ -945,7 +945,7 @@ static gboolean Accessibility_DeviceEventListener_notifyEvent(SpiRegistry *regis { // TODO: Evaluate performance: perhaps rework this whole architecture // to avoid blocking calls - DBusMessage *reply = dbus_connection_send_with_reply_and_block(registry->droute.bus, message, 1000, &error); + DBusMessage *reply = dbus_connection_send_with_reply_and_block(controller->bus, message, 1000, &error); if (reply) { DBusError error; @@ -999,16 +999,16 @@ spi_controller_notify_mouselisteners (SpiDEController *controlle is_consumed = FALSE; for (l2 = notify; l2 && !is_consumed; l2 = l2->next) { - DEControllerListener *listener = l2->data; + DEControllerListener *listener = l2->data; + + is_consumed = Accessibility_DeviceEventListener_notifyEvent (controller, controller->registry, listener, event); - is_consumed = Accessibility_DeviceEventListener_notifyEvent (controller->registry, listener, event); - spi_listener_clone_free ((DEControllerListener *) l2->data); } for (; l2; l2 = l2->next) { - DEControllerListener *listener = l2->data; + DEControllerListener *listener = l2->data; spi_listener_clone_free (listener); /* clone doesn't have its own ref, so don't use spi_device_listener_free */ } @@ -1026,7 +1026,7 @@ spi_device_event_controller_forward_mouse_event (SpiDEController *controller, XEvent *xevent) { Accessibility_DeviceEvent mouse_e; - gchar event_name[24]; + gchar event_detail[24]; gboolean is_consumed = FALSE; gboolean xkb_mod_unlatch_occurred; XButtonEvent *xbutton_event = (XButtonEvent *) xevent; @@ -1064,7 +1064,7 @@ spi_device_event_controller_forward_mouse_event (SpiDEController *controller, (xevent->type == ButtonPress) ? "Press" : "Release", mouse_button_state); #endif - snprintf (event_name, 22, "mouse:button_%d%c", button, + snprintf (event_detail, 22, "%d%c", button, (xevent->type == ButtonPress) ? 'p' : 'r'); /* TODO: FIXME distinguish between physical and logical buttons */ @@ -1089,7 +1089,8 @@ spi_device_event_controller_forward_mouse_event (SpiDEController *controller, spi_controller_notify_mouselisteners (controller, &mouse_e); ix = last_mouse_pos->x; iy = last_mouse_pos->y; - emit(controller, event_name, DBUS_TYPE_UINT32, &ix, DBUS_TYPE_UINT32, &iy, DBUS_TYPE_INVALID); + /* TODO - Work out which part of the spec this emit is fulfilling */ + //emit(controller, SPI_DBUS_INTERFACE_EVENT_MOUSE, "button", event_detail, ix, iy); } xkb_mod_unlatch_occurred = (xevent->type == ButtonPress || @@ -1229,8 +1230,6 @@ global_filter_fn (GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data) priv->xkb_latch_mask = xkb_snev->latched_mods; } } - else - DBG (2, g_warning ("XKB event %d\n", xkb_ev->xkb_type)); XSynchronize (display, FALSE); } @@ -1255,10 +1254,14 @@ _spi_controller_device_error_handler (Display *display, XErrorEvent *error) static void spi_controller_register_with_devices (SpiDEController *controller) { - DEControllerPrivateData *priv = (DEControllerPrivateData *) - g_object_get_qdata (G_OBJECT (controller), spi_dec_private_quark); - /* FIXME: should check for extension first! */ - XTestGrabControl (spi_get_display (), True); + DEControllerPrivateData *priv; + int event_base, error_base, major_version, minor_version; + + priv = (DEControllerPrivateData *) g_object_get_qdata (G_OBJECT (controller), spi_dec_private_quark); + if (XTestQueryExtension (spi_get_display(), &event_base, &error_base, &major_version, &minor_version)) + { + XTestGrabControl (spi_get_display (), True); + } /* calls to device-specific implementations and routines go here */ /* register with: keyboard hardware code handler */ @@ -1457,7 +1460,7 @@ spi_controller_notify_keylisteners (SpiDEController *controller, { DEControllerKeyListener *key_listener = l2->data; - is_consumed = Accessibility_DeviceEventListener_notifyEvent (controller->registry, &key_listener->listener, key_event) && + is_consumed = Accessibility_DeviceEventListener_notifyEvent (controller, controller->registry, &key_listener->listener, key_event) && key_listener->mode->preemptive; spi_key_listener_clone_free (key_listener); @@ -1778,7 +1781,7 @@ impl_register_keystroke_listener (DBusConnection *bus, DBusMessage *message, void *user_data) { - SpiDEController *controller = SPI_REGISTRY(user_data)->de_controller; + SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER(user_data); DEControllerKeyListener *dec_listener; DBusMessageIter iter, iter_array; const char *path; @@ -1838,7 +1841,7 @@ impl_register_device_listener (DBusConnection *bus, DBusMessage *message, void *user_data) { - SpiDEController *controller = SPI_REGISTRY(user_data)->de_controller; + SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER(user_data); DEControllerListener *dec_listener; DBusError error; const char *path; @@ -1874,10 +1877,11 @@ remove_listener_cb (GList * const *list, DEControllerListener *listener = (*list)->data; RemoveListenerClosure *ctx = user_data; - if (!strcmp(ctx->listener->app_path, listener->app_path) && + if (!strcmp(ctx->listener->bus_name, listener->bus_name) && !strcmp(ctx->listener->path, listener->path)) { spi_re_entrant_list_delete_link (list); + spi_dbus_remove_disconnect_match (ctx->bus, listener->bus_name); spi_dec_listener_free (listener); } @@ -1891,7 +1895,7 @@ copy_key_listener_cb (GList * const *list, DEControllerKeyListener *key_listener = (*list)->data; RemoveListenerClosure *ctx = user_data; - if (!strcmp(ctx->listener->app_path, key_listener->listener.app_path) && + if (!strcmp(ctx->listener->bus_name, key_listener->listener.bus_name) && !strcmp(ctx->listener->path, key_listener->listener.path)) { /* TODO: FIXME aggregate keys in case the listener is registered twice */ @@ -1910,7 +1914,7 @@ spi_controller_deregister_device_listener (SpiDEController *controlle { RemoveListenerClosure ctx; - ctx.bus = controller->registry->droute.bus; + ctx.bus = controller->bus; ctx.listener = listener; spi_re_entrant_list_foreach (&controller->mouse_listeners, @@ -1923,7 +1927,7 @@ spi_deregister_controller_key_listener (SpiDEController *controller, { RemoveListenerClosure ctx; - ctx.bus = controller->registry->droute.bus; + ctx.bus = controller->bus; ctx.listener = (DEControllerListener *) key_listener; /* special case, copy keyset from existing controller list entry */ @@ -1932,7 +1936,7 @@ spi_deregister_controller_key_listener (SpiDEController *controller, spi_re_entrant_list_foreach (&controller->key_listeners, copy_key_listener_cb, &ctx); } - + spi_controller_deregister_global_keygrabs (controller, key_listener); spi_re_entrant_list_foreach (&controller->key_listeners, @@ -1940,6 +1944,31 @@ spi_deregister_controller_key_listener (SpiDEController *controller, } +void +spi_remove_device_listeners (SpiDEController *controller, const char *bus_name) +{ + GList *l, *tmp; + + for (l = controller->mouse_listeners; l; l = tmp) + { + DEControllerListener *listener = l->data; + tmp = l->next; + if (!strcmp (listener->bus_name, bus_name)) + { + spi_controller_deregister_device_listener (controller, listener); + } + } + for (l = controller->key_listeners; l; l = tmp) + { + DEControllerKeyListener *key_listener = l->data; + tmp = l->next; + if (!strcmp (key_listener->listener.bus_name, bus_name)) + { + spi_deregister_controller_key_listener (controller, key_listener); + } + } +} + /* * DBus Accessibility::DEController::deregisterKeystrokeListener * method implementation @@ -1949,7 +1978,7 @@ impl_deregister_keystroke_listener (DBusConnection *bus, DBusMessage *message, void *user_data) { - SpiDEController *controller = SPI_REGISTRY(user_data)->de_controller; + SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER(user_data); DEControllerKeyListener *key_listener; DBusMessageIter iter, iter_array; const char *path; @@ -2001,7 +2030,7 @@ impl_deregister_device_listener (DBusConnection *bus, DBusMessage *message, void *user_data) { - SpiDEController *controller = SPI_REGISTRY(user_data)->de_controller; + SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER(user_data); DEControllerListener *listener; DBusError error; const char *path; @@ -2253,7 +2282,7 @@ dec_synth_keystring (SpiDEController *controller, const char *keystring) gboolean retval = TRUE; const gchar *c; - maxlen = strlen (keystring); + maxlen = strlen (keystring) + 1; keysyms = g_new0 (KeySym, maxlen); if (!(keystring && *keystring && g_utf8_validate (keystring, -1, &c))) { retval = FALSE; @@ -2309,7 +2338,7 @@ dec_synth_keystring (SpiDEController *controller, const char *keystring) */ static DBusMessage * impl_generate_keyboard_event (DBusConnection *bus, DBusMessage *message, void *user_data) { - SpiDEController *controller = SPI_REGISTRY(user_data)->de_controller; + SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER(user_data); DBusError error; dbus_int32_t keycode; char *keystring; @@ -2372,10 +2401,6 @@ static DBusMessage * impl_generate_keyboard_event (DBusConnection *bus, DBusMess keystring); break; } - if ((err = gdk_error_trap_pop ())) - { - DBG (-1, g_warning ("Error [%d] emitting keystroke", err)); - } if (synth_type == Accessibility_KEY_SYM) { keysym = keycode; } @@ -2469,7 +2494,7 @@ static DBusMessage * impl_generate_mouse_event (DBusConnection *bus, DBusMessage static DBusMessage * impl_notify_listeners_sync (DBusConnection *bus, DBusMessage *message, void *user_data) { - SpiDEController *controller = SPI_REGISTRY(user_data)->de_controller; + SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER(user_data); Accessibility_DeviceEvent event; dbus_bool_t ret; DBusMessage *reply; @@ -2497,7 +2522,7 @@ impl_notify_listeners_sync (DBusConnection *bus, DBusMessage *message, void *use static DBusMessage * impl_notify_listeners_async (DBusConnection *bus, DBusMessage *message, void *user_data) { - SpiDEController *controller = SPI_REGISTRY(user_data)->de_controller; + SpiDEController *controller = SPI_DEVICE_EVENT_CONTROLLER(user_data); Accessibility_DeviceEvent event; DBusMessage *reply; @@ -2521,7 +2546,7 @@ spi_device_event_controller_class_init (SpiDEControllerClass *klass) GObjectClass * object_class = (GObjectClass *) klass; spi_device_event_controller_parent_class = g_type_class_peek_parent (klass); - + object_class->finalize = spi_device_event_controller_object_finalize; if (!spi_dec_private_quark) @@ -2623,18 +2648,6 @@ spi_device_event_controller_forward_key_event (SpiDEController *controller, return ret; } -SpiDEController * -spi_device_event_controller_new (SpiRegistry *registry) -{ - SpiDEController *retval = g_object_new ( - SPI_DEVICE_EVENT_CONTROLLER_TYPE, NULL); - - retval->registry = g_object_ref (registry); - - spi_dec_init_mouse_listener (registry); - /* TODO: kill mouse listener on finalize */ - return retval; -} static gboolean is_key_released (KeyCode code) @@ -2673,7 +2686,7 @@ static void wait_for_release_event (XEvent *event, check_release_handler = g_timeout_add (CHECK_RELEASE_DELAY, check_release, &pressed_event); } -static DRouteMethod methods[] = +static DRouteMethod dev_methods[] = { { impl_register_keystroke_listener, "registerKeystrokeListener" }, { impl_register_device_listener, "registerDeviceListener" }, @@ -2686,9 +2699,26 @@ static DRouteMethod methods[] = { NULL, NULL } }; -void -spi_registry_initialize_dec_interface (DRouteData * data) +SpiDEController * +spi_registry_dec_new (SpiRegistry *reg, DBusConnection *bus, DRouteContext *droute) { - droute_add_interface (data, "org.freedesktop.atspi.DeviceEventController", methods, - NULL, NULL, NULL); -}; + SpiDEController *dec = g_object_new (SPI_DEVICE_EVENT_CONTROLLER_TYPE, NULL); + DRoutePath *path; + + dec->registry = g_object_ref (reg); + dec->bus = bus; + + path = droute_add_one (droute, + "/org/freedesktop/atspi/registry/deviceeventcontroller", + dec); + + droute_path_add_interface (path, + SPI_DBUS_INTERFACE_DEC, + dev_methods, + NULL); + + spi_dec_init_mouse_listener (dec); + /* TODO: kill mouse listener on finalize */ + + return dec; +}