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
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);
}
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
}
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;
{
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);
}
throw InvalidParameterValue("Requested mode not supported");
-#else
- (void)mode;
#endif
}