summaryrefslogtreecommitdiff
path: root/tests/wayland
diff options
context:
space:
mode:
Diffstat (limited to 'tests/wayland')
-rw-r--r--tests/wayland/test_app_input.c60
1 files changed, 60 insertions, 0 deletions
diff --git a/tests/wayland/test_app_input.c b/tests/wayland/test_app_input.c
new file mode 100644
index 0000000..24b8b64
--- /dev/null
+++ b/tests/wayland/test_app_input.c
@@ -0,0 +1,60 @@
+/* An input event callback that destroys its own surface. The app runner
+ * must not touch the surface's entry after the callback, and must not
+ * deliver the surface's remaining input. Needs a Wayland compositor. */
+#include "wayland/internal.h"
+#include "yasl/app.h"
+
+#include <assert.h>
+#include <stdlib.h>
+
+struct test_state {
+ int keys;
+};
+
+static void push_key(struct yasl_surface *s)
+{
+ struct yasl_input_event ev = {
+ .surface = s,
+ .kind = YASL_INPUT_KEY,
+ .key = { .key = YASL_KEY_A, .action = YASL_KEY_PRESS },
+ };
+ assert(input_queue_push(&((struct wayland_surface *)s)->input, &ev));
+}
+
+static int on_init(void *ud, struct yasl_display *d)
+{
+ (void)ud;
+ struct yasl_surface *s = yasl_surface_create_toplevel(d,
+ &(struct yasl_surface_spec){ .title = "App Input Test", .size = {64, 64} });
+ assert(s);
+ push_key(s);
+ push_key(s);
+ return YASL_APP_CONTINUE;
+}
+
+static int on_event(void *ud, const struct yasl_event *ev)
+{
+ struct test_state *state = ud;
+ if (ev->type == YASL_EVENT_KEY) {
+ state->keys++;
+ yasl_surface_destroy(ev->surface);
+ }
+ return YASL_APP_CONTINUE;
+}
+
+int main(void)
+{
+ if (!getenv("WAYLAND_DISPLAY"))
+ return 77;
+ struct test_state state = {0};
+ int res = yasl_run(&(struct yasl_app_desc){
+ .app_id = "org.yasl.test.app-input",
+ .backend = YASL_BACKEND_WAYLAND,
+ .userdata = &state,
+ .init = on_init,
+ .event = on_event,
+ });
+ assert(res == 0);
+ assert(state.keys == 1);
+ return 0;
+}