]> git.tdb.fi Git - libs/gui.git/blobdiff - source/graphics/windows/display.cpp
Fix a memory leak
[libs/gui.git] / source / graphics / windows / display.cpp
index ae19f57c2c3bf59de14d9ba5f509ddbbf4eb8e17..2364f6d9c05422a3413550fceef94ae5a63389f7 100644 (file)
@@ -9,8 +9,11 @@ namespace Graphics {
 
 Display::Display(const string &):
        primary_monitor(0),
-       priv(new Private)
+       priv(new Private),
+       focus_window(0)
 {
+       static ErrorDialog err_dlg(0);
+
        for(unsigned i=0;; ++i)
        {
                DISPLAY_DEVICE adapter_dev;
@@ -24,6 +27,7 @@ Display::Display(const string &):
                monitors.push_back(Monitor());
                Monitor &monitor = monitors.back();
                monitor.index = monitors.size()-1;
+               monitor.name = adapter_dev.DeviceString;
                priv->monitors.push_back(adapter_dev.DeviceName);
 
                if(adapter_dev.StateFlags&DISPLAY_DEVICE_PRIMARY_DEVICE)
@@ -39,32 +43,38 @@ Display::Display(const string &):
                                break;
 
                        VideoMode mode(info.dmPelsWidth, info.dmPelsHeight);
+                       mode.index = modes.size();
                        mode.monitor = &monitor;
                        mode.rate = info.dmDisplayFrequency;
-                       if(find_matching_mode(mode))
+                       if(find_mode(mode))
                                continue;
 
                        modes.push_back(mode);
                        monitor.video_modes.push_back(&modes.back());
 
                        if(have_current && info.dmPelsWidth==current.dmPelsWidth && info.dmPelsHeight==current.dmPelsHeight && info.dmDisplayFrequency==current.dmDisplayFrequency)
-                               monitor.desktop_mode = &modes.back();
+                               monitor.desktop_settings.mode = &modes.back();
                }
        }
 }
 
 Display::~Display()
 {
+       delete priv;
 }
 
 void Display::set_mode(const VideoMode &requested_mode, bool)
 {
-       const VideoMode *mode = find_matching_mode(requested_mode);
+       const VideoMode *mode = find_mode(requested_mode);
        if(!mode)
                throw unsupported_video_mode(requested_mode);
 
        DEVMODE info;
+       info.dmDeviceName[0] = 0;
+       info.dmSpecVersion = DM_SPECVERSION;
+       info.dmDriverVersion = 0;
        info.dmSize = sizeof(DEVMODE);
+       info.dmDriverExtra = 0;
        info.dmFields = DM_PELSWIDTH|DM_PELSHEIGHT;
        info.dmPelsWidth = mode->width;
        info.dmPelsHeight = mode->height;
@@ -77,6 +87,10 @@ void Display::set_mode(const VideoMode &requested_mode, bool)
        LONG ret = ChangeDisplaySettingsEx(priv->monitors[mode->monitor->index].c_str(), &info, NULL, CDS_FULLSCREEN, NULL);
        if(ret!=DISP_CHANGE_SUCCESSFUL)
                throw unsupported_video_mode(requested_mode);
+
+       for(list<Monitor>::iterator i=monitors.begin(); i!=monitors.end(); ++i)
+               if(&*i==mode->monitor)
+                       i->current_settings.mode = mode;
 }
 
 bool Display::process_events()
@@ -84,6 +98,7 @@ bool Display::process_events()
        MSG msg;
        if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
        {
+               TranslateMessage(&msg);
                DispatchMessage(&msg);
                return true;
        }