X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/7c4a8e4107300d99d0c6ec0e6c60d4899b093654..7890a36c9c34b5626ceada90956d0c69941a56af:/src/mac/carbon/display.cpp diff --git a/src/mac/carbon/display.cpp b/src/mac/carbon/display.cpp index bd1d5e8d73..f09d7b1f75 100644 --- a/src/mac/carbon/display.cpp +++ b/src/mac/carbon/display.cpp @@ -1,15 +1,15 @@ ///////////////////////////////////////////////////////////////////////////// // Name: display.cpp // Purpose: Mac implementation of wxDisplay class -// Author: Brian Victor -// Modified by: Royce Mitchell III & Ryan Norton +// Author: Ryan Norton & Brian Victor +// Modified by: Royce Mitchell III // Created: 06/21/02 // RCS-ID: $Id$ -// Copyright: (c) wxWindows team +// Copyright: (c) wxWidgets team // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// -#ifdef __GNUG__ +#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "display.h" #endif @@ -25,6 +25,7 @@ #ifndef WX_PRECOMP #include "wx/dynarray.h" #include "wx/log.h" + #include "wx/msgdlg.h" #endif #ifdef __DARWIN__ @@ -45,6 +46,176 @@ // private classes // ---------------------------------------------------------------------------- +#ifdef __WXMAC_OSX__ + +class wxDisplayMacPriv +{ +public: + CGDirectDisplayID m_id; +}; + +size_t wxDisplayBase::GetCount() +{ + CGDisplayCount count; +#ifdef __WXDEBUG__ + CGDisplayErr err = +#endif + 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; +}//CFUserNotification[NSBundle bundleForClass:[self class]] + +wxDisplay::wxDisplay(size_t index) : wxDisplayBase ( index ) , + m_priv ( new wxDisplayMacPriv() ) +{ + CGDisplayCount theCount = GetCount(); + CGDirectDisplayID* theIDs = new CGDirectDisplayID[theCount]; +#ifdef __WXDEBUG__ + CGDisplayErr err = +#endif + 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; + int num = 0; + + if ( (value = (CFNumberRef) CFDictionaryGetValue(desc, key)) == NULL ) + return 0; + CFNumberGetValue(value, kCFNumberIntType, &num); + return num; +} + +wxArrayVideoModes + wxDisplay::GetModes(const wxVideoMode& mode) const +{ + wxArrayVideoModes Modes; + + 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)) + Modes.Add(theMode); + } + + return Modes; +} + +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 (wxDefualtVideoMode) 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 + class wxDisplayMacPriv { public: @@ -243,10 +414,14 @@ wxArrayVideoModes DMListType pModes; DMDisplayModeListIteratorUPP uppMLI; DisplayIDType nDisplayID; + OSErr err; - wxASSERT(DMGetDisplayIDByGDevice(m_priv->m_hndl, &nDisplayID, false) == noErr); + err = DMGetDisplayIDByGDevice(m_priv->m_hndl, &nDisplayID, false); + wxASSERT(err == noErr); + //Create a new list... - wxASSERT_MSG(DMNewDisplayModeList(nDisplayID, NULL, NULL, &nNumModes, &pModes) == noErr, wxT("Could not create a new display mode list") ); + err = DMNewDisplayModeList(nDisplayID, NULL, NULL, &nNumModes, &pModes); + wxASSERT_MSG(err == noErr, wxT("Could not create a new display mode list") ); uppMLI = NewDMDisplayModeListIteratorUPP(DMModeListIteratorProc); wxASSERT(uppMLI); @@ -256,11 +431,13 @@ wxArrayVideoModes sModeInfo.pMatchMode = &mode; for (DMListIndexType i = 0; i < nNumModes; ++i) { - wxASSERT(DMGetIndexedDisplayModeFromList(pModes, i, NULL, - uppMLI, &sModeInfo) == noErr); + err = DMGetIndexedDisplayModeFromList(pModes, i, NULL, uppMLI, &sModeInfo); + wxASSERT(err == noErr); } DisposeDMDisplayModeListIteratorUPP(uppMLI); - wxASSERT(DMDisposeList(pModes) == noErr); + + err = DMDisposeList(pModes); + wxASSERT(err == noErr); } else //DM 1.0, 1.2, 1.x { @@ -289,11 +466,14 @@ wxVideoMode wxDisplay::GetCurrentMode() const DMListType pModes; DMDisplayModeListIteratorUPP uppMLI; DisplayIDType nDisplayID; + OSErr err; - wxASSERT(DMGetDisplayIDByGDevice(m_priv->m_hndl, &nDisplayID, false) == noErr); + err = DMGetDisplayIDByGDevice(m_priv->m_hndl, &nDisplayID, false); + wxASSERT(err == noErr); + //Create a new list... - wxASSERT_MSG(DMNewDisplayModeList(nDisplayID, NULL, NULL, &nNumModes, &pModes) == noErr, - wxT("Could not create a new display mode list") ); + err = DMNewDisplayModeList(nDisplayID, NULL, NULL, &nNumModes, &pModes); + wxASSERT_MSG(err == noErr, wxT("Could not create a new display mode list") ); uppMLI = NewDMDisplayModeListIteratorUPP(DMModeTransProc); wxASSERT(uppMLI); @@ -303,8 +483,8 @@ wxVideoMode wxDisplay::GetCurrentMode() const sModeInfo.psMode = &sMode; for (DMListIndexType i = 0; i < nNumModes; ++i) { - wxASSERT(DMGetIndexedDisplayModeFromList(pModes, i, NULL, - uppMLI, &sModeInfo) == noErr); + err = DMGetIndexedDisplayModeFromList(pModes, i, NULL, uppMLI, &sModeInfo); + wxASSERT(err == noErr); if ( sModeInfo.bMatched == true ) { @@ -314,7 +494,9 @@ wxVideoMode wxDisplay::GetCurrentMode() const } DisposeDMDisplayModeListIteratorUPP(uppMLI); - wxASSERT(DMDisposeList(pModes) == noErr); + + err = DMDisposeList(pModes); + wxASSERT(err == noErr); } else //Can't get current mode? { @@ -367,11 +549,14 @@ bool wxDisplay::ChangeMode(const wxVideoMode& mode) DMListType pModes; DMDisplayModeListIteratorUPP uppMLI; DisplayIDType nDisplayID; + OSErr err; - wxASSERT(DMGetDisplayIDByGDevice(m_priv->m_hndl, &nDisplayID, false) == noErr); + err = DMGetDisplayIDByGDevice(m_priv->m_hndl, &nDisplayID, false); + wxASSERT(err == noErr); + //Create a new list... - wxASSERT_MSG(DMNewDisplayModeList(nDisplayID, NULL, NULL, &nNumModes, &pModes) == noErr, - wxT("Could not create a new display mode list") ); + err = DMNewDisplayModeList(nDisplayID, NULL, NULL, &nNumModes, &pModes); + wxASSERT_MSG(err == noErr, wxT("Could not create a new display mode list") ); uppMLI = NewDMDisplayModeListIteratorUPP(DMModeInfoProc); wxASSERT(uppMLI); @@ -382,8 +567,9 @@ bool wxDisplay::ChangeMode(const wxVideoMode& mode) unsigned int i; for(i = 0; i < nNumModes; ++i) { - wxASSERT(DMGetIndexedDisplayModeFromList(pModes, i, NULL, - uppMLI, &sModeInfo) == noErr); + err = DMGetIndexedDisplayModeFromList(pModes, i, NULL, uppMLI, &sModeInfo); + wxASSERT(err == noErr); + if (sModeInfo.bMatched == true) { sMode = sModeInfo.sMode; @@ -394,7 +580,9 @@ bool wxDisplay::ChangeMode(const wxVideoMode& mode) return false; DisposeDMDisplayModeListIteratorUPP(uppMLI); - wxASSERT(DMDisposeList(pModes) == noErr); + + err = DMDisposeList(pModes); + wxASSERT(err == noErr); // For the really paranoid - // unsigned long flags; @@ -442,4 +630,6 @@ wxDisplay::~wxDisplay() } } +#endif // !OSX + #endif // wxUSE_DISPLAY