wxDisplay for wxCocoa
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@29725 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -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_
|
||||||
|
@@ -111,6 +111,8 @@ protected:
|
|||||||
#include "wx/unix/displayx11.h"
|
#include "wx/unix/displayx11.h"
|
||||||
#elif defined(__WXX11__)
|
#elif defined(__WXX11__)
|
||||||
#include "wx/unix/displayx11.h"
|
#include "wx/unix/displayx11.h"
|
||||||
|
#elif defined(__WXCOCOA__)
|
||||||
|
#include "wx/cocoa/display.h"
|
||||||
#elif defined(__WXMAC__)
|
#elif defined(__WXMAC__)
|
||||||
#include "wx/mac/display.h"
|
#include "wx/mac/display.h"
|
||||||
#elif defined(__WXPM__)
|
#elif defined(__WXPM__)
|
||||||
|
@@ -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 <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// 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
|
||||||
|
@@ -22,12 +22,6 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
// Get size of display
|
|
||||||
size_t wxDisplayBase::GetCount()
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxDisplaySize(int *width, int *height)
|
void wxDisplaySize(int *width, int *height)
|
||||||
{
|
{
|
||||||
// TODO
|
// TODO
|
||||||
|
Reference in New Issue
Block a user