📄 display.cpp
字号:
/////////////////////////////////////////////////////////////////////////////
// Name: src/mac/classic/display.cpp
// Purpose: Mac implementation of wxDisplay class
// Author: Brian Victor
// Modified by: Royce Mitchell III & Ryan Norton, Vadim Zeitlin
// Created: 06/21/02
// RCS-ID: $Id: display.cpp,v 1.9 2006/06/19 20:18:31 ABX Exp $
// Copyright: (c) wxWidgets team
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// ============================================================================
// declarations
// ============================================================================
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#if wxUSE_DISPLAY
#include "wx/display.h"
#ifndef WX_PRECOMP
#include "wx/dynarray.h"
#include "wx/log.h"
#include "wx/string.h"
#include "wx/gdicmn.h"
#endif
#ifdef __DARWIN__
#include <Carbon/Carbon.h>
#else
#include <Gestalt.h>
#include <Displays.h>
#include <Quickdraw.h>
#include <Video.h> //for VDSwitchInfoRec
#include <FixMath.h>
#endif
#include "wx/display_impl.h"
// ----------------------------------------------------------------------------
// display implementation classes
// ----------------------------------------------------------------------------
class wxDisplayImplMac : public wxDisplayImpl
{
public:
wxDisplayImplMac(size_t n, GDHandle hndl)
: wxDisplayImpl(n),
m_hndl(hndl)
{
}
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:
GDHandle m_hndl;
DECLARE_NO_COPY_CLASS(wxDisplayImplMac)
};
class wxDisplayFactoryMac : public wxDisplayFactory
{
public:
wxDisplayFactoryMac();
virtual wxDisplayImpl *CreateDisplay(size_t n);
virtual size_t GetCount();
virtual int GetFromPoint(const wxPoint& pt);
protected:
DECLARE_NO_COPY_CLASS(wxDisplayFactoryMac)
};
// ============================================================================
// wxDisplayFactoryMac implementation
// ============================================================================
size_t wxDisplayFactoryMac::GetCount()
{
size_t num = 0;
GDHandle hndl = DMGetFirstScreenDevice(true);
while(hndl)
{
num++;
hndl = DMGetNextScreenDevice(hndl, true);
}
return num;
}
int wxDisplayFactoryMac::GetFromPoint(const wxPoint &p)
{
size_t num = 0;
GDHandle hndl = DMGetFirstScreenDevice(true);
while(hndl)
{
Rect screenrect = (*hndl)->gdRect;
if (p.x >= screenrect.left &&
p.x <= screenrect.right &&
p.y >= screenrect.top &&
p.y <= screenrect.bottom)
{
return num;
}
num++;
hndl = DMGetNextScreenDevice(hndl, true);
}
return wxNOT_FOUND;
}
wxDisplayImpl *wxDisplayFactoryMac::CreateDisplay(size_t n)
{
size_t nOrig = n;
GDHandle hndl = DMGetFirstScreenDevice(true);
while(hndl)
{
if (n == 0)
{
return new wxDisplayImplMac(nOrig, hndl);
}
n--;
hndl = DMGetNextScreenDevice(hndl, true);
}
return NULL;
}
// ============================================================================
// wxDisplayImplMac implementation
// ============================================================================
wxRect wxDisplayImplMac::GetGeometry() const
{
Rect screenrect = (*m_hndl)->gdRect;
return wxRect(screenrect.left, screenrect.top,
screenrect.right - screenrect.left,
screenrect.bottom - screenrect.top);
}
struct DMModeIteratorRec
{
wxArrayVideoModes* pModes;
const wxVideoMode* pMatchMode;
};
pascal void DMModeListIteratorProc ( void* pData,
DMListIndexType nIndex,
DMDisplayModeListEntryPtr pInfo)
{
DMModeIteratorRec* pInfoData = (DMModeIteratorRec*) pData;
//Note that in testing the refresh rate is always 0 on my ibook - RN
int refresh = (int) Fix2Long(pInfo->displayModeResolutionInfo->csRefreshRate);
for(unsigned long i = 0; i < pInfo->displayModeDepthBlockInfo->depthBlockCount; ++i)
{
#define pDBI pInfo->displayModeDepthBlockInfo->depthVPBlock[i].depthVPBlock
if (wxVideoMode((int) pInfo->displayModeResolutionInfo->csHorizontalPixels,
(int) pInfo->displayModeResolutionInfo->csVerticalLines,
(int) pDBI->vpPixelSize,
refresh).Matches(*pInfoData->pMatchMode) )
{
pInfoData->pModes->Add(wxVideoMode((int) pInfo->displayModeResolutionInfo->csHorizontalPixels,
(int) pInfo->displayModeResolutionInfo->csVerticalLines,
(int) pDBI->vpPixelSize,
refresh));
}
#undef pDBI
}
}
struct DMModeInfoRec
{
const wxVideoMode* pMode;
VDSwitchInfoRec sMode;
bool bMatched;
};
pascal void DMModeInfoProc ( void* pData,
DMListIndexType nIndex,
DMDisplayModeListEntryPtr pInfo)
{
DMModeInfoRec* pInfoData = (DMModeInfoRec*) pData;
Fixed refresh = Long2Fix(pInfoData->pMode->refresh);
for(unsigned long i = 0; i < pInfo->displayModeDepthBlockInfo->depthBlockCount; ++i)
{
#define pDBI pInfo->displayModeDepthBlockInfo->depthVPBlock[i].depthVPBlock
if (pInfoData->pMode->w == (int&) pInfo->displayModeResolutionInfo->csHorizontalPixels &&
pInfoData->pMode->h == (int&) pInfo->displayModeResolutionInfo->csVerticalLines &&
pInfoData->pMode->bpp == (int) pDBI->vpPixelSize &&
refresh == pInfo->displayModeResolutionInfo->csRefreshRate)
{
memcpy(&pInfoData->sMode, pInfo->displayModeDepthBlockInfo->depthVPBlock[i].depthSwitchInfo,
sizeof(VDSwitchInfoRec));
pInfoData->sMode.csMode = pDBI->vpPixelSize;
pInfoData->bMatched = true;
break;
}
#undef pDBI
}
}
struct DMModeTransRec
{
wxVideoMode Mode;
const VDSwitchInfoRec* psMode;
bool bMatched;
};
pascal void DMModeTransProc ( void* pData,
DMListIndexType nIndex,
DMDisplayModeListEntryPtr pInfo)
{
DMModeTransRec* pInfoData = (DMModeTransRec*) pData;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -