]> git.tdb.fi Git - libs/gui.git/blobdiff - source/graphics/x11/display.cpp
Extend the video mode API to support multiple monitors
[libs/gui.git] / source / graphics / x11 / display.cpp
index 0e89794f458205fc74a82dde078c027bf1aaef4a..6fee30b26ff6873d88b1f69e1b6ec789358e1c06 100644 (file)
@@ -3,6 +3,7 @@
 #ifdef WITH_XF86VIDMODE
 #include <X11/extensions/xf86vmode.h>
 #endif
+#include <msp/io/print.h>
 #include <msp/strings/format.h>
 #include <msp/strings/lexicalcast.h>
 #include "display.h"
@@ -26,10 +27,10 @@ int x_error_handler(Display *display, XErrorEvent *event)
 
        string msg = Msp::format("Request %s failed with %s [%08X]", req, err, event->resourceid);
        if(error_flag)
-               cerr<<"Discarding error: "<<msg<<'\n';
+               Msp::IO::print(Msp::IO::cerr, "Discarding error: %s\n", msg);
        else
        {
-               cerr<<msg<<'\n';
+               Msp::IO::print(Msp::IO::cerr, "%s\n", msg);
                error_msg = msg;
                error_flag = true;
        }
@@ -44,6 +45,7 @@ namespace Msp {
 namespace Graphics {
 
 Display::Display(const string &disp_name):
+       primary_monitor(0),
        priv(new Private)
 {
        if(disp_name.empty())
@@ -58,27 +60,34 @@ Display::Display(const string &disp_name):
 #ifdef WITH_XF86VIDMODE
        int screen = DefaultScreen(priv->display);
 
+       monitors.push_back(Monitor());
+       Monitor &monitor = monitors.back();
+       primary_monitor = &monitor;
+
        int nmodes;
        XF86VidModeModeInfo **infos;
        XF86VidModeGetAllModeLines(priv->display, screen, &nmodes, &infos);
+
+       XF86VidModeModeLine modeline;
+       int dotclock;
+       XF86VidModeGetModeLine(priv->display, screen, &dotclock, &modeline);
+
        for(int i=0; i<nmodes; ++i)
        {
                XF86VidModeModeInfo &info = *infos[i];
        
                VideoMode mode(info.hdisplay, info.vdisplay);
+               mode.monitor = &monitor;
                if(info.htotal && info.vtotal)
                        mode.rate = info.dotclock/(info.htotal*info.vtotal);
                modes.push_back(mode);
+               monitor.video_modes.push_back(&modes.back());
+
+               if(info.htotal==modeline.htotal && info.vtotal==modeline.vtotal && info.dotclock==static_cast<unsigned>(dotclock))
+                       monitor.desktop_mode = &modes.back();
        }
 
        XFree(infos);
-
-       XF86VidModeModeLine modeline;
-       int dotclock;
-       XF86VidModeGetModeLine(priv->display, screen, &dotclock, &modeline);
-       orig_mode = VideoMode(modeline.hdisplay, modeline.vdisplay);
-       if(modeline.htotal && modeline.vtotal)
-               orig_mode.rate = dotclock/(modeline.htotal*modeline.vtotal);
 #endif
 }
 
@@ -88,7 +97,7 @@ Display::~Display()
        delete priv;
 }
 
-void Display::set_mode(const VideoMode &mode)
+void Display::set_mode(const VideoMode &mode, bool)
 {
 #ifdef WITH_XF86VIDMODE
        int screen = DefaultScreen(priv->display);