X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=libspi%2Fregistry.c;h=14622fddacec622c74dda53a55af058a6b839f5a;hb=1dff58020353cc5e4423c804d4f0e140ae4def7d;hp=0f39ed7a7e726471043ce2854b88ac93205a8e55;hpb=60ea797aa906619deaaf946e5e4bd8f548d9ad71;p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git diff --git a/libspi/registry.c b/libspi/registry.c index 0f39ed7..14622fd 100644 --- a/libspi/registry.c +++ b/libspi/registry.c @@ -36,6 +36,14 @@ #include /* + * We'd like to replace the dependance on X-isms with a wrapper layer, + * to the extent that it can't be done with pure GDK. + * Anyone want to help? + */ +#include +#include + +/* * This pulls the definition for the BonoboObject (GType) */ #include "registry.h" @@ -52,6 +60,8 @@ static ListenerClass *registry_parent_class; typedef enum { ETYPE_FOCUS, + ETYPE_OBJECT, + ETYPE_PROPERTY, ETYPE_WINDOW, ETYPE_TOOLKIT, ETYPE_LAST_DEFINED @@ -79,6 +89,8 @@ static void _registry_notify_listeners ( GList *listeners, static long _get_unique_id(); +static gboolean _device_event_controller_hook (gpointer source); + /* * Implemented GObject::finalize */ @@ -112,7 +124,7 @@ impl_accessibility_registry_register_application (PortableServer_Servant servant fprintf (stderr, "registering app %p\n", application); #endif registry->desktop->applications = g_list_append (registry->desktop->applications, - CORBA_Object_duplicate (application, ev)); + bonobo_object_dup_ref (application, ev)); /* TODO: create unique string here (with libuuid call ?) and hash ? */ Accessibility_Application__set_id (application, _get_unique_id(), ev); @@ -124,7 +136,7 @@ impl_accessibility_registry_register_application (PortableServer_Servant servant } static gint -compare_object_hash (gconstpointer p1, gconstpointer p2) +compare_corba_objects (gconstpointer p1, gconstpointer p2) { CORBA_Environment ev; gint retval; @@ -147,7 +159,7 @@ register_with_toolkits (Registry *registry_bonobo_object, EventTypeStruct *etype Accessibility_Desktop desktop; Accessibility_Application app; Accessibility_Registry registry; - registry = bonobo_object_corba_objref (bonobo_object (registry_bonobo_object)); + registry = BONOBO_OBJREF (registry_bonobo_object); /* for each app in each desktop, call ...Application_registerToolkitEventListener */ @@ -162,11 +174,11 @@ register_with_toolkits (Registry *registry_bonobo_object, EventTypeStruct *etype app = (Accessibility_Application) Accessibility_Desktop_getChildAtIndex (desktop, j, ev); - /* TODO: should we be ref-ing the registry object before each call ? */ - Accessibility_Application_registerToolkitEventListener (app, - registry, - CORBA_string_dup (etype->event_name), - ev); + Accessibility_Application_registerToolkitEventListener (app, + registry, + CORBA_string_dup (etype->event_name), + + ev); } } } @@ -190,6 +202,10 @@ parse_event_type (EventTypeStruct *etype, char *event_name) { etype->type_cat = ETYPE_FOCUS; } + else if (!g_ascii_strncasecmp (event_name, "object:", 7)) + { + etype->type_cat = ETYPE_OBJECT; + } else if (!g_ascii_strncasecmp (event_name, "window:", 7)) { etype->type_cat = ETYPE_WINDOW; @@ -248,7 +264,7 @@ impl_accessibility_registry_deregister_application (PortableServer_Servant serva CORBA_Environment * ev) { Registry *registry = REGISTRY (bonobo_object_from_servant (servant)); - GList *list = g_list_find_custom (registry->desktop->applications, application, compare_object_hash); + GList *list = g_list_find_custom (registry->desktop->applications, application, compare_corba_objects); #ifdef SPI_DEBUG gint i; @@ -277,8 +293,8 @@ impl_accessibility_registry_deregister_application (PortableServer_Servant serva * CORBA Accessibility::Registry::registerGlobalEventListener method implementation */ static void -impl_accessibility_registry_register_global_event_listener - (PortableServer_Servant servant, +impl_accessibility_registry_register_global_event_listener ( + PortableServer_Servant servant, Accessibility_EventListener listener, const CORBA_char *event_name, CORBA_Environment *ev) @@ -286,6 +302,7 @@ impl_accessibility_registry_register_global_event_listener Registry *registry = REGISTRY (bonobo_object_from_servant (servant)); ListenerStruct *ls = g_malloc (sizeof (ListenerStruct)); EventTypeStruct etype; + gboolean is_toolkit_specific = TRUE; fprintf(stderr, "registering for events of type %s\n", event_name); @@ -297,9 +314,11 @@ impl_accessibility_registry_register_global_event_listener switch (etype.type_cat) { case (ETYPE_FOCUS) : + case (ETYPE_OBJECT) : + case (ETYPE_PROPERTY) : ls->listener = CORBA_Object_duplicate (listener, ev); - registry->focus_listeners = - g_list_append (registry->focus_listeners, ls); + registry->object_listeners = + g_list_append (registry->object_listeners, ls); break; case (ETYPE_WINDOW) : /* Support for Window Manager Events is not yet implemented */ @@ -319,13 +338,13 @@ impl_accessibility_registry_register_global_event_listener * CORBA Accessibility::Registry::deregisterGlobalEventListenerAll method implementation */ static void -impl_accessibility_registry_deregister_global_event_listener_all - (PortableServer_Servant servant, +impl_accessibility_registry_deregister_global_event_listener_all ( + PortableServer_Servant servant, Accessibility_EventListener listener, CORBA_Environment *ev) { Registry *registry = REGISTRY (bonobo_object_from_servant (servant)); - GList *list = g_list_find_custom (registry->focus_listeners, listener, compare_object_hash); + GList *list = g_list_find_custom (registry->object_listeners, listener, compare_corba_objects); /* * TODO : de-register with toolkit if the last instance of a listener @@ -335,15 +354,15 @@ impl_accessibility_registry_deregister_global_event_listener_all while (list) { fprintf (stderr, "deregistering listener\n"); - registry->focus_listeners = g_list_delete_link (registry->focus_listeners, list); - list = g_list_find_custom (registry->focus_listeners, listener, compare_object_hash); + registry->object_listeners = g_list_delete_link (registry->object_listeners, list); + list = g_list_find_custom (registry->object_listeners, listener, compare_corba_objects); } - list = g_list_find_custom (registry->toolkit_listeners, listener, compare_object_hash); + list = g_list_find_custom (registry->toolkit_listeners, listener, compare_corba_objects); while (list) { fprintf (stderr, "deregistering listener\n"); registry->toolkit_listeners = g_list_delete_link (registry->toolkit_listeners, list); - list = g_list_find_custom (registry->toolkit_listeners, listener, compare_object_hash); + list = g_list_find_custom (registry->toolkit_listeners, listener, compare_corba_objects); } } @@ -351,8 +370,8 @@ impl_accessibility_registry_deregister_global_event_listener_all * CORBA Accessibility::Registry::deregisterGlobalEventListener method implementation */ static void -impl_accessibility_registry_deregister_global_event_listener - (PortableServer_Servant servant, +impl_accessibility_registry_deregister_global_event_listener ( + PortableServer_Servant servant, Accessibility_EventListener listener, const CORBA_char * event_name, CORBA_Environment *ev) @@ -366,8 +385,10 @@ impl_accessibility_registry_deregister_global_event_listener parse_event_type (&etype, event_name); switch (etype.type_cat) { + case (ETYPE_OBJECT) : + case (ETYPE_PROPERTY) : case (ETYPE_FOCUS) : - listeners = ®istry->focus_listeners; + listeners = ®istry->object_listeners; break; case (ETYPE_WINDOW) : /* Support for Window Manager Events is not yet implemented */ @@ -428,8 +449,7 @@ impl_accessibility_registry_get_desktop (PortableServer_Servant servant, if (n == 0) { return (Accessibility_Desktop) - CORBA_Object_duplicate ( - bonobo_object_corba_objref (bonobo_object (registry->desktop)), ev); + CORBA_Object_duplicate (BONOBO_OBJREF (registry->desktop), ev); } else { @@ -453,12 +473,14 @@ impl_accessibility_registry_get_desktop_list (PortableServer_Servant servant, return (Accessibility_DesktopSeq *) NULL; } -static CORBA_Object +static Accessibility_DeviceEventController impl_accessibility_registry_get_device_event_controller (PortableServer_Servant servant, CORBA_Environment * ev) { - /* TODO: not yet implemented! */ - return CORBA_OBJECT_NIL; + Registry *registry = REGISTRY (bonobo_object_from_servant (servant)); + if (!registry->device_event_controller) + registry->device_event_controller = g_object_new (DEVICE_EVENT_CONTROLLER_TYPE, NULL); + return CORBA_Object_duplicate (BONOBO_OBJREF (registry->device_event_controller), ev); } static void @@ -473,19 +495,21 @@ impl_registry_notify_event (PortableServer_Servant servant, switch (etype.type_cat) { + case (ETYPE_OBJECT) : + case (ETYPE_PROPERTY) : case (ETYPE_FOCUS) : - _registry_notify_listeners (registry->focus_listeners, e, ev); + _registry_notify_listeners (registry->object_listeners, e, ev); break; case (ETYPE_WINDOW) : _registry_notify_listeners (registry->window_listeners, e, ev); break; case (ETYPE_TOOLKIT) : - _registry_notify_listeners (registry->toolkit_listeners, e, ev); + _registry_notify_listeners (registry->toolkit_listeners, e, ev); break; default: break; } - Accessibility_Accessible_unref (e->source, ev); + /* Accessibility_Accessible_unref (e->source, ev);*/ /* This should be here! */ } static long @@ -512,7 +536,7 @@ _registry_notify_listeners ( GList *listeners, for (n=0; nevent_type_hash, etype.hash, minor_hash); fprintf(stderr, "event name: %s\n", etype.event_name); #endif @@ -520,8 +544,9 @@ _registry_notify_listeners ( GList *listeners, { #ifdef SPI_DEBUG fprintf(stderr, "notifying listener #%d\n", n); - fprintf(stderr, "event name %s\n", Accessibility_Accessible__get_name(e->source, ev)); + fprintf(stderr, "event source name %s\n", Accessibility_Accessible__get_name(e->source, ev)); #endif + e->source = CORBA_Object_duplicate (e->source, ev); Accessibility_Accessible_ref ( e->source, ev); Accessibility_EventListener_notifyEvent ((Accessibility_EventListener) ls->listener, e, @@ -536,6 +561,15 @@ _registry_notify_listeners ( GList *listeners, } } +static gboolean _device_event_controller_hook (gpointer p) +{ + Registry *registry = (Registry *)p; + DeviceEventController *controller = registry->device_event_controller; + if (controller) + device_event_controller_check_key_event (controller); + return TRUE; +} + static void registry_class_init (RegistryClass *klass) { @@ -562,11 +596,13 @@ registry_class_init (RegistryClass *klass) static void registry_init (Registry *registry) { - registry->focus_listeners = NULL; + registry->object_listeners = NULL; registry->window_listeners = NULL; registry->toolkit_listeners = NULL; registry->applications = NULL; registry->desktop = desktop_new(); + registry->device_event_controller = NULL; + registry->kbd_event_hook = _device_event_controller_hook; } GType