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:
parent
9fe4456e2c
commit
42a3027d7c
@ -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,58 +44,70 @@ 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)
|
||||||
|
{
|
||||||
|
// Retrieve the default screen number
|
||||||
|
int screen = DefaultScreen(disp);
|
||||||
|
|
||||||
// Check if the XRandR extension is present
|
// Check if the XRandR extension is present
|
||||||
int version;
|
int version;
|
||||||
if (XQueryExtension(disp.GetDisplay(), "RANDR", &version, &version, &version))
|
if (XQueryExtension(disp, "RANDR", &version, &version, &version))
|
||||||
{
|
|
||||||
// Get the current configuration
|
|
||||||
XRRScreenConfiguration* config = XRRGetScreenInfo(disp.GetDisplay(), RootWindow(disp.GetDisplay(), screen));
|
|
||||||
if (config)
|
|
||||||
{
|
{
|
||||||
// Get the available screen sizes
|
// Get the current configuration
|
||||||
int nbSizes;
|
XRRScreenConfiguration* config = XRRGetScreenInfo(disp, RootWindow(disp, screen));
|
||||||
XRRScreenSize* sizes = XRRConfigSizes(config, &nbSizes);
|
if (config)
|
||||||
if (sizes && (nbSizes > 0))
|
|
||||||
{
|
{
|
||||||
// Get the list of supported depths
|
// Get the available screen sizes
|
||||||
int nbDepths = 0;
|
int nbSizes;
|
||||||
int* depths = XListDepths(disp.GetDisplay(), screen, &nbDepths);
|
XRRScreenSize* sizes = XRRConfigSizes(config, &nbSizes);
|
||||||
if (depths && (nbDepths > 0))
|
if (sizes && (nbSizes > 0))
|
||||||
{
|
{
|
||||||
// Combine depths and sizes to fill the array of supported modes
|
// Get the list of supported depths
|
||||||
for (int i = 0; i < nbDepths; ++i)
|
int nbDepths = 0;
|
||||||
|
int* depths = XListDepths(disp, screen, &nbDepths);
|
||||||
|
if (depths && (nbDepths > 0))
|
||||||
{
|
{
|
||||||
for (int j = 0; j < nbSizes; ++j)
|
// Combine depths and sizes to fill the array of supported modes
|
||||||
|
for (int i = 0; i < nbDepths; ++i)
|
||||||
{
|
{
|
||||||
// Convert to VideoMode
|
for (int j = 0; j < nbSizes; ++j)
|
||||||
VideoMode mode(sizes[j].width, sizes[j].height, depths[i]);
|
{
|
||||||
|
// Convert to VideoMode
|
||||||
// Add it only if it is not already in the array
|
VideoMode mode(sizes[j].width, sizes[j].height, depths[i]);
|
||||||
if (std::find(modes.begin(), modes.end(), mode) == modes.end())
|
|
||||||
modes.push_back(mode);
|
// 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;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
// Close the connection with the X server
|
||||||
{
|
XCloseDisplay(disp);
|
||||||
// XRandr extension is not supported : we cannot get the video modes
|
}
|
||||||
std::cerr << "Failed to get the list of available video modes" << std::endl;
|
else
|
||||||
}
|
{
|
||||||
|
// We couldn't connect to the X server
|
||||||
|
std::cerr << "Failed to connect to the X server while trying to get the supported video modes" << std::endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -107,33 +118,55 @@ 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)
|
||||||
|
{
|
||||||
|
// Retrieve the default screen number
|
||||||
|
int screen = DefaultScreen(disp);
|
||||||
|
|
||||||
// Check if the XRandR extension is present
|
// Check if the XRandR extension is present
|
||||||
int version;
|
int version;
|
||||||
if (XQueryExtension(disp.GetDisplay(), "RANDR", &version, &version, &version))
|
if (XQueryExtension(disp, "RANDR", &version, &version, &version))
|
||||||
{
|
|
||||||
// Get the current configuration
|
|
||||||
XRRScreenConfiguration* config = XRRGetScreenInfo(disp.GetDisplay(), RootWindow(disp.GetDisplay(), screen));
|
|
||||||
if (config)
|
|
||||||
{
|
{
|
||||||
// Get the current video mode
|
// Get the current configuration
|
||||||
Rotation currentRotation;
|
XRRScreenConfiguration* config = XRRGetScreenInfo(disp, RootWindow(disp, screen));
|
||||||
int currentMode = XRRConfigCurrentConfiguration(config, ¤tRotation);
|
if (config)
|
||||||
|
{
|
||||||
|
// Get the current video mode
|
||||||
|
Rotation currentRotation;
|
||||||
|
int currentMode = XRRConfigCurrentConfiguration(config, ¤tRotation);
|
||||||
|
|
||||||
// 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user