/* A complete CPU-rendered window. Build instructions: docs/getting-started.md. */ #include #include struct app { bool failed; }; static enum yasl_app_result init(void *ud, struct yasl_display *display) { struct yasl_window_spec spec = {.title = "Hello YASL", .size = {640, 480}}; struct yasl_surface *surface = yasl_surface_create_toplevel(display, &spec); if (!surface) { perror("yasl_surface_create_toplevel"); ((struct app *)ud)->failed = true; return YASL_APP_QUIT; } yasl_surface_request_frame(surface); return YASL_APP_CONTINUE; } static enum yasl_app_result event(void *ud, const struct yasl_event *event) { (void)ud; return event->type == YASL_EVENT_WINDOW_CLOSE ? YASL_APP_QUIT : YASL_APP_CONTINUE; } static void draw(void *ud, struct yasl_surface *surface, struct yasl_frame_context *frame) { struct app *app = ud; size_t count = (size_t)frame->size.x * frame->size.y; for (size_t i = 0; i < count; i++) frame->cpu.pixels[i] = 0xff306090; /* Opaque premultiplied ARGB. */ if (!yasl_frame_present_cpu(frame, NULL, 0)) { fprintf(stderr, "Could not present the draw target\n"); app->failed = true; } if (app->failed) yasl_surface_destroy(surface); } int main(void) { struct app app = {0}; struct yasl_app_desc desc = { .app_id = "org.example.hello", .userdata = &app, .init = init, .event = event, .frame = draw, }; int result = yasl_run(&desc); if (result) fprintf(stderr, "Could not run the application\n"); return result || app.failed ? 1 : 0; }