From: billh Date: Mon, 17 Dec 2001 17:58:13 +0000 (+0000) Subject: Added support for key event strings, and renamespaced some of the at-bridge. X-Git-Tag: AT_SPI2_ATK_2_12_0~1461 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fat-spi2-atk.git;a=commitdiff_plain;h=5d068548ecc323fedcc3899be9a2fe68aa9ea9eb Added support for key event strings, and renamespaced some of the at-bridge. git-svn-id: http://svn.gnome.org/svn/at-spi/trunk@188 e2bd861d-eb25-0410-b326-f6ed22b6b98c --- diff --git a/ChangeLog b/ChangeLog index 2f3fd68..381989f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,24 @@ +2001-12-17 Bill Haneman + + * 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 * idl/Accessibility_Registry.idl: diff --git a/at-bridge/bridge.c b/at-bridge/bridge.c index e58440c..d506e33 100644 --- a/at-bridge/bridge.c +++ b/at-bridge/bridge.c @@ -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; } diff --git a/atk-bridge/bridge.c b/atk-bridge/bridge.c index e58440c..d506e33 100644 --- a/atk-bridge/bridge.c +++ b/atk-bridge/bridge.c @@ -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; } diff --git a/cspi/bonobo/cspi-bonobo-listener.c b/cspi/bonobo/cspi-bonobo-listener.c index fdd759d..1946cb8 100644 --- a/cspi/bonobo/cspi-bonobo-listener.c +++ b/cspi/bonobo/cspi-bonobo-listener.c @@ -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 */ diff --git a/registryd/deviceeventcontroller.c b/registryd/deviceeventcontroller.c index 25af77e..9d34a2a 100644 --- a/registryd/deviceeventcontroller.c +++ b/registryd/deviceeventcontroller.c @@ -24,7 +24,7 @@ #include -#define SPI_DEBUG +#undef SPI_DEBUG #ifdef SPI_DEBUG # include @@ -32,6 +32,8 @@ #include #include +#define XK_MISCELLANY +#include #include /* TODO: hide dependency (wrap in single porting file) */ #include @@ -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); diff --git a/test/simple-at.c b/test/simple-at.c index b3fb76f..35ffec3 100644 --- a/test/simple-at.c +++ b/test/simple-at.c @@ -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; }