Added additional documentation and fixed a couple of latent bugs.
[platform/core/uifw/at-spi2-atk.git] / libspi / keystrokelistener.c
index 61f883c..c4f6a28 100644 (file)
@@ -54,7 +54,6 @@ static GObjectClass *keystroke_listener_parent_class;
 static void
 keystroke_listener_object_finalize (GObject *object)
 {
-/*        KeystrokeListener *keystroke_listener = KEYSTROKE_LISTENER (object); */
 
 #ifdef SPI_DEBUG
         fprintf(stderr, "keystroke_listener_object_finalize called\n");
@@ -62,27 +61,58 @@ keystroke_listener_object_finalize (GObject *object)
         keystroke_listener_parent_class->finalize (object);
 }
 
+void   spi_keystroke_listener_add_callback (SpiKeystrokeListener *listener,
+                                           BooleanKeystrokeListenerCB callback)
+{
+  listener->callbacks = g_list_append (listener->callbacks, callback);
+#ifdef SPI_DEBUG
+        fprintf(stderr, "keystroke_listener_add_callback (%p) called\n",
+               (gpointer) callback);
+#endif
+}
+
+void   keystroke_listener_remove_callback (SpiKeystrokeListener *listener,
+                                          BooleanKeystrokeListenerCB callback)
+{
+  listener->callbacks = g_list_remove (listener->callbacks, callback);
+}
+
 /*
  * CORBA Accessibility::KeystrokeListener::keyEvent method implementation
  */
-
-static void
+static CORBA_boolean
 impl_key_event (PortableServer_Servant     servant,
                const Accessibility_KeyStroke *key,
                CORBA_Environment         *ev)
 {
-#ifdef SPI_DEBUG
+  SpiKeystrokeListener *listener = SPI_KEYSTROKE_LISTENER (bonobo_object_from_servant (servant));
+  GList *callbacks = listener->callbacks;
+  gboolean was_consumed = FALSE;
+#ifdef SPI_KEYEVENT_DEBUG
   if (ev->_major != CORBA_NO_EXCEPTION) {
     fprintf(stderr,
             ("Accessibility app error: exception during keystroke notification: %s\n"),
             CORBA_exception_id(ev));
     exit(-1);
   }
+  else {
+    fprintf(stderr, "%s%c",
+           (key->modifiers & SPI_KEYMASK_ALT)?"Alt-":"",
+           ((key->modifiers & SPI_KEYMASK_SHIFT)^(key->modifiers & SPI_KEYMASK_SHIFTLOCK))?
+           (char) toupper((int) key->keyID) : (char) tolower((int) key->keyID));
+  }
 #endif
+  while (callbacks)
+  {
+         BooleanKeystrokeListenerCB cb = (BooleanKeystrokeListenerCB) callbacks->data;
+         was_consumed = (*cb) (key) || was_consumed;
+         callbacks = g_list_next (callbacks);
+  }
+  return was_consumed;
 }
 
 static void
-keystroke_listener_class_init (KeystrokeListenerClass *klass)
+keystroke_listener_class_init (SpiKeystrokeListenerClass *klass)
 {
         GObjectClass * object_class = (GObjectClass *) klass;
         POA_Accessibility_KeystrokeListener__epv *epv = &klass->epv;
@@ -94,24 +124,25 @@ keystroke_listener_class_init (KeystrokeListenerClass *klass)
 }
 
 static void
-keystroke_listener_init (KeystrokeListener *keystroke_listener)
+keystroke_listener_init (SpiKeystrokeListener *keystroke_listener)
 {
+       keystroke_listener->callbacks = NULL;
 }
 
 GType
-keystroke_listener_get_type (void)
+spi_keystroke_listener_get_type (void)
 {
         static GType type = 0;
 
         if (!type) {
                 static const GTypeInfo tinfo = {
-                        sizeof (KeystrokeListenerClass),
+                        sizeof (SpiKeystrokeListenerClass),
                         (GBaseInitFunc) NULL,
                         (GBaseFinalizeFunc) NULL,
                         (GClassInitFunc) keystroke_listener_class_init,
                         (GClassFinalizeFunc) NULL,
                         NULL, /* class data */
-                        sizeof (KeystrokeListener),
+                        sizeof (SpiKeystrokeListener),
                         0, /* n preallocs */
                         (GInstanceInitFunc) keystroke_listener_init,
                         NULL /* value table */
@@ -126,18 +157,18 @@ keystroke_listener_get_type (void)
                         PARENT_TYPE,
                         POA_Accessibility_KeystrokeListener__init,
                         NULL,
-                        G_STRUCT_OFFSET (KeystrokeListenerClass, epv),
+                        G_STRUCT_OFFSET (SpiKeystrokeListenerClass, epv),
                         &tinfo,
-                        "KeystrokeListener");
+                        "SpiKeystrokeListener");
         }
 
         return type;
 }
 
-KeystrokeListener *
-keystroke_listener_new (void)
+SpiKeystrokeListener *
+spi_keystroke_listener_new (void)
 {
-    KeystrokeListener *retval =
-               KEYSTROKE_LISTENER (g_object_new (keystroke_listener_get_type (), NULL));
+    SpiKeystrokeListener *retval =
+               SPI_KEYSTROKE_LISTENER (g_object_new (spi_keystroke_listener_get_type (), NULL));
     return retval;
 }