ReactOS 0.4.17-dev-923-g4c9a150
winpos.h File Reference
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  _CVR
 
struct  _SMWP
 

Macros

#define GetSnapSetting(gspvmember)   (IsSnapEnabled() ? (gspv.gspvmember) : 0)
 

Typedefs

typedef struct _CVR CVR
 
typedef struct _CVR * PCVR
 
typedef struct _SMWP SMWP
 
typedef struct _SMWP * PSMWP
 

Functions

FORCEINLINE BOOL IntPtInWindow (PWND pwnd, INT x, INT y)
 
FORCEINLINE BOOL IntEqualRect (RECTL *lprc1, RECTL *lprc2)
 
BOOL FASTCALL ActivateOtherWindowMin (PWND)
 
UINT FASTCALL co_WinPosArrangeIconicWindows (PWND parent)
 
BOOL FASTCALL IntGetClientOrigin (PWND Window, LPPOINT Point)
 
LRESULT FASTCALL co_WinPosGetNonClientSize (PWND Window, RECTL *WindowRect, RECTL *ClientRect)
 
UINT FASTCALL co_WinPosGetMinMaxInfo (PWND Window, POINT *MaxSize, POINT *MaxPos, POINT *MinTrack, POINT *MaxTrack)
 
UINT FASTCALL co_WinPosMinMaximize (PWND WindowObject, UINT ShowFlag, RECTL *NewPos)
 
BOOLEAN FASTCALL co_WinPosSetWindowPos (PWND Wnd, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
 
BOOLEAN FASTCALL co_WinPosShowWindow (PWND Window, INT Cmd)
 
void FASTCALL co_WinPosSendSizeMove (PWND Window)
 
PWND APIENTRY co_WinPosWindowFromPoint (IN PWND ScopeWin, IN POINT *WinPoint, IN OUT USHORT *HitTest, IN BOOL Ignore)
 
VOID FASTCALL co_WinPosActivateOtherWindow (PWND)
 
PWND FASTCALL IntRealChildWindowFromPoint (PWND, LONG, LONG)
 
BOOL FASTCALL IntScreenToClient (PWND, LPPOINT)
 
BOOL FASTCALL IntClientToScreen (PWND, LPPOINT)
 
BOOL FASTCALL IntGetWindowRect (PWND, RECTL *)
 
BOOL UserHasWindowEdge (DWORD, DWORD)
 
VOID UserGetWindowBorders (DWORD, DWORD, SIZE *, BOOL)
 
UINT FASTCALL IntGetWindowSnapEdge (PWND Wnd)
 
VOID FASTCALL co_IntCalculateSnapPosition (PWND Wnd, UINT Edge, OUT RECT *Pos)
 
VOID FASTCALL co_IntSnapWindow (PWND Wnd, UINT Edge)
 
VOID FASTCALL IntSetSnapEdge (PWND Wnd, UINT Edge)
 
VOID FASTCALL IntSetSnapInfo (PWND Wnd, UINT Edge, IN const RECT *Pos OPTIONAL)
 
FORCEINLINE BOOL IsSnapEnabled (VOID)
 
FORCEINLINE VOID co_IntUnsnapWindow (PWND Wnd)
 
FORCEINLINE BOOLEAN IntIsWindowSnapped (PWND Wnd)
 
FORCEINLINE BOOLEAN IntIsSnapAllowedForWindow (PWND Wnd)
 

Macro Definition Documentation

◆ GetSnapSetting

#define GetSnapSetting (   gspvmember)    (IsSnapEnabled() ? (gspv.gspvmember) : 0)

Definition at line 80 of file winpos.h.

Typedef Documentation

◆ CVR

typedef struct _CVR CVR

◆ PCVR

typedef struct _CVR * PCVR

◆ PSMWP

typedef struct _SMWP * PSMWP

◆ SMWP

typedef struct _SMWP SMWP

Function Documentation

◆ ActivateOtherWindowMin()

BOOL FASTCALL ActivateOtherWindowMin ( PWND  Wnd)

Definition at line 285 of file winpos.c.

286{
287 BOOL ActivePrev, FindTopWnd;
288 PWND pWndTopMost, pWndChild, pWndSetActive, pWndTemp, pWndDesk;
291
292 //ERR("AOWM 1 %p\n", UserHMGetHandle(Wnd));
293 ActivePrev = (pti->MessageQueue->spwndActivePrev != NULL);
294 FindTopWnd = TRUE;
295
296 if ((pWndTopMost = IntGetLastTopMostWindow()))
297 pWndChild = pWndTopMost->spwndNext;
298 else
299 pWndChild = Wnd->spwndParent->spwndChild;
300
301 for (;;)
302 {
303 if ( ActivePrev )
304 pWndSetActive = pti->MessageQueue->spwndActivePrev;
305 else
306 pWndSetActive = pWndChild;
307
308 pWndTemp = NULL;
309
310 while(pWndSetActive)
311 {
312 if ( VerifyWnd(pWndSetActive) &&
313 !(pWndSetActive->ExStyle & WS_EX_NOACTIVATE) &&
314 (pWndSetActive->style & (WS_VISIBLE|WS_DISABLED)) == WS_VISIBLE &&
315 (!(pWndSetActive->style & WS_ICONIC) /* FIXME MinMax pos? */ ) )
316 {
317 if (!(pWndSetActive->ExStyle & WS_EX_TOOLWINDOW) )
318 {
319 UserRefObjectCo(pWndSetActive, &Ref);
320 //ERR("ActivateOtherWindowMin Set FG 1\n");
321 co_IntSetForegroundWindow(pWndSetActive);
322 UserDerefObjectCo(pWndSetActive);
323 //ERR("AOWM 2 Exit Good %p\n", UserHMGetHandle(pWndSetActive));
324 return TRUE;
325 }
326 if (!pWndTemp ) pWndTemp = pWndSetActive;
327 }
328 if ( ActivePrev )
329 {
330 ActivePrev = FALSE;
331 pWndSetActive = pWndChild;
332 }
333 else
334 pWndSetActive = pWndSetActive->spwndNext;
335 }
336
337 if ( !FindTopWnd ) break;
338 FindTopWnd = FALSE;
339
340 if ( pWndChild )
341 {
342 pWndChild = pWndChild->spwndParent->spwndChild;
343 continue;
344 }
345
346 if (!(pWndDesk = IntGetThreadDesktopWindow(pti)))
347 {
348 pWndChild = NULL;
349 continue;
350 }
351 pWndChild = pWndDesk->spwndChild;
352 }
353
354 if ((pWndSetActive = pWndTemp))
355 {
356 UserRefObjectCo(pWndSetActive, &Ref);
357 //ERR("ActivateOtherWindowMin Set FG 2\n");
358 co_IntSetForegroundWindow(pWndSetActive);
359 UserDerefObjectCo(pWndSetActive);
360 //ERR("AOWM 3 Exit Good %p\n", UserHMGetHandle(pWndSetActive));
361 return TRUE;
362 }
363 //ERR("AOWM 4 Bad\n");
364 return FALSE;
365}
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
BOOL FASTCALL co_IntSetForegroundWindow(PWND Window)
Definition: focus.c:1545
PWND FASTCALL IntGetLastTopMostWindow(VOID)
Definition: winpos.c:238
PTHREADINFO gptiCurrent
Definition: ntuser.c:15
static __inline VOID UserDerefObjectCo(PVOID obj)
Definition: object.h:44
static __inline VOID UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
Definition: object.h:28
#define WS_ICONIC
Definition: pedump.c:641
#define WS_VISIBLE
Definition: pedump.c:620
#define WS_DISABLED
Definition: pedump.c:621
#define WS_EX_NOACTIVATE
Definition: winuser.h:395
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
for(i=0;i< sizeof(testsuite)/sizeof(testsuite[0]);++i) ok(call_test(testsuite[i].func)
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:90
Definition: object.h:4
Definition: ntuser.h:698
DWORD ExStyle
Definition: ntuser.h:708
DWORD style
Definition: ntuser.h:710
struct _WND * spwndChild
Definition: ntuser.h:718
struct _WND * spwndNext
Definition: ntuser.h:715
struct _WND * spwndParent
Definition: ntuser.h:717
PWND FASTCALL IntGetThreadDesktopWindow(PTHREADINFO pti)
Definition: desktop.c:1387
PWND FASTCALL VerifyWnd(PWND pWnd)
Definition: window.c:88

Referenced by co_WinPosShowWindow(), and UserSetActiveWindow().

◆ co_IntCalculateSnapPosition()

VOID FASTCALL co_IntCalculateSnapPosition ( PWND  Wnd,
UINT  Edge,
OUT RECT *  Pos 
)

Definition at line 3952 of file winpos.c.

3953{
3954 POINT maxs, mint, maxt;
3955 UINT width, height;
3956 UserSystemParametersInfo(SPI_GETWORKAREA, 0, Pos, 0); /* FIXME: MultiMon of PWND */
3957
3958 co_WinPosGetMinMaxInfo(Wnd, &maxs, NULL, &mint, &maxt);
3959 width = Pos->right - Pos->left;
3960 width = min(min(max(width / 2, mint.x), maxt.x), width);
3961 height = Pos->bottom - Pos->top;
3962 height = min(max(height, mint.y), maxt.y);
3963
3964 switch (Edge)
3965 {
3966 case HTTOP: /* Maximized (Calculate RECT snap preview for SC_MOVE) */
3967 height = min(Pos->bottom - Pos->top, maxs.y);
3968 break;
3969 case HTLEFT:
3970 Pos->right = width;
3971 break;
3972 case HTRIGHT:
3973 Pos->left = Pos->right - width;
3974 break;
3975 default:
3976 ERR("Unexpected snap edge %#x\n", Edge);
3977 }
3978 Pos->bottom = Pos->top + height;
3979}
#define ERR(fmt,...)
Definition: precomp.h:57
ush Pos
Definition: deflate.h:92
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLint GLint GLsizei width
Definition: gl.h:1546
unsigned int UINT
Definition: sysinfo.c:13
#define min(a, b)
Definition: monoChain.cc:55
UINT FASTCALL co_WinPosGetMinMaxInfo(PWND Window, POINT *MaxSize, POINT *MaxPos, POINT *MinTrack, POINT *MaxTrack)
Definition: winpos.c:940
#define HTRIGHT
Definition: winuser.h:2525
#define HTTOP
Definition: winuser.h:2526
#define HTLEFT
Definition: winuser.h:2523
long y
Definition: dcommon.idl:24
long x
Definition: dcommon.idl:24
#define max(a, b)
Definition: svc.c:63
BOOL FASTCALL UserSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
Definition: sysparams.c:2137

Referenced by co_IntSnapWindow(), co_WinPosMinMaximize(), DefWndDoSizeMove(), and IntDefWindowProc().

◆ co_IntSnapWindow()

VOID FASTCALL co_IntSnapWindow ( PWND  Wnd,
UINT  Edge 
)

Definition at line 3982 of file winpos.c.

3983{
3984 RECT newPos;
3985 BOOLEAN wasSnapped = IntIsWindowSnapped(Wnd);
3986 UINT normal = !(Wnd->style & (WS_MAXIMIZE | WS_MINIMIZE));
3988 BOOLEAN hasRef = FALSE;
3989
3990 if (Edge == HTTOP)
3991 {
3993 return;
3994 }
3995 else if (Edge != HTNOWHERE)
3996 {
3997 UserRefObjectCo(Wnd, &ref);
3998 hasRef = TRUE;
3999 co_IntCalculateSnapPosition(Wnd, Edge, &newPos);
4000 IntSetSnapInfo(Wnd, Edge, (wasSnapped || !normal) ? NULL : &Wnd->rcWindow);
4001 }
4002 else if (wasSnapped)
4003 {
4004 if (!normal)
4005 {
4007 return;
4008 }
4009 newPos = Wnd->InternalPos.NormalRect; /* Copy RECT now before it is lost */
4011 }
4012 else
4013 {
4014 return; /* Already unsnapped, do nothing */
4015 }
4016
4017 TRACE("WindowSnap: %d->%d\n", IntGetWindowSnapEdge(Wnd), Edge);
4019 newPos.left,
4020 newPos.top,
4021 newPos.right - newPos.left,
4022 newPos.bottom - newPos.top,
4023 0);
4024 if (hasRef)
4025 UserDerefObjectCo(Wnd);
4026}
unsigned char BOOLEAN
Definition: actypes.h:127
#define UserHMGetHandle(obj)
Definition: ntuser.h:233
VOID FASTCALL IntSetSnapInfo(PWND Wnd, UINT Edge, IN const RECT *Pos OPTIONAL)
Definition: winpos.c:4054
BOOLEAN FASTCALL co_WinPosSetWindowPos(PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
Definition: winpos.c:1792
VOID FASTCALL co_IntCalculateSnapPosition(PWND Wnd, UINT Edge, OUT RECT *Pos)
Definition: winpos.c:3952
UINT FASTCALL IntGetWindowSnapEdge(PWND Wnd)
Definition: winpos.c:3944
VOID FASTCALL IntSetSnapEdge(PWND Wnd, UINT Edge)
Definition: winpos.c:4029
@ normal
Definition: optimize.h:166
#define WS_MAXIMIZE
Definition: pedump.c:623
#define WS_MINIMIZE
Definition: pedump.c:622
#define WM_SYSCOMMAND
Definition: winuser.h:1769
#define HWND_TOP
Definition: winuser.h:1218
#define HTNOWHERE
Definition: winuser.h:2510
#define SC_MAXIMIZE
Definition: winuser.h:2624
#define TRACE(s)
Definition: solgame.cpp:4
Definition: dcommon.idl:28
long bottom
Definition: dcommon.idl:29
long right
Definition: dcommon.idl:29
long left
Definition: dcommon.idl:29
long top
Definition: dcommon.idl:29
struct _WND::@6139 InternalPos
RECT rcWindow
Definition: ntuser.h:720
Definition: send.c:48
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1495
FORCEINLINE BOOLEAN IntIsWindowSnapped(PWND Wnd)
Definition: winpos.h:95

Referenced by co_IntUnsnapWindow(), DefWndDoSizeMove(), and IntDefWindowProc().

◆ co_IntUnsnapWindow()

FORCEINLINE VOID co_IntUnsnapWindow ( PWND  Wnd)

Definition at line 89 of file winpos.h.

90{
92}
VOID FASTCALL co_IntSnapWindow(PWND Wnd, UINT Edge)
Definition: winpos.c:3982

Referenced by IntDefWindowProc().

◆ co_WinPosActivateOtherWindow()

VOID FASTCALL co_WinPosActivateOtherWindow ( PWND  Wnd)

Definition at line 397 of file winpos.c.

398{
399 PWND WndTo = NULL;
401
402 ASSERT_REFS_CO(Wnd);
403
404 if (IntIsDesktopWindow(Wnd))
405 {
406 //ERR("WinPosActivateOtherWindow Set Focus Msg Q No window!\n");
408 return;
409 }
410
411 /* If this is popup window, try to activate the owner first. */
412 if ((Wnd->style & WS_POPUP) && (WndTo = Wnd->spwndOwner))
413 {
414 TRACE("WPAOW Popup with Owner\n");
415 WndTo = UserGetAncestor( WndTo, GA_ROOT );
416 if (can_activate_window(WndTo)) goto done;
417 }
418
419 /* Pick a next top-level window. */
420 /* FIXME: Search for non-tooltip windows first. */
421 WndTo = Wnd;
422 for (;;)
423 {
424 if (!(WndTo = WndTo->spwndNext)) break;
425 if (can_activate_window( WndTo )) goto done;
426 }
427
428 /*
429 Fixes wine win.c:test_SetParent last ShowWindow test after popup dies.
430 Check for previous active window to bring to top.
431 */
432 if (Wnd)
433 {
434 WndTo = Wnd->head.pti->MessageQueue->spwndActivePrev;
435 if (can_activate_window( WndTo )) goto done;
436 }
437
438 // Find any window to bring to top. Works Okay for wine since it does not see X11 windows.
439 WndTo = UserGetDesktopWindow();
440 if ((WndTo == NULL) || (WndTo->spwndChild == NULL))
441 {
442 //ERR("WinPosActivateOtherWindow No window!\n");
443 return;
444 }
445 WndTo = WndTo->spwndChild;
446 for (;;)
447 {
448 if (WndTo == Wnd)
449 {
450 WndTo = NULL;
451 break;
452 }
453 if (can_activate_window( WndTo )) goto done;
454 if (!(WndTo = WndTo->spwndNext)) break;
455 }
456
457done:
458 if (WndTo) UserRefObjectCo(WndTo, &Ref);
459
461 {
462 /* ReactOS can pass WndTo = NULL to co_IntSetForegroundWindow and returns FALSE. */
463 //ERR("WinPosActivateOtherWindow Set FG 0x%p hWnd %p\n", WndTo, WndTo ? UserHMGetHandle(WndTo) : NULL);
464 if (co_IntSetForegroundWindow(WndTo))
465 {
466 if (WndTo) UserDerefObjectCo(WndTo);
467 return;
468 }
469 }
470 //ERR("WinPosActivateOtherWindow Set Active 0x%p\n",WndTo);
471 if (!UserSetActiveWindow(WndTo)) /* Ok for WndTo to be NULL here */
472 {
473 //ERR("WPAOW SA 1\n");
475 }
476 if (WndTo) UserDerefObjectCo(WndTo);
477}
BOOL FASTCALL UserSetActiveWindow(_In_opt_ PWND Wnd)
Definition: focus.c:1258
PUSER_MESSAGE_QUEUE gpqForeground
Definition: focus.c:13
static BOOL FASTCALL can_activate_window(PWND Wnd OPTIONAL)
Definition: winpos.c:373
#define WS_POPUP
Definition: pedump.c:616
#define GA_ROOT
Definition: winuser.h:2893
struct _WND * spwndOwner
Definition: ntuser.h:719
THRDESKHEAD head
Definition: ntuser.h:699
PWND FASTCALL UserGetAncestor(PWND Wnd, UINT Type)
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
PWND FASTCALL UserGetDesktopWindow(VOID)
Definition: desktop.c:1413
VOID FASTCALL IntSetFocusMessageQueue(PUSER_MESSAGE_QUEUE NewQueue)
Definition: desktop.c:1347
#define IntIsDesktopWindow(WndObj)
Definition: window.h:25

Referenced by co_WinPosShowWindow(), IntForceMinimizeWindow(), IntSendDestroyMsg(), and UserSetActiveWindow().

◆ co_WinPosArrangeIconicWindows()

UINT FASTCALL co_WinPosArrangeIconicWindows ( PWND  parent)

Definition at line 737 of file winpos.c.

738{
739 RECTL rectParent;
740 PWND Child;
741 INT x, y, xspacing, yspacing, sx, sy;
742
744
745 IntGetClientRect( parent, &rectParent );
746 // FIXME: Support Minimize Metrics gspv.mm.iArrange.
747 // Default: ARW_BOTTOMLEFT
748 x = rectParent.left;
749 y = rectParent.bottom;
750
753
754 Child = parent->spwndChild;
755 while(Child)
756 {
757 if((Child->style & WS_MINIMIZE) != 0 )
758 {
760 UserRefObjectCo(Child, &Ref);
761
763 sy = y - yspacing - UserGetSystemMetrics(SM_CYBORDER);
764
765 Child->InternalPos.IconPos.x = sx;
766 Child->InternalPos.IconPos.y = sy;
767 Child->InternalPos.flags |= WPF_MININIT;
768
770
772
773 if (x <= rectParent.right - xspacing)
774 x += xspacing;
775 else
776 {
777 x = rectParent.left;
778 y -= yspacing;
779 }
780 }
781 Child = Child->spwndNext;
782 }
783 return yspacing;
784}
r parent
Definition: btrfs.c:3010
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define WPF_MININIT
Definition: ntuser.h:690
VOID FASTCALL IntGetClientRect(PWND Wnd, RECTL *Rect)
Definition: winpos.c:92
#define SM_CXMINIMIZED
Definition: winuser.h:1031
#define SWP_NOACTIVATE
Definition: winuser.h:1253
#define SM_CYMINIMIZED
Definition: winuser.h:1032
#define SWP_ASYNCWINDOWPOS
Definition: winuser.h:1264
#define SM_CYBORDER
Definition: winuser.h:976
#define SWP_NOCOPYBITS
Definition: winuser.h:1254
#define SM_CXBORDER
Definition: winuser.h:975
#define SWP_NOZORDER
Definition: winuser.h:1258
long bottom
Definition: polytest.cpp:53
long right
Definition: polytest.cpp:53
long left
Definition: polytest.cpp:53
int32_t INT
Definition: typedefs.h:58
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
Definition: wdffdo.h:536
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:209

Referenced by NtUserCallHwndLock().

◆ co_WinPosGetMinMaxInfo()

UINT FASTCALL co_WinPosGetMinMaxInfo ( PWND  Window,
POINT *  MaxSize,
POINT *  MaxPos,
POINT *  MinTrack,
POINT *  MaxTrack 
)

Definition at line 940 of file winpos.c.

942{
943 MINMAXINFO MinMax;
944 PMONITOR monitor;
945 INT xinc, yinc;
946 LONG style = Window->style;
947 LONG adjustedStyle;
948 LONG exstyle = Window->ExStyle;
949 RECT rc;
950 DWORD adjust;
951
953
954 /* Compute default values */
955
956 rc = Window->rcWindow;
957 MinMax.ptReserved.x = rc.left;
958 MinMax.ptReserved.y = rc.top;
959
960 if ((style & WS_CAPTION) == WS_CAPTION)
961 adjustedStyle = style & ~WS_BORDER; /* WS_CAPTION = WS_DLGFRAME | WS_BORDER */
962 else
963 adjustedStyle = style;
964
965 if (Window->spwndParent)
966 IntGetClientRect(Window->spwndParent, &rc);
967
968 adjust = IntGetWindowBorders(adjustedStyle, exstyle);
969
970 // Handle special case while maximized. CORE-15893
971 if ((adjustedStyle & WS_THICKFRAME) && !(adjustedStyle & WS_CHILD) && !(adjustedStyle & WS_MINIMIZE))
972 adjust += 1;
973
974 xinc = yinc = adjust;
975
976 if ((adjustedStyle & WS_THICKFRAME) && (adjustedStyle & WS_CHILD) && !(adjustedStyle & WS_MINIMIZE))
977 {
980 }
981
985
986 xinc = -rc.left;
987 yinc = -rc.top;
988
989 MinMax.ptMaxSize.x = rc.right - rc.left;
990 MinMax.ptMaxSize.y = rc.bottom - rc.top;
991 if (style & (WS_DLGFRAME | WS_BORDER))
992 {
995 }
996 else
997 {
998 MinMax.ptMinTrackSize.x = 2 * xinc;
999 MinMax.ptMinTrackSize.y = 2 * yinc;
1000 }
1003 MinMax.ptMaxPosition.x = -xinc;
1004 MinMax.ptMaxPosition.y = -yinc;
1005
1006 if (!EMPTYPOINT(Window->InternalPos.MaxPos)) MinMax.ptMaxPosition = Window->InternalPos.MaxPos;
1007
1009
1010 /* if the app didn't change the values, adapt them for the current monitor */
1011 if ((monitor = UserGetPrimaryMonitor()))
1012 {
1013 RECT rc_work;
1014
1015 rc_work = monitor->rcMonitor;
1016
1017 if (style & WS_MAXIMIZEBOX)
1018 {
1019 if ((style & WS_CAPTION) == WS_CAPTION || !(style & (WS_CHILD | WS_POPUP)))
1020 rc_work = monitor->rcWork;
1021 }
1022
1023 if (MinMax.ptMaxSize.x == UserGetSystemMetrics(SM_CXSCREEN) + 2 * xinc &&
1024 MinMax.ptMaxSize.y == UserGetSystemMetrics(SM_CYSCREEN) + 2 * yinc)
1025 {
1026 MinMax.ptMaxSize.x = (rc_work.right - rc_work.left) + 2 * xinc;
1027 MinMax.ptMaxSize.y = (rc_work.bottom - rc_work.top) + 2 * yinc;
1028 }
1029 if (MinMax.ptMaxPosition.x == -xinc && MinMax.ptMaxPosition.y == -yinc)
1030 {
1031 MinMax.ptMaxPosition.x = rc_work.left - xinc;
1032 MinMax.ptMaxPosition.y = rc_work.top - yinc;
1033 }
1034 if (MinMax.ptMaxSize.x >= (monitor->rcMonitor.right - monitor->rcMonitor.left) &&
1035 MinMax.ptMaxSize.y >= (monitor->rcMonitor.bottom - monitor->rcMonitor.top) )
1036 {
1038 }
1039 else
1040 Window->state &= ~WNDS_MAXIMIZESTOMONITOR;
1041 }
1042
1043
1044 MinMax.ptMaxTrackSize.x = max(MinMax.ptMaxTrackSize.x,
1045 MinMax.ptMinTrackSize.x);
1046 MinMax.ptMaxTrackSize.y = max(MinMax.ptMaxTrackSize.y,
1047 MinMax.ptMinTrackSize.y);
1048
1049 if (MaxSize)
1050 *MaxSize = MinMax.ptMaxSize;
1051 if (MaxPos)
1052 *MaxPos = MinMax.ptMaxPosition;
1053 if (MinTrack)
1054 *MinTrack = MinMax.ptMinTrackSize;
1055 if (MaxTrack)
1056 *MaxTrack = MinMax.ptMaxTrackSize;
1057
1058 return 0; // FIXME: What does it return? Wine returns MINMAXINFO.
1059}
unsigned long DWORD
Definition: ntddk_ex.h:95
#define WNDS_MAXIMIZESTOMONITOR
Definition: ntuser.h:639
LONG_PTR LPARAM
Definition: minwindef.h:175
#define EMPTYPOINT(pt)
Definition: winpos.c:29
DWORD IntGetWindowBorders(DWORD Style, DWORD ExStyle)
Definition: winpos.c:921
#define WS_CHILD
Definition: pedump.c:617
#define WS_CAPTION
Definition: pedump.c:624
#define WS_MAXIMIZEBOX
Definition: pedump.c:632
#define WS_BORDER
Definition: pedump.c:625
long LONG
Definition: pedump.c:60
#define WS_DLGFRAME
Definition: pedump.c:626
#define WS_THICKFRAME
Definition: pedump.c:630
#define SM_CYSCREEN
Definition: winuser.h:971
#define SM_CXMINTRACK
Definition: winuser.h:1008
#define SM_CXFRAME
Definition: winuser.h:1005
#define SM_CYFRAME
Definition: winuser.h:1007
#define SM_CXMAXTRACK
Definition: winuser.h:1033
#define WM_GETMINMAXINFO
Definition: winuser.h:1668
#define SM_CYMAXTRACK
Definition: winuser.h:1034
#define SM_CXDLGFRAME
Definition: winuser.h:977
#define SM_CYDLGFRAME
Definition: winuser.h:979
#define SM_CXSCREEN
Definition: winuser.h:970
#define SM_CYMINTRACK
Definition: winuser.h:1009
Definition: window.c:29
RECT rcWork
Definition: monitor.h:19
RECT rcMonitor
Definition: monitor.h:18
Definition: style.c:91
POINT ptMaxPosition
Definition: winuser.h:3737
POINT ptMaxSize
Definition: winuser.h:3736
POINT ptMinTrackSize
Definition: winuser.h:3738
POINT ptReserved
Definition: winuser.h:3735
POINT ptMaxTrackSize
Definition: winuser.h:3739
VOID FASTCALL RECTL_vInflateRect(_Inout_ RECTL *rect, _In_ INT dx, _In_ INT dy)
Definition: rect.c:101
PMONITOR NTAPI UserGetPrimaryMonitor(VOID)
Definition: monitor.c:102

Referenced by co_IntCalculateSnapPosition(), co_UserCreateWindowEx(), co_WinPosMinMaximize(), DefWndDoSizeMove(), and DefWndHandleWindowPosChanging().

◆ co_WinPosGetNonClientSize()

LRESULT FASTCALL co_WinPosGetNonClientSize ( PWND  Window,
RECTL *  WindowRect,
RECTL *  ClientRect 
)

◆ co_WinPosMinMaximize()

UINT FASTCALL co_WinPosMinMaximize ( PWND  WindowObject,
UINT  ShowFlag,
RECTL *  NewPos 
)

◆ co_WinPosSendSizeMove()

void FASTCALL co_WinPosSendSizeMove ( PWND  Window)

Definition at line 2416 of file winpos.c.

2417{
2418 RECTL Rect;
2419 LPARAM lParam;
2421
2422 IntGetClientRect(Wnd, &Rect);
2423 lParam = MAKELONG(Rect.right-Rect.left, Rect.bottom-Rect.top);
2424
2425 Wnd->state &= ~WNDS_SENDSIZEMOVEMSGS;
2426
2427 if (Wnd->style & WS_MAXIMIZE)
2428 {
2430 }
2431 else if (Wnd->style & WS_MINIMIZE)
2432 {
2434 lParam = 0;
2435 }
2436
2438
2439 if (UserIsDesktopWindow(Wnd->spwndParent))
2440 lParam = MAKELONG(Wnd->rcClient.left, Wnd->rcClient.top);
2441 else
2442 lParam = MAKELONG(Wnd->rcClient.left-Wnd->spwndParent->rcClient.left, Wnd->rcClient.top-Wnd->spwndParent->rcClient.top);
2443
2445
2447}
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:196
VOID FASTCALL IntEngWindowChanged(_In_ struct _WND *Window, _In_ FLONG flChanged)
UINT_PTR WPARAM
Definition: minwindef.h:174
#define WM_SIZE
Definition: winuser.h:1639
#define SIZE_MINIMIZED
Definition: winuser.h:2542
#define SIZE_MAXIMIZED
Definition: winuser.h:2543
#define WM_MOVE
Definition: winuser.h:1638
#define SIZE_RESTORED
Definition: winuser.h:2541
#define MAKELONG(a, b)
Definition: typedefs.h:249
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1763
#define WOC_RGN_CLIENT
Definition: winddi.h:1265

Referenced by co_UserCreateWindowEx(), and co_WinPosShowWindow().

◆ co_WinPosSetWindowPos()

BOOLEAN FASTCALL co_WinPosSetWindowPos ( PWND  Wnd,
HWND  WndInsertAfter,
INT  x,
INT  y,
INT  cx,
INT  cy,
UINT  flags 
)

Definition at line 1792 of file winpos.c.

1801{
1802 WINDOWPOS WinPos;
1803 RECTL NewWindowRect;
1804 RECTL NewClientRect;
1805 RECTL valid_rects[2];
1806 PREGION VisBefore = NULL;
1807 PREGION VisBeforeJustClient = NULL;
1808 PREGION VisAfter = NULL;
1810 ULONG WvrFlags = 0;
1811 RECTL OldWindowRect, OldClientRect;
1812 int RgnType;
1813 HDC Dc;
1815 PWND Ancestor;
1816 BOOL bPointerInWindow, PosChanged = FALSE;
1818
1820
1821 TRACE("pwnd %p, after %p, %d,%d (%dx%d), flags 0x%x\n",
1822 Window, WndInsertAfter, x, y, cx, cy, flags);
1823#if DBG
1824 dump_winpos_flags(flags);
1825#endif
1826
1827 /* FIXME: Get current active window from active queue. Why? since r2915. */
1828
1829 bPointerInWindow = IntPtInWindow(Window, gpsi->ptCursor.x, gpsi->ptCursor.y);
1830
1831 WinPos.hwnd = UserHMGetHandle(Window);
1832 WinPos.hwndInsertAfter = WndInsertAfter;
1833 WinPos.x = x;
1834 WinPos.y = y;
1835 WinPos.cx = cx;
1836 WinPos.cy = cy;
1837 WinPos.flags = flags;
1838
1839 if ( flags & SWP_ASYNCWINDOWPOS )
1840 {
1841 LRESULT lRes;
1843 if ( ppos )
1844 {
1845 WinPos.flags &= ~SWP_ASYNCWINDOWPOS; // Clear flag.
1846 *ppos = WinPos;
1847 /* Yes it's a pointer inside Win32k! */
1848 lRes = co_IntSendMessageNoWait( WinPos.hwnd, WM_ASYNC_SETWINDOWPOS, 0, (LPARAM)ppos);
1849 /* We handle this the same way as Event Hooks and Hooks. */
1850 if ( !lRes )
1851 {
1853 return FALSE;
1854 }
1855 return TRUE;
1856 }
1857 return FALSE;
1858 }
1859
1860 co_WinPosDoWinPosChanging(Window, &WinPos, &NewWindowRect, &NewClientRect);
1861
1862 /* Does the window still exist? */
1863 if (!IntIsWindow(WinPos.hwnd))
1864 {
1865 TRACE("WinPosSetWindowPos: Invalid handle 0x%p!\n",WinPos.hwnd);
1867 return FALSE;
1868 }
1869
1870 /* Fix up the flags. */
1871 if (!WinPosFixupFlags(&WinPos, Window))
1872 {
1873 // See Note.
1874 return TRUE;
1875 }
1876
1877 Ancestor = UserGetAncestor(Window, GA_PARENT);
1878 if ( (WinPos.flags & (SWP_NOZORDER | SWP_HIDEWINDOW | SWP_SHOWWINDOW)) != SWP_NOZORDER &&
1879 Ancestor && UserHMGetHandle(Ancestor) == IntGetDesktopWindow() )
1880 {
1882 }
1883
1884 if (!(WinPos.flags & SWP_NOREDRAW))
1885 {
1886 /* Compute the visible region before the window position is changed */
1887 if (!(WinPos.flags & SWP_SHOWWINDOW) &&
1888 (WinPos.flags & (SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER |
1891 {
1893 (Window->style & WS_CLIPSIBLINGS) ? TRUE : FALSE);
1894
1895 if ( VisBefore != NULL &&
1896 REGION_Complexity(VisBefore) == NULLREGION )
1897 {
1898 REGION_Delete(VisBefore);
1899 VisBefore = NULL;
1900 }
1901 else if(VisBefore)
1902 {
1903 REGION_bOffsetRgn(VisBefore, -Window->rcWindow.left, -Window->rcWindow.top);
1904 }
1905
1906 /* Calculate the non client area for resizes, as this is used in the copy region */
1907 if ((WinPos.flags & (SWP_NOSIZE | SWP_FRAMECHANGED)) != SWP_NOSIZE)
1908 {
1909 VisBeforeJustClient = VIS_ComputeVisibleRegion(Window, TRUE, FALSE,
1910 (Window->style & WS_CLIPSIBLINGS) ? TRUE : FALSE);
1911
1912 if ( VisBeforeJustClient != NULL &&
1913 REGION_Complexity(VisBeforeJustClient) == NULLREGION )
1914 {
1915 REGION_Delete(VisBeforeJustClient);
1916 VisBeforeJustClient = NULL;
1917 }
1918 else if(VisBeforeJustClient)
1919 {
1920 REGION_bOffsetRgn(VisBeforeJustClient, -Window->rcWindow.left, -Window->rcWindow.top);
1921 }
1922 }
1923 }
1924 }
1925
1927 if (Window->hrgnNewFrame)
1928 {
1929 SelectWindowRgn( Window, Window->hrgnNewFrame ); // Should be PSMWP->acvr->hrgnClip
1930 Window->hrgnNewFrame = NULL;
1931 }
1932
1933 WvrFlags = co_WinPosDoNCCALCSize(Window, &WinPos, &NewWindowRect, &NewClientRect, valid_rects);
1934
1935// ERR("co_WinPosDoNCCALCSize returned 0x%x\n valid dest: %d %d %d %d\n valid src : %d %d %d %d\n", WvrFlags,
1936// valid_rects[0].left,valid_rects[0].top,valid_rects[0].right,valid_rects[0].bottom,
1937// valid_rects[1].left,valid_rects[1].top,valid_rects[1].right,valid_rects[1].bottom);
1938
1939 /* Validate link windows. (also take into account shell window in hwndShellWindow) */
1940 if (!(WinPos.flags & SWP_NOZORDER) && WinPos.hwnd != UserGetShellWindow())
1941 {
1943 }
1944
1945 OldWindowRect = Window->rcWindow;
1946 OldClientRect = Window->rcClient;
1947
1948 if (NewClientRect.left != OldClientRect.left ||
1949 NewClientRect.top != OldClientRect.top)
1950 {
1951 // Move child window if their parent is moved. Keep Child window relative to Parent...
1953 NewClientRect.left - OldClientRect.left,
1954 NewClientRect.top - OldClientRect.top);
1955 PosChanged = TRUE;
1956 }
1957
1958 Window->rcWindow = NewWindowRect;
1959 Window->rcClient = NewClientRect;
1960
1961 /* erase parent when hiding or resizing child */
1962 if (WinPos.flags & SWP_HIDEWINDOW)
1963 {
1964 /* Clear the update region */
1966 NULL,
1967 0,
1969
1970 if (UserIsDesktopWindow(Window->spwndParent))
1972
1973 Window->style &= ~WS_VISIBLE; //IntSetStyle( Window, 0, WS_VISIBLE );
1974 Window->head.pti->cVisWindows--;
1976 }
1977 else if (WinPos.flags & SWP_SHOWWINDOW)
1978 {
1979 if (Window->style & WS_CHILD)
1980 {
1981 if ((Window->style & WS_POPUP) && (Window->ExStyle & WS_EX_APPWINDOW))
1982 {
1984 if (!(WinPos.flags & SWP_NOACTIVATE))
1986 }
1987 }
1988 else if ((Window->ExStyle & WS_EX_APPWINDOW) ||
1989 (!(Window->ExStyle & WS_EX_TOOLWINDOW) && !Window->spwndOwner &&
1990 (!Window->spwndParent || UserIsDesktopWindow(Window->spwndParent))))
1991 {
1993 {
1995 if (!(WinPos.flags & SWP_NOACTIVATE))
1997 }
1998 }
1999
2000 Window->style |= WS_VISIBLE; //IntSetStyle( Window, WS_VISIBLE, 0 );
2001 Window->head.pti->cVisWindows++;
2003 }
2004 else
2005 {
2007 }
2008
2009 if (Window->hrgnUpdate != NULL && Window->hrgnUpdate != HRGN_WINDOW)
2010 {
2011 NtGdiOffsetRgn(Window->hrgnUpdate,
2012 NewWindowRect.left - OldWindowRect.left,
2013 NewWindowRect.top - OldWindowRect.top);
2014 }
2015
2016 DceResetActiveDCEs(Window); // For WS_VISIBLE changes.
2017
2018 // Change or update, set send non-client paint flag.
2019 if ( Window->style & WS_VISIBLE &&
2020 (WinPos.flags & SWP_STATECHANGED || (!(Window->state2 & WNDS2_WIN31COMPAT) && WinPos.flags & SWP_NOREDRAW ) ) )
2021 {
2022 TRACE("Set WNDS_SENDNCPAINT %p\n",Window);
2023 Window->state |= WNDS_SENDNCPAINT;
2024 }
2025
2026 /*
2027 * Request a full non-client repaint when the frame geometry changes.
2028 * Otherwise, copied bits can retain parts of the old frame. CORE-20769.
2029 */
2030 if ((Window->style & WS_VISIBLE) &&
2031 ((WinPos.flags & SWP_FRAMECHANGED) ||
2032 (OldWindowRect.right - OldWindowRect.left) != (NewWindowRect.right - NewWindowRect.left) ||
2033 (OldWindowRect.bottom - OldWindowRect.top) != (NewWindowRect.bottom - NewWindowRect.top)))
2034 {
2035 Window->state |= WNDS_SENDNCPAINT;
2037 }
2038
2039 if ((!(WinPos.flags & SWP_NOREDRAW) && ((WinPos.flags & SWP_AGG_STATUSFLAGS) != SWP_AGG_NOPOSCHANGE)) ||
2040 ((WinPos.flags & SWP_NOZORDER) && (WinPos.flags & SWP_NOOWNERZORDER)))
2041 {
2042 /* Determine the new visible region */
2044 (Window->style & WS_CLIPSIBLINGS) ? TRUE : FALSE);
2045
2046 if ( VisAfter != NULL &&
2047 REGION_Complexity(VisAfter) == NULLREGION )
2048 {
2049 REGION_Delete(VisAfter);
2050 VisAfter = NULL;
2051 }
2052 else if(VisAfter)
2053 {
2054 /* Clip existing update region to new window size */
2055 if (Window->hrgnUpdate != NULL)
2056 {
2057 PREGION RgnUpdate = REGION_LockRgn(Window->hrgnUpdate);
2058 if (RgnUpdate)
2059 {
2060 RgnType = IntGdiCombineRgn(RgnUpdate, RgnUpdate, VisAfter, RGN_AND);
2061 REGION_UnlockRgn(RgnUpdate);
2062 }
2063 }
2064 REGION_bOffsetRgn(VisAfter, -Window->rcWindow.left, -Window->rcWindow.top);
2065 }
2066
2067 /*
2068 * Determine which pixels can be copied from the old window position
2069 * to the new. Those pixels must be visible in both the old and new
2070 * position. Also, check the class style to see if the windows of this
2071 * class need to be completely repainted on (horizontal/vertical) size
2072 * change.
2073 */
2074 if (VisBefore != NULL &&
2075 VisAfter != NULL &&
2076 !(WvrFlags & WVR_REDRAW) &&
2077 !(WinPos.flags & SWP_NOCOPYBITS) &&
2078 !(Window->ExStyle & WS_EX_TRANSPARENT))
2079 {
2080
2081 /*
2082 * If this is (also) a window resize, the whole nonclient area
2083 * needs to be repainted. So we limit the copy to the client area,
2084 * 'cause there is no use in copying it (would possibly cause
2085 * "flashing" too). However, if the copy region is already empty,
2086 * we don't have to crop (can't take anything away from an empty
2087 * region...)
2088 */
2089
2090 CopyRgn = IntSysCreateRectpRgn(0, 0, 0, 0);
2091 if ((WinPos.flags & SWP_NOSIZE) && (WinPos.flags & SWP_NOCLIENTSIZE))
2092 RgnType = IntGdiCombineRgn(CopyRgn, VisAfter, VisBefore, RGN_AND);
2093 else if (VisBeforeJustClient != NULL)
2094 {
2095 RgnType = IntGdiCombineRgn(CopyRgn, VisAfter, VisBeforeJustClient, RGN_AND);
2096 }
2097
2098 /* Now use in copying bits which are in the update region. */
2099 if (Window->hrgnUpdate != NULL)
2100 {
2101 PREGION RgnUpdate = REGION_LockRgn(Window->hrgnUpdate);
2102 if (RgnUpdate)
2103 {
2104 REGION_bOffsetRgn(CopyRgn, NewWindowRect.left, NewWindowRect.top);
2106 REGION_bOffsetRgn(CopyRgn, -NewWindowRect.left, -NewWindowRect.top);
2107 REGION_UnlockRgn(RgnUpdate);
2108 }
2109 }
2110
2111 /*
2112 * Now, get the bounding box of the copy region. If it's empty
2113 * there's nothing to copy. Also, it's no use copying bits onto
2114 * themselves.
2115 */
2117 {
2118 /* Nothing to copy, clean up */
2120 CopyRgn = NULL;
2121 }
2122 else if ( OldWindowRect.left != NewWindowRect.left ||
2123 OldWindowRect.top != NewWindowRect.top ||
2124 (WinPos.flags & SWP_FRAMECHANGED) )
2125 {
2126 HRGN DcRgn = NtGdiCreateRectRgn(0, 0, 0, 0);
2127 PREGION DcRgnObj = REGION_LockRgn(DcRgn);
2128
2129 /*
2130 * Small trick here: there is no function to bitblt a region. So
2131 * we set the region as the clipping region, take the bounding box
2132 * of the region and bitblt that. Since nothing outside the clipping
2133 * region is copied, this has the effect of bitblt'ing the region.
2134 *
2135 * Since NtUserGetDCEx takes ownership of the clip region, we need
2136 * to create a copy of CopyRgn and pass that. We need CopyRgn later
2137 */
2139 REGION_bOffsetRgn(DcRgnObj, NewWindowRect.left, NewWindowRect.top);
2140 REGION_UnlockRgn(DcRgnObj);
2141 Dc = UserGetDCEx( Window,
2142 DcRgn,
2143 DCX_WINDOW|DCX_CACHE|DCX_INTERSECTRGN|DCX_CLIPSIBLINGS|DCX_KEEPCLIPRGN); // DCX_WINDOW will set first, go read WinDC.c.
2144 NtGdiBitBlt( Dc,
2145 CopyRect.left, CopyRect.top,
2146 CopyRect.right - CopyRect.left,
2147 CopyRect.bottom - CopyRect.top,
2148 Dc,
2149 CopyRect.left + (OldWindowRect.left - NewWindowRect.left),
2150 CopyRect.top + (OldWindowRect.top - NewWindowRect.top),
2151 SRCCOPY,
2153 0);
2154
2157 GreDeleteObject(DcRgn);
2158 }
2159 }
2160 else
2161 {
2162 CopyRgn = NULL;
2163 }
2164
2165 /* We need to redraw what wasn't visible before or force a redraw */
2166 if (VisAfter != NULL)
2167 {
2168 PREGION DirtyRgn = IntSysCreateRectpRgn(0, 0, 0, 0);
2169 if (DirtyRgn)
2170 {
2171 if (CopyRgn != NULL)
2172 {
2173 RgnType = IntGdiCombineRgn(DirtyRgn, VisAfter, CopyRgn, RGN_DIFF);
2174 }
2175 else
2176 {
2177 RgnType = IntGdiCombineRgn(DirtyRgn, VisAfter, 0, RGN_COPY);
2178 }
2179
2180 if (RgnType != ERROR && RgnType != NULLREGION) // Regions moved.
2181 {
2182 /* old code
2183 NtGdiOffsetRgn(DirtyRgn, Window->rcWindow.left, Window->rcWindow.top);
2184 IntInvalidateWindows( Window,
2185 DirtyRgn,
2186 RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
2187 }
2188 GreDeleteObject(DirtyRgn);
2189 */
2190
2191 PWND Parent = Window->spwndParent;
2192
2193 REGION_bOffsetRgn( DirtyRgn, Window->rcWindow.left, Window->rcWindow.top);
2194
2195 if ( (Window->style & WS_CHILD) && (Parent) && !(Parent->style & WS_CLIPCHILDREN))
2196 {
2199 }
2201 }
2202 else if (RgnType != ERROR && RgnType == NULLREGION) // Must be the same. See CORE-7166 & CORE-15934, NC HACK fix.
2203 {
2204 if ( !PosChanged &&
2205 !(WinPos.flags & SWP_DEFERERASE) &&
2206 (WinPos.flags & SWP_FRAMECHANGED) )
2207 {
2208 PWND pwnd = Window;
2209 PWND Parent = Window->spwndParent;
2210
2211 if ( pwnd->style & WS_CHILD ) // Fix ProgMan menu bar drawing.
2212 {
2213 TRACE("SWP_FRAMECHANGED win child %p Parent %p\n",pwnd,Parent);
2214 pwnd = Parent ? Parent : pwnd;
2215 }
2216
2217 if ( !(pwnd->style & WS_CHILD) )
2218 {
2219 /*
2220 * Check if we have these specific windows style bits set/reset.
2221 * FIXME: There may be other combinations of styles that need this handling as well.
2222 * This fixes the ReactOS Calculator buttons disappearing in CORE-16827.
2223 */
2224 if ((Window->style & WS_CLIPSIBLINGS) && !(Window->style & (WS_POPUP | WS_CLIPCHILDREN | WS_SIZEBOX)))
2225 {
2226 IntSendNCPaint(pwnd, HRGN_WINDOW); // Paint the whole frame.
2227 }
2228 else // Use region handling
2229 {
2230 HRGN DcRgn = NtGdiCreateRectRgn(0, 0, 0, 0);
2231 PREGION DcRgnObj = REGION_LockRgn(DcRgn);
2232 TRACE("SWP_FRAMECHANGED win %p hRgn %p\n",pwnd, DcRgn);
2233 IntGdiCombineRgn(DcRgnObj, VisBefore, NULL, RGN_COPY);
2234 REGION_UnlockRgn(DcRgnObj);
2235 ForceNCPaintErase(pwnd, DcRgn, DcRgnObj);
2236 GreDeleteObject(DcRgn);
2237 }
2238 }
2239 }
2240 }
2241 REGION_Delete(DirtyRgn);
2242 }
2243 }
2244
2245 /* Expose what was covered before but not covered anymore */
2246 if (VisBefore != NULL)
2247 {
2248 PREGION ExposedRgn = IntSysCreateRectpRgn(0, 0, 0, 0);
2249 if (ExposedRgn)
2250 {
2251 RgnType = IntGdiCombineRgn(ExposedRgn, VisBefore, NULL, RGN_COPY);
2252 REGION_bOffsetRgn(ExposedRgn,
2253 OldWindowRect.left - NewWindowRect.left,
2254 OldWindowRect.top - NewWindowRect.top);
2255
2256 if (VisAfter != NULL)
2257 RgnType = IntGdiCombineRgn(ExposedRgn, ExposedRgn, VisAfter, RGN_DIFF);
2258
2259 if (RgnType != ERROR && RgnType != NULLREGION)
2260 {
2262 }
2263 REGION_Delete(ExposedRgn);
2264 }
2265 }
2266 }
2267
2268 if (!(WinPos.flags & (SWP_NOACTIVATE|SWP_HIDEWINDOW)))
2269 {
2270 if ((Window->style & (WS_CHILD | WS_POPUP)) == WS_CHILD)
2271 {
2273 }
2274 else
2275 {
2276 //ERR("SetWindowPos Set FG Window!\n");
2277 if ( pti->MessageQueue->spwndActive != Window ||
2278 pti->MessageQueue != gpqForeground )
2279 {
2280 //ERR("WPSWP : set active window\n");
2281 if (!(Window->state & WNDS_BEINGACTIVATED)) // Inside SAW?
2282 {
2283 co_IntSetForegroundWindow(Window); // Fixes SW_HIDE issues. Wine win test_SetActiveWindow & test_SetForegroundWindow.
2284 }
2285 }
2286 }
2287 }
2288
2289 if ( !PosChanged &&
2290 (WinPos.flags & SWP_FRAMECHANGED) &&
2291 !(WinPos.flags & SWP_DEFERERASE) && // Prevent sending WM_SYNCPAINT message.
2292 VisAfter )
2293 {
2294 PWND Parent = Window->spwndParent;
2295 if ( !(Window->style & WS_CHILD) && (Parent) && (Parent->style & WS_CLIPCHILDREN))
2296 {
2297 TRACE("SWP_FRAMECHANGED Parent %p WS_CLIPCHILDREN %p\n",Parent,Window);
2298 UserSyncAndPaintWindows(Parent, RDW_CLIPCHILDREN); // NC should redraw here, see NC HACK fix.
2299 }
2300 }
2301
2302 // Fix wine msg test_SetFocus, prevents sending WM_WINDOWPOSCHANGED.
2303 if ( VisBefore == NULL &&
2304 VisBeforeJustClient == NULL &&
2305 !(Window->ExStyle & WS_EX_TOPMOST) &&
2307 {
2308 TRACE("No drawing, set no Z order and no redraw!\n");
2310 }
2311
2312 if (VisBefore != NULL)
2313 {
2314 REGION_Delete(VisBefore);
2315 VisBefore = NULL;
2316 }
2317 if (VisBeforeJustClient != NULL)
2318 {
2319 REGION_Delete(VisBeforeJustClient);
2320 VisBeforeJustClient = NULL;
2321 }
2322 if (VisAfter != NULL)
2323 {
2324 REGION_Delete(VisAfter);
2325 VisAfter = NULL;
2326 }
2327 if (CopyRgn != NULL)
2328 {
2330 CopyRgn = NULL;
2331 }
2332
2333 if(!(flags & SWP_DEFERERASE))
2334 {
2335 /* erase parent when hiding or resizing child */
2336 if ((flags & SWP_HIDEWINDOW) ||
2337 (!(flags & SWP_SHOWWINDOW) &&
2339 {
2340 PWND Parent = Window->spwndParent;
2343 }
2344
2345 /* Give newly shown windows a chance to redraw */
2348 {
2350 }
2351 }
2352
2353 /* And last, send the WM_WINDOWPOSCHANGED message */
2354
2355 TRACE("\tstatus hwnd %p flags = %04x\n", Window ? UserHMGetHandle(Window) : NULL, WinPos.flags & SWP_AGG_STATUSFLAGS);
2356
2359 {
2360 /* WM_WINDOWPOSCHANGED is sent even if SWP_NOSENDCHANGING is set
2361 and always contains final window position.
2362 */
2363 WinPos.x = NewWindowRect.left;
2364 WinPos.y = NewWindowRect.top;
2365 WinPos.cx = NewWindowRect.right - NewWindowRect.left;
2366 WinPos.cy = NewWindowRect.bottom - NewWindowRect.top;
2367 TRACE("WM_WINDOWPOSCHANGED hwnd %p Flags %04x\n",WinPos.hwnd,WinPos.flags);
2369 }
2370
2371 if ( WinPos.flags & SWP_FRAMECHANGED || WinPos.flags & SWP_STATECHANGED ||
2372 !(WinPos.flags & SWP_NOCLIENTSIZE) || !(WinPos.flags & SWP_NOCLIENTMOVE) )
2373 {
2374 PWND pWnd = ValidateHwndNoErr(WinPos.hwnd);
2375 if (pWnd)
2376 IntNotifyWinEvent(EVENT_OBJECT_LOCATIONCHANGE, pWnd, OBJID_WINDOW, CHILDID_SELF, WEF_SETBYWNDPTI);
2377 }
2378
2379 /* Send WM_IME_SYSTEM:IMS_UPDATEIMEUI to the IME windows if necessary */
2380 if ((WinPos.flags & (SWP_NOMOVE | SWP_NOSIZE)) != (SWP_NOMOVE | SWP_NOSIZE))
2381 {
2382 if (IS_IMM_MODE())
2384 }
2385
2386 if(bPointerInWindow != IntPtInWindow(Window, gpsi->ptCursor.x, gpsi->ptCursor.y))
2387 {
2388 /* Generate mouse move message */
2389 MSG msg;
2390 msg.message = WM_MOUSEMOVE;
2391 msg.wParam = UserGetMouseButtonsState();
2392 msg.lParam = MAKELPARAM(gpsi->ptCursor.x, gpsi->ptCursor.y);
2393 msg.pt = gpsi->ptCursor;
2395 }
2396
2397 return TRUE;
2398}
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
Definition: acpixf.h:732
#define msg(x)
Definition: auth_time.c:54
#define SWP_NOCLIENTSIZE
Definition: msg.h:31
#define SWP_NOCLIENTMOVE
Definition: msg.h:32
VOID FASTCALL DceResetActiveDCEs(PWND Window)
Definition: windc.c:816
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PagedPool
Definition: env_spec_w32.h:308
#define ERROR(name)
Definition: error_private.h:53
BOOL FASTCALL IntCheckFullscreen(PWND Window)
Definition: focus.c:78
VOID FASTCALL UpdateShellHook(PWND Window)
Definition: focus.c:98
GLbitfield flags
Definition: glext.h:7161
PSERVERINFO gpsi
Definition: imm.c:18
#define WNDS2_WIN31COMPAT
Definition: ntuser.h:653
#define WNDS2_FORCEFULLNCPAINTCLIPRGN
Definition: ntuser.h:668
#define WNDS_BEINGACTIVATED
Definition: ntuser.h:629
#define WNDS_SENDNCPAINT
Definition: ntuser.h:620
#define IS_IMM_MODE()
Definition: ntuser.h:1216
#define WEF_SETBYWNDPTI
Definition: ntuser.h:239
#define HRGN_WINDOW
Definition: ntuser.h:365
LONG_PTR LRESULT
Definition: minwindef.h:176
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
static HDC
Definition: imagelist.c:88
#define SWP_STATECHANGED
Definition: msg.c:44
VOID FASTCALL co_MsqInsertMouseMessage(MSG *Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: msgqueue.c:580
@ WM_ASYNC_SETWINDOWPOS
Definition: msgqueue.h:118
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
static BOOL FASTCALL co_WinPosDoWinPosChanging(PWND Window, PWINDOWPOS WinPos, PRECTL WindowRect, PRECTL ClientRect)
Definition: winpos.c:1273
static BOOL FASTCALL WinPosFixupFlags(WINDOWPOS *WinPos, PWND Wnd)
Definition: winpos.c:1557
VOID ForceNCPaintErase(PWND Wnd, HRGN hRgn, PREGION pRgn)
Definition: winpos.c:1697
#define SWP_AGG_STATUSFLAGS
Definition: winpos.c:24
static VOID FASTCALL WinPosInternalMoveWindow(PWND Window, INT MoveX, INT MoveY)
Definition: winpos.c:1527
static BOOL IntValidateParent(PWND Child, PREGION ValidateRgn)
Definition: winpos.c:1063
#define SWP_AGG_NOCLIENTCHANGE
Definition: winpos.c:26
static HWND FASTCALL WinPosDoOwnedPopups(PWND Window, HWND hWndInsertAfter)
Definition: winpos.c:1361
#define SWP_AGG_NOGEOMETRYCHANGE
Definition: winpos.c:20
#define SWP_AGG_NOPOSCHANGE
Definition: winpos.c:22
VOID SelectWindowRgn(PWND Window, HRGN hRgnClip)
Definition: winpos.c:259
static LONG FASTCALL co_WinPosDoNCCALCSize(PWND Window, PWINDOWPOS WinPos, RECTL *WindowRect, RECTL *ClientRect, RECTL *validRects)
Definition: winpos.c:1186
static VOID FASTCALL IntImeWindowPosChanged(VOID)
Definition: winpos.c:1753
#define RDW_CLIPCHILDREN
Definition: painting.h:15
#define WS_SIZEBOX
Definition: pedump.c:642
#define WS_EX_TOPMOST
Definition: pedump.c:647
#define WS_EX_TRANSPARENT
Definition: pedump.c:649
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
#define WS_CLIPCHILDREN
Definition: pedump.c:619
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
_Out_opt_ int * cx
Definition: commctrl.h:585
__kernel_entry W32KAPI BOOL APIENTRY NtGdiBitBlt(_In_ HDC hdcDst, _In_ INT x, _In_ INT y, _In_ INT cx, _In_ INT cy, _In_opt_ HDC hdcSrc, _In_ INT xSrc, _In_ INT ySrc, _In_ DWORD rop4, _In_ DWORD crBackColor, _In_ FLONG fl)
__kernel_entry W32KAPI HRGN APIENTRY NtGdiCreateRectRgn(_In_ INT xLeft, _In_ INT yTop, _In_ INT xRight, _In_ INT yBottom)
__kernel_entry W32KAPI INT APIENTRY NtGdiOffsetRgn(_In_ HRGN hrgn, _In_ INT cx, _In_ INT cy)
Definition: region.c:3961
BOOL WINAPI CopyRect(_Out_ LPRECT, _In_ LPCRECT)
#define SWP_NOREDRAW
Definition: winuser.h:1257
#define SWP_FRAMECHANGED
Definition: winuser.h:1251
#define MAKELPARAM(l, h)
Definition: winuser.h:4116
#define DCX_CACHE
Definition: winuser.h:2150
#define DCX_WINDOW
Definition: winuser.h:2149
#define HSHELL_WINDOWDESTROYED
Definition: winuser.h:1267
#define WM_CHILDACTIVATE
Definition: winuser.h:1666
#define WS_EX_APPWINDOW
Definition: winuser.h:383
#define HSHELL_WINDOWCREATED
Definition: winuser.h:1266
#define SWP_NOMOVE
Definition: winuser.h:1255
#define RDW_NOINTERNALPAINT
Definition: winuser.h:1228
#define GA_PARENT
Definition: winuser.h:2892
#define SWP_NOSIZE
Definition: winuser.h:1256
#define WM_MOUSEMOVE
Definition: winuser.h:1803
#define RDW_ERASE
Definition: winuser.h:1222
#define RDW_NOCHILDREN
Definition: winuser.h:1233
#define SWP_DEFERERASE
Definition: winuser.h:1263
#define DCX_CLIPSIBLINGS
Definition: winuser.h:2152
#define DCX_INTERSECTRGN
Definition: winuser.h:2158
#define WVR_REDRAW
Definition: winuser.h:2557
#define RDW_ALLCHILDREN
Definition: winuser.h:1232
#define RDW_ERASENOW
Definition: winuser.h:1230
#define RDW_FRAME
Definition: winuser.h:1223
#define SWP_SHOWWINDOW
Definition: winuser.h:1259
#define SWP_HIDEWINDOW
Definition: winuser.h:1252
#define SWP_NOOWNERZORDER
Definition: winuser.h:1260
#define RDW_NOFRAME
Definition: winuser.h:1227
#define RDW_NOERASE
Definition: winuser.h:1226
#define RDW_VALIDATE
Definition: winuser.h:1229
#define WM_WINDOWPOSCHANGED
Definition: winuser.h:1690
#define RDW_INVALIDATE
Definition: winuser.h:1225
long top
Definition: polytest.cpp:53
Definition: region.h:8
HWND hwnd
Definition: winuser.h:3696
UINT flags
Definition: winuser.h:3702
HWND hwndInsertAfter
Definition: winuser.h:3697
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
uint32_t ULONG
Definition: typedefs.h:59
#define DCX_KEEPCLIPRGN
Definition: undocuser.h:69
VOID FASTCALL UserSyncAndPaintWindows(PWND pWnd, ULONG Flags)
Definition: painting.c:623
VOID FASTCALL IntSendNCPaint(PWND pWnd, HRGN hRgn)
Definition: painting.c:350
VOID FASTCALL co_IntPaintWindows(PWND Wnd, ULONG Flags, BOOL Recurse)
Definition: painting.c:405
BOOL FASTCALL co_UserRedrawWindow(PWND Window, const RECTL *UpdateRect, PREGION UpdateRgn, ULONG Flags)
Definition: painting.c:897
VOID FASTCALL IntInvalidateWindows(PWND Wnd, PREGION Rgn, ULONG Flags)
Definition: painting.c:645
HWND FASTCALL UserGetShellWindow(VOID)
Definition: window.c:3684
INT FASTCALL UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint)
Definition: windc.c:918
HDC FASTCALL UserGetDCEx(PWND Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
PREGION FASTCALL VIS_ComputeVisibleRegion(PWND Wnd, BOOLEAN ClientArea, BOOLEAN ClipChildren, BOOLEAN ClipSiblings)
Definition: vis.c:13
VOID FASTCALL co_VIS_WindowLayoutChanged(PWND Wnd, PREGION NewlyExposed)
Definition: vis.c:145
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
Definition: gdiobj.c:1158
INT FASTCALL REGION_Complexity(PREGION prgn)
Definition: region.c:554
VOID FASTCALL REGION_Delete(PREGION pRgn)
Definition: region.c:2449
PREGION FASTCALL REGION_LockRgn(_In_ HRGN hrgn)
Definition: region.c:2358
VOID FASTCALL REGION_UnlockRgn(_In_ PREGION prgn)
Definition: region.c:2373
INT FASTCALL REGION_GetRgnBox(PREGION Rgn, PRECTL pRect)
Definition: region.c:2543
PREGION FASTCALL IntSysCreateRectpRgn(INT LeftRect, INT TopRect, INT RightRect, INT BottomRect)
Definition: region.c:2407
BOOL FASTCALL REGION_bOffsetRgn(_Inout_ PREGION prgn, _In_ INT cx, _In_ INT cy)
Definition: region.c:2707
INT FASTCALL IntGdiCombineRgn(PREGION prgnDest, PREGION prgnSrc1, PREGION prgnSrc2, INT iCombineMode)
Definition: region.c:2487
#define ValidateHwndNoErr(hwnd)
Definition: precomp.h:97
HWND FASTCALL IntGetDesktopWindow(VOID)
Definition: desktop.c:1402
VOID co_IntShellHookNotify(WPARAM Message, WPARAM wParam, LPARAM lParam)
Definition: desktop.c:1712
VOID FASTCALL IntNotifyWinEvent(DWORD Event, PWND pWnd, LONG idObject, LONG idChild, DWORD flags)
Definition: event.c:178
WORD FASTCALL UserGetMouseButtonsState(VOID)
Definition: mouse.c:22
#define USERTAG_SWP
Definition: tags.h:281
BOOL FASTCALL IntIsWindow(HWND hWnd)
Definition: window.c:177
VOID FASTCALL IntLinkHwnd(PWND Wnd, HWND hWndPrev)
Definition: window.c:985
#define OBJID_WINDOW
Definition: winable.h:15
#define CHILDID_SELF
Definition: winable.h:14
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:21
#define CopyRgn(hrgnDst, hrgnSrc)
Definition: windowsx.h:73
#define ERROR_INVALID_WINDOW_HANDLE
Definition: winerror.h:1226
#define RGN_DIFF
Definition: wingdi.h:358
#define NULLREGION
Definition: wingdi.h:361
#define RGN_COPY
Definition: wingdi.h:357
#define RGN_AND
Definition: wingdi.h:356
#define CLR_INVALID
Definition: wingdi.h:883
#define SRCCOPY
Definition: wingdi.h:333
FORCEINLINE BOOL IntPtInWindow(PWND pwnd, INT x, INT y)
Definition: winpos.h:30

Referenced by co_IntSendActivateMessages(), co_IntSetForegroundMessageQueue(), co_IntSetParent(), co_IntShowDesktop(), co_IntSnapWindow(), co_UserCreateWindowEx(), co_UserDestroyWindow(), co_UserShowScrollBar(), co_WinPosArrangeIconicWindows(), co_WinPosShowWindow(), DefWndDoSizeMove(), DefWndHandleSetCursor(), DesktopWindowProc(), handle_internal_message(), IntActivateWindow(), IntEndDeferWindowPosEx(), IntSetWindowPlacement(), IntUpdateLayeredWindowI(), MENU_ShowPopup(), NC_HandleNCLButtonDblClk(), NtUserCallHwndLock(), NtUserCallTwoParam(), NtUserSetMenu(), NtUserSetShellWindowEx(), NtUserSetWindowPos(), NtUserSetWindowRgn(), SpiNotifyNCMetricsChanged(), and WinPosDoOwnedPopups().

◆ co_WinPosShowWindow()

BOOLEAN FASTCALL co_WinPosShowWindow ( PWND  Window,
INT  Cmd 
)

Definition at line 2635 of file winpos.c.

2636{
2637 BOOLEAN WasVisible;
2638 UINT Swp = 0, EventMsg = 0;
2639 RECTL NewPos = {0, 0, 0, 0};
2640 BOOLEAN ShowFlag;
2641 LONG style;
2642 PWND Parent;
2643 PTHREADINFO pti;
2644 //HRGN VisibleRgn;
2645 BOOL ShowOwned = FALSE;
2646 BOOL FirstTime = FALSE;
2647 ASSERT_REFS_CO(Wnd);
2648 //KeRosDumpStackFrames(NULL, 20);
2650 WasVisible = (Wnd->style & WS_VISIBLE) != 0;
2651 style = Wnd->style;
2652
2653 TRACE("co_WinPosShowWindow START hwnd %p Cmd %d usicmd %u\n",
2654 UserHMGetHandle(Wnd), Cmd, pti->ppi->usi.wShowWindow);
2655
2656 if ( pti->ppi->usi.dwFlags & STARTF_USESHOWWINDOW )
2657 {
2658 if ((Wnd->style & (WS_POPUP|WS_CHILD)) != WS_CHILD)
2659 {
2660 if ((Wnd->style & WS_CAPTION) == WS_CAPTION)
2661 {
2662 if (Wnd->spwndOwner == NULL)
2663 {
2664 if ( Cmd == SW_SHOWNORMAL || Cmd == SW_SHOW)
2665 {
2667 }
2668 FirstTime = TRUE;
2669 TRACE("co_WPSW FT 1\n");
2670 }
2671 }
2672 }
2673 }
2674
2675 if ( Cmd == SW_SHOWDEFAULT )
2676 {
2677 if ( pti->ppi->usi.dwFlags & STARTF_USESHOWWINDOW )
2678 {
2679 Cmd = pti->ppi->usi.wShowWindow;
2680 FirstTime = TRUE;
2681 TRACE("co_WPSW FT 2\n");
2682 }
2683 }
2684
2685 if (FirstTime)
2686 {
2688 }
2689
2690 switch (Cmd)
2691 {
2692 case SW_HIDE:
2693 {
2694 if (!WasVisible)
2695 {
2696 //ERR("co_WinPosShowWindow Exit Bad\n");
2697 return FALSE;
2698 }
2700 if (Wnd != pti->MessageQueue->spwndActive)
2702 break;
2703 }
2704
2705 case SW_FORCEMINIMIZE:
2707 return WasVisible;
2708
2709 case SW_SHOWMINNOACTIVE:
2711 /* Fall through. */
2712 case SW_SHOWMINIMIZED:
2713 case SW_MINIMIZE: /* CORE-15669: SW_MINIMIZE also shows */
2714 Swp |= SWP_SHOWWINDOW;
2715 {
2716 Swp |= SWP_NOACTIVATE;
2717 if (!(style & WS_MINIMIZE))
2718 {
2720 // Fix wine Win test_SetFocus todo #1 & #2,
2721 if (Cmd == SW_SHOWMINIMIZED)
2722 {
2723 //ERR("co_WinPosShowWindow Set focus 1\n");
2724 if ((style & (WS_CHILD | WS_POPUP)) == WS_CHILD)
2725 co_UserSetFocus(Wnd->spwndParent);
2726 else
2727 co_UserSetFocus(0);
2728 }
2729
2730 Swp |= co_WinPosMinMaximize(Wnd, Cmd, &NewPos);
2731
2732 EventMsg = EVENT_SYSTEM_MINIMIZESTART;
2733 }
2734 else
2735 {
2736 if (WasVisible)
2737 {
2738 //ERR("co_WinPosShowWindow Exit Good\n");
2739 return TRUE;
2740 }
2741 Swp |= SWP_NOSIZE | SWP_NOMOVE;
2742 }
2743 break;
2744 }
2745
2746 case SW_SHOWMAXIMIZED:
2747 {
2748 Swp |= SWP_SHOWWINDOW;
2749 if (!(style & WS_MAXIMIZE))
2750 {
2751 ShowOwned = TRUE;
2752
2753 Swp |= co_WinPosMinMaximize(Wnd, SW_MAXIMIZE, &NewPos);
2754
2755 EventMsg = EVENT_SYSTEM_MINIMIZEEND;
2756 }
2757 else
2758 {
2759 if (WasVisible)
2760 {
2761 //ERR("co_WinPosShowWindow Exit Good 1\n");
2762 return TRUE;
2763 }
2764 Swp |= SWP_NOSIZE | SWP_NOMOVE;
2765 }
2766 break;
2767 }
2768
2769 case SW_SHOWNA:
2771 if (style & WS_CHILD && !(Wnd->ExStyle & WS_EX_MDICHILD)) Swp |= SWP_NOZORDER;
2772 break;
2773 case SW_SHOW:
2774 if (WasVisible) return(TRUE); // Nothing to do!
2776 /* Don't activate the topmost window. */
2777 if (style & WS_CHILD && !(Wnd->ExStyle & WS_EX_MDICHILD)) Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2778 break;
2779
2780 case SW_SHOWNOACTIVATE:
2782 /* Fall through. */
2783 case SW_SHOWNORMAL:
2784 case SW_SHOWDEFAULT:
2785 case SW_RESTORE:
2786 if (!WasVisible) Swp |= SWP_SHOWWINDOW;
2787 if (style & (WS_MINIMIZE | WS_MAXIMIZE))
2788 {
2789 Swp |= co_WinPosMinMaximize(Wnd, Cmd, &NewPos);
2790 if (style & WS_MINIMIZE) EventMsg = EVENT_SYSTEM_MINIMIZEEND;
2791 }
2792 else
2793 {
2794 if (WasVisible)
2795 {
2796 //ERR("co_WinPosShowWindow Exit Good 3\n");
2797 return TRUE;
2798 }
2799 Swp |= SWP_NOSIZE | SWP_NOMOVE;
2800 }
2801 if ( style & WS_CHILD &&
2802 !(Wnd->ExStyle & WS_EX_MDICHILD) &&
2803 !(Swp & SWP_STATECHANGED))
2805 break;
2806
2807 default:
2808 //ERR("co_WinPosShowWindow Exit Good 4\n");
2809 return FALSE;
2810 }
2811
2812 ShowFlag = (Cmd != SW_HIDE);
2813
2814 if ((ShowFlag != WasVisible || Cmd == SW_SHOWNA) && Cmd != SW_SHOWMAXIMIZED && !(Swp & SWP_STATECHANGED))
2815 {
2817#if 0 // Fix wine msg test_SetParent:WmSetParentSeq_1:2
2818 if (!(Wnd->state2 & WNDS2_WIN31COMPAT)) // <------------- XP sets this bit!
2820#endif
2821 if (!VerifyWnd(Wnd)) return WasVisible;
2822 }
2823
2824 /* We can't activate a child window */
2825 if ((Wnd->style & WS_CHILD) &&
2826 !(Wnd->ExStyle & WS_EX_MDICHILD) &&
2827 Cmd != SW_SHOWNA)
2828 {
2829 //ERR("SWP Child No active and ZOrder\n");
2831 }
2832
2833#if 0 // Explorer issues with common controls? Someone does not know how CS_SAVEBITS works.
2834 // Breaks startup and shutdown active window...
2835 if ((Wnd->style & (WS_POPUP|WS_CHILD)) != WS_CHILD &&
2836 Wnd->pcls->style & CS_SAVEBITS &&
2837 ((Cmd == SW_SHOW) || (Cmd == SW_NORMAL)))
2838 {
2839 ERR("WinPosShowWindow Set active\n");
2840 //UserSetActiveWindow(Wnd);
2841 co_IntSetForegroundWindow(Wnd); // HACK
2843 }
2844#endif
2845
2846 if (IsChildVisible(Wnd) || Swp & SWP_STATECHANGED)
2847 {
2848 TRACE("Child is Vis %s or State changed %s. ShowFlag %s Swp %04x\n",
2849 (IsChildVisible(Wnd) ? "TRUE" : "FALSE"), (Swp & SWP_STATECHANGED ? "TRUE" : "FALSE"),
2850 (ShowFlag ? "TRUE" : "FALSE"),LOWORD(Swp));
2852 0 != (Wnd->ExStyle & WS_EX_TOPMOST) ? HWND_TOPMOST : HWND_TOP,
2853 NewPos.left,
2854 NewPos.top,
2855 NewPos.right, // NewPos.right - NewPos.left, when minimized and restore, the window becomes smaller.
2856 NewPos.bottom,// NewPos.bottom - NewPos.top,
2857 LOWORD(Swp));
2858 }
2859 else
2860 {
2861 TRACE("Parent Vis?\n");
2862 /* if parent is not visible simply toggle WS_VISIBLE and return */
2863 if (ShowFlag) IntSetStyle( Wnd, WS_VISIBLE, 0 );
2864 else IntSetStyle( Wnd, 0, WS_VISIBLE );
2865 }
2866
2867 if ( EventMsg ) IntNotifyWinEvent(EventMsg, Wnd, OBJID_WINDOW, CHILDID_SELF, WEF_SETBYWNDPTI);
2868
2869 if ( ShowOwned ) IntShowOwnedPopups(Wnd, TRUE );
2870
2871 if ((Cmd == SW_HIDE) || (Cmd == SW_MINIMIZE))
2872 {
2873 if ( Wnd == pti->MessageQueue->spwndActive && pti->MessageQueue == IntGetFocusMessageQueue() )
2874 {
2875 if (UserIsDesktopWindow(Wnd->spwndParent))
2876 {
2877 if (!ActivateOtherWindowMin(Wnd))
2878 {
2880 }
2881 }
2882 else
2883 {
2885 }
2886 }
2887
2888 /* Revert focus to parent */
2889 if (Wnd == pti->MessageQueue->spwndFocus)
2890 {
2891 Parent = Wnd->spwndParent;
2892 if (UserIsDesktopWindow(Wnd->spwndParent))
2893 Parent = 0;
2895 }
2896 // Hide, just return.
2897 if (Cmd == SW_HIDE) return WasVisible;
2898 }
2899
2900 /* FIXME: Check for window destruction. */
2901
2902 if ((Wnd->state & WNDS_SENDSIZEMOVEMSGS) &&
2903 !(Wnd->state2 & WNDS2_INDESTROY))
2904 {
2906 }
2907
2908 /* if previous state was minimized Windows sets focus to the window */
2909 if (style & WS_MINIMIZE)
2910 {
2911 co_UserSetFocus(Wnd);
2912 // Fix wine Win test_SetFocus todo #3,
2914 }
2915 //ERR("co_WinPosShowWindow EXIT\n");
2916 return WasVisible;
2917}
HWND FASTCALL co_UserSetFocus(PWND Window)
Definition: focus.c:1311
#define WNDS2_INDESTROY
Definition: ntuser.h:652
#define WNDS_SENDSIZEMOVEMSGS
Definition: ntuser.h:613
UINT FASTCALL co_WinPosMinMaximize(PWND Wnd, UINT ShowFlag, RECT *NewPos)
Definition: winpos.c:2450
VOID FASTCALL co_WinPosActivateOtherWindow(PWND Wnd)
Definition: winpos.c:397
BOOL FASTCALL IsChildVisible(PWND pWnd)
Definition: winpos.c:226
BOOL FASTCALL ActivateOtherWindowMin(PWND Wnd)
Definition: winpos.c:285
void FASTCALL co_WinPosSendSizeMove(PWND Wnd)
Definition: winpos.c:2416
void IntForceMinimizeWindow(PWND pWnd)
Definition: winpos.c:2604
#define LOWORD(l)
Definition: pedump.c:82
#define SW_SHOWNORMAL
Definition: winuser.h:781
#define SW_SHOWMAXIMIZED
Definition: winuser.h:784
#define SW_HIDE
Definition: winuser.h:779
#define HWND_TOPMOST
Definition: winuser.h:1219
#define SW_MINIMIZE
Definition: winuser.h:787
#define SW_SHOWNOACTIVATE
Definition: winuser.h:785
#define WM_ACTIVATE
Definition: winuser.h:1640
#define WM_SHOWWINDOW
Definition: winuser.h:1656
#define SW_SHOWDEFAULT
Definition: winuser.h:791
#define SW_SHOWMINIMIZED
Definition: winuser.h:782
#define SW_FORCEMINIMIZE
Definition: winuser.h:792
#define WS_EX_MDICHILD
Definition: winuser.h:394
#define SW_SHOWNA
Definition: winuser.h:789
#define WA_ACTIVE
Definition: winuser.h:2665
#define CS_SAVEBITS
Definition: winuser.h:665
#define SW_RESTORE
Definition: winuser.h:790
#define SW_SHOW
Definition: winuser.h:786
#define SW_MAXIMIZE
Definition: winuser.h:783
#define SW_NORMAL
Definition: winuser.h:780
#define SW_SHOWMINNOACTIVE
Definition: winuser.h:788
@ Cmd
Definition: sacdrv.h:278
USERSTARTUPINFO usi
Definition: win32.h:280
PPROCESSINFO ppi
Definition: win32.h:89
DMUS_IO_STYLE style
Definition: style.c:95
WORD wShowWindow
Definition: win32.h:221
#define WM_SETVISIBLE
Definition: undocuser.h:33
PUSER_MESSAGE_QUEUE FASTCALL IntGetFocusMessageQueue(VOID)
Definition: desktop.c:1335
ULONG FASTCALL IntSetStyle(PWND pwnd, ULONG set_bits, ULONG clear_bits)
Definition: window.c:144
BOOL FASTCALL IntShowOwnedPopups(PWND OwnerWnd, BOOL fShow)
Definition: window.c:4654
#define STARTF_USEPOSITION
Definition: winbase.h:470
#define STARTF_USESHOWWINDOW
Definition: winbase.h:468
#define STARTF_USESIZE
Definition: winbase.h:469

Referenced by co_IntSetParent(), co_UserCreateWindowEx(), co_UserDestroyWindow(), co_UserShowScrollBar(), DefWndHandleSysCommand(), handle_internal_message(), IntDefWindowProc(), IntSetWindowPlacement(), NtUserMinMaximize(), and NtUserShowWindow().

◆ co_WinPosWindowFromPoint()

PWND APIENTRY co_WinPosWindowFromPoint ( IN PWND  ScopeWin,
IN POINT *  WinPoint,
IN OUT USHORT *  HitTest,
IN BOOL  Ignore 
)

Definition at line 3005 of file winpos.c.

3010{
3011 PWND Window;
3012 POINT Point = *WinPoint;
3014
3015 if( ScopeWin == NULL )
3016 {
3017 ScopeWin = UserGetDesktopWindow();
3018 if(ScopeWin == NULL)
3019 return NULL;
3020 }
3021
3022 *HitTest = HTNOWHERE;
3023
3024 ASSERT_REFS_CO(ScopeWin);
3025 UserRefObjectCo(ScopeWin, &Ref);
3026
3027 Window = co_WinPosSearchChildren(ScopeWin, &Point, HitTest, Ignore);
3028
3029 UserDerefObjectCo(ScopeWin);
3030 if (Window)
3032 ASSERT_REFS_CO(ScopeWin);
3033
3034 return Window;
3035}
static PWND co_WinPosSearchChildren(IN PWND ScopeWin, IN POINT *Point, IN OUT USHORT *HitTest, IN BOOL Ignore)
Definition: winpos.c:2920

Referenced by co_IntProcessMouseMessage(), and NtUserWindowFromPoint().

◆ IntClientToScreen()

BOOL FASTCALL IntClientToScreen ( PWND  Wnd,
LPPOINT  lpPoint 
)

Definition at line 199 of file winpos.c.

200{
201 if (Wnd && Wnd->fnid != FNID_DESKTOP )
202 {
203 if (Wnd->ExStyle & WS_EX_LAYOUTRTL)
204 lpPoint->x = Wnd->rcClient.right - lpPoint->x;
205 else
206 lpPoint->x += Wnd->rcClient.left;
207 lpPoint->y += Wnd->rcClient.top;
208 }
209 return TRUE;
210}
#define FNID_DESKTOP
Definition: ntuser.h:866
#define WS_EX_LAYOUTRTL
Definition: winuser.h:390
DWORD fnid
Definition: ntuser.h:713
RECT rcClient
Definition: ntuser.h:721
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48

Referenced by IntDefWindowProc(), NC_GetSysPopupPos(), and WinPosFixupFlags().

◆ IntEqualRect()

FORCEINLINE BOOL IntEqualRect ( RECTL *  lprc1,
RECTL *  lprc2 
)

Definition at line 48 of file winpos.h.

49{
50 if (lprc1 == NULL || lprc2 == NULL)
51 return FALSE;
52
53 return (lprc1->left == lprc2->left) && (lprc1->top == lprc2->top) &&
54 (lprc1->right == lprc2->right) && (lprc1->bottom == lprc2->bottom);
55}

Referenced by IntGetNCUpdateRgn(), and NC_DoNCPaint().

◆ IntGetClientOrigin()

BOOL FASTCALL IntGetClientOrigin ( PWND  Window,
LPPOINT  Point 
)

Definition at line 71 of file winpos.c.

72{
74 if (Window == NULL)
75 {
76 Point->x = Point->y = 0;
77 return FALSE;
78 }
79 Point->x = Window->rcClient.left;
80 Point->y = Window->rcClient.top;
81
82 return TRUE;
83}

Referenced by co_IntFixCaret(), and IntScrollWindowEx().

◆ IntGetWindowRect()

BOOL FASTCALL IntGetWindowRect ( PWND  Wnd,
RECTL *  Rect 
)

Definition at line 121 of file winpos.c.

122{
123 ASSERT( Wnd );
124 ASSERT( Rect );
125 if (!Wnd) return FALSE;
126 if (!UserIsDesktopWindow(Wnd))
127 {
128 *Rect = Wnd->rcWindow;
129 }
130 else
131 {
132 Rect->left = Rect->top = 0;
133 Rect->right = Wnd->rcWindow.right;
134 Rect->bottom = Wnd->rcWindow.bottom;
135/* Do this until Init bug is fixed. This sets 640x480, see InitMetrics.
136 Rect->right = GetSystemMetrics(SM_CXSCREEN);
137 Rect->bottom = GetSystemMetrics(SM_CYSCREEN);
138*/ }
139 return TRUE;
140}
#define ASSERT(a)
Definition: mode.c:44

Referenced by DefWndScreenshot(), IntGetNCUpdateRgn(), IntIsWindowFullscreen(), MENU_FindItemByCoords(), MENU_ShowSubPopup(), NC_DoNCPaint(), NC_GetSysPopupPos(), UserDrawCaptionBar(), and UserDrawCaptionButtonWnd().

◆ IntGetWindowSnapEdge()

UINT FASTCALL IntGetWindowSnapEdge ( PWND  Wnd)

Definition at line 3944 of file winpos.c.

3945{
3948 return HTNOWHERE;
3949}
#define WS_EX2_VERTICALLYMAXIMIZEDLEFT
Definition: ntuser.h:684
#define WS_EX2_VERTICALLYMAXIMIZEDRIGHT
Definition: ntuser.h:685
DWORD ExStyle2
Definition: ntuser.h:749

Referenced by co_IntSnapWindow(), co_WinPosMinMaximize(), DefWndDoSizeMove(), and IntDefWindowProc().

◆ IntIsSnapAllowedForWindow()

FORCEINLINE BOOLEAN IntIsSnapAllowedForWindow ( PWND  Wnd)

Definition at line 101 of file winpos.h.

102{
103 /* We want to forbid snapping operations on the TaskBar and on child windows.
104 * We use a heuristic for detecting the TaskBar by its typical Style & ExStyle. */
105 const UINT style = Wnd->style;
107 const UINT tbes = WS_EX_TOOLWINDOW;
108 BOOLEAN istb = (style & tbws) == tbws && (Wnd->ExStyle & (tbes | WS_EX_APPWINDOW)) == tbes;
109 BOOLEAN thickframe = (style & WS_THICKFRAME) && (style & (WS_DLGFRAME | WS_BORDER)) != WS_DLGFRAME;
110 return thickframe && !(style & WS_CHILD) && !istb;
111}

Referenced by DefWndDoSizeMove(), and IntDefWindowProc().

◆ IntIsWindowSnapped()

FORCEINLINE BOOLEAN IntIsWindowSnapped ( PWND  Wnd)

Definition at line 95 of file winpos.h.

Referenced by co_IntSnapWindow(), DefWndDoSizeMove(), and WinPosInitInternalPos().

◆ IntPtInWindow()

FORCEINLINE BOOL IntPtInWindow ( PWND  pwnd,
INT  x,
INT  y 
)

Definition at line 30 of file winpos.h.

31{
32 if(!RECTL_bPointInRect(&pwnd->rcWindow, x, y))
33 {
34 return FALSE;
35 }
36
37 if(!pwnd->hrgnClip || pwnd->style & WS_MINIMIZE)
38 {
39 return TRUE;
40 }
41
42 return NtGdiPtInRegion(pwnd->hrgnClip,
43 x - pwnd->rcWindow.left,
44 y - pwnd->rcWindow.top);
45}
__kernel_entry W32KAPI BOOL APIENTRY NtGdiPtInRegion(_In_ HRGN hrgn, _In_ INT x, _In_ INT y)
Definition: region.c:3996
HRGN hrgnClip
Definition: ntuser.h:737
FORCEINLINE BOOL RECTL_bPointInRect(_In_ const RECTL *prcl, _In_ INT x, _In_ INT y)
Definition: rect.h:52

Referenced by co_WinPosSearchChildren(), co_WinPosSetWindowPos(), IntChildWindowFromPointEx(), IntRealChildWindowFromPoint(), and IntTopLevelWindowFromPoint().

◆ IntRealChildWindowFromPoint()

PWND FASTCALL IntRealChildWindowFromPoint ( PWND  Parent,
LONG  x,
LONG  y 
)

Definition at line 3038 of file winpos.c.

3039{
3040 POINTL Pt;
3041 HWND *List, *phWnd;
3042 PWND pwndHit = NULL;
3043
3044 Pt.x = x;
3045 Pt.y = y;
3046
3048 {
3049 Pt.x += Parent->rcClient.left;
3050 Pt.y += Parent->rcClient.top;
3051 }
3052
3053 if (!IntPtInWindow(Parent, Pt.x, Pt.y)) return NULL;
3054
3056 {
3057 for (phWnd = List; *phWnd; phWnd++)
3058 {
3059 PWND Child;
3060 if ((Child = ValidateHwndNoErr(*phWnd)))
3061 {
3062 if ( Child->style & WS_VISIBLE && IntPtInWindow(Child, Pt.x, Pt.y) )
3063 {
3064 if ( Child->pcls->atomClassName != gpsi->atomSysClass[ICLS_BUTTON] ||
3065 (Child->style & BS_TYPEMASK) != BS_GROUPBOX )
3066 {
3068 return Child;
3069 }
3070 pwndHit = Child;
3071 }
3072 }
3073 }
3075 }
3076 return pwndHit ? pwndHit : Parent;
3077}
#define ICLS_BUTTON
Definition: ntuser.h:916
#define BS_GROUPBOX
Definition: pedump.c:658
#define BS_TYPEMASK
Definition: winuser.h:270
LONG y
Definition: windef.h:130
LONG x
Definition: windef.h:129
ATOM atomSysClass[ICLS_NOTUSED+1]
Definition: ntuser.h:1064
_Must_inspect_result_ _In_ WDFCMRESLIST List
Definition: wdfresource.h:550
#define USERTAG_WINDOWLIST
Definition: tags.h:298
HWND *FASTCALL IntWinListChildren(PWND Window)
Definition: window.c:275

Referenced by NtUserRealChildWindowFromPoint().

◆ IntScreenToClient()

BOOL FASTCALL IntScreenToClient ( PWND  Wnd,
LPPOINT  lpPoint 
)

Definition at line 213 of file winpos.c.

214{
215 if (Wnd && Wnd->fnid != FNID_DESKTOP )
216 {
217 if (Wnd->ExStyle & WS_EX_LAYOUTRTL)
218 lpPoint->x = Wnd->rcClient.right - lpPoint->x;
219 else
220 lpPoint->x -= Wnd->rcClient.left;
221 lpPoint->y -= Wnd->rcClient.top;
222 }
223 return TRUE;
224}

Referenced by co_IntSetParent(), IntDefWindowProc(), and MENU_TrackMouseMenuBar().

◆ IntSetSnapEdge()

VOID FASTCALL IntSetSnapEdge ( PWND  Wnd,
UINT  Edge 
)

Definition at line 4029 of file winpos.c.

4030{
4032 UINT style = 0;
4033 switch (Edge)
4034 {
4035 case HTNOWHERE:
4036 style = 0;
4037 break;
4038 case HTTOP: /* Maximize throws away the snap */
4039 style = 0;
4040 break;
4041 case HTLEFT:
4043 break;
4044 case HTRIGHT:
4046 break;
4047 default:
4048 ERR("Unexpected snap edge %#x\n", Edge);
4049 }
4050 Wnd->ExStyle2 = (Wnd->ExStyle2 & ~styleMask) | style;
4051}

Referenced by co_IntSnapWindow(), co_WinPosMinMaximize(), DefWndDoSizeMove(), IntDefWindowProc(), and IntSetSnapInfo().

◆ IntSetSnapInfo()

VOID FASTCALL IntSetSnapInfo ( PWND  Wnd,
UINT  Edge,
IN const RECT *Pos  OPTIONAL 
)

Definition at line 4054 of file winpos.c.

4055{
4056 RECT r;
4057 IntSetSnapEdge(Wnd, Edge);
4058 if (Edge == HTNOWHERE)
4059 {
4061 Pos = (Wnd->style & WS_MINIMIZE) ? NULL : &r;
4062 }
4063 if (Pos)
4064 {
4065 Wnd->InternalPos.NormalRect = *Pos;
4066 }
4067}
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
FORCEINLINE VOID RECTL_vSetEmptyRect(_Out_ RECTL *prcl)
Definition: rect.h:20

Referenced by co_IntSnapWindow(), DefWndDoSizeMove(), and IntDefWindowProc().

◆ IsSnapEnabled()

FORCEINLINE BOOL IsSnapEnabled ( VOID  )

Definition at line 83 of file winpos.h.

84{
86}
BOOL g_bWindowSnapEnabled
Definition: sysparams.c:20

◆ UserGetWindowBorders()

VOID UserGetWindowBorders ( DWORD  Style,
DWORD  ExStyle,
SIZE *  Size,
BOOL  WithClient 
)

Definition at line 894 of file winpos.c.

895{
896 DWORD Border = 0;
897
899 Border += 2;
901 Border += 1; /* for the outer frame always present */
902 if ((ExStyle & WS_EX_CLIENTEDGE) && WithClient)
903 Border += 2;
905 Border ++; /* The other border */
906 Size->cx = Size->cy = Border;
907 if ((Style & WS_THICKFRAME) && !(Style & WS_MINIMIZE)) /* The resize border */
908 {
911 }
914}
const DWORD Style
Definition: appswitch.c:72
const DWORD ExStyle
Definition: appswitch.c:73
BOOL UserHasWindowEdge(DWORD Style, DWORD ExStyle)
Definition: winpos.c:850
#define WS_EX_DLGMODALFRAME
Definition: pedump.c:645
#define WS_EX_STATICEDGE
Definition: winuser.h:403
#define WS_EX_CLIENTEDGE
Definition: winuser.h:384
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539

◆ UserHasWindowEdge()

BOOL UserHasWindowEdge ( DWORD  Style,
DWORD  ExStyle 
)

Definition at line 850 of file winpos.c.

851{
852 if (Style & WS_MINIMIZE)
853 return TRUE;
855 return TRUE;
857 return FALSE;
858 if (Style & WS_THICKFRAME)
859 return TRUE;
860 Style &= WS_CAPTION;
861 if (Style == WS_DLGFRAME || Style == WS_CAPTION)
862 return TRUE;
863 return FALSE;
864}

Referenced by UserGetWindowBorders().