Author: akhaldi Date: Tue May 3 20:01:28 2016 New Revision: 71249 URL: http://svn.reactos.org/svn/reactos?rev=71249&view=rev Log: [0.4.1] * Apply the patch that allows us to dynamically change the resolution by resizing in VirtualBox. CORE-6742
Modified: branches/ros-branch-0_4_1/reactos/win32ss/gdi/eng/device.h branches/ros-branch-0_4_1/reactos/win32ss/gdi/eng/pdevobj.c branches/ros-branch-0_4_1/reactos/win32ss/user/ntuser/display.c Modified: branches/ros-branch-0_4_1/reactos/win32ss/gdi/eng/device.h URL: http://svn.reactos.org/svn/reactos/branches/ros-branch-0_4_1/reactos/win32ss/gdi/eng/device.h?rev=71249&r1=71248&r2=71249&view=diff ============================================================================== --- branches/ros-branch-0_4_1/reactos/win32ss/gdi/eng/device.h [iso-8859-1] (original) +++ branches/ros-branch-0_4_1/reactos/win32ss/gdi/eng/device.h [iso-8859-1] Tue May 3 20:01:28 2016 @@ -2,6 +2,11 @@ #pragma once #define TAG_GDEV 'gdev' + +VOID +NTAPI +PDEVOBJ_vRefreshModeList( + PPDEVOBJ ppdev); extern PGRAPHICS_DEVICE gpPrimaryGraphicsDevice; extern PGRAPHICS_DEVICE gpVgaGraphicsDevice; Modified: branches/ros-branch-0_4_1/reactos/win32ss/gdi/eng/pdevobj.c URL: http://svn.reactos.org/svn/reactos/branches/ros-branch-0_4_1/reactos/win32ss/gdi/eng/pdevobj.c?rev=71249&r1=71248&r2=71249&view=diff ============================================================================== --- branches/ros-branch-0_4_1/reactos/win32ss/gdi/eng/pdevobj.c [iso-8859-1] (original) +++ branches/ros-branch-0_4_1/reactos/win32ss/gdi/eng/pdevobj.c [iso-8859-1] Tue May 3 20:01:28 2016 @@ -9,6 +9,8 @@ #include <win32k.h> #define NDEBUG #include <debug.h> + +DBG_DEFAULT_CHANNEL(UserDisplay); PPDEVOBJ gppdevPrimary = NULL; @@ -247,8 +249,109 @@ /* Increment reference count */ GDIOBJ_vReferenceObjectByPointer(&ppdev->pSurface->BaseObject); - DPRINT("PDEVOBJ_pSurface() returning %p\n", ppdev->pSurface); + TRACE("PDEVOBJ_pSurface() returning %p\n", ppdev->pSurface); return ppdev->pSurface; +} + +VOID +NTAPI +PDEVOBJ_vRefreshModeList( + PPDEVOBJ ppdev) +{ + PGRAPHICS_DEVICE pGraphicsDevice; + PDEVMODEENTRY pTmpDevModeList, pOldDevModeList; + PDEVMODEINFO pdminfo; + PDEVMODEW pdm, pdmEnd; + UINT cModes = 0; + UINT j = 0; + + /* Lock the PDEV */ + EngAcquireSemaphore(ppdev->hsemDevLock); + + pGraphicsDevice = ppdev->pGraphicsDevice; + + TRACE("Enter PDEVOBJ_vRefreshModeList('%ws'/'%ws')\n", + pGraphicsDevice->szNtDeviceName, + pGraphicsDevice->szWinDeviceName); + + pdminfo = LDEVOBJ_pdmiGetModes(ppdev->pldev, pGraphicsDevice->DeviceObject); + + if (!pdminfo || pdminfo->cbdevmode == 0) + { + ERR("Could not get an updated mode list for '%ls'\n", pGraphicsDevice->szWinDeviceName); + } + else + { + TRACE("Bingo! We've just got some (%lu) new modes for '%ls'.\n", pdminfo->cbdevmode/sizeof(DEVMODEW), pGraphicsDevice->szWinDeviceName); + + /* Loop all DEVMODEs */ + pdmEnd = (DEVMODEW*)((PCHAR)pdminfo->adevmode + pdminfo->cbdevmode); + for (pdm = pdminfo->adevmode; + (pdm + 1 <= pdmEnd) && (pdm->dmSize != 0); + pdm = (DEVMODEW*)((PCHAR)pdm + pdm->dmSize + pdm->dmDriverExtra)) + { + TRACE("mode %lu -- %lux%lux%lu (%lu hz)\n", cModes, pdminfo->adevmode[cModes].dmPelsWidth, + pdminfo->adevmode[cModes].dmPelsHeight, + pdminfo->adevmode[cModes].dmBitsPerPel, + pdminfo->adevmode[cModes].dmDisplayFrequency); + + /* Some drivers like the VBox driver don't fill the dmDeviceName + with the name of the display driver. So fix that here. */ + wcsncpy(pdminfo->adevmode[cModes].dmDeviceName, pGraphicsDevice->pDiplayDrivers, CCHDEVICENAME); + pdminfo->adevmode[cModes].dmDeviceName[CCHDEVICENAME - 1] = 0; + + /* Count this DEVMODE */ + cModes++; + } + + if (cModes == 0) + { + ERR("No valid devmodes returned by the driver on mode list refresh!\n"); + ExFreePoolWithTag(pdminfo, GDITAG_DEVMODE); + return; + } + + /* Allocate an index buffer early on, even before trying to change the graphics device struct */ + pTmpDevModeList = ExAllocatePoolWithTag(PagedPool, + cModes * sizeof(DEVMODEENTRY), + GDITAG_GDEVICE); + + if (!pTmpDevModeList) + { + ERR("Bummer! Not enough memory to alloc a new DevModeList\n"); + return; + } + + /* Save a reference to the old thing */ + pOldDevModeList = pGraphicsDevice->pDevModeList; + + /* Attach the new mode info and company to the device, + the GraphicsDevice could potentially use additional synchonisation mechanisms */ + pdminfo->pdmiNext = pGraphicsDevice->pdevmodeInfo; + pGraphicsDevice->pdevmodeInfo = pdminfo; + + pGraphicsDevice->cDevModes = cModes; + pGraphicsDevice->pDevModeList = pTmpDevModeList; + + /* Don't leak the previous DevModeList, please! */ + ExFreePoolWithTag(pOldDevModeList, GDITAG_GDEVICE); + + /* Loop through the DEVMODEs */ + for (pdm = pdminfo->adevmode; + (pdm + 1 <= pdmEnd) && (pdm->dmSize != 0); + pdm = (PDEVMODEW)((PCHAR)pdm + pdm->dmSize + pdm->dmDriverExtra)) + { + /* Initialize the entry */ + pGraphicsDevice->pDevModeList[j].dwFlags = 0; + pGraphicsDevice->pDevModeList[j].pdm = &pdminfo->adevmode[j]; + + j++; + } + + } + + /* Unlock PDEV */ + EngReleaseSemaphore(ppdev->hsemDevLock); } PDEVMODEW @@ -264,13 +367,32 @@ pGraphicsDevice = ppdev->pGraphicsDevice; + TRACE("looking for mode -- %lux%lux%lu (%lu hz) (%ls)\n", pdm->dmPelsWidth, + pdm->dmPelsHeight, + pdm->dmBitsPerPel, + pdm->dmDisplayFrequency, + pdm->dmDeviceName); + + for (i = 0; i < pGraphicsDevice->cDevModes; i++) + { + pdmCurrent = pGraphicsDevice->pDevModeList[i].pdm; + + TRACE("mode %lu -- %lux%lux%lu (%lu hz) (%ls)\n", i, pdmCurrent->dmPelsWidth, + pdmCurrent->dmPelsHeight, + pdmCurrent->dmBitsPerPel, + pdmCurrent->dmDisplayFrequency, + pdmCurrent->dmDeviceName); + } + + TRACE("---\n"); + for (i = 0; i < pGraphicsDevice->cDevModes; i++) { pdmCurrent = pGraphicsDevice->pDevModeList[i].pdm; /* Compare asked DEVMODE fields * Only compare those that are valid in both DEVMODE structs */ - dwFields = pdmCurrent->dmFields & pdm->dmFields ; + dwFields = pdmCurrent->dmFields & pdm->dmFields; /* For now, we only need those */ if ((dwFields & DM_BITSPERPEL) && @@ -282,6 +404,12 @@ if ((dwFields & DM_DISPLAYFREQUENCY) && (pdmCurrent->dmDisplayFrequency != pdm->dmDisplayFrequency)) continue; + TRACE("chosen mode %lu -- %lux%lux%lu (%lu hz) (%ls)\n", i, pdmCurrent->dmPelsWidth, + pdmCurrent->dmPelsHeight, + pdmCurrent->dmBitsPerPel, + pdmCurrent->dmDisplayFrequency, + pdmCurrent->dmDeviceName); + /* Match! Return the DEVMODE */ return pdmCurrent; } @@ -352,7 +480,7 @@ ppdev->pfnMovePointer = EngMovePointer; ppdev->pGraphicsDevice = pGraphicsDevice; - // Should we change the ative mode of pGraphicsDevice ? + // Should we change the active mode of pGraphicsDevice ? ppdev->pdmwDev = PDEVOBJ_pdmMatchDevMode(ppdev, pdm) ; /* FIXME! */ Modified: branches/ros-branch-0_4_1/reactos/win32ss/user/ntuser/display.c URL: http://svn.reactos.org/svn/reactos/branches/ros-branch-0_4_1/reactos/win32ss/user/ntuser/display.c?rev=71249&r1=71248&r2=71249&view=diff ============================================================================== --- branches/ros-branch-0_4_1/reactos/win32ss/user/ntuser/display.c [iso-8859-1] (original) +++ branches/ros-branch-0_4_1/reactos/win32ss/user/ntuser/display.c [iso-8859-1] Tue May 3 20:01:28 2016 @@ -462,22 +462,34 @@ PGRAPHICS_DEVICE pGraphicsDevice; PDEVMODEENTRY pdmentry; ULONG i, iFoundMode; + PPDEVOBJ ppdev; TRACE("Enter UserEnumDisplaySettings('%wZ', %lu)\n", pustrDevice, iModeNum); /* Ask GDI for the GRAPHICS_DEVICE */ pGraphicsDevice = EngpFindGraphicsDevice(pustrDevice, 0, 0); - - if (!pGraphicsDevice) + ppdev = EngpGetPDEV(pustrDevice); + + if (!pGraphicsDevice || !ppdev) { /* No device found */ ERR("No device found!\n"); return STATUS_UNSUCCESSFUL; } + /* let's politely ask the driver for an updated mode list, + just in case there's something new in there (vbox) */ + + PDEVOBJ_vRefreshModeList(ppdev); + PDEVOBJ_vRelease(ppdev); + + /* FIXME: maybe only refresh when iModeNum is bigger than cDevModes? */ if (iModeNum >= pGraphicsDevice->cDevModes) + { + ERR("STATUS_NO_MORE_ENTRIES!\n"); return STATUS_NO_MORE_ENTRIES; + } iFoundMode = 0; for (i = 0; i < pGraphicsDevice->cDevModes; i++)