]> git.tdb.fi Git - libs/gui.git/blob - source/graphics/windows/display.cpp
64a6c4307e340c897dbe5fad293625945fa13d3a
[libs/gui.git] / source / graphics / windows / display.cpp
1 #include <windows.h>
2 #include "display.h"
3 #include "display_private.h"
4
5 using namespace std;
6
7 namespace Msp {
8 namespace Graphics {
9
10 Display::Display(const string &):
11         priv(new Private)
12 {
13         for(unsigned i=0;; ++i)
14         {
15                 DEVMODE info;
16                 if(!EnumDisplaySettings(0, i, &info))
17                         break;
18
19                 VideoMode mode(info.dmPelsWidth, info.dmPelsHeight);
20                 mode.rate = info.dmDisplayFrequency;
21                 modes.push_back(mode);
22         }
23         
24         DEVMODE info;
25         if(EnumDisplaySettings(0, ENUM_CURRENT_SETTINGS, &info))
26         {
27                 orig_mode = VideoMode(info.dmPelsWidth, info.dmPelsHeight);
28                 orig_mode.rate = info.dmDisplayFrequency;
29         }
30 }
31
32 Display::~Display()
33 {
34 }
35
36 void Display::set_mode(const VideoMode &mode)
37 {
38         DEVMODE info;
39         info.dmSize = sizeof(DEVMODE);
40         info.dmFields = DM_PELSWIDTH|DM_PELSHEIGHT;
41         info.dmPelsWidth = mode.width;
42         info.dmPelsHeight = mode.height;
43         if(mode.rate)
44         {
45                 info.dmFields |= DM_DISPLAYFREQUENCY;
46                 info.dmDisplayFrequency = mode.rate;
47         }
48
49         LONG ret = ChangeDisplaySettings(&info, CDS_FULLSCREEN);
50         if(ret!=DISP_CHANGE_SUCCESSFUL)
51                 throw unsupported_video_mode(mode);
52 }
53
54 bool Display::process_events()
55 {
56         MSG msg;
57         if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
58         {
59                 DispatchMessage(&msg);
60                 return true;
61         }
62         else
63                 return false;
64 }
65
66 void Display::check_error()
67 {
68 }
69
70 } // namespace Msp
71 } // namespace Graphics