]> git.saurik.com Git - wxWidgets.git/blobdiff - src/osx/core/display.cpp
avoid setting initial position if it was not specified, broken in r70734
[wxWidgets.git] / src / osx / core / display.cpp
index 4160d73acf260b67926e53b96bfd584a5cd5dda4..b1961bc92e3a69248e4b9f477122425948e291a4 100644 (file)
@@ -4,7 +4,6 @@
 // Author:      Ryan Norton & Brian Victor
 // Modified by: Royce Mitchell III, Vadim Zeitlin
 // Created:     06/21/02
-// RCS-ID:      $Id$
 // Copyright:   (c) wxWidgets team
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
@@ -60,6 +59,8 @@ public:
     virtual wxVideoMode GetCurrentMode() const;
     virtual bool ChangeMode(const wxVideoMode& mode);
 
+    virtual bool IsPrimary() const;
+
 private:
     CGDirectDisplayID m_id;
 
@@ -83,12 +84,55 @@ protected:
 // wxDisplayFactoryMacOSX implementation
 // ============================================================================
 
+// gets all displays that are not mirror displays
+
+static CGDisplayErr wxOSXGetDisplayList(CGDisplayCount maxDisplays,
+                                   CGDirectDisplayID *displays,
+                                   CGDisplayCount *displayCount)
+{
+    CGDisplayErr error = kCGErrorSuccess;
+    CGDisplayCount onlineCount;
+
+    error = CGGetOnlineDisplayList(0,NULL,&onlineCount);
+    if ( error == kCGErrorSuccess )
+    {
+        *displayCount = 0;
+        if ( onlineCount > 0 )
+        {
+            CGDirectDisplayID *onlineDisplays = new CGDirectDisplayID[onlineCount];
+            error = CGGetOnlineDisplayList(onlineCount,onlineDisplays,&onlineCount);
+            if ( error == kCGErrorSuccess )
+            {
+                for ( CGDisplayCount i = 0; i < onlineCount; ++i )
+                {
+                    if ( CGDisplayMirrorsDisplay(onlineDisplays[i]) != kCGNullDirectDisplay )
+                        continue;
+
+                    if ( displays == NULL )
+                        *displayCount += 1;
+                    else
+                    {
+                        if ( *displayCount < maxDisplays )
+                        {
+                            displays[*displayCount] = onlineDisplays[i];
+                            *displayCount += 1;
+                        }
+                    }
+                }
+            }
+            delete[] onlineDisplays;
+        }
+
+    }
+    return error;
+}
+
 unsigned wxDisplayFactoryMacOSX::GetCount()
 {
     CGDisplayCount count;
-    CGDisplayErr err = CGGetActiveDisplayList(0, NULL, &count);
+    CGDisplayErr err = wxOSXGetDisplayList(0, NULL, &count);
 
-    wxCHECK_MSG( err != CGDisplayNoErr, 0, "CGGetActiveDisplayList() failed" );
+    wxCHECK_MSG( err == CGDisplayNoErr, 0, "wxOSXGetDisplayList() failed" );
 
     return count;
 }
@@ -107,7 +151,7 @@ int wxDisplayFactoryMacOSX::GetFromPoint(const wxPoint& p)
     {
         theCount = GetCount();
         CGDirectDisplayID* theIDs = new CGDirectDisplayID[theCount];
-        err = CGGetActiveDisplayList(theCount, theIDs, &theCount);
+        err = wxOSXGetDisplayList(theCount, theIDs, &theCount);
         wxASSERT(err == CGDisplayNoErr);
 
         for (nWhich = 0; nWhich < (int) theCount; ++nWhich)
@@ -133,8 +177,8 @@ wxDisplayImpl *wxDisplayFactoryMacOSX::CreateDisplay(unsigned n)
     CGDisplayCount theCount = GetCount();
     CGDirectDisplayID* theIDs = new CGDirectDisplayID[theCount];
 
-    CGDisplayErr err = CGGetActiveDisplayList(theCount, theIDs, &theCount);
-    wxCHECK_MSG( err != CGDisplayNoErr, NULL, "CGGetActiveDisplayList() failed" );
+    CGDisplayErr err = wxOSXGetDisplayList(theCount, theIDs, &theCount);
+    wxCHECK_MSG( err == CGDisplayNoErr, NULL, "wxOSXGetDisplayList() failed" );
 
     wxASSERT( n < theCount );
 
@@ -149,6 +193,11 @@ wxDisplayImpl *wxDisplayFactoryMacOSX::CreateDisplay(unsigned n)
 // wxDisplayImplMacOSX implementation
 // ============================================================================
 
+bool wxDisplayImplMacOSX::IsPrimary() const
+{
+    return CGDisplayIsMain(m_id);
+}
+
 wxRect wxDisplayImplMacOSX::GetGeometry() const
 {
     CGRect theRect = CGDisplayBounds(m_id);
@@ -217,10 +266,14 @@ wxVideoMode wxDisplayImplMacOSX::GetCurrentMode() const
 
 bool wxDisplayImplMacOSX::ChangeMode( const wxVideoMode& mode )
 {
-    // Changing to default mode (wxDefaultVideoMode) doesn't
-    // work because we don't have access to the system's 'scrn'
-    // resource which holds the user's mode which the system
-    // will return to after this app is done
+#ifndef __WXOSX_IPHONE__
+    if (mode == wxDefaultVideoMode)
+    {
+        CGRestorePermanentDisplayConfiguration();
+        return true;
+    }
+#endif
+
     boolean_t bExactMatch;
     CFDictionaryRef theCGMode = CGDisplayBestModeForParametersAndRefreshRate(
         m_id,