VirtualBox

Changeset 72000 in vbox


Ignore:
Timestamp:
Apr 24, 2018 9:08:58 AM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
122260
Message:

WDDM/VBoxTray: bugref:8444, updating all guest monitors 'at once' implemented

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDispIf.cpp

    r71860 r72000  
    9898static DWORD vboxDispIfWddmResizeDisplay(PCVBOXDISPIF const pIf, UINT Id, BOOL fEnable, DISPLAY_DEVICE * paDisplayDevices,
    9999                                         DEVMODE *paDeviceModes, UINT devModes);
     100
     101static DWORD vboxDispIfWddmResizeDisplay2(PCVBOXDISPIF const pIf, DISPLAY_DEVICE *paDisplayDevices, DEVMODE *paDeviceModes, UINT devModes);
     102
    100103static DWORD vboxDispIfResizePerform(PCVBOXDISPIF const pIf, UINT iChangedMode, BOOL fEnable, BOOL fExtDispSup,
    101104                                     DISPLAY_DEVICE *paDisplayDevices, DEVMODE *paDeviceModes, UINT cDevModes);
     
    14411444    if (pIf->enmMode > VBOXDISPIF_MODE_WDDM)
    14421445    {
    1443         winEr = vboxDispIfWddmResizeDisplay(pIf, iChangedMode, fEnable, paDisplayDevices, paDeviceModes, cDevModes);
     1446        if (fEnable)
     1447            paDisplayDevices[iChangedMode].StateFlags |= DISPLAY_DEVICE_ACTIVE;
     1448        else
     1449            paDisplayDevices[iChangedMode].StateFlags &= ~DISPLAY_DEVICE_ACTIVE;
     1450
     1451        winEr = vboxDispIfWddmResizeDisplay2(pIf, paDisplayDevices, paDeviceModes, cDevModes);
     1452
    14441453        if (winEr != NO_ERROR)
    14451454            WARN(("VBoxTray: (WDDM) Failed vboxDispIfWddmResizeDisplay winEr %d\n", winEr));
     
    16871696            WARN(("VBoxTray: (WDDM) Failed vboxDispIfWddmEnableDisplay mode winEr %d\n", winEr));
    16881697    }
     1698
     1699    return winEr;
     1700}
     1701
     1702static DWORD vboxDispIfWddmResizeDisplay2(PCVBOXDISPIF const pIf, DISPLAY_DEVICE *paDisplayDevices, DEVMODE *paDeviceModes, UINT devModes)
     1703{
     1704    RT_NOREF(pIf, paDeviceModes);
     1705    VBOXDISPIF_WDDM_DISPCFG DispCfg;
     1706    DWORD winEr = ERROR_SUCCESS;
     1707    UINT idx;
     1708    int iPath;
     1709
     1710    winEr = vboxDispIfWddmDcCreate(&DispCfg, QDC_ALL_PATHS);
     1711
     1712    if (winEr != ERROR_SUCCESS)
     1713    {   
     1714        WARN(("VBoxTray: (WDDM) Failed vboxDispIfWddmDcCreate\n"));
     1715        return winEr;
     1716    }
     1717
     1718    for (idx = 0; idx < devModes; idx++)
     1719    {
     1720        DEVMODE *pDeviceMode = &paDeviceModes[idx];
     1721
     1722        if (paDisplayDevices[idx].StateFlags & DISPLAY_DEVICE_ACTIVE)
     1723        {
     1724            DISPLAYCONFIG_PATH_INFO *pPathInfo;
     1725
     1726            iPath = vboxDispIfWddmDcSearchPath(&DispCfg, idx, idx);
     1727
     1728            if (iPath < 0)
     1729            {
     1730                WARN(("VBoxTray:(WDDM) Unexpected iPath(%d) between src(%d) and tgt(%d)\n", iPath, idx, idx));
     1731                continue;
     1732            }
     1733
     1734            pPathInfo = &DispCfg.pPathInfoArray[iPath];
     1735
     1736            if (pPathInfo->flags & DISPLAYCONFIG_PATH_ACTIVE)
     1737            {
     1738                UINT iSrcMode, iTgtMode;
     1739                DISPLAYCONFIG_SOURCE_MODE *pSrcMode;
     1740                DISPLAYCONFIG_TARGET_MODE *pTgtMode;
     1741
     1742                iSrcMode = pPathInfo->sourceInfo.modeInfoIdx;
     1743                iTgtMode = pPathInfo->targetInfo.modeInfoIdx;
     1744
     1745                if (iSrcMode >= DispCfg.cModeInfoArray || iTgtMode >= DispCfg.cModeInfoArray)
     1746                {
     1747                    WARN(("VBoxTray:(WDDM) Unexpected iSrcMode(%d) and/or iTgtMode(%d)\n", iSrcMode, iTgtMode));
     1748                    continue;
     1749                }
     1750
     1751                pSrcMode = &DispCfg.pModeInfoArray[iSrcMode].sourceMode;
     1752                pTgtMode = &DispCfg.pModeInfoArray[iTgtMode].targetMode;
     1753
     1754                if (pDeviceMode->dmFields & DM_PELSWIDTH)
     1755                {
     1756                    pSrcMode->width = pDeviceMode->dmPelsWidth;
     1757                    pTgtMode->targetVideoSignalInfo.activeSize.cx = pDeviceMode->dmPelsWidth;
     1758                    pTgtMode->targetVideoSignalInfo.totalSize.cx  = pDeviceMode->dmPelsWidth;
     1759                }
     1760
     1761                if (pDeviceMode->dmFields & DM_PELSHEIGHT)
     1762                {
     1763                    pSrcMode->height = pDeviceMode->dmPelsHeight;
     1764                    pTgtMode->targetVideoSignalInfo.activeSize.cy = pDeviceMode->dmPelsHeight;
     1765                    pTgtMode->targetVideoSignalInfo.totalSize.cy  = pDeviceMode->dmPelsHeight;
     1766                }
     1767
     1768                if (pDeviceMode->dmFields & DM_POSITION)
     1769                {
     1770                    pSrcMode->position.x = pDeviceMode->dmPosition.x;
     1771                    pSrcMode->position.y = pDeviceMode->dmPosition.y;
     1772                }
     1773
     1774                if (pDeviceMode->dmFields & DM_BITSPERPEL)
     1775                {
     1776                    switch (pDeviceMode->dmBitsPerPel)
     1777                    {
     1778                    case 32:
     1779                        pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_32BPP;
     1780                        break;
     1781                    case 24:
     1782                        pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_24BPP;
     1783                        break;
     1784                    case 16:
     1785                        pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_16BPP;
     1786                        break;
     1787                    case 8:
     1788                        pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_8BPP;
     1789                        break;
     1790                    default:
     1791                        LogRel(("VBoxTray: (WDDM) invalid bpp %d, using 32bpp instead\n", pDeviceMode->dmBitsPerPel));
     1792                        pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_32BPP;
     1793                        break;
     1794                    }
     1795                }
     1796            }
     1797            else
     1798            {
     1799                DISPLAYCONFIG_MODE_INFO *pModeInfo, *pModeInfoNew;
     1800
     1801                pModeInfo = (DISPLAYCONFIG_MODE_INFO *)realloc(DispCfg.pModeInfoArray, (DispCfg.cModeInfoArray + 2) * sizeof(DISPLAYCONFIG_MODE_INFO));
     1802
     1803                if (!pModeInfo)
     1804                {
     1805                    WARN(("VBoxTray:(WDDM) Unable to re-allocate DispCfg.pModeInfoArray\n"));
     1806                    continue;
     1807                }
     1808
     1809                DispCfg.pModeInfoArray = pModeInfo;
     1810
     1811                *pPathInfo = DispCfg.pPathInfoArray[0];
     1812                pPathInfo->sourceInfo.id = idx;
     1813                pPathInfo->targetInfo.id = idx;
     1814
     1815                pModeInfoNew = &pModeInfo[DispCfg.cModeInfoArray];
     1816
     1817                pModeInfoNew->infoType = DISPLAYCONFIG_MODE_INFO_TYPE_SOURCE;
     1818                pModeInfoNew->id = idx;
     1819                pModeInfoNew->adapterId = pModeInfo[0].adapterId;
     1820                pModeInfoNew->sourceMode.width  = pDeviceMode->dmPelsWidth;
     1821                pModeInfoNew->sourceMode.height = pDeviceMode->dmPelsHeight;
     1822                pModeInfoNew->sourceMode.pixelFormat = DISPLAYCONFIG_PIXELFORMAT_32BPP;
     1823                pModeInfoNew->sourceMode.position.x = pDeviceMode->dmPosition.x;
     1824                pModeInfoNew->sourceMode.position.y = pDeviceMode->dmPosition.y;
     1825                pPathInfo->sourceInfo.modeInfoIdx = DispCfg.cModeInfoArray;
     1826
     1827                pModeInfoNew++;
     1828                pModeInfoNew->infoType = DISPLAYCONFIG_MODE_INFO_TYPE_TARGET;
     1829                pModeInfoNew->id = idx;
     1830                pModeInfoNew->adapterId = pModeInfo[0].adapterId;
     1831                pModeInfoNew->targetMode = pModeInfo[0].targetMode;
     1832                pModeInfoNew->targetMode.targetVideoSignalInfo.activeSize.cx = pDeviceMode->dmPelsWidth;
     1833                pModeInfoNew->targetMode.targetVideoSignalInfo.totalSize.cx  = pDeviceMode->dmPelsWidth;
     1834                pModeInfoNew->targetMode.targetVideoSignalInfo.activeSize.cy = pDeviceMode->dmPelsHeight;
     1835                pModeInfoNew->targetMode.targetVideoSignalInfo.totalSize.cy  = pDeviceMode->dmPelsHeight;
     1836                pPathInfo->targetInfo.modeInfoIdx = DispCfg.cModeInfoArray + 1;
     1837
     1838                DispCfg.cModeInfoArray += 2;
     1839            }
     1840        }
     1841        else
     1842        {
     1843            iPath = vboxDispIfWddmDcSearchActivePath(&DispCfg, idx, idx);
     1844
     1845            if (iPath >= 0)
     1846            {
     1847                DispCfg.pPathInfoArray[idx].flags &= ~DISPLAYCONFIG_PATH_ACTIVE;
     1848            }
     1849        }
     1850    }
     1851
     1852    UINT fSetFlags = SDC_USE_SUPPLIED_DISPLAY_CONFIG;
     1853    winEr = vboxDispIfWddmDcSet(&DispCfg, fSetFlags | SDC_VALIDATE);
     1854    if (winEr != ERROR_SUCCESS)
     1855    {
     1856        WARN(("VBoxTray:(WDDM) pfnSetDisplayConfig Failed to validate winEr %d.\n", winEr));
     1857        fSetFlags |= SDC_ALLOW_CHANGES;
     1858    }
     1859
     1860    winEr = vboxDispIfWddmDcSet(&DispCfg, fSetFlags | SDC_SAVE_TO_DATABASE | SDC_APPLY);
     1861    if (winEr != ERROR_SUCCESS)
     1862    {
     1863        WARN(("VBoxTray:(WDDM) pfnSetDisplayConfig Failed to validate winEr %d.\n", winEr));
     1864    }
     1865
     1866    vboxDispIfWddmDcTerm(&DispCfg);
    16891867
    16901868    return winEr;
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette