mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-03-06 14:27:16 +00:00
Codechange: Remove ability for SDL to be dynamically loaded on Windows
This commit is contained in:
parent
63fe6c6598
commit
c3bc7d657e
@ -410,7 +410,6 @@
|
|||||||
<ClCompile Include="..\src\road.cpp" />
|
<ClCompile Include="..\src\road.cpp" />
|
||||||
<ClCompile Include="..\src\roadstop.cpp" />
|
<ClCompile Include="..\src\roadstop.cpp" />
|
||||||
<ClCompile Include="..\src\screenshot.cpp" />
|
<ClCompile Include="..\src\screenshot.cpp" />
|
||||||
<ClCompile Include="..\src\sdl.cpp" />
|
|
||||||
<ClCompile Include="..\src\settings.cpp" />
|
<ClCompile Include="..\src\settings.cpp" />
|
||||||
<ClCompile Include="..\src\signal.cpp" />
|
<ClCompile Include="..\src\signal.cpp" />
|
||||||
<ClCompile Include="..\src\signs.cpp" />
|
<ClCompile Include="..\src\signs.cpp" />
|
||||||
@ -623,7 +622,6 @@
|
|||||||
<ClInclude Include="..\src\roadveh.h" />
|
<ClInclude Include="..\src\roadveh.h" />
|
||||||
<ClInclude Include="..\src\safeguards.h" />
|
<ClInclude Include="..\src\safeguards.h" />
|
||||||
<ClInclude Include="..\src\screenshot.h" />
|
<ClInclude Include="..\src\screenshot.h" />
|
||||||
<ClInclude Include="..\src\sdl.h" />
|
|
||||||
<ClInclude Include="..\src\sound\sdl_s.h" />
|
<ClInclude Include="..\src\sound\sdl_s.h" />
|
||||||
<ClInclude Include="..\src\video\sdl_v.h" />
|
<ClInclude Include="..\src\video\sdl_v.h" />
|
||||||
<ClInclude Include="..\src\settings_func.h" />
|
<ClInclude Include="..\src\settings_func.h" />
|
||||||
|
@ -318,9 +318,6 @@
|
|||||||
<ClCompile Include="..\src\screenshot.cpp">
|
<ClCompile Include="..\src\screenshot.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\src\sdl.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\settings.cpp">
|
<ClCompile Include="..\src\settings.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@ -957,9 +954,6 @@
|
|||||||
<ClInclude Include="..\src\screenshot.h">
|
<ClInclude Include="..\src\screenshot.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\src\sdl.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\sound\sdl_s.h">
|
<ClInclude Include="..\src\sound\sdl_s.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
@ -410,7 +410,6 @@
|
|||||||
<ClCompile Include="..\src\road.cpp" />
|
<ClCompile Include="..\src\road.cpp" />
|
||||||
<ClCompile Include="..\src\roadstop.cpp" />
|
<ClCompile Include="..\src\roadstop.cpp" />
|
||||||
<ClCompile Include="..\src\screenshot.cpp" />
|
<ClCompile Include="..\src\screenshot.cpp" />
|
||||||
<ClCompile Include="..\src\sdl.cpp" />
|
|
||||||
<ClCompile Include="..\src\settings.cpp" />
|
<ClCompile Include="..\src\settings.cpp" />
|
||||||
<ClCompile Include="..\src\signal.cpp" />
|
<ClCompile Include="..\src\signal.cpp" />
|
||||||
<ClCompile Include="..\src\signs.cpp" />
|
<ClCompile Include="..\src\signs.cpp" />
|
||||||
@ -623,7 +622,6 @@
|
|||||||
<ClInclude Include="..\src\roadveh.h" />
|
<ClInclude Include="..\src\roadveh.h" />
|
||||||
<ClInclude Include="..\src\safeguards.h" />
|
<ClInclude Include="..\src\safeguards.h" />
|
||||||
<ClInclude Include="..\src\screenshot.h" />
|
<ClInclude Include="..\src\screenshot.h" />
|
||||||
<ClInclude Include="..\src\sdl.h" />
|
|
||||||
<ClInclude Include="..\src\sound\sdl_s.h" />
|
<ClInclude Include="..\src\sound\sdl_s.h" />
|
||||||
<ClInclude Include="..\src\video\sdl_v.h" />
|
<ClInclude Include="..\src\video\sdl_v.h" />
|
||||||
<ClInclude Include="..\src\settings_func.h" />
|
<ClInclude Include="..\src\settings_func.h" />
|
||||||
|
@ -318,9 +318,6 @@
|
|||||||
<ClCompile Include="..\src\screenshot.cpp">
|
<ClCompile Include="..\src\screenshot.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\src\sdl.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\settings.cpp">
|
<ClCompile Include="..\src\settings.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@ -957,9 +954,6 @@
|
|||||||
<ClInclude Include="..\src\screenshot.h">
|
<ClInclude Include="..\src\screenshot.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\src\sdl.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\sound\sdl_s.h">
|
<ClInclude Include="..\src\sound\sdl_s.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
@ -410,7 +410,6 @@
|
|||||||
<ClCompile Include="..\src\road.cpp" />
|
<ClCompile Include="..\src\road.cpp" />
|
||||||
<ClCompile Include="..\src\roadstop.cpp" />
|
<ClCompile Include="..\src\roadstop.cpp" />
|
||||||
<ClCompile Include="..\src\screenshot.cpp" />
|
<ClCompile Include="..\src\screenshot.cpp" />
|
||||||
<ClCompile Include="..\src\sdl.cpp" />
|
|
||||||
<ClCompile Include="..\src\settings.cpp" />
|
<ClCompile Include="..\src\settings.cpp" />
|
||||||
<ClCompile Include="..\src\signal.cpp" />
|
<ClCompile Include="..\src\signal.cpp" />
|
||||||
<ClCompile Include="..\src\signs.cpp" />
|
<ClCompile Include="..\src\signs.cpp" />
|
||||||
@ -623,7 +622,6 @@
|
|||||||
<ClInclude Include="..\src\roadveh.h" />
|
<ClInclude Include="..\src\roadveh.h" />
|
||||||
<ClInclude Include="..\src\safeguards.h" />
|
<ClInclude Include="..\src\safeguards.h" />
|
||||||
<ClInclude Include="..\src\screenshot.h" />
|
<ClInclude Include="..\src\screenshot.h" />
|
||||||
<ClInclude Include="..\src\sdl.h" />
|
|
||||||
<ClInclude Include="..\src\sound\sdl_s.h" />
|
<ClInclude Include="..\src\sound\sdl_s.h" />
|
||||||
<ClInclude Include="..\src\video\sdl_v.h" />
|
<ClInclude Include="..\src\video\sdl_v.h" />
|
||||||
<ClInclude Include="..\src\settings_func.h" />
|
<ClInclude Include="..\src\settings_func.h" />
|
||||||
|
@ -318,9 +318,6 @@
|
|||||||
<ClCompile Include="..\src\screenshot.cpp">
|
<ClCompile Include="..\src\screenshot.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<ClCompile Include="..\src\sdl.cpp">
|
|
||||||
<Filter>Source Files</Filter>
|
|
||||||
</ClCompile>
|
|
||||||
<ClCompile Include="..\src\settings.cpp">
|
<ClCompile Include="..\src\settings.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
@ -957,9 +954,6 @@
|
|||||||
<ClInclude Include="..\src\screenshot.h">
|
<ClInclude Include="..\src\screenshot.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
<ClInclude Include="..\src\sdl.h">
|
|
||||||
<Filter>Header Files</Filter>
|
|
||||||
</ClInclude>
|
|
||||||
<ClInclude Include="..\src\sound\sdl_s.h">
|
<ClInclude Include="..\src\sound\sdl_s.h">
|
||||||
<Filter>Header Files</Filter>
|
<Filter>Header Files</Filter>
|
||||||
</ClInclude>
|
</ClInclude>
|
||||||
|
@ -71,9 +71,6 @@ rev.cpp
|
|||||||
road.cpp
|
road.cpp
|
||||||
roadstop.cpp
|
roadstop.cpp
|
||||||
screenshot.cpp
|
screenshot.cpp
|
||||||
#if SDL
|
|
||||||
sdl.cpp
|
|
||||||
#end
|
|
||||||
settings.cpp
|
settings.cpp
|
||||||
signal.cpp
|
signal.cpp
|
||||||
signs.cpp
|
signs.cpp
|
||||||
@ -312,7 +309,6 @@ roadstop_base.h
|
|||||||
roadveh.h
|
roadveh.h
|
||||||
safeguards.h
|
safeguards.h
|
||||||
screenshot.h
|
screenshot.h
|
||||||
sdl.h
|
|
||||||
sound/sdl_s.h
|
sound/sdl_s.h
|
||||||
video/sdl_v.h
|
video/sdl_v.h
|
||||||
settings_func.h
|
settings_func.h
|
||||||
|
@ -62,7 +62,6 @@
|
|||||||
#include <lzo/lzo1x.h>
|
#include <lzo/lzo1x.h>
|
||||||
#endif
|
#endif
|
||||||
#ifdef WITH_SDL
|
#ifdef WITH_SDL
|
||||||
# include "sdl.h"
|
|
||||||
# include <SDL.h>
|
# include <SDL.h>
|
||||||
#endif /* WITH_SDL */
|
#endif /* WITH_SDL */
|
||||||
#ifdef WITH_ZLIB
|
#ifdef WITH_ZLIB
|
||||||
@ -268,14 +267,8 @@ char *CrashLog::LogLibraries(char *buffer, const char *last) const
|
|||||||
#endif /* WITH_PNG */
|
#endif /* WITH_PNG */
|
||||||
|
|
||||||
#ifdef WITH_SDL
|
#ifdef WITH_SDL
|
||||||
#ifdef DYNAMICALLY_LOADED_SDL
|
const SDL_version *v = SDL_Linked_Version();
|
||||||
if (SDL_CALL SDL_Linked_Version != NULL) {
|
buffer += seprintf(buffer, last, " SDL: %d.%d.%d\n", v->major, v->minor, v->patch);
|
||||||
#else
|
|
||||||
{
|
|
||||||
#endif
|
|
||||||
const SDL_version *v = SDL_CALL SDL_Linked_Version();
|
|
||||||
buffer += seprintf(buffer, last, " SDL: %d.%d.%d\n", v->major, v->minor, v->patch);
|
|
||||||
}
|
|
||||||
#endif /* WITH_SDL */
|
#endif /* WITH_SDL */
|
||||||
|
|
||||||
#ifdef WITH_ZLIB
|
#ifdef WITH_ZLIB
|
||||||
|
119
src/sdl.cpp
119
src/sdl.cpp
@ -1,119 +0,0 @@
|
|||||||
/* $Id$ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of OpenTTD.
|
|
||||||
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
|
||||||
* OpenTTD 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 General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @file sdl.cpp Implementation of SDL support. */
|
|
||||||
|
|
||||||
#include "stdafx.h"
|
|
||||||
|
|
||||||
#ifdef WITH_SDL
|
|
||||||
|
|
||||||
#include "sdl.h"
|
|
||||||
#include <SDL.h>
|
|
||||||
|
|
||||||
/** Number of users of the SDL library. */
|
|
||||||
static int _sdl_usage;
|
|
||||||
|
|
||||||
#ifdef DYNAMICALLY_LOADED_SDL
|
|
||||||
|
|
||||||
#include "os/windows/win32.h"
|
|
||||||
|
|
||||||
#define M(x) x "\0"
|
|
||||||
static const char sdl_files[] =
|
|
||||||
M("sdl.dll")
|
|
||||||
M("SDL_Init")
|
|
||||||
M("SDL_InitSubSystem")
|
|
||||||
M("SDL_GetError")
|
|
||||||
M("SDL_QuitSubSystem")
|
|
||||||
M("SDL_UpdateRect")
|
|
||||||
M("SDL_UpdateRects")
|
|
||||||
M("SDL_SetColors")
|
|
||||||
M("SDL_WM_SetCaption")
|
|
||||||
M("SDL_ShowCursor")
|
|
||||||
M("SDL_FreeSurface")
|
|
||||||
M("SDL_PollEvent")
|
|
||||||
M("SDL_WarpMouse")
|
|
||||||
M("SDL_GetTicks")
|
|
||||||
M("SDL_OpenAudio")
|
|
||||||
M("SDL_PauseAudio")
|
|
||||||
M("SDL_CloseAudio")
|
|
||||||
M("SDL_LockSurface")
|
|
||||||
M("SDL_UnlockSurface")
|
|
||||||
M("SDL_GetModState")
|
|
||||||
M("SDL_Delay")
|
|
||||||
M("SDL_Quit")
|
|
||||||
M("SDL_SetVideoMode")
|
|
||||||
M("SDL_EnableKeyRepeat")
|
|
||||||
M("SDL_EnableUNICODE")
|
|
||||||
M("SDL_VideoDriverName")
|
|
||||||
M("SDL_ListModes")
|
|
||||||
M("SDL_GetKeyState")
|
|
||||||
M("SDL_LoadBMP_RW")
|
|
||||||
M("SDL_RWFromFile")
|
|
||||||
M("SDL_SetColorKey")
|
|
||||||
M("SDL_WM_SetIcon")
|
|
||||||
M("SDL_MapRGB")
|
|
||||||
M("SDL_VideoModeOK")
|
|
||||||
M("SDL_Linked_Version")
|
|
||||||
M("")
|
|
||||||
;
|
|
||||||
#undef M
|
|
||||||
|
|
||||||
SDLProcs sdl_proc;
|
|
||||||
|
|
||||||
static const char *LoadSdlDLL()
|
|
||||||
{
|
|
||||||
if (sdl_proc.SDL_Init != NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
if (!LoadLibraryList((Function *)(void *)&sdl_proc, sdl_files)) {
|
|
||||||
return "Unable to load sdl.dll";
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* DYNAMICALLY_LOADED_SDL */
|
|
||||||
|
|
||||||
#include "safeguards.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Open the SDL library.
|
|
||||||
* @param x The subsystem to load.
|
|
||||||
*/
|
|
||||||
const char *SdlOpen(uint32 x)
|
|
||||||
{
|
|
||||||
#ifdef DYNAMICALLY_LOADED_SDL
|
|
||||||
{
|
|
||||||
const char *s = LoadSdlDLL();
|
|
||||||
if (s != NULL) return s;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (_sdl_usage++ == 0) {
|
|
||||||
if (SDL_CALL SDL_Init(x | SDL_INIT_NOPARACHUTE) == -1) return SDL_CALL SDL_GetError();
|
|
||||||
} else if (x != 0) {
|
|
||||||
if (SDL_CALL SDL_InitSubSystem(x) == -1) return SDL_CALL SDL_GetError();
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Close the SDL library.
|
|
||||||
* @param x The subsystem to close.
|
|
||||||
*/
|
|
||||||
void SdlClose(uint32 x)
|
|
||||||
{
|
|
||||||
if (x != 0) {
|
|
||||||
SDL_CALL SDL_QuitSubSystem(x);
|
|
||||||
}
|
|
||||||
if (--_sdl_usage == 0) {
|
|
||||||
SDL_CALL SDL_Quit();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
71
src/sdl.h
71
src/sdl.h
@ -1,71 +0,0 @@
|
|||||||
/* $Id$ */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of OpenTTD.
|
|
||||||
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
|
||||||
* OpenTTD 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 General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/** @file sdl.h SDL support. */
|
|
||||||
|
|
||||||
#ifndef SDL_H
|
|
||||||
#define SDL_H
|
|
||||||
|
|
||||||
const char *SdlOpen(uint32 x);
|
|
||||||
void SdlClose(uint32 x);
|
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
#define DYNAMICALLY_LOADED_SDL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef DYNAMICALLY_LOADED_SDL
|
|
||||||
#include <SDL.h>
|
|
||||||
|
|
||||||
struct SDLProcs {
|
|
||||||
int (SDLCALL *SDL_Init)(Uint32);
|
|
||||||
int (SDLCALL *SDL_InitSubSystem)(Uint32);
|
|
||||||
char *(SDLCALL *SDL_GetError)();
|
|
||||||
void (SDLCALL *SDL_QuitSubSystem)(Uint32);
|
|
||||||
void (SDLCALL *SDL_UpdateRect)(SDL_Surface *, Sint32, Sint32, Uint32, Uint32);
|
|
||||||
void (SDLCALL *SDL_UpdateRects)(SDL_Surface *, int, SDL_Rect *);
|
|
||||||
int (SDLCALL *SDL_SetColors)(SDL_Surface *, SDL_Color *, int, int);
|
|
||||||
void (SDLCALL *SDL_WM_SetCaption)(const char *, const char *);
|
|
||||||
int (SDLCALL *SDL_ShowCursor)(int);
|
|
||||||
void (SDLCALL *SDL_FreeSurface)(SDL_Surface *);
|
|
||||||
int (SDLCALL *SDL_PollEvent)(SDL_Event *);
|
|
||||||
void (SDLCALL *SDL_WarpMouse)(Uint16, Uint16);
|
|
||||||
uint32 (SDLCALL *SDL_GetTicks)();
|
|
||||||
int (SDLCALL *SDL_OpenAudio)(SDL_AudioSpec *, SDL_AudioSpec*);
|
|
||||||
void (SDLCALL *SDL_PauseAudio)(int);
|
|
||||||
void (SDLCALL *SDL_CloseAudio)();
|
|
||||||
int (SDLCALL *SDL_LockSurface)(SDL_Surface*);
|
|
||||||
void (SDLCALL *SDL_UnlockSurface)(SDL_Surface*);
|
|
||||||
SDLMod (SDLCALL *SDL_GetModState)();
|
|
||||||
void (SDLCALL *SDL_Delay)(Uint32);
|
|
||||||
void (SDLCALL *SDL_Quit)();
|
|
||||||
SDL_Surface *(SDLCALL *SDL_SetVideoMode)(int, int, int, Uint32);
|
|
||||||
int (SDLCALL *SDL_EnableKeyRepeat)(int, int);
|
|
||||||
void (SDLCALL *SDL_EnableUNICODE)(int);
|
|
||||||
void (SDLCALL *SDL_VideoDriverName)(char *, int);
|
|
||||||
SDL_Rect **(SDLCALL *SDL_ListModes)(void *, int);
|
|
||||||
Uint8 *(SDLCALL *SDL_GetKeyState)(int *);
|
|
||||||
SDL_Surface *(SDLCALL *SDL_LoadBMP_RW)(SDL_RWops *, int);
|
|
||||||
SDL_RWops *(SDLCALL *SDL_RWFromFile)(const char *, const char *);
|
|
||||||
int (SDLCALL *SDL_SetColorKey)(SDL_Surface *, Uint32, Uint32);
|
|
||||||
void (SDLCALL *SDL_WM_SetIcon)(SDL_Surface *, Uint8 *);
|
|
||||||
Uint32 (SDLCALL *SDL_MapRGB)(SDL_PixelFormat *, Uint8, Uint8, Uint8);
|
|
||||||
int (SDLCALL *SDL_VideoModeOK)(int, int, int, Uint32);
|
|
||||||
SDL_version *(SDLCALL *SDL_Linked_Version)();
|
|
||||||
int (SDLCALL *SDL_BlitSurface)(SDL_Surface *, SDL_Rect *, SDL_Surface *, SDL_Rect *);
|
|
||||||
SDL_Surface *(SDLCALL *SDL_CreateRGBSurface)(Uint32, int, int, int, Uint32, Uint32, Uint32, Uint32);
|
|
||||||
};
|
|
||||||
|
|
||||||
extern SDLProcs sdl_proc;
|
|
||||||
|
|
||||||
#define SDL_CALL sdl_proc.
|
|
||||||
#else
|
|
||||||
#define SDL_CALL
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* SDL_H */
|
|
@ -14,7 +14,6 @@
|
|||||||
#include "../stdafx.h"
|
#include "../stdafx.h"
|
||||||
|
|
||||||
#include "../mixer.h"
|
#include "../mixer.h"
|
||||||
#include "../sdl.h"
|
|
||||||
#include "sdl_s.h"
|
#include "sdl_s.h"
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
|
|
||||||
@ -38,8 +37,14 @@ const char *SoundDriver_SDL::Start(const char * const *parm)
|
|||||||
{
|
{
|
||||||
SDL_AudioSpec spec;
|
SDL_AudioSpec spec;
|
||||||
|
|
||||||
const char *s = SdlOpen(SDL_INIT_AUDIO);
|
/* Only initialise SDL if the video driver hasn't done it already */
|
||||||
if (s != NULL) return s;
|
int ret_code = 0;
|
||||||
|
if (SDL_WasInit(SDL_INIT_EVERYTHING) == 0) {
|
||||||
|
ret_code = SDL_Init(SDL_INIT_AUDIO | SDL_INIT_NOPARACHUTE);
|
||||||
|
} else if (SDL_WasInit(SDL_INIT_AUDIO) == 0) {
|
||||||
|
ret_code = SDL_InitSubSystem(SDL_INIT_AUDIO);
|
||||||
|
}
|
||||||
|
if (ret_code == -1) return SDL_GetError();
|
||||||
|
|
||||||
spec.freq = GetDriverParamInt(parm, "hz", 44100);
|
spec.freq = GetDriverParamInt(parm, "hz", 44100);
|
||||||
spec.format = AUDIO_S16SYS;
|
spec.format = AUDIO_S16SYS;
|
||||||
@ -47,15 +52,18 @@ const char *SoundDriver_SDL::Start(const char * const *parm)
|
|||||||
spec.samples = GetDriverParamInt(parm, "samples", 1024);
|
spec.samples = GetDriverParamInt(parm, "samples", 1024);
|
||||||
spec.callback = fill_sound_buffer;
|
spec.callback = fill_sound_buffer;
|
||||||
MxInitialize(spec.freq);
|
MxInitialize(spec.freq);
|
||||||
SDL_CALL SDL_OpenAudio(&spec, &spec);
|
SDL_OpenAudio(&spec, &spec);
|
||||||
SDL_CALL SDL_PauseAudio(0);
|
SDL_PauseAudio(0);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoundDriver_SDL::Stop()
|
void SoundDriver_SDL::Stop()
|
||||||
{
|
{
|
||||||
SDL_CALL SDL_CloseAudio();
|
SDL_CloseAudio();
|
||||||
SdlClose(SDL_INIT_AUDIO);
|
SDL_QuitSubSystem(SDL_INIT_AUDIO);
|
||||||
|
if (SDL_WasInit(SDL_INIT_EVERYTHING) == 0) {
|
||||||
|
SDL_Quit(); // If there's nothing left, quit SDL
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* WITH_SDL */
|
#endif /* WITH_SDL */
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
#include "../stdafx.h"
|
#include "../stdafx.h"
|
||||||
#include "../openttd.h"
|
#include "../openttd.h"
|
||||||
#include "../gfx_func.h"
|
#include "../gfx_func.h"
|
||||||
#include "../sdl.h"
|
|
||||||
#include "../rev.h"
|
#include "../rev.h"
|
||||||
#include "../blitter/factory.hpp"
|
#include "../blitter/factory.hpp"
|
||||||
#include "../network/network.h"
|
#include "../network/network.h"
|
||||||
@ -73,7 +72,7 @@ static void UpdatePalette(bool init = false)
|
|||||||
pal[i].unused = 0;
|
pal[i].unused = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_CALL SDL_SetColors(_sdl_screen, pal, _local_palette.first_dirty, _local_palette.count_dirty);
|
SDL_SetColors(_sdl_screen, pal, _local_palette.first_dirty, _local_palette.count_dirty);
|
||||||
|
|
||||||
if (_sdl_screen != _sdl_realscreen && init) {
|
if (_sdl_screen != _sdl_realscreen && init) {
|
||||||
/* When using a shadow surface, also set our palette on the real screen. This lets SDL
|
/* When using a shadow surface, also set our palette on the real screen. This lets SDL
|
||||||
@ -96,7 +95,7 @@ static void UpdatePalette(bool init = false)
|
|||||||
* palette change and the blitting below, so we only set
|
* palette change and the blitting below, so we only set
|
||||||
* the real palette during initialisation.
|
* the real palette during initialisation.
|
||||||
*/
|
*/
|
||||||
SDL_CALL SDL_SetColors(_sdl_realscreen, pal, _local_palette.first_dirty, _local_palette.count_dirty);
|
SDL_SetColors(_sdl_realscreen, pal, _local_palette.first_dirty, _local_palette.count_dirty);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_sdl_screen != _sdl_realscreen && !init) {
|
if (_sdl_screen != _sdl_realscreen && !init) {
|
||||||
@ -110,8 +109,8 @@ static void UpdatePalette(bool init = false)
|
|||||||
* best mapping of shadow palette colors to real palette
|
* best mapping of shadow palette colors to real palette
|
||||||
* colors from scratch.
|
* colors from scratch.
|
||||||
*/
|
*/
|
||||||
SDL_CALL SDL_BlitSurface(_sdl_screen, NULL, _sdl_realscreen, NULL);
|
SDL_BlitSurface(_sdl_screen, NULL, _sdl_realscreen, NULL);
|
||||||
SDL_CALL SDL_UpdateRect(_sdl_realscreen, 0, 0, 0, 0);
|
SDL_UpdateRect(_sdl_realscreen, 0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -157,16 +156,16 @@ static void DrawSurfaceToScreen()
|
|||||||
_num_dirty_rects = 0;
|
_num_dirty_rects = 0;
|
||||||
if (n > MAX_DIRTY_RECTS) {
|
if (n > MAX_DIRTY_RECTS) {
|
||||||
if (_sdl_screen != _sdl_realscreen) {
|
if (_sdl_screen != _sdl_realscreen) {
|
||||||
SDL_CALL SDL_BlitSurface(_sdl_screen, NULL, _sdl_realscreen, NULL);
|
SDL_BlitSurface(_sdl_screen, NULL, _sdl_realscreen, NULL);
|
||||||
}
|
}
|
||||||
SDL_CALL SDL_UpdateRect(_sdl_realscreen, 0, 0, 0, 0);
|
SDL_UpdateRect(_sdl_realscreen, 0, 0, 0, 0);
|
||||||
} else {
|
} else {
|
||||||
if (_sdl_screen != _sdl_realscreen) {
|
if (_sdl_screen != _sdl_realscreen) {
|
||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
SDL_CALL SDL_BlitSurface(_sdl_screen, &_dirty_rects[i], _sdl_realscreen, &_dirty_rects[i]);
|
SDL_BlitSurface(_sdl_screen, &_dirty_rects[i], _sdl_realscreen, &_dirty_rects[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SDL_CALL SDL_UpdateRects(_sdl_realscreen, n, _dirty_rects);
|
SDL_UpdateRects(_sdl_realscreen, n, _dirty_rects);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -206,14 +205,14 @@ static const Dimension _default_resolutions[] = {
|
|||||||
|
|
||||||
static void GetVideoModes()
|
static void GetVideoModes()
|
||||||
{
|
{
|
||||||
SDL_Rect **modes = SDL_CALL SDL_ListModes(NULL, SDL_SWSURFACE | SDL_FULLSCREEN);
|
SDL_Rect **modes = SDL_ListModes(NULL, SDL_SWSURFACE | SDL_FULLSCREEN);
|
||||||
if (modes == NULL) usererror("sdl: no modes available");
|
if (modes == NULL) usererror("sdl: no modes available");
|
||||||
|
|
||||||
_all_modes = (SDL_CALL SDL_ListModes(NULL, SDL_SWSURFACE | (_fullscreen ? SDL_FULLSCREEN : 0)) == (void*)-1);
|
_all_modes = (SDL_ListModes(NULL, SDL_SWSURFACE | (_fullscreen ? SDL_FULLSCREEN : 0)) == (void*)-1);
|
||||||
if (modes == (void*)-1) {
|
if (modes == (void*)-1) {
|
||||||
int n = 0;
|
int n = 0;
|
||||||
for (uint i = 0; i < lengthof(_default_resolutions); i++) {
|
for (uint i = 0; i < lengthof(_default_resolutions); i++) {
|
||||||
if (SDL_CALL SDL_VideoModeOK(_default_resolutions[i].width, _default_resolutions[i].height, 8, SDL_FULLSCREEN) != 0) {
|
if (SDL_VideoModeOK(_default_resolutions[i].width, _default_resolutions[i].height, 8, SDL_FULLSCREEN) != 0) {
|
||||||
_resolutions[n] = _default_resolutions[i];
|
_resolutions[n] = _default_resolutions[i];
|
||||||
if (++n == lengthof(_resolutions)) break;
|
if (++n == lengthof(_resolutions)) break;
|
||||||
}
|
}
|
||||||
@ -264,13 +263,6 @@ static void GetAvailableVideoMode(uint *w, uint *h)
|
|||||||
*h = _resolutions[best].height;
|
*h = _resolutions[best].height;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef _WIN32
|
|
||||||
/* Let's redefine the LoadBMP macro with because we are dynamically
|
|
||||||
* loading SDL and need to 'SDL_CALL' all functions */
|
|
||||||
#undef SDL_LoadBMP
|
|
||||||
#define SDL_LoadBMP(file) SDL_LoadBMP_RW(SDL_CALL SDL_RWFromFile(file, "rb"), 1)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
bool VideoDriver_SDL::CreateMainSurface(uint w, uint h)
|
bool VideoDriver_SDL::CreateMainSurface(uint w, uint h)
|
||||||
{
|
{
|
||||||
SDL_Surface *newscreen, *icon;
|
SDL_Surface *newscreen, *icon;
|
||||||
@ -287,14 +279,14 @@ bool VideoDriver_SDL::CreateMainSurface(uint w, uint h)
|
|||||||
char icon_path[MAX_PATH];
|
char icon_path[MAX_PATH];
|
||||||
if (FioFindFullPath(icon_path, lastof(icon_path), BASESET_DIR, "openttd.32.bmp") != NULL) {
|
if (FioFindFullPath(icon_path, lastof(icon_path), BASESET_DIR, "openttd.32.bmp") != NULL) {
|
||||||
/* Give the application an icon */
|
/* Give the application an icon */
|
||||||
icon = SDL_CALL SDL_LoadBMP(icon_path);
|
icon = SDL_LoadBMP(icon_path);
|
||||||
if (icon != NULL) {
|
if (icon != NULL) {
|
||||||
/* Get the colourkey, which will be magenta */
|
/* Get the colourkey, which will be magenta */
|
||||||
uint32 rgbmap = SDL_CALL SDL_MapRGB(icon->format, 255, 0, 255);
|
uint32 rgbmap = SDL_MapRGB(icon->format, 255, 0, 255);
|
||||||
|
|
||||||
SDL_CALL SDL_SetColorKey(icon, SDL_SRCCOLORKEY, rgbmap);
|
SDL_SetColorKey(icon, SDL_SRCCOLORKEY, rgbmap);
|
||||||
SDL_CALL SDL_WM_SetIcon(icon, NULL);
|
SDL_WM_SetIcon(icon, NULL);
|
||||||
SDL_CALL SDL_FreeSurface(icon);
|
SDL_FreeSurface(icon);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -329,7 +321,7 @@ bool VideoDriver_SDL::CreateMainSurface(uint w, uint h)
|
|||||||
if (want_hwpalette) DEBUG(driver, 1, "SDL: requesting hardware palette");
|
if (want_hwpalette) DEBUG(driver, 1, "SDL: requesting hardware palette");
|
||||||
|
|
||||||
/* Free any previously allocated shadow surface */
|
/* Free any previously allocated shadow surface */
|
||||||
if (_sdl_screen != NULL && _sdl_screen != _sdl_realscreen) SDL_CALL SDL_FreeSurface(_sdl_screen);
|
if (_sdl_screen != NULL && _sdl_screen != _sdl_realscreen) SDL_FreeSurface(_sdl_screen);
|
||||||
|
|
||||||
if (_sdl_realscreen != NULL) {
|
if (_sdl_realscreen != NULL) {
|
||||||
if (_requested_hwpalette != want_hwpalette) {
|
if (_requested_hwpalette != want_hwpalette) {
|
||||||
@ -342,8 +334,8 @@ bool VideoDriver_SDL::CreateMainSurface(uint w, uint h)
|
|||||||
* subsystem to force creating a new window.
|
* subsystem to force creating a new window.
|
||||||
*/
|
*/
|
||||||
DEBUG(driver, 0, "SDL: Restarting SDL video subsystem, to force hwpalette change");
|
DEBUG(driver, 0, "SDL: Restarting SDL video subsystem, to force hwpalette change");
|
||||||
SDL_CALL SDL_QuitSubSystem(SDL_INIT_VIDEO);
|
SDL_QuitSubSystem(SDL_INIT_VIDEO);
|
||||||
SDL_CALL SDL_InitSubSystem(SDL_INIT_VIDEO);
|
SDL_InitSubSystem(SDL_INIT_VIDEO);
|
||||||
ClaimMousePointer();
|
ClaimMousePointer();
|
||||||
SetupKeyboard();
|
SetupKeyboard();
|
||||||
}
|
}
|
||||||
@ -355,7 +347,7 @@ bool VideoDriver_SDL::CreateMainSurface(uint w, uint h)
|
|||||||
_requested_hwpalette = want_hwpalette;
|
_requested_hwpalette = want_hwpalette;
|
||||||
|
|
||||||
/* DO NOT CHANGE TO HWSURFACE, IT DOES NOT WORK */
|
/* DO NOT CHANGE TO HWSURFACE, IT DOES NOT WORK */
|
||||||
newscreen = SDL_CALL SDL_SetVideoMode(w, h, bpp, SDL_SWSURFACE | (want_hwpalette ? SDL_HWPALETTE : 0) | (_fullscreen ? SDL_FULLSCREEN : SDL_RESIZABLE));
|
newscreen = SDL_SetVideoMode(w, h, bpp, SDL_SWSURFACE | (want_hwpalette ? SDL_HWPALETTE : 0) | (_fullscreen ? SDL_FULLSCREEN : SDL_RESIZABLE));
|
||||||
if (newscreen == NULL) {
|
if (newscreen == NULL) {
|
||||||
DEBUG(driver, 0, "SDL: Couldn't allocate a window to draw on");
|
DEBUG(driver, 0, "SDL: Couldn't allocate a window to draw on");
|
||||||
return false;
|
return false;
|
||||||
@ -382,7 +374,7 @@ bool VideoDriver_SDL::CreateMainSurface(uint w, uint h)
|
|||||||
* we won't create a second shadow surface in this case.
|
* we won't create a second shadow surface in this case.
|
||||||
*/
|
*/
|
||||||
DEBUG(driver, 1, "SDL: using shadow surface");
|
DEBUG(driver, 1, "SDL: using shadow surface");
|
||||||
newscreen = SDL_CALL SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, bpp, 0, 0, 0, 0);
|
newscreen = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, bpp, 0, 0, 0, 0);
|
||||||
if (newscreen == NULL) {
|
if (newscreen == NULL) {
|
||||||
DEBUG(driver, 0, "SDL: Couldn't allocate a shadow surface to draw on");
|
DEBUG(driver, 0, "SDL: Couldn't allocate a shadow surface to draw on");
|
||||||
return false;
|
return false;
|
||||||
@ -409,7 +401,7 @@ bool VideoDriver_SDL::CreateMainSurface(uint w, uint h)
|
|||||||
InitPalette();
|
InitPalette();
|
||||||
|
|
||||||
seprintf(caption, lastof(caption), "OpenTTD %s", _openttd_revision);
|
seprintf(caption, lastof(caption), "OpenTTD %s", _openttd_revision);
|
||||||
SDL_CALL SDL_WM_SetCaption(caption, caption);
|
SDL_WM_SetCaption(caption, caption);
|
||||||
|
|
||||||
GameSizeChanged();
|
GameSizeChanged();
|
||||||
|
|
||||||
@ -418,7 +410,7 @@ bool VideoDriver_SDL::CreateMainSurface(uint w, uint h)
|
|||||||
|
|
||||||
bool VideoDriver_SDL::ClaimMousePointer()
|
bool VideoDriver_SDL::ClaimMousePointer()
|
||||||
{
|
{
|
||||||
SDL_CALL SDL_ShowCursor(0);
|
SDL_ShowCursor(0);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -531,18 +523,18 @@ int VideoDriver_SDL::PollEvent()
|
|||||||
{
|
{
|
||||||
SDL_Event ev;
|
SDL_Event ev;
|
||||||
|
|
||||||
if (!SDL_CALL SDL_PollEvent(&ev)) return -2;
|
if (!SDL_PollEvent(&ev)) return -2;
|
||||||
|
|
||||||
switch (ev.type) {
|
switch (ev.type) {
|
||||||
case SDL_MOUSEMOTION:
|
case SDL_MOUSEMOTION:
|
||||||
if (_cursor.UpdateCursorPosition(ev.motion.x, ev.motion.y, true)) {
|
if (_cursor.UpdateCursorPosition(ev.motion.x, ev.motion.y, true)) {
|
||||||
SDL_CALL SDL_WarpMouse(_cursor.pos.x, _cursor.pos.y);
|
SDL_WarpMouse(_cursor.pos.x, _cursor.pos.y);
|
||||||
}
|
}
|
||||||
HandleMouseEvents();
|
HandleMouseEvents();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SDL_MOUSEBUTTONDOWN:
|
case SDL_MOUSEBUTTONDOWN:
|
||||||
if (_rightclick_emulate && SDL_CALL SDL_GetModState() & KMOD_CTRL) {
|
if (_rightclick_emulate && SDL_GetModState() & KMOD_CTRL) {
|
||||||
ev.button.button = SDL_BUTTON_RIGHT;
|
ev.button.button = SDL_BUTTON_RIGHT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -626,15 +618,23 @@ const char *VideoDriver_SDL::Start(const char * const *parm)
|
|||||||
char buf[30];
|
char buf[30];
|
||||||
_use_hwpalette = GetDriverParamInt(parm, "hw_palette", 2);
|
_use_hwpalette = GetDriverParamInt(parm, "hw_palette", 2);
|
||||||
|
|
||||||
const char *s = SdlOpen(SDL_INIT_VIDEO);
|
/* Just on the offchance the audio subsystem started before the video system,
|
||||||
if (s != NULL) return s;
|
* check whether any part of SDL has been initialised before getting here.
|
||||||
|
* Slightly duplicated with sound/sdl_s.cpp */
|
||||||
|
int ret_code = 0;
|
||||||
|
if (SDL_WasInit(SDL_INIT_EVERYTHING) == 0) {
|
||||||
|
ret_code = SDL_Init(SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE);
|
||||||
|
} else if (SDL_WasInit(SDL_INIT_VIDEO) == 0) {
|
||||||
|
ret_code = SDL_InitSubSystem(SDL_INIT_VIDEO);
|
||||||
|
}
|
||||||
|
if (ret_code == -1) return SDL_GetError();
|
||||||
|
|
||||||
GetVideoModes();
|
GetVideoModes();
|
||||||
if (!CreateMainSurface(_cur_resolution.width, _cur_resolution.height)) {
|
if (!CreateMainSurface(_cur_resolution.width, _cur_resolution.height)) {
|
||||||
return SDL_CALL SDL_GetError();
|
return SDL_GetError();
|
||||||
}
|
}
|
||||||
|
|
||||||
SDL_CALL SDL_VideoDriverName(buf, sizeof buf);
|
SDL_VideoDriverName(buf, sizeof buf);
|
||||||
DEBUG(driver, 1, "SDL: using driver '%s'", buf);
|
DEBUG(driver, 1, "SDL: using driver '%s'", buf);
|
||||||
|
|
||||||
MarkWholeScreenDirty();
|
MarkWholeScreenDirty();
|
||||||
@ -647,18 +647,21 @@ const char *VideoDriver_SDL::Start(const char * const *parm)
|
|||||||
|
|
||||||
void VideoDriver_SDL::SetupKeyboard()
|
void VideoDriver_SDL::SetupKeyboard()
|
||||||
{
|
{
|
||||||
SDL_CALL SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
|
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
|
||||||
SDL_CALL SDL_EnableUNICODE(1);
|
SDL_EnableUNICODE(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void VideoDriver_SDL::Stop()
|
void VideoDriver_SDL::Stop()
|
||||||
{
|
{
|
||||||
SdlClose(SDL_INIT_VIDEO);
|
SDL_QuitSubSystem(SDL_INIT_VIDEO);
|
||||||
|
if (SDL_WasInit(SDL_INIT_EVERYTHING) == 0) {
|
||||||
|
SDL_Quit(); // If there's nothing left, quit SDL
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void VideoDriver_SDL::MainLoop()
|
void VideoDriver_SDL::MainLoop()
|
||||||
{
|
{
|
||||||
uint32 cur_ticks = SDL_CALL SDL_GetTicks();
|
uint32 cur_ticks = SDL_GetTicks();
|
||||||
uint32 last_cur_ticks = cur_ticks;
|
uint32 last_cur_ticks = cur_ticks;
|
||||||
uint32 next_tick = cur_ticks + MILLISECONDS_PER_TICK;
|
uint32 next_tick = cur_ticks + MILLISECONDS_PER_TICK;
|
||||||
uint32 mod;
|
uint32 mod;
|
||||||
@ -700,11 +703,11 @@ void VideoDriver_SDL::MainLoop()
|
|||||||
while (PollEvent() == -1) {}
|
while (PollEvent() == -1) {}
|
||||||
if (_exit_game) break;
|
if (_exit_game) break;
|
||||||
|
|
||||||
mod = SDL_CALL SDL_GetModState();
|
mod = SDL_GetModState();
|
||||||
#if SDL_VERSION_ATLEAST(1, 3, 0)
|
#if SDL_VERSION_ATLEAST(1, 3, 0)
|
||||||
keys = SDL_CALL SDL_GetKeyboardState(&numkeys);
|
keys = SDL_GetKeyboardState(&numkeys);
|
||||||
#else
|
#else
|
||||||
keys = SDL_CALL SDL_GetKeyState(&numkeys);
|
keys = SDL_GetKeyState(&numkeys);
|
||||||
#endif
|
#endif
|
||||||
#if defined(_DEBUG)
|
#if defined(_DEBUG)
|
||||||
if (_shift_pressed)
|
if (_shift_pressed)
|
||||||
@ -723,7 +726,7 @@ void VideoDriver_SDL::MainLoop()
|
|||||||
_fast_forward = 0;
|
_fast_forward = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_ticks = SDL_CALL SDL_GetTicks();
|
cur_ticks = SDL_GetTicks();
|
||||||
if (cur_ticks >= next_tick || (_fast_forward && !_pause_mode) || cur_ticks < prev_cur_ticks) {
|
if (cur_ticks >= next_tick || (_fast_forward && !_pause_mode) || cur_ticks < prev_cur_ticks) {
|
||||||
_realtime_tick += cur_ticks - last_cur_ticks;
|
_realtime_tick += cur_ticks - last_cur_ticks;
|
||||||
last_cur_ticks = cur_ticks;
|
last_cur_ticks = cur_ticks;
|
||||||
|
Loading…
Reference in New Issue
Block a user