The internal code of VideoMode now uses its own connection to the display instead of a global one (on Linux)

git-svn-id: https://sfml.svn.sourceforge.net/svnroot/sfml/branches/sfml2@1190 4e206d99-4929-0410-ac5d-dfc041789085
This commit is contained in:
laurentgom 2009-07-24 12:56:04 +00:00
parent 9fe4456e2c
commit 42a3027d7c

View File

@ -26,7 +26,6 @@
// Headers // Headers
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
#include <SFML/Window/Linux/VideoModeSupport.hpp> #include <SFML/Window/Linux/VideoModeSupport.hpp>
#include <SFML/Window/Linux/DisplayRef.hpp>
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include <X11/extensions/Xrandr.h> #include <X11/extensions/Xrandr.h>
#include <algorithm> #include <algorithm>
@ -45,57 +44,69 @@ void VideoModeSupport::GetSupportedVideoModes(std::vector<VideoMode>& modes)
// First, clear array to fill // First, clear array to fill
modes.clear(); modes.clear();
// Get an access to the display // Open a connection with the X server
DisplayRef disp; Display* disp = XOpenDisplay(NULL);
int screen = DefaultScreen(disp.GetDisplay()); if (disp)
// Check if the XRandR extension is present
int version;
if (XQueryExtension(disp.GetDisplay(), "RANDR", &version, &version, &version))
{ {
// Get the current configuration // Retrieve the default screen number
XRRScreenConfiguration* config = XRRGetScreenInfo(disp.GetDisplay(), RootWindow(disp.GetDisplay(), screen)); int screen = DefaultScreen(disp);
if (config)
{
// Get the available screen sizes
int nbSizes;
XRRScreenSize* sizes = XRRConfigSizes(config, &nbSizes);
if (sizes && (nbSizes > 0))
{
// Get the list of supported depths
int nbDepths = 0;
int* depths = XListDepths(disp.GetDisplay(), screen, &nbDepths);
if (depths && (nbDepths > 0))
{
// Combine depths and sizes to fill the array of supported modes
for (int i = 0; i < nbDepths; ++i)
{
for (int j = 0; j < nbSizes; ++j)
{
// Convert to VideoMode
VideoMode mode(sizes[j].width, sizes[j].height, depths[i]);
// Add it only if it is not already in the array // Check if the XRandR extension is present
if (std::find(modes.begin(), modes.end(), mode) == modes.end()) int version;
modes.push_back(mode); if (XQueryExtension(disp, "RANDR", &version, &version, &version))
{
// Get the current configuration
XRRScreenConfiguration* config = XRRGetScreenInfo(disp, RootWindow(disp, screen));
if (config)
{
// Get the available screen sizes
int nbSizes;
XRRScreenSize* sizes = XRRConfigSizes(config, &nbSizes);
if (sizes && (nbSizes > 0))
{
// Get the list of supported depths
int nbDepths = 0;
int* depths = XListDepths(disp, screen, &nbDepths);
if (depths && (nbDepths > 0))
{
// Combine depths and sizes to fill the array of supported modes
for (int i = 0; i < nbDepths; ++i)
{
for (int j = 0; j < nbSizes; ++j)
{
// Convert to VideoMode
VideoMode mode(sizes[j].width, sizes[j].height, depths[i]);
// 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);
}
} }
} }
} }
}
// Free the configuration instance // Free the configuration instance
XRRFreeScreenConfigInfo(config); XRRFreeScreenConfigInfo(config);
}
else
{
// Failed to get the screen configuration
std::cerr << "Failed to retrieve the screen configuration while trying to get the supported video modes" << std::endl;
}
} }
else else
{ {
// Failed to get the screen configuration // XRandr extension is not supported : we cannot get the video modes
std::cerr << "Failed to get the list of available video modes" << std::endl; std::cerr << "Failed to use the XRandR extension while trying to get the supported video modes" << std::endl;
} }
// Close the connection with the X server
XCloseDisplay(disp);
} }
else else
{ {
// XRandr extension is not supported : we cannot get the video modes // We couldn't connect to the X server
std::cerr << "Failed to get the list of available video modes" << std::endl; std::cerr << "Failed to connect to the X server while trying to get the supported video modes" << std::endl;
} }
} }
@ -107,31 +118,53 @@ VideoMode VideoModeSupport::GetDesktopVideoMode()
{ {
VideoMode desktopMode; VideoMode desktopMode;
// Get an access to the display // Open a connection with the X server
DisplayRef disp; Display* disp = XOpenDisplay(NULL);
int screen = DefaultScreen(disp.GetDisplay()); if (disp)
// Check if the XRandR extension is present
int version;
if (XQueryExtension(disp.GetDisplay(), "RANDR", &version, &version, &version))
{ {
// Get the current configuration // Retrieve the default screen number
XRRScreenConfiguration* config = XRRGetScreenInfo(disp.GetDisplay(), RootWindow(disp.GetDisplay(), screen)); int screen = DefaultScreen(disp);
if (config)
// Check if the XRandR extension is present
int version;
if (XQueryExtension(disp, "RANDR", &version, &version, &version))
{ {
// Get the current video mode // Get the current configuration
Rotation currentRotation; XRRScreenConfiguration* config = XRRGetScreenInfo(disp, RootWindow(disp, screen));
int currentMode = XRRConfigCurrentConfiguration(config, &currentRotation); if (config)
{
// Get the current video mode
Rotation currentRotation;
int currentMode = XRRConfigCurrentConfiguration(config, &currentRotation);
// Get the available screen sizes // Get the available screen sizes
int nbSizes; int nbSizes;
XRRScreenSize* sizes = XRRConfigSizes(config, &nbSizes); XRRScreenSize* sizes = XRRConfigSizes(config, &nbSizes);
if (sizes && (nbSizes > 0)) if (sizes && (nbSizes > 0))
desktopMode = VideoMode(sizes[currentMode].width, sizes[currentMode].height, DefaultDepth(disp.GetDisplay(), screen)); desktopMode = VideoMode(sizes[currentMode].width, sizes[currentMode].height, DefaultDepth(disp, screen));
// Free the configuration instance // Free the configuration instance
XRRFreeScreenConfigInfo(config); XRRFreeScreenConfigInfo(config);
}
else
{
// Failed to get the screen configuration
std::cerr << "Failed to retrieve the screen configuration while trying to get the desktop video modes" << std::endl;
}
} }
else
{
// XRandr extension is not supported : we cannot get the video modes
std::cerr << "Failed to use the XRandR extension while trying to get the desktop video modes" << std::endl;
}
// Close the connection with the X server
XCloseDisplay(disp);
}
else
{
// We couldn't connect to the X server
std::cerr << "Failed to connect to the X server while trying to get the desktop video modes" << std::endl;
} }
return desktopMode; return desktopMode;