]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/display.cpp
Hardware defines spec.
[wxWidgets.git] / src / msw / display.cpp
index 28cc8067b8cbe3cffec2919f561fb694b6a9fb61..ba43859eda2b1d62689e6a38f2c4163d3e9ca7d7 100644 (file)
@@ -5,7 +5,7 @@
 // Modified by: VZ (resolutions enumeration/change support, DirectDraw, ...)
 // Created:     06/21/02
 // RCS-ID:      $Id$
-// Copyright:   (c) wxWindows team
+// Copyright:   (c) wxWidgets team
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
@@ -17,7 +17,7 @@
 // headers
 // ---------------------------------------------------------------------------
 
-#ifdef __GNUG__
+#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
     #pragma implementation "display.h"
 #endif
 
@@ -31,7 +31,9 @@
 #if wxUSE_DISPLAY
 
 #ifndef WX_PRECOMP
+   #include "wx/app.h"
    #include "wx/dynarray.h"
+   #include "wx/frame.h"
 #endif
 
 #include "wx/dynload.h"
@@ -166,10 +168,10 @@ static wxDisplayInfoArray *gs_displays = NULL;
 // ----------------------------------------------------------------------------
 
 static BOOL CALLBACK wxmswMonitorEnumProc (
-  HMONITOR hMonitor,  // handle to display monitor
-  HDC hdcMonitor,     // handle to monitor-appropriate device context (NULL)
-  LPRECT lprcMonitor, // pointer to monitor intersection rectangle
-  LPARAM dwData       // data passed from EnumDisplayMonitors (unused)
+  HMONITOR hMonitor,        // handle to display monitor
+  HDC WXUNUSED(hdcMonitor), // handle to monitor-appropriate device context
+  LPRECT lprcMonitor,       // pointer to monitor intersection rectangle
+  LPARAM WXUNUSED(dwData)   // data passed from EnumDisplayMonitors (unused)
 )
 {
     wxDisplayInfo *info = new wxDisplayInfo();
@@ -193,9 +195,9 @@ static BOOL CALLBACK wxmswMonitorEnumProc (
 
 BOOL PASCAL
 wxDDEnumExCallback(GUID *pGuid,
-                   LPTSTR driverDescription,
+                   LPTSTR WXUNUSED(driverDescription),
                    LPTSTR driverName,
-                   LPVOID lpContext,
+                   LPVOID WXUNUSED(lpContext),
                    HMONITOR hmon)
 {
     if ( pGuid )
@@ -214,11 +216,11 @@ wxDDEnumExCallback(GUID *pGuid,
     return true;
 }
 
-HRESULT WINAPI wxDDEnumModesCallback(LPDDSURFACEDESC lpDDSurfaceDesc,  
+HRESULT WINAPI wxDDEnumModesCallback(LPDDSURFACEDESC lpDDSurfaceDesc,
                                      LPVOID lpContext)
 {
     // we need at least the mode size
-    static const int FLAGS_REQUIRED = DDSD_HEIGHT | DDSD_WIDTH;
+    static const DWORD FLAGS_REQUIRED = DDSD_HEIGHT | DDSD_WIDTH;
     if ( (lpDDSurfaceDesc->dwFlags & FLAGS_REQUIRED) == FLAGS_REQUIRED )
     {
         wxArrayVideoModes * const modes = (wxArrayVideoModes *)lpContext;
@@ -240,12 +242,16 @@ HRESULT WINAPI wxDDEnumModesCallback(LPDDSURFACEDESC lpDDSurfaceDesc,
 // initialize gs_displays using DirectX functions
 static bool DoInitDirectX()
 {
+#if wxUSE_LOG
     // suppress the errors if ddraw.dll is not found
     wxLog::EnableLogging(false);
+#endif
 
     wxDynamicLibrary dllDX(_T("ddraw.dll"));
 
-    wxLog::EnableLogging(true);
+#if wxUSE_LOG
+    wxLog::EnableLogging();
+#endif
 
     if ( !dllDX.IsLoaded() )
         return false;
@@ -297,7 +303,7 @@ static void InitDisplays()
 
     gs_displays = new wxDisplayInfoArray();
 
-    if ( gs_useDirectX && !DoInitDirectX() )
+    if ( !gs_useDirectX || !DoInitDirectX() )
     {
         // either we were told not to try to use DirectX or fall back to std
         // functions if DirectX method failed
@@ -505,7 +511,11 @@ wxString wxDisplay::GetName() const
         wxZeroMemory(monInfo);
         monInfo.cbSize = sizeof(monInfo);
 
-        if ( !::GetMonitorInfo(dpyInfo.m_hmon, &monInfo) )
+        // NB: Cast from MONITORINFOEX* to MONITORINFO* is done because
+        //     Mingw headers - unlike the ones from Microsoft's Platform SDK -
+        //     don't derive the former from the latter in C++ mode and so
+        //     the pointer's type is not converted implicitly.
+        if ( !::GetMonitorInfo(dpyInfo.m_hmon, (LPMONITORINFO)&monInfo) )
         {
             wxLogLastError(_T("GetMonitorInfo"));
         }
@@ -539,7 +549,7 @@ wxString wxDisplay::GetNameForEnumSettings() const
 // ----------------------------------------------------------------------------
 
 wxArrayVideoModes
-wxDisplay::DoGetModesDirectX(const wxVideoMode& modeMatch) const
+wxDisplay::DoGetModesDirectX(const wxVideoMode& WXUNUSED(modeMatch)) const
 {
     wxArrayVideoModes modes;
 
@@ -648,7 +658,7 @@ bool wxDisplay::DoChangeModeDirectX(const wxVideoMode& mode)
         return false;
     }
 
-         
+
     return true;
 }
 
@@ -729,6 +739,18 @@ bool wxDisplay::DoChangeModeWindows(const wxVideoMode& mode)
     {
         case DISP_CHANGE_SUCCESSFUL:
             // ok
+            {
+                // If we have a top-level, full-screen frame, emulate
+                // the DirectX behavior and resize it.  This makes this
+                // API quite a bit easier to use.
+                wxWindow *winTop = wxTheApp->GetTopWindow();
+                wxFrame *frameTop = wxDynamicCast(winTop, wxFrame);
+                if (frameTop && frameTop->IsFullScreen())
+                {
+                    wxVideoMode current = GetCurrentMode();
+                    frameTop->SetClientSize(current.w, current.h);
+                }
+            }
             return true;
 
         case DISP_CHANGE_BADMODE: