+#ifdef __WXMAC_OSX__
+
+class wxDisplayMacPriv
+{
+public:
+ CGDirectDisplayID m_id;
+};
+
+size_t wxDisplayBase::GetCount()
+{
+ CGDisplayCount count;
+ CGDisplayErr err = CGGetActiveDisplayList(0, NULL, &count);
+
+ wxASSERT(err == CGDisplayNoErr);
+
+ return count;
+}
+
+int wxDisplayBase::GetFromPoint(const wxPoint &p)
+{
+ CGPoint thePoint = {(float)p.x, (float)p.y};
+ CGDirectDisplayID theID;
+ CGDisplayCount theCount;
+ CGDisplayErr err = CGGetDisplaysWithPoint(thePoint, 1, &theID, &theCount);
+ wxASSERT(err == CGDisplayNoErr);
+
+ int nWhich = -1;
+
+ if (theCount)
+ {
+ theCount = GetCount();
+ CGDirectDisplayID* theIDs = new CGDirectDisplayID[theCount];
+ err = CGGetActiveDisplayList(theCount, theIDs, &theCount);
+ wxASSERT(err == CGDisplayNoErr);
+
+ for (nWhich = 0; nWhich < (int) theCount; ++nWhich)
+ {
+ if (theIDs[nWhich] == theID)
+ break;
+ }
+
+ delete [] theIDs;
+
+ if (nWhich == (int) theCount)
+ {
+ wxFAIL_MSG(wxT("Failed to find display in display list"));
+ nWhich = -1;
+ }
+ }
+
+ return nWhich;
+}
+
+wxDisplay::wxDisplay(size_t index)
+ : wxDisplayBase( index ) ,
+ m_priv( new wxDisplayMacPriv() )
+{
+ CGDisplayCount theCount = GetCount();
+ CGDirectDisplayID* theIDs = new CGDirectDisplayID[theCount];
+
+ CGDisplayErr err = CGGetActiveDisplayList(theCount, theIDs, &theCount);
+
+ wxASSERT( err == CGDisplayNoErr );
+ wxASSERT( index < theCount );
+
+ m_priv->m_id = theIDs[index];
+
+ delete [] theIDs;
+}
+
+wxRect wxDisplay::GetGeometry() const
+{
+ CGRect theRect = CGDisplayBounds(m_priv->m_id);
+ return wxRect( (int)theRect.origin.x,
+ (int)theRect.origin.y,
+ (int)theRect.size.width,
+ (int)theRect.size.height ); //floats
+}
+
+int wxDisplay::GetDepth() const
+{
+ return (int) CGDisplayBitsPerPixel( m_priv->m_id ); //size_t
+}
+
+wxString wxDisplay::GetName() const
+{
+ // Macs don't name their displays...
+ return wxEmptyString;
+}
+
+static int wxCFDictKeyToInt( CFDictionaryRef desc, CFStringRef key )
+{
+ CFNumberRef value = (CFNumberRef) CFDictionaryGetValue( desc, key );
+ if (value == NULL)
+ return 0;
+
+ int num = 0;
+ CFNumberGetValue( value, kCFNumberIntType, &num );
+
+ return num;
+}
+
+wxArrayVideoModes
+ wxDisplay::GetModes(const wxVideoMode& mode) const
+{
+ wxArrayVideoModes resultModes;
+
+ CFArrayRef theArray = CGDisplayAvailableModes( m_priv->m_id );
+
+ for (CFIndex i = 0; i < CFArrayGetCount(theArray); ++i)
+ {
+ CFDictionaryRef theValue = (CFDictionaryRef) CFArrayGetValueAtIndex( theArray, i );
+
+ wxVideoMode theMode(
+ wxCFDictKeyToInt( theValue, kCGDisplayWidth ),
+ wxCFDictKeyToInt( theValue, kCGDisplayHeight ),
+ wxCFDictKeyToInt( theValue, kCGDisplayBitsPerPixel ),
+ wxCFDictKeyToInt( theValue, kCGDisplayRefreshRate ));
+
+ if (theMode.Matches( mode ))
+ resultModes.Add( theMode );
+ }
+
+ return resultModes;
+}
+
+wxVideoMode wxDisplay::GetCurrentMode() const
+{
+ CFDictionaryRef theValue = CGDisplayCurrentMode( m_priv->m_id );
+
+ return wxVideoMode(
+ wxCFDictKeyToInt( theValue, kCGDisplayWidth ),
+ wxCFDictKeyToInt( theValue, kCGDisplayHeight ),
+ wxCFDictKeyToInt( theValue, kCGDisplayBitsPerPixel ),
+ wxCFDictKeyToInt( theValue, kCGDisplayRefreshRate ));
+}
+
+bool wxDisplay::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
+ boolean_t bExactMatch;
+ CFDictionaryRef theCGMode = CGDisplayBestModeForParametersAndRefreshRate(
+ m_priv->m_id,
+ (size_t)mode.bpp,
+ (size_t)mode.w,
+ (size_t)mode.h,
+ (double)mode.refresh,
+ &bExactMatch );
+
+ bool bOK = bExactMatch;
+
+ if (bOK)
+ bOK = CGDisplaySwitchToMode( m_priv->m_id, theCGMode ) == CGDisplayNoErr;
+
+ return bOK;
+}
+
+wxDisplay::~wxDisplay()
+{
+ if ( m_priv )
+ {
+ delete m_priv;
+ m_priv = 0;
+ }
+}
+
+#else
+