Changeset 72611 in vbox for trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDispIf.cpp
- Timestamp:
- Jun 19, 2018 10:35:18 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/VBoxTray/VBoxDispIf.cpp
r72372 r72611 1700 1700 } 1701 1701 1702 BOOL vboxDispIfWddmResizeDisplayWin7(PCVBOXDISPIF const pIf, uint32_t cDispDef, const VMMDevDisplayDef *paDispDef)1702 BOOL VBoxDispIfResizeDisplayWin7(PCVBOXDISPIF const pIf, uint32_t cDispDef, const VMMDevDisplayDef *paDispDef) 1703 1703 { 1704 1704 const VMMDevDisplayDef* pDispDef; … … 1769 1769 pTgtMode = &DispCfg.pModeInfoArray[iTgtMode].targetMode; 1770 1770 1771 pSrcMode->width = 1772 pTgtMode->targetVideoSignalInfo.activeSize.cx = 1773 pTgtMode->targetVideoSignalInfo.totalSize.cx = pDispDef->cx; 1774 1775 pSrcMode->height = 1776 pTgtMode->targetVideoSignalInfo.activeSize.cy = 1777 pTgtMode->targetVideoSignalInfo.totalSize.cy = pDispDef->cy; 1778 1779 pSrcMode->position.x = pDispDef->xOrigin; 1780 pSrcMode->position.y = pDispDef->yOrigin; 1781 1782 switch (pDispDef->cBitsPerPixel) 1771 if (pDispDef->fDisplayFlags & VMMDEV_DISPLAY_CX) 1783 1772 { 1784 case 32: 1785 pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_32BPP; 1786 break; 1787 case 24: 1788 pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_24BPP; 1789 break; 1790 case 16: 1791 pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_16BPP; 1792 break; 1793 case 8: 1794 pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_8BPP; 1795 break; 1796 default: 1797 LogRel(("VBoxTray: (WDDM) invalid bpp %d, using 32bpp instead\n", pDispDef->cBitsPerPixel)); 1798 pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_32BPP; 1799 break; 1773 pSrcMode->width = 1774 pTgtMode->targetVideoSignalInfo.activeSize.cx = 1775 pTgtMode->targetVideoSignalInfo.totalSize.cx = pDispDef->cx; 1776 } 1777 1778 if (pDispDef->fDisplayFlags & VMMDEV_DISPLAY_CY) 1779 { 1780 pSrcMode->height = 1781 pTgtMode->targetVideoSignalInfo.activeSize.cy = 1782 pTgtMode->targetVideoSignalInfo.totalSize.cy = pDispDef->cy; 1783 } 1784 1785 if (pDispDef->fDisplayFlags & VMMDEV_DISPLAY_ORIGIN) 1786 { 1787 pSrcMode->position.x = pDispDef->xOrigin; 1788 pSrcMode->position.y = pDispDef->yOrigin; 1789 } 1790 1791 if (pDispDef->fDisplayFlags & VMMDEV_DISPLAY_BPP) 1792 { 1793 switch (pDispDef->cBitsPerPixel) 1794 { 1795 case 32: 1796 pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_32BPP; 1797 break; 1798 case 24: 1799 pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_24BPP; 1800 break; 1801 case 16: 1802 pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_16BPP; 1803 break; 1804 case 8: 1805 pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_8BPP; 1806 break; 1807 default: 1808 LogRel(("VBoxTray: (WDDM) invalid bpp %d, using 32bpp instead\n", pDispDef->cBitsPerPixel)); 1809 pSrcMode->pixelFormat = DISPLAYCONFIG_PIXELFORMAT_32BPP; 1810 break; 1811 } 1800 1812 } 1801 1813 } … … 1847 1859 else 1848 1860 { 1849 DispCfg.pPathInfoArray[i d].flags &= ~DISPLAYCONFIG_PATH_ACTIVE;1861 DispCfg.pPathInfoArray[iPath].flags &= ~DISPLAYCONFIG_PATH_ACTIVE; 1850 1862 } 1851 1863 } … … 1855 1867 if (winEr != ERROR_SUCCESS) 1856 1868 { 1857 WARN(("VBoxTray:(WDDM) pfnSetDisplayConfig Failed to validatewinEr %d.\n", winEr));1869 WARN(("VBoxTray:(WDDM) pfnSetDisplayConfig Failed to VALIDATE winEr %d.\n", winEr)); 1858 1870 fSetFlags |= SDC_ALLOW_CHANGES; 1859 1871 } … … 1862 1874 if (winEr != ERROR_SUCCESS) 1863 1875 { 1864 WARN(("VBoxTray:(WDDM) pfnSetDisplayConfig Failed to validate winEr %d.\n", winEr)); 1876 WARN(("VBoxTray:(WDDM) pfnSetDisplayConfig Failed to SET, winEr %d.\n", winEr)); 1877 1878 vboxDispIfWddmDcSettingsInvalidateModeIndeces(&DispCfg); 1879 winEr = vboxDispIfWddmDcSet(&DispCfg, SDC_TOPOLOGY_SUPPLIED | SDC_ALLOW_PATH_ORDER_CHANGES | SDC_APPLY); 1880 if (winEr != ERROR_SUCCESS) 1881 { 1882 WARN(("VBoxTray:(WDDM) pfnSetDisplayConfig Failed to APPLY TOPOLOGY ONLY, winEr %d.\n", winEr)); 1883 winEr = vboxDispIfWddmDcSet(&DispCfg, SDC_USE_SUPPLIED_DISPLAY_CONFIG | SDC_APPLY); 1884 if (winEr != ERROR_SUCCESS) 1885 { 1886 WARN(("VBoxTray:(WDDM) pfnSetDisplayConfig Failed to APPLY ANY TOPOLOGY, winEr %d.\n", winEr)); 1887 } 1888 } 1865 1889 } 1866 1890 1867 1891 vboxDispIfWddmDcTerm(&DispCfg); 1892 1893 return (winEr == ERROR_SUCCESS); 1894 } 1895 1896 BOOL VBoxDispIfResizeDisplayVista(PCVBOXDISPIF const pIf, uint32_t cDispDef, const VMMDevDisplayDef *paDispDef) 1897 { 1898 const VMMDevDisplayDef* pDispDef; 1899 VBOXDISPIF_OP Op; 1900 DWORD winEr = ERROR_SUCCESS; 1901 uint32_t id; 1902 DISPLAY_DEVICE *paDisplayDevices; 1903 DEVMODE *paDisplayModes; 1904 RECTL *paRects; 1905 DWORD DevNum = 0; 1906 DWORD DevPrimaryNum = 0; 1907 DWORD status; 1908 DISPLAY_DEVICE *pDev; 1909 DEVMODE *pMode; 1910 DWORD cDisplays; 1911 1912 // if (!pCtx->fAnyX) 1913 // Width &= 0xFFF8; 1914 1915 cDisplays = VBoxDisplayGetCount(); 1916 1917 paDisplayDevices = (DISPLAY_DEVICE *)alloca(sizeof(DISPLAY_DEVICE) * cDisplays); 1918 paDisplayModes = (DEVMODE *)alloca(sizeof(DEVMODE) * cDisplays); 1919 paRects = (RECTL *)alloca(sizeof(RECTL) * cDisplays); 1920 1921 status = VBoxDisplayGetConfig(cDisplays, &DevPrimaryNum, &DevNum, paDisplayDevices, paDisplayModes); 1922 if (status != NO_ERROR) 1923 { 1924 LogFlowFunc(("ResizeDisplayDevice: VBoxGetDisplayConfig failed, %d\n", status)); 1925 return FALSE; 1926 } 1927 1928 if (cDisplays != DevNum) 1929 LogFlowFunc(("ResizeDisplayDevice: NumDevices(%d) != DevNum(%d)\n", cDisplays, DevNum)); 1930 1931 if (cDisplays != cDispDef) 1932 { 1933 LogFlowFunc(("ResizeDisplayDevice: cDisplays(%d) != cModeHints(%d)\n", cDisplays, cDispDef)); 1934 return FALSE; 1935 } 1936 1937 vboxDispIfOpBegin(pIf, &Op); 1938 1939 for (id = 0; id < cDispDef; ++id) 1940 { 1941 pDispDef = &paDispDef[id]; 1942 1943 if (!(pDispDef->fDisplayFlags & VMMDEV_DISPLAY_DISABLED) && 1944 (pDispDef->fDisplayFlags | VMMDEV_DISPLAY_CX) || 1945 (pDispDef->fDisplayFlags | VMMDEV_DISPLAY_CY)) 1946 { 1947 RTRECTSIZE Size; 1948 1949 Size.cx = pDispDef->cx; 1950 Size.cy = pDispDef->cy; 1951 1952 vboxDispIfUpdateModesWDDM(&Op, id, &Size); 1953 } 1954 } 1955 1956 vboxDispIfOpEnd(&Op); 1957 1958 for (id = 0; id < cDispDef; id++) 1959 { 1960 DEVMODE tempDevMode; 1961 1962 ZeroMemory (&tempDevMode, sizeof (tempDevMode)); 1963 tempDevMode.dmSize = sizeof(DEVMODE); 1964 1965 EnumDisplaySettings((LPSTR)paDisplayDevices[id].DeviceName, 0xffffff, &tempDevMode); 1966 } 1967 1968 for (id = 0; id < cDispDef; ++id) 1969 { 1970 pDev = &paDisplayDevices[id]; 1971 pMode = &paDisplayModes[id]; 1972 pDispDef = &paDispDef[id]; 1973 1974 if (pDev->StateFlags & DISPLAY_DEVICE_ACTIVE) 1975 { 1976 if (!(pDispDef->fDisplayFlags & VMMDEV_DISPLAY_DISABLED)) 1977 { 1978 pMode->dmFields = 0; 1979 1980 if (pMode->dmPosition.x != pDispDef->xOrigin || pMode->dmPosition.y != pDispDef->yOrigin) 1981 { 1982 pMode->dmPosition.x = pDispDef->xOrigin; 1983 pMode->dmPosition.y = pDispDef->yOrigin; 1984 pMode->dmFields |= DM_POSITION; 1985 } 1986 1987 if (pMode->dmBitsPerPel != pDispDef->cBitsPerPixel) 1988 { 1989 pMode->dmBitsPerPel = pDispDef->cBitsPerPixel; 1990 pMode->dmFields |= DM_BITSPERPEL; 1991 } 1992 1993 if (pMode->dmPelsWidth != pDispDef->cx) 1994 { 1995 pMode->dmPelsWidth = pDispDef->cx; 1996 pMode->dmFields |= DM_PELSWIDTH; 1997 } 1998 1999 if (pMode->dmPelsHeight != pDispDef->cy) 2000 { 2001 pMode->dmPelsHeight = pDispDef->cy; 2002 pMode->dmFields |= DM_PELSHEIGHT; 2003 } 2004 2005 if (pMode->dmFields) 2006 status = pIf->modeData.wddm.pfnChangeDisplaySettingsEx((LPSTR)pDev->DeviceName, pMode, NULL, CDS_NORESET | CDS_UPDATEREGISTRY, NULL); 2007 } 2008 else 2009 { 2010 DEVMODE tmpDevMode; 2011 2012 ZeroMemory(&tmpDevMode, sizeof(DEVMODE)); 2013 tmpDevMode.dmSize = sizeof(DEVMODE); 2014 tmpDevMode.dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_POSITION | DM_DISPLAYFREQUENCY | DM_DISPLAYFLAGS; 2015 2016 status = pIf->modeData.wddm.pfnChangeDisplaySettingsEx(pDev->DeviceName, &tmpDevMode, NULL, CDS_UPDATEREGISTRY | CDS_NORESET, NULL); 2017 } 2018 } 2019 else 2020 { 2021 pMode->dmFields = DM_PELSWIDTH | DM_PELSHEIGHT | DM_BITSPERPEL | DM_POSITION | DM_DISPLAYFREQUENCY | DM_DISPLAYFLAGS; 2022 2023 pMode->dmPosition.x = pDispDef->xOrigin; 2024 pMode->dmPosition.y = pDispDef->yOrigin; 2025 pMode->dmBitsPerPel = pDispDef->cBitsPerPixel; 2026 pMode->dmPelsWidth = pDispDef->cx; 2027 pMode->dmPelsHeight = pDispDef->cy; 2028 2029 status = pIf->modeData.wddm.pfnChangeDisplaySettingsEx((LPSTR)pDev->DeviceName, pMode, NULL, CDS_NORESET | CDS_UPDATEREGISTRY, NULL); 2030 } 2031 } 2032 2033 pIf->modeData.wddm.pfnChangeDisplaySettingsEx(NULL, NULL, NULL, 0, NULL); 1868 2034 1869 2035 return (winEr == ERROR_SUCCESS);
Note:
See TracChangeset
for help on using the changeset viewer.