]> git.tdb.fi Git - libs/gui.git/blobdiff - source/gbase/display.cpp
Implement video mode changing and fullscreen on win32
[libs/gui.git] / source / gbase / display.cpp
index 3baf7c11a72e92eb1a1827666f247198d85e21aa..b39330be1c9fc3353cc387fad8f38241a8b7b765 100644 (file)
@@ -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
 }