X-Git-Url: http://git.tdb.fi/?p=libs%2Fgui.git;a=blobdiff_plain;f=source%2Fgraphics%2Fwindows%2Fdisplay.cpp;fp=source%2Fgraphics%2Fwindows%2Fdisplay.cpp;h=09ca2e9edab55530bdc796dedc796141e6fa01ef;hp=bea18a64d0f8b05d372e8e900f2e89c4f7d1608f;hb=72ed51af9656b47a331cf29565a0bdfd35f19847;hpb=507fa60f32bd3f64840a2cdd1be5d68478432b55 diff --git a/source/graphics/windows/display.cpp b/source/graphics/windows/display.cpp index bea18a6..09ca2e9 100644 --- a/source/graphics/windows/display.cpp +++ b/source/graphics/windows/display.cpp @@ -1,5 +1,6 @@ #include "display.h" #include "display_private.h" +#include #include using namespace std; @@ -12,6 +13,9 @@ Display::Display(const string &): { static ErrorDialog err_dlg(nullptr); + int primary_index = -1; + vector mode_monitor_indices; + vector 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, ¤t); + 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=0) + monitors[i].desktop_settings.mode = &modes[j]; + monitors[i].current_settings = monitors[i].desktop_settings; } + + for(unsigned i=0; i=0) + primary_monitor = &monitors[primary_index]; } Display::~Display()