]> git.tdb.fi Git - libs/gui.git/blob - source/graphics/display.cpp
40112a35f9408760c5f6ab05ea286033403282b1
[libs/gui.git] / source / graphics / display.cpp
1 #include <cmath>
2 #include "display.h"
3 #include "display_private.h"
4 #include "window.h"
5
6 using namespace std;
7
8 namespace Msp {
9 namespace Graphics {
10
11 void Display::add_window(Window &wnd)
12 {
13         priv->windows[wnd.get_private().window] = &wnd;
14 }
15
16 void Display::remove_window(Window &wnd)
17 {
18         priv->windows.erase(wnd.get_private().window);
19 }
20
21 const VideoMode &Display::get_desktop_mode() const
22 {
23         if(!primary_monitor || !primary_monitor->desktop_mode)
24                 throw logic_error("no desktop mode");
25         return *primary_monitor->desktop_mode;
26 }
27
28 void Display::restore_mode()
29 {
30         for(list<Monitor>::const_iterator i=monitors.begin(); i!=monitors.end(); ++i)
31                 if(i->desktop_mode)
32                         set_mode(*i->desktop_mode, false);
33 }
34
35 const VideoMode *Display::find_mode(const VideoMode &mode, float rate_tolerance) const
36 {
37         const VideoMode *closest = 0;
38         float rate_diff = mode.rate;
39         for(list<VideoMode>::const_iterator i=modes.begin(); i!=modes.end(); ++i)
40         {
41                 if(mode.monitor && i->monitor!=mode.monitor)
42                         continue;
43                 if(mode.rate && (i->rate<mode.rate-rate_tolerance || i->rate>mode.rate+rate_tolerance))
44                         continue;
45                 if(i->width!=mode.width || i->height!=mode.height)
46                         continue;
47
48                 if(mode.rate)
49                 {
50                         float d = abs(i->rate-mode.rate);
51                         if(d<rate_diff)
52                         {
53                                 closest = &*i;
54                                 rate_diff = d;
55                         }
56                 }
57                 else
58                         return &*i;
59         }
60
61         return closest;
62 }
63
64 const VideoMode *Display::find_mode(unsigned width, unsigned height) const
65 {
66         return find_mode(VideoMode(width, height));
67 }
68
69 void Display::tick()
70 {
71         check_error();
72
73         while(process_events()) ;
74 }
75
76 } // namespace Graphics
77 } // namespace Msp