X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fgbase%2Fdisplay.cpp;h=b39330be1c9fc3353cc387fad8f38241a8b7b765;hb=881ad898c45954f95972091554af25d775b8c2a8;hp=3baf7c11a72e92eb1a1827666f247198d85e21aa;hpb=1238b80d08c1983dfa8914f78b294cd44b1a275b;p=libs%2Fgui.git diff --git a/source/gbase/display.cpp b/source/gbase/display.cpp index 3baf7c1..b39330b 100644 --- a/source/gbase/display.cpp +++ b/source/gbase/display.cpp @@ -54,7 +54,27 @@ namespace Graphics { Display::Display(const string &disp_name) { -#ifndef WIN32 +#ifdef WIN32 + (void)disp_name; + + 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; + } +#else if(disp_name.empty()) display=XOpenDisplay(0); else @@ -74,7 +94,8 @@ Display::Display(const string &disp_name) XF86VidModeModeInfo &info=*infos[i]; VideoMode mode(info.hdisplay, info.vdisplay); - mode.rate=info.dotclock/(info.htotal*info.vtotal); + if(info.htotal && info.vtotal) + mode.rate=info.dotclock/(info.htotal*info.vtotal); modes.push_back(mode); } @@ -84,9 +105,8 @@ Display::Display(const string &disp_name) int dotclock; XF86VidModeGetModeLine(display, screen, &dotclock, &modeline); orig_mode=VideoMode(modeline.hdisplay, modeline.vdisplay); - orig_mode.rate=dotclock/(modeline.htotal*modeline.vtotal); -#else - (void)disp_name; + if(modeline.htotal && modeline.vtotal) + orig_mode.rate=dotclock/(modeline.htotal*modeline.vtotal); #endif } @@ -110,7 +130,20 @@ void Display::remove_window(Window *wnd) void Display::set_mode(const VideoMode &mode) { -#ifndef WIN32 +#ifdef WIN32 + 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; + } + + ChangeDisplaySettings(&info, CDS_FULLSCREEN); +#else int screen=DefaultScreen(display); int nmodes; @@ -120,7 +153,9 @@ void Display::set_mode(const VideoMode &mode) { XF86VidModeModeInfo &info=*infos[i]; - unsigned rate=info.dotclock/(info.htotal*info.vtotal); + unsigned rate=0; + if(info.htotal && info.vtotal) + rate=info.dotclock/(info.htotal*info.vtotal); if(info.hdisplay==mode.width && info.vdisplay==mode.height && (mode.rate==0 || rate==mode.rate)) { XF86VidModeSwitchToMode(display, screen, &info); @@ -130,8 +165,6 @@ void Display::set_mode(const VideoMode &mode) } throw InvalidParameterValue("Requested mode not supported"); -#else - (void)mode; #endif }