mirror of
https://github.com/AquariaOSE/Aquaria.git
synced 2024-11-25 09:44:02 +00:00
SDL window backend cleanup
This commit is contained in:
parent
04c557f5e8
commit
b7a6b52fe5
2 changed files with 52 additions and 41 deletions
|
@ -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
|
||||
|
|
|
@ -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))
|
||||
if ((ev.key.keysym.sym == SDLK_q) && (ev.key.keysym.mod & KMOD_GUI))
|
||||
onQuit();
|
||||
#endif
|
||||
#else
|
||||
if ((ev.key.keysym.sym == SDLK_F4) && (ev.key.keysym.mod & KMOD_ALT))
|
||||
#endif
|
||||
{
|
||||
onQuit()
|
||||
}
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
|
||||
case SDL_WINDOWEVENT:
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue