Example #1
0
wxVideoMode wxApp::GetDisplayMode() const
{
    if ( !m_videoMode.IsOk() )
        wxConstCast(this, wxApp)->m_videoMode = GetCurrentVideoMode();

    return m_videoMode;
}
Example #2
0
Monitor::~Monitor() {
    if (GetCurrentVideoMode() != mOriginalVideoMode)
        SetVideoMode(mOriginalVideoMode);
#if defined(FastOSLinux)
    XRRFreeCrtcInfo((XRRCrtcInfo*)mXRRCrtcInfo);
#endif
}
Example #3
0
//////////////////////////////////////////////////////////////////////////////////////////
//
// 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( &currentModeInfo, 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;
}
Example #4
0
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();
}
Example #5
0
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;
}