mirror of
https://github.com/yquake2/yquake2remaster.git
synced 2024-11-13 00:24:44 +00:00
SDL2 support (mostly)
Makefile is adjusted, it compiles and works mostly, but * For some reason (bug in SDL_GetRelativeMouseState() ?) mouse input doesn't work properly.. it seems to be bound to window borders, even if input is grabbed * some keys can't be used anymore because there's no SDLK_* for them anymore (gotta find out if this is important) * Maybe some of the changes need cleanup
This commit is contained in:
parent
ee03e7f03a
commit
51b7607548
5 changed files with 290 additions and 67 deletions
26
Makefile
26
Makefile
|
@ -20,11 +20,16 @@
|
||||||
# User configurable options
|
# User configurable options
|
||||||
# -------------------------
|
# -------------------------
|
||||||
|
|
||||||
|
# blabla
|
||||||
|
# should be no by default in the future
|
||||||
|
WITH_SDL2:=yes
|
||||||
|
|
||||||
# Enables CD audio playback. CD audio playback is used
|
# Enables CD audio playback. CD audio playback is used
|
||||||
# for the background music and doesn't add any further
|
# for the background music and doesn't add any further
|
||||||
# dependencies. It should work on all platforms where
|
# dependencies. It should work on all platforms where
|
||||||
# CD playback is supported by SDL.
|
# CD playback is supported by SDL.
|
||||||
WITH_CDA:=yes
|
# was yes
|
||||||
|
WITH_CDA:=no
|
||||||
|
|
||||||
# Enables OGG/Vorbis support. OGG/Vorbis files can be
|
# Enables OGG/Vorbis support. OGG/Vorbis files can be
|
||||||
# used as a substitute of CD audio playback. Adds
|
# used as a substitute of CD audio playback. Adds
|
||||||
|
@ -145,11 +150,17 @@ endif
|
||||||
# Extra CFLAGS for SDL
|
# Extra CFLAGS for SDL
|
||||||
ifneq ($(OSTYPE), Windows)
|
ifneq ($(OSTYPE), Windows)
|
||||||
ifeq ($(OSTYPE), Darwin)
|
ifeq ($(OSTYPE), Darwin)
|
||||||
|
# TODO: set -I.../SDL2/ or /SDL/
|
||||||
SDLCFLAGS :=
|
SDLCFLAGS :=
|
||||||
else
|
else # not darwin
|
||||||
|
ifeq ($(WITH_SDL2),yes)
|
||||||
|
SDLCFLAGS := $(shell sdl2-config --cflags)
|
||||||
|
else # not SDL2
|
||||||
SDLCFLAGS := $(shell sdl-config --cflags)
|
SDLCFLAGS := $(shell sdl-config --cflags)
|
||||||
endif
|
endif # SDL2
|
||||||
endif
|
|
||||||
|
endif # darwin's else
|
||||||
|
endif # not windows
|
||||||
|
|
||||||
# ----------
|
# ----------
|
||||||
|
|
||||||
|
@ -195,12 +206,17 @@ endif
|
||||||
|
|
||||||
# Extra LDFLAGS for SDL
|
# Extra LDFLAGS for SDL
|
||||||
ifeq ($(OSTYPE), Windows)
|
ifeq ($(OSTYPE), Windows)
|
||||||
|
# TODO: SDL2 for win/osx
|
||||||
SDLLDFLAGS := -lSDL
|
SDLLDFLAGS := -lSDL
|
||||||
else ifeq ($(OSTYPE), Darwin)
|
else ifeq ($(OSTYPE), Darwin)
|
||||||
SDLLDFLAGS := -framework SDL -framework OpenGL -framework Cocoa
|
SDLLDFLAGS := -framework SDL -framework OpenGL -framework Cocoa
|
||||||
else
|
else
|
||||||
|
ifeq ($(WITH_SDL2),yes)
|
||||||
|
SDLLDFLAGS := $(shell sdl2-config --libs)
|
||||||
|
else
|
||||||
SDLLDFLAGS := $(shell sdl-config --libs)
|
SDLLDFLAGS := $(shell sdl-config --libs)
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
# ----------
|
# ----------
|
||||||
|
|
||||||
|
@ -248,6 +264,8 @@ config:
|
||||||
@echo "WITH_SYSTEMWIDE = $(WITH_SYSTEMWIDE)"
|
@echo "WITH_SYSTEMWIDE = $(WITH_SYSTEMWIDE)"
|
||||||
@echo "WITH_SYSTEMDIR = $(WITH_SYSTEMDIR)"
|
@echo "WITH_SYSTEMDIR = $(WITH_SYSTEMDIR)"
|
||||||
@echo "============================"
|
@echo "============================"
|
||||||
|
@echo ""
|
||||||
|
@echo "SDL-Debug: $(SDLCFLAGS)"
|
||||||
|
|
||||||
# ----------
|
# ----------
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,28 @@
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
#define SDLK_KP0 SDLK_KP_0
|
||||||
|
#define SDLK_KP1 SDLK_KP_1
|
||||||
|
#define SDLK_KP2 SDLK_KP_2
|
||||||
|
#define SDLK_KP3 SDLK_KP_3
|
||||||
|
#define SDLK_KP4 SDLK_KP_4
|
||||||
|
#define SDLK_KP5 SDLK_KP_5
|
||||||
|
#define SDLK_KP6 SDLK_KP_6
|
||||||
|
#define SDLK_KP7 SDLK_KP_7
|
||||||
|
#define SDLK_KP8 SDLK_KP_8
|
||||||
|
#define SDLK_KP9 SDLK_KP_9
|
||||||
|
|
||||||
|
#define SDLK_RMETA SDLK_RGUI
|
||||||
|
#define SDLK_LMETA SDLK_LGUI
|
||||||
|
|
||||||
|
#define SDLK_COMPOSE SDLK_APPLICATION // really?
|
||||||
|
|
||||||
|
#define SDLK_PRINT SDLK_PRINTSCREEN
|
||||||
|
#define SDLK_SCROLLOCK SDLK_SCROLLLOCK
|
||||||
|
#define SDLK_NUMLOCK SDLK_NUMLOCKCLEAR
|
||||||
|
#endif
|
||||||
|
|
||||||
#define MOUSE_MAX 3000
|
#define MOUSE_MAX 3000
|
||||||
#define MOUSE_MIN 40
|
#define MOUSE_MIN 40
|
||||||
|
|
||||||
|
@ -61,9 +83,7 @@ int my;
|
||||||
|
|
||||||
Key_Event_fp_t Key_Event_fp;
|
Key_Event_fp_t Key_Event_fp;
|
||||||
|
|
||||||
extern SDL_Surface *surface;
|
|
||||||
static in_state_t *in_state;
|
static in_state_t *in_state;
|
||||||
static unsigned char KeyStates[SDLK_LAST];
|
|
||||||
static qboolean mlooking;
|
static qboolean mlooking;
|
||||||
|
|
||||||
static cvar_t *sensitivity;
|
static cvar_t *sensitivity;
|
||||||
|
@ -232,10 +252,13 @@ IN_TranslateSDLtoQ2Key(unsigned int keysym)
|
||||||
case SDLK_LALT:
|
case SDLK_LALT:
|
||||||
key = K_ALT;
|
key = K_ALT;
|
||||||
break;
|
break;
|
||||||
|
#if !SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
// TODO: delete? what is this anyway?
|
||||||
case SDLK_LSUPER:
|
case SDLK_LSUPER:
|
||||||
case SDLK_RSUPER:
|
case SDLK_RSUPER:
|
||||||
key = K_SUPER;
|
key = K_SUPER;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
case SDLK_KP5:
|
case SDLK_KP5:
|
||||||
key = K_KP_5;
|
key = K_KP_5;
|
||||||
break;
|
break;
|
||||||
|
@ -272,18 +295,24 @@ IN_TranslateSDLtoQ2Key(unsigned int keysym)
|
||||||
case SDLK_SYSREQ:
|
case SDLK_SYSREQ:
|
||||||
key = K_SYSREQ;
|
key = K_SYSREQ;
|
||||||
break;
|
break;
|
||||||
|
#if !SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
// TODO: delete? what is this anyway?
|
||||||
case SDLK_BREAK:
|
case SDLK_BREAK:
|
||||||
key = K_BREAK;
|
key = K_BREAK;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
case SDLK_MENU:
|
case SDLK_MENU:
|
||||||
key = K_MENU;
|
key = K_MENU;
|
||||||
break;
|
break;
|
||||||
case SDLK_POWER:
|
case SDLK_POWER:
|
||||||
key = K_POWER;
|
key = K_POWER;
|
||||||
break;
|
break;
|
||||||
|
#if !SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
// TODO: delete? what is this anyway?
|
||||||
case SDLK_EURO:
|
case SDLK_EURO:
|
||||||
key = K_EURO;
|
key = K_EURO;
|
||||||
break;
|
break;
|
||||||
|
#endif
|
||||||
case SDLK_UNDO:
|
case SDLK_UNDO:
|
||||||
key = K_UNDO;
|
key = K_UNDO;
|
||||||
break;
|
break;
|
||||||
|
@ -298,12 +327,13 @@ IN_TranslateSDLtoQ2Key(unsigned int keysym)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
#if !SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
// FIXME: how could this be used with SDL2?!
|
||||||
if ((keysym >= SDLK_WORLD_0) && (keysym <= SDLK_WORLD_95))
|
if ((keysym >= SDLK_WORLD_0) && (keysym <= SDLK_WORLD_95))
|
||||||
{
|
{
|
||||||
key = (keysym - SDLK_WORLD_0) + K_WORLD_0;
|
key = (keysym - SDLK_WORLD_0) + K_WORLD_0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -318,6 +348,11 @@ void
|
||||||
IN_GetEvent(SDL_Event *event)
|
IN_GetEvent(SDL_Event *event)
|
||||||
{
|
{
|
||||||
unsigned int key;
|
unsigned int key;
|
||||||
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
SDL_Keymod modstate = SDL_GetModState();
|
||||||
|
#else
|
||||||
|
SDLMod modstate = SDL_GetModState();
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (event->type)
|
switch (event->type)
|
||||||
{
|
{
|
||||||
|
@ -352,23 +387,10 @@ IN_GetEvent(SDL_Event *event)
|
||||||
case SDL_KEYDOWN:
|
case SDL_KEYDOWN:
|
||||||
|
|
||||||
/* Fullscreen switch via Alt-Return */
|
/* Fullscreen switch via Alt-Return */
|
||||||
if ((KeyStates[SDLK_LALT] ||
|
if ((modstate & KMOD_ALT) &&
|
||||||
KeyStates[SDLK_RALT]) &&
|
|
||||||
(event->key.keysym.sym == SDLK_RETURN))
|
(event->key.keysym.sym == SDLK_RETURN))
|
||||||
{
|
{
|
||||||
SDL_WM_ToggleFullScreen(surface);
|
GLimp_ToggleFullscreen();
|
||||||
|
|
||||||
if (surface->flags & SDL_FULLSCREEN)
|
|
||||||
{
|
|
||||||
Cvar_SetValue("vid_fullscreen", 1);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Cvar_SetValue("vid_fullscreen", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
vid_fullscreen->modified = false;
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -376,8 +398,7 @@ IN_GetEvent(SDL_Event *event)
|
||||||
really belongs in Key_Event(), but since
|
really belongs in Key_Event(), but since
|
||||||
Key_ClearStates() can mess up the internal
|
Key_ClearStates() can mess up the internal
|
||||||
K_SHIFT state let's do it here instead. */
|
K_SHIFT state let's do it here instead. */
|
||||||
if ((KeyStates[SDLK_LSHIFT] ||
|
if ((modstate & KMOD_SHIFT) &&
|
||||||
KeyStates[SDLK_RSHIFT]) &&
|
|
||||||
(event->key.keysym.sym == SDLK_ESCAPE))
|
(event->key.keysym.sym == SDLK_ESCAPE))
|
||||||
{
|
{
|
||||||
Cbuf_ExecuteText(EXEC_NOW, "toggleconsole");
|
Cbuf_ExecuteText(EXEC_NOW, "toggleconsole");
|
||||||
|
@ -385,8 +406,6 @@ IN_GetEvent(SDL_Event *event)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
KeyStates[event->key.keysym.sym] = 1;
|
|
||||||
|
|
||||||
/* Get the pressed key and add it to the key list */
|
/* Get the pressed key and add it to the key list */
|
||||||
key = IN_TranslateSDLtoQ2Key(event->key.keysym.sym);
|
key = IN_TranslateSDLtoQ2Key(event->key.keysym.sym);
|
||||||
|
|
||||||
|
@ -401,11 +420,6 @@ IN_GetEvent(SDL_Event *event)
|
||||||
|
|
||||||
/* The user released a key */
|
/* The user released a key */
|
||||||
case SDL_KEYUP:
|
case SDL_KEYUP:
|
||||||
|
|
||||||
if (KeyStates[event->key.keysym.sym])
|
|
||||||
{
|
|
||||||
KeyStates[event->key.keysym.sym] = 0;
|
|
||||||
|
|
||||||
/* Get the pressed key and remove it from the key list */
|
/* Get the pressed key and remove it from the key list */
|
||||||
key = IN_TranslateSDLtoQ2Key(event->key.keysym.sym);
|
key = IN_TranslateSDLtoQ2Key(event->key.keysym.sym);
|
||||||
|
|
||||||
|
@ -415,7 +429,6 @@ IN_GetEvent(SDL_Event *event)
|
||||||
keyq[keyq_head].down = false;
|
keyq[keyq_head].down = false;
|
||||||
keyq_head = (keyq_head + 1) & 127;
|
keyq_head = (keyq_head + 1) & 127;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -445,14 +458,15 @@ IN_Update(void)
|
||||||
IN_GetEvent(&event);
|
IN_GetEvent(&event);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Mouse button processing. Button 4
|
|
||||||
and 5 are the mousewheel and thus
|
|
||||||
not processed here. */
|
|
||||||
if (!mx && !my)
|
if (!mx && !my)
|
||||||
{
|
{
|
||||||
SDL_GetRelativeMouseState(&mx, &my);
|
SDL_GetRelativeMouseState(&mx, &my);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Mouse button processing. Button 4
|
||||||
|
and 5 are the mousewheel and thus
|
||||||
|
not processed here. */
|
||||||
mouse_buttonstate = 0;
|
mouse_buttonstate = 0;
|
||||||
bstate = SDL_GetMouseState(NULL, NULL);
|
bstate = SDL_GetMouseState(NULL, NULL);
|
||||||
|
|
||||||
|
@ -487,7 +501,7 @@ IN_Update(void)
|
||||||
(in_grab->value == 2 && windowed_mouse->value));
|
(in_grab->value == 2 && windowed_mouse->value));
|
||||||
if (have_grab != want_grab)
|
if (have_grab != want_grab)
|
||||||
{
|
{
|
||||||
SDL_WM_GrabInput((want_grab ? SDL_GRAB_ON : SDL_GRAB_OFF));
|
GLimp_GrabInput(want_grab);
|
||||||
have_grab = want_grab;
|
have_grab = want_grab;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -572,9 +586,16 @@ IN_KeyboardInit(Key_Event_fp_t fp)
|
||||||
|
|
||||||
/* SDL stuff. Moved here from IN_BackendInit because
|
/* SDL stuff. Moved here from IN_BackendInit because
|
||||||
* this must be done after video is initialized. */
|
* this must be done after video is initialized. */
|
||||||
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
// TODO: keyrepeat?
|
||||||
|
// TODO: only if want_grab?
|
||||||
|
SDL_SetRelativeMouseMode(SDL_TRUE);
|
||||||
|
have_grab = GLimp_InputIsGrabbed();
|
||||||
|
#else
|
||||||
SDL_EnableUNICODE(0);
|
SDL_EnableUNICODE(0);
|
||||||
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
|
SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
|
||||||
have_grab = (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_ON);
|
have_grab = (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_ON);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -51,7 +51,13 @@
|
||||||
#include <X11/extensions/xf86vmode.h>
|
#include <X11/extensions/xf86vmode.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SDL_Surface *surface;
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
SDL_Window* window = NULL;
|
||||||
|
SDL_GLContext context = NULL;
|
||||||
|
#else
|
||||||
|
SDL_Surface* window = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
qboolean have_stencil = false;
|
qboolean have_stencil = false;
|
||||||
|
|
||||||
char *displayname = NULL;
|
char *displayname = NULL;
|
||||||
|
@ -62,6 +68,14 @@ Display *dpy;
|
||||||
XF86VidModeGamma x11_oldgamma;
|
XF86VidModeGamma x11_oldgamma;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
// some compatibility defines
|
||||||
|
#define SDL_SRCCOLORKEY SDL_TRUE
|
||||||
|
#define SDL_FULLSCREEN SDL_WINDOW_FULLSCREEN
|
||||||
|
#define SDL_OPENGL SDL_WINDOW_OPENGL
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialzes the SDL OpenGL context
|
* Initialzes the SDL OpenGL context
|
||||||
*/
|
*/
|
||||||
|
@ -70,7 +84,6 @@ GLimp_Init(void)
|
||||||
{
|
{
|
||||||
if (!SDL_WasInit(SDL_INIT_VIDEO))
|
if (!SDL_WasInit(SDL_INIT_VIDEO))
|
||||||
{
|
{
|
||||||
char driverName[64];
|
|
||||||
|
|
||||||
if (SDL_Init(SDL_INIT_VIDEO) == -1)
|
if (SDL_Init(SDL_INIT_VIDEO) == -1)
|
||||||
{
|
{
|
||||||
|
@ -78,8 +91,12 @@ GLimp_Init(void)
|
||||||
SDL_GetError());
|
SDL_GetError());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
const char* driverName = SDL_GetCurrentVideoDriver();
|
||||||
|
#else
|
||||||
|
char driverName[64];
|
||||||
SDL_VideoDriverName(driverName, sizeof(driverName) - 1);
|
SDL_VideoDriverName(driverName, sizeof(driverName) - 1);
|
||||||
|
#endif
|
||||||
VID_Printf(PRINT_ALL, "SDL video driver is \"%s\".\n", driverName);
|
VID_Printf(PRINT_ALL, "SDL video driver is \"%s\".\n", driverName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,6 +118,8 @@ GLimp_GetProcAddress (const char* proc)
|
||||||
static void
|
static void
|
||||||
SetSDLIcon()
|
SetSDLIcon()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
#if !SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
SDL_Surface *icon;
|
SDL_Surface *icon;
|
||||||
SDL_Color color;
|
SDL_Color color;
|
||||||
Uint8 *ptr;
|
Uint8 *ptr;
|
||||||
|
@ -143,6 +162,7 @@ SetSDLIcon()
|
||||||
|
|
||||||
SDL_WM_SetIcon(icon, NULL);
|
SDL_WM_SetIcon(icon, NULL);
|
||||||
SDL_FreeSurface(icon);
|
SDL_FreeSurface(icon);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -171,13 +191,80 @@ UpdateHardwareGamma(void)
|
||||||
void
|
void
|
||||||
UpdateHardwareGamma(void)
|
UpdateHardwareGamma(void)
|
||||||
{
|
{
|
||||||
float gamma;
|
|
||||||
|
|
||||||
gamma = (vid_gamma->value);
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
// FIXME: there's no more SDL_SetGamma?!
|
||||||
|
// see rbd3bfg R_SetColorMappings() ?
|
||||||
|
#else
|
||||||
|
float gamma = (vid_gamma->value);
|
||||||
SDL_SetGamma(gamma, gamma, gamma);
|
SDL_SetGamma(gamma, gamma, gamma);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static qboolean IsFullscreen()
|
||||||
|
{
|
||||||
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
return !!(SDL_GetWindowFlags(window) & SDL_WINDOW_FULLSCREEN);
|
||||||
|
#else
|
||||||
|
return !!(window->flags & SDL_FULLSCREEN);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static qboolean CreateWindow(int flags)
|
||||||
|
{
|
||||||
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
int windowPos = SDL_WINDOWPOS_UNDEFINED;
|
||||||
|
// TODO: support fullscreen on different displays with SDL_WINDOWPOS_UNDEFINED_DISPLAY(displaynum)
|
||||||
|
window = SDL_CreateWindow("Yamagi Quake II", windowPos, windowPos,
|
||||||
|
vid.width, vid.height, flags);
|
||||||
|
|
||||||
|
if(window == NULL)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
context = SDL_GL_CreateContext(window);
|
||||||
|
if(context == NULL)
|
||||||
|
{
|
||||||
|
SDL_DestroyWindow(window);
|
||||||
|
window = NULL;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set vsync - TODO: -1 could be set for "late swap tearing",
|
||||||
|
// i.e. only vsync if framerate is high enough
|
||||||
|
SDL_GL_SetSwapInterval(gl_swapinterval->value ? 1 : 0);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
#else
|
||||||
|
window = SDL_SetVideoMode(vid.width, vid.height, 0, flags);
|
||||||
|
return window != NULL;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static qboolean GetWindowSize(int* w, int* h)
|
||||||
|
{
|
||||||
|
if(window == NULL || w == NULL || h == NULL)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
SDL_DisplayMode m;
|
||||||
|
if(SDL_GetWindowDisplayMode(window, &m) != 0)
|
||||||
|
{
|
||||||
|
VID_Printf(PRINT_ALL, "Can't get Displaymode: %s\n", SDL_GetError());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*w = m.w;
|
||||||
|
*h = m.h;
|
||||||
|
#else
|
||||||
|
*w = window->w;
|
||||||
|
*h = window->h;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initializes the OpenGL window
|
* Initializes the OpenGL window
|
||||||
*/
|
*/
|
||||||
|
@ -189,30 +276,32 @@ GLimp_InitGraphics(qboolean fullscreen)
|
||||||
int stencil_bits;
|
int stencil_bits;
|
||||||
char title[24];
|
char title[24];
|
||||||
|
|
||||||
if (surface && (surface->w == vid.width) && (surface->h == vid.height))
|
int width, height;
|
||||||
{
|
|
||||||
/* Are we running fullscreen? */
|
|
||||||
int isfullscreen = (surface->flags & SDL_FULLSCREEN) ? 1 : 0;
|
|
||||||
|
|
||||||
/* We should, but we don't */
|
if (GetWindowSize(&width, &height) && (width == vid.width) && (height == vid.height))
|
||||||
if (fullscreen != isfullscreen)
|
|
||||||
{
|
{
|
||||||
SDL_WM_ToggleFullScreen(surface);
|
/* If we want fullscreen, but aren't */
|
||||||
|
if (fullscreen != IsFullscreen())
|
||||||
|
{
|
||||||
|
GLimp_ToggleFullscreen();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Do we now? */
|
/* Are we now? */
|
||||||
isfullscreen = (surface->flags & SDL_FULLSCREEN) ? 1 : 0;
|
if (fullscreen == IsFullscreen())
|
||||||
|
|
||||||
if (fullscreen == isfullscreen)
|
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Is the surface used? */
|
/* Is the surface used? */
|
||||||
if (surface)
|
if (window)
|
||||||
{
|
{
|
||||||
SDL_FreeSurface(surface);
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
SDL_GL_DeleteContext(context);
|
||||||
|
SDL_DestroyWindow(window);
|
||||||
|
#else
|
||||||
|
SDL_FreeSurface(window);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Create the window */
|
/* Create the window */
|
||||||
|
@ -236,15 +325,17 @@ GLimp_InitGraphics(qboolean fullscreen)
|
||||||
/* Set the icon */
|
/* Set the icon */
|
||||||
SetSDLIcon();
|
SetSDLIcon();
|
||||||
|
|
||||||
|
#if !SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
/* Enable vsync */
|
/* Enable vsync */
|
||||||
if (gl_swapinterval->value)
|
if (gl_swapinterval->value)
|
||||||
{
|
{
|
||||||
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1);
|
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
if ((surface = SDL_SetVideoMode(vid.width, vid.height, 0, flags)) == NULL)
|
if (!CreateWindow(flags))
|
||||||
{
|
{
|
||||||
if (counter == 1)
|
if (counter == 1)
|
||||||
{
|
{
|
||||||
|
@ -310,7 +401,11 @@ GLimp_InitGraphics(qboolean fullscreen)
|
||||||
|
|
||||||
/* Window title */
|
/* Window title */
|
||||||
snprintf(title, sizeof(title), "Yamagi Quake II %s", VERSION);
|
snprintf(title, sizeof(title), "Yamagi Quake II %s", VERSION);
|
||||||
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
SDL_SetWindowTitle(window, title);
|
||||||
|
#else
|
||||||
SDL_WM_SetCaption(title, title);
|
SDL_WM_SetCaption(title, title);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* No cursor */
|
/* No cursor */
|
||||||
SDL_ShowCursor(0);
|
SDL_ShowCursor(0);
|
||||||
|
@ -324,7 +419,11 @@ GLimp_InitGraphics(qboolean fullscreen)
|
||||||
void
|
void
|
||||||
GLimp_EndFrame(void)
|
GLimp_EndFrame(void)
|
||||||
{
|
{
|
||||||
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
SDL_GL_SwapWindow(window);
|
||||||
|
#else
|
||||||
SDL_GL_SwapBuffers();
|
SDL_GL_SwapBuffers();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -353,6 +452,57 @@ GLimp_SetMode(int *pwidth, int *pheight, int mode, qboolean fullscreen)
|
||||||
return rserr_ok;
|
return rserr_ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Toggle fullscreen.
|
||||||
|
*/
|
||||||
|
void GLimp_ToggleFullscreen(void)
|
||||||
|
{
|
||||||
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
int wantFullscreen = !IsFullscreen();
|
||||||
|
|
||||||
|
SDL_SetWindowFullscreen(window, wantFullscreen ? SDL_WINDOW_FULLSCREEN : 0);
|
||||||
|
Cvar_SetValue("vid_fullscreen", wantFullscreen);
|
||||||
|
#else
|
||||||
|
SDL_WM_ToggleFullScreen(window);
|
||||||
|
|
||||||
|
if (IsFullscreen())
|
||||||
|
{
|
||||||
|
Cvar_SetValue("vid_fullscreen", 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Cvar_SetValue("vid_fullscreen", 0);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
vid_fullscreen->modified = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (Un)grab Input
|
||||||
|
*/
|
||||||
|
void GLimp_GrabInput(qboolean grab)
|
||||||
|
{
|
||||||
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
SDL_SetWindowGrab(window, grab ? SDL_TRUE : SDL_FALSE);
|
||||||
|
#else
|
||||||
|
SDL_WM_GrabInput(grab ? SDL_GRAB_ON : SDL_GRAB_OFF);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* returns true if input is grabbed, else false
|
||||||
|
*/
|
||||||
|
qboolean GLimp_InputIsGrabbed()
|
||||||
|
{
|
||||||
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
return SDL_GetWindowGrab(window) ? true : false;
|
||||||
|
#else
|
||||||
|
SDL_GrabMode m = SDL_WM_GrabInput(SDL_GRAB_QUERY);
|
||||||
|
return m == SDL_GRAB_ON;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Shuts the SDL render backend down
|
* Shuts the SDL render backend down
|
||||||
*/
|
*/
|
||||||
|
@ -371,12 +521,22 @@ GLimp_Shutdown(void)
|
||||||
GLimp_EndFrame();
|
GLimp_EndFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (surface)
|
if (window)
|
||||||
{
|
{
|
||||||
SDL_FreeSurface(surface);
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
SDL_DestroyWindow(window);
|
||||||
|
#else
|
||||||
|
SDL_FreeSurface(window);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
surface = NULL;
|
window = NULL;
|
||||||
|
|
||||||
|
if(context)
|
||||||
|
{
|
||||||
|
SDL_GL_DeleteContext(context);
|
||||||
|
context = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (SDL_WasInit(SDL_INIT_EVERYTHING) == SDL_INIT_VIDEO)
|
if (SDL_WasInit(SDL_INIT_EVERYTHING) == SDL_INIT_VIDEO)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1188,7 +1188,6 @@ SDL_Callback(void *data, Uint8 *stream, int length)
|
||||||
qboolean
|
qboolean
|
||||||
SDL_BackendInit(void)
|
SDL_BackendInit(void)
|
||||||
{
|
{
|
||||||
char drivername[128];
|
|
||||||
char reqdriver[128];
|
char reqdriver[128];
|
||||||
SDL_AudioSpec desired;
|
SDL_AudioSpec desired;
|
||||||
SDL_AudioSpec obtained;
|
SDL_AudioSpec obtained;
|
||||||
|
@ -1215,7 +1214,7 @@ SDL_BackendInit(void)
|
||||||
s_sdldriver = (Cvar_Get("s_sdldriver", "dsp", CVAR_ARCHIVE));
|
s_sdldriver = (Cvar_Get("s_sdldriver", "dsp", CVAR_ARCHIVE));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
snprintf(reqdriver, sizeof(drivername), "%s=%s", "SDL_AUDIODRIVER", s_sdldriver->string);
|
snprintf(reqdriver, sizeof(reqdriver), "%s=%s", "SDL_AUDIODRIVER", s_sdldriver->string);
|
||||||
putenv(reqdriver);
|
putenv(reqdriver);
|
||||||
|
|
||||||
Com_Printf("Starting SDL audio callback.\n");
|
Com_Printf("Starting SDL audio callback.\n");
|
||||||
|
@ -1228,11 +1227,21 @@ SDL_BackendInit(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#if SDL_VERSION_ATLEAST(2, 0, 0)
|
||||||
|
const char* drivername = SDL_GetCurrentAudioDriver();
|
||||||
|
if(drivername == NULL)
|
||||||
|
{
|
||||||
|
drivername = "(UNKNOWN)";
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
char drivername[128];
|
||||||
if (SDL_AudioDriverName(drivername, sizeof(drivername)) == NULL)
|
if (SDL_AudioDriverName(drivername, sizeof(drivername)) == NULL)
|
||||||
{
|
{
|
||||||
strcpy(drivername, "(UNKNOWN)");
|
strcpy(drivername, "(UNKNOWN)");
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
Com_Printf("SDL audio driver is \"%s\".\n", drivername);
|
Com_Printf("SDL audio driver is \"%s\".\n", drivername);
|
||||||
|
|
||||||
|
|
|
@ -418,4 +418,19 @@ int GLimp_SetMode(int *pwidth, int *pheight, int mode, qboolean fullscreen);
|
||||||
*/
|
*/
|
||||||
void *GLimp_GetProcAddress (const char* proc);
|
void *GLimp_GetProcAddress (const char* proc);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Toggle fullscreen.
|
||||||
|
*/
|
||||||
|
void GLimp_ToggleFullscreen(void);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* (Un)grab Input
|
||||||
|
*/
|
||||||
|
void GLimp_GrabInput(qboolean grab);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* returns true if input is grabbed, else false
|
||||||
|
*/
|
||||||
|
qboolean GLimp_InputIsGrabbed();
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue