SDL3Utils.mod 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. IMPLEMENTATION MODULE SDL3Utils ;
  2. FROM SYSTEM IMPORT ADDRESS, ADR;
  3. FROM SDL3 IMPORT SDL_GetError;
  4. FROM SDL3Events IMPORT SDL_PollEvent,
  5. EventQuit, EventWindowCloseRequested,
  6. EventKeyDown, EventKeyUp, EventBufferBytes;
  7. FROM libc IMPORT strlen, strncpy;
  8. PROCEDURE CStrToM2 (src: ADDRESS; VAR dst: ARRAY OF CHAR);
  9. VAR n: CARDINAL;
  10. BEGIN
  11. IF HIGH(dst) < 0 THEN RETURN END;
  12. IF src = NIL THEN dst[0] := 0C; RETURN END;
  13. (* strlen returns CSIZE_T; VAL converts without range check. *)
  14. n := VAL(CARDINAL, strlen(src));
  15. IF n > HIGH(dst) THEN n := HIGH(dst) END;
  16. strncpy(ADR(dst), src, n);
  17. IF n <= HIGH(dst) THEN dst[n] := 0C END
  18. END CStrToM2;
  19. PROCEDURE GetErrorString (VAR buf: ARRAY OF CHAR);
  20. BEGIN
  21. CStrToM2(SDL_GetError(), buf)
  22. END GetErrorString;
  23. (* Little-endian 32-bit word at byte offset off. Hosts only. *)
  24. PROCEDURE LE32 (VAR buf: ARRAY OF CHAR; off: CARDINAL) : CARDINAL;
  25. BEGIN
  26. RETURN VAL(CARDINAL, ORD(buf[off]))
  27. + VAL(CARDINAL, ORD(buf[off+1])) * 256
  28. + VAL(CARDINAL, ORD(buf[off+2])) * 65536
  29. + VAL(CARDINAL, ORD(buf[off+3])) * 16777216
  30. END LE32;
  31. PROCEDURE PollM2Event (VAR ev: M2Event) : BOOLEAN;
  32. VAR
  33. buf: ARRAY [0..EventBufferBytes-1] OF CHAR;
  34. t: CARDINAL;
  35. BEGIN
  36. IF NOT SDL_PollEvent(ADR(buf)) THEN RETURN FALSE END;
  37. t := LE32(buf, 0);
  38. ev.sym := 0;
  39. ev.pressed := FALSE;
  40. IF t = EventKeyDown THEN
  41. ev.kind := evKey;
  42. ev.pressed := TRUE;
  43. ev.sym := VAL(INTEGER, LE32(buf, 28))
  44. ELSIF t = EventKeyUp THEN
  45. ev.kind := evKey;
  46. ev.pressed := FALSE;
  47. ev.sym := VAL(INTEGER, LE32(buf, 28))
  48. ELSIF (t = EventQuit) OR (t = EventWindowCloseRequested) THEN
  49. ev.kind := evQuit
  50. ELSE
  51. ev.kind := evOther
  52. END;
  53. RETURN TRUE
  54. END PollM2Event;
  55. PROCEDURE DrainEvents (VAR quit: BOOLEAN);
  56. VAR ev: M2Event;
  57. BEGIN
  58. WHILE PollM2Event(ev) DO
  59. IF ev.kind = evQuit THEN quit := TRUE END
  60. END
  61. END DrainEvents;
  62. PROCEDURE VersionMajor (v: INTEGER) : INTEGER;
  63. BEGIN
  64. RETURN v DIV 1000000
  65. END VersionMajor;
  66. PROCEDURE VersionMinor (v: INTEGER) : INTEGER;
  67. BEGIN
  68. RETURN (v DIV 1000) MOD 1000
  69. END VersionMinor;
  70. PROCEDURE VersionMicro (v: INTEGER) : INTEGER;
  71. BEGIN
  72. RETURN v MOD 1000
  73. END VersionMicro;
  74. END SDL3Utils.