📄 display.cpp
字号:
};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);#define pDBI pInfo->displayModeDepthBlockInfo->depthVPBlock[i].depthVPBlock for (unsigned long i = 0; i < pInfo->displayModeDepthBlockInfo->depthBlockCount; ++i) { 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);#define pDBI pInfo->displayModeDepthBlockInfo->depthVPBlock[i].depthVPBlock for (unsigned long i = 0; i < pInfo->displayModeDepthBlockInfo->depthBlockCount; ++i) { 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;#define pDBI pInfo->displayModeDepthBlockInfo->depthVPBlock[i].depthVPBlock for (unsigned long i = 0; i < pInfo->displayModeDepthBlockInfo->depthBlockCount; ++i) { if (pInfoData->psMode->csData == pInfo->displayModeDepthBlockInfo->depthVPBlock[i].depthSwitchInfo->csData) { pInfoData->Mode = wxVideoMode( (int) pInfo->displayModeResolutionInfo->csHorizontalPixels, (int) pInfo->displayModeResolutionInfo->csVerticalLines, (int) pDBI->vpPixelSize, (int) Fix2Long(pInfo->displayModeResolutionInfo->csRefreshRate) ); pInfoData->bMatched = true; break; } }#undef pDBI}wxArrayVideoModes wxDisplayImplMac::GetModes(const wxVideoMode& mode) const{ wxArrayVideoModes Modes; unsigned long dwDMVer; // Check DM version == 2 // (for backward compatibility only - 7.5.3+ use 2.0) Gestalt( gestaltDisplayMgrVers, (long*) &dwDMVer ); if (dwDMVer >= 0x020000) { DMListIndexType nNumModes; DMListType pModes; DMDisplayModeListIteratorUPP uppMLI; DisplayIDType nDisplayID; OSErr err; err = DMGetDisplayIDByGDevice(m_hndl, &nDisplayID, false); verify_noerr( err ); // Create a new 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 ); DMModeIteratorRec sModeInfo; sModeInfo.pModes = &Modes; sModeInfo.pMatchMode = &mode; for (DMListIndexType i = 0; i < nNumModes; ++i) { err = DMGetIndexedDisplayModeFromList(pModes, i, NULL, uppMLI, &sModeInfo); verify_noerr( err ); } DisposeDMDisplayModeListIteratorUPP(uppMLI); err = DMDisposeList(pModes); verify_noerr( err ); } else // DM 1.0, 1.2, 1.x { wxLogSysError( wxString::Format( wxT("Display Manager Version %u Not Supported! Present? %s"), (unsigned int) dwDMVer / 0x10000, (dwDMVer & (1 << gestaltDisplayMgrPresent) ? wxT("Yes") : wxT("No")) ) ); } return Modes;}wxVideoMode wxDisplayImplMac::GetCurrentMode() const{ unsigned long dwDMVer; wxVideoMode RetMode; // Check DM version == 2 // (for backward compatibility only - 7.5.3+ use 2.0) Gestalt( gestaltDisplayMgrVers, (long*) &dwDMVer ); if (dwDMVer >= 0x020000) { VDSwitchInfoRec sMode; // Note: csMode member also contains the bit depth OSErr err; err = DMGetDisplayMode( m_hndl, &sMode ); if (err == noErr) { DMListIndexType nNumModes; DMListType pModes; DMDisplayModeListIteratorUPP uppMLI; DisplayIDType nDisplayID; err = DMGetDisplayIDByGDevice(m_hndl, &nDisplayID, false); verify_noerr( err ); // Create a new 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 ); DMModeTransRec sModeInfo; sModeInfo.bMatched = false; sModeInfo.psMode = &sMode; for (DMListIndexType i = 0; i < nNumModes; ++i) { err = DMGetIndexedDisplayModeFromList(pModes, i, NULL, uppMLI, &sModeInfo); verify_noerr( err ); if ( sModeInfo.bMatched ) { RetMode = sModeInfo.Mode; break; } } DisposeDMDisplayModeListIteratorUPP(uppMLI); err = DMDisposeList(pModes); verify_noerr( err ); } else // Can't get current mode? { wxLogSysError( wxString::Format( wxT("Couldn't obtain current display mode!!!\ndwDMVer:%u"), (unsigned int) dwDMVer)); } } else // DM ver 1 { wxLogSysError( wxString::Format( wxT("Display Manager Version %u Not Supported! Present? %s"), (unsigned int) dwDMVer / 0x10000, (dwDMVer & (1 << gestaltDisplayMgrPresent) ? wxT("Yes") : wxT("No")) ) ); } return RetMode;}bool wxDisplayImplMac::ChangeMode(const wxVideoMode& mode){ unsigned long dwDMVer; Gestalt( gestaltDisplayMgrVers, (long*)&dwDMVer ); if (GetCount() == 1 || dwDMVer >= 0x020000) { if (mode == wxDefaultVideoMode) { return true;#if 0//#ifndef __DARWIN__// Handle hDisplayState;// if (DMBeginConfigureDisplays(&hDisplayState) != noErr)// {// wxLogSysError(wxT("Could not lock display for display mode changing!"));// return false;// }//// wxASSERT( DMUseScreenPrefs(true, hDisplayState) == noErr);// DMEndConfigureDisplays(hDisplayState);// return true;//#else // hmmmmm....// return true;//#endif#endif } //0 & NULL for params 2 & 3 of DMSetVideoMode signal it to use defaults (current mode) //DM 2.0+ doesn't use params 2 & 3 of DMSetDisplayMode //so we have to use this icky structure VDSwitchInfoRec sMode; memset( &sMode, 0, sizeof(VDSwitchInfoRec) ); DMListIndexType nNumModes; DMListType pModes; DMDisplayModeListIteratorUPP uppMLI; DisplayIDType nDisplayID; OSErr err; err = DMGetDisplayIDByGDevice(m_hndl, &nDisplayID, false); verify_noerr( err ); // Create a new 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); DMModeInfoRec sModeInfo; sModeInfo.bMatched = false; sModeInfo.pMode = &mode; unsigned int i; for (i = 0; i < nNumModes; ++i) { err = DMGetIndexedDisplayModeFromList(pModes, i, NULL, uppMLI, &sModeInfo); verify_noerr( err ); if (sModeInfo.bMatched) { sMode = sModeInfo.sMode; break; } } if (i == nNumModes) return false; DisposeDMDisplayModeListIteratorUPP(uppMLI); err = DMDisposeList(pModes); verify_noerr( err ); // For the really paranoid - // unsigned long flags; // Boolean bok; // wxASSERT(noErr == DMCheckDisplayMode(m_hndl, sMode.csData, // sMode.csMode, &flags, NULL, &bok)); // wxASSERT(bok); Handle hDisplayState; if (DMBeginConfigureDisplays(&hDisplayState) != noErr) { wxLogSysError(wxT("Could not lock display for display mode changing!")); return false; } unsigned long dwBPP = (unsigned long) mode.bpp; err = DMSetDisplayMode( m_hndl, sMode.csData, (unsigned long*) &(dwBPP), NULL, //(unsigned long) &sMode hDisplayState ); if (err != noErr) { DMEndConfigureDisplays(hDisplayState); wxLogError(wxT("Could not set the display mode")); return false; } DMEndConfigureDisplays(hDisplayState); } else // DM 1.0, 1.2, 1.x { wxLogSysError( wxString::Format( wxT("Monitor gravitation not supported yet. dwDMVer:%u"), (unsigned int) dwDMVer)); return false; } return true;}// ============================================================================// wxDisplay::CreateFactory()// ============================================================================/* static */ wxDisplayFactory *wxDisplay::CreateFactory(){ return new wxDisplayFactoryMac;}#endif // !OSX#endif // wxUSE_DISPLAY
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -