1
0
Fork 0
mirror of https://github.com/AquariaOSE/Aquaria.git synced 2024-11-29 03:33:48 +00:00

SDL window backend cleanup

This commit is contained in:
fgenesis 2019-03-18 00:50:36 +01:00
parent 04c557f5e8
commit b7a6b52fe5
2 changed files with 52 additions and 41 deletions

View file

@ -2,6 +2,7 @@
#include <SDL.h>
#include <assert.h>
#include "OSFunctions.h"
#include "Base.h"
#define SDL2_BACKEND SDL_VERSION_ATLEAST(2,0,0)
@ -9,21 +10,11 @@
static Window *s_theWindow; // since SDL1 can only create a single window, keep it around to make sure only one exists.
struct Backend
{
Backend()
: win(NULL)
{}
SDL_Surface *win;
};
#define BACKEND (static_cast<Backend*>(_backend))
#define WIN (BACKEND->win)
#define WIN ((SDL_Surface*&)(_backend))
void *Window::_initBackend()
{
return new Backend;
return NULL;
}
void Window::_ctor()
@ -34,17 +25,22 @@ void Window::_ctor()
Window::~Window()
{
delete BACKEND;
s_theWindow = NULL;
}
bool Window::_open(unsigned w, unsigned h, bool full, unsigned bpp, bool vsync, unsigned display, unsigned hz)
bool Window::isOpen() const
{
return !!WIN;
}
void Window::_open(unsigned w, unsigned h, bool full, unsigned bpp, bool vsync, unsigned display, unsigned hz)
{
// ignored for SDL1
(void)display;
(void)hz;
assert(w && h);
if(!w) w = 800;
if(!h) h = 600;
// have to cast away constness, since SDL_putenv() might be #defined to
// putenv(), which takes a (char *), and freaks out newer GCC releases
@ -55,15 +51,21 @@ bool Window::_open(unsigned w, unsigned h, bool full, unsigned bpp, bool vsync,
SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, vsync);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
Uint32 flags = SDL_OPENGL;
Uint32 flags = SDL_OPENGL | SDL_ANYFORMAT;
if(full)
flags |= SDL_FULLSCREEN;
SDL_Surface *surf = SDL_SetVideoMode(w, h, bpp, flags);
if(!surf)
return false;
exit_error("SDL_SetVideoMode failed");
WIN = surf;
return true;
::initIcon(WIN);
}
void Window::_adjust(unsigned w, unsigned h, bool full, unsigned bpp, bool vsync, unsigned display, unsigned hz)
{
_open(w, h, full, bpp, vsync, display, hz);
}
void Window::warpMouse(int x, int y)
@ -86,11 +88,6 @@ void Window::setTitle(const char *s)
SDL_WM_SetCaption(s, s);
}
void Window::initIcon()
{
::initIcon(WIN);
}
int Window::getDisplayIndex() const
{
return -1;
@ -106,5 +103,34 @@ bool Window::hasInputFocus() const
return ((SDL_GetAppState() & SDL_APPINPUTFOCUS) != 0);
}
void Window::_onEventImpl(const SDL_Event& ev)
{
switch(ev.type)
{
case SDL_KEYDOWN:
{
#if __APPLE__
if ((ev.key.keysym.sym == SDLK_q) && (ev.key.keysym.mod & KMOD_META))
#else
if ((ev.key.keysym.sym == SDLK_F4) && (ev.key.keysym.mod & KMOD_ALT))
#endif
{
onQuit();
}
}
break;
case SDL_VIDEORESIZE:
onResize(ev.resize.w, ev.resize.h);
break;
}
}
void Window::initSize()
{
onResize(WIN->w, WIN->h);
}
#endif // !SDL2_BACKEND

View file

@ -66,6 +66,7 @@ void Window::_open(unsigned w, unsigned h, bool full, unsigned bpp, bool vsync,
# endif
SDL_GL_SetAttribute(SDL_GL_SHARE_WITH_CURRENT_CONTEXT, 1);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_SetHint("SDL_VIDEO_HIGHDPI_DISABLED", "1");
Uint32 flags = SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN | SDL_WINDOW_RESIZABLE;
if(full)
@ -178,32 +179,16 @@ void Window::warpMouse(int x, int y)
SDL_WarpMouseInWindow(WIN, x, y);
}
#ifndef KMOD_GUI
#define KMOD_GUI KMOD_META
#endif
void Window::_onEventImpl(const SDL_Event& ev)
{
switch(ev.type)
{
#if 0
case SDL_KEYDOWN:
{
#if __APPLE__
#if SDL_VERSION_ATLEAST(2, 0, 0)
if ((ev.key.keysym.sym == SDLK_q) && (ev.key.keysym.mod & KMOD_GUI))
#else
if ((ev.key.keysym.sym == SDLK_q) && (ev.key.keysym.mod & KMOD_META))
onQuit();
#endif
#else
if ((ev.key.keysym.sym == SDLK_F4) && (ev.key.keysym.mod & KMOD_ALT))
#endif
{
onQuit()
}
}
break;
#endif
case SDL_WINDOWEVENT:
{