From 3de1bbc6356a1b2954e98d2d2553286f353cd23f Mon Sep 17 00:00:00 2001 From: Gregor Anich Date: Tue, 16 Nov 2004 16:29:21 +0000 Subject: [PATCH] Simple implementation of some multi-monitor APIs. svn path=/trunk/; revision=11677 --- reactos/iface/addsys/w32ksvc.db | 6 +- reactos/include/win32k/ntuser.h | 43 +++++++- reactos/lib/user32/misc/display.c | 143 +++++++++++++++++++++++++-- reactos/lib/user32/misc/stubs.c | 44 +-------- reactos/subsys/win32k/main/dllmain.c | 10 +- reactos/subsys/win32k/makefile | 9 +- reactos/subsys/win32k/ntuser/stubs.c | 15 +-- reactos/subsys/win32k/objects/dc.c | 8 +- reactos/subsys/win32k/w32k.h | 1 + 9 files changed, 203 insertions(+), 76 deletions(-) diff --git a/reactos/iface/addsys/w32ksvc.db b/reactos/iface/addsys/w32ksvc.db index 85b0b458beb..f821cb711bf 100644 --- a/reactos/iface/addsys/w32ksvc.db +++ b/reactos/iface/addsys/w32ksvc.db @@ -345,7 +345,7 @@ NtUserEndDeferWindowPosEx 2 NtUserEndMenu 0 NtUserEndPaint 2 NtUserEnumDisplayDevices 4 -NtUserEnumDisplayMonitors 4 +NtUserEnumDisplayMonitors 5 NtUserEnumDisplaySettings 4 NtUserEvent 1 NtUserExcludeUpdateRgn 2 @@ -399,6 +399,7 @@ NtUserGetMenuIndex 2 NtUserGetMenuItemRect 4 NtUserGetMessage 4 NtUserGetMinMaxInfo 3 +NtUserGetMonitorInfo 2 NtUserGetMouseMovePointsEx 5 NtUserGetObjectInformation 5 NtUserGetOpenClipboardWindow 0 @@ -443,6 +444,9 @@ NtUserMessageCall 7 NtUserMNDragLeave 0 NtUserMNDragOver 2 NtUserModifyUserStartupInfoFlags 2 +NtUserMonitorFromPoint 3 +NtUserMonitorFromRect 2 +NtUserMonitorFromWindow 2 NtUserMoveWindow 6 NtUserNotifyIMEStatus 3 NtUserNotifyWinEvent 4 diff --git a/reactos/include/win32k/ntuser.h b/reactos/include/win32k/ntuser.h index 479de5d7bd7..fbf8e8de6ef 100644 --- a/reactos/include/win32k/ntuser.h +++ b/reactos/include/win32k/ntuser.h @@ -489,13 +489,27 @@ NtUserEnumDisplayDevices ( PDISPLAY_DEVICE lpDisplayDevice, /* device information */ DWORD dwFlags ); /* reserved */ -BOOL +/*BOOL STDCALL NtUserEnumDisplayMonitors ( HDC hdc, LPCRECT lprcClip, MONITORENUMPROC lpfnEnum, - LPARAM dwData ); + LPARAM dwData );*/ + +#define MONITORINFOF_PRIMARY 1 +#define MONITOR_DEFAULTTONULL 0 +#define MONITOR_DEFAULTTOPRIMARY 1 +#define MONITOR_DEFAULTTONEAREST 2 +INT +STDCALL +NtUserEnumDisplayMonitors( + OPTIONAL IN HDC hDC, + OPTIONAL IN LPCRECT pRect, + OPTIONAL OUT HMONITOR *hMonitorList, + OPTIONAL OUT LPRECT monitorRectList, + OPTIONAL IN DWORD listSize ); + BOOL STDCALL @@ -762,6 +776,12 @@ NtUserGetMessage( UINT wMsgFilterMin, UINT wMsgFilterMax); +BOOL +STDCALL +NtUserGetMonitorInfo( + IN HMONITOR hMonitor, + OUT LPMONITORINFO pMonitorInfo); + DWORD STDCALL NtUserGetMouseMovePointsEx( @@ -996,6 +1016,25 @@ NtUserModifyUserStartupInfoFlags( DWORD Unknown0, DWORD Unknown1); +HMONITOR +STDCALL +NtUserMonitorFromPoint( + IN POINT point, + IN DWORD dwFlags); + +HMONITOR +STDCALL +NtUserMonitorFromRect( + IN LPCRECT pRect, + IN DWORD dwFlags); + +HMONITOR +STDCALL +NtUserMonitorFromWindow( + IN HWND hWnd, + IN DWORD dwFlags); + + BOOL STDCALL NtUserMoveWindow( diff --git a/reactos/lib/user32/misc/display.c b/reactos/lib/user32/misc/display.c index e2c9272efa8..5f58a480e18 100644 --- a/reactos/lib/user32/misc/display.c +++ b/reactos/lib/user32/misc/display.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: display.c,v 1.12 2004/08/15 21:36:28 chorns Exp $ +/* $Id: display.c,v 1.13 2004/11/16 16:27:48 blight Exp $ * * PROJECT: ReactOS user32.dll * FILE: lib/user32/misc/dde.c @@ -110,7 +110,63 @@ EnumDisplayMonitors( MONITORENUMPROC lpfnEnum, LPARAM dwData) { - return NtUserEnumDisplayMonitors ( hdc, lprcClip, lpfnEnum, dwData ); + INT iCount, i; + HMONITOR *hMonitorList; + LPRECT pRectList; + HANDLE hHeap; + + /* get list of monitors/rects */ + iCount = NtUserEnumDisplayMonitors(hdc, lprcClip, NULL, NULL, 0); + if (iCount < 0) + { + /* FIXME: SetLastError() */ + return FALSE; + } + if (iCount == 0) + { + return TRUE; + } + + hHeap = GetProcessHeap(); + hMonitorList = HeapAlloc(hHeap, 0, sizeof (HMONITOR) * iCount); + if (hMonitorList == NULL) + { + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + pRectList = HeapAlloc(hHeap, 0, sizeof (RECT) * iCount); + if (pRectList == NULL) + { + HeapFree(hHeap, 0, hMonitorList); + SetLastError(ERROR_NOT_ENOUGH_MEMORY); + return FALSE; + } + + iCount = NtUserEnumDisplayMonitors(hdc, lprcClip, hMonitorList, pRectList, iCount); + if (iCount <= 0) + { + /* FIXME: SetLastError() */ + return FALSE; + } + + /* enumerate list */ + for (i = 0; i < iCount; i++) + { + HMONITOR hMonitor = hMonitorList[i]; + LPRECT pMonitorRect = pRectList + i; + HDC hMonitorDC = NULL; + + if (hdc != NULL) + { + /* make monitor DC */ + hMonitorDC = hdc; + } + + if (!lpfnEnum(hMonitor, hMonitorDC, pMonitorRect, dwData)) + break; + } + + return TRUE; } @@ -156,7 +212,7 @@ EnumDisplaySettingsA( DWORD iModeNum, LPDEVMODEA lpDevMode) { - return EnumDisplaySettingsExA ( lpszDeviceName, iModeNum, lpDevMode, 0 ); + return EnumDisplaySettingsExA ( lpszDeviceName, iModeNum, lpDevMode, 0 ); } @@ -194,12 +250,12 @@ EnumDisplaySettingsW( DWORD iModeNum, LPDEVMODEW lpDevMode) { - return EnumDisplaySettingsExW ( lpszDeviceName, iModeNum, lpDevMode, 0 ); + return EnumDisplaySettingsExW ( lpszDeviceName, iModeNum, lpDevMode, 0 ); } /* - * @unimplemented + * @implemented */ BOOL STDCALL @@ -207,13 +263,42 @@ GetMonitorInfoA( HMONITOR hMonitor, LPMONITORINFO lpmi) { - UNIMPLEMENTED; - return FALSE; + if (lpmi->cbSize == sizeof (MONITORINFO)) + { + return NtUserGetMonitorInfo(hMonitor, lpmi); + } + else if (lpmi->cbSize != sizeof (MONITORINFOEXA)) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + else + { + MONITORINFOEXW miExW; + INT res; + + miExW.cbSize = sizeof (MONITORINFOEXW); + if (!NtUserGetMonitorInfo(hMonitor, (LPMONITORINFO)&miExW)) + { + return FALSE; + } + memcpy(lpmi, &miExW, sizeof (MONITORINFO)); + res = WideCharToMultiByte(CP_THREAD_ACP, 0, miExW.szDevice, -1, + ((LPMONITORINFOEXA)lpmi)->szDevice, CCHDEVICENAME, + NULL, NULL); + if (res == 0) + { + DPRINT("WideCharToMultiByte() failed!\n"); + return FALSE; + } + } + + return TRUE; } /* - * @unimplemented + * @implemented */ BOOL STDCALL @@ -221,8 +306,46 @@ GetMonitorInfoW( HMONITOR hMonitor, LPMONITORINFO lpmi) { - UNIMPLEMENTED; - return FALSE; + return NtUserGetMonitorInfo(hMonitor, lpmi); +} + + +/* + * @implemented + */ +HMONITOR +STDCALL +MonitorFromPoint( + IN POINT ptPoint, + IN DWORD dwFlags ) +{ + return NtUserMonitorFromPoint(ptPoint, dwFlags); +} + + +/* + * @implemented + */ +HMONITOR +STDCALL +MonitorFromRect( + IN LPCRECT lpcRect, + IN DWORD dwFlags ) +{ + return NtUserMonitorFromRect(lpcRect, dwFlags); +} + + +/* + * @implemented + */ +HMONITOR +STDCALL +MonitorFromWindow( + IN HWND hWnd, + IN DWORD dwFlags ) +{ + return NtUserMonitorFromWindow(hWnd, dwFlags); } diff --git a/reactos/lib/user32/misc/stubs.c b/reactos/lib/user32/misc/stubs.c index 763c88164b3..5de5bb0e74a 100644 --- a/reactos/lib/user32/misc/stubs.c +++ b/reactos/lib/user32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.67 2004/09/12 19:47:49 weiden Exp $ +/* $Id: stubs.c,v 1.68 2004/11/16 16:27:48 blight Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS user32.dll @@ -109,48 +109,6 @@ LockWorkStation(VOID) } -/* - * @unimplemented - */ -HMONITOR -STDCALL -MonitorFromPoint( - POINT pt, - DWORD dwFlags) -{ - UNIMPLEMENTED; - return (HMONITOR)0; -} - - -/* - * @unimplemented - */ -HMONITOR -STDCALL -MonitorFromRect( - LPRECT lprc, - DWORD dwFlags) -{ - UNIMPLEMENTED; - return (HMONITOR)0; -} - - -/* - * @unimplemented - */ -HMONITOR -STDCALL -MonitorFromWindow( - HWND hwnd, - DWORD dwFlags) -{ - UNIMPLEMENTED; - return (HMONITOR)0; -} - - /* * @unimplemented */ diff --git a/reactos/subsys/win32k/main/dllmain.c b/reactos/subsys/win32k/main/dllmain.c index e25c7eef8e9..f5b1c8c6ba7 100644 --- a/reactos/subsys/win32k/main/dllmain.c +++ b/reactos/subsys/win32k/main/dllmain.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dllmain.c,v 1.80 2004/09/28 15:02:30 weiden Exp $ +/* $Id: dllmain.c,v 1.81 2004/11/16 16:27:48 blight Exp $ * * Entry Point for win32k.sys */ @@ -104,6 +104,7 @@ Win32kProcessCallback (struct _EPROCESS *Process, IntRemoveProcessWndProcHandles((HANDLE)Process->UniqueProcessId); IntCleanupMenus(Process, Win32Process); IntCleanupCurIcons(Process, Win32Process); + CleanupMonitorImpl(); CleanupForProcess(Process, Process->UniqueProcessId); @@ -277,6 +278,13 @@ DllMain ( return(Status); } + Status = InitMonitorImpl(); + if (!NT_SUCCESS(Status)) + { + DbgPrint("Failed to initialize monitor implementation!\n"); + return STATUS_UNSUCCESSFUL; + } + Status = MsqInitializeImpl(); if (!NT_SUCCESS(Status)) { diff --git a/reactos/subsys/win32k/makefile b/reactos/subsys/win32k/makefile index 299ba7095c7..c05581712d4 100644 --- a/reactos/subsys/win32k/makefile +++ b/reactos/subsys/win32k/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.104 2004/10/20 20:51:21 chorns Exp $ +# $Id: makefile,v 1.105 2004/11/16 16:29:21 blight Exp $ PATH_TO_TOP = ../.. @@ -64,9 +64,10 @@ NTUSER_OBJECTS = ntuser/accelerator.o ntuser/callback.o ntuser/caret.o ntuser/cl ntuser/clipboard.o ntuser/csr.o ntuser/focus.o ntuser/desktop.o \ ntuser/guicheck.o ntuser/hook.o ntuser/hotkey.o ntuser/input.o \ ntuser/keyboard.o ntuser/menu.o ntuser/message.o ntuser/metric.o \ - ntuser/misc.o ntuser/msgqueue.o ntuser/painting.o ntuser/prop.o \ - ntuser/scrollbar.o ntuser/stubs.o ntuser/timer.o ntuser/useratom.o \ - ntuser/vis.o ntuser/windc.o ntuser/window.o ntuser/winpos.o ntuser/winsta.o + ntuser/misc.o ntuser/monitor.o ntuser/msgqueue.o ntuser/painting.o \ + ntuser/prop.o ntuser/scrollbar.o ntuser/stubs.o ntuser/timer.o \ + ntuser/useratom.o ntuser/vis.o ntuser/windc.o ntuser/window.o \ + ntuser/winpos.o ntuser/winsta.o OBJECTS_OBJECTS = objects/bitmaps.o objects/brush.o objects/cliprgn.o \ objects/color.o objects/coord.o objects/dc.o \ diff --git a/reactos/subsys/win32k/ntuser/stubs.c b/reactos/subsys/win32k/ntuser/stubs.c index 28a022e2c24..2ee05d3fb5e 100644 --- a/reactos/subsys/win32k/ntuser/stubs.c +++ b/reactos/subsys/win32k/ntuser/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.46 2004/08/03 19:55:57 blight Exp $ +/* $Id: stubs.c,v 1.47 2004/11/16 16:27:49 blight Exp $ * * COPYRIGHT: See COPYING in the top level directory * PROJECT: ReactOS kernel @@ -246,19 +246,6 @@ NtUserEnumDisplayDevices ( return 0; } -BOOL -STDCALL -NtUserEnumDisplayMonitors( - HDC hdc, - LPCRECT lprcClip, - MONITORENUMPROC lpfnEnum, - LPARAM dwData) -{ - UNIMPLEMENTED - - return 0; -} - DWORD STDCALL NtUserEvent( diff --git a/reactos/subsys/win32k/objects/dc.c b/reactos/subsys/win32k/objects/dc.c index e525934e42b..bccd3d1f164 100644 --- a/reactos/subsys/win32k/objects/dc.c +++ b/reactos/subsys/win32k/objects/dc.c @@ -16,7 +16,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* $Id: dc.c,v 1.146 2004/08/03 19:55:58 blight Exp $ +/* $Id: dc.c,v 1.147 2004/11/16 16:27:49 blight Exp $ * * DC.C - Device context functions * @@ -648,6 +648,9 @@ IntCreatePrimarySurface() continue; } + /* attach monitor */ + IntAttachMonitor(&PrimarySurface, DisplayNumber); + SurfObj = EngLockSurface((HSURF)PrimarySurface.Handle); SurfObj->dhpdev = PrimarySurface.PDev; SurfSize = SurfObj->sizlBitmap; @@ -664,6 +667,9 @@ IntDestroyPrimarySurface() { DRIVER_UnreferenceDriver(L"DISPLAY"); + /* detach monitor */ + IntDetachMonitor(&PrimarySurface); + /* * FIXME: Hide a mouse pointer there. Also because we have to prevent * memory leaks with the Eng* mouse routines. diff --git a/reactos/subsys/win32k/w32k.h b/reactos/subsys/win32k/w32k.h index 906b68ecb3e..10b6a2f7e87 100644 --- a/reactos/subsys/win32k/w32k.h +++ b/reactos/subsys/win32k/w32k.h @@ -50,6 +50,7 @@ #include #include #include +#include #include #include #include