From 51259762d5f470de93294f2dafa9ee72ec70d045 Mon Sep 17 00:00:00 2001 From: Ryan Norton Date: Fri, 8 Oct 2004 00:40:19 +0000 Subject: [PATCH] wxDisplay for wxCocoa git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29725 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/cocoa/display.h | 44 +++++++++ include/wx/display.h | 2 + src/cocoa/display.mm | 192 +++++++++++++++++++++++++++++++++++++ src/cocoa/utils.cpp | 6 -- 4 files changed, 238 insertions(+), 6 deletions(-) diff --git a/include/wx/cocoa/display.h b/include/wx/cocoa/display.h index 8b13789179..895d2be527 100644 --- a/include/wx/cocoa/display.h +++ b/include/wx/cocoa/display.h @@ -1 +1,45 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: include/wx/cocoa/display.h +// Purpose: wxDisplay class for wxCocoa +// Author: Ryan Norton +// Modified by: +// Created: 2004-10-03 +// RCS-ID: $Id$ +// Copyright: (c) Ryan Norton +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// +#ifndef _WX_COCOA_DISPLAY_H_ +#define _WX_COCOA_DISPLAY_H_ + +#include "wx/object.h" +#include "wx/display.h" + +class wxRect; +class wxString; + +class WXDLLEXPORT wxDisplay : public wxDisplayBase +{ +public: + wxDisplay ( size_t index = 0 ); + + ~wxDisplay(); + + virtual wxRect GetGeometry() const; + virtual int GetDepth() const; + virtual wxString GetName() const; + + virtual wxArrayVideoModes + GetModes(const wxVideoMode& mode = wxDefaultVideoMode) const; + + virtual wxVideoMode GetCurrentMode() const; + + virtual bool ChangeMode(const wxVideoMode& mode = wxDefaultVideoMode); + +private: + struct _CGDirectDisplayID * m_id; + + DECLARE_NO_COPY_CLASS(wxDisplay) +}; + +#endif // _WX_COCOA_DISPLAY_H_ diff --git a/include/wx/display.h b/include/wx/display.h index f81a57b18a..c080a21e2e 100644 --- a/include/wx/display.h +++ b/include/wx/display.h @@ -111,6 +111,8 @@ protected: #include "wx/unix/displayx11.h" #elif defined(__WXX11__) #include "wx/unix/displayx11.h" +#elif defined(__WXCOCOA__) + #include "wx/cocoa/display.h" #elif defined(__WXMAC__) #include "wx/mac/display.h" #elif defined(__WXPM__) diff --git a/src/cocoa/display.mm b/src/cocoa/display.mm index 8b13789179..5bfc26bef7 100644 --- a/src/cocoa/display.mm +++ b/src/cocoa/display.mm @@ -1 +1,193 @@ +///////////////////////////////////////////////////////////////////////////// +// Name: src/cocoa/display.cpp +// Purpose: Cocoa implementation of wxDisplay class +// Author: Ryan Norton +// Modified by: +// Created: 2004-10-03 +// RCS-ID: $Id$ +// Copyright: (c) wxWidgets team +// Licence: wxWindows licence +///////////////////////////////////////////////////////////////////////////// +#ifdef __GNUG__ + #pragma implementation "display.h" +#endif + +// For compilers that support precompilation, includes "wx.h". +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_DISPLAY + +#ifndef WX_PRECOMP + #include "wx/dynarray.h" +#endif + +#include "wx/display.h" +#include "wx/gdicmn.h" +#include "wx/string.h" + +#import + +// ---------------------------------------------------------------------------- +// private classes +// ---------------------------------------------------------------------------- + +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 ) +{ + 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; +} + +wxRect wxDisplay::GetGeometry() const +{ + CGRect theRect = CGDisplayBounds(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_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_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_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_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_id, theCGMode) == CGDisplayNoErr; + + return bOK; +} + +wxDisplay::~wxDisplay() +{ +} + +#endif // wxUSE_DISPLAY diff --git a/src/cocoa/utils.cpp b/src/cocoa/utils.cpp index ef9413bec6..0f59261522 100644 --- a/src/cocoa/utils.cpp +++ b/src/cocoa/utils.cpp @@ -22,12 +22,6 @@ #include #include -// Get size of display -size_t wxDisplayBase::GetCount() -{ - return 1; -} - void wxDisplaySize(int *width, int *height) { // TODO -- 2.47.2