From cf7dfe5a250bd3ff44a357e7136cbf5a09ac7fdb Mon Sep 17 00:00:00 2001 From: billh Date: Tue, 1 Jan 2002 22:16:04 +0000 Subject: [PATCH] Fixed what seems to have been a botched checking from Dec 21, some fixes failed to make it in. git-svn-id: http://svn.gnome.org/svn/at-spi/trunk@193 e2bd861d-eb25-0410-b326-f6ed22b6b98c --- cspi/spi_registry.c | 5 ++- libspi/accessible.c | 26 ++++++------ libspi/relation.c | 2 +- registryd/Makefile.am | 2 +- registryd/desktop.c | 4 +- registryd/deviceeventcontroller.c | 84 +++++++++++++++++++++++---------------- test/keysynth-demo.c | 6 ++- 7 files changed, 75 insertions(+), 54 deletions(-) diff --git a/cspi/spi_registry.c b/cspi/spi_registry.c index f99afc5..0d75803 100644 --- a/cspi/spi_registry.c +++ b/cspi/spi_registry.c @@ -318,9 +318,11 @@ SPI_registerAccessibleKeystrokeListener (AccessibleKeystrokeListener *listener, &key_set, controller_event_mask, &key_events, - (CORBA_boolean) ((sync_type & SPI_KEYLISTENER_ALL_WINDOWS)!=0), + ((sync_type & SPI_KEYLISTENER_ALL_WINDOWS)!=0) ? CORBA_TRUE : CORBA_FALSE, cspi_ev ()); + cspi_return_val_if_ev ("registering keystroke listener", FALSE); + cspi_release_unref (device_event_controller); return TRUE; @@ -402,6 +404,7 @@ SPI_generateKeyEvent (long int keyval, AccessibleKeySynthType synth_type) Accessibility_DeviceEventController device_event_controller = Accessibility_Registry_getDeviceEventController (cspi_registry (), cspi_ev ()); + g_print ("keyval %d\n", (int) keyval); cspi_return_val_if_ev ("getting event controller", FALSE); Accessibility_DeviceEventController_generateKeyEvent (device_event_controller, diff --git a/libspi/accessible.c b/libspi/accessible.c index 76eae96..4b7cac5 100644 --- a/libspi/accessible.c +++ b/libspi/accessible.c @@ -143,7 +143,7 @@ spi_role_from_atk_role (AtkRole role) } static AtkObject * -get_accessible_from_servant (PortableServer_Servant servant) +get_atkobject_from_servant (PortableServer_Servant servant) { SpiBase *object = SPI_BASE (bonobo_object_from_servant (servant)); @@ -161,7 +161,7 @@ impl_accessibility_accessible_get_name (PortableServer_Servant servant, { const gchar *name; CORBA_char *retval; - AtkObject *object = get_accessible_from_servant (servant); + AtkObject *object = get_atkobject_from_servant (servant); g_return_val_if_fail (object != NULL, CORBA_string_dup ("")); @@ -187,7 +187,7 @@ impl_accessibility_accessible_set_name (PortableServer_Servant servant, const CORBA_char *name, CORBA_Environment *ev) { - AtkObject *object = get_accessible_from_servant (servant); + AtkObject *object = get_atkobject_from_servant (servant); g_return_if_fail (object != NULL); @@ -203,7 +203,7 @@ impl_accessibility_accessible_get_description (PortableServer_Servant servant, { const gchar *descr; CORBA_char *retval; - AtkObject *object = get_accessible_from_servant (servant); + AtkObject *object = get_atkobject_from_servant (servant); g_return_val_if_fail (object != NULL, CORBA_string_dup ("")); @@ -229,7 +229,7 @@ impl_accessibility_accessible_set_description (PortableServer_Servant servant, const CORBA_char *descr, CORBA_Environment *ev) { - AtkObject *object = get_accessible_from_servant (servant); + AtkObject *object = get_atkobject_from_servant (servant); g_return_if_fail (object != NULL); @@ -244,7 +244,7 @@ impl_accessibility_accessible_get_parent (PortableServer_Servant servant, CORBA_Environment *ev) { AtkObject *parent; - AtkObject *object = get_accessible_from_servant (servant); + AtkObject *object = get_atkobject_from_servant (servant); g_return_val_if_fail (object != NULL, CORBA_OBJECT_NIL); @@ -260,7 +260,7 @@ static CORBA_long impl_accessibility_accessible_get_index_in_parent (PortableServer_Servant servant, CORBA_Environment *ev) { - AtkObject *object = get_accessible_from_servant (servant); + AtkObject *object = get_atkobject_from_servant (servant); g_return_val_if_fail (object != NULL, -1); @@ -274,7 +274,7 @@ static CORBA_long impl_accessibility_accessible_get_child_count (PortableServer_Servant servant, CORBA_Environment *ev) { - AtkObject *object = get_accessible_from_servant (servant); + AtkObject *object = get_atkobject_from_servant (servant); g_return_val_if_fail (object != NULL, 0); @@ -290,7 +290,7 @@ impl_accessibility_accessible_get_child_at_index (PortableServer_Servant servant CORBA_Environment *ev) { AtkObject *child; - AtkObject *object = get_accessible_from_servant (servant); + AtkObject *object = get_atkobject_from_servant (servant); g_return_val_if_fail (object != NULL, 0); @@ -306,7 +306,7 @@ static Accessibility_StateSet impl_accessibility_accessible_get_state (PortableServer_Servant servant, CORBA_Environment *ev) { - AtkObject *object = get_accessible_from_servant (servant); + AtkObject *object = get_atkobject_from_servant (servant); bonobo_return_val_if_fail (object != NULL, NULL, ev); @@ -327,7 +327,7 @@ impl_accessibility_accessible_get_relation_set (PortableServer_Servant servant, gint n_relations; gint i; AtkRelationSet *relation_set; - AtkObject *object = get_accessible_from_servant (servant); + AtkObject *object = get_atkobject_from_servant (servant); bonobo_return_val_if_fail (object != NULL, NULL, ev); @@ -359,7 +359,7 @@ impl_accessibility_accessible_get_role (PortableServer_Servant servant, { AtkRole role; Accessibility_Role retval; - AtkObject *object = get_accessible_from_servant (servant); + AtkObject *object = get_atkobject_from_servant (servant); g_return_val_if_fail (object != NULL, 0); @@ -378,7 +378,7 @@ impl_accessibility_accessible_get_role_name (PortableServer_Servant servant, { AtkRole role; Accessibility_Role retval; - AtkObject *object = get_accessible_from_servant (servant); + AtkObject *object = get_atkobject_from_servant (servant); g_return_val_if_fail (object != NULL, 0); diff --git a/libspi/relation.c b/libspi/relation.c index 9fb3de5..260cd84 100644 --- a/libspi/relation.c +++ b/libspi/relation.c @@ -32,7 +32,7 @@ spi_relation_new (AtkRelation *obj) { SpiRelation *new_relation = g_object_new (SPI_RELATION_TYPE, NULL); - spi_base_construct (SPI_BASE (new_relation), ATK_OBJECT (obj)); + spi_base_construct (SPI_BASE (new_relation), G_OBJECT (obj)); return new_relation; } diff --git a/registryd/Makefile.am b/registryd/Makefile.am index 2ec4a12..b586b9a 100644 --- a/registryd/Makefile.am +++ b/registryd/Makefile.am @@ -15,7 +15,7 @@ registryd_SOURCES = \ registry.c \ registry.h -LDADD = ../libspi/libspi.la -lXtst $(REGISTRYD_LIBS) +LDADD = ../libspi/libspi.la $(XTST_LIBS) $(REGISTRYD_LIBS) serverinfodir = $(libdir)/bonobo/servers serverinfo_DATA = Accessibility_Registry.server diff --git a/registryd/desktop.c b/registryd/desktop.c index 305f7d7..70da90d 100644 --- a/registryd/desktop.c +++ b/registryd/desktop.c @@ -41,11 +41,11 @@ static SpiAccessibleClass *parent_class; static void spi_desktop_init (SpiDesktop *desktop) { - spi_base_construct_default (SPI_BASE (desktop)); + spi_base_construct (SPI_BASE (desktop), g_object_new (ATK_TYPE_OBJECT, NULL)); desktop->applications = NULL; - atk_object_set_name (ATK_OBJECT(SPI_BASE (desktop)->gobj), "main"); + atk_object_set_name (ATK_OBJECT (SPI_BASE (desktop)->gobj), "main"); } static void diff --git a/registryd/deviceeventcontroller.c b/registryd/deviceeventcontroller.c index 2ccff17..90bb733 100644 --- a/registryd/deviceeventcontroller.c +++ b/registryd/deviceeventcontroller.c @@ -47,8 +47,6 @@ static GObjectClass *spi_device_event_controller_parent_class; static gboolean kbd_registered = FALSE; -static Display *display; - static Window root_window; typedef enum { @@ -93,7 +91,24 @@ static void spi_controller_register_device_listener (SpiDeviceEventController *c * Private methods */ -static DEControllerGrabMask * +static Display * +spi_get_display (void ) +{ + static Display *display = NULL; + /* We must open a new connection to the server to avoid clashing with the GDK event loop */ + /* + * TODO: fixme, this makes the foolish assumption that registryd uses + * the same display as the apps, and the the DISPLAY environment variable is set. + */ + + if (!display) + { + display = XOpenDisplay (g_getenv ("DISPLAY")); + } + return display; +} + +static DEControllerGrabMask * spi_grabmask_clone (DEControllerGrabMask *grabmask) { DEControllerGrabMask *clone = g_new0 (DEControllerGrabMask, 1); @@ -220,7 +235,7 @@ spi_controller_register_global_keygrabs (SpiDeviceEventController *controller, /* X Grabs require keycodes, not keysyms */ if (keyval >= 0) { - keyval = XKeysymToKeycode(display, (KeySym) keyval); + keyval = XKeysymToKeycode(spi_get_display (), (KeySym) keyval); } grabmask.keyval = keyval; list_ptr = g_list_find_custom (controller->keygrabs_list, &grabmask, @@ -307,14 +322,10 @@ spi_controller_register_with_devices (SpiDeviceEventController *controller) /* calls to device-specific implementations and routines go here */ /* register with: keyboard hardware code handler */ /* register with: (translated) keystroke handler */ -#ifdef SPI_DEBUG - fprintf (stderr, "About to request events on window %ld of display %p\n", - (unsigned long) GDK_ROOT_WINDOW(), GDK_DISPLAY()); -#endif + /* We must open a new connection to the server to avoid clashing with the GDK event loop */ - display = XOpenDisplay (g_getenv ("DISPLAY")); - root_window = DefaultRootWindow (display); - XSelectInput (display, + root_window = DefaultRootWindow (spi_get_display ()); + XSelectInput (spi_get_display (), root_window, KeyPressMask | KeyReleaseMask); /* register with: mouse hardware device handler? */ @@ -389,6 +400,7 @@ spi_key_event_matches_listener (const Accessibility_DeviceEvent *key_event, DEControllerKeyListener *listener, CORBA_boolean is_system_global) { + g_print ("checking keycode %d\n", (int) key_event->hw_code); if ((key_event->modifiers == (CORBA_unsigned_short) (listener->mask & 0xFFFF)) && spi_key_set_contains_key (listener->keys, key_event) && spi_key_eventtype_seq_contains_event (listener->typeseq, key_event) && @@ -517,9 +529,9 @@ spi_check_key_event (SpiDeviceEventController *controller) CORBA_exception_init (&ev); } - while (XPending(display)) + while (XPending(spi_get_display ())) { - XNextEvent (display, x_event); + XNextEvent (spi_get_display (), x_event); if (XFilterEvent (x_event, None)) continue; if (x_event->type == KeyPress || x_event->type == KeyRelease) { @@ -536,14 +548,14 @@ spi_check_key_event (SpiDeviceEventController *controller) if (is_consumed) { - XAllowEvents (display, AsyncKeyboard, CurrentTime); + XAllowEvents (spi_get_display (), AsyncKeyboard, CurrentTime); } else { - XAllowEvents (display, ReplayKeyboard, CurrentTime); + XAllowEvents (spi_get_display (), ReplayKeyboard, CurrentTime); } } - XUngrabKey (display, AnyKey, AnyModifier, root_window); + XUngrabKey (spi_get_display (), AnyKey, AnyModifier, root_window); return spi_controller_grab_keyboard (controller); } @@ -582,7 +594,7 @@ spi_controller_grab_keyboard (SpiDeviceEventController *controller) #endif if (!(maskVal & ControlMask)) { - XGrabKey (display, + XGrabKey (spi_get_display (), keyVal, maskVal, root_window, @@ -607,11 +619,11 @@ spi_device_event_controller_object_finalize (GObject *object) { #ifdef SPI_DEBUG - fprintf(stderr, "spi_device_event_controller_object_finalize called\n"); + fprintf(stderr, "spi_device_event_controller_object_finalize called\n"); #endif - /* disconnect any special listeners, get rid of outstanding keygrabs */ + /* disconnect any special listeners, get rid of outstanding keygrabs */ - spi_device_event_controller_parent_class->finalize (object); + spi_device_event_controller_parent_class->finalize (object); } /* @@ -627,15 +639,19 @@ impl_register_keystroke_listener (PortableServer_Servant servant, const CORBA_boolean is_system_global, CORBA_Environment *ev) { - SpiDeviceEventController *controller = SPI_DEVICE_EVENT_CONTROLLER ( - bonobo_object_from_servant (servant)); - DEControllerKeyListener *dec_listener; + SpiDeviceEventController *controller = SPI_DEVICE_EVENT_CONTROLLER ( + bonobo_object_from_servant (servant)); + DEControllerKeyListener *dec_listener; #ifdef SPI_DEBUG - fprintf (stderr, "registering keystroke listener %p with maskVal %lu\n", - (void *) l, (unsigned long) mask); + fprintf (stderr, "registering keystroke listener %p with maskVal %lu\n", + (void *) l, (unsigned long) mask); #endif - dec_listener = spi_dec_key_listener_new (l, keys, mask, type, is_system_global, ev); - spi_controller_register_device_listener (controller, (DEControllerListener *) dec_listener, ev); + dec_listener = spi_dec_key_listener_new (l, keys, mask, type, + is_system_global, ev); + + spi_controller_register_device_listener (controller, + (DEControllerListener *) dec_listener, + ev); } /* @@ -691,7 +707,7 @@ impl_register_mouse_listener (PortableServer_Servant servant, static KeyCode keycode_for_keysym (long keysym) { - return XKeysymToKeycode (display, (KeySym) keysym); + return XKeysymToKeycode (spi_get_display (), (KeySym) keysym); } /* @@ -706,7 +722,7 @@ impl_generate_key_event (PortableServer_Servant servant, { long key_synth_code; #ifdef SPI_DEBUG - fprintf (stderr, "synthesizing keystroke %ld\n", (long) keycode); + fprintf (stderr, "synthesizing keystroke %ld, type %d\n", (long) keycode, (int) synth_type); #endif /* TODO: hide/wrap/remove X dependency */ @@ -720,17 +736,17 @@ impl_generate_key_event (PortableServer_Servant servant, switch (synth_type) { case Accessibility_KEY_PRESS: - XTestFakeKeyEvent (GDK_DISPLAY(), (unsigned int) keycode, True, CurrentTime); + XTestFakeKeyEvent (spi_get_display (), (unsigned int) keycode, True, CurrentTime); break; case Accessibility_KEY_PRESSRELEASE: - XTestFakeKeyEvent (GDK_DISPLAY(), (unsigned int) keycode, True, CurrentTime); + XTestFakeKeyEvent (spi_get_display (), (unsigned int) keycode, True, CurrentTime); case Accessibility_KEY_RELEASE: - XTestFakeKeyEvent (GDK_DISPLAY(), (unsigned int) keycode, False, CurrentTime); + XTestFakeKeyEvent (spi_get_display (), (unsigned int) keycode, False, CurrentTime); break; case Accessibility_KEY_SYM: key_synth_code = keycode_for_keysym (keycode); - XTestFakeKeyEvent (GDK_DISPLAY(), (unsigned int) key_synth_code, True, CurrentTime); - XTestFakeKeyEvent (GDK_DISPLAY(), (unsigned int) key_synth_code, False, CurrentTime); + XTestFakeKeyEvent (spi_get_display (), (unsigned int) key_synth_code, True, CurrentTime); + XTestFakeKeyEvent (spi_get_display (), (unsigned int) key_synth_code, False, CurrentTime); break; } } diff --git a/test/keysynth-demo.c b/test/keysynth-demo.c index ebf00c1..e43b710 100644 --- a/test/keysynth-demo.c +++ b/test/keysynth-demo.c @@ -338,14 +338,14 @@ switch_callback (AccessibleKeystroke *key, void *user_data) if (key->type == SPI_KEY_RELEASED) { - g_print ("spacebar up\n"); + g_print ("switch up\n"); is_down = FALSE; scan_stop (key->timestamp); } else if (!is_down) { - g_print ("spacebar down\n"); + g_print ("switch down\n"); is_down = TRUE; scan_start (key->timestamp); } @@ -491,9 +491,11 @@ main (int argc, char **argv) */ switch_set.keysyms = g_new0 (unsigned long, 1); switch_set.keycodes = g_new0 (unsigned short, 1); + switch_set.keystrings = g_new0 (char *, 1); switch_set.len = 1; switch_set.keysyms[0] = (unsigned long) 0; switch_set.keycodes[0] = (unsigned short) 0; + switch_set.keystrings[0] = ""; switch_listener = SPI_createAccessibleKeystrokeListener (switch_callback, NULL); SPI_registerAccessibleKeystrokeListener (switch_listener, &switch_set, -- 2.7.4