2001-12-10 Michael Meeks <michael@ximian.com>
[platform/core/uifw/at-spi2-atk.git] / cspi / spi_registry.c
index b3ba478..c8996eb 100644 (file)
  * Boston, MA 02111-1307, USA.
  */
 
-#include <cspi/spi-private.h>
-
-/*
- *
- * Global functions serviced by the registry
- *
- */
+/* spi_registry.c: Global functions wrapping the registry */
 
-#if 0
-/* static stuff used only by registry C bindings */
-static GList *key_listeners = NULL;
-static Display *display = NULL;
-#endif
+#include <cspi/spi-private.h>
 
 /**
  * registerGlobalEventListener:
@@ -91,16 +81,16 @@ static Display *display = NULL;
  * Returns: #TRUE if successful, otherwise #FALSE.
  *
  **/
-boolean
+SPIBoolean
 registerGlobalEventListener (AccessibleEventListener *listener,
-                             char *eventType)
+                             const char              *eventType)
 {
-  boolean retval;
+  SPIBoolean retval;
 
   Accessibility_Registry_registerGlobalEventListener (
                          cspi_registry (),
                          (Accessibility_EventListener)
-                            bonobo_object_corba_objref (bonobo_object (listener)),
+                            BONOBO_OBJREF (bonobo_object (listener)),
                          eventType,
                          cspi_ev ());
 
@@ -115,27 +105,20 @@ registerGlobalEventListener (AccessibleEventListener *listener,
  *            an event type.
  *
  * deregisters an AccessibleEventListener from the registry, for all
- *            event types it may be listening to.  Also unrefs the listener.
- *            The listener cannot subsequently be reused.
+ *            event types it may be listening to. Use
+ *            AccessibleEventListener_unref to release the
+ *            listener reference.
  *
  * Returns: #TRUE if successful, otherwise #FALSE.
  *
  **/
-boolean
+SPIBoolean
 deregisterGlobalEventListenerAll (AccessibleEventListener *listener)
 {
   Accessibility_Registry_deregisterGlobalEventListenerAll (
                          cspi_registry (),
-                         (Accessibility_EventListener)
-                            CORBA_Object_duplicate (
-                                   bonobo_object_corba_objref (
-                                           bonobo_object (listener)), cspi_ev ()),
-                         cspi_ev ());
-  if (!cspi_exception ())
-    {
-      bonobo_object_unref (BONOBO_OBJECT (listener));      
-      /* Would prefer that this were not a bonobo object: g_object_unref (listener);*/
-    }
+                        (Accessibility_EventListener) BONOBO_OBJREF (listener),
+                        cspi_ev ());
 
   return !cspi_exception ();
 }
@@ -151,15 +134,13 @@ deregisterGlobalEventListenerAll (AccessibleEventListener *listener)
  * Returns: #TRUE if successful, otherwise #FALSE.
  *
  **/
-boolean
+SPIBoolean
 deregisterGlobalEventListener (AccessibleEventListener *listener,
-                              char *eventType)
+                              const char              *eventType)
 {
   Accessibility_Registry_deregisterGlobalEventListener (
          cspi_registry (),
-         (Accessibility_EventListener)
-         CORBA_Object_duplicate (
-                 bonobo_object_corba_objref (bonobo_object (listener)), cspi_ev ()),
+         (Accessibility_EventListener) BONOBO_OBJREF (listener),
          (CORBA_char *) eventType,
          cspi_ev ());
 
@@ -179,7 +160,14 @@ deregisterGlobalEventListener (AccessibleEventListener *listener,
 int
 getDesktopCount ()
 {
-  return Accessibility_Registry_getDesktopCount (cspi_registry (), cspi_ev ());
+  int retval;
+
+  retval = Accessibility_Registry_getDesktopCount (
+    cspi_registry (), cspi_ev ());
+
+  cspi_return_val_if_ev ("getDesktopCount", -1);
+
+  return retval;
 }
 
 /**
@@ -252,65 +240,74 @@ registerAccessibleKeystrokeListener (AccessibleKeystrokeListener *listener,
                                     AccessibleKeyEventMask eventmask,
                                     AccessibleKeyListenerSyncType sync_type)
 {
-  Accessibility_ControllerEventMask *controller_event_mask =
-         Accessibility_ControllerEventMask__alloc();
-  Accessibility_DeviceEventController device_event_controller = 
-         Accessibility_Registry_getDeviceEventController (cspi_registry (), cspi_ev ());
-  Accessibility_KeySet *key_set = Accessibility_KeySet__alloc();
-  Accessibility_KeyEventTypeSeq *key_events = Accessibility_KeyEventTypeSeq__alloc();
-  Accessibility_KeystrokeListener cspi_listener_corba_ref;
-  gint i, mask;
-  Accessibility_DeviceEventController_ref (device_event_controller, cspi_ev ());
+  gint                                i, mask;
+  Accessibility_KeySet                key_set;
+  Accessibility_KeyEventTypeSeq       key_events;
+  Accessibility_ControllerEventMask   controller_event_mask;
+  Accessibility_DeviceEventController device_event_controller;
+
+  device_event_controller = 
+    Accessibility_Registry_getDeviceEventController (cspi_registry (), cspi_ev ());
+
+  cspi_return_if_ev ("getting event controller");
 
   /* copy the keyval filter values from the C api into the CORBA KeySet */
   if (keys)
     {
-      key_set->_buffer = Accessibility_KeySet_allocbuf (
-                                                   (unsigned long) keys->len);
-      key_set->_length = (unsigned long) keys->len;
-      for (i=0; i < key_set->_length; ++i)
+      key_set._length = keys->len;
+      key_set._buffer = Accessibility_KeySet_allocbuf (keys->len);
+      for (i = 0; i < key_set._length; ++i)
         {
           /* we overload the keyset long w/keycodes, the - bit acts as a flag */
-          key_set->_buffer[i] = (keys->keysyms[i]) ? keys->keysyms[i] :
+          key_set._buffer[i] = (keys->keysyms[i]) ? keys->keysyms[i] :
                                                 -keys->keycodes[i];
          /* g_print ("key-set %d = %d\n", i, (int) key_set->_buffer[i]); */
         }
     }
+  else
+    {
+      key_set._length = 0;
+      key_set._buffer = NULL;
+    }
+       
   /* copy the event filter values from the C api into the CORBA KeyEventTypeSeq */
-  mask=1;
-  i=0;
+  mask = 1;
+  i = 0;
   do
     {
-      if (mask & eventmask) ++i; 
+      if (mask & eventmask)
+        {
+          ++i; 
+       }
       mask <<= 1;
-    } while (mask & 0xFFFF);
+    }
+  while (mask & 0xFFFF);
   
-  key_events->_buffer = Accessibility_KeyEventTypeSeq_allocbuf (i);
-  i=0;
+  key_events._buffer = Accessibility_KeyEventTypeSeq_allocbuf (i);
+  i = 0;
   if (eventmask & SPI_KEY_PRESSED)
     {
-      key_events->_buffer[i++] = Accessibility_KEY_PRESSED;
+      key_events._buffer[i++] = Accessibility_KEY_PRESSED;
     }
   if (eventmask & SPI_KEY_RELEASED)
     {
-      key_events->_buffer[i++] = Accessibility_KEY_RELEASED;
+      key_events._buffer[i++] = Accessibility_KEY_RELEASED;
     }
-  key_events->_length = i;
+  key_events._length = i;
   
-  controller_event_mask->value = (CORBA_unsigned_long) modmask;
-  controller_event_mask->refcount = (CORBA_unsigned_short) 1;
+  controller_event_mask.value = (CORBA_unsigned_long) modmask;
+  controller_event_mask.refcount = (CORBA_unsigned_short) 1;
 
-  cspi_listener_corba_ref = (Accessibility_KeystrokeListener)
-         CORBA_Object_duplicate (bonobo_object_corba_objref (bonobo_object (listener)), cspi_ev ());
-  
-         Accessibility_DeviceEventController_registerKeystrokeListener (
+  Accessibility_DeviceEventController_registerKeystrokeListener (
          device_event_controller,
-         cspi_listener_corba_ref,
-         key_set,
-         controller_event_mask,
-         key_events,
+         BONOBO_OBJREF (listener),
+         &key_set,
+         &controller_event_mask,
+         &key_events,
          (CORBA_boolean) ((sync_type & SPI_KEYLISTENER_ALL_WINDOWS)!=0),
          cspi_ev ());
+
+  bonobo_object_release_unref (device_event_controller, cspi_ev ());
 }
 
 /**
@@ -327,28 +324,35 @@ void
 deregisterAccessibleKeystrokeListener (AccessibleKeystrokeListener *listener,
                                       AccessibleKeyMaskType modmask)
 {
-  Accessibility_ControllerEventMask *controller_event_mask =
-         Accessibility_ControllerEventMask__alloc();
-  Accessibility_DeviceEventController device_event_controller = 
-         Accessibility_Registry_getDeviceEventController (cspi_registry (), cspi_ev ());
-  Accessibility_KeySet *all_keys = Accessibility_KeySet__alloc();
-  Accessibility_KeyEventTypeSeq *key_events = Accessibility_KeyEventTypeSeq__alloc();
-  Accessibility_KeystrokeListener cspi_listener_corba_ref;
-  Accessibility_DeviceEventController_unref (device_event_controller, cspi_ev ());
-  controller_event_mask->value = (CORBA_unsigned_long) modmask;
-  controller_event_mask->refcount = (CORBA_unsigned_short) 1;
-
-  cspi_listener_corba_ref = (Accessibility_KeystrokeListener)
-         CORBA_Object_duplicate (BONOBO_OBJREF(listener), cspi_ev ());
-  
+  Accessibility_ControllerEventMask   controller_event_mask;
+  Accessibility_KeySet                key_set;
+  Accessibility_KeyEventTypeSeq       key_events;
+  Accessibility_DeviceEventController device_event_controller;
+
+  device_event_controller = 
+    Accessibility_Registry_getDeviceEventController (cspi_registry (), cspi_ev ());
+
+  cspi_return_if_ev ("getting keystroke listener");
+
+  controller_event_mask.value = (CORBA_unsigned_long) modmask;
+  controller_event_mask.refcount = (CORBA_unsigned_short) 1;
+
+  key_events._buffer = NULL;
+  key_events._length = 0;
+
+  key_set._buffer = NULL;
+  key_set._length = 0;
+
   Accessibility_DeviceEventController_deregisterKeystrokeListener (
          device_event_controller,
-         cspi_listener_corba_ref,
-         all_keys,
-         controller_event_mask,
-         key_events,
+         BONOBO_OBJREF (listener),
+         &key_set,
+         &controller_event_mask,
+         &key_events,
          (CORBA_boolean) TRUE,
          cspi_ev ());
+
+  bonobo_object_release_unref (device_event_controller, NULL);
 }
 
 /**
@@ -372,10 +376,15 @@ generateKeyEvent (long int keyval, AccessibleKeySynthType synth_type)
  */
   Accessibility_DeviceEventController device_event_controller = 
          Accessibility_Registry_getDeviceEventController (cspi_registry (), cspi_ev ());
+
+  cspi_return_if_ev ("getting event controller");
+
   Accessibility_DeviceEventController_generateKeyEvent (device_event_controller,
                                                        keyval,
                                                        (unsigned long) synth_type,
                                                        cspi_ev ());
+
+  bonobo_object_release_unref (device_event_controller, NULL);
 }
 
 /**