]> git.tdb.fi Git - libs/gui.git/blobdiff - source/graphics/display.cpp
Extend the video mode API to support multiple monitors
[libs/gui.git] / source / graphics / display.cpp
index 42b0e8bb773404c892b01896d8ca13a589fa6f73..22dd705df90c772e6901ae30f618f87db787077a 100644 (file)
@@ -1,4 +1,3 @@
-#include <msp/strings/format.h>
 #include "display.h"
 #include "display_private.h"
 #include "window.h"
@@ -8,11 +7,6 @@ using namespace std;
 namespace Msp {
 namespace Graphics {
 
-unsupported_video_mode::unsupported_video_mode(const VideoMode &mode):
-       runtime_error(format("%dx%d", mode.width, mode.height))
-{ }
-
-
 void Display::add_window(Window &wnd)
 {
        priv->windows[wnd.get_private().window] = &wnd;
@@ -23,6 +17,35 @@ void Display::remove_window(Window &wnd)
        priv->windows.erase(wnd.get_private().window);
 }
 
+const VideoMode &Display::get_desktop_mode() const
+{
+       if(!primary_monitor || !primary_monitor->desktop_mode)
+               throw logic_error("no desktop mode");
+       return *primary_monitor->desktop_mode;
+}
+
+void Display::restore_mode()
+{
+       for(list<Monitor>::const_iterator i=monitors.begin(); i!=monitors.end(); ++i)
+               if(i->desktop_mode)
+                       set_mode(*i->desktop_mode, false);
+}
+
+const VideoMode *Display::find_matching_mode(const VideoMode &mode) const
+{
+       for(list<VideoMode>::const_iterator i=modes.begin(); i!=modes.end(); ++i)
+       {
+               if(mode.monitor && i->monitor!=mode.monitor)
+                       continue;
+               if(mode.rate && i->rate!=mode.rate)
+                       continue;
+               if(i->width==mode.width && i->height==mode.height)
+                       return &*i;
+       }
+
+       return 0;
+}
+
 void Display::tick()
 {
        check_error();