Author: akhaldi Date: Tue Dec 15 22:41:59 2015 New Revision: 70351
URL: http://svn.reactos.org/svn/reactos?rev=70351&view=rev Log: [0.4.0] * Apply the patch that allows us to dynamically change the resolution by resizing in VirtualBox. CORE-6742
Modified: branches/ros-branch-0_4_0/reactos/win32ss/gdi/eng/device.h branches/ros-branch-0_4_0/reactos/win32ss/gdi/eng/pdevobj.c branches/ros-branch-0_4_0/reactos/win32ss/user/ntuser/display.c
Modified: branches/ros-branch-0_4_0/reactos/win32ss/gdi/eng/device.h URL: http://svn.reactos.org/svn/reactos/branches/ros-branch-0_4_0/reactos/win32ss... ============================================================================== --- branches/ros-branch-0_4_0/reactos/win32ss/gdi/eng/device.h [iso-8859-1] (original) +++ branches/ros-branch-0_4_0/reactos/win32ss/gdi/eng/device.h [iso-8859-1] Tue Dec 15 22:41:59 2015 @@ -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_0/reactos/win32ss/gdi/eng/pdevobj.c URL: http://svn.reactos.org/svn/reactos/branches/ros-branch-0_4_0/reactos/win32ss... ============================================================================== --- branches/ros-branch-0_4_0/reactos/win32ss/gdi/eng/pdevobj.c [iso-8859-1] (original) +++ branches/ros-branch-0_4_0/reactos/win32ss/gdi/eng/pdevobj.c [iso-8859-1] Tue Dec 15 22:41:59 2015 @@ -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,8 +480,8 @@ ppdev->pfnMovePointer = EngMovePointer;
ppdev->pGraphicsDevice = pGraphicsDevice; - // Should we change the ative mode of pGraphicsDevice ? - ppdev->pdmwDev = PDEVOBJ_pdmMatchDevMode(ppdev, pdm) ; + // Should we change the active mode of pGraphicsDevice ? + ppdev->pdmwDev = PDEVOBJ_pdmMatchDevMode(ppdev, pdm);
/* FIXME! */ ppdev->flFlags = PDEV_DISPLAY;
Modified: branches/ros-branch-0_4_0/reactos/win32ss/user/ntuser/display.c URL: http://svn.reactos.org/svn/reactos/branches/ros-branch-0_4_0/reactos/win32ss... ============================================================================== --- branches/ros-branch-0_4_0/reactos/win32ss/user/ntuser/display.c [iso-8859-1] (original) +++ branches/ros-branch-0_4_0/reactos/win32ss/user/ntuser/display.c [iso-8859-1] Tue Dec 15 22:41:59 2015 @@ -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++)