+#ifdef KEY_IMPL_WORKS
+static SPIBoolean
+key_listener_cb (const AccessibleKeystroke *stroke,
+ void *user_data)
+{
+ AccessibleKeystroke *s = user_data;
+
+ *s = *stroke;
+
+ return TRUE;
+}
+#endif
+
+static void
+test_keylisteners (void)
+{
+#ifdef KEY_IMPL_WORKS
+ int i;
+ AccessibleKeystroke stroke;
+ AccessibleKeystrokeListener *key_listener;
+ AccessibleKeySet *test_keyset;
+#endif
+
+ fprintf (stderr, "Testing keyboard listeners ...\n");
+
+#ifdef KEY_IMPL_WORKS
+ key_listener = SPI_createAccessibleKeystrokeListener (
+ key_listener_cb, &stroke);
+
+ test_keyset = SPI_createAccessibleKeySet (1, "=", NULL, NULL);
+
+ g_assert (SPI_registerAccessibleKeystrokeListener (
+ key_listener,
+ test_keyset,
+ 0,
+ SPI_KEY_PRESSED | SPI_KEY_RELEASED,
+ SPI_KEYLISTENER_CANCONSUME | SPI_KEYLISTENER_ALL_WINDOWS));
+
+ for (i = 0; i < 3; i++) {
+ memset (&stroke, 0, sizeof (AccessibleKeystroke));
+ g_assert (SPI_generateKeyboardEvent ('=', NULL, SPI_KEY_SYM));
+ while (!(stroke.type & SPI_KEY_PRESSED))
+ g_main_context_iteration (NULL, TRUE);
+ fprintf (stderr, "p");
+ g_assert (!strcmp (stroke.keystring, "="));
+ while (!(stroke.type & SPI_KEY_RELEASED))
+ g_main_context_iteration (NULL, TRUE);
+ fprintf (stderr, "r ");
+ }
+ g_assert (SPI_deregisterAccessibleKeystrokeListener (key_listener, 0));
+ SPI_freeAccessibleKeySet (test_keyset);
+
+ fprintf (stderr, "\n");
+
+ AccessibleKeystrokeListener_unref (key_listener);
+#else
+ fprintf (stderr, " key impl. impossibly broken\n");
+#endif
+
+ g_assert (SPI_generateMouseEvent (100, 100, "rel"));
+ g_assert (SPI_generateMouseEvent (-50, -50, "rel"));
+ g_assert (SPI_generateMouseEvent (-50, -50, "rel"));
+ g_assert (SPI_generateMouseEvent (-1, -1, "b1c"));
+}
+