From ab4a29a81b0fa3eae51c53b92bbbe181e0f08d25 Mon Sep 17 00:00:00 2001 From: Timo Kreuzer Date: Wed, 12 Jan 2011 14:02:54 +0000 Subject: [PATCH] [WIN32K] Reset monitor size after mode switch. patch by rafalh See issue #5727 for more details. svn path=/trunk/; revision=50370 --- .../subsystems/win32/win32k/include/monitor.h | 1 + .../subsystems/win32/win32k/ntuser/display.c | 3 ++ .../subsystems/win32/win32k/ntuser/monitor.c | 45 +++++++++++++++++++ 3 files changed, 49 insertions(+) diff --git a/reactos/subsystems/win32/win32k/include/monitor.h b/reactos/subsystems/win32/win32k/include/monitor.h index 04a9a3ffc36..729f28d0a91 100644 --- a/reactos/subsystems/win32/win32k/include/monitor.h +++ b/reactos/subsystems/win32/win32k/include/monitor.h @@ -40,6 +40,7 @@ NTSTATUS CleanupMonitorImpl(); NTSTATUS IntAttachMonitor(PDEVOBJ *pGdiDevice, ULONG DisplayNumber); NTSTATUS IntDetachMonitor(PDEVOBJ *pGdiDevice); +NTSTATUS IntResetMonitorSize(IN PDEVOBJ *pGdiDevice); PMONITOR FASTCALL UserGetMonitorObject(IN HMONITOR); PMONITOR FASTCALL IntGetPrimaryMonitor(VOID); diff --git a/reactos/subsystems/win32/win32k/ntuser/display.c b/reactos/subsystems/win32/win32k/ntuser/display.c index ba549000951..7e0f25cf22d 100644 --- a/reactos/subsystems/win32/win32k/ntuser/display.c +++ b/reactos/subsystems/win32/win32k/ntuser/display.c @@ -765,6 +765,9 @@ UserChangeDisplaySettings( //IntvGetDeviceCaps(&PrimarySurface, &GdiHandleTable->DevCaps); + /* Set new size of the monitor */ + IntResetMonitorSize(ppdev); + /* Remove all cursor clipping */ UserClipCursor(NULL); diff --git a/reactos/subsystems/win32/win32k/ntuser/monitor.c b/reactos/subsystems/win32/win32k/ntuser/monitor.c index 9dd49ef08b8..d744d6ee563 100644 --- a/reactos/subsystems/win32/win32k/ntuser/monitor.c +++ b/reactos/subsystems/win32/win32k/ntuser/monitor.c @@ -246,6 +246,51 @@ IntDetachMonitor(IN PDEVOBJ *pGdiDevice) return STATUS_SUCCESS; } +/* IntResetMonitorSize + * + * Reset size of the monitor using atached device + * + * Arguments + * + * PMONITOR + * pGdiDevice Pointer to the PDEVOBJ, which size has changed + * + * Return value + * Returns a NTSTATUS + */ +NTSTATUS +IntResetMonitorSize(IN PDEVOBJ *pGdiDevice) +{ + PMONITOR Monitor; + + for (Monitor = gMonitorList; Monitor != NULL; Monitor = Monitor->Next) + { + if (Monitor->GdiDevice == pGdiDevice) + break; + } + + if (Monitor == NULL) + { + /* no monitor for given device found */ + return STATUS_INVALID_PARAMETER; + } + + Monitor->rcMonitor.left = 0; + Monitor->rcMonitor.top = 0; + Monitor->rcMonitor.right = Monitor->rcMonitor.left + Monitor->GdiDevice->gdiinfo.ulHorzRes; + Monitor->rcMonitor.bottom = Monitor->rcMonitor.top + Monitor->GdiDevice->gdiinfo.ulVertRes; + Monitor->rcWork = Monitor->rcMonitor; + + if (Monitor->hrgnMonitor) + REGION_FreeRgnByHandle(Monitor->hrgnMonitor); + + Monitor->hrgnMonitor = IntSysCreateRectRgnIndirect( &Monitor->rcMonitor ); + + IntGdiSetRegionOwner(Monitor->hrgnMonitor, GDI_OBJ_HMGR_PUBLIC); + + return STATUS_SUCCESS; +} + /* IntGetPrimaryMonitor * * Returns a PMONITOR for the primary monitor -- 2.17.1