wxVideoMode wxApp::GetDisplayMode() const { if ( !m_videoMode.IsOk() ) wxConstCast(this, wxApp)->m_videoMode = GetCurrentVideoMode(); return m_videoMode; }
Monitor::~Monitor() { if (GetCurrentVideoMode() != mOriginalVideoMode) SetVideoMode(mOriginalVideoMode); #if defined(FastOSLinux) XRRFreeCrtcInfo((XRRCrtcInfo*)mXRRCrtcInfo); #endif }
////////////////////////////////////////////////////////////////////////////////////////// // // CSettingsSA::SetValidVideoMode // // Set/validate the required video mode // ////////////////////////////////////////////////////////////////////////////////////////// void CSettingsSA::SetValidVideoMode( void ) { bool bValid = false; int iWidth, iHeight, iColorBits, iAdapterIndex; bool bAllowUnsafeResolutions = false; // First, try to get MTA saved info if ( !bValid ) { bValid = g_pCore->GetRequiredDisplayResolution( iWidth, iHeight, iColorBits, iAdapterIndex, bAllowUnsafeResolutions ); } // Otherwise deduce from GTA saved video mode if ( !bValid ) { SetAdapter( 0 ); uint numVidModes = GetNumVideoModes(); if ( VAR_SavedVideoMode > 0 && VAR_SavedVideoMode < numVidModes ) { VideoMode modeInfo; if ( GetVideoModeInfo( &modeInfo, VAR_SavedVideoMode ) ) { iWidth = modeInfo.width; iHeight = modeInfo.height; iColorBits = modeInfo.depth; iAdapterIndex = 0; bValid = true; } } } // Finally use default if ( !bValid ) { bValid = true; iWidth = 800; iHeight = 600; iColorBits = 32; iAdapterIndex = 0; } // Set adapter if ( (uint)iAdapterIndex >= GetNumAdapters() ) iAdapterIndex = 0; SetAdapter( iAdapterIndex ); // Save desktop resolution { m_iDesktopWidth = 800; m_iDesktopHeight = 600; VideoMode currentModeInfo; if ( GetVideoModeInfo( ¤tModeInfo, GetCurrentVideoMode() ) ) { m_iDesktopWidth = currentModeInfo.width; m_iDesktopHeight = currentModeInfo.height; } } // Handle 'unsafe' resolution stuff if ( IsUnsafeResolution( iWidth, iHeight ) ) { if ( bAllowUnsafeResolutions ) { // Confirm that res should be used SString strMessage = _("Are you sure you want to use this screen resolution?" ); strMessage += SString( "\n\n%d x %d", iWidth, iHeight ); if ( MessageBoxUTF8( NULL, strMessage, _("MTA: San Andreas"), MB_YESNO | MB_TOPMOST | MB_ICONQUESTION ) == IDNO ) bAllowUnsafeResolutions = false; } if ( !bAllowUnsafeResolutions ) { // Force down to desktop res if required iWidth = m_iDesktopWidth; iHeight = m_iDesktopHeight; } } // Ensure res is no smaller than 640 x 480 iWidth = Max( 640, iWidth ); iHeight = Max( 480, iHeight ); // Find mode number which best matches required settings uint uiUseVideoMode = FindVideoMode( iWidth, iHeight, iColorBits ); // Set for GTA to use VAR_CurVideoMode = uiUseVideoMode; VAR_SavedVideoMode = uiUseVideoMode; VAR_CurAdapter = iAdapterIndex; }
Monitor::Monitor(Display *display, Int id) : mDisplay(*display) { mID = id; mMacMonitorID = 0; #if defined(FastOSWindows) // Initialize DWORD mode = 0; DEVMODE dm; memset(&dm, 0, sizeof(DEVMODE)); dm.dmSize = sizeof(DEVMODE); // Get monitor info MonitorEnumData sed; sed.mMonitorID = mID; sed.mIndex = 0; EnumDisplayMonitors(0, 0, MonitorEnumNextMonitor, (LPARAM)&sed); if (mID >= sed.mIndex) Exception::Throw(kExceptionMonitorIDOutOfRange, String("[%s(%p, %d)]", FastFunctionName, display, mID)); mWin32DeviceName = sed.mMonitorInfo.szDevice; // Get available video modes while (EnumDisplaySettings(sed.mMonitorInfo.szDevice, mode++, &dm)) mVideoModeArray.Append(VideoMode(dm.dmPelsWidth, dm.dmPelsHeight, dm.dmBitsPerPel, dm.dmDisplayFrequency)); mBounds = Rectangle(sed.mMonitorInfo.rcMonitor.left, sed.mMonitorInfo.rcMonitor.top, sed.mMonitorInfo.rcMonitor.right - sed.mMonitorInfo.rcMonitor.left, sed.mMonitorInfo.rcMonitor.bottom - sed.mMonitorInfo.rcMonitor.top); #elif defined(FastOSLinux) XRRScreenResources *xrrScreenResources = (XRRScreenResources*)mDisplay->GetXRRScreenResources(); ::Display *xdisplay = (::Display*)mDisplay->GetXDisplay(); // Get monitor info mXRRCrtcInfo = (XRRCrtcInfo*)XRRGetCrtcInfo(xdisplay, xrrScreenResources, xrrScreenResources->crtcs[mID]); XRRCrtcInfo *xrrCrtcInfo = (XRRCrtcInfo*)mXRRCrtcInfo; if (!xrrCrtcInfo) Exception::Throw(kExceptionMonitorEnumerationFailure, String("[%s(%p, %d)]", FastFunctionName, display, mID)); // Enumerate outputs for (Int i = 0; i < xrrCrtcInfo->noutput; i++) { XRROutputInfo *xrrOutputInfo = XRRGetOutputInfo(xdisplay, xrrScreenResources, xrrCrtcInfo->outputs[i]); if (!xrrOutputInfo) Exception::Throw(kExceptionMonitorEnumerationFailure, String("[%s(%p, %d)]", FastFunctionName, display, mID)); // Enumerate video modes on output Int numModes = xrrOutputInfo->nmode; for (Int j = 0; j < numModes; j++) { RRMode mode = xrrOutputInfo->modes[j]; // Enumerate monitor's supported video modes for an ID match for (Int k = 0; k < xrrScreenResources->nmode; k++) { XRRModeInfo &xrrModeInfo = xrrScreenResources->modes[k]; if (mode == xrrModeInfo.id) { // Match found! Add to list of available video modes mVideoModeArray.Append(VideoMode(xrrModeInfo.width, xrrModeInfo.height, XDefaultDepth(xdisplay, mID), (Int)(xrrModeInfo.dotClock / (xrrModeInfo.hTotal * xrrModeInfo.vTotal)))); } } } XRRFreeOutputInfo(xrrOutputInfo); } mBounds = Rectangle(xrrCrtcInfo->x, xrrCrtcInfo->y, xrrCrtcInfo->width, xrrCrtcInfo->height); #elif defined(FastOSMacOSX) mMacMonitorID = QZGetDisplayID(mID); QZGetVideoModes(mMacMonitorID, &mVideoModeArray); QZGetMonitorRect(mMacMonitorID, &mBounds); #endif mOriginalVideoMode = GetCurrentVideoMode(); }
ErrorType Monitor::SetVideoMode(const VideoMode &videoMode) { if (GetCurrentVideoMode() == videoMode) return kErrorNone; #if defined(FastOSWindows) LONG cdsStatus; DEVMODE dm; memset(&dm, 0, sizeof(dm)); dm.dmSize = sizeof(dm); dm.dmBitsPerPel = videoMode.mBitsPerPixel; dm.dmPelsWidth = videoMode.mWidth; dm.dmPelsHeight = videoMode.mHeight; dm.dmDisplayFrequency = videoMode.mRefreshRate; dm.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT | DM_DISPLAYFREQUENCY; cdsStatus = ChangeDisplaySettingsEx( mWin32DeviceName.GetWString().mData, &dm, 0, CDS_FULLSCREEN, 0); if (DISP_CHANGE_SUCCESSFUL != cdsStatus) return Error::Throw(kErrorVideoModeSetFailure, String("[%s(%p): videoMode=(%dx%d:%dbpp@%dHz)]", FastFunctionName, &videoMode, videoMode.mWidth, videoMode.mHeight, videoMode.mBitsPerPixel, videoMode.mRefreshRate)); #elif defined(FastOSLinux) Status xrrStatus; XRRScreenResources *xrrScreenResources = (XRRScreenResources*)mDisplay->GetXRRScreenResources(); ::Display *xdisplay = (::Display*)mDisplay->GetXDisplay(); XRRCrtcInfo *xrrCrtcInfo = (XRRCrtcInfo*)mXRRCrtcInfo; // Find a matching video mode for (Int i = 0; i < xrrScreenResources->nmode; i++) { XRRModeInfo &xrrModeInfo = xrrScreenResources->modes[i]; if (xrrModeInfo.width == videoMode.mWidth && xrrModeInfo.height == videoMode.mHeight && (Int)(xrrModeInfo.dotClock / (xrrModeInfo.hTotal * xrrModeInfo.vTotal)) == videoMode.mRefreshRate) { // Match found! Now find the matching mode ID from our outputs for (Int j = 0; j < xrrCrtcInfo->noutput; j++) { XRROutputInfo *xrrOutputInfo = XRRGetOutputInfo( xdisplay, xrrScreenResources, xrrCrtcInfo->outputs[j]); for (Int k = 0; k < xrrOutputInfo->nmode; k++) { if (xrrOutputInfo->modes[k] == xrrModeInfo.id) { // ID match found! Set the mode xrrStatus = XRRSetCrtcConfig(xdisplay, xrrScreenResources, xrrScreenResources->crtcs[mID], CurrentTime, xrrCrtcInfo->x, xrrCrtcInfo->y, xrrModeInfo.id, xrrCrtcInfo->rotation, xrrCrtcInfo->outputs, xrrCrtcInfo->noutput); if (Success != xrrStatus) { XRRFreeOutputInfo(xrrOutputInfo); return Error::Throw(kErrorVideoModeSetFailure, String("[%s(%p): videoMode=(%dx%d:%dbpp@%dHz)]", FastFunctionName, &videoMode, videoMode.mWidth, videoMode.mHeight, videoMode.mBitsPerPixel, videoMode.mRefreshRate)); } } } XRRFreeOutputInfo(xrrOutputInfo); } } } XFlush(xdisplay); #elif defined(FastOSMacOSX) return QZSetVideoMode(mMacMonitorID, videoMode); #endif return kErrorNone; }