+static SPIBoolean
+key_listener_cb (const AccessibleKeystroke *stroke,
+ void *user_data)
+{
+ AccessibleKeystroke *s = user_data;
+
+ *s = *stroke;
+ if (stroke->keystring) s->keystring = g_strdup (stroke->keystring);
+
+ if (s->type == SPI_KEY_PRESSED)
+ key_press_received = TRUE;
+ else if (s->type == SPI_KEY_RELEASED)
+ key_release_received = TRUE;
+
+ return TRUE;
+}
+
+
+static void
+test_keylisteners (void)
+{
+ int i;
+ AccessibleKeystroke stroke;
+ AccessibleKeystrokeListener *key_listener;
+ AccessibleKeySet *test_keyset;
+
+ fprintf (stderr, "Testing keyboard listeners ...\n");
+
+ 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 (!(key_press_received))
+ g_main_context_iteration (NULL, TRUE);
+ fprintf (stderr, "p [%s]", stroke.keystring);
+ g_assert (!strcmp (stroke.keystring, "="));
+ while (!(key_release_received))
+ g_main_context_iteration (NULL, TRUE);
+ fprintf (stderr, "r [%s]", stroke.keystring);
+ key_press_received = FALSE;
+ key_release_received = FALSE;
+ }
+ g_assert (SPI_deregisterAccessibleKeystrokeListener (key_listener, 0));
+ SPI_freeAccessibleKeySet (test_keyset);
+
+ fprintf (stderr, "\n");
+
+ AccessibleKeystrokeListener_unref (key_listener);
+
+ 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"));
+}
+