X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgraphics%2Fdisplay.cpp;h=40112a35f9408760c5f6ab05ea286033403282b1;hb=2438c3cdd14087bfc3375ed1f5521ad5c0c09bbc;hp=42b0e8bb773404c892b01896d8ca13a589fa6f73;hpb=1aca77b93853ee127ac3bbf6886f7f04920542ef;p=libs%2Fgui.git diff --git a/source/graphics/display.cpp b/source/graphics/display.cpp index 42b0e8b..40112a3 100644 --- a/source/graphics/display.cpp +++ b/source/graphics/display.cpp @@ -1,4 +1,4 @@ -#include +#include #include "display.h" #include "display_private.h" #include "window.h" @@ -8,11 +8,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 +18,54 @@ 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::const_iterator i=monitors.begin(); i!=monitors.end(); ++i) + if(i->desktop_mode) + set_mode(*i->desktop_mode, false); +} + +const VideoMode *Display::find_mode(const VideoMode &mode, float rate_tolerance) const +{ + const VideoMode *closest = 0; + float rate_diff = mode.rate; + for(list::const_iterator i=modes.begin(); i!=modes.end(); ++i) + { + if(mode.monitor && i->monitor!=mode.monitor) + continue; + if(mode.rate && (i->raterate>mode.rate+rate_tolerance)) + continue; + if(i->width!=mode.width || i->height!=mode.height) + continue; + + if(mode.rate) + { + float d = abs(i->rate-mode.rate); + if(d