SDLUtils.mod 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. IMPLEMENTATION MODULE SDLUtils ;
  2. FROM SYSTEM IMPORT ADDRESS, ADR;
  3. FROM SDL2 IMPORT SDL_GetError;
  4. FROM SDLEvents IMPORT SDL_PollEvent,
  5. EventQuit, EventKeyDown, EventKeyUp, EventBufferBytes;
  6. FROM libc IMPORT strlen, strncpy;
  7. PROCEDURE CStrToM2 (src: ADDRESS; VAR dst: ARRAY OF CHAR);
  8. VAR n: CARDINAL;
  9. BEGIN
  10. IF HIGH(dst) < 0 THEN RETURN END;
  11. IF src = NIL THEN dst[0] := 0C; RETURN END;
  12. (* strlen returns CSIZE_T; VAL converts without range check. *)
  13. n := VAL(CARDINAL, strlen(src));
  14. IF n > HIGH(dst) THEN n := HIGH(dst) END;
  15. strncpy(ADR(dst), src, n);
  16. IF n <= HIGH(dst) THEN dst[n] := 0C END
  17. END CStrToM2;
  18. PROCEDURE GetErrorString (VAR buf: ARRAY OF CHAR);
  19. BEGIN
  20. CStrToM2(SDL_GetError(), buf)
  21. END GetErrorString;
  22. (* Little-endian 32-bit word at byte offset off. Hosts only. *)
  23. PROCEDURE LE32 (VAR buf: ARRAY OF CHAR; off: CARDINAL) : CARDINAL;
  24. BEGIN
  25. RETURN VAL(CARDINAL, ORD(buf[off]))
  26. + VAL(CARDINAL, ORD(buf[off+1])) * 256
  27. + VAL(CARDINAL, ORD(buf[off+2])) * 65536
  28. + VAL(CARDINAL, ORD(buf[off+3])) * 16777216
  29. END LE32;
  30. PROCEDURE PollM2Event (VAR ev: M2Event) : BOOLEAN;
  31. VAR
  32. buf: ARRAY [0..EventBufferBytes-1] OF CHAR;
  33. t: CARDINAL;
  34. BEGIN
  35. IF SDL_PollEvent(ADR(buf)) = 0 THEN RETURN FALSE END;
  36. t := LE32(buf, 0);
  37. ev.sym := 0;
  38. ev.pressed := FALSE;
  39. IF t = EventKeyDown THEN
  40. ev.kind := evKey;
  41. ev.pressed := TRUE;
  42. (* Sint32 keysym.sym; game keycodes are all positive. *)
  43. ev.sym := VAL(INTEGER, LE32(buf, 20))
  44. ELSIF t = EventKeyUp THEN
  45. ev.kind := evKey;
  46. ev.pressed := FALSE;
  47. ev.sym := VAL(INTEGER, LE32(buf, 20))
  48. ELSIF t = EventQuit 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. END SDLUtils.