--- /dev/null
+#include <windows.h>
+#include "display.h"
+
+using namespace std;
+
+namespace Msp {
+namespace Graphics {
+
+Display::Display(const string &)
+{
+ for(unsigned i=0;; ++i)
+ {
+ DEVMODE info;
+ if(!EnumDisplaySettings(0, i, &info))
+ break;
+
+ VideoMode mode(info.dmPelsWidth, info.dmPelsHeight);
+ mode.rate = info.dmDisplayFrequency;
+ modes.push_back(mode);
+ }
+
+ DEVMODE info;
+ if(EnumDisplaySettings(0, ENUM_CURRENT_SETTINGS, &info))
+ {
+ orig_mode = VideoMode(info.dmPelsWidth, info.dmPelsHeight);
+ orig_mode.rate = info.dmDisplayFrequency;
+ }
+}
+
+Display::~Display()
+{
+}
+
+void Display::set_mode(const VideoMode &mode)
+{
+ DEVMODE info;
+ info.dmSize = sizeof(DEVMODE);
+ info.dmFields = DM_PELSWIDTH|DM_PELSHEIGHT;
+ info.dmPelsWidth = mode.width;
+ info.dmPelsHeight = mode.height;
+ if(mode.rate)
+ {
+ info.dmFields |= DM_DISPLAYFREQUENCY;
+ info.dmDisplayFrequency = mode.rate;
+ }
+
+ LONG ret = ChangeDisplaySettings(&info, CDS_FULLSCREEN);
+ if(ret!=DISP_CHANGE_SUCCESSFUL)
+ throw unsupported_video_mode(mode);
+}
+
+bool Display::process_events()
+{
+ MSG msg;
+ if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
+ {
+ DispatchMessage(&msg);
+ return true;
+ }
+ else
+ return false;
+}
+
+void Display::check_error()
+{
+}
+
+} // namespace Msp
+} // namespace Graphics