From 3a2db0135d93b5f12fd42f04db3b6ad9d40834d3 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 24 Jan 2015 23:42:12 +0100 Subject: SDL: Refactor WM specific functionality into SdlGraphicsManager. --- backends/graphics/sdl/sdl-graphics.cpp | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) (limited to 'backends/graphics/sdl/sdl-graphics.cpp') diff --git a/backends/graphics/sdl/sdl-graphics.cpp b/backends/graphics/sdl/sdl-graphics.cpp index b5e49fa397..d42c88f5d6 100644 --- a/backends/graphics/sdl/sdl-graphics.cpp +++ b/backends/graphics/sdl/sdl-graphics.cpp @@ -22,7 +22,9 @@ #include "backends/graphics/sdl/sdl-graphics.h" +#include "backends/platform/sdl/sdl-sys.h" #include "backends/events/sdl/sdl-events.h" +#include "common/textconsole.h" SdlGraphicsManager::SdlGraphicsManager(SdlEventSource *source) : _eventSource(source) { @@ -38,3 +40,32 @@ void SdlGraphicsManager::activateManager() { void SdlGraphicsManager::deactivateManager() { _eventSource->setGraphicsManager(0); } + +void SdlGraphicsManager::setWindowCaption(const Common::String &caption) { + SDL_WM_SetCaption(caption.c_str(), caption.c_str()); +} + +void SdlGraphicsManager::setWindowIcon(SDL_Surface *icon) { + SDL_WM_SetIcon(icon, NULL); + SDL_FreeSurface(icon); +} + +void SdlGraphicsManager::toggleMouseGrab() { + if (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_OFF) { + SDL_WM_GrabInput(SDL_GRAB_ON); + } else { + SDL_WM_GrabInput(SDL_GRAB_OFF); + } +} + +bool SdlGraphicsManager::hasMouseFocus() const { + return (SDL_GetAppState() & SDL_APPMOUSEFOCUS); +} + +void SdlGraphicsManager::warpMouseInWindow(uint x, uint y) { + SDL_WarpMouse(x, y); +} + +void SdlGraphicsManager::iconifyWindow() { + SDL_WM_IconifyWindow(); +} -- cgit v1.2.3 From d97889cea719dd5a5d129ceed7ecc809cd290f51 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 25 Jan 2015 19:23:06 +0100 Subject: SDL: Cleanup graphics manager switching a bit. --- backends/graphics/sdl/sdl-graphics.cpp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'backends/graphics/sdl/sdl-graphics.cpp') diff --git a/backends/graphics/sdl/sdl-graphics.cpp b/backends/graphics/sdl/sdl-graphics.cpp index d42c88f5d6..58253c9509 100644 --- a/backends/graphics/sdl/sdl-graphics.cpp +++ b/backends/graphics/sdl/sdl-graphics.cpp @@ -69,3 +69,36 @@ void SdlGraphicsManager::warpMouseInWindow(uint x, uint y) { void SdlGraphicsManager::iconifyWindow() { SDL_WM_IconifyWindow(); } + +SdlGraphicsManager::State SdlGraphicsManager::getState() { + State state; + + state.screenWidth = getWidth(); + state.screenHeight = getHeight(); + state.aspectRatio = getFeatureState(OSystem::kFeatureAspectRatioCorrection); + state.fullscreen = getFeatureState(OSystem::kFeatureFullscreenMode); + state.cursorPalette = getFeatureState(OSystem::kFeatureCursorPalette); +#ifdef USE_RGB_COLOR + state.pixelFormat = getScreenFormat(); +#endif + + return state; +} + +bool SdlGraphicsManager::setState(const State &state) { + beginGFXTransaction(); +#ifdef USE_RGB_COLOR + initSize(state.screenWidth, state.screenHeight, &state.pixelFormat); +#else + initSize(state.screenWidth, state.screenHeight, 0); +#endif + setFeatureState(OSystem::kFeatureAspectRatioCorrection, state.aspectRatio); + setFeatureState(OSystem::kFeatureFullscreenMode, state.fullscreen); + setFeatureState(OSystem::kFeatureCursorPalette, state.cursorPalette); + + if (endGFXTransaction() != OSystem::kTransactionSuccess) { + return false; + } else { + return true; + } +} -- cgit v1.2.3 From 8530997fff7b5b9d558f7dd6a0d07c236e4de16f Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sun, 25 Jan 2015 01:34:57 +0100 Subject: SDL: Add experimental support for SDL2. This is based upon skristiansson's change set to make ScummVM work with SDL2. --- backends/graphics/sdl/sdl-graphics.cpp | 131 ++++++++++++++++++++++++++++++++- 1 file changed, 130 insertions(+), 1 deletion(-) (limited to 'backends/graphics/sdl/sdl-graphics.cpp') diff --git a/backends/graphics/sdl/sdl-graphics.cpp b/backends/graphics/sdl/sdl-graphics.cpp index 58253c9509..f6d56ece01 100644 --- a/backends/graphics/sdl/sdl-graphics.cpp +++ b/backends/graphics/sdl/sdl-graphics.cpp @@ -27,10 +27,18 @@ #include "common/textconsole.h" SdlGraphicsManager::SdlGraphicsManager(SdlEventSource *source) - : _eventSource(source) { + : _eventSource(source) +#if SDL_VERSION_ATLEAST(2, 0, 0) + , _window(nullptr), _inputGrabState(false), _windowCaption("ScummVM"), _windowIcon(nullptr) +#endif + { } SdlGraphicsManager::~SdlGraphicsManager() { +#if SDL_VERSION_ATLEAST(2, 0, 0) + SDL_FreeSurface(_windowIcon); + destroyWindow(); +#endif } void SdlGraphicsManager::activateManager() { @@ -42,33 +50,111 @@ void SdlGraphicsManager::deactivateManager() { } void SdlGraphicsManager::setWindowCaption(const Common::String &caption) { +#if SDL_VERSION_ATLEAST(2, 0, 0) + _windowCaption = caption; + if (_window) { + SDL_SetWindowTitle(_window, caption.c_str()); + } +#else SDL_WM_SetCaption(caption.c_str(), caption.c_str()); +#endif } void SdlGraphicsManager::setWindowIcon(SDL_Surface *icon) { +#if SDL_VERSION_ATLEAST(2, 0, 0) + SDL_FreeSurface(_windowIcon); + _windowIcon = icon; + if (_window) { + SDL_SetWindowIcon(_window, icon); + } +#else SDL_WM_SetIcon(icon, NULL); SDL_FreeSurface(icon); +#endif } void SdlGraphicsManager::toggleMouseGrab() { +#if SDL_VERSION_ATLEAST(2, 0, 0) + if (_window) { + _inputGrabState = !(SDL_GetWindowGrab(_window) == SDL_TRUE); + SDL_SetWindowGrab(_window, _inputGrabState ? SDL_TRUE : SDL_FALSE); + } +#else if (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_OFF) { SDL_WM_GrabInput(SDL_GRAB_ON); } else { SDL_WM_GrabInput(SDL_GRAB_OFF); } +#endif } bool SdlGraphicsManager::hasMouseFocus() const { +#if SDL_VERSION_ATLEAST(2, 0, 0) + if (_window) { + return (SDL_GetWindowFlags(_window) & SDL_WINDOW_MOUSE_FOCUS); + } else { + return false; + } +#else return (SDL_GetAppState() & SDL_APPMOUSEFOCUS); +#endif } void SdlGraphicsManager::warpMouseInWindow(uint x, uint y) { +#if SDL_VERSION_ATLEAST(2, 0, 0) + if (_window) { + SDL_WarpMouseInWindow(_window, x, y); + } +#else SDL_WarpMouse(x, y); +#endif } void SdlGraphicsManager::iconifyWindow() { +#if SDL_VERSION_ATLEAST(2, 0, 0) + if (_window) { + SDL_MinimizeWindow(_window); + } +#else SDL_WM_IconifyWindow(); +#endif +} + +SdlGraphicsManager::State::State() +#if SDL_VERSION_ATLEAST(2, 0, 0) + : windowIcon(nullptr) +#endif + { +} + +SdlGraphicsManager::State::~State() { +#if SDL_VERSION_ATLEAST(2, 0, 0) + SDL_FreeSurface(windowIcon); +#endif +} + +#if SDL_VERSION_ATLEAST(2, 0, 0) +SDL_Surface *copySDLSurface(SDL_Surface *src) { + const bool locked = SDL_MUSTLOCK(src) == SDL_TRUE; + + if (locked) { + if (SDL_LockSurface(src) != 0) { + return nullptr; + } + } + + SDL_Surface *res = SDL_CreateRGBSurfaceFrom(src->pixels, + src->w, src->h, src->format->BitsPerPixel, + src->pitch, src->format->Rmask, src->format->Gmask, + src->format->Bmask, src->format->Amask); + + if (locked) { + SDL_UnlockSurface(src); + } + + return res; } +#endif SdlGraphicsManager::State SdlGraphicsManager::getState() { State state; @@ -82,10 +168,29 @@ SdlGraphicsManager::State SdlGraphicsManager::getState() { state.pixelFormat = getScreenFormat(); #endif +#if SDL_VERSION_ATLEAST(2, 0, 0) + state.inputGrabState = _inputGrabState; + state.windowCaption = _windowCaption; + state.windowIcon = copySDLSurface(_windowIcon); +#endif + return state; } bool SdlGraphicsManager::setState(const State &state) { +#if SDL_VERSION_ATLEAST(2, 0, 0) + _inputGrabState = state.inputGrabState; + if (!_window) { + _windowCaption = state.windowCaption; + SDL_FreeSurface(_windowIcon); + _windowIcon = copySDLSurface(state.windowIcon); + } else { + SDL_SetWindowGrab(_window, _inputGrabState ? SDL_TRUE : SDL_FALSE); + setWindowCaption(state.windowCaption); + setWindowIcon(copySDLSurface(state.windowIcon)); + } +#endif + beginGFXTransaction(); #ifdef USE_RGB_COLOR initSize(state.screenWidth, state.screenHeight, &state.pixelFormat); @@ -102,3 +207,27 @@ bool SdlGraphicsManager::setState(const State &state) { return true; } } + +#if SDL_VERSION_ATLEAST(2, 0, 0) +bool SdlGraphicsManager::createWindow(int width, int height, uint32 flags) { + destroyWindow(); + + if (_inputGrabState) { + flags |= SDL_WINDOW_INPUT_GRABBED; + } + + _window = SDL_CreateWindow(_windowCaption.c_str(), SDL_WINDOWPOS_UNDEFINED, + SDL_WINDOWPOS_UNDEFINED, width, height, flags); + if (!_window) { + return false; + } + SDL_SetWindowIcon(_window, _windowIcon); + + return true; +} + +void SdlGraphicsManager::destroyWindow() { + SDL_DestroyWindow(_window); + _window = nullptr; +} +#endif -- cgit v1.2.3 From 627d766325e1d435816648f85dbf9c007269b3f2 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Mon, 16 Feb 2015 00:49:42 +0100 Subject: SDL: Add basic abstraction class for the SDL window. --- backends/graphics/sdl/sdl-graphics.cpp | 162 +-------------------------------- 1 file changed, 2 insertions(+), 160 deletions(-) (limited to 'backends/graphics/sdl/sdl-graphics.cpp') diff --git a/backends/graphics/sdl/sdl-graphics.cpp b/backends/graphics/sdl/sdl-graphics.cpp index f6d56ece01..a13ca45477 100644 --- a/backends/graphics/sdl/sdl-graphics.cpp +++ b/backends/graphics/sdl/sdl-graphics.cpp @@ -26,19 +26,11 @@ #include "backends/events/sdl/sdl-events.h" #include "common/textconsole.h" -SdlGraphicsManager::SdlGraphicsManager(SdlEventSource *source) - : _eventSource(source) -#if SDL_VERSION_ATLEAST(2, 0, 0) - , _window(nullptr), _inputGrabState(false), _windowCaption("ScummVM"), _windowIcon(nullptr) -#endif - { +SdlGraphicsManager::SdlGraphicsManager(SdlEventSource *source, SdlWindow *window) + : _eventSource(source), _window(window) { } SdlGraphicsManager::~SdlGraphicsManager() { -#if SDL_VERSION_ATLEAST(2, 0, 0) - SDL_FreeSurface(_windowIcon); - destroyWindow(); -#endif } void SdlGraphicsManager::activateManager() { @@ -49,113 +41,6 @@ void SdlGraphicsManager::deactivateManager() { _eventSource->setGraphicsManager(0); } -void SdlGraphicsManager::setWindowCaption(const Common::String &caption) { -#if SDL_VERSION_ATLEAST(2, 0, 0) - _windowCaption = caption; - if (_window) { - SDL_SetWindowTitle(_window, caption.c_str()); - } -#else - SDL_WM_SetCaption(caption.c_str(), caption.c_str()); -#endif -} - -void SdlGraphicsManager::setWindowIcon(SDL_Surface *icon) { -#if SDL_VERSION_ATLEAST(2, 0, 0) - SDL_FreeSurface(_windowIcon); - _windowIcon = icon; - if (_window) { - SDL_SetWindowIcon(_window, icon); - } -#else - SDL_WM_SetIcon(icon, NULL); - SDL_FreeSurface(icon); -#endif -} - -void SdlGraphicsManager::toggleMouseGrab() { -#if SDL_VERSION_ATLEAST(2, 0, 0) - if (_window) { - _inputGrabState = !(SDL_GetWindowGrab(_window) == SDL_TRUE); - SDL_SetWindowGrab(_window, _inputGrabState ? SDL_TRUE : SDL_FALSE); - } -#else - if (SDL_WM_GrabInput(SDL_GRAB_QUERY) == SDL_GRAB_OFF) { - SDL_WM_GrabInput(SDL_GRAB_ON); - } else { - SDL_WM_GrabInput(SDL_GRAB_OFF); - } -#endif -} - -bool SdlGraphicsManager::hasMouseFocus() const { -#if SDL_VERSION_ATLEAST(2, 0, 0) - if (_window) { - return (SDL_GetWindowFlags(_window) & SDL_WINDOW_MOUSE_FOCUS); - } else { - return false; - } -#else - return (SDL_GetAppState() & SDL_APPMOUSEFOCUS); -#endif -} - -void SdlGraphicsManager::warpMouseInWindow(uint x, uint y) { -#if SDL_VERSION_ATLEAST(2, 0, 0) - if (_window) { - SDL_WarpMouseInWindow(_window, x, y); - } -#else - SDL_WarpMouse(x, y); -#endif -} - -void SdlGraphicsManager::iconifyWindow() { -#if SDL_VERSION_ATLEAST(2, 0, 0) - if (_window) { - SDL_MinimizeWindow(_window); - } -#else - SDL_WM_IconifyWindow(); -#endif -} - -SdlGraphicsManager::State::State() -#if SDL_VERSION_ATLEAST(2, 0, 0) - : windowIcon(nullptr) -#endif - { -} - -SdlGraphicsManager::State::~State() { -#if SDL_VERSION_ATLEAST(2, 0, 0) - SDL_FreeSurface(windowIcon); -#endif -} - -#if SDL_VERSION_ATLEAST(2, 0, 0) -SDL_Surface *copySDLSurface(SDL_Surface *src) { - const bool locked = SDL_MUSTLOCK(src) == SDL_TRUE; - - if (locked) { - if (SDL_LockSurface(src) != 0) { - return nullptr; - } - } - - SDL_Surface *res = SDL_CreateRGBSurfaceFrom(src->pixels, - src->w, src->h, src->format->BitsPerPixel, - src->pitch, src->format->Rmask, src->format->Gmask, - src->format->Bmask, src->format->Amask); - - if (locked) { - SDL_UnlockSurface(src); - } - - return res; -} -#endif - SdlGraphicsManager::State SdlGraphicsManager::getState() { State state; @@ -167,30 +52,10 @@ SdlGraphicsManager::State SdlGraphicsManager::getState() { #ifdef USE_RGB_COLOR state.pixelFormat = getScreenFormat(); #endif - -#if SDL_VERSION_ATLEAST(2, 0, 0) - state.inputGrabState = _inputGrabState; - state.windowCaption = _windowCaption; - state.windowIcon = copySDLSurface(_windowIcon); -#endif - return state; } bool SdlGraphicsManager::setState(const State &state) { -#if SDL_VERSION_ATLEAST(2, 0, 0) - _inputGrabState = state.inputGrabState; - if (!_window) { - _windowCaption = state.windowCaption; - SDL_FreeSurface(_windowIcon); - _windowIcon = copySDLSurface(state.windowIcon); - } else { - SDL_SetWindowGrab(_window, _inputGrabState ? SDL_TRUE : SDL_FALSE); - setWindowCaption(state.windowCaption); - setWindowIcon(copySDLSurface(state.windowIcon)); - } -#endif - beginGFXTransaction(); #ifdef USE_RGB_COLOR initSize(state.screenWidth, state.screenHeight, &state.pixelFormat); @@ -208,26 +73,3 @@ bool SdlGraphicsManager::setState(const State &state) { } } -#if SDL_VERSION_ATLEAST(2, 0, 0) -bool SdlGraphicsManager::createWindow(int width, int height, uint32 flags) { - destroyWindow(); - - if (_inputGrabState) { - flags |= SDL_WINDOW_INPUT_GRABBED; - } - - _window = SDL_CreateWindow(_windowCaption.c_str(), SDL_WINDOWPOS_UNDEFINED, - SDL_WINDOWPOS_UNDEFINED, width, height, flags); - if (!_window) { - return false; - } - SDL_SetWindowIcon(_window, _windowIcon); - - return true; -} - -void SdlGraphicsManager::destroyWindow() { - SDL_DestroyWindow(_window); - _window = nullptr; -} -#endif -- cgit v1.2.3