]> 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 b68f9bd2283aa8c71c93561ed5a768a8330c069a..6fee30b26ff6873d88b1f69e1b6ec789358e1c06 100644 (file)
@@ -45,6 +45,7 @@ namespace Msp {
 namespace Graphics {
 
 Display::Display(const string &disp_name):
+       primary_monitor(0),
        priv(new Private)
 {
        if(disp_name.empty())
@@ -59,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
 }
 
@@ -89,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);