]> git.tdb.fi Git - libs/gui.git/blobdiff - source/graphics/windows/display.cpp
Avoid using std::list
[libs/gui.git] / source / graphics / windows / display.cpp
index bea18a64d0f8b05d372e8e900f2e89c4f7d1608f..09ca2e9edab55530bdc796dedc796141e6fa01ef 100644 (file)
@@ -1,5 +1,6 @@
 #include "display.h"
 #include "display_private.h"
+#include <algorithm>
 #include <windows.h>
 
 using namespace std;
@@ -12,6 +13,9 @@ Display::Display(const string &):
 {
        static ErrorDialog err_dlg(nullptr);
 
+       int primary_index = -1;
+       vector<unsigned> mode_monitor_indices;
+       vector<int> desktop_mode_indices;
        for(unsigned i=0;; ++i)
        {
                DISPLAY_DEVICE adapter_dev;
@@ -29,33 +33,54 @@ Display::Display(const string &):
                priv->monitors.push_back(adapter_dev.DeviceName);
 
                if(adapter_dev.StateFlags&DISPLAY_DEVICE_PRIMARY_DEVICE)
-                       primary_monitor = &monitor;
+                       primary_index = i;
 
                DEVMODE current;
                bool have_current = EnumDisplaySettings(adapter_dev.DeviceName, ENUM_CURRENT_SETTINGS, &current);
 
+               unsigned first_mode = modes.size();
+               int desktop_mode_index = -1;
                for(unsigned j=0;; ++j)
                {
                        DEVMODE info;
                        if(!EnumDisplaySettings(adapter_dev.DeviceName, j, &info))
                                break;
 
+                       if(any_of(modes.begin()+first_mode, modes.end(), [&info](const VideoMode &m){
+                                       return (m.width==info.dmPelsWidth && m.height==info.dmPelsHeight && m.rate==info.dmDisplayFrequency);
+                               }))
+                               continue;
+
                        VideoMode mode(info.dmPelsWidth, info.dmPelsHeight);
                        mode.index = modes.size();
-                       mode.monitor = &monitor;
                        mode.rate = info.dmDisplayFrequency;
-                       if(find_mode(mode))
-                               continue;
 
                        modes.push_back(mode);
-                       monitor.video_modes.push_back(&modes.back());
+                       mode_monitor_indices.push_back(monitor.index);
 
                        if(have_current && info.dmPelsWidth==current.dmPelsWidth && info.dmPelsHeight==current.dmPelsHeight && info.dmDisplayFrequency==current.dmDisplayFrequency)
-                               monitor.desktop_settings.mode = &modes.back();
+                               desktop_mode_index = mode.index;
                }
+               desktop_mode_indices.push_back(desktop_mode_index);
+       }
 
-               monitor.current_settings = monitor.desktop_settings;
+       for(unsigned i=0; i<monitors.size(); ++i)
+       {
+               int j = desktop_mode_indices[i];
+               if(j>=0)
+                       monitors[i].desktop_settings.mode = &modes[j];
+               monitors[i].current_settings = monitors[i].desktop_settings;
        }
+
+       for(unsigned i=0; i<modes.size(); ++i)
+       {
+               Monitor &monitor = monitors[mode_monitor_indices[i]];
+               modes[i].monitor = &monitor;
+               monitor.video_modes.push_back(&modes[i]);
+       }
+
+       if(primary_index>=0)
+               primary_monitor = &monitors[primary_index];
 }
 
 Display::~Display()