]> git.saurik.com Git - wxWidgets.git/blobdiff - src/cocoa/display.mm
Handle the case of NSNotFound result properly.
[wxWidgets.git] / src / cocoa / display.mm
index 0d39a028a41c4434799386e0574d18e834442b5d..af4c6266c441f030d4be1dfda87188fbb9c70289 100644 (file)
@@ -2,7 +2,7 @@
 // Name:        src/cocoa/display.mm
 // Purpose:     Cocoa implementation of wxDisplay class
 // Author:      Ryan Norton
-// Modified by: 
+// Modified by:
 // Created:     2004-10-03
 // RCS-ID:      $Id$
 // Copyright:   (c) Ryan Norton
 
 #if wxUSE_DISPLAY
 
+#include "wx/display.h"
+
 #ifndef WX_PRECOMP
-   #include "wx/dynarray.h"
+    #include "wx/dynarray.h"
+    #include "wx/string.h"
+    #include "wx/gdicmn.h"
 #endif
 
-#include "wx/display.h"
-#include "wx/gdicmn.h"
-#include "wx/string.h"
+#include "wx/display_impl.h"
 
 #import <Foundation/Foundation.h>
 
 // ----------------------------------------------------------------------------
-// private classes
+// display classes implementation
 // ----------------------------------------------------------------------------
 
-size_t wxDisplayBase::GetCount()
+class wxDisplayImplMacOSX : public wxDisplayImpl
+{
+public:
+    wxDisplayImplMacOSX(unsigned n, CGDirectDisplayID id_)
+        : wxDisplayImpl(n),
+          m_id(id_)
+    {
+    }
+
+    virtual wxRect GetGeometry() const;
+    virtual wxString GetName() const { return wxString(); }
+
+    virtual wxArrayVideoModes GetModes(const wxVideoMode& mode) const;
+    virtual wxVideoMode GetCurrentMode() const;
+    virtual bool ChangeMode(const wxVideoMode& mode);
+
+private:
+    CGDirectDisplayID m_id;
+
+    wxDECLARE_NO_COPY_CLASS(wxDisplayImplMacOSX);
+};
+
+class wxDisplayFactoryMacOSX : public wxDisplayFactory
+{
+public:
+    wxDisplayFactoryMacOSX() { }
+
+    virtual wxDisplayImpl *CreateDisplay(unsigned n);
+    virtual unsigned GetCount();
+    virtual int GetFromPoint(const wxPoint& pt);
+
+protected:
+    wxDECLARE_NO_COPY_CLASS(wxDisplayFactoryMacOSX);
+};
+
+// ============================================================================
+// wxDisplayFactoryMacOSX implementation
+// ============================================================================
+
+unsigned wxDisplayFactoryMacOSX::GetCount()
 {
     CGDisplayCount count;
-#ifdef __WXDEBUG__
-    CGDisplayErr err = 
-#endif
-    CGGetActiveDisplayList(0, NULL, &count);
+    CGDisplayErr err = CGGetActiveDisplayList(0, NULL, &count);
+    wxCHECK_MSG( err != CGDisplayNoErr, 0, "CGGetActiveDisplayList() failed" );
 
-    wxASSERT(err == CGDisplayNoErr);
     return count;
 }
 
-int wxDisplayBase::GetFromPoint(const wxPoint &p)
-{   
+int wxDisplayFactoryMacOSX::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;
-    
+
+    int nWhich = wxNOT_FOUND;
+
     if (theCount)
     {
         theCount = GetCount();
@@ -60,61 +99,51 @@ int wxDisplayBase::GetFromPoint(const wxPoint &p)
         err = CGGetActiveDisplayList(theCount, theIDs, &theCount);
         wxASSERT(err == CGDisplayNoErr);
 
-        for(nWhich = 0; nWhich < (int) theCount; ++nWhich)
+        for (nWhich = 0; nWhich < (int) theCount; ++nWhich)
         {
-            if(theIDs[nWhich] == theID)
+            if (theIDs[nWhich] == theID)
                 break;
         }
-        
-        delete[] theIDs;
-        
-        if(nWhich == (int) theCount)
+
+        delete [] theIDs;
+
+        if (nWhich == (int) theCount)
         {
             wxFAIL_MSG(wxT("Failed to find display in display list"));
-            nWhich = -1;
+            nWhich = wxNOT_FOUND;
         }
     }
-    
+
     return nWhich;
-}//CFUserNotification[NSBundle bundleForClass:[self class]]
+}
 
-wxDisplay::wxDisplay(size_t index) : wxDisplayBase ( index )
+wxDisplayImpl *wxDisplayFactoryMacOSX::CreateDisplay(unsigned n)
 {
     CGDisplayCount theCount = GetCount();
     CGDirectDisplayID* theIDs = new CGDirectDisplayID[theCount];
-#ifdef __WXDEBUG__
-    CGDisplayErr err = 
-#endif
-    CGGetActiveDisplayList(theCount, theIDs, &theCount);
 
-    wxASSERT(err == CGDisplayNoErr);
-    wxASSERT(index < theCount);
-    
-    m_id = theIDs[index];
-    
-    delete[] theIDs;
+    CGDisplayErr err = CGGetActiveDisplayList(theCount, theIDs, &theCount);
+    wxCHECK_MSG( err != CGDisplayNoErr, NULL, "CGGetActiveDisplayList() failed" );
+
+    wxASSERT( n < theCount );
+
+    wxDisplayImplMacOSX *display = new wxDisplayImplMacOSX(n, theIDs[n]);
+
+    delete [] theIDs;
+
+    return display;
 }
 
-wxRect wxDisplay::GetGeometry() const
+
+wxRect wxDisplayImplMacOSX::GetGeometry() const
 {
     CGRect theRect = CGDisplayBounds(m_id);
-    return wxRect(     (int)theRect.origin.x,
+    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_id); //size_t
-}
-
-wxString wxDisplay::GetName() const
-{
-    // Macs don't name their displays...
-    return wxEmptyString;
-}
-
 static int wxCFDictKeyToInt( CFDictionaryRef desc, CFStringRef key )
 {
     CFNumberRef value;
@@ -126,40 +155,39 @@ static int wxCFDictKeyToInt( CFDictionaryRef desc, CFStringRef key )
     return num;
 }
 
-wxArrayVideoModes
-    wxDisplay::GetModes(const wxVideoMode& mode) const
+wxArrayVideoModes wxDisplayImplMacOSX::GetModes(const wxVideoMode& mode) const
 {
     wxArrayVideoModes Modes;
-    
+
     CFArrayRef theArray = CGDisplayAvailableModes(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
+wxVideoMode wxDisplayImplMacOSX::GetCurrentMode() const
 {
     CFDictionaryRef theValue = CGDisplayCurrentMode (m_id);
-    
+
     return wxVideoMode(wxCFDictKeyToInt(theValue, kCGDisplayWidth),
                             wxCFDictKeyToInt(theValue, kCGDisplayHeight),
                             wxCFDictKeyToInt(theValue, kCGDisplayBitsPerPixel),
                             wxCFDictKeyToInt(theValue, kCGDisplayRefreshRate));
 }
 
-bool wxDisplay::ChangeMode(const wxVideoMode& mode)
+bool wxDisplayImplMacOSX::ChangeMode(const wxVideoMode& mode)
 {
     //Changing to default mode (wxDefualtVideoMode) doesn't
     //work because we don't have access to the system's 'scrn'
@@ -173,17 +201,22 @@ bool wxDisplay::ChangeMode(const wxVideoMode& mode)
                                         (size_t)mode.h,
                                         (double)mode.refresh,
                                         &bExactMatch);
-    
+
     bool bOK = bExactMatch;
-    
+
     if(bOK)
         bOK = CGDisplaySwitchToMode(m_id, theCGMode) == CGDisplayNoErr;
 
     return bOK;
 }
 
-wxDisplay::~wxDisplay()
+// ============================================================================
+// wxDisplay::CreateFactory()
+// ============================================================================
+
+/* static */ wxDisplayFactory *wxDisplay::CreateFactory()
 {
+    return new wxDisplayFactoryMacOSX;
 }
 
 #endif // wxUSE_DISPLAY