From 51ed8fe6f2ea9892e905e81cf5bad3960537eb40 Mon Sep 17 00:00:00 2001 From: brunzelchen Date: Fri, 19 Feb 2010 17:18:42 +0000 Subject: Challenge MOD r7 alpha based on Ultrastar Deluxe v1.0.1a for changes read Changelog.txt in folder Game git-svn-id: svn://svn.code.sf.net/p/ultrastardx/svn/branches/1.0.1 Challenge MOD@2107 b956fd51-792f-4845-bead-9b4dfca2ff2c --- Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/fastevents.pas | 201 ++++++++++++++++++++++ 1 file changed, 201 insertions(+) create mode 100644 Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/fastevents.pas (limited to 'Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/fastevents.pas') diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/fastevents.pas b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/fastevents.pas new file mode 100644 index 00000000..656a7e00 --- /dev/null +++ b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/fastevents.pas @@ -0,0 +1,201 @@ +unit fastevents; +{ + FastEvents is a high-performance event queue manager for SDL. + Copyright (C) 2002 Bob Pendleton + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public License + as published by the Free Software Foundation; either version 2.1 + of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA + + If you do not wish to comply with the terms of the LGPL please + contact the author as other terms are available for a fee. + + Bob Pendleton + Bob@Pendleton.com +} +{ + Translated to Object Pascal by Mason Wheeler. + masonwheeler@yahoo.com + + The original C library can be found at + http://www.gameprogrammer.com/fastevents/fastevents.zip +} + +interface + +uses + sdl; + +function FE_Init: integer; // Initialize FE +procedure FE_Quit; // shutdown FE +procedure FE_PumpEvents; // replacement for SDL_PumpEvents +function FE_PollEvent(event: PSDL_Event): integer; // replacement for SDL_PollEvent +procedure FE_WaitEvent(event: PSDL_Event); // replacement for SDL_WaitEvent +procedure FE_PushEvent(event: PSDL_Event); // replacement for SDL_PushEvent +function FE_GetError: string; // returns the last FastEvents error + +implementation +//---------------------------------------- +// +// error handling code +// + +var + errorString: string = ''; + +procedure setError(err: string); inline; +begin + errorString := err; +end; + +function FE_GetError: string; +begin + result := errorString; +end; + +//---------------------------------------- +// +// Threads, mutexs, thread utils, and +// thread safe wrappers +// +var + eventLock: PSDL_Mutex = nil; + eventWait: PSDL_Cond = nil; + eventTimer: PSDL_TimerID = nil; + +//---------------------------------------- +// +// Timer callback +// + +function timerCallback(interval: Uint32; param: pointer): Uint32; {$IFNDEF __GPC__} cdecl; {$ENDIF} +begin + SDL_CondBroadcast(eventWait); + result := interval; +end; + +//---------------------------------------- +// Initialization and +// cleanup routines +// + +function FE_Init: integer; +begin + result := -1; + if (SDL_INIT_TIMER and SDL_WasInit(SDL_INIT_TIMER)) = 0 then + SDL_InitSubSystem(SDL_INIT_TIMER); + + eventLock := SDL_CreateMutex(); + if eventLock = nil then + begin + setError('FE: can''t create a mutex'); + Exit; + end; + + eventWait := SDL_CreateCond(); + if eventWait = nil then + begin + setError('FE: can''t create a condition variable'); + Exit; + end; + + eventTimer := SDL_AddTimer(10, timerCallback, nil); + if eventTimer = nil then + begin + setError('FE: can''t add a timer'); + Exit; + end; + + result := 0; +end; + +procedure FE_Quit; +begin + SDL_DestroyMutex(eventLock); + eventLock := nil; + + SDL_DestroyCond(eventWait); + eventWait := nil; + + SDL_RemoveTimer(eventTimer); + eventTimer := nil; +end; + +//---------------------------------------- +// +// replacement for SDL_PushEvent(); +// +// This was originally an int function; I changed it to a +// procedure because it only had one possible return value: 1. +// This seemed a bit pointless. -- Mason Wheeler +// + +procedure FE_PushEvent(event: PSDL_Event); +begin + SDL_LockMutex(eventLock); + while SDL_PushEvent(event) = -1 do + SDL_CondWait(eventWait, eventLock); + SDL_UnlockMutex(eventLock); + SDL_CondSignal(eventWait); +end; + +//---------------------------------------- +// +// replacement for SDL_PumpEvents(); +// + +procedure FE_PumpEvents; +begin + SDL_LockMutex(eventLock); + SDL_PumpEvents(); + SDL_UnlockMutex(eventLock); +end; + +//---------------------------------------- +// +// replacement for SDL_PollEvent(); +// + +function FE_PollEvent(event: PSDL_Event): integer; +var + val: integer; +begin + SDL_LockMutex(eventLock); + val := SDL_PollEvent(event); + SDL_UnlockMutex(eventLock); + + if val > 0 then + SDL_CondSignal(eventWait); + result := val; +end; + +//---------------------------------------- +// +// Replacement for SDL_WaitEvent(); +// +// This was originally an int function; I changed it to a +// procedure because it only had one possible return value: 1. +// This seemed a bit pointless. -- Mason Wheeler +// + +procedure FE_WaitEvent(event: PSDL_Event); +begin + SDL_LockMutex(eventLock); + while SDL_PollEvent(event) <= 0 do + SDL_CondWait(eventWait, eventLock); + SDL_UnlockMutex(eventLock); + SDL_CondSignal(eventWait); +end; + +end. -- cgit v1.2.3