(ffi:clines " #include SDL_Renderer *renderer; SDL_Window *window; SDL_Event e; const Uint8 *state; int quitted; int up_arrow, down_arrow, left_arrow, right_arrow; ") (unwind-protect (ffi:c-progn () " if (SDL_Init(SDL_INIT_VIDEO) < 0) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \"Failed to init %s\", SDL_GetError()); @(return); } if (SDL_CreateWindowAndRenderer(640,480,SDL_WINDOW_RESIZABLE, &window, &renderer)) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, \"Failed to create w & r%s\", SDL_GetError()); @(return); } quitted = 0; for (;;) { while(SDL_PollEvent(&e)) if (e.type == SDL_QUIT) quitted = 1; else if (e.type == SDL_KEYDOWN) switch (e.key.keysym.sym) { case SDLK_q: quitted = 1; break; } if (quitted) break; SDL_RenderClear(renderer); SDL_RenderPresent(renderer); SDL_Delay(25); }") (ffi:c-inline () () nil "SDL_Quit()" :one-liner t)) (si:quit)