event_loop.mod 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. MODULE event_loop ;
  2. (*
  3. m2SDL example: event loop until window close or 5 seconds.
  4. Uses the opaque SDLEvents subset: PollEvent over a raw buffer,
  5. first CARDINAL of SDL_Event is the Uint32 type - offset 0 on
  6. little and big endian alike.
  7. *)
  8. FROM SYSTEM IMPORT ADDRESS, ADR;
  9. FROM SDL2 IMPORT SDL_Init, SDL_Quit, SDL_Delay,
  10. SDL_GetTicks64, SDLInitVideo, SDLInitEvents;
  11. FROM SDLVideo IMPORT SDL_CreateWindow, SDL_DestroyWindow,
  12. WindowShown, WindowPosUndefined;
  13. FROM SDLEvents IMPORT SDL_PollEvent, EventQuit, EventBufferBytes;
  14. FROM libc IMPORT printf;
  15. VAR
  16. win: ADDRESS;
  17. buf: ARRAY [0..EventBufferBytes-1] OF CHAR;
  18. evType: CARDINAL;
  19. start, now: LONGCARD;
  20. quit: BOOLEAN;
  21. BEGIN
  22. IF SDL_Init(SDLInitVideo + SDLInitEvents) # 0 THEN
  23. printf("SDL_Init failed\n");
  24. HALT(1)
  25. END;
  26. win := SDL_CreateWindow("Close me, or wait 5s",
  27. WindowPosUndefined, WindowPosUndefined,
  28. 640, 480, WindowShown);
  29. IF win = NIL THEN
  30. printf("CreateWindow failed\n");
  31. SDL_Quit;
  32. HALT(1)
  33. END;
  34. quit := FALSE;
  35. start := SDL_GetTicks64();
  36. WHILE NOT quit DO
  37. WHILE SDL_PollEvent(ADR(buf)) # 0 DO
  38. evType := 0;
  39. evType := VAL(CARDINAL, ORD(buf[0]))
  40. + VAL(CARDINAL, ORD(buf[1])) * 256
  41. + VAL(CARDINAL, ORD(buf[2])) * 65536;
  42. IF evType = EventQuit THEN quit := TRUE END
  43. END;
  44. now := SDL_GetTicks64();
  45. IF now - start > 5000 THEN quit := TRUE END;
  46. SDL_Delay(16)
  47. END;
  48. SDL_DestroyWindow(win);
  49. SDL_Quit;
  50. printf("bye\n")
  51. END event_loop.