/* 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 #include 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; }