From 5aaf9a611535dc408e4301ed82256685fde66878 Mon Sep 17 00:00:00 2001 From: binary1248 Date: Fri, 27 Mar 2015 18:31:41 +0100 Subject: [PATCH] Fixed RandR not resetting the original screen configuration in some situations. --- src/SFML/Window/Unix/WindowImplX11.cpp | 51 +++++++++++--------------- src/SFML/Window/Unix/WindowImplX11.hpp | 35 +++++++++--------- 2 files changed, 39 insertions(+), 47 deletions(-) diff --git a/src/SFML/Window/Unix/WindowImplX11.cpp b/src/SFML/Window/Unix/WindowImplX11.cpp index 1e176221..b05e88dd 100644 --- a/src/SFML/Window/Unix/WindowImplX11.cpp +++ b/src/SFML/Window/Unix/WindowImplX11.cpp @@ -311,7 +311,6 @@ m_inputContext (NULL), m_isExternal (true), m_atomWmProtocols(0), m_atomClose (0), -m_oldVideoMode (-1), m_hiddenCursor (0), m_keyRepeat (true), m_previousSize (-1, -1), @@ -322,6 +321,8 @@ m_fullscreen (false) m_display = OpenDisplay(); m_connection = XGetXCBConnection(m_display); + std::memset(&m_oldVideoMode, 0, sizeof(m_oldVideoMode)); + if (!m_connection) { err() << "Failed cast Display object to an XCB connection object" << std::endl; @@ -381,7 +382,6 @@ m_inputContext (NULL), m_isExternal (false), m_atomWmProtocols(0), m_atomClose (0), -m_oldVideoMode (-1), m_hiddenCursor (0), m_keyRepeat (true), m_previousSize (-1, -1), @@ -392,6 +392,8 @@ m_fullscreen ((style & Style::Fullscreen) != 0) m_display = OpenDisplay(); m_connection = XGetXCBConnection(m_display); + std::memset(&m_oldVideoMode, 0, sizeof(m_oldVideoMode)); + if (!m_connection) { err() << "Failed cast Display object to an XCB connection object" << std::endl; @@ -1252,7 +1254,7 @@ void WindowImplX11::setVideoMode(const VideoMode& mode) &error )); - if (error) + if (error || !config) { // Failed to get the screen configuration err() << "Failed to get the current screen configuration for fullscreen mode, switching to window mode" << std::endl; @@ -1260,7 +1262,7 @@ void WindowImplX11::setVideoMode(const VideoMode& mode) } // Save the current video mode before we switch to fullscreen - m_oldVideoMode = config->sizeID; + m_oldVideoMode = *config.get(); // Get the available screen sizes xcb_randr_screen_size_t* sizes = xcb_randr_get_screen_info_sizes(config.get()); @@ -1286,12 +1288,12 @@ void WindowImplX11::setVideoMode(const VideoMode& mode) m_connection, xcb_randr_set_screen_config( m_connection, - m_screen->root, + config->root, XCB_CURRENT_TIME, config->config_timestamp, i, config->rotation, - 0//config->rate + config->rate ), &error )); @@ -1316,35 +1318,24 @@ void WindowImplX11::resetVideoMode() { // Get current screen info ScopedXcbPtr error(NULL); - ScopedXcbPtr config(xcb_randr_get_screen_info_reply( + + // Reset the video mode + ScopedXcbPtr setScreenConfig(xcb_randr_set_screen_config_reply( m_connection, - xcb_randr_get_screen_info( - m_connection, - m_screen->root + xcb_randr_set_screen_config( + m_connection, + m_oldVideoMode.root, + XCB_CURRENT_TIME, + m_oldVideoMode.config_timestamp, + m_oldVideoMode.sizeID, + m_oldVideoMode.rotation, + m_oldVideoMode.rate ), &error )); - if (!error) - { - // Reset the video mode - ScopedXcbPtr setScreenConfig(xcb_randr_set_screen_config_reply( - m_connection, - xcb_randr_set_screen_config( - m_connection, - m_screen->root, - CurrentTime, - config->config_timestamp, - m_oldVideoMode, - config->rotation, - config->rate - ), - &error - )); - - if (error) - err() << "Failed to reset old screen configuration" << std::endl; - } + if (error) + err() << "Failed to reset old screen configuration" << std::endl; // Reset the fullscreen window fullscreenWindow = NULL; diff --git a/src/SFML/Window/Unix/WindowImplX11.hpp b/src/SFML/Window/Unix/WindowImplX11.hpp index b3918072..5bd596dd 100644 --- a/src/SFML/Window/Unix/WindowImplX11.hpp +++ b/src/SFML/Window/Unix/WindowImplX11.hpp @@ -33,6 +33,7 @@ #include #include #include +#include #include @@ -270,23 +271,23 @@ private: //////////////////////////////////////////////////////////// // Member data //////////////////////////////////////////////////////////// - xcb_window_t m_window; ///< xcb identifier defining our window - ::Display* m_display; ///< Pointer to the display - xcb_connection_t* m_connection; ///< Pointer to the xcb connection - xcb_ewmh_connection_t m_ewmhConnection; ///< xcb EWMH connection - xcb_screen_t* m_screen; ///< Screen identifier - XIM m_inputMethod; ///< Input method linked to the X display - XIC m_inputContext; ///< Input context used to get unicode input in our window - std::deque m_xcbEvents; ///< Events that were received in another window's loop - bool m_isExternal; ///< Tell whether the window has been created externally or by SFML - Atom m_atomWmProtocols; ///< Atom used to identify WM protocol messages - Atom m_atomClose; ///< Atom used to identify the close event - int m_oldVideoMode; ///< Video mode in use before we switch to fullscreen - Cursor m_hiddenCursor; ///< As X11 doesn't provide cursor hidding, we must create a transparent one - bool m_keyRepeat; ///< Is the KeyRepeat feature enabled? - Vector2i m_previousSize; ///< Previous size of the window, to find if a ConfigureNotify event is a resize event (could be a move event only) - bool m_useSizeHints; ///< Is the size of the window fixed with size hints? - bool m_fullscreen; ///< Is window in fullscreen? + xcb_window_t m_window; ///< xcb identifier defining our window + ::Display* m_display; ///< Pointer to the display + xcb_connection_t* m_connection; ///< Pointer to the xcb connection + xcb_ewmh_connection_t m_ewmhConnection; ///< xcb EWMH connection + xcb_screen_t* m_screen; ///< Screen identifier + XIM m_inputMethod; ///< Input method linked to the X display + XIC m_inputContext; ///< Input context used to get unicode input in our window + std::deque m_xcbEvents; ///< Events that were received in another window's loop + bool m_isExternal; ///< Tell whether the window has been created externally or by SFML + Atom m_atomWmProtocols; ///< Atom used to identify WM protocol messages + Atom m_atomClose; ///< Atom used to identify the close event + xcb_randr_get_screen_info_reply_t m_oldVideoMode; ///< Video mode in use before we switch to fullscreen + Cursor m_hiddenCursor; ///< As X11 doesn't provide cursor hidding, we must create a transparent one + bool m_keyRepeat; ///< Is the KeyRepeat feature enabled? + Vector2i m_previousSize; ///< Previous size of the window, to find if a ConfigureNotify event is a resize event (could be a move event only) + bool m_useSizeHints; ///< Is the size of the window fixed with size hints? + bool m_fullscreen; ///< Is window in fullscreen? }; } // namespace priv