Bugfixes for
[platform/core/uifw/at-spi2-atk.git] / atk-bridge / bridge.c
index 96f64fc..7cb489d 100644 (file)
@@ -42,7 +42,6 @@ static SpiApplication *this_app = NULL;
 
 static void     spi_atk_bridge_exit_func               (void);
 static void     spi_atk_register_event_listeners       (void);
-static gboolean spi_atk_bridge_idle_init               (gpointer               user_data);
 static void     spi_atk_bridge_focus_tracker           (AtkObject             *object);
 static gboolean spi_atk_bridge_property_event_listener (GSignalInvocationHint *signal_hint,
                                                        guint                  n_param_values,
@@ -53,6 +52,11 @@ spi_atk_bridge_window_event_listener (GSignalInvocationHint *signal_hint,
                                guint n_param_values,
                                const GValue *param_values,
                                gpointer data);
+static gboolean
+spi_atk_bridge_state_event_listener (GSignalInvocationHint *signal_hint,
+                                    guint n_param_values,
+                                    const GValue *param_values,
+                                    gpointer data);
 static gboolean spi_atk_bridge_signal_listener         (GSignalInvocationHint *signal_hint,
                                                        guint                  n_param_values,
                                                        const GValue          *param_values,
@@ -67,7 +71,6 @@ extern void gnome_accessibility_module_shutdown (void);
 static int     atk_bridge_initialized = FALSE;
 static guint   atk_bridge_focus_tracker_id = 0;
 static guint   atk_bridge_key_event_listener_id = 0;
-static guint   idle_init_id = 0;
 static GArray *listener_ids = NULL;
 
 /*
@@ -105,7 +108,7 @@ atk_bridge_init (gint *argc, gchar **argv[])
   CORBA_exception_init(&ev);
 
   registry = bonobo_activation_activate_from_id (
-         "OAFIID:Accessibility_Registry:proto0.1", 0, NULL, &ev);
+         "OAFIID:Accessibility_Registry:1.0", 0, NULL, &ev);
   
   if (ev._major != CORBA_NO_EXCEPTION)
     {
@@ -134,7 +137,9 @@ atk_bridge_init (gint *argc, gchar **argv[])
 
   g_atexit (spi_atk_bridge_exit_func);
 
-  idle_init_id = g_idle_add (spi_atk_bridge_idle_init, NULL);
+  spi_atk_register_event_listeners ();
+
+  fprintf (stderr, "Application registered & listening\n");
 
   return 0;
 }
@@ -145,18 +150,6 @@ gtk_module_init (gint *argc, gchar **argv[])
        return atk_bridge_init (argc, argv);
 }
 
-static gboolean
-spi_atk_bridge_idle_init (gpointer user_data)
-{
-  idle_init_id = 0;
-
-  spi_atk_register_event_listeners ();
-
-  fprintf (stderr, "Application registered & listening\n");
-
-  return FALSE;
-}
-
 static void
 add_signal_listener (const char *signal_name)
 {
@@ -209,8 +202,10 @@ spi_atk_register_event_listeners (void)
   id = atk_add_global_event_listener (spi_atk_bridge_window_event_listener,
                                      "window:deactivate");
   g_array_append_val (listener_ids, id);
+  id = atk_add_global_event_listener (spi_atk_bridge_state_event_listener,
+                                     "Gtk:AtkObject:state-change");
+  g_array_append_val (listener_ids, id);
 
-  add_signal_listener ("Gtk:AtkObject:state-change");
   add_signal_listener ("Gtk:AtkObject:children-changed");
   add_signal_listener ("Gtk:AtkObject:visible-data-changed");
   add_signal_listener ("Gtk:AtkSelection:selection-changed");
@@ -295,7 +290,9 @@ void
 gnome_accessibility_module_shutdown (void)
 {
   BonoboObject *app = (BonoboObject *) this_app;
-
+  int     i;
+  GArray *ids = listener_ids;
+  
   if (!atk_bridge_initialized)
     {
       return;
@@ -305,26 +302,15 @@ gnome_accessibility_module_shutdown (void)
 
   g_print("Atk Accessibilty bridge shutdown\n");
 
-  if (idle_init_id)
-    {
-      g_source_remove (idle_init_id);
-      idle_init_id = 0;
-    }
-  else
-    {
-      int     i;
-      GArray *ids = listener_ids;
-
-      listener_ids = NULL;
-      atk_remove_focus_tracker (atk_bridge_focus_tracker_id);
-      
-      for (i = 0; ids && i < ids->len; i++)
-        {
+  listener_ids = NULL;
+  atk_remove_focus_tracker (atk_bridge_focus_tracker_id);
+  
+  for (i = 0; ids && i < ids->len; i++)
+  {
           atk_remove_global_event_listener (g_array_index (ids, guint, i));
-       }
-
-      atk_remove_key_event_listener (atk_bridge_key_event_listener_id);
-    }
+  }
+  
+  atk_remove_key_event_listener (atk_bridge_key_event_listener_id);
 
   deregister_application (app);
 }
@@ -438,7 +424,6 @@ spi_atk_bridge_property_event_listener (GSignalInvocationHint *signal_hint,
   return TRUE;
 }
 
-#if THIS_WILL_EVER_BE_USED
 static gboolean
 spi_atk_bridge_state_event_listener (GSignalInvocationHint *signal_hint,
                                     guint n_param_values,
@@ -446,7 +431,9 @@ spi_atk_bridge_state_event_listener (GSignalInvocationHint *signal_hint,
                                     gpointer data)
 {
   GObject *gobject;
-  AtkPropertyValues *values;
+  gchar *property_name;
+  gchar *type;
+  unsigned long detail1;
 #ifdef SPI_BRIDGE_DEBUG
   GSignalQuery signal_query;
   const gchar *name;
@@ -458,16 +445,19 @@ spi_atk_bridge_state_event_listener (GSignalInvocationHint *signal_hint,
 #endif
 
   gobject = g_value_get_object (param_values + 0);
-  values = (AtkPropertyValues*) g_value_get_pointer (param_values + 1);
-
+  property_name = g_strdup (g_value_get_string (param_values + 1));
+  detail1 = (g_value_get_boolean (param_values + 2))
+    ? 1 : 0;
+  type = g_strdup_printf ("object:state-changed:%s", property_name);
   spi_atk_emit_eventv (gobject, 
-                      (unsigned long) values->old_value.data[0].v_ulong,
-                      (unsigned long) values->new_value.data[0].v_ulong,
-                      "object:%s:?", values->property_name);
-  
+                      detail1,
+                      0,
+                      type);
+  g_free (property_name);
+  g_free (type);
   return TRUE;
 }
-#endif
+
 
 static void
 spi_init_keystroke_from_atk_key_event (Accessibility_DeviceEvent  *keystroke,
@@ -502,10 +492,10 @@ spi_init_keystroke_from_atk_key_event (Accessibility_DeviceEvent  *keystroke,
   switch (event->type)
     {
     case (ATK_KEY_EVENT_PRESS):
-      keystroke->type = Accessibility_KEY_PRESSED;
+      keystroke->type = Accessibility_KEY_PRESSED_EVENT;
       break;
     case (ATK_KEY_EVENT_RELEASE):
-      keystroke->type = Accessibility_KEY_RELEASED;
+      keystroke->type = Accessibility_KEY_RELEASED_EVENT;
       break;
     default:
       keystroke->type = 0;
@@ -524,7 +514,12 @@ spi_atk_bridge_key_listener (AtkKeyEventStruct *event, gpointer data)
 {
   CORBA_boolean             result;
   Accessibility_DeviceEvent key_event;
-  Accessibility_DeviceEventController controller =
+  Accessibility_DeviceEventController controller;
+       
+  if (BONOBO_EX (&ev))
+       g_warning ("failure: pre-listener get dec\n");
+
+  controller =
     Accessibility_Registry_getDeviceEventController (registry, &ev);
 
   if (BONOBO_EX (&ev))