event_loop.mod 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. MODULE event_loop ;
  2. (*
  3. m2SDL3 example: event loop until window close or 5 seconds.
  4. Quit arrives as EventQuit or EventWindowCloseRequested; both
  5. decode to evQuit via SDL3Utils.PollM2Event, so DrainEvents is
  6. enough for a close-button loop.
  7. *)
  8. FROM SDL3 IMPORT SDL_Init, SDL_Quit, SDL_Delay,
  9. SDL_GetTicks, SDLInitVideo, SDLInitEvents;
  10. FROM SDL3Video IMPORT SDL_CreateWindow, SDL_DestroyWindow;
  11. FROM SDL3Utils IMPORT DrainEvents;
  12. FROM libc IMPORT printf;
  13. FROM SYSTEM IMPORT ADDRESS;
  14. VAR
  15. win: ADDRESS;
  16. start, now: LONGCARD;
  17. quit: BOOLEAN;
  18. BEGIN
  19. IF NOT SDL_Init(SDLInitVideo + SDLInitEvents) THEN
  20. printf("SDL_Init failed\n");
  21. HALT(1)
  22. END;
  23. win := SDL_CreateWindow("Close me, or wait 5s", 640, 480, 0);
  24. IF win = NIL THEN
  25. printf("CreateWindow failed\n");
  26. SDL_Quit;
  27. HALT(1)
  28. END;
  29. quit := FALSE;
  30. start := SDL_GetTicks();
  31. WHILE NOT quit DO
  32. DrainEvents(quit);
  33. now := SDL_GetTicks();
  34. IF now - start > 5000 THEN quit := TRUE END;
  35. SDL_Delay(16)
  36. END;
  37. SDL_DestroyWindow(win);
  38. SDL_Quit;
  39. printf("bye\n")
  40. END event_loop.