Started fixing IDL docs.
[platform/core/uifw/at-spi2-atk.git] / atk-bridge / bridge.c
index 2d988ee..29fb569 100644 (file)
@@ -26,6 +26,7 @@
 #include <orbit/orbit.h>
 #include <atk/atk.h>
 #include <atk/atkobject.h>
+#include <atk/atknoopobject.h>
 #include <libspi/Accessibility.h>
 #include "accessible.h"
 #include "application.h"
@@ -54,13 +55,16 @@ static gboolean bridge_property_event_listener (GSignalInvocationHint *signal_hi
                                                guint n_param_values,
                                                const GValue *param_values,
                                                gpointer data);
+static gboolean bridge_state_event_listener (GSignalInvocationHint *signal_hint,
+                                            guint n_param_values,
+                                            const GValue *param_values,
+                                            gpointer data);
 static gboolean bridge_signal_listener (GSignalInvocationHint *signal_hint,
                                        guint n_param_values,
                                        const GValue *param_values,
                                        gpointer data);
 
-static gint bridge_key_listener (AtkImplementor *atk_impl,
-                                AtkKeyEventStruct *event,
+static gint bridge_key_listener (AtkKeyEventStruct *event,
                                 gpointer data);
 
 int
@@ -125,19 +129,23 @@ bridge_register_app (gpointer gp)
 static void
 register_atk_event_listeners ()
 {
-  /* Register for focus event notifications, and register app with central registry  */
+  GType t;
+
+  /*
+   * kludge to make sure the Atk interface types are registered, otherwise
+   * the AtkText signal handlers below won't get registered
+   */
 
-/* kludge to make sure the Atk interface types are registered, otherwise
-   the AtkText signal handlers below won't get registered */
+  AtkObject *o = atk_no_op_object_new (g_object_new (ATK_TYPE_OBJECT, NULL));
 
-  ATK_TYPE_TEXT;
+  /* Register for focus event notifications, and register app with central registry  */
 
   atk_add_focus_tracker (bridge_focus_tracker);
   atk_add_global_event_listener (bridge_property_event_listener, "Gtk:AtkObject:property-change");
   atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkObject:children-changed");
-  atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkObject:model-changed");
-  atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkObject:selection-changed");
   atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkObject:visible-data-changed");
+  atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkSelection:selection-changed");
+  atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkText:text-selection-changed");
   atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkText:text-changed");
   atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkText:text-caret-moved");
   atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkTable:row-inserted");
@@ -146,6 +154,7 @@ register_atk_event_listeners ()
   atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkTable:column-inserted");
   atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkTable:column-reordered");
   atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkTable:column-deleted");
+  atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkTable:model-changed");
   atk_add_key_event_listener    (bridge_key_listener, NULL);
 }
 
@@ -219,10 +228,100 @@ bridge_property_event_listener (GSignalInvocationHint *signal_hint,
   return TRUE;
 }
 
+static gboolean
+bridge_state_event_listener (GSignalInvocationHint *signal_hint,
+                            guint n_param_values,
+                            const GValue *param_values,
+                            gpointer data)
+{
+  Accessibility_Event *e = Accessibility_Event__alloc();
+  Bonobo_Unknown source = NULL;
+  AtkObject *aobject;
+  AtkPropertyValues *values;
+  GObject *gobject;
+  GSignalQuery signal_query;
+  gchar *name;
+  char sbuf[APP_STATIC_BUFF_SZ];
+  
+  g_signal_query (signal_hint->signal_id, &signal_query);
+  name = signal_query.signal_name;
+#ifdef SPI_BRIDGE_DEBUG
+  fprintf (stderr, "Received (state) signal %s:%s\n",
+          g_type_name (signal_query.itype), name);
+#endif
+  gobject = g_value_get_object (param_values + 0);
+  values = (AtkPropertyValues*) g_value_get_pointer (param_values + 1);
+
+  /* notify the actual listeners */
+  if (ATK_IS_IMPLEMENTOR (gobject))
+  {
+    aobject = atk_implementor_ref_accessible (ATK_IMPLEMENTOR (gobject));
+    source = CORBA_Object_duplicate (BONOBO_OBJREF (spi_accessible_new (aobject)), &ev);
+    g_object_unref (G_OBJECT(aobject));
+  }
+  else if (ATK_IS_OBJECT (gobject))
+  {
+    aobject = ATK_OBJECT (gobject);
+    source = CORBA_Object_duplicate (BONOBO_OBJREF (spi_accessible_new (aobject)), &ev);
+  }
+  else
+  {
+    g_error("received property-change event from non-AtkImplementor");
+  }
+  
+  snprintf(sbuf, APP_STATIC_BUFF_SZ, "object:%s:%s", values->property_name, "?");
+  e->type = CORBA_string_dup (sbuf);
+  e->source = source;
+  e->detail1 = (unsigned long) values->old_value.data[0].v_ulong;
+  e->detail2 = (unsigned long) values->new_value.data[0].v_ulong;
+  if (source)
+    Accessibility_Registry_notifyEvent (registry, e, &ev);
+  return TRUE;
+}
+
+#define SPI_DEBUG
+
+static Accessibility_KeyStroke *
+accessibility_keystroke_from_atk_key_event (AtkKeyEventStruct *event)
+{
+  Accessibility_KeyStroke *keystroke;
+  keystroke = Accessibility_KeyStroke__alloc ();
+
+#ifdef SPI_DEBUG
+  if (event) g_print ("event %c (%d)\n", (int) event->keyval, (int) event->keycode);
+  else
+#endif
+  if (!event) g_print ("WARNING: NULL key event!");
+  
+  keystroke->keyID = (CORBA_long) event->keyval;
+  keystroke->keycode = (CORBA_short) event->keycode;
+  keystroke->timestamp = (CORBA_unsigned_long) event->timestamp;
+  keystroke->modifiers = (CORBA_unsigned_short) (event->state & 0xFFFF);
+
+  switch (event->type)
+    {
+    case (ATK_KEY_EVENT_PRESS):
+           keystroke->type = Accessibility_KEY_PRESSED;
+           break;
+    case (ATK_KEY_EVENT_RELEASE):
+           keystroke->type = Accessibility_KEY_RELEASED;
+           break;
+    default:
+    }
+  
+  return keystroke;
+}
+
 static gint
-bridge_key_listener (AtkImplementor *atk_impl, AtkKeyEventStruct *event, gpointer data)
+bridge_key_listener (AtkKeyEventStruct *event, gpointer data)
 {
-  g_print ("bridge key listener!\n");
+  Accessibility_KeyStroke *key_event = accessibility_keystroke_from_atk_key_event (event);
+  CORBA_boolean result;
+  Accessibility_DeviceEventController controller =
+         Accessibility_Registry_getDeviceEventController (registry, &ev);
+  result = Accessibility_DeviceEventController_notifyListenersSync (controller,
+                                                                   (Accessibility_DeviceEvent *) key_event,
+                                                                   &ev);
 }
 
 static gboolean
@@ -243,7 +342,7 @@ bridge_signal_listener (GSignalInvocationHint *signal_hint,
   g_signal_query (signal_hint->signal_id, &signal_query);
   name = signal_query.signal_name;
 #ifdef SPI_BRIDGE_DEBUG
-  fprintf (stderr, "Received (property) signal %s:%s\n",
+  fprintf (stderr, "Received signal %s:%s\n",
           g_type_name (signal_query.itype), name);
 #endif
   gobject = g_value_get_object (param_values + 0);