Created
September 17, 2015 18:16
-
-
Save Foaly/98ea264bd400d3f17597 to your computer and use it in GitHub Desktop.
Started Linux implementation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/SFML/Window/CMakeLists.txt b/src/SFML/Window/CMakeLists.txt | |
index 3fc7586..a43350b 100644 | |
--- a/src/SFML/Window/CMakeLists.txt | |
+++ b/src/SFML/Window/CMakeLists.txt | |
@@ -81,9 +81,9 @@ elseif(SFML_OS_LINUX OR SFML_OS_FREEBSD) | |
${SRCROOT}/Unix/InputImpl.hpp | |
${SRCROOT}/Unix/ScopedXcbPtr.hpp | |
${SRCROOT}/Unix/ScopedXcbPtr.inl | |
+ ${SRCROOT}/Unix/ScreenImpl.cpp | |
${SRCROOT}/Unix/SensorImpl.cpp | |
${SRCROOT}/Unix/SensorImpl.hpp | |
- ${SRCROOT}/Unix/VideoModeImpl.cpp | |
${SRCROOT}/Unix/WindowImplX11.cpp | |
${SRCROOT}/Unix/WindowImplX11.hpp | |
) | |
diff --git a/src/SFML/Window/Unix/VideoModeImpl.cpp b/src/SFML/Window/Unix/VideoModeImpl.cpp | |
deleted file mode 100644 | |
index 9ee812f..0000000 | |
--- a/src/SFML/Window/Unix/VideoModeImpl.cpp | |
+++ /dev/null | |
@@ -1,236 +0,0 @@ | |
-//////////////////////////////////////////////////////////// | |
-// | |
-// SFML - Simple and Fast Multimedia Library | |
-// Copyright (C) 2007-2015 Laurent Gomila (laurent@sfml-dev.org) | |
-// | |
-// This software is provided 'as-is', without any express or implied warranty. | |
-// In no event will the authors be held liable for any damages arising from the use of this software. | |
-// | |
-// Permission is granted to anyone to use this software for any purpose, | |
-// including commercial applications, and to alter it and redistribute it freely, | |
-// subject to the following restrictions: | |
-// | |
-// 1. The origin of this software must not be misrepresented; | |
-// you must not claim that you wrote the original software. | |
-// If you use this software in a product, an acknowledgment | |
-// in the product documentation would be appreciated but is not required. | |
-// | |
-// 2. Altered source versions must be plainly marked as such, | |
-// and must not be misrepresented as being the original software. | |
-// | |
-// 3. This notice may not be removed or altered from any source distribution. | |
-// | |
-//////////////////////////////////////////////////////////// | |
- | |
-//////////////////////////////////////////////////////////// | |
-// Headers | |
-//////////////////////////////////////////////////////////// | |
-#include <SFML/Window/VideoModeImpl.hpp> | |
-#include <SFML/Window/Unix/Display.hpp> | |
-#include <SFML/Window/Unix/ScopedXcbPtr.hpp> | |
-#include <SFML/System/Err.hpp> | |
-#include <xcb/randr.h> | |
-#include <algorithm> | |
- | |
- | |
-namespace sf | |
-{ | |
-namespace priv | |
-{ | |
-//////////////////////////////////////////////////////////// | |
-std::vector<VideoMode> VideoModeImpl::getFullscreenModes() | |
-{ | |
- std::vector<VideoMode> modes; | |
- | |
- // Open a connection with the X server | |
- xcb_connection_t* connection = OpenConnection(); | |
- | |
- // Retrieve the default screen | |
- xcb_screen_t* screen = XCBDefaultScreen(connection); | |
- | |
- ScopedXcbPtr<xcb_generic_error_t> error(NULL); | |
- | |
- const xcb_query_extension_reply_t* randrExt = xcb_get_extension_data(connection, &xcb_randr_id); | |
- | |
- if (!randrExt || !randrExt->present) | |
- { | |
- // Randr extension is not supported: we cannot get the video modes | |
- err() << "Failed to use the RandR extension while trying to get the supported video modes" << std::endl; | |
- | |
- // Close the connection with the X server | |
- CloseConnection(connection); | |
- | |
- return modes; | |
- } | |
- | |
- // Load RandR and check its version | |
- ScopedXcbPtr<xcb_randr_query_version_reply_t> randrVersion(xcb_randr_query_version_reply( | |
- connection, | |
- xcb_randr_query_version( | |
- connection, | |
- 1, | |
- 1 | |
- ), | |
- &error | |
- )); | |
- | |
- if (error) | |
- { | |
- err() << "Failed to load the RandR extension while trying to get the supported video modes" << std::endl; | |
- | |
- // Close the connection with the X server | |
- CloseConnection(connection); | |
- | |
- return modes; | |
- } | |
- | |
- // Get the current configuration | |
- ScopedXcbPtr<xcb_randr_get_screen_info_reply_t> config(xcb_randr_get_screen_info_reply( | |
- connection, | |
- xcb_randr_get_screen_info( | |
- connection, | |
- screen->root | |
- ), | |
- &error | |
- )); | |
- | |
- if (error) | |
- { | |
- // Failed to get the screen configuration | |
- err() << "Failed to retrieve the screen configuration while trying to get the supported video modes" << std::endl; | |
- | |
- // Close the connection with the X server | |
- CloseConnection(connection); | |
- | |
- return modes; | |
- } | |
- | |
- // Get the available screen sizes | |
- xcb_randr_screen_size_t* sizes = xcb_randr_get_screen_info_sizes(config.get()); | |
- if (sizes && (config->nSizes > 0)) | |
- { | |
- // Get the list of supported depths | |
- xcb_depth_iterator_t iter = xcb_screen_allowed_depths_iterator(screen); | |
- // Combine depths and sizes to fill the array of supported modes | |
- for (; iter.rem; xcb_depth_next(&iter)) | |
- { | |
- for (int j = 0; j < config->nSizes; ++j) | |
- { | |
- // Convert to VideoMode | |
- VideoMode mode(sizes[j].width, sizes[j].height, iter.data->depth); | |
- | |
- if (config->rotation == XCB_RANDR_ROTATION_ROTATE_90 || | |
- config->rotation == XCB_RANDR_ROTATION_ROTATE_270) | |
- std::swap(mode.width, mode.height); | |
- | |
- // Add it only if it is not already in the array | |
- if (std::find(modes.begin(), modes.end(), mode) == modes.end()) | |
- modes.push_back(mode); | |
- } | |
- } | |
- } | |
- | |
- // Close the connection with the X server | |
- CloseConnection(connection); | |
- | |
- return modes; | |
-} | |
- | |
- | |
-//////////////////////////////////////////////////////////// | |
-VideoMode VideoModeImpl::getDesktopMode() | |
-{ | |
- VideoMode desktopMode; | |
- | |
- // Open a connection with the X server | |
- xcb_connection_t* connection = OpenConnection(); | |
- | |
- // Retrieve the default screen | |
- xcb_screen_t* screen = XCBDefaultScreen(connection); | |
- | |
- ScopedXcbPtr<xcb_generic_error_t> error(NULL); | |
- | |
- // Check if the RandR extension is present | |
- const xcb_query_extension_reply_t* randrExt = xcb_get_extension_data(connection, &xcb_randr_id); | |
- | |
- if (!randrExt || !randrExt->present) | |
- { | |
- // Randr extension is not supported: we cannot get the video modes | |
- err() << "Failed to use the RandR extension while trying to get the desktop video mode" << std::endl; | |
- | |
- // Close the connection with the X server | |
- CloseConnection(connection); | |
- | |
- return desktopMode; | |
- } | |
- | |
- // Load RandR and check its version | |
- ScopedXcbPtr<xcb_randr_query_version_reply_t> randrVersion(xcb_randr_query_version_reply( | |
- connection, | |
- xcb_randr_query_version( | |
- connection, | |
- 1, | |
- 1 | |
- ), | |
- &error | |
- )); | |
- | |
- if (error) | |
- { | |
- err() << "Failed to load the RandR extension while trying to get the desktop video mode" << std::endl; | |
- | |
- // Close the connection with the X server | |
- CloseConnection(connection); | |
- | |
- return desktopMode; | |
- } | |
- | |
- // Get the current configuration | |
- ScopedXcbPtr<xcb_randr_get_screen_info_reply_t> config(xcb_randr_get_screen_info_reply( | |
- connection, | |
- xcb_randr_get_screen_info( | |
- connection, | |
- screen->root | |
- ), | |
- &error | |
- )); | |
- | |
- if (error) | |
- { | |
- // Failed to get the screen configuration | |
- err() << "Failed to retrieve the screen configuration while trying to get the desktop video mode" << std::endl; | |
- | |
- // Close the connection with the X server | |
- CloseConnection(connection); | |
- | |
- return desktopMode; | |
- } | |
- | |
- // Get the current video mode | |
- xcb_randr_mode_t currentMode = config->sizeID; | |
- | |
- // Get the available screen sizes | |
- int nbSizes = xcb_randr_get_screen_info_sizes_length(config.get()); | |
- xcb_randr_screen_size_t* sizes = xcb_randr_get_screen_info_sizes(config.get()); | |
- if (sizes && (nbSizes > 0)) | |
- { | |
- desktopMode = VideoMode(sizes[currentMode].width, sizes[currentMode].height, screen->root_depth); | |
- | |
- if (config->rotation == XCB_RANDR_ROTATION_ROTATE_90 || | |
- config->rotation == XCB_RANDR_ROTATION_ROTATE_270) | |
- std::swap(desktopMode.width, desktopMode.height); | |
- } | |
- else | |
- { | |
- err() << "Failed to retrieve any screen sizes while trying to get the desktop video mode" << std::endl; | |
- } | |
- | |
- // Close the connection with the X server | |
- CloseConnection(connection); | |
- | |
- return desktopMode; | |
-} | |
- | |
-} // namespace priv | |
- | |
-} // namespace sf |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment