Added support for key event strings, and renamespaced some of the at-bridge.
authorbillh <billh@e2bd861d-eb25-0410-b326-f6ed22b6b98c>
Mon, 17 Dec 2001 17:58:13 +0000 (17:58 +0000)
committerbillh <billh@e2bd861d-eb25-0410-b326-f6ed22b6b98c>
Mon, 17 Dec 2001 17:58:13 +0000 (17:58 +0000)
git-svn-id: http://svn.gnome.org/svn/at-spi/trunk@188 e2bd861d-eb25-0410-b326-f6ed22b6b98c

ChangeLog
at-bridge/bridge.c
atk-bridge/bridge.c
cspi/bonobo/cspi-bonobo-listener.c
registryd/deviceeventcontroller.c
test/simple-at.c

index 2f3fd68..381989f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+2001-12-17  Bill Haneman <bill.haneman@sun.com>
+
+       * at-bridge/bridge.c:
+       Namespaced local static methods to spi_atk_bridge_* where
+       previously named bridge_*, and spi_* elsewhere.
+
+       * at-bridge/bridge.c:
+       * cspi/bonobo/cspi-bonobo-listener.c:
+       Added demarshalling/conversion for string member of
+       Accessibility_DeviceEvent to AccessibleKeystroke.
+
+       * registryd/deviceeventcontroller.c:
+       Added code to fill the Accessibility_DeviceEvent key string value
+       member for global key events (i.e. from XGrabKey), to match
+       behavior of Accessibility_DeviceEvent from the toolkit key events
+       from the bridge.  Fixed timestamp in global key event notifications.
+
+       * test/simple-at.c:
+       Added printout of key event's string value to
+       report_ordinary_key_event, for demo/debugging purposes.
+
 2001-12-15  Bill Haneman <bill.haneman@sun.com>
 
        * idl/Accessibility_Registry.idl:
index e58440c..d506e33 100644 (file)
@@ -38,25 +38,24 @@ static CORBA_Environment ev;
 static Accessibility_Registry registry;
 static SpiApplication *this_app = NULL;
 
-static gboolean bridge_idle_init (gpointer user_data);
-static void bridge_focus_tracker (AtkObject *object);
-static void bridge_exit_func (void);
-static void register_atk_event_listeners (void);
-static gboolean bridge_property_event_listener (GSignalInvocationHint *signal_hint,
+static gboolean spi_atk_bridge_idle_init (gpointer user_data);
+static void spi_atk_bridge_focus_tracker (AtkObject *object);
+static void spi_atk_bridge_exit_func (void);
+static void spi_atk_register_event_listeners (void);
+static gboolean spi_atk_bridge_property_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,
                                                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 (AtkKeyEventStruct *event,
-                                gpointer data);
+static gint spi_atk_bridge_key_listener (AtkKeyEventStruct *event,
+                                        gpointer data);
 
 int
 gtk_module_init (gint *argc, gchar **argv[])
@@ -98,17 +97,17 @@ gtk_module_init (gint *argc, gchar **argv[])
                                               BONOBO_OBJREF (this_app),
                                               &ev);
 
-  g_atexit (bridge_exit_func);
+  g_atexit (spi_atk_bridge_exit_func);
 
-  g_idle_add (bridge_idle_init, NULL);
+  g_idle_add (spi_atk_bridge_idle_init, NULL);
 
   return 0;
 }
 
 static gboolean
-bridge_idle_init (gpointer user_data)
+spi_atk_bridge_idle_init (gpointer user_data)
 {
-  register_atk_event_listeners ();
+  spi_atk_register_event_listeners ();
 
   fprintf (stderr, "Application registered & listening\n");
 
@@ -116,7 +115,7 @@ bridge_idle_init (gpointer user_data)
 }
 
 static void
-register_atk_event_listeners (void)
+spi_atk_register_event_listeners (void)
 {
   /*
    * kludge to make sure the Atk interface types are registered, otherwise
@@ -127,35 +126,35 @@ register_atk_event_listeners (void)
   
   /* 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: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");
-  atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkTable:row-reordered");
-  atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkTable:row-deleted");
-  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_focus_tracker (spi_atk_bridge_focus_tracker);
+  atk_add_global_event_listener (spi_atk_bridge_property_event_listener, "Gtk:AtkObject:property-change");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkObject:children-changed");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkObject:visible-data-changed");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkSelection:selection-changed");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkText:text-selection-changed");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkText:text-changed");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkText:text-caret-moved");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkTable:row-inserted");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkTable:row-reordered");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkTable:row-deleted");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkTable:column-inserted");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkTable:column-reordered");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkTable:column-deleted");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkTable:model-changed");
 /*
  * May add the following listeners to implement preemptive key listening for GTK+
  *
- * atk_add_global_event_listener (bridge_widgetkey_listener, "Gtk:GtkWidget:key-press-event");
- * atk_add_global_event_listener (bridge_widgetkey_listener, "Gtk:GtkWidget:key-release-event");
+ * atk_add_global_event_listener (spi_atk_bridge_widgetkey_listener, "Gtk:GtkWidget:key-press-event");
+ * atk_add_global_event_listener (spi_atk_bridge_widgetkey_listener, "Gtk:GtkWidget:key-release-event");
  */
-  atk_add_key_event_listener    (bridge_key_listener, NULL);
+  atk_add_key_event_listener    (spi_atk_bridge_key_listener, NULL);
   
   g_object_unref (G_OBJECT (bo));
   g_object_unref (ao);
 }
 
 static void
-bridge_exit_func (void)
+spi_atk_bridge_exit_func (void)
 {
   BonoboObject *app = (BonoboObject *) this_app;
 
@@ -195,7 +194,7 @@ bridge_exit_func (void)
 }
 
 static void
-bridge_focus_tracker (AtkObject *object)
+spi_atk_bridge_focus_tracker (AtkObject *object)
 {
   SpiAccessible *source;
   Accessibility_Event e;
@@ -213,10 +212,10 @@ bridge_focus_tracker (AtkObject *object)
 }
 
 static void
-emit_eventv (GObject      *gobject,
-            unsigned long detail1,
-            unsigned long detail2,
-            const char   *format, ...)
+spi_atk_emit_eventv (GObject      *gobject,
+                    unsigned long detail1,
+                    unsigned long detail2,
+                    const char   *format, ...)
 {
   va_list             args;
   Accessibility_Event e;
@@ -271,10 +270,10 @@ emit_eventv (GObject      *gobject,
 }
 
 static gboolean
-bridge_property_event_listener (GSignalInvocationHint *signal_hint,
-                               guint n_param_values,
-                               const GValue *param_values,
-                               gpointer data)
+spi_atk_bridge_property_event_listener (GSignalInvocationHint *signal_hint,
+                                       guint n_param_values,
+                                       const GValue *param_values,
+                                       gpointer data)
 {
   AtkPropertyValues *values;
   GObject *gobject;
@@ -296,16 +295,16 @@ bridge_property_event_listener (GSignalInvocationHint *signal_hint,
   gobject = g_value_get_object (param_values + 0);
   values = (AtkPropertyValues*) g_value_get_pointer (param_values + 1);
 
-  emit_eventv (gobject, 0, 0, "object:property-change:%s", values->property_name);
+  spi_atk_emit_eventv (gobject, 0, 0, "object:property-change:%s", values->property_name);
 
   return TRUE;
 }
 
 static gboolean
-bridge_state_event_listener (GSignalInvocationHint *signal_hint,
-                            guint n_param_values,
-                            const GValue *param_values,
-                            gpointer data)
+spi_atk_bridge_state_event_listener (GSignalInvocationHint *signal_hint,
+                                    guint n_param_values,
+                                    const GValue *param_values,
+                                    gpointer data)
 {
   GObject *gobject;
   AtkPropertyValues *values;
@@ -322,17 +321,17 @@ bridge_state_event_listener (GSignalInvocationHint *signal_hint,
   gobject = g_value_get_object (param_values + 0);
   values = (AtkPropertyValues*) g_value_get_pointer (param_values + 1);
 
-  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);
-
+  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);
+  
   return TRUE;
 }
 
 static void
-accessibility_init_keystroke_from_atk_key_event (Accessibility_DeviceEvent  *keystroke,
-                                                AtkKeyEventStruct          *event)
+spi_init_keystroke_from_atk_key_event (Accessibility_DeviceEvent  *keystroke,
+                                      AtkKeyEventStruct          *event)
 {
 #ifdef SPI_DEBUG
   if (event)
@@ -350,7 +349,14 @@ accessibility_init_keystroke_from_atk_key_event (Accessibility_DeviceEvent  *key
   keystroke->hw_code   = (CORBA_short) event->keycode;
   keystroke->timestamp = (CORBA_unsigned_long) event->timestamp;
   keystroke->modifiers = (CORBA_unsigned_short) (event->state & 0xFFFF);
-
+  if (event->string)
+    {
+      keystroke->event_string = CORBA_string_dup (event->string);
+    }
+  else
+    {
+      keystroke->event_string = CORBA_string_dup ("");
+    }
   switch (event->type)
     {
     case (ATK_KEY_EVENT_PRESS):
@@ -366,7 +372,7 @@ accessibility_init_keystroke_from_atk_key_event (Accessibility_DeviceEvent  *key
 }
 
 static gint
-bridge_key_listener (AtkKeyEventStruct *event, gpointer data)
+spi_atk_bridge_key_listener (AtkKeyEventStruct *event, gpointer data)
 {
   CORBA_boolean             result;
   Accessibility_DeviceEvent key_event;
@@ -381,7 +387,7 @@ bridge_key_listener (AtkKeyEventStruct *event, gpointer data)
   else
     {
 
-      accessibility_init_keystroke_from_atk_key_event (&key_event, event);
+      spi_init_keystroke_from_atk_key_event (&key_event, event);
 
       result = Accessibility_DeviceEventController_notifyListenersSync (
         controller, &key_event, &ev);
@@ -393,10 +399,10 @@ bridge_key_listener (AtkKeyEventStruct *event, gpointer data)
 }
 
 static gboolean
-bridge_signal_listener (GSignalInvocationHint *signal_hint,
-                       guint n_param_values,
-                       const GValue *param_values,
-                       gpointer data)
+spi_atk_bridge_signal_listener (GSignalInvocationHint *signal_hint,
+                               guint n_param_values,
+                               const GValue *param_values,
+                               gpointer data)
 {
   GObject *gobject;
   GSignalQuery signal_query;
@@ -418,7 +424,7 @@ bridge_signal_listener (GSignalInvocationHint *signal_hint,
 
   gobject = g_value_get_object (param_values + 0);
 
-  emit_eventv (gobject, 0, 0, "object:%s", name);
+  spi_atk_emit_eventv (gobject, 0, 0, "object:%s", name);
 
   return TRUE;
 }
index e58440c..d506e33 100644 (file)
@@ -38,25 +38,24 @@ static CORBA_Environment ev;
 static Accessibility_Registry registry;
 static SpiApplication *this_app = NULL;
 
-static gboolean bridge_idle_init (gpointer user_data);
-static void bridge_focus_tracker (AtkObject *object);
-static void bridge_exit_func (void);
-static void register_atk_event_listeners (void);
-static gboolean bridge_property_event_listener (GSignalInvocationHint *signal_hint,
+static gboolean spi_atk_bridge_idle_init (gpointer user_data);
+static void spi_atk_bridge_focus_tracker (AtkObject *object);
+static void spi_atk_bridge_exit_func (void);
+static void spi_atk_register_event_listeners (void);
+static gboolean spi_atk_bridge_property_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,
                                                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 (AtkKeyEventStruct *event,
-                                gpointer data);
+static gint spi_atk_bridge_key_listener (AtkKeyEventStruct *event,
+                                        gpointer data);
 
 int
 gtk_module_init (gint *argc, gchar **argv[])
@@ -98,17 +97,17 @@ gtk_module_init (gint *argc, gchar **argv[])
                                               BONOBO_OBJREF (this_app),
                                               &ev);
 
-  g_atexit (bridge_exit_func);
+  g_atexit (spi_atk_bridge_exit_func);
 
-  g_idle_add (bridge_idle_init, NULL);
+  g_idle_add (spi_atk_bridge_idle_init, NULL);
 
   return 0;
 }
 
 static gboolean
-bridge_idle_init (gpointer user_data)
+spi_atk_bridge_idle_init (gpointer user_data)
 {
-  register_atk_event_listeners ();
+  spi_atk_register_event_listeners ();
 
   fprintf (stderr, "Application registered & listening\n");
 
@@ -116,7 +115,7 @@ bridge_idle_init (gpointer user_data)
 }
 
 static void
-register_atk_event_listeners (void)
+spi_atk_register_event_listeners (void)
 {
   /*
    * kludge to make sure the Atk interface types are registered, otherwise
@@ -127,35 +126,35 @@ register_atk_event_listeners (void)
   
   /* 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: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");
-  atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkTable:row-reordered");
-  atk_add_global_event_listener (bridge_signal_listener, "Gtk:AtkTable:row-deleted");
-  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_focus_tracker (spi_atk_bridge_focus_tracker);
+  atk_add_global_event_listener (spi_atk_bridge_property_event_listener, "Gtk:AtkObject:property-change");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkObject:children-changed");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkObject:visible-data-changed");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkSelection:selection-changed");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkText:text-selection-changed");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkText:text-changed");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkText:text-caret-moved");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkTable:row-inserted");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkTable:row-reordered");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkTable:row-deleted");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkTable:column-inserted");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkTable:column-reordered");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkTable:column-deleted");
+  atk_add_global_event_listener (spi_atk_bridge_signal_listener, "Gtk:AtkTable:model-changed");
 /*
  * May add the following listeners to implement preemptive key listening for GTK+
  *
- * atk_add_global_event_listener (bridge_widgetkey_listener, "Gtk:GtkWidget:key-press-event");
- * atk_add_global_event_listener (bridge_widgetkey_listener, "Gtk:GtkWidget:key-release-event");
+ * atk_add_global_event_listener (spi_atk_bridge_widgetkey_listener, "Gtk:GtkWidget:key-press-event");
+ * atk_add_global_event_listener (spi_atk_bridge_widgetkey_listener, "Gtk:GtkWidget:key-release-event");
  */
-  atk_add_key_event_listener    (bridge_key_listener, NULL);
+  atk_add_key_event_listener    (spi_atk_bridge_key_listener, NULL);
   
   g_object_unref (G_OBJECT (bo));
   g_object_unref (ao);
 }
 
 static void
-bridge_exit_func (void)
+spi_atk_bridge_exit_func (void)
 {
   BonoboObject *app = (BonoboObject *) this_app;
 
@@ -195,7 +194,7 @@ bridge_exit_func (void)
 }
 
 static void
-bridge_focus_tracker (AtkObject *object)
+spi_atk_bridge_focus_tracker (AtkObject *object)
 {
   SpiAccessible *source;
   Accessibility_Event e;
@@ -213,10 +212,10 @@ bridge_focus_tracker (AtkObject *object)
 }
 
 static void
-emit_eventv (GObject      *gobject,
-            unsigned long detail1,
-            unsigned long detail2,
-            const char   *format, ...)
+spi_atk_emit_eventv (GObject      *gobject,
+                    unsigned long detail1,
+                    unsigned long detail2,
+                    const char   *format, ...)
 {
   va_list             args;
   Accessibility_Event e;
@@ -271,10 +270,10 @@ emit_eventv (GObject      *gobject,
 }
 
 static gboolean
-bridge_property_event_listener (GSignalInvocationHint *signal_hint,
-                               guint n_param_values,
-                               const GValue *param_values,
-                               gpointer data)
+spi_atk_bridge_property_event_listener (GSignalInvocationHint *signal_hint,
+                                       guint n_param_values,
+                                       const GValue *param_values,
+                                       gpointer data)
 {
   AtkPropertyValues *values;
   GObject *gobject;
@@ -296,16 +295,16 @@ bridge_property_event_listener (GSignalInvocationHint *signal_hint,
   gobject = g_value_get_object (param_values + 0);
   values = (AtkPropertyValues*) g_value_get_pointer (param_values + 1);
 
-  emit_eventv (gobject, 0, 0, "object:property-change:%s", values->property_name);
+  spi_atk_emit_eventv (gobject, 0, 0, "object:property-change:%s", values->property_name);
 
   return TRUE;
 }
 
 static gboolean
-bridge_state_event_listener (GSignalInvocationHint *signal_hint,
-                            guint n_param_values,
-                            const GValue *param_values,
-                            gpointer data)
+spi_atk_bridge_state_event_listener (GSignalInvocationHint *signal_hint,
+                                    guint n_param_values,
+                                    const GValue *param_values,
+                                    gpointer data)
 {
   GObject *gobject;
   AtkPropertyValues *values;
@@ -322,17 +321,17 @@ bridge_state_event_listener (GSignalInvocationHint *signal_hint,
   gobject = g_value_get_object (param_values + 0);
   values = (AtkPropertyValues*) g_value_get_pointer (param_values + 1);
 
-  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);
-
+  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);
+  
   return TRUE;
 }
 
 static void
-accessibility_init_keystroke_from_atk_key_event (Accessibility_DeviceEvent  *keystroke,
-                                                AtkKeyEventStruct          *event)
+spi_init_keystroke_from_atk_key_event (Accessibility_DeviceEvent  *keystroke,
+                                      AtkKeyEventStruct          *event)
 {
 #ifdef SPI_DEBUG
   if (event)
@@ -350,7 +349,14 @@ accessibility_init_keystroke_from_atk_key_event (Accessibility_DeviceEvent  *key
   keystroke->hw_code   = (CORBA_short) event->keycode;
   keystroke->timestamp = (CORBA_unsigned_long) event->timestamp;
   keystroke->modifiers = (CORBA_unsigned_short) (event->state & 0xFFFF);
-
+  if (event->string)
+    {
+      keystroke->event_string = CORBA_string_dup (event->string);
+    }
+  else
+    {
+      keystroke->event_string = CORBA_string_dup ("");
+    }
   switch (event->type)
     {
     case (ATK_KEY_EVENT_PRESS):
@@ -366,7 +372,7 @@ accessibility_init_keystroke_from_atk_key_event (Accessibility_DeviceEvent  *key
 }
 
 static gint
-bridge_key_listener (AtkKeyEventStruct *event, gpointer data)
+spi_atk_bridge_key_listener (AtkKeyEventStruct *event, gpointer data)
 {
   CORBA_boolean             result;
   Accessibility_DeviceEvent key_event;
@@ -381,7 +387,7 @@ bridge_key_listener (AtkKeyEventStruct *event, gpointer data)
   else
     {
 
-      accessibility_init_keystroke_from_atk_key_event (&key_event, event);
+      spi_init_keystroke_from_atk_key_event (&key_event, event);
 
       result = Accessibility_DeviceEventController_notifyListenersSync (
         controller, &key_event, &ev);
@@ -393,10 +399,10 @@ bridge_key_listener (AtkKeyEventStruct *event, gpointer data)
 }
 
 static gboolean
-bridge_signal_listener (GSignalInvocationHint *signal_hint,
-                       guint n_param_values,
-                       const GValue *param_values,
-                       gpointer data)
+spi_atk_bridge_signal_listener (GSignalInvocationHint *signal_hint,
+                               guint n_param_values,
+                               const GValue *param_values,
+                               gpointer data)
 {
   GObject *gobject;
   GSignalQuery signal_query;
@@ -418,7 +424,7 @@ bridge_signal_listener (GSignalInvocationHint *signal_hint,
 
   gobject = g_value_get_object (param_values + 0);
 
-  emit_eventv (gobject, 0, 0, "object:%s", name);
+  spi_atk_emit_eventv (gobject, 0, 0, "object:%s", name);
 
   return TRUE;
 }
index fdd759d..1946cb8 100644 (file)
@@ -195,6 +195,7 @@ cspi_key_event (SpiKeystrokeListener            *listener,
   akeystroke.keyID     = keystroke->id;
   akeystroke.keycode   = keystroke->hw_code;
   akeystroke.timestamp = keystroke->timestamp;
+  akeystroke.keystring = g_strdup (keystroke->event_string);
   akeystroke.modifiers = keystroke->modifiers;
 
   /* FIXME: re-enterancy hazard on this list */
index 25af77e..9d34a2a 100644 (file)
@@ -24,7 +24,7 @@
 
 #include <config.h>
 
-#define SPI_DEBUG
+#undef SPI_DEBUG
 
 #ifdef SPI_DEBUG
 #  include <stdio.h>
@@ -32,6 +32,8 @@
 
 #include <X11/Xlib.h>
 #include <X11/extensions/XTest.h>
+#define XK_MISCELLANY
+#include <X11/keysymdef.h>
 #include <gdk/gdkx.h> /* TODO: hide dependency (wrap in single porting file) */
 #include <gdk/gdkwindow.h>
 
@@ -436,6 +438,8 @@ spi_keystroke_from_x_key_event (XKeyEvent *x_key_event)
 {
   Accessibility_DeviceEvent key_event;
   KeySym keysym;
+  const int cbuf_bytes = 20;
+  char cbuf [cbuf_bytes];
   
   keysym = XLookupKeysym (x_key_event, 0);
   key_event.id = (CORBA_long)(keysym);
@@ -449,6 +453,33 @@ spi_keystroke_from_x_key_event (XKeyEvent *x_key_event)
       key_event.type = Accessibility_KEY_RELEASED;
     } 
   key_event.modifiers = (CORBA_unsigned_short)(x_key_event->state);
+
+  switch (keysym)
+    {
+      case ' ':
+        key_event.event_string = CORBA_string_dup ("space");
+        break;
+      case XK_Tab:
+        key_event.event_string = CORBA_string_dup ("Tab");
+       break;
+      case XK_BackSpace:
+        key_event.event_string = CORBA_string_dup ("Backspace");
+       break;
+      case XK_Return:
+        key_event.event_string = CORBA_string_dup ("Return");
+       break;
+      default:
+        if (XLookupString (x_key_event, cbuf, cbuf_bytes, &keysym, NULL) > 0)
+          {
+            key_event.event_string = CORBA_string_dup (cbuf);
+          }
+        else
+          {
+            key_event.event_string = CORBA_string_dup ("");
+          }
+    }
+
+  key_event.timestamp = (CORBA_unsigned_long) x_key_event->time;
 #ifdef SPI_KEYEVENT_DEBUG
   fprintf (stderr,
      "Key %lu pressed (%c), modifiers %d\n",
@@ -488,7 +519,6 @@ spi_check_key_event (SpiDeviceEventController *controller)
            if (XFilterEvent (x_event, None)) continue;   
            if (x_event->type == KeyPress || x_event->type == KeyRelease)
              {
-               fprintf (stderr, "x event type=%d\n", x_event->type);      
                key_event = spi_keystroke_from_x_key_event ((XKeyEvent *) x_event);
                /* relay to listeners, and decide whether to consume it or not */
                is_consumed = spi_notify_keylisteners (controller->key_listeners, &key_event, CORBA_TRUE, &ev);
index b3fb76f..35ffec3 100644 (file)
@@ -366,11 +366,13 @@ is_command_key (AccessibleKeystroke *key)
 static SPIBoolean
 report_command_key_event (AccessibleKeystroke *key, void *user_data)
 {
-  fprintf (stderr, "Command KeyEvent %s%c (keycode %d)\n",
+  fprintf (stderr, "Command KeyEvent %s%c (keycode %d); string=%s; time=%lx\n",
          (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),
-         (int) key->keycode);
+         (int) key->keycode,
+         key->keystring,
+         (long int) key->timestamp);
   return is_command_key (key);
 }
 
@@ -378,10 +380,11 @@ report_command_key_event (AccessibleKeystroke *key, void *user_data)
 static SPIBoolean
 report_ordinary_key_event (AccessibleKeystroke *key, void *user_data)
 {
-  fprintf (stderr, "Received key event:\tsym %ld\n\tmods %x\n\tcode %d\n\ttime %ld\n",
+  fprintf (stderr, "Received key event:\tsym %ld\n\tmods %x\n\tcode %d\n\tstring=\'%s\'\n\ttime %lx\n",
           (long) key->keyID,
           (unsigned int) key->modifiers,
           (int) key->keycode,
+          key->keystring,
           (long int) key->timestamp);
   return FALSE;
 }