diff --git a/src/framework/WindowManager.cpp b/src/framework/WindowManager.cpp index a897d1ff6d8d2e370894ad2c86f73e44ef403658..225afd0e3059196adf2614e4285a831c6b7b360e 100644 --- a/src/framework/WindowManager.cpp +++ b/src/framework/WindowManager.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2008 by Oliver Bock * + * Copyright (C) 2008-2020 by Oliver Bock * * oliver.bock[AT]aei.mpg.de * * * * This file is part of Einstein@Home. * @@ -73,11 +73,12 @@ bool WindowManager::initialize(const int width, const int height, const int fram */ // set common video flags - // (for OpenGL nothing more than SDL_WINDOW_OPENGL and SDL_WINDOW_FULLSCREEN should be used) - m_VideoModeFlags = SDL_WINDOW_OPENGL; + m_VideoModeFlags = SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE; + // enable HDPI (retina) support + // m_VideoModeFlags |= SDL_WINDOW_ALLOW_HIGHDPI; - // // check fullscreen video mode - // m_FullscreenModeAvailable = true; + // check fullscreen video mode + m_FullscreenModeAvailable = true; // Uint32 bitPerPixel = SDL_VideoModeOK( // m_DesktopWidth, // m_DesktopHeight, @@ -89,8 +90,8 @@ bool WindowManager::initialize(const int width, const int height, const int fram // m_FullscreenModeAvailable = false; // } // - // // check initial windowed video mode - // m_WindowedModeAvailable = true; + // check initial windowed video mode + m_WindowedModeAvailable = true; // bitPerPixel = SDL_VideoModeOK( // m_WindowedWidth, // m_WindowedHeight, @@ -133,7 +134,6 @@ bool WindowManager::initialize(const int width, const int height, const int fram // we always start in windowed mode (starting in fullscreen fails with high CPU load!) m_CurrentWidth = m_WindowedWidth; m_CurrentHeight = m_WindowedHeight; - m_VideoModeFlags |= SDL_WINDOW_RESIZABLE; // finally, get window m_Window = SDL_CreateWindow( @@ -204,7 +204,7 @@ void WindowManager::eventLoop() //SDL_EventState(SDL_KEYDOWN, SDL_IGNORE); //SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE); //SDL_EventState(SDL_MOUSEBUTTONDOWN, SDL_IGNORE); - //SDL_EventState(SDL_VIDEORESIZE, SDL_IGNORE); + //SDL_EventState(SDL_WINDOWEVENT_SIZE_CHANGED, SDL_IGNORE); //SDL_EventState(SDL_USEREVENT, SDL_IGNORE); // events we ignore @@ -251,6 +251,8 @@ void WindowManager::eventLoop() event.type == SDL_KEYDOWN)) { // we're in screensaver mode so exit on user input + SDL_GL_DeleteContext(m_GLContext); + SDL_DestroyWindow(m_Window); SDL_Quit(); } else if (event.motion.state & (SDL_BUTTON(1) | SDL_BUTTON(3)) && @@ -275,17 +277,6 @@ void WindowManager::eventLoop() m_CurrentWidth = m_WindowedWidth = event.window.data1; m_CurrentHeight = m_WindowedHeight = event.window.data2; - // update video mode - // FIXME: reuse old title/position - SDL_DestroyWindow(m_Window); - m_Window = SDL_CreateWindow( - "Einstein@Home", - SDL_WINDOWPOS_UNDEFINED, - SDL_WINDOWPOS_UNDEFINED, - m_CurrentWidth, - m_CurrentHeight, - m_VideoModeFlags); - // notify our observers (currently exactly one, hence front()) // (windoze needs to be reinitialized instead of just resized, oh well) /// \todo Can we determine the host OS? On X11 a resize() is sufficient! @@ -440,51 +431,27 @@ void WindowManager::setWindowIcon(const unsigned char *data, const int size) con void WindowManager::toggleFullscreen() { - // toggle fullscreen bit and reset video mode if(m_WindowedModeAvailable && (m_VideoModeFlags & SDL_WINDOW_FULLSCREEN)) { - // set new dimensions - m_CurrentWidth = m_WindowedWidth; - m_CurrentHeight = m_WindowedHeight; + // restore windowed mode + SDL_SetWindowFullscreen(m_Window, 0); - // (un)set video mode flags - m_VideoModeFlags &= ~SDL_WINDOW_FULLSCREEN; - m_VideoModeFlags |= SDL_WINDOW_RESIZABLE; - - // show cursor in fullscreen mode + // show cursor SDL_ShowCursor(SDL_ENABLE); + + // store state + m_VideoModeFlags &= ~SDL_WINDOW_FULLSCREEN; } else if(m_FullscreenModeAvailable && !(m_VideoModeFlags & SDL_WINDOW_FULLSCREEN)) { - // set new dimensions - m_CurrentWidth = m_DesktopWidth; - m_CurrentHeight = m_DesktopHeight; - - // (un)set video mode flags -#ifdef __APPLE__ - if (m_ScreensaverMode) { - m_CurrentWidth = m_DesktopWidth; - m_CurrentHeight = m_DesktopHeight; - m_VideoModeFlags |= SDL_WINDOW_BORDERLESS; - } else -#endif - { - m_VideoModeFlags |= SDL_WINDOW_FULLSCREEN; - } - m_VideoModeFlags &= ~SDL_WINDOW_RESIZABLE; + // enable fullscreen mode + // (not using real SDL_WINDOW_FULLSCREEN which triggers a SDL_MOUSEMOTION event) + SDL_SetWindowFullscreen(m_Window, SDL_WINDOW_FULLSCREEN_DESKTOP); // hide cursor SDL_ShowCursor(SDL_DISABLE); - } - // reset video mode - // FIXME: reuse old title/position - SDL_DestroyWindow(m_Window); - m_Window = SDL_CreateWindow( - "Einstein@Home", - SDL_WINDOWPOS_UNDEFINED, - SDL_WINDOWPOS_UNDEFINED, - m_CurrentWidth, - m_CurrentHeight, - m_VideoModeFlags); + // store state + m_VideoModeFlags |= SDL_WINDOW_FULLSCREEN; + } // notify our observers (currently exactly one, hence front()) // (windoze needs to be reinitialized instead of just resized, oh well)