X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgraphics%2Fwindows%2Fdisplay.cpp;h=359df9e39b7f16023022e0f662edc002b62c191b;hb=1ea8498c4c729f849095e2f4aa3d282de2000a35;hp=b9388e31f8ed297b85efbe20bd44b488bf7cc5b4;hpb=85609ce268bdd6a91cd26e0bda7460862d3f38d7;p=libs%2Fgui.git diff --git a/source/graphics/windows/display.cpp b/source/graphics/windows/display.cpp index b9388e3..359df9e 100644 --- a/source/graphics/windows/display.cpp +++ b/source/graphics/windows/display.cpp @@ -1,6 +1,7 @@ -#include #include "display.h" #include "display_private.h" +#include +#include using namespace std; @@ -8,16 +9,18 @@ namespace Msp { namespace Graphics { Display::Display(const string &): - primary_monitor(0), priv(new Private) { - static ErrorDialog err_dlg(0); + 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; adapter_dev.cb = sizeof(adapter_dev); - if(!EnumDisplayDevices(0, i, &adapter_dev, 0)) + if(!EnumDisplayDevices(nullptr, i, &adapter_dev, 0)) break; if(adapter_dev.StateFlags&DISPLAY_DEVICE_MIRRORING_DRIVER) @@ -26,39 +29,67 @@ 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); + DISPLAY_DEVICE monitor_dev; + monitor_dev.cb = sizeof(monitor_dev); + if(EnumDisplayDevices(adapter_dev.DeviceName, 0, &monitor_dev, 0)) + monitor.name = monitor_dev.DeviceString; + 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_mode = &modes.back(); + desktop_mode_index = mode.index; } + desktop_mode_indices.push_back(desktop_mode_index); } + + 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() { + delete priv; } void Display::set_mode(const VideoMode &requested_mode, bool) @@ -86,15 +117,15 @@ void Display::set_mode(const VideoMode &requested_mode, bool) if(ret!=DISP_CHANGE_SUCCESSFUL) throw unsupported_video_mode(requested_mode); - for(list::iterator i=monitors.begin(); i!=monitors.end(); ++i) - if(&*i==mode->monitor) - i->current_mode = mode; + for(Monitor &m: monitors) + if(&m==mode->monitor) + m.current_settings.mode = mode; } bool Display::process_events() { MSG msg; - if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) + if(PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg);