(in-package "ecl-chario")

(ffi:clines "
#include <SDL2/SDL.h>
")

(defun sdl2-chars () "
(sdl2-chars) opens an sdl2 video window,
which sends graphical charcodes to your lisp,
which princs them.
terpri also respected
ESC to quit
Must run from main thread.
"
(unwind-protect
 (let ((code -1))
  (declare (:int code))
  (ffi:c-progn (code)
   "SDL_Window *window;"
   "SDL_Renderer *renderer;"
   "SDL_Event event;"

   "if (SDL_Init(0) < 0)"
       (error "SDL failed to init")

   "if (SDL_CreateWindowAndRenderer(640,480,0,&window,&renderer))"
       (error "Failed to create window and renderer")

   "SDL_StartTextInput();"
   "while (SDL_WaitEvent(&event)) {"
       "SDL_SetRenderDrawColor(renderer,0,0,50,255);"
       "SDL_RenderClear(renderer);"
       "SDL_RenderPresent(renderer);"

       "if (event.type==SDL_QUIT) {"
           (return-from sdl2-chars)
       "} else if (event.type==SDL_TEXTINPUT) {"
           "#0 = event.text.text[0];"
           (princ (code-char code))
       "} else if (event.type == SDL_KEYDOWN) {"
           "switch (event.key.keysym.sym) {"
           "case SDLK_RETURN:"
               (terpri)
               "break;"
           "case SDLK_ESCAPE:"
               (return-from sdl2-chars)
               "break;"
           "}"
       "}"
       (force-output)
   "}"))
 (ffi:c-inline nil nil nil
  "SDL_Quit()" :one-liner t)))