| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384 |
- IMPLEMENTATION MODULE SDL3Utils ;
- FROM SYSTEM IMPORT ADDRESS, ADR;
- FROM SDL3 IMPORT SDL_GetError;
- FROM SDL3Events IMPORT SDL_PollEvent,
- EventQuit, EventWindowCloseRequested,
- EventKeyDown, EventKeyUp, EventBufferBytes;
- FROM libc IMPORT strlen, strncpy;
- PROCEDURE CStrToM2 (src: ADDRESS; VAR dst: ARRAY OF CHAR);
- VAR n: CARDINAL;
- BEGIN
- IF HIGH(dst) < 0 THEN RETURN END;
- IF src = NIL THEN dst[0] := 0C; RETURN END;
- (* strlen returns CSIZE_T; VAL converts without range check. *)
- n := VAL(CARDINAL, strlen(src));
- IF n > HIGH(dst) THEN n := HIGH(dst) END;
- strncpy(ADR(dst), src, n);
- IF n <= HIGH(dst) THEN dst[n] := 0C END
- END CStrToM2;
- PROCEDURE GetErrorString (VAR buf: ARRAY OF CHAR);
- BEGIN
- CStrToM2(SDL_GetError(), buf)
- END GetErrorString;
- (* Little-endian 32-bit word at byte offset off. Hosts only. *)
- PROCEDURE LE32 (VAR buf: ARRAY OF CHAR; off: CARDINAL) : CARDINAL;
- BEGIN
- RETURN VAL(CARDINAL, ORD(buf[off]))
- + VAL(CARDINAL, ORD(buf[off+1])) * 256
- + VAL(CARDINAL, ORD(buf[off+2])) * 65536
- + VAL(CARDINAL, ORD(buf[off+3])) * 16777216
- END LE32;
- PROCEDURE PollM2Event (VAR ev: M2Event) : BOOLEAN;
- VAR
- buf: ARRAY [0..EventBufferBytes-1] OF CHAR;
- t: CARDINAL;
- BEGIN
- IF NOT SDL_PollEvent(ADR(buf)) THEN RETURN FALSE END;
- t := LE32(buf, 0);
- ev.sym := 0;
- ev.pressed := FALSE;
- IF t = EventKeyDown THEN
- ev.kind := evKey;
- ev.pressed := TRUE;
- ev.sym := VAL(INTEGER, LE32(buf, 28))
- ELSIF t = EventKeyUp THEN
- ev.kind := evKey;
- ev.pressed := FALSE;
- ev.sym := VAL(INTEGER, LE32(buf, 28))
- ELSIF (t = EventQuit) OR (t = EventWindowCloseRequested) THEN
- ev.kind := evQuit
- ELSE
- ev.kind := evOther
- END;
- RETURN TRUE
- END PollM2Event;
- PROCEDURE DrainEvents (VAR quit: BOOLEAN);
- VAR ev: M2Event;
- BEGIN
- WHILE PollM2Event(ev) DO
- IF ev.kind = evQuit THEN quit := TRUE END
- END
- END DrainEvents;
- PROCEDURE VersionMajor (v: INTEGER) : INTEGER;
- BEGIN
- RETURN v DIV 1000000
- END VersionMajor;
- PROCEDURE VersionMinor (v: INTEGER) : INTEGER;
- BEGIN
- RETURN (v DIV 1000) MOD 1000
- END VersionMinor;
- PROCEDURE VersionMicro (v: INTEGER) : INTEGER;
- BEGIN
- RETURN v MOD 1000
- END VersionMicro;
- END SDL3Utils.
|