ReactOS  0.4.15-dev-1152-g6c94e4f
winpos.c File Reference
#include <win32k.h>
Include dependency graph for winpos.c:

Go to the source code of this file.

Macros

#define MINMAX_NOSWP   (0x00010000)
 
#define SWP_EX_NOCOPY   0x0001
 
#define SWP_EX_PAINTSELF   0x0002
 
#define SWP_AGG_NOGEOMETRYCHANGE   (SWP_NOSIZE | SWP_NOCLIENTSIZE | SWP_NOZORDER)
 
#define SWP_AGG_NOPOSCHANGE   (SWP_NOSIZE | SWP_NOMOVE | SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE | SWP_NOZORDER)
 
#define SWP_AGG_STATUSFLAGS   (SWP_AGG_NOPOSCHANGE | SWP_FRAMECHANGED | SWP_HIDEWINDOW | SWP_SHOWWINDOW)
 
#define SWP_AGG_NOCLIENTCHANGE   (SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE)
 
#define EMPTYPOINT(pt)   ((pt).x == -1 && (pt).y == -1)
 
#define PLACE_MIN   0x0001
 
#define PLACE_MAX   0x0002
 
#define PLACE_RECT   0x0004
 

Functions

 DBG_DEFAULT_CHANNEL (UserWinpos)
 
BOOL FASTCALL IntGetClientOrigin (PWND Window OPTIONAL, LPPOINT Point)
 
VOID FASTCALL IntGetClientRect (PWND Wnd, RECTL *Rect)
 
BOOL FASTCALL IntGetWindowRect (PWND Wnd, RECTL *Rect)
 
INT FASTCALL IntMapWindowPoints (PWND FromWnd, PWND ToWnd, LPPOINT lpPoints, UINT cPoints)
 
BOOL FASTCALL IntClientToScreen (PWND Wnd, LPPOINT lpPoint)
 
BOOL FASTCALL IntScreenToClient (PWND Wnd, LPPOINT lpPoint)
 
BOOL FASTCALL IsChildVisible (PWND pWnd)
 
PWND FASTCALL IntGetLastTopMostWindow (VOID)
 
VOID SelectWindowRgn (PWND Window, HRGN hRgnClip)
 
BOOL FASTCALL ActivateOtherWindowMin (PWND Wnd)
 
static BOOL FASTCALL can_activate_window (PWND Wnd OPTIONAL)
 
VOID FASTCALL co_WinPosActivateOtherWindow (PWND Wnd)
 
VOID FASTCALL WinPosInitInternalPos (PWND Wnd, RECTL *RestoreRect)
 
BOOL FASTCALL IntGetWindowPlacement (PWND Wnd, WINDOWPLACEMENT *lpwndpl)
 
static void make_rect_onscreen (RECT *rect)
 
static void make_point_onscreen (POINT *pt)
 
BOOL FASTCALL IntSetWindowPlacement (PWND Wnd, WINDOWPLACEMENT *wpl, UINT Flags)
 
UINT FASTCALL co_WinPosArrangeIconicWindows (PWND parent)
 
static VOID FASTCALL WinPosFindIconPos (PWND Window, POINT *Pos)
 
BOOL UserHasWindowEdge (DWORD Style, DWORD ExStyle)
 
VOID FASTCALL IntGetWindowBorderMeasures (PWND Wnd, UINT *cx, UINT *cy)
 
VOID UserGetWindowBorders (DWORD Style, DWORD ExStyle, SIZE *Size, BOOL WithClient)
 
DWORD IntGetWindowBorders (DWORD Style, DWORD ExStyle)
 
UINT FASTCALL co_WinPosGetMinMaxInfo (PWND Window, POINT *MaxSize, POINT *MaxPos, POINT *MinTrack, POINT *MaxTrack)
 
static BOOL IntValidateParent (PWND Child, PREGION ValidateRgn)
 
static VOID FASTCALL FixClientRect (PRECTL ClientRect, PRECTL WindowRect)
 
static VOID FASTCALL get_valid_rects (RECTL *old_client, RECTL *new_client, UINT flags, RECTL *valid)
 
static LONG FASTCALL co_WinPosDoNCCALCSize (PWND Window, PWINDOWPOS WinPos, RECTL *WindowRect, RECTL *ClientRect, RECTL *validRects)
 
static BOOL FASTCALL co_WinPosDoWinPosChanging (PWND Window, PWINDOWPOS WinPos, PRECTL WindowRect, PRECTL ClientRect)
 
static HWND FASTCALL WinPosDoOwnedPopups (PWND Window, HWND hWndInsertAfter)
 
static VOID FASTCALL WinPosInternalMoveWindow (PWND Window, INT MoveX, INT MoveY)
 
static BOOL FASTCALL WinPosFixupFlags (WINDOWPOS *WinPos, PWND Wnd)
 
VOID ForceNCPaintErase (PWND Wnd, HRGN hRgn, PREGION pRgn)
 
BOOLEAN FASTCALL co_WinPosSetWindowPos (PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
 
LRESULT FASTCALL co_WinPosGetNonClientSize (PWND Window, RECT *WindowRect, RECT *ClientRect)
 
void FASTCALL co_WinPosSendSizeMove (PWND Wnd)
 
UINT FASTCALL co_WinPosMinMaximize (PWND Wnd, UINT ShowFlag, RECT *NewPos)
 
BOOLEAN FASTCALL co_WinPosShowWindow (PWND Wnd, INT Cmd)
 
static PWND co_WinPosSearchChildren (IN PWND ScopeWin, IN POINT *Point, IN OUT USHORT *HitTest, IN BOOL Ignore)
 
PWND APIENTRY co_WinPosWindowFromPoint (IN PWND ScopeWin, IN POINT *WinPoint, IN OUT USHORT *HitTest, IN BOOL Ignore)
 
PWND FASTCALL IntRealChildWindowFromPoint (PWND Parent, LONG x, LONG y)
 
PWND APIENTRY IntChildWindowFromPointEx (PWND Parent, LONG x, LONG y, UINT uiFlags)
 
HDWP FASTCALL IntDeferWindowPos (HDWP hdwp, HWND hwnd, HWND hwndAfter, INT x, INT y, INT cx, INT cy, UINT flags)
 
BOOL FASTCALL IntEndDeferWindowPosEx (HDWP hdwp, BOOL sAsync)
 
HWND APIENTRY NtUserChildWindowFromPointEx (HWND hwndParent, LONG x, LONG y, UINT uiFlags)
 
BOOL APIENTRY NtUserEndDeferWindowPosEx (HDWP WinPosInfo, DWORD Unknown1)
 
HDWP APIENTRY NtUserDeferWindowPos (HDWP WinPosInfo, HWND Wnd, HWND WndInsertAfter, int x, int y, int cx, int cy, UINT Flags)
 
DWORD APIENTRY NtUserGetInternalWindowPos (HWND hWnd, LPRECT rectWnd, LPPOINT ptIcon)
 
BOOL APIENTRY NtUserGetWindowPlacement (HWND hWnd, WINDOWPLACEMENT *lpwndpl)
 
DWORD APIENTRY NtUserMinMaximize (HWND hWnd, UINT cmd, BOOL Hide)
 
BOOL APIENTRY NtUserMoveWindow (HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint)
 
HWND APIENTRY NtUserRealChildWindowFromPoint (HWND Parent, LONG x, LONG y)
 
BOOL APIENTRY NtUserSetWindowPos (HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags)
 
INT APIENTRY NtUserSetWindowRgn (HWND hWnd, HRGN hRgn, BOOL bRedraw)
 
DWORD APIENTRY NtUserSetInternalWindowPos (HWND hwnd, UINT showCmd, LPRECT lprect, LPPOINT lppt)
 
BOOL APIENTRY NtUserSetWindowPlacement (HWND hWnd, WINDOWPLACEMENT *lpwndpl)
 
BOOL APIENTRY NtUserShowWindowAsync (HWND hWnd, LONG nCmdShow)
 
BOOL APIENTRY NtUserShowWindow (HWND hWnd, LONG nCmdShow)
 
HWND APIENTRY NtUserWindowFromPoint (LONG X, LONG Y)
 

Macro Definition Documentation

◆ EMPTYPOINT

#define EMPTYPOINT (   pt)    ((pt).x == -1 && (pt).y == -1)

Definition at line 28 of file winpos.c.

◆ MINMAX_NOSWP

#define MINMAX_NOSWP   (0x00010000)

Definition at line 14 of file winpos.c.

◆ PLACE_MAX

#define PLACE_MAX   0x0002

Definition at line 30 of file winpos.c.

◆ PLACE_MIN

#define PLACE_MIN   0x0001

Definition at line 29 of file winpos.c.

◆ PLACE_RECT

#define PLACE_RECT   0x0004

Definition at line 31 of file winpos.c.

◆ SWP_AGG_NOCLIENTCHANGE

#define SWP_AGG_NOCLIENTCHANGE   (SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE)

Definition at line 25 of file winpos.c.

◆ SWP_AGG_NOGEOMETRYCHANGE

#define SWP_AGG_NOGEOMETRYCHANGE   (SWP_NOSIZE | SWP_NOCLIENTSIZE | SWP_NOZORDER)

Definition at line 19 of file winpos.c.

◆ SWP_AGG_NOPOSCHANGE

Definition at line 21 of file winpos.c.

◆ SWP_AGG_STATUSFLAGS

Definition at line 23 of file winpos.c.

◆ SWP_EX_NOCOPY

#define SWP_EX_NOCOPY   0x0001

Definition at line 16 of file winpos.c.

◆ SWP_EX_PAINTSELF

#define SWP_EX_PAINTSELF   0x0002

Definition at line 17 of file winpos.c.

Function Documentation

◆ ActivateOtherWindowMin()

BOOL FASTCALL ActivateOtherWindowMin ( PWND  Wnd)

Definition at line 284 of file winpos.c.

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

Referenced by co_WinPosShowWindow(), and UserSetActiveWindow().

◆ can_activate_window()

static BOOL FASTCALL can_activate_window ( PWND Wnd  OPTIONAL)
static

Definition at line 372 of file winpos.c.

373 {
374  LONG style;
375 
376  if (!Wnd) return FALSE;
377 
378  style = Wnd->style;
379  if (!(style & WS_VISIBLE)) return FALSE;
380  if (style & WS_MINIMIZE) return FALSE;
381  if ((style & (WS_POPUP|WS_CHILD)) == WS_CHILD) return FALSE;
382  return TRUE;
383  /* FIXME: This window could be disable because the child that closed
384  was a popup. */
385  //return !(style & WS_DISABLED);
386 }
#define TRUE
Definition: types.h:120
#define WS_CHILD
Definition: pedump.c:617
#define FALSE
Definition: types.h:117
#define WS_MINIMIZE
Definition: pedump.c:622
long LONG
Definition: pedump.c:60
#define WS_POPUP
Definition: pedump.c:616
Arabic default style
Definition: afstyles.h:93
#define WS_VISIBLE
Definition: pedump.c:620

Referenced by co_WinPosActivateOtherWindow().

◆ co_WinPosActivateOtherWindow()

VOID FASTCALL co_WinPosActivateOtherWindow ( PWND  Wnd)

Definition at line 395 of file winpos.c.

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

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

◆ co_WinPosArrangeIconicWindows()

UINT FASTCALL co_WinPosArrangeIconicWindows ( PWND  parent)

Definition at line 728 of file winpos.c.

729 {
730  RECTL rectParent;
731  PWND Child;
732  INT x, y, xspacing, yspacing, sx, sy;
733 
735 
736  IntGetClientRect( parent, &rectParent );
737  // FIXME: Support Minimize Metrics gspv.mm.iArrange.
738  // Default: ARW_BOTTOMLEFT
739  x = rectParent.left;
740  y = rectParent.bottom;
741 
744 
745  Child = parent->spwndChild;
746  while(Child)
747  {
748  if((Child->style & WS_MINIMIZE) != 0 )
749  {
751  UserRefObjectCo(Child, &Ref);
752 
754  sy = y - yspacing - UserGetSystemMetrics(SM_CYBORDER);
755 
756  Child->InternalPos.IconPos.x = sx;
757  Child->InternalPos.IconPos.y = sy;
758  Child->InternalPos.flags |= WPF_MININIT;
759 
761 
763 
764  if (x <= rectParent.right - xspacing)
765  x += xspacing;
766  else
767  {
768  x = rectParent.left;
769  y -= yspacing;
770  }
771  }
772  Child = Child->spwndNext;
773  }
774  return yspacing;
775 }
#define SM_CXMINIMIZED
Definition: winuser.h:1010
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
BOOLEAN FASTCALL co_WinPosSetWindowPos(PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
Definition: winpos.c:1720
static __inline VOID UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
Definition: object.h:25
long bottom
Definition: polytest.cpp:53
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
#define SWP_NOZORDER
Definition: winuser.h:1232
int32_t INT
Definition: typedefs.h:58
#define SWP_NOCOPYBITS
Definition: winuser.h:1228
long right
Definition: polytest.cpp:53
#define WS_MINIMIZE
Definition: pedump.c:622
static __inline VOID UserDerefObjectCo(PVOID obj)
Definition: object.h:38
Definition: object.h:3
#define SWP_ASYNCWINDOWPOS
Definition: winuser.h:1238
long left
Definition: polytest.cpp:53
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
r parent
Definition: btrfs.c:2944
#define SWP_NOACTIVATE
Definition: winuser.h:1227
#define SM_CYBORDER
Definition: winuser.h:955
#define WPF_MININIT
Definition: ntuser.h:654
#define SM_CYMINIMIZED
Definition: winuser.h:1011
#define SM_CXBORDER
Definition: winuser.h:954
Definition: ntuser.h:657
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical 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 ACPI_HANDLE Child
Definition: acpixf.h:728
VOID FASTCALL IntGetClientRect(PWND Wnd, RECTL *Rect)
Definition: winpos.c:91

Referenced by NtUserCallHwndLock().

◆ co_WinPosDoNCCALCSize()

static LONG FASTCALL co_WinPosDoNCCALCSize ( PWND  Window,
PWINDOWPOS  WinPos,
RECTL WindowRect,
RECTL ClientRect,
RECTL validRects 
)
static

Definition at line 1177 of file winpos.c.

1178 {
1179  PWND Parent;
1180  UINT wvrFlags = 0;
1181 
1183 
1184  /* Send WM_NCCALCSIZE message to get new client area */
1185  if ((WinPos->flags & (SWP_FRAMECHANGED | SWP_NOSIZE)) != SWP_NOSIZE)
1186  {
1188  WINDOWPOS winposCopy;
1189 
1190  params.rgrc[0] = *WindowRect; // new coordinates of a window that has been moved or resized
1191  params.rgrc[1] = Window->rcWindow; // window before it was moved or resized
1192  params.rgrc[2] = Window->rcClient; // client area before the window was moved or resized
1193 
1194  Parent = Window->spwndParent;
1195  if (0 != (Window->style & WS_CHILD) && Parent)
1196  {
1197  RECTL_vOffsetRect(&(params.rgrc[0]), - Parent->rcClient.left, - Parent->rcClient.top);
1198  RECTL_vOffsetRect(&(params.rgrc[1]), - Parent->rcClient.left, - Parent->rcClient.top);
1199  RECTL_vOffsetRect(&(params.rgrc[2]), - Parent->rcClient.left, - Parent->rcClient.top);
1200  }
1201 
1202  params.lppos = &winposCopy;
1203  winposCopy = *WinPos;
1204 
1205  wvrFlags = co_IntSendMessage(Window->head.h, WM_NCCALCSIZE, TRUE, (LPARAM) &params);
1206 
1207  /* If the application send back garbage, ignore it */
1208  if (params.rgrc[0].left <= params.rgrc[0].right &&
1209  params.rgrc[0].top <= params.rgrc[0].bottom)
1210  {
1211  *ClientRect = params.rgrc[0]; // First rectangle contains the coordinates of the new client rectangle resulting from the move or resize
1212  if ((Window->style & WS_CHILD) && Parent)
1213  {
1214  RECTL_vOffsetRect(ClientRect, Parent->rcClient.left, Parent->rcClient.top);
1215  }
1216  FixClientRect(ClientRect, WindowRect);
1217  }
1218 
1219  if (ClientRect->left != Window->rcClient.left ||
1220  ClientRect->top != Window->rcClient.top)
1221  {
1222  WinPos->flags &= ~SWP_NOCLIENTMOVE;
1223  }
1224 
1225  if (ClientRect->right - ClientRect->left != Window->rcClient.right - Window->rcClient.left)
1226  {
1227  WinPos->flags &= ~SWP_NOCLIENTSIZE;
1228  }
1229  else
1230  wvrFlags &= ~WVR_HREDRAW;
1231 
1232  if (ClientRect->bottom - ClientRect->top != Window->rcClient.bottom - Window->rcClient.top)
1233  {
1234  WinPos->flags &= ~SWP_NOCLIENTSIZE;
1235  }
1236  else
1237  wvrFlags &= ~WVR_VREDRAW;
1238 
1239  validRects[0] = params.rgrc[1]; // second rectangle contains the valid destination rectangle
1240  validRects[1] = params.rgrc[2]; // third rectangle contains the valid source rectangle
1241  }
1242  else
1243  {
1244  if (!(WinPos->flags & SWP_NOMOVE) &&
1245  (ClientRect->left != Window->rcClient.left ||
1246  ClientRect->top != Window->rcClient.top))
1247  {
1248  WinPos->flags &= ~SWP_NOCLIENTMOVE;
1249  }
1250  }
1251 
1253  {
1254  RECTL_vSetEmptyRect( &validRects[0] );
1255  RECTL_vSetEmptyRect( &validRects[1] );
1256  }
1257  else get_valid_rects( &Window->rcClient, ClientRect, wvrFlags, validRects );
1258 
1259  return wvrFlags;
1260 }
FORCEINLINE VOID RECTL_vSetEmptyRect(_Out_ RECTL *prcl)
Definition: rect.h:20
#define TRUE
Definition: types.h:120
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
#define WM_NCCALCSIZE
Definition: winuser.h:1667
long bottom
Definition: polytest.cpp:53
#define WS_CHILD
Definition: pedump.c:617
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical 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:728
#define SWP_HIDEWINDOW
Definition: winuser.h:1226
#define SWP_NOCOPYBITS
Definition: winuser.h:1228
long right
Definition: polytest.cpp:53
Definition: window.c:28
GLenum const GLfloat * params
Definition: glext.h:5645
long top
Definition: polytest.cpp:53
LONG_PTR LPARAM
Definition: windef.h:208
UINT flags
Definition: winuser.h:3569
long left
Definition: polytest.cpp:53
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1446
#define SWP_FRAMECHANGED
Definition: winuser.h:1225
#define SWP_NOSIZE
Definition: winuser.h:1230
Definition: ntuser.h:657
FORCEINLINE VOID RECTL_vOffsetRect(_Inout_ RECTL *prcl, _In_ INT cx, _In_ INT cy)
Definition: rect.h:31
static VOID FASTCALL FixClientRect(PRECTL ClientRect, PRECTL WindowRect)
Definition: winpos.c:1078
#define WVR_HREDRAW
Definition: winuser.h:2494
unsigned int UINT
Definition: ndis.h:50
#define WVR_VREDRAW
Definition: winuser.h:2495
#define SWP_SHOWWINDOW
Definition: winuser.h:1233
#define SWP_NOREDRAW
Definition: winuser.h:1231
#define SWP_NOCLIENTMOVE
Definition: msg.h:30
#define SWP_NOMOVE
Definition: winuser.h:1229
static VOID FASTCALL get_valid_rects(RECTL *old_client, RECTL *new_client, UINT flags, RECTL *valid)
Definition: winpos.c:1121
#define SWP_NOCLIENTSIZE
Definition: msg.h:29

Referenced by co_WinPosSetWindowPos().

◆ co_WinPosDoWinPosChanging()

static BOOL FASTCALL co_WinPosDoWinPosChanging ( PWND  Window,
PWINDOWPOS  WinPos,
PRECTL  WindowRect,
PRECTL  ClientRect 
)
static

Definition at line 1264 of file winpos.c.

1268 {
1270 
1271  /* Send WM_WINDOWPOSCHANGING message */
1272 
1273  if (!(WinPos->flags & SWP_NOSENDCHANGING)
1274  && !((WinPos->flags & SWP_AGG_NOCLIENTCHANGE) && (WinPos->flags & SWP_SHOWWINDOW)))
1275  {
1276  TRACE("Sending WM_WINDOWPOSCHANGING to hwnd %p flags %04x.\n", Window->head.h,WinPos->flags);
1277  co_IntSendMessage(Window->head.h, WM_WINDOWPOSCHANGING, 0, (LPARAM) WinPos);
1278  }
1279 
1280  /* Calculate new position and size */
1281 
1282  *WindowRect = Window->rcWindow;
1283  *ClientRect = (Window->style & WS_MINIMIZE) ? Window->rcWindow : Window->rcClient;
1284 
1285  if (!(WinPos->flags & SWP_NOSIZE))
1286  {
1287  if (Window->style & WS_MINIMIZE)
1288  {
1289  WindowRect->right = WindowRect->left + UserGetSystemMetrics(SM_CXMINIMIZED);
1290  WindowRect->bottom = WindowRect->top + UserGetSystemMetrics(SM_CYMINIMIZED);
1291  }
1292  else
1293  {
1294  WindowRect->right = WindowRect->left + WinPos->cx;
1295  WindowRect->bottom = WindowRect->top + WinPos->cy;
1296  }
1297  }
1298 
1299  if (!(WinPos->flags & SWP_NOMOVE))
1300  {
1301  INT X, Y;
1302  PWND Parent;
1303  X = WinPos->x;
1304  Y = WinPos->y;
1305 
1306  Parent = Window->spwndParent;
1307 
1308  // Parent child position issue is in here. SetParent_W7 test CORE-6651.
1309  if (//((Window->style & WS_CHILD) != 0) && <- Fixes wine msg test_SetParent: "rects do not match", the last test.
1310  Parent &&
1311  Parent != Window->head.rpdesk->pDeskInfo->spwnd)
1312  {
1313  TRACE("Not SWP_NOMOVE 1 Parent client offset X %d Y %d\n",X,Y);
1314  X += Parent->rcClient.left;
1315  Y += Parent->rcClient.top;
1316  TRACE("Not SWP_NOMOVE 2 Parent client offset X %d Y %d\n",X,Y);
1317  }
1318 
1319  WindowRect->left = X;
1320  WindowRect->top = Y;
1321  WindowRect->right += X - Window->rcWindow.left;
1322  WindowRect->bottom += Y - Window->rcWindow.top;
1323 
1324  RECTL_vOffsetRect(ClientRect, X - Window->rcWindow.left,
1325  Y - Window->rcWindow.top);
1326  }
1328 
1329  TRACE( "hwnd %p, after %p, swp %d,%d %dx%d flags %08x\n",
1330  WinPos->hwnd, WinPos->hwndInsertAfter, WinPos->x, WinPos->y,
1331  WinPos->cx, WinPos->cy, WinPos->flags );
1332  TRACE("WindowRect: %d %d %d %d\n", WindowRect->left,WindowRect->top,WindowRect->right,WindowRect->bottom);
1333  TRACE("ClientRect: %d %d %d %d\n", ClientRect->left,ClientRect->top,ClientRect->right,ClientRect->bottom);
1334 
1335  return TRUE;
1336 }
#define Y(I)
#define TRUE
Definition: types.h:120
#define SM_CXMINIMIZED
Definition: winuser.h:1010
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
long bottom
Definition: polytest.cpp:53
HWND hwndInsertAfter
Definition: winuser.h:3564
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical 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:728
int32_t INT
Definition: typedefs.h:58
#define SWP_NOSENDCHANGING
Definition: winuser.h:1236
long right
Definition: polytest.cpp:53
Definition: window.c:28
#define WS_MINIMIZE
Definition: pedump.c:622
long top
Definition: polytest.cpp:53
LONG_PTR LPARAM
Definition: windef.h:208
UINT flags
Definition: winuser.h:3569
long left
Definition: polytest.cpp:53
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
#define TRACE(s)
Definition: solgame.cpp:4
if(!(yy_init))
Definition: macro.lex.yy.c:714
#define WM_WINDOWPOSCHANGING
Definition: winuser.h:1643
#define SM_CYMINIMIZED
Definition: winuser.h:1011
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1446
#define SWP_NOSIZE
Definition: winuser.h:1230
Definition: ntuser.h:657
FORCEINLINE VOID RECTL_vOffsetRect(_Inout_ RECTL *prcl, _In_ INT cx, _In_ INT cy)
Definition: rect.h:31
#define SWP_AGG_NOCLIENTCHANGE
Definition: winpos.c:25
#define SWP_SHOWWINDOW
Definition: winuser.h:1233
#define SWP_NOCLIENTMOVE
Definition: msg.h:30
#define SWP_NOMOVE
Definition: winuser.h:1229
HWND hwnd
Definition: winuser.h:3563
#define SWP_NOCLIENTSIZE
Definition: msg.h:29
#define X(b, s)

Referenced by co_WinPosSetWindowPos().

◆ co_WinPosGetMinMaxInfo()

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

Definition at line 931 of file winpos.c.

933 {
934  MINMAXINFO MinMax;
935  PMONITOR monitor;
936  INT xinc, yinc;
937  LONG style = Window->style;
938  LONG adjustedStyle;
939  LONG exstyle = Window->ExStyle;
940  RECT rc;
941  DWORD adjust;
942 
944 
945  /* Compute default values */
946 
947  rc = Window->rcWindow;
948  MinMax.ptReserved.x = rc.left;
949  MinMax.ptReserved.y = rc.top;
950 
951  if ((style & WS_CAPTION) == WS_CAPTION)
952  adjustedStyle = style & ~WS_BORDER; /* WS_CAPTION = WS_DLGFRAME | WS_BORDER */
953  else
954  adjustedStyle = style;
955 
956  if (Window->spwndParent)
957  IntGetClientRect(Window->spwndParent, &rc);
958 
959  adjust = IntGetWindowBorders(adjustedStyle, exstyle);
960 
961  // Handle special case while maximized. CORE-15893
962  if ((adjustedStyle & WS_THICKFRAME) && !(adjustedStyle & WS_CHILD) && !(adjustedStyle & WS_MINIMIZE))
963  adjust += 1;
964 
965  xinc = yinc = adjust;
966 
967  if ((adjustedStyle & WS_THICKFRAME) && (adjustedStyle & WS_CHILD) && !(adjustedStyle & WS_MINIMIZE))
968  {
971  }
972 
973  RECTL_vInflateRect( &rc,
976 
977  xinc = -rc.left;
978  yinc = -rc.top;
979 
980  MinMax.ptMaxSize.x = rc.right - rc.left;
981  MinMax.ptMaxSize.y = rc.bottom - rc.top;
982  if (style & (WS_DLGFRAME | WS_BORDER))
983  {
986  }
987  else
988  {
989  MinMax.ptMinTrackSize.x = 2 * xinc;
990  MinMax.ptMinTrackSize.y = 2 * yinc;
991  }
994  MinMax.ptMaxPosition.x = -xinc;
995  MinMax.ptMaxPosition.y = -yinc;
996 
997  if (!EMPTYPOINT(Window->InternalPos.MaxPos)) MinMax.ptMaxPosition = Window->InternalPos.MaxPos;
998 
999  co_IntSendMessage(Window->head.h, WM_GETMINMAXINFO, 0, (LPARAM)&MinMax);
1000 
1001  /* if the app didn't change the values, adapt them for the current monitor */
1002  if ((monitor = UserGetPrimaryMonitor()))
1003  {
1004  RECT rc_work;
1005 
1006  rc_work = monitor->rcMonitor;
1007 
1008  if (style & WS_MAXIMIZEBOX)
1009  {
1010  if ((style & WS_CAPTION) == WS_CAPTION || !(style & (WS_CHILD | WS_POPUP)))
1011  rc_work = monitor->rcWork;
1012  }
1013 
1014  if (MinMax.ptMaxSize.x == UserGetSystemMetrics(SM_CXSCREEN) + 2 * xinc &&
1015  MinMax.ptMaxSize.y == UserGetSystemMetrics(SM_CYSCREEN) + 2 * yinc)
1016  {
1017  MinMax.ptMaxSize.x = (rc_work.right - rc_work.left) + 2 * xinc;
1018  MinMax.ptMaxSize.y = (rc_work.bottom - rc_work.top) + 2 * yinc;
1019  }
1020  if (MinMax.ptMaxPosition.x == -xinc && MinMax.ptMaxPosition.y == -yinc)
1021  {
1022  MinMax.ptMaxPosition.x = rc_work.left - xinc;
1023  MinMax.ptMaxPosition.y = rc_work.top - yinc;
1024  }
1025  if (MinMax.ptMaxSize.x >= (monitor->rcMonitor.right - monitor->rcMonitor.left) &&
1026  MinMax.ptMaxSize.y >= (monitor->rcMonitor.bottom - monitor->rcMonitor.top) )
1027  {
1028  Window->state |= WNDS_MAXIMIZESTOMONITOR;
1029  }
1030  else
1031  Window->state &= ~WNDS_MAXIMIZESTOMONITOR;
1032  }
1033 
1034 
1035  MinMax.ptMaxTrackSize.x = max(MinMax.ptMaxTrackSize.x,
1036  MinMax.ptMinTrackSize.x);
1037  MinMax.ptMaxTrackSize.y = max(MinMax.ptMaxTrackSize.y,
1038  MinMax.ptMinTrackSize.y);
1039 
1040  if (MaxSize)
1041  *MaxSize = MinMax.ptMaxSize;
1042  if (MaxPos)
1043  *MaxPos = MinMax.ptMaxPosition;
1044  if (MinTrack)
1045  *MinTrack = MinMax.ptMinTrackSize;
1046  if (MaxTrack)
1047  *MaxTrack = MinMax.ptMaxTrackSize;
1048 
1049  return 0; // FIXME: What does it return? Wine returns MINMAXINFO.
1050 }
POINT ptMinTrackSize
Definition: winuser.h:3605
#define WS_THICKFRAME
Definition: pedump.c:630
#define max(a, b)
Definition: svc.c:63
long y
Definition: polytest.cpp:48
POINT ptReserved
Definition: winuser.h:3602
POINT ptMaxSize
Definition: winuser.h:3603
#define SM_CYMINTRACK
Definition: winuser.h:988
long x
Definition: polytest.cpp:48
VOID FASTCALL RECTL_vInflateRect(_Inout_ RECTL *rect, _In_ INT dx, _In_ INT dy)
Definition: rect.c:101
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
DWORD IntGetWindowBorders(DWORD Style, DWORD ExStyle)
Definition: winpos.c:912
LONG top
Definition: windef.h:307
#define WS_DLGFRAME
Definition: pedump.c:626
#define WS_CHILD
Definition: pedump.c:617
#define SM_CYMAXTRACK
Definition: winuser.h:1013
LONG left
Definition: windef.h:306
#define SM_CYFRAME
Definition: winuser.h:986
#define SM_CXFRAME
Definition: winuser.h:984
LONG right
Definition: windef.h:308
int32_t INT
Definition: typedefs.h:58
RECT rcWork
Definition: monitor.h:19
#define EMPTYPOINT(pt)
Definition: winpos.c:28
#define SM_CXSCREEN
Definition: winuser.h:949
Definition: window.c:28
#define WS_MINIMIZE
Definition: pedump.c:622
long LONG
Definition: pedump.c:60
#define SM_CYDLGFRAME
Definition: winuser.h:958
LONG_PTR LPARAM
Definition: windef.h:208
#define WS_MAXIMIZEBOX
Definition: pedump.c:632
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
#define WS_CAPTION
Definition: pedump.c:624
#define SM_CYSCREEN
Definition: winuser.h:950
#define SM_CXDLGFRAME
Definition: winuser.h:956
#define SM_CXMINTRACK
Definition: winuser.h:987
unsigned long DWORD
Definition: ntddk_ex.h:95
POINT ptMaxPosition
Definition: winuser.h:3604
#define SM_CYBORDER
Definition: winuser.h:955
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1446
#define SM_CXBORDER
Definition: winuser.h:954
#define WS_BORDER
Definition: pedump.c:625
#define WS_POPUP
Definition: pedump.c:616
#define WNDS_MAXIMIZESTOMONITOR
Definition: ntuser.h:603
PMONITOR NTAPI UserGetPrimaryMonitor(VOID)
Definition: monitor.c:102
#define SM_CXMAXTRACK
Definition: winuser.h:1012
RECT rcMonitor
Definition: monitor.h:18
LONG bottom
Definition: windef.h:309
POINT ptMaxTrackSize
Definition: winuser.h:3606
Arabic default style
Definition: afstyles.h:93
VOID FASTCALL IntGetClientRect(PWND Wnd, RECTL *Rect)
Definition: winpos.c:91
#define WM_GETMINMAXINFO
Definition: winuser.h:1622

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

◆ co_WinPosGetNonClientSize()

LRESULT FASTCALL co_WinPosGetNonClientSize ( PWND  Window,
RECT WindowRect,
RECT ClientRect 
)

Definition at line 2268 of file winpos.c.

2269 {
2270  LRESULT Result;
2271 
2273 
2274  *ClientRect = *WindowRect;
2275  Result = co_IntSendMessageNoWait(Window->head.h, WM_NCCALCSIZE, FALSE, (LPARAM) ClientRect);
2276 
2277  FixClientRect(ClientRect, WindowRect);
2278 
2279  return Result;
2280 }
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
#define WM_NCCALCSIZE
Definition: winuser.h:1667
Definition: window.c:28
#define FALSE
Definition: types.h:117
_At_(*)(_In_ PWSK_CLIENT Client, _In_opt_ PUNICODE_STRING NodeName, _In_opt_ PUNICODE_STRING ServiceName, _In_opt_ ULONG NameSpace, _In_opt_ GUID *Provider, _In_opt_ PADDRINFOEXW Hints, _Outptr_ PADDRINFOEXW *Result, _In_opt_ PEPROCESS OwningProcess, _In_opt_ PETHREAD OwningThread, _Inout_ PIRP Irp Result)(Mem)) NTSTATUS(WSKAPI *PFN_WSK_GET_ADDRESS_INFO
Definition: wsk.h:426
LONG_PTR LPARAM
Definition: windef.h:208
static VOID FASTCALL FixClientRect(PRECTL ClientRect, PRECTL WindowRect)
Definition: winpos.c:1078
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1710
LONG_PTR LRESULT
Definition: windef.h:209

Referenced by co_IntCreateScrollBars(), and co_UserCreateWindowEx().

◆ co_WinPosMinMaximize()

UINT FASTCALL co_WinPosMinMaximize ( PWND  Wnd,
UINT  ShowFlag,
RECT NewPos 
)

Definition at line 2317 of file winpos.c.

2318 {
2319  POINT Size;
2320  WINDOWPLACEMENT wpl;
2321  LONG old_style;
2322  UINT SwpFlags = 0;
2323 
2324  ASSERT_REFS_CO(Wnd);
2325 
2326  wpl.length = sizeof(wpl);
2327  IntGetWindowPlacement( Wnd, &wpl );
2328 
2329  if (co_HOOK_CallHooks( WH_CBT, HCBT_MINMAX, (WPARAM)Wnd->head.h, ShowFlag))
2330  {
2331  ERR("WinPosMinMaximize WH_CBT Call Hook return!\n");
2332  return SWP_NOSIZE | SWP_NOMOVE;
2333  }
2334  if (Wnd->style & WS_MINIMIZE)
2335  {
2336  switch (ShowFlag)
2337  {
2338  case SW_MINIMIZE:
2339  case SW_SHOWMINNOACTIVE:
2340  case SW_SHOWMINIMIZED:
2341  case SW_FORCEMINIMIZE:
2342  return SWP_NOSIZE | SWP_NOMOVE;
2343  }
2344  if (!co_IntSendMessageNoWait(Wnd->head.h, WM_QUERYOPEN, 0, 0))
2345  {
2346  return(SWP_NOSIZE | SWP_NOMOVE);
2347  }
2348  SwpFlags |= SWP_NOCOPYBITS;
2349  }
2350  switch (ShowFlag)
2351  {
2352  case SW_MINIMIZE:
2353  case SW_SHOWMINNOACTIVE:
2354  case SW_SHOWMINIMIZED:
2355  case SW_FORCEMINIMIZE:
2356  {
2357  //ERR("MinMaximize Minimize\n");
2358  if (Wnd->style & WS_MAXIMIZE)
2359  {
2360  Wnd->InternalPos.flags |= WPF_RESTORETOMAXIMIZED;
2361  }
2362  else
2363  {
2364  Wnd->InternalPos.flags &= ~WPF_RESTORETOMAXIMIZED;
2365  }
2366 
2367  old_style = IntSetStyle( Wnd, WS_MINIMIZE, WS_MAXIMIZE );
2368 
2370 
2371  if (!(Wnd->InternalPos.flags & WPF_SETMINPOSITION))
2372  Wnd->InternalPos.flags &= ~WPF_MININIT;
2373 
2374  WinPosFindIconPos(Wnd, &wpl.ptMinPosition);
2375 
2376  if (!(old_style & WS_MINIMIZE))
2377  {
2378  SwpFlags |= SWP_STATECHANGED;
2379  IntShowOwnedPopups(Wnd, FALSE);
2380  }
2381 
2382  RECTL_vSetRect(NewPos, wpl.ptMinPosition.x, wpl.ptMinPosition.y,
2385  SwpFlags |= SWP_NOCOPYBITS;
2386  break;
2387  }
2388 
2389  case SW_MAXIMIZE:
2390  {
2391  //ERR("MinMaximize Maximize\n");
2392  if ((Wnd->style & WS_MAXIMIZE) && (Wnd->style & WS_VISIBLE))
2393  {
2394  SwpFlags = SWP_NOSIZE | SWP_NOMOVE;
2395  break;
2396  }
2398 
2399  /*ERR("Maximize: %d,%d %dx%d\n",
2400  wpl.ptMaxPosition.x, wpl.ptMaxPosition.y, Size.x, Size.y);
2401  */
2402  old_style = IntSetStyle( Wnd, WS_MAXIMIZE, WS_MINIMIZE );
2403  /*if (old_style & WS_MINIMIZE)
2404  {
2405  IntShowOwnedPopups(Wnd, TRUE);
2406  }*/
2407 
2408  if (!(old_style & WS_MAXIMIZE)) SwpFlags |= SWP_STATECHANGED;
2409  RECTL_vSetRect(NewPos, wpl.ptMaxPosition.x, wpl.ptMaxPosition.y,
2410  //wpl.ptMaxPosition.x + Size.x, wpl.ptMaxPosition.y + Size.y);
2411  Size.x, Size.y);
2412  break;
2413  }
2414 
2415  case SW_SHOWNOACTIVATE:
2416  Wnd->InternalPos.flags &= ~WPF_RESTORETOMAXIMIZED;
2417  /* fall through */
2418  case SW_SHOWNORMAL:
2419  case SW_RESTORE:
2420  case SW_SHOWDEFAULT: /* FIXME: should have its own handler */
2421  {
2422  //ERR("MinMaximize Restore\n");
2423  old_style = IntSetStyle( Wnd, 0, WS_MINIMIZE | WS_MAXIMIZE );
2424  if (old_style & WS_MINIMIZE)
2425  {
2426  IntShowOwnedPopups(Wnd, TRUE);
2427 
2428  if (Wnd->InternalPos.flags & WPF_RESTORETOMAXIMIZED)
2429  {
2431  IntSetStyle( Wnd, WS_MAXIMIZE, 0 );
2432  SwpFlags |= SWP_STATECHANGED;
2433  RECTL_vSetRect(NewPos, wpl.ptMaxPosition.x, wpl.ptMaxPosition.y,
2434  wpl.ptMaxPosition.x + Size.x, wpl.ptMaxPosition.y + Size.y);
2435  break;
2436  }
2437  else
2438  {
2439  *NewPos = wpl.rcNormalPosition;
2440  NewPos->right -= NewPos->left;
2441  NewPos->bottom -= NewPos->top;
2442  break;
2443  }
2444  }
2445  else
2446  {
2447  if (!(old_style & WS_MAXIMIZE))
2448  {
2449  break;
2450  }
2451  SwpFlags |= SWP_STATECHANGED;
2452  Wnd->InternalPos.flags &= ~WPF_RESTORETOMAXIMIZED;
2453  *NewPos = wpl.rcNormalPosition;
2454  NewPos->right -= NewPos->left;
2455  NewPos->bottom -= NewPos->top;
2456  break;
2457  }
2458  }
2459  }
2460  return SwpFlags;
2461 }
#define RDW_NOINTERNALPAINT
Definition: winuser.h:1203
static VOID FASTCALL WinPosFindIconPos(PWND Window, POINT *Pos)
Definition: winpos.c:778
#define SW_SHOWDEFAULT
Definition: winuser.h:774
#define SW_SHOWNOACTIVATE
Definition: winuser.h:768
long y
Definition: polytest.cpp:48
struct _WND::@4253 InternalPos
long x
Definition: polytest.cpp:48
#define TRUE
Definition: types.h:120
#define SM_CXMINIMIZED
Definition: winuser.h:1010
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
#define SW_SHOWMINNOACTIVE
Definition: winuser.h:771
BOOL FASTCALL IntGetWindowPlacement(PWND Wnd, WINDOWPLACEMENT *lpwndpl)
Definition: winpos.c:556
LONG top
Definition: windef.h:307
BOOL FASTCALL IntShowOwnedPopups(PWND OwnerWnd, BOOL fShow)
Definition: window.c:4389
UINT_PTR WPARAM
Definition: windef.h:207
#define WPF_RESTORETOMAXIMIZED
Definition: winuser.h:2507
LONG left
Definition: windef.h:306
#define SW_SHOWMINIMIZED
Definition: winuser.h:765
#define SW_RESTORE
Definition: winuser.h:773
LONG right
Definition: windef.h:308
#define SWP_NOCOPYBITS
Definition: winuser.h:1228
#define FALSE
Definition: types.h:117
#define WS_MINIMIZE
Definition: pedump.c:622
long LONG
Definition: pedump.c:60
THRDESKHEAD head
Definition: ntuser.h:659
smooth NULL
Definition: ftsmooth.c:416
#define WH_CBT
Definition: winuser.h:35
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
UINT FASTCALL co_WinPosGetMinMaxInfo(PWND Window, POINT *MaxSize, POINT *MaxPos, POINT *MinTrack, POINT *MaxTrack)
Definition: winpos.c:931
#define SWP_STATECHANGED
Definition: msg.c:42
#define WPF_SETMINPOSITION
Definition: winuser.h:2508
#define SW_MINIMIZE
Definition: winuser.h:770
LRESULT APIENTRY co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
Definition: hook.c:1103
#define RDW_VALIDATE
Definition: winuser.h:1204
#define WPF_MININIT
Definition: ntuser.h:654
#define SM_CYMINIMIZED
Definition: winuser.h:1011
#define RDW_NOERASE
Definition: winuser.h:1201
IN PVOID IN PVOID IN USHORT IN USHORT Size
Definition: pci.h:361
#define HCBT_MINMAX
Definition: winuser.h:56
#define SWP_NOSIZE
Definition: winuser.h:1230
#define ERR(fmt,...)
Definition: debug.h:110
POINT ptMinPosition
Definition: winuser.h:3268
FORCEINLINE VOID RECTL_vSetRect(_Out_ RECTL *prcl, _In_ LONG left, _In_ LONG top, _In_ LONG right, _In_ LONG bottom)
Definition: rect.h:5
#define SW_SHOWNORMAL
Definition: winuser.h:764
POINT ptMaxPosition
Definition: winuser.h:3269
BOOL FASTCALL co_UserRedrawWindow(PWND Window, const RECTL *UpdateRect, PREGION UpdateRgn, ULONG Flags)
Definition: painting.c:876
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1710
unsigned int UINT
Definition: ndis.h:50
RECT rcNormalPosition
Definition: winuser.h:3270
ULONG FASTCALL IntSetStyle(PWND pwnd, ULONG set_bits, ULONG clear_bits)
Definition: window.c:124
LONG bottom
Definition: windef.h:309
#define SWP_NOMOVE
Definition: winuser.h:1229
#define WM_QUERYOPEN
Definition: winuser.h:1606
#define WS_VISIBLE
Definition: pedump.c:620
#define SW_FORCEMINIMIZE
Definition: winuser.h:775
#define SW_MAXIMIZE
Definition: winuser.h:766
#define WS_MAXIMIZE
Definition: pedump.c:623
DWORD style
Definition: ntuser.h:670

Referenced by co_UserCreateWindowEx(), and co_WinPosShowWindow().

◆ co_WinPosSearchChildren()

static PWND co_WinPosSearchChildren ( IN PWND  ScopeWin,
IN POINT Point,
IN OUT USHORT HitTest,
IN BOOL  Ignore 
)
static

Definition at line 2750 of file winpos.c.

2756 {
2757  HWND *List, *phWnd;
2758  PWND pwndChild = NULL;
2759 
2760  /* not visible */
2761  if (!(ScopeWin->style & WS_VISIBLE))
2762  {
2763  return NULL;
2764  }
2765 
2766  /* not in window or in window region */
2767  if (!IntPtInWindow(ScopeWin, Point->x, Point->y))
2768  {
2769  return NULL;
2770  }
2771 
2772  /* transparent */
2773  if ((ScopeWin->ExStyle & (WS_EX_LAYERED|WS_EX_TRANSPARENT)) == (WS_EX_LAYERED|WS_EX_TRANSPARENT))
2774  {
2775  return NULL;
2776  }
2777 
2778  if (!Ignore && (ScopeWin->style & WS_DISABLED))
2779  { /* disabled child */
2780  if ((ScopeWin->style & (WS_POPUP|WS_CHILD)) == WS_CHILD) return NULL;
2781  /* process the hit error */
2782  *HitTest = HTERROR;
2783  return ScopeWin;
2784  }
2785 
2786  /* not minimized and check if point is inside the window */
2787  if (!(ScopeWin->style & WS_MINIMIZE) &&
2788  RECTL_bPointInRect(&ScopeWin->rcClient, Point->x, Point->y) )
2789  {
2790  UserReferenceObject(ScopeWin);
2791 
2792  List = IntWinListChildren(ScopeWin);
2793  if (List)
2794  {
2795  for (phWnd = List; *phWnd; ++phWnd)
2796  {
2797  if (!(pwndChild = ValidateHwndNoErr(*phWnd)))
2798  {
2799  continue;
2800  }
2801 
2802  pwndChild = co_WinPosSearchChildren(pwndChild, Point, HitTest, Ignore);
2803 
2804  if (pwndChild != NULL)
2805  {
2806  /* We found a window. Don't send any more WM_NCHITTEST messages */
2808  UserDereferenceObject(ScopeWin);
2809  return pwndChild;
2810  }
2811  }
2813  }
2814  UserDereferenceObject(ScopeWin);
2815  }
2816 
2817  if (ScopeWin->head.pti == PsGetCurrentThreadWin32Thread())
2818  {
2819  *HitTest = (USHORT)co_IntSendMessage(ScopeWin->head.h, WM_NCHITTEST, 0, MAKELONG(Point->x, Point->y));
2820 
2821  if ((*HitTest) == (USHORT)HTTRANSPARENT)
2822  {
2823  return NULL;
2824  }
2825  }
2826  else
2827  {
2828  if (*HitTest == HTNOWHERE && pwndChild == NULL) *HitTest = HTCLIENT;
2829  }
2830 
2831  return ScopeWin;
2832 }
#define WS_DISABLED
Definition: pedump.c:621
#define HTTRANSPARENT
Definition: winuser.h:2448
PWND FASTCALL ValidateHwndNoErr(HWND hWnd)
Definition: window.c:96
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
#define WS_EX_TRANSPARENT
Definition: pedump.c:649
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:610
#define WM_NCHITTEST
Definition: winuser.h:1668
#define WS_CHILD
Definition: pedump.c:617
FORCEINLINE BOOL IntPtInWindow(PWND pwnd, INT x, INT y)
Definition: winpos.h:30
#define HTNOWHERE
Definition: winuser.h:2449
#define WS_MINIMIZE
Definition: pedump.c:622
static PWND co_WinPosSearchChildren(IN PWND ScopeWin, IN POINT *Point, IN OUT USHORT *HitTest, IN BOOL Ignore)
Definition: winpos.c:2750
#define MAKELONG(a, b)
Definition: typedefs.h:249
smooth NULL
Definition: ftsmooth.c:416
#define HTERROR
Definition: winuser.h:2447
LIST_ENTRY List
Definition: psmgr.c:57
#define WS_EX_LAYERED
Definition: winuser.h:389
FORCEINLINE BOOL RECTL_bPointInRect(_In_ const RECTL *prcl, _In_ INT x, _In_ INT y)
Definition: rect.h:52
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1446
HWND *FASTCALL IntWinListChildren(PWND Window)
Definition: window.c:255
Definition: ntuser.h:657
unsigned short USHORT
Definition: pedump.c:61
#define WS_POPUP
Definition: pedump.c:616
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define HTCLIENT
Definition: winuser.h:2450
#define USERTAG_WINDOWLIST
Definition: tags.h:297
#define WS_VISIBLE
Definition: pedump.c:620
VOID FASTCALL UserReferenceObject(PVOID obj)
Definition: object.c:697

Referenced by co_WinPosWindowFromPoint().

◆ co_WinPosSendSizeMove()

void FASTCALL co_WinPosSendSizeMove ( PWND  Wnd)

Definition at line 2283 of file winpos.c.

2284 {
2285  RECTL Rect;
2286  LPARAM lParam;
2288 
2289  IntGetClientRect(Wnd, &Rect);
2290  lParam = MAKELONG(Rect.right-Rect.left, Rect.bottom-Rect.top);
2291 
2292  Wnd->state &= ~WNDS_SENDSIZEMOVEMSGS;
2293 
2294  if (Wnd->style & WS_MAXIMIZE)
2295  {
2297  }
2298  else if (Wnd->style & WS_MINIMIZE)
2299  {
2301  lParam = 0;
2302  }
2303 
2305 
2306  if (UserIsDesktopWindow(Wnd->spwndParent))
2307  lParam = MAKELONG(Wnd->rcClient.left, Wnd->rcClient.top);
2308  else
2309  lParam = MAKELONG(Wnd->rcClient.left-Wnd->spwndParent->rcClient.left, Wnd->rcClient.top-Wnd->spwndParent->rcClient.top);
2310 
2312 
2314 }
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:220
#define SIZE_MAXIMIZED
Definition: winuser.h:2482
#define SIZE_RESTORED
Definition: winuser.h:2480
LONG top
Definition: windef.h:307
#define WM_MOVE
Definition: winuser.h:1592
UINT_PTR WPARAM
Definition: windef.h:207
#define WNDS_SENDSIZEMOVEMSGS
Definition: ntuser.h:577
RECT rcClient
Definition: ntuser.h:681
LONG left
Definition: windef.h:306
WPARAM wParam
Definition: combotst.c:138
#define WS_MINIMIZE
Definition: pedump.c:622
#define MAKELONG(a, b)
Definition: typedefs.h:249
LONG_PTR LPARAM
Definition: windef.h:208
#define WOC_RGN_CLIENT
Definition: winddi.h:1265
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
#define WM_SIZE
Definition: winuser.h:1593
#define SIZE_MINIMIZED
Definition: winuser.h:2481
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1710
DWORD state
Definition: ntuser.h:665
VOID FASTCALL IntEngWindowChanged(_In_ struct _WND *Window, _In_ FLONG flChanged)
struct _WND * spwndParent
Definition: ntuser.h:677
VOID FASTCALL IntGetClientRect(PWND Wnd, RECTL *Rect)
Definition: winpos.c:91
LPARAM lParam
Definition: combotst.c:139
struct Rect Rect
#define WS_MAXIMIZE
Definition: pedump.c:623
DWORD style
Definition: ntuser.h:670

Referenced by co_UserCreateWindowEx(), and co_WinPosShowWindow().

◆ co_WinPosSetWindowPos()

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

Definition at line 1720 of file winpos.c.

1729 {
1730  WINDOWPOS WinPos;
1731  RECTL NewWindowRect;
1732  RECTL NewClientRect;
1733  RECTL valid_rects[2];
1734  PREGION VisBefore = NULL;
1735  PREGION VisBeforeJustClient = NULL;
1736  PREGION VisAfter = NULL;
1737  PREGION CopyRgn = NULL;
1738  ULONG WvrFlags = 0;
1739  RECTL OldWindowRect, OldClientRect;
1740  int RgnType;
1741  HDC Dc;
1742  RECTL CopyRect;
1743  PWND Ancestor;
1744  BOOL bPointerInWindow, PosChanged = FALSE;
1746 
1748 
1749  TRACE("pwnd %p, after %p, %d,%d (%dx%d), flags 0x%x",
1750  Window, WndInsertAfter, x, y, cx, cy, flags);
1751 #if DBG
1752  dump_winpos_flags(flags);
1753 #endif
1754 
1755  /* FIXME: Get current active window from active queue. Why? since r2915. */
1756 
1757  bPointerInWindow = IntPtInWindow(Window, gpsi->ptCursor.x, gpsi->ptCursor.y);
1758 
1759  WinPos.hwnd = Window->head.h;
1760  WinPos.hwndInsertAfter = WndInsertAfter;
1761  WinPos.x = x;
1762  WinPos.y = y;
1763  WinPos.cx = cx;
1764  WinPos.cy = cy;
1765  WinPos.flags = flags;
1766 
1767  if ( flags & SWP_ASYNCWINDOWPOS )
1768  {
1769  LRESULT lRes;
1771  if ( ppos )
1772  {
1773  WinPos.flags &= ~SWP_ASYNCWINDOWPOS; // Clear flag.
1774  *ppos = WinPos;
1775  /* Yes it's a pointer inside Win32k! */
1776  lRes = co_IntSendMessageNoWait( WinPos.hwnd, WM_ASYNC_SETWINDOWPOS, 0, (LPARAM)ppos);
1777  /* We handle this the same way as Event Hooks and Hooks. */
1778  if ( !lRes )
1779  {
1781  return FALSE;
1782  }
1783  return TRUE;
1784  }
1785  return FALSE;
1786  }
1787 
1788  co_WinPosDoWinPosChanging(Window, &WinPos, &NewWindowRect, &NewClientRect);
1789 
1790  /* Does the window still exist? */
1791  if (!IntIsWindow(WinPos.hwnd))
1792  {
1793  TRACE("WinPosSetWindowPos: Invalid handle 0x%p!\n",WinPos.hwnd);
1795  return FALSE;
1796  }
1797 
1798  /* Fix up the flags. */
1799  if (!WinPosFixupFlags(&WinPos, Window))
1800  {
1801  // See Note.
1802  return TRUE;
1803  }
1804 
1805  Ancestor = UserGetAncestor(Window, GA_PARENT);
1806  if ( (WinPos.flags & (SWP_NOZORDER | SWP_HIDEWINDOW | SWP_SHOWWINDOW)) != SWP_NOZORDER &&
1807  Ancestor && Ancestor->head.h == IntGetDesktopWindow() )
1808  {
1810  }
1811 
1812  if (!(WinPos.flags & SWP_NOREDRAW))
1813  {
1814  /* Compute the visible region before the window position is changed */
1815  if (!(WinPos.flags & SWP_SHOWWINDOW) &&
1816  (WinPos.flags & (SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER |
1819  {
1821  (Window->style & WS_CLIPSIBLINGS) ? TRUE : FALSE);
1822 
1823  if ( VisBefore != NULL &&
1824  REGION_Complexity(VisBefore) == NULLREGION )
1825  {
1826  REGION_Delete(VisBefore);
1827  VisBefore = NULL;
1828  }
1829  else if(VisBefore)
1830  {
1831  REGION_bOffsetRgn(VisBefore, -Window->rcWindow.left, -Window->rcWindow.top);
1832  }
1833 
1834  /* Calculate the non client area for resizes, as this is used in the copy region */
1835  if ((WinPos.flags & (SWP_NOSIZE | SWP_FRAMECHANGED)) != SWP_NOSIZE)
1836  {
1837  VisBeforeJustClient = VIS_ComputeVisibleRegion(Window, TRUE, FALSE,
1838  (Window->style & WS_CLIPSIBLINGS) ? TRUE : FALSE);
1839 
1840  if ( VisBeforeJustClient != NULL &&
1841  REGION_Complexity(VisBeforeJustClient) == NULLREGION )
1842  {
1843  REGION_Delete(VisBeforeJustClient);
1844  VisBeforeJustClient = NULL;
1845  }
1846  else if(VisBeforeJustClient)
1847  {
1848  REGION_bOffsetRgn(VisBeforeJustClient, -Window->rcWindow.left, -Window->rcWindow.top);
1849  }
1850  }
1851  }
1852  }
1853 
1855  if (Window->hrgnNewFrame)
1856  {
1857  SelectWindowRgn( Window, Window->hrgnNewFrame ); // Should be PSMWP->acvr->hrgnClip
1858  Window->hrgnNewFrame = NULL;
1859  }
1860 
1861  WvrFlags = co_WinPosDoNCCALCSize(Window, &WinPos, &NewWindowRect, &NewClientRect, valid_rects);
1862 
1863 // ERR("co_WinPosDoNCCALCSize returned 0x%x\n valid dest: %d %d %d %d\n valid src : %d %d %d %d\n", WvrFlags,
1864 // valid_rects[0].left,valid_rects[0].top,valid_rects[0].right,valid_rects[0].bottom,
1865 // valid_rects[1].left,valid_rects[1].top,valid_rects[1].right,valid_rects[1].bottom);
1866 
1867  /* Validate link windows. (also take into account shell window in hwndShellWindow) */
1868  if (!(WinPos.flags & SWP_NOZORDER) && WinPos.hwnd != UserGetShellWindow())
1869  {
1871  }
1872 
1873  OldWindowRect = Window->rcWindow;
1874  OldClientRect = Window->rcClient;
1875 
1876  if (NewClientRect.left != OldClientRect.left ||
1877  NewClientRect.top != OldClientRect.top)
1878  {
1879  // Move child window if their parent is moved. Keep Child window relative to Parent...
1881  NewClientRect.left - OldClientRect.left,
1882  NewClientRect.top - OldClientRect.top);
1883  PosChanged = TRUE;
1884  }
1885 
1886  Window->rcWindow = NewWindowRect;
1887  Window->rcClient = NewClientRect;
1888 
1889  /* erase parent when hiding or resizing child */
1890  if (WinPos.flags & SWP_HIDEWINDOW)
1891  {
1892  /* Clear the update region */
1894  NULL,
1895  0,
1897 
1898  if (UserIsDesktopWindow(Window->spwndParent))
1900 
1901  Window->style &= ~WS_VISIBLE; //IntSetStyle( Window, 0, WS_VISIBLE );
1902  Window->head.pti->cVisWindows--;
1904  }
1905  else if (WinPos.flags & SWP_SHOWWINDOW)
1906  {
1907  if ((Window->ExStyle & WS_EX_APPWINDOW) ||
1908  (!(Window->ExStyle & WS_EX_TOOLWINDOW) && !Window->spwndOwner &&
1909  (!Window->spwndParent || UserIsDesktopWindow(Window->spwndParent))))
1910  {
1912  if (!(WinPos.flags & SWP_NOACTIVATE))
1914  }
1915 
1916  Window->style |= WS_VISIBLE; //IntSetStyle( Window, WS_VISIBLE, 0 );
1917  Window->head.pti->cVisWindows++;
1919  }
1920 
1921  if (Window->hrgnUpdate != NULL && Window->hrgnUpdate != HRGN_WINDOW)
1922  {
1923  NtGdiOffsetRgn(Window->hrgnUpdate,
1924  NewWindowRect.left - OldWindowRect.left,
1925  NewWindowRect.top - OldWindowRect.top);
1926  }
1927 
1928  DceResetActiveDCEs(Window); // For WS_VISIBLE changes.
1929 
1930  // Change or update, set send non-client paint flag.
1931  if ( Window->style & WS_VISIBLE &&
1932  (WinPos.flags & SWP_STATECHANGED || (!(Window->state2 & WNDS2_WIN31COMPAT) && WinPos.flags & SWP_NOREDRAW ) ) )
1933  {
1934  TRACE("Set WNDS_SENDNCPAINT %p\n",Window);
1935  Window->state |= WNDS_SENDNCPAINT;
1936  }
1937 
1938  if (!(WinPos.flags & SWP_NOREDRAW))
1939  {
1940  /* Determine the new visible region */
1942  (Window->style & WS_CLIPSIBLINGS) ? TRUE : FALSE);
1943 
1944  if ( VisAfter != NULL &&
1945  REGION_Complexity(VisAfter) == NULLREGION )
1946  {
1947  REGION_Delete(VisAfter);
1948  VisAfter = NULL;
1949  }
1950  else if(VisAfter)
1951  {
1952  REGION_bOffsetRgn(VisAfter, -Window->rcWindow.left, -Window->rcWindow.top);
1953  }
1954 
1955  /*
1956  * Determine which pixels can be copied from the old window position
1957  * to the new. Those pixels must be visible in both the old and new
1958  * position. Also, check the class style to see if the windows of this
1959  * class need to be completely repainted on (horizontal/vertical) size
1960  * change.
1961  */
1962  if ( ( VisBefore != NULL &&
1963  VisAfter != NULL &&
1964  !(WinPos.flags & SWP_NOCOPYBITS) &&
1965  ((WinPos.flags & SWP_NOSIZE) || !(WvrFlags & WVR_REDRAW)) &&
1966  !(Window->ExStyle & WS_EX_TRANSPARENT) ) )
1967  {
1968 
1969  /*
1970  * If this is (also) a window resize, the whole nonclient area
1971  * needs to be repainted. So we limit the copy to the client area,
1972  * 'cause there is no use in copying it (would possibly cause
1973  * "flashing" too). However, if the copy region is already empty,
1974  * we don't have to crop (can't take anything away from an empty
1975  * region...)
1976  */
1977 
1978  CopyRgn = IntSysCreateRectpRgn(0, 0, 0, 0);
1979  if ((WinPos.flags & SWP_NOSIZE) && (WinPos.flags & SWP_NOCLIENTSIZE))
1980  RgnType = IntGdiCombineRgn(CopyRgn, VisAfter, VisBefore, RGN_AND);
1981  else if (VisBeforeJustClient != NULL)
1982  {
1983  RgnType = IntGdiCombineRgn(CopyRgn, VisAfter, VisBeforeJustClient, RGN_AND);
1984  }
1985 
1986  if (VisBeforeJustClient != NULL)
1987  {
1988  REGION_Delete(VisBeforeJustClient);
1989  }
1990 
1991  /* Now use in copying bits which are in the update region. */
1992  if (Window->hrgnUpdate != NULL)
1993  {
1994  PREGION RgnUpdate = REGION_LockRgn(Window->hrgnUpdate);
1995  if (RgnUpdate)
1996  {
1997  REGION_bOffsetRgn(CopyRgn, NewWindowRect.left, NewWindowRect.top);
1998  IntGdiCombineRgn(CopyRgn, CopyRgn, RgnUpdate, RGN_DIFF);
1999  REGION_bOffsetRgn(CopyRgn, -NewWindowRect.left, -NewWindowRect.top);
2000  REGION_UnlockRgn(RgnUpdate);
2001  }
2002  }
2003 
2004  /*
2005  * Now, get the bounding box of the copy region. If it's empty
2006  * there's nothing to copy. Also, it's no use copying bits onto
2007  * themselves.
2008  */
2010  {
2011  /* Nothing to copy, clean up */
2013  CopyRgn = NULL;
2014  }
2015  else if ( OldWindowRect.left != NewWindowRect.left ||
2016  OldWindowRect.top != NewWindowRect.top ||
2017  (WinPos.flags & SWP_FRAMECHANGED) )
2018  {
2019  HRGN DcRgn = NtGdiCreateRectRgn(0, 0, 0, 0);
2020  PREGION DcRgnObj = REGION_LockRgn(DcRgn);
2021 
2022  /*
2023  * Small trick here: there is no function to bitblt a region. So
2024  * we set the region as the clipping region, take the bounding box
2025  * of the region and bitblt that. Since nothing outside the clipping
2026  * region is copied, this has the effect of bitblt'ing the region.
2027  *
2028  * Since NtUserGetDCEx takes ownership of the clip region, we need
2029  * to create a copy of CopyRgn and pass that. We need CopyRgn later
2030  */
2031  IntGdiCombineRgn(DcRgnObj, CopyRgn, NULL, RGN_COPY);
2032  REGION_bOffsetRgn(DcRgnObj, NewWindowRect.left, NewWindowRect.top);
2033  REGION_UnlockRgn(DcRgnObj);
2034  Dc = UserGetDCEx( Window,
2035  DcRgn,
2036  DCX_WINDOW|DCX_CACHE|DCX_INTERSECTRGN|DCX_CLIPSIBLINGS|DCX_KEEPCLIPRGN); // DCX_WINDOW will set first, go read WinDC.c.
2037  NtGdiBitBlt( Dc,
2038  CopyRect.left, CopyRect.top,
2039  CopyRect.right - CopyRect.left,
2040  CopyRect.bottom - CopyRect.top,
2041  Dc,
2042  CopyRect.left + (OldWindowRect.left - NewWindowRect.left),
2043  CopyRect.top + (OldWindowRect.top - NewWindowRect.top),
2044  SRCCOPY,
2045  0,
2046  0);
2047 
2048  UserReleaseDC(Window, Dc, FALSE);
2050  GreDeleteObject(DcRgn);
2051  }
2052  }
2053  else
2054  {
2055  CopyRgn = NULL;
2056  }
2057 
2058  /* We need to redraw what wasn't visible before or force a redraw */
2059  if (VisAfter != NULL)
2060  {
2061  PREGION DirtyRgn = IntSysCreateRectpRgn(0, 0, 0, 0);
2062  if (DirtyRgn)
2063  {
2064  if (CopyRgn != NULL)
2065  {
2066  RgnType = IntGdiCombineRgn(DirtyRgn, VisAfter, CopyRgn, RGN_DIFF);
2067  }
2068  else
2069  {
2070  RgnType = IntGdiCombineRgn(DirtyRgn, VisAfter, 0, RGN_COPY);
2071  }
2072 
2073  if (RgnType != ERROR && RgnType != NULLREGION) // Regions moved.
2074  {
2075  /* old code
2076  NtGdiOffsetRgn(DirtyRgn, Window->rcWindow.left, Window->rcWindow.top);
2077  IntInvalidateWindows( Window,
2078  DirtyRgn,
2079  RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
2080  }
2081  GreDeleteObject(DirtyRgn);
2082  */
2083 
2084  PWND Parent = Window->spwndParent;
2085 
2086  REGION_bOffsetRgn( DirtyRgn, Window->rcWindow.left, Window->rcWindow.top);
2087 
2088  if ( (Window->style & WS_CHILD) && (Parent) && !(Parent->style & WS_CLIPCHILDREN))
2089  {
2092  }
2093  else
2094  {
2096  }
2097  }
2098  else if ( RgnType != ERROR && RgnType == NULLREGION ) // Must be the same. See CORE-7166 & CORE-15934, NC HACK fix.
2099  {
2100  if ( !PosChanged &&
2101  !(WinPos.flags & SWP_DEFERERASE) &&
2102  (WinPos.flags & SWP_FRAMECHANGED) )
2103  {
2104  PWND pwnd = Window;
2105  PWND Parent = Window->spwndParent;
2106 
2107  if ( pwnd->style & WS_CHILD ) // Fix ProgMan menu bar drawing.
2108  {
2109  TRACE("SWP_FRAMECHANGED win child %p Parent %p\n",pwnd,Parent);
2110  pwnd = Parent ? Parent : pwnd;
2111  }
2112 
2113  if ( !(pwnd->style & WS_CHILD) )
2114  {
2115  HRGN DcRgn = NtGdiCreateRectRgn(0, 0, 0, 0);
2116  PREGION DcRgnObj = REGION_LockRgn(DcRgn);
2117  TRACE("SWP_FRAMECHANGED win %p hRgn %p\n",pwnd, DcRgn);
2118  IntGdiCombineRgn(DcRgnObj, VisBefore, NULL, RGN_COPY);
2119  REGION_UnlockRgn(DcRgnObj);
2120  ForceNCPaintErase(pwnd, DcRgn, DcRgnObj);
2121  GreDeleteObject(DcRgn);
2122  }
2123  }
2124  }
2125  REGION_Delete(DirtyRgn);
2126  }
2127  }
2128 
2129  if (CopyRgn != NULL)
2130  {
2132  }
2133 
2134  /* Expose what was covered before but not covered anymore */
2135  if ( VisBefore != NULL )
2136  {
2137  PREGION ExposedRgn = IntSysCreateRectpRgn(0, 0, 0, 0);
2138  if (ExposedRgn)
2139  {
2140  RgnType = IntGdiCombineRgn(ExposedRgn, VisBefore, NULL, RGN_COPY);
2141  REGION_bOffsetRgn(ExposedRgn,
2142  OldWindowRect.left - NewWindowRect.left,
2143  OldWindowRect.top - NewWindowRect.top);
2144 
2145  if ( VisAfter != NULL )
2146  RgnType = IntGdiCombineRgn(ExposedRgn, ExposedRgn, VisAfter, RGN_DIFF);
2147 
2148  if (RgnType != ERROR && RgnType != NULLREGION)
2149  {
2150  co_VIS_WindowLayoutChanged(Window, ExposedRgn);
2151  }
2152  REGION_Delete(ExposedRgn);
2153  }
2154  REGION_Delete(VisBefore);
2155  }
2156 
2157  if (VisAfter != NULL)
2158  {
2159  REGION_Delete(VisAfter);
2160  }
2161  }
2162 
2163  if (!(WinPos.flags & (SWP_NOACTIVATE|SWP_HIDEWINDOW)))
2164  {
2165  if ((Window->style & (WS_CHILD | WS_POPUP)) == WS_CHILD)
2166  {
2168  }
2169  else
2170  {
2171  //ERR("SetWindowPos Set FG Window!\n");
2172  if ( pti->MessageQueue->spwndActive != Window ||
2173  pti->MessageQueue != gpqForeground )
2174  {
2175  //ERR("WPSWP : set active window\n");
2176  if (!(Window->state & WNDS_BEINGACTIVATED)) // Inside SAW?
2177  {
2178  co_IntSetForegroundWindow(Window); // Fixes SW_HIDE issues. Wine win test_SetActiveWindow & test_SetForegroundWindow.
2179  }
2180  }
2181  }
2182  }
2183 
2184  if ( !PosChanged &&
2185  (WinPos.flags & SWP_FRAMECHANGED) &&
2186  !(WinPos.flags & SWP_DEFERERASE) && // Prevent sending WM_SYNCPAINT message.
2187  VisAfter )
2188  {
2189  PWND Parent = Window->spwndParent;
2190  if ( !(Window->style & WS_CHILD) && (Parent) && (Parent->style & WS_CLIPCHILDREN))
2191  {
2192  TRACE("SWP_FRAMECHANGED Parent %p WS_CLIPCHILDREN %p\n",Parent,Window);
2193  UserSyncAndPaintWindows( Parent, RDW_CLIPCHILDREN); // NC should redraw here, see NC HACK fix.
2194  }
2195  }
2196 
2197  // Fix wine msg test_SetFocus, prevents sending WM_WINDOWPOSCHANGED.
2198  if ( VisBefore == NULL &&
2199  VisBeforeJustClient == NULL &&
2200  !(Window->ExStyle & WS_EX_TOPMOST) &&
2202  {
2203  TRACE("No drawing, set no Z order and no redraw!\n");
2204  WinPos.flags |= SWP_NOZORDER|SWP_NOREDRAW;
2205  }
2206 
2207  if(!(flags & SWP_DEFERERASE))
2208  {
2209  /* erase parent when hiding or resizing child */
2210  if ((flags & SWP_HIDEWINDOW) ||
2211  (!(flags & SWP_SHOWWINDOW) &&
2213  {
2214  PWND Parent = Window->spwndParent;
2217  }
2218 
2219  /* Give newly shown windows a chance to redraw */
2220  if(((WinPos.flags & SWP_AGG_STATUSFLAGS) != SWP_AGG_NOPOSCHANGE)
2222  {
2224  }
2225  }
2226 
2227  /* And last, send the WM_WINDOWPOSCHANGED message */
2228 
2229  TRACE("\tstatus hwnd %p flags = %04x\n",Window?Window->head.h:NULL,WinPos.flags & SWP_AGG_STATUSFLAGS);
2230 
2231  if (((WinPos.flags & SWP_AGG_STATUSFLAGS) != SWP_AGG_NOPOSCHANGE)
2233  {
2234  /* WM_WINDOWPOSCHANGED is sent even if SWP_NOSENDCHANGING is set
2235  and always contains final window position.
2236  */
2237  WinPos.x = NewWindowRect.left;
2238  WinPos.y = NewWindowRect.top;
2239  WinPos.cx = NewWindowRect.right - NewWindowRect.left;
2240  WinPos.cy = NewWindowRect.bottom - NewWindowRect.top;
2241  TRACE("WM_WINDOWPOSCHANGED hwnd %p Flags %04x\n",WinPos.hwnd,WinPos.flags);
2242  co_IntSendMessageNoWait(WinPos.hwnd, WM_WINDOWPOSCHANGED, 0, (LPARAM) &WinPos);
2243  }
2244 
2245  if ( WinPos.flags & SWP_FRAMECHANGED || WinPos.flags & SWP_STATECHANGED ||
2246  !(WinPos.flags & SWP_NOCLIENTSIZE) || !(WinPos.flags & SWP_NOCLIENTMOVE) )
2247  {
2248  PWND pWnd = ValidateHwndNoErr(WinPos.hwnd);
2249  if (pWnd)
2250  IntNotifyWinEvent(EVENT_OBJECT_LOCATIONCHANGE, pWnd, OBJID_WINDOW, CHILDID_SELF, WEF_SETBYWNDPTI);
2251  }
2252 
2253  if(bPointerInWindow != IntPtInWindow(Window, gpsi->ptCursor.x, gpsi->ptCursor.y))
2254  {
2255  /* Generate mouse move message */
2256  MSG msg;
2257  msg.message = WM_MOUSEMOVE;
2258  msg.wParam = UserGetMouseButtonsState();
2259  msg.lParam = MAKELPARAM(gpsi->ptCursor.x, gpsi->ptCursor.y);
2260  msg.pt = gpsi->ptCursor;
2262  }
2263 
2264  return TRUE;
2265 }
#define RDW_NOINTERNALPAINT
Definition: winuser.h:1203
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
#define RDW_NOCHILDREN
Definition: winuser.h:1208
PUSER_MESSAGE_QUEUE gpqForeground
Definition: focus.c:12
__kernel_entry W32KAPI HRGN APIENTRY NtGdiCreateRectRgn(_In_ INT xLeft, _In_ INT yTop, _In_ INT xRight, _In_ INT yBottom)
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
Definition: gdiobj.c:1155
VOID FASTCALL co_MsqInsertMouseMessage(MSG *Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: msgqueue.c:580
PWND FASTCALL ValidateHwndNoErr(HWND hWnd)
Definition: window.c:96
#define DCX_CLIPSIBLINGS
Definition: winuser.h:2098
VOID FASTCALL UserSyncAndPaintWindows(PWND pWnd, ULONG Flags)
Definition: painting.c:608
VOID FASTCALL co_VIS_WindowLayoutChanged(PWND Wnd, PREGION NewlyExposed)
Definition: vis.c:145
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:220
#define TRUE
Definition: types.h:120
#define ERROR(name)
Definition: error_private.h:53
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
#define WNDS_SENDNCPAINT
Definition: ntuser.h:584
VOID FASTCALL IntNotifyWinEvent(DWORD Event, PWND pWnd, LONG idObject, LONG idChild, DWORD flags)
Definition: event.c:179
#define MAKELPARAM(l, h)
Definition: winuser.h:3983
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
static HDC
Definition: imagelist.c:92
#define SWP_AGG_STATUSFLAGS
Definition: winpos.c:23
#define OBJID_WINDOW
Definition: winable.h:15
#define WS_EX_TRANSPARENT
Definition: pedump.c:649
#define NULLREGION
Definition: wingdi.h:360
#define HSHELL_WINDOWCREATED
Definition: winuser.h:1240
long bottom
Definition: polytest.cpp:53
static BOOL IntValidateParent(PWND Child, PREGION ValidateRgn)
Definition: winpos.c:1054
HWND hwndInsertAfter
Definition: winuser.h:3564
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
HDC FASTCALL UserGetDCEx(PWND Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
static BOOL FASTCALL co_WinPosDoWinPosChanging(PWND Window, PWINDOWPOS WinPos, PRECTL WindowRect, PRECTL ClientRect)
Definition: winpos.c:1264
UINT_PTR WPARAM
Definition: windef.h:207
BOOL FASTCALL REGION_bOffsetRgn(_Inout_ PREGION prgn, _In_ INT cx, _In_ INT cy)
Definition: region.c:2727
#define WS_CHILD
Definition: pedump.c:617
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical 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:728
#define RDW_FRAME
Definition: winuser.h:1198
#define SWP_NOZORDER
Definition: winuser.h:1232
FORCEINLINE BOOL IntPtInWindow(PWND pwnd, INT x, INT y)
Definition: winpos.h:30
#define WS_CLIPCHILDREN
Definition: pedump.c:619
PREGION FASTCALL REGION_LockRgn(_In_ HRGN hrgn)
Definition: region.c:2377
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
PSERVERINFO gpsi
Definition: main.c:27
WORD FASTCALL UserGetMouseButtonsState(VOID)
Definition: mouse.c:22
#define DCX_INTERSECTRGN
Definition: winuser.h:2104
#define DCX_WINDOW
Definition: winuser.h:2095
#define SWP_HIDEWINDOW
Definition: winuser.h:1226
#define WNDS_BEINGACTIVATED
Definition: ntuser.h:593
#define RGN_AND
Definition: wingdi.h:355
#define SWP_NOCOPYBITS
Definition: winuser.h:1228
long right
Definition: polytest.cpp:53
Definition: window.c:28
PREGION FASTCALL IntSysCreateRectpRgn(INT LeftRect, INT TopRect, INT RightRect, INT BottomRect)
Definition: region.c:2426
VOID FASTCALL IntLinkHwnd(PWND Wnd, HWND hWndPrev)
Definition: window.c:937
#define FALSE
Definition: types.h:117
#define WM_CHILDACTIVATE
Definition: winuser.h:1620
unsigned int BOOL
Definition: ntddk_ex.h:94
#define GA_PARENT
Definition: winuser.h:2763
HWND FASTCALL UserGetShellWindow(VOID)
Definition: window.c:3423
long top
Definition: polytest.cpp:53
static HWND FASTCALL WinPosDoOwnedPopups(PWND Window, HWND hWndInsertAfter)
Definition: winpos.c:1352
#define CHILDID_SELF
Definition: winable.h:14
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:581
THRDESKHEAD head
Definition: ntuser.h:659
static LONG FASTCALL co_WinPosDoNCCALCSize(PWND Window, PWINDOWPOS WinPos, RECTL *WindowRect, RECTL *ClientRect, RECTL *validRects)
Definition: winpos.c:1177
#define DCX_KEEPCLIPRGN
Definition: undocuser.h:66
smooth NULL
Definition: ftsmooth.c:416
#define HRGN_WINDOW
Definition: ntuser.h:329
#define SWP_ASYNCWINDOWPOS
Definition: winuser.h:1238
__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)
LONG_PTR LPARAM
Definition: windef.h:208
Definition: region.h:7
UINT flags
Definition: winuser.h:3569
#define WEF_SETBYWNDPTI
Definition: ntuser.h:213
#define SWP_AGG_NOGEOMETRYCHANGE
Definition: winpos.c:19
long left
Definition: polytest.cpp:53
INT FASTCALL IntGdiCombineRgn(PREGION prgnDest, PREGION prgnSrc1, PREGION prgnSrc2, INT iCombineMode)
Definition: region.c:2506
static BOOL FASTCALL WinPosFixupFlags(WINDOWPOS *WinPos, PWND Wnd)
Definition: winpos.c:1522
VOID SelectWindowRgn(PWND Window, HRGN hRgnClip)
Definition: winpos.c:258
#define TRACE(s)
Definition: solgame.cpp:4
#define ERROR_INVALID_WINDOW_HANDLE
Definition: winerror.h:881
#define SWP_NOACTIVATE
Definition: winuser.h:1227
#define RDW_ERASE
Definition: winuser.h:1197
#define SWP_STATECHANGED
Definition: msg.c:42
VOID FASTCALL co_IntPaintWindows(PWND Wnd, ULONG Flags, BOOL Recurse)
Definition: painting.c:391
BOOL FASTCALL IntIsWindow(HWND hWnd)
Definition: window.c:157
int Window
Definition: x11stubs.h:26
GLbitfield flags
Definition: glext.h:7161
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
__kernel_entry W32KAPI INT APIENTRY NtGdiOffsetRgn(_In_ HRGN hrgn, _In_ INT cx, _In_ INT cy)
Definition: region.c:3981
VOID FASTCALL IntInvalidateWindows(PWND Wnd, PREGION Rgn, ULONG Flags)
Definition: painting.c:630
#define RDW_VALIDATE
Definition: winuser.h:1204
VOID FASTCALL DceResetActiveDCEs(PWND Window)
Definition: windc.c:815
static VOID FASTCALL WinPosInternalMoveWindow(PWND Window, INT MoveX, INT MoveY)
Definition: winpos.c:1492
#define RDW_NOERASE
Definition: winuser.h:1201
#define SWP_FRAMECHANGED
Definition: winuser.h:1225
#define WS_EX_TOPMOST
Definition: pedump.c:647
#define RDW_NOFRAME
Definition: winuser.h:1202
PWND FASTCALL UserGetAncestor(PWND Wnd, UINT Type)
Definition: window.c:3079
#define HSHELL_WINDOWDESTROYED
Definition: winuser.h:1241
#define RGN_COPY
Definition: wingdi.h:356
#define SWP_NOSIZE
Definition: winuser.h:1230
Definition: ntuser.h:657
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:88
#define WVR_REDRAW
Definition: winuser.h:2496
HWND FASTCALL IntGetDesktopWindow(VOID)
Definition: desktop.c:1338
#define DCX_CACHE
Definition: winuser.h:2096
#define SWP_AGG_NOCLIENTCHANGE
Definition: winpos.c:25
#define RGN_DIFF
Definition: wingdi.h:357
BOOL FASTCALL co_UserRedrawWindow(PWND Window, const RECTL *UpdateRect, PREGION UpdateRgn, ULONG Flags)
Definition: painting.c:876
#define RDW_ALLCHILDREN
Definition: winuser.h:1207
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1710
#define WNDS2_WIN31COMPAT
Definition: ntuser.h:617
#define WS_POPUP
Definition: pedump.c:616
#define WM_MOUSEMOVE
Definition: winuser.h:1757
INT FASTCALL UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint)
Definition: windc.c:917
#define SWP_SHOWWINDOW
Definition: winuser.h:1233
#define SWP_NOREDRAW
Definition: winuser.h:1231
#define SWP_DEFERERASE
Definition: winuser.h:1237
VOID co_IntShellHookNotify(WPARAM Message, WPARAM wParam, LPARAM lParam)
Definition: desktop.c:1656
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define USERTAG_SWP
Definition: tags.h:280
PREGION FASTCALL VIS_ComputeVisibleRegion(PWND Wnd, BOOLEAN ClientArea, BOOLEAN ClipChildren, BOOLEAN ClipSiblings)
Definition: vis.c:13
#define WM_WINDOWPOSCHANGED
Definition: winuser.h:1644
#define msg(x)
Definition: auth_time.c:54
VOID FASTCALL REGION_UnlockRgn(_In_ PREGION prgn)
Definition: region.c:2392
_Out_opt_ int * cx
Definition: commctrl.h:581
#define RDW_ERASENOW
Definition: winuser.h:1205
BOOL WINAPI CopyRect(_Out_ LPRECT, _In_ LPCRECT)
#define RDW_CLIPCHILDREN
Definition: painting.h:15
VOID ForceNCPaintErase(PWND Wnd, HRGN hRgn, PREGION pRgn)
Definition: winpos.c:1662
unsigned int ULONG
Definition: retypes.h:1
#define SWP_NOCLIENTMOVE
Definition: msg.h:30
#define SWP_NOMOVE
Definition: winuser.h:1229
#define SWP_AGG_NOPOSCHANGE
Definition: winpos.c:21
INT FASTCALL REGION_Complexity(PREGION prgn)
Definition: region.c:567
#define WS_EX_APPWINDOW
Definition: winuser.h:383
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
INT FASTCALL REGION_GetRgnBox(PREGION Rgn, PRECTL pRect)
Definition: region.c:2562
HWND hwnd
Definition: winuser.h:3563
LONG_PTR LRESULT
Definition: windef.h:209
BOOL FASTCALL co_IntSetForegroundWindow(PWND Window)
Definition: focus.c:1432
#define WS_VISIBLE
Definition: pedump.c:620
#define SWP_NOCLIENTSIZE
Definition: msg.h:29
#define CopyRgn(hrgnDst, hrgnSrc)
Definition: windowsx.h:48
VOID FASTCALL REGION_Delete(PREGION pRgn)
Definition: region.c:2468
VOID FASTCALL UpdateShellHook(PWND Window)
Definition: focus.c:52
#define SRCCOPY
Definition: wingdi.h:332
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27
#define RDW_INVALIDATE
Definition: winuser.h:1200
DWORD style
Definition: ntuser.h:670

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

◆ co_WinPosShowWindow()

BOOLEAN FASTCALL co_WinPosShowWindow ( PWND  Wnd,
INT  Cmd 
)

Definition at line 2467 of file winpos.c.

2468 {
2469  BOOLEAN WasVisible;
2470  UINT Swp = 0, EventMsg = 0;
2471  RECTL NewPos = {0, 0, 0, 0};
2472  BOOLEAN ShowFlag;
2473  LONG style;
2474  PWND Parent;
2475  PTHREADINFO pti;
2476  //HRGN VisibleRgn;
2477  BOOL ShowOwned = FALSE;
2478  BOOL FirstTime = FALSE;
2479  ASSERT_REFS_CO(Wnd);
2480  //KeRosDumpStackFrames(NULL, 20);
2482  WasVisible = (Wnd->style & WS_VISIBLE) != 0;
2483  style = Wnd->style;
2484 
2485  TRACE("co_WinPosShowWindow START hwnd %p Cmd %d usicmd %u\n",
2486  Wnd->head.h, Cmd, pti->ppi->usi.wShowWindow);
2487 
2488  if ( pti->ppi->usi.dwFlags & STARTF_USESHOWWINDOW )
2489  {
2490  if ((Wnd->style & (WS_POPUP|WS_CHILD)) != WS_CHILD)
2491  {
2492  if ((Wnd->style & WS_CAPTION) == WS_CAPTION)
2493  {
2494  if (Wnd->spwndOwner == NULL)
2495  {
2496  if ( Cmd == SW_SHOWNORMAL || Cmd == SW_SHOW)
2497  {
2498  Cmd = SW_SHOWDEFAULT;
2499  }
2500  FirstTime = TRUE;
2501  TRACE("co_WPSW FT 1\n");
2502  }
2503  }
2504  }
2505  }
2506 
2507  if ( Cmd == SW_SHOWDEFAULT )
2508  {
2509  if ( pti->ppi->usi.dwFlags & STARTF_USESHOWWINDOW )
2510  {
2511  Cmd = pti->ppi->usi.wShowWindow;
2512  FirstTime = TRUE;
2513  TRACE("co_WPSW FT 2\n");
2514  }
2515  }
2516 
2517  if (FirstTime)
2518  {
2520  }
2521 
2522  switch (Cmd)
2523  {
2524  case SW_HIDE:
2525  {
2526  if (!WasVisible)
2527  {
2528  //ERR("co_WinPosShowWindow Exit Bad\n");
2529  return FALSE;
2530  }
2532  if (Wnd != pti->MessageQueue->spwndActive)
2533  Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2534  break;
2535  }
2536 
2537  case SW_FORCEMINIMIZE: /* FIXME: Does not work if thread is hung. */
2538  case SW_SHOWMINNOACTIVE:
2539  Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2540  /* Fall through. */
2541  case SW_SHOWMINIMIZED:
2542  Swp |= SWP_SHOWWINDOW;
2543  /* Fall through. */
2544  case SW_MINIMIZE:
2545  {
2546  Swp |= SWP_NOACTIVATE;
2547  if (!(style & WS_MINIMIZE))
2548  {
2549  IntShowOwnedPopups(Wnd, FALSE );
2550  // Fix wine Win test_SetFocus todo #1 & #2,
2551  if (Cmd == SW_SHOWMINIMIZED)
2552  {
2553  //ERR("co_WinPosShowWindow Set focus 1\n");
2554  if ((style & (WS_CHILD | WS_POPUP)) == WS_CHILD)
2556  else
2557  co_UserSetFocus(0);
2558  }
2559 
2560  Swp |= co_WinPosMinMaximize(Wnd, Cmd, &NewPos);
2561 
2562  EventMsg = EVENT_SYSTEM_MINIMIZESTART;
2563  }
2564  else
2565  {
2566  if (WasVisible)
2567  {
2568  //ERR("co_WinPosShowWindow Exit Good\n");
2569  return TRUE;
2570  }
2571  Swp |= SWP_NOSIZE | SWP_NOMOVE;
2572  }
2573  break;
2574  }
2575 
2576  case SW_SHOWMAXIMIZED:
2577  {
2578  Swp |= SWP_SHOWWINDOW;
2579  if (!(style & WS_MAXIMIZE))
2580  {
2581  ShowOwned = TRUE;
2582 
2583  Swp |= co_WinPosMinMaximize(Wnd, SW_MAXIMIZE, &NewPos);
2584 
2585  EventMsg = EVENT_SYSTEM_MINIMIZEEND;
2586  }
2587  else
2588  {
2589  if (WasVisible)
2590  {
2591  //ERR("co_WinPosShowWindow Exit Good 1\n");
2592  return TRUE;
2593  }
2594  Swp |= SWP_NOSIZE | SWP_NOMOVE;
2595  }
2596  break;
2597  }
2598 
2599  case SW_SHOWNA:
2601  if (style & WS_CHILD && !(Wnd->ExStyle & WS_EX_MDICHILD)) Swp |= SWP_NOZORDER;
2602  break;
2603  case SW_SHOW:
2604  if (WasVisible) return(TRUE); // Nothing to do!
2606  /* Don't activate the topmost window. */
2607  if (style & WS_CHILD && !(Wnd->ExStyle & WS_EX_MDICHILD)) Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2608  break;
2609 
2610  case SW_SHOWNOACTIVATE:
2611  Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2612  /* Fall through. */
2613  case SW_SHOWNORMAL:
2614  case SW_SHOWDEFAULT:
2615  case SW_RESTORE:
2616  if (!WasVisible) Swp |= SWP_SHOWWINDOW;
2617  if (style & (WS_MINIMIZE | WS_MAXIMIZE))
2618  {
2619  Swp |= co_WinPosMinMaximize(Wnd, Cmd, &NewPos);
2620  if (style & WS_MINIMIZE) EventMsg = EVENT_SYSTEM_MINIMIZEEND;
2621  }
2622  else
2623  {
2624  if (WasVisible)
2625  {
2626  //ERR("co_WinPosShowWindow Exit Good 3\n");
2627  return TRUE;
2628  }
2629  Swp |= SWP_NOSIZE | SWP_NOMOVE;
2630  }
2631  if ( style & WS_CHILD &&
2632  !(Wnd->ExStyle & WS_EX_MDICHILD) &&
2633  !(Swp & SWP_STATECHANGED))
2634  Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2635  break;
2636 
2637  default:
2638  //ERR("co_WinPosShowWindow Exit Good 4\n");
2639  return WasVisible;
2640  }
2641 
2642  ShowFlag = (Cmd != SW_HIDE);
2643 
2644  if ((ShowFlag != WasVisible || Cmd == SW_SHOWNA) && Cmd != SW_SHOWMAXIMIZED && !(Swp & SWP_STATECHANGED))
2645  {
2646  co_IntSendMessageNoWait(Wnd->head.h, WM_SHOWWINDOW, ShowFlag, 0);
2647 #if 0 // Fix wine msg test_SetParent:WmSetParentSeq_1:2
2648  if (!(Wnd->state2 & WNDS2_WIN31COMPAT)) // <------------- XP sets this bit!
2649  co_IntSendMessageNoWait(Wnd->head.h, WM_SETVISIBLE, ShowFlag, 0);
2650 #endif
2651  if (!VerifyWnd(Wnd)) return WasVisible;
2652  }
2653 
2654  /* We can't activate a child window */
2655  if ((Wnd->style & WS_CHILD) &&
2656  !(Wnd->ExStyle & WS_EX_MDICHILD) &&
2657  Cmd != SW_SHOWNA)
2658  {
2659  //ERR("SWP Child No active and ZOrder\n");
2660  Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2661  }
2662 
2663 #if 0 // Explorer issues with common controls? Someone does not know how CS_SAVEBITS works.
2664  // Breaks startup and shutdown active window...
2665  if ((Wnd->style & (WS_POPUP|WS_CHILD)) != WS_CHILD &&
2666  Wnd->pcls->style & CS_SAVEBITS &&
2667  ((Cmd == SW_SHOW) || (Cmd == SW_NORMAL)))
2668  {
2669  ERR("WinPosShowWindow Set active\n");
2670  //UserSetActiveWindow(Wnd);
2671  co_IntSetForegroundWindow(Wnd); // HACK
2672  Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2673  }
2674 #endif
2675 
2676  if (IsChildVisible(Wnd) || Swp & SWP_STATECHANGED)
2677  {
2678  TRACE("Child is Vis %s or State changed %s. ShowFlag %s Swp %04x\n",
2679  (IsChildVisible(Wnd) ? "TRUE" : "FALSE"), (Swp & SWP_STATECHANGED ? "TRUE" : "FALSE"),
2680  (ShowFlag ? "TRUE" : "FALSE"),LOWORD(Swp));
2681  co_WinPosSetWindowPos( Wnd,
2682  0 != (Wnd->ExStyle & WS_EX_TOPMOST) ? HWND_TOPMOST : HWND_TOP,
2683  NewPos.left,
2684  NewPos.top,
2685  NewPos.right, // NewPos.right - NewPos.left, when minimized and restore, the window becomes smaller.
2686  NewPos.bottom,// NewPos.bottom - NewPos.top,
2687  LOWORD(Swp));
2688  }
2689  else
2690  {
2691  TRACE("Parent Vis?\n");
2692  /* if parent is not visible simply toggle WS_VISIBLE and return */
2693  if (ShowFlag) IntSetStyle( Wnd, WS_VISIBLE, 0 );
2694  else IntSetStyle( Wnd, 0, WS_VISIBLE );
2695  }
2696 
2697  if ( EventMsg ) IntNotifyWinEvent(EventMsg, Wnd, OBJID_WINDOW, CHILDID_SELF, WEF_SETBYWNDPTI);
2698 
2699  if ( ShowOwned ) IntShowOwnedPopups(Wnd, TRUE );
2700 
2701  if ((Cmd == SW_HIDE) || (Cmd == SW_MINIMIZE))
2702  {
2703  if ( Wnd == pti->MessageQueue->spwndActive && pti->MessageQueue == IntGetFocusMessageQueue() )
2704  {
2705  if (UserIsDesktopWindow(Wnd->spwndParent))
2706  {
2707  if (!ActivateOtherWindowMin(Wnd))
2708  {
2710  }
2711  }
2712  else
2713  {
2715  }
2716  }
2717 
2718  /* Revert focus to parent */
2719  if (Wnd == pti->MessageQueue->spwndFocus)
2720  {
2721  Parent = Wnd->spwndParent;
2722  if (UserIsDesktopWindow(Wnd->spwndParent))
2723  Parent = 0;
2725  }
2726  // Hide, just return.
2727  if (Cmd == SW_HIDE) return WasVisible;
2728  }
2729 
2730  /* FIXME: Check for window destruction. */
2731 
2732  if ((Wnd->state & WNDS_SENDSIZEMOVEMSGS) &&
2733  !(Wnd->state2 & WNDS2_INDESTROY))
2734  {
2735  co_WinPosSendSizeMove(Wnd);
2736  }
2737 
2738  /* if previous state was minimized Windows sets focus to the window */
2739  if (style & WS_MINIMIZE)
2740  {
2741  co_UserSetFocus(Wnd);
2742  // Fix wine Win test_SetFocus todo #3,
2744  }
2745  //ERR("co_WinPosShowWindow EXIT\n");
2746  return WasVisible;
2747 }
USERSTARTUPINFO usi
Definition: win32.h:270
#define SW_SHOWDEFAULT
Definition: winuser.h:774
#define SW_NORMAL
Definition: winuser.h:763
DWORD ExStyle
Definition: ntuser.h:668
#define SW_SHOWNOACTIVATE
Definition: winuser.h:768
BOOL FASTCALL IsChildVisible(PWND pWnd)
Definition: winpos.c:225
HWND FASTCALL co_UserSetFocus(PWND Window)
Definition: focus.c:1196
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:220
#define TRUE
Definition: types.h:120
#define SW_HIDE
Definition: winuser.h:762
#define SW_SHOWMAXIMIZED
Definition: winuser.h:767
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
VOID FASTCALL IntNotifyWinEvent(DWORD Event, PWND pWnd, LONG idObject, LONG idChild, DWORD flags)
Definition: event.c:179
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
BOOLEAN FASTCALL co_WinPosSetWindowPos(PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
Definition: winpos.c:1720
#define OBJID_WINDOW
Definition: winable.h:15
#define SW_SHOWMINNOACTIVE
Definition: winuser.h:771
long bottom
Definition: polytest.cpp:53
#define WM_SHOWWINDOW
Definition: winuser.h:1610
#define STARTF_USEPOSITION
Definition: winbase.h:474
BOOL FASTCALL IntShowOwnedPopups(PWND OwnerWnd, BOOL fShow)
Definition: window.c:4389
#define HWND_TOPMOST
Definition: winuser.h:1194
#define HWND_TOP
Definition: winuser.h:1193
#define WNDS_SENDSIZEMOVEMSGS
Definition: ntuser.h:577
#define WS_CHILD
Definition: pedump.c:617
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical 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:728
#define SWP_NOZORDER
Definition: winuser.h:1232
#define SW_SHOWMINIMIZED
Definition: winuser.h:765
#define SW_RESTORE
Definition: winuser.h:773
VOID FASTCALL co_WinPosActivateOtherWindow(PWND Wnd)
Definition: winpos.c:395
PUSER_MESSAGE_QUEUE FASTCALL IntGetFocusMessageQueue(VOID)
Definition: desktop.c:1271
#define SWP_HIDEWINDOW
Definition: winuser.h:1226
PPROCESSINFO ppi
Definition: win32.h:87
long right
Definition: polytest.cpp:53
#define WS_EX_MDICHILD
Definition: winuser.h:394
UINT style
Definition: ntuser.h:548
#define FALSE
Definition: types.h:117
#define WS_MINIMIZE
Definition: pedump.c:622
unsigned int BOOL
Definition: ntddk_ex.h:94
long LONG
Definition: pedump.c:60
long top
Definition: polytest.cpp:53
#define CHILDID_SELF
Definition: winable.h:14
struct _WND * spwndOwner
Definition: ntuser.h:679
THRDESKHEAD head
Definition: ntuser.h:659
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
#define WEF_SETBYWNDPTI
Definition: ntuser.h:213
#define STARTF_USESHOWWINDOW
Definition: winbase.h:472
#define SW_SHOW
Definition: winuser.h:769
long left
Definition: polytest.cpp:53
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
#define WS_CAPTION
Definition: pedump.c:624
#define TRACE(s)
Definition: solgame.cpp:4
#define SWP_NOACTIVATE
Definition: winuser.h:1227
#define SWP_STATECHANGED
Definition: msg.c:42
#define WA_ACTIVE
Definition: winuser.h:2598
void FASTCALL co_WinPosSendSizeMove(PWND Wnd)
Definition: winpos.c:2283
#define SW_MINIMIZE
Definition: winuser.h:770
#define CS_SAVEBITS
Definition: winuser.h:652
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1446
Definition: sacdrv.h:277
#define WS_EX_TOPMOST
Definition: pedump.c:647
#define WM_SETVISIBLE
Definition: undocuser.h:31
#define SW_SHOWNA
Definition: winuser.h:772
BOOL FASTCALL ActivateOtherWindowMin(PWND Wnd)
Definition: winpos.c:284
#define SWP_NOSIZE
Definition: winuser.h:1230
#define ERR(fmt,...)
Definition: debug.h:110
Definition: ntuser.h:657
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:88
#define SW_SHOWNORMAL
Definition: winuser.h:764
#define WM_ACTIVATE
Definition: winuser.h:1594
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1710
DWORD state
Definition: ntuser.h:665
#define WNDS2_WIN31COMPAT
Definition: ntuser.h:617
#define WS_POPUP
Definition: pedump.c:616
#define STARTF_USESIZE
Definition: winbase.h:473
unsigned int UINT
Definition: ndis.h:50
#define SWP_SHOWWINDOW
Definition: winuser.h:1233
WORD wShowWindow
Definition: win32.h:215
UINT FASTCALL co_WinPosMinMaximize(PWND Wnd, UINT ShowFlag, RECT *NewPos)
Definition: winpos.c:2317
struct _WND * spwndParent
Definition: ntuser.h:677
ULONG FASTCALL IntSetStyle(PWND pwnd, ULONG set_bits, ULONG clear_bits)
Definition: window.c:124
DWORD state2
Definition: ntuser.h:666
#define SWP_NOMOVE
Definition: winuser.h:1229
PWND FASTCALL VerifyWnd(PWND pWnd)
Definition: window.c:64
BOOL FASTCALL co_IntSetForegroundWindow(PWND Window)
Definition: focus.c:1432
Arabic default style
Definition: afstyles.h:93
#define WS_VISIBLE
Definition: pedump.c:620
#define SW_FORCEMINIMIZE
Definition: winuser.h:775
#define SW_MAXIMIZE
Definition: winuser.h:766
#define LOWORD(l)
Definition: pedump.c:82
#define WNDS2_INDESTROY
Definition: ntuser.h:616
PCLS pcls
Definition: ntuser.h:684
#define WS_MAXIMIZE
Definition: pedump.c:623
DWORD style
Definition: ntuser.h:670

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 2835 of file winpos.c.

2840 {
2841  PWND Window;
2842  POINT Point = *WinPoint;
2844 
2845  if( ScopeWin == NULL )
2846  {
2847  ScopeWin = UserGetDesktopWindow();
2848  if(ScopeWin == NULL)
2849  return NULL;
2850  }
2851 
2852  *HitTest = HTNOWHERE;
2853 
2854  ASSERT_REFS_CO(ScopeWin);
2855  UserRefObjectCo(ScopeWin, &Ref);
2856 
2857  Window = co_WinPosSearchChildren(ScopeWin, &Point, HitTest, Ignore);
2858 
2859  UserDerefObjectCo(ScopeWin);
2860  if (Window)
2862  ASSERT_REFS_CO(ScopeWin);
2863 
2864  return Window;
2865 }
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
static __inline VOID UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
Definition: object.h:25
#define HTNOWHERE
Definition: winuser.h:2449
Definition: window.c:28
static __inline VOID UserDerefObjectCo(PVOID obj)
Definition: object.h:38
static PWND co_WinPosSearchChildren(IN PWND ScopeWin, IN POINT *Point, IN OUT USHORT *HitTest, IN BOOL Ignore)
Definition: winpos.c:2750
Definition: object.h:3
smooth NULL
Definition: ftsmooth.c:416
int Window
Definition: x11stubs.h:26
PWND FASTCALL UserGetDesktopWindow(VOID)
Definition: desktop.c:1349
Definition: ntuser.h:657

Referenced by co_IntProcessMouseMessage(), and NtUserWindowFromPoint().

◆ DBG_DEFAULT_CHANNEL()

DBG_DEFAULT_CHANNEL ( UserWinpos  )

◆ FixClientRect()

static VOID FASTCALL FixClientRect ( PRECTL  ClientRect,
PRECTL  WindowRect 
)
static

Definition at line 1078 of file winpos.c.

1079 {
1080  if (ClientRect->left < WindowRect->left)
1081  {
1082  ClientRect->left = WindowRect->left;
1083  }
1084  else if (WindowRect->right < ClientRect->left)
1085  {
1086  ClientRect->left = WindowRect->right;
1087  }
1088  if (ClientRect->right < WindowRect->left)
1089  {
1090  ClientRect->right = WindowRect->left;
1091  }
1092  else if (WindowRect->right < ClientRect->right)
1093  {
1094  ClientRect->right = WindowRect->right;
1095  }
1096  if (ClientRect->top < WindowRect->top)
1097  {
1098  ClientRect->top = WindowRect->top;
1099  }
1100  else if (WindowRect->bottom < ClientRect->top)
1101  {
1102  ClientRect->top = WindowRect->bottom;
1103  }
1104  if (ClientRect->bottom < WindowRect->top)
1105  {
1106  ClientRect->bottom = WindowRect->top;
1107  }
1108  else if (WindowRect->bottom < ClientRect->bottom)
1109  {
1110  ClientRect->bottom = WindowRect->bottom;
1111  }
1112 }
long bottom
Definition: polytest.cpp:53
long right
Definition: polytest.cpp:53
long top
Definition: polytest.cpp:53
long left
Definition: polytest.cpp:53

Referenced by co_WinPosDoNCCALCSize(), and co_WinPosGetNonClientSize().

◆ ForceNCPaintErase()

VOID ForceNCPaintErase ( PWND  Wnd,
HRGN  hRgn,
PREGION  pRgn 
)

Definition at line 1662 of file winpos.c.

1663 {
1664  HDC hDC;
1665  PREGION RgnUpdate;
1666  UINT RgnType;
1667  BOOL Create = FALSE;
1668 
1669  if (Wnd->hrgnUpdate == NULL)
1670  {
1671  Wnd->hrgnUpdate = NtGdiCreateRectRgn(0, 0, 0, 0);
1673  Create = TRUE;
1674  }
1675 
1676  if (Wnd->hrgnUpdate != HRGN_WINDOW)
1677  {
1678  RgnUpdate = REGION_LockRgn(Wnd->hrgnUpdate);
1679  if (RgnUpdate)
1680  {
1681  RgnType = IntGdiCombineRgn(RgnUpdate, RgnUpdate, pRgn, RGN_OR);
1682  REGION_UnlockRgn(RgnUpdate);
1683  if (RgnType == NULLREGION)
1684  {
1687  Wnd->hrgnUpdate = NULL;
1688  Create = FALSE;
1689  }
1690  }
1691  }
1692 
1693  IntSendNCPaint( Wnd, hRgn ); // Region can be deleted by the application.
1694 
1695  if (Wnd->hrgnUpdate)
1696  {
1697  hDC = UserGetDCEx( Wnd,
1698  Wnd->hrgnUpdate,
1700 
1702  // Kill the loop, so Clear before we send.
1704  {
1706  }
1707  UserReleaseDC(Wnd, hDC, FALSE);
1708  }
1709 
1710  if (Create)
1711  {
1714  Wnd->hrgnUpdate = NULL;
1715  }
1716 }
__kernel_entry W32KAPI HRGN APIENTRY NtGdiCreateRectRgn(_In_ INT xLeft, _In_ INT yTop, _In_ INT xRight, _In_ INT yBottom)
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
Definition: gdiobj.c:1155
#define TRUE
Definition: types.h:120
_In_ BOOLEAN Create
Definition: pstypes.h:519
VOID FASTCALL IntSendNCPaint(PWND pWnd, HRGN hRgn)
Definition: painting.c:348
static HDC
Definition: imagelist.c:92
#define NULLREGION
Definition: wingdi.h:360
static HRGN hRgn
Definition: mapping.c:33
#define DCX_USESTYLE
Definition: GetDCEx.c:10
HDC FASTCALL UserGetDCEx(PWND Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
UINT_PTR WPARAM
Definition: windef.h:207
PREGION FASTCALL REGION_LockRgn(_In_ HRGN hrgn)
Definition: region.c:2377
#define DCX_INTERSECTRGN
Definition: winuser.h:2104
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
#define DCX_KEEPCLIPRGN
Definition: undocuser.h:66
smooth NULL
Definition: ftsmooth.c:416
#define HRGN_WINDOW
Definition: ntuser.h:329
#define RGN_OR
Definition: wingdi.h:358
Definition: region.h:7
INT FASTCALL IntGdiCombineRgn(PREGION prgnDest, PREGION prgnSrc1, PREGION prgnSrc2, INT iCombineMode)
Definition: region.c:2506
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
BOOL FASTCALL IntGdiSetRegionOwner(HRGN hRgn, DWORD OwnerMask)
Definition: region.c:2478
HRGN hrgnUpdate
Definition: ntuser.h:685
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1446
#define GDI_OBJ_HMGR_POWNED
Definition: ntgdihdl.h:117
static HDC hDC
Definition: 3dtext.c:33
#define DCX_CACHE
Definition: winuser.h:2096
DWORD state
Definition: ntuser.h:665
#define GDI_OBJ_HMGR_PUBLIC
Definition: ntgdihdl.h:116
unsigned int UINT
Definition: ndis.h:50
INT FASTCALL UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint)
Definition: windc.c:917
#define WNDS_SENDERASEBACKGROUND
Definition: ntuser.h:582
VOID FASTCALL REGION_UnlockRgn(_In_ PREGION prgn)
Definition: region.c:2392
#define WNDS_ERASEBACKGROUND
Definition: ntuser.h:583
#define WM_ERASEBKGND
Definition: winuser.h:1607

Referenced by co_WinPosSetWindowPos().

◆ get_valid_rects()

static VOID FASTCALL get_valid_rects ( RECTL old_client,
RECTL new_client,
UINT  flags,
RECTL valid 
)
static

Definition at line 1121 of file winpos.c.

1122 {
1123  int cx, cy;
1124 
1125  if (flags & WVR_REDRAW)
1126  {
1127  RECTL_vSetEmptyRect( &valid[0] );
1128  RECTL_vSetEmptyRect( &valid[1] );
1129  return;
1130  }
1131 
1132  if (flags & WVR_VALIDRECTS)
1133  {
1134  if (!RECTL_bIntersectRect( &valid[0], &valid[0], new_client ) ||
1135  !RECTL_bIntersectRect( &valid[1], &valid[1], old_client ))
1136  {
1137  RECTL_vSetEmptyRect( &valid[0] );
1138  RECTL_vSetEmptyRect( &valid[1] );
1139  return;
1140  }
1142  }
1143  else
1144  {
1145  valid[0] = *new_client;
1146  valid[1] = *old_client;
1147  }
1148 
1149  /* make sure the rectangles have the same size */
1150  cx = min( valid[0].right - valid[0].left, valid[1].right - valid[1].left );
1151  cy = min( valid[0].bottom - valid[0].top, valid[1].bottom - valid[1].top );
1152 
1153  if (flags & WVR_ALIGNBOTTOM)
1154  {
1155  valid[0].top = valid[0].bottom - cy;
1156  valid[1].top = valid[1].bottom - cy;
1157  }
1158  else
1159  {
1160  valid[0].bottom = valid[0].top + cy;
1161  valid[1].bottom = valid[1].top + cy;
1162  }
1163  if (flags & WVR_ALIGNRIGHT)
1164  {
1165  valid[0].left = valid[0].right - cx;
1166  valid[1].left = valid[1].right - cx;
1167  }
1168  else
1169  {
1170  valid[0].right = valid[0].left + cx;
1171  valid[1].right = valid[1].left + cx;
1172  }
1173 }
#define WVR_ALIGNRIGHT
Definition: winuser.h:2493
FORCEINLINE VOID RECTL_vSetEmptyRect(_Out_ RECTL *prcl)
Definition: rect.h:20
long bottom
Definition: polytest.cpp:53
#define WVR_ALIGNLEFT
Definition: winuser.h:2491
long right
Definition: polytest.cpp:53
#define WVR_ALIGNTOP
Definition: winuser.h:2490
long top
Definition: polytest.cpp:53
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:581
GLint GLint bottom
Definition: glext.h:7726
long left
Definition: polytest.cpp:53
BOOL FASTCALL RECTL_bIntersectRect(_Out_ RECTL *prclDst, _In_ const RECTL *prcl1, _In_ const RECTL *prcl2)
Definition: rect.c:55
GLint left
Definition: glext.h:7726
GLdouble GLdouble right
Definition: glext.h:10859
#define WVR_VALIDRECTS
Definition: winuser.h:2497
GLbitfield flags
Definition: glext.h:7161
#define WVR_REDRAW
Definition: winuser.h:2496
#define min(a, b)
Definition: monoChain.cc:55
_Out_opt_ int * cx
Definition: commctrl.h:581
#define WVR_ALIGNBOTTOM
Definition: winuser.h:2492
GLdouble GLdouble GLdouble GLdouble top
Definition: glext.h:10859

Referenced by co_WinPosDoNCCALCSize().

◆ IntChildWindowFromPointEx()

PWND APIENTRY IntChildWindowFromPointEx ( PWND  Parent,
LONG  x,
LONG  y,
UINT  uiFlags 
)

Definition at line 2910 of file winpos.c.

2911 {
2912  POINTL Pt;
2913  HWND *List, *phWnd;
2914  PWND pwndHit = NULL;
2915 
2916  Pt.x = x;
2917  Pt.y = y;
2918 
2920  {
2921  if (Parent->ExStyle & WS_EX_LAYOUTRTL)
2922  Pt.x = Parent->rcClient.right - Pt.x;
2923  else
2924  Pt.x += Parent->rcClient.left;
2925  Pt.y += Parent->rcClient.top;
2926  }
2927 
2928  if (!IntPtInWindow(Parent, Pt.x, Pt.y)) return NULL;
2929 
2930  if ((List = IntWinListChildren(Parent)))
2931  {
2932  for (phWnd = List; *phWnd; phWnd++)
2933  {
2934  PWND Child;
2935  if ((Child = ValidateHwndNoErr(*phWnd)))
2936  {
2937  if (uiFlags & (CWP_SKIPINVISIBLE|CWP_SKIPDISABLED))
2938  {
2939  if (!(Child->style & WS_VISIBLE) && (uiFlags & CWP_SKIPINVISIBLE)) continue;
2940  if ((Child->style & WS_DISABLED) && (uiFlags & CWP_SKIPDISABLED)) continue;
2941  }
2942 
2943  if (uiFlags & CWP_SKIPTRANSPARENT)
2944  {
2945  if (Child->ExStyle & WS_EX_TRANSPARENT) continue;
2946  }
2947 
2948  if (IntPtInWindow(Child, Pt.x, Pt.y))
2949  {
2950  pwndHit = Child;
2951  break;
2952  }
2953  }
2954  }
2956  }
2957  return pwndHit ? pwndHit : Parent;
2958 }
#define WS_DISABLED
Definition: pedump.c:621
PWND FASTCALL ValidateHwndNoErr(HWND hWnd)
Definition: window.c:96
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:220
#define CWP_SKIPTRANSPARENT
Definition: winuser.h:210
#define WS_EX_TRANSPARENT
Definition: pedump.c:649
#define WS_EX_LAYOUTRTL
Definition: winuser.h:390
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical 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:728
FORCEINLINE BOOL IntPtInWindow(PWND pwnd, INT x, INT y)
Definition: winpos.h:30
LONG y
Definition: windef.h:330
#define CWP_SKIPINVISIBLE
Definition: winuser.h:208
#define CWP_SKIPDISABLED
Definition: winuser.h:209
smooth NULL
Definition: ftsmooth.c:416
LIST_ENTRY List
Definition: psmgr.c:57
LONG x
Definition: windef.h:329
HWND *FASTCALL IntWinListChildren(PWND Window)
Definition: window.c:255
Definition: ntuser.h:657
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical 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 ACPI_HANDLE Child
Definition: acpixf.h:728
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define USERTAG_WINDOWLIST
Definition: tags.h:297
#define WS_VISIBLE
Definition: pedump.c:620

Referenced by NtUserChildWindowFromPointEx().

◆ IntClientToScreen()

BOOL FASTCALL IntClientToScreen ( PWND  Wnd,
LPPOINT  lpPoint 
)

Definition at line 198 of file winpos.c.

199 {
200  if (Wnd && Wnd->fnid != FNID_DESKTOP )
201  {
202  if (Wnd->ExStyle & WS_EX_LAYOUTRTL)
203  lpPoint->x = Wnd->rcClient.right - lpPoint->x;
204  else
205  lpPoint->x += Wnd->rcClient.left;
206  lpPoint->y += Wnd->rcClient.top;
207  }
208  return TRUE;
209 }
DWORD ExStyle
Definition: ntuser.h:668
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
#define TRUE
Definition: types.h:120
LONG top
Definition: windef.h:307
#define WS_EX_LAYOUTRTL
Definition: winuser.h:390
RECT rcClient
Definition: ntuser.h:681
LONG left
Definition: windef.h:306
LONG right
Definition: windef.h:308
DWORD fnid
Definition: ntuser.h:673
#define FNID_DESKTOP
Definition: ntuser.h:824

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

◆ IntDeferWindowPos()

HDWP FASTCALL IntDeferWindowPos ( HDWP  hdwp,
HWND  hwnd,
HWND  hwndAfter,
INT  x,
INT  y,
INT  cx,
INT  cy,
UINT  flags 
)

Definition at line 2962 of file winpos.c.

2970 {
2971  PSMWP pDWP;
2972  int i;
2973  HDWP retvalue = hdwp;
2974 
2975  TRACE("hdwp %p, hwnd %p, after %p, %d,%d (%dx%d), flags %08x\n",
2976  hdwp, hwnd, hwndAfter, x, y, cx, cy, flags);
2977 
2978  if (flags & ~(SWP_NOSIZE | SWP_NOMOVE |
2983  {
2985  return NULL;
2986  }
2987 
2988  if (!(pDWP = (PSMWP)UserGetObject(gHandleTable, hdwp, TYPE_SETWINDOWPOS)))
2989  {
2991  return NULL;
2992  }
2993 
2994  for (i = 0; i < pDWP->ccvr; i++)
2995  {
2996  if (pDWP->acvr[i].pos.hwnd == hwnd)
2997  {
2998  /* Merge with the other changes */
2999  if (!(flags & SWP_NOZORDER))
3000  {
3001  pDWP->acvr[i].pos.hwndInsertAfter = hwndAfter;
3002  }
3003  if (!(flags & SWP_NOMOVE))
3004  {
3005  pDWP->acvr[i].pos.x = x;
3006  pDWP->acvr[i].pos.y = y;
3007  }
3008  if (!(flags & SWP_NOSIZE))
3009  {
3010  pDWP->acvr[i].pos.cx = cx;
3011  pDWP->acvr[i].pos.cy = cy;
3012  }
3013  pDWP->acvr[i].pos.flags &= flags | ~(SWP_NOSIZE | SWP_NOMOVE |
3017  pDWP->acvr[i].pos.flags |= flags & (SWP_SHOWWINDOW | SWP_HIDEWINDOW |
3019  goto END;
3020  }
3021  }
3022  if (pDWP->ccvr >= pDWP->ccvrAlloc)
3023  {
3024  PCVR newpos = ExAllocatePoolWithTag(PagedPool, pDWP->ccvrAlloc * 2 * sizeof(CVR), USERTAG_SWP);
3025  if (!newpos)
3026  {
3027  retvalue = NULL;
3028  goto END;
3029  }
3030  RtlZeroMemory(newpos, pDWP->ccvrAlloc * 2 * sizeof(CVR));
3031  RtlCopyMemory(newpos, pDWP->acvr, pDWP->ccvrAlloc * sizeof(CVR));
3033  pDWP->ccvrAlloc *= 2;
3034  pDWP->acvr = newpos;
3035  }
3036  pDWP->acvr[pDWP->ccvr].pos.hwnd = hwnd;
3037  pDWP->acvr[pDWP->ccvr].pos.hwndInsertAfter = hwndAfter;
3038  pDWP->acvr[pDWP->ccvr].pos.x = x;
3039  pDWP->acvr[pDWP->ccvr].pos.y = y;
3040  pDWP->acvr[pDWP->ccvr].pos.cx = cx;
3041  pDWP->acvr[pDWP->ccvr].pos.cy = cy;
3042  pDWP->acvr[pDWP->ccvr].pos.flags = flags;
3043  pDWP->acvr[pDWP->ccvr].hrgnClip = NULL;
3044  pDWP->acvr[pDWP->ccvr].hrgnInterMonitor = NULL;
3045  pDWP->ccvr++;
3046 END:
3047  return retvalue;
3048 }
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
const DOCKBAR PVOID HWND HWND * hwnd
Definition: tooldock.h:22
#define ERROR_INVALID_DWP_HANDLE
Definition: winerror.h:886
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
HRGN hrgnClip
Definition: winpos.h:16
HWND hwndInsertAfter
Definition: winuser.h:3564
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
#define SWP_NOZORDER
Definition: winuser.h:1232
WINDOWPOS pos
Definition: winpos.h:5
#define SWP_HIDEWINDOW
Definition: winuser.h:1226
#define SWP_NOCOPYBITS
Definition: winuser.h:1228
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
INT ccvr
Definition: winpos.h:25
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:581
smooth NULL
Definition: ftsmooth.c:416
UINT flags
Definition: winuser.h:3569
Definition: infcodes.c:25
#define TRACE(s)
Definition: solgame.cpp:4
HRGN hrgnInterMonitor
Definition: winpos.h:17
#define SWP_NOACTIVATE
Definition: winuser.h:1227
Definition: winpos.h:3
Definition: winpos.h:20
GLbitfield flags
Definition: glext.h:7161
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define SWP_FRAMECHANGED
Definition: winuser.h:1225
#define SWP_NOSIZE
Definition: winuser.h:1230
PVOID UserGetObject(PUSER_HANDLE_TABLE ht, HANDLE handle, HANDLE_TYPE type)
Definition: object.c:462
INT ccvrAlloc
Definition: winpos.h:26
#define SWP_SHOWWINDOW
Definition: winuser.h:1233
#define SWP_NOREDRAW
Definition: winuser.h:1231
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
#define USERTAG_SWP
Definition: tags.h:280
_Out_opt_ int * cx
Definition: commctrl.h:581
PCVR acvr
Definition: winpos.h:27
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define SWP_NOMOVE
Definition: winuser.h:1229
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
HWND hwnd
Definition: winuser.h:3563
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27
#define SWP_NOOWNERZORDER
Definition: winuser.h:1234

Referenced by NtUserDeferWindowPos().

◆ IntEndDeferWindowPosEx()

BOOL FASTCALL IntEndDeferWindowPosEx ( HDWP  hdwp,
BOOL  sAsync 
)

Definition at line 3050 of file winpos.c.

3051 {
3052  PSMWP pDWP;
3053  PCVR winpos;
3054  BOOL res = TRUE;
3055  int i;
3056 
3057  TRACE("%p\n", hdwp);
3058 
3059  if (!(pDWP = (PSMWP)UserGetObject(gHandleTable, hdwp, TYPE_SETWINDOWPOS)))
3060  {
3062  return FALSE;
3063  }
3064 
3065  for (i = 0, winpos = pDWP->acvr; res && i < pDWP->ccvr; i++, winpos++)
3066  {
3067  PWND pwnd;
3069 
3070  TRACE("hwnd %p, after %p, %d,%d (%dx%d), flags %08x\n",
3071  winpos->pos.hwnd, winpos->pos.hwndInsertAfter, winpos->pos.x, winpos->pos.y,
3072  winpos->pos.cx, winpos->pos.cy, winpos->pos.flags);
3073 
3074  pwnd = ValidateHwndNoErr(winpos->pos.hwnd);
3075  if (!pwnd)
3076  continue;
3077 
3078  UserRefObjectCo(pwnd, &Ref);
3079 
3080  if ( sAsync )
3081  {
3082  LRESULT lRes;
3084  if ( ppos )
3085  {
3086  *ppos = winpos->pos;
3087  /* Yes it's a pointer inside Win32k! */
3088  lRes = co_IntSendMessageNoWait( winpos->pos.hwnd, WM_ASYNC_SETWINDOWPOS, 0, (LPARAM)ppos);
3089  /* We handle this the same way as Event Hooks and Hooks. */
3090  if ( !lRes )
3091  {
3093  }
3094  }
3095  }
3096  else
3097  res = co_WinPosSetWindowPos( pwnd,
3098  winpos->pos.hwndInsertAfter,
3099  winpos->pos.x,
3100  winpos->pos.y,
3101  winpos->pos.cx,
3102  winpos->pos.cy,
3103  winpos->pos.flags);
3104 
3105  // Hack to pass tests.... Must have some work to do so clear the error.
3106  if (res && (winpos->pos.flags & (SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER)) == SWP_NOZORDER )
3108 
3109  UserDerefObjectCo(pwnd);
3110  }
3112  UserDereferenceObject(pDWP);
3114  return res;
3115 }
#define ERROR_INVALID_DWP_HANDLE
Definition: winerror.h:886
BOOL FASTCALL UserDeleteObject(HANDLE h, HANDLE_TYPE type)
Definition: object.c:683
PWND FASTCALL ValidateHwndNoErr(HWND hWnd)
Definition: window.c:96
#define ERROR_SUCCESS
Definition: deptool.c:10
#define TRUE
Definition: types.h:120
BOOLEAN FASTCALL co_WinPosSetWindowPos(PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
Definition: winpos.c:1720
static __inline VOID UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
Definition: object.h:25
HWND hwndInsertAfter
Definition: winuser.h:3564
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:610
#define SWP_NOZORDER
Definition: winuser.h:1232
WINDOWPOS pos
Definition: winpos.h:5
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
static __inline VOID UserDerefObjectCo(PVOID obj)
Definition: object.h:38
Definition: object.h:3
LONG_PTR LPARAM
Definition: windef.h:208
UINT flags
Definition: winuser.h:3569
#define TRACE(s)
Definition: solgame.cpp:4
Definition: winpos.h:3
Definition: winpos.h:20
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define SWP_NOSIZE
Definition: winuser.h:1230
Definition: ntuser.h:657
PVOID UserGetObject(PUSER_HANDLE_TABLE ht, HANDLE handle, HANDLE_TYPE type)
Definition: object.c:462
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1710
#define USERTAG_SWP
Definition: tags.h:280
GLuint res
Definition: glext.h:9613
PCVR acvr
Definition: winpos.h:27
#define SWP_NOMOVE
Definition: winuser.h:1229
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
HWND hwnd
Definition: winuser.h:3563
LONG_PTR LRESULT
Definition: windef.h:209
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27

Referenced by NtUserEndDeferWindowPosEx().

◆ IntGetClientOrigin()

BOOL FASTCALL IntGetClientOrigin ( PWND Window  OPTIONAL,
LPPOINT  Point 
)

Definition at line 70 of file winpos.c.

71 {
73  if (Window == NULL)
74  {
75  Point->x = Point->y = 0;
76  return FALSE;
77  }
78  Point->x = Window->rcClient.left;
79  Point->y = Window->rcClient.top;
80 
81  return TRUE;
82 }
#define TRUE
Definition: types.h:120
Definition: window.c:28
#define FALSE
Definition: types.h:117
smooth NULL
Definition: ftsmooth.c:416
int Window
Definition: x11stubs.h:26
PWND FASTCALL UserGetDesktopWindow(VOID)
Definition: desktop.c:1349

Referenced by co_IntFixCaret(), and IntScrollWindowEx().

◆ IntGetClientRect()

VOID FASTCALL IntGetClientRect ( PWND  Wnd,
RECTL Rect 
)

Internal function. Returns client window rectangle relative to the upper-left corner of client area.

Note
Does not check the validity of the parameters

Definition at line 91 of file winpos.c.

92 {
93  ASSERT( Wnd );
94  ASSERT( Rect );
95  if (Wnd->style & WS_MINIMIZED)
96  {
97  Rect->left = Rect->top = 0;
100  return;
101  }
102  if (!UserIsDesktopWindow(Wnd))
103  {
104  *Rect = Wnd->rcClient;
106  }
107  else
108  {
109  Rect->left = Rect->top = 0;
110  Rect->right = Wnd->rcClient.right;
111  Rect->bottom = Wnd->rcClient.bottom;
112  /* Do this until Init bug is fixed. This sets 640x480, see InitMetrics.
113  Rect->right = UserGetSystemMetrics(SM_CXSCREEN);
114  Rect->bottom = UserGetSystemMetrics(SM_CYSCREEN);
115  */
116  }
117 }
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:220
#define SM_CXMINIMIZED
Definition: winuser.h:1010
LONG top
Definition: windef.h:307
RECT rcClient
Definition: ntuser.h:681
LONG left
Definition: windef.h:306
LONG right
Definition: windef.h:308
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
#define WS_MINIMIZED
Definition: undocuser.h:18
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define SM_CYMINIMIZED
Definition: winuser.h:1011
FORCEINLINE VOID RECTL_vOffsetRect(_Inout_ RECTL *prcl, _In_ INT cx, _In_ INT cy)
Definition: rect.h:31
LONG bottom
Definition: windef.h:309
DWORD style
Definition: ntuser.h:670

Referenced by co_IntDrawCaret(), co_WinPosArrangeIconicWindows(), co_WinPosGetMinMaxInfo(), co_WinPosSendSizeMove(), DefWndDoSizeMove(), DefWndHandleWindowPosChanged(), IntBeginPaint(), IntCalculateThumb(), IntDefWindowProc(), IntFillWindow(), IntGetScrollBarRect(), IntScrollWindowEx(), MENU_DrawPopupMenu(), MENU_EnsureMenuItemVisible(), NC_DoNCPaint(), and WinPosFindIconPos().

◆ IntGetLastTopMostWindow()

PWND FASTCALL IntGetLastTopMostWindow ( VOID  )

Definition at line 237 of file winpos.c.

238 {
239  PWND pWnd;
240  PDESKTOP rpdesk = gptiCurrent->rpdesk;
241 
242  if ( rpdesk &&
243  (pWnd = rpdesk->pDeskInfo->spwnd->spwndChild) &&
244  pWnd->ExStyle & WS_EX_TOPMOST)
245  {
246  for (;;)
247  {
248  if (!pWnd->spwndNext) break;
249  if (!(pWnd->spwndNext->ExStyle & WS_EX_TOPMOST)) break;
250  pWnd = pWnd->spwndNext;
251  }
252  return pWnd;
253  }
254  return NULL;
255 }
DWORD ExStyle
Definition: ntuser.h:668
PDESKTOPINFO pDeskInfo
Definition: desktop.h:8
struct _DESKTOP * rpdesk
Definition: win32.h:91
smooth NULL
Definition: ftsmooth.c:416
PTHREADINFO gptiCurrent
Definition: ntuser.c:15
struct _WND * spwndNext
Definition: ntuser.h:675
#define WS_EX_TOPMOST
Definition: pedump.c:647
struct _WND * spwnd
Definition: ntuser.h:136
Definition: ntuser.h:657

Referenced by ActivateOtherWindowMin().

◆ IntGetWindowBorderMeasures()

VOID FASTCALL IntGetWindowBorderMeasures ( PWND  Wnd,
UINT cx,
UINT cy 
)

Definition at line 858 of file winpos.c.

859 {
860  if(HAS_DLGFRAME(Wnd->style, Wnd->ExStyle) && !(Wnd->style & WS_MINIMIZE))
861  {
864  }
865  else
866  {
867  if(HAS_THICKFRAME(Wnd->style, Wnd->ExStyle)&& !(Wnd->style & WS_MINIMIZE))
868  {
871  }
872  else if(HAS_THINFRAME(Wnd->style, Wnd->ExStyle))
873  {
876  }
877  else
878  {
879  *cx = *cy = 0;
880  }
881  }
882 }
DWORD ExStyle
Definition: ntuser.h:668
#define SM_CYFRAME
Definition: winuser.h:986
#define SM_CXFRAME
Definition: winuser.h:984
#define WS_MINIMIZE
Definition: pedump.c:622
#define SM_CYDLGFRAME
Definition: winuser.h:958
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:581
#define HAS_THINFRAME(Style, ExStyle)
Definition: window.h:16
#define HAS_THICKFRAME(Style, ExStyle)
Definition: window.h:12
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
#define SM_CXDLGFRAME
Definition: winuser.h:956
#define SM_CYBORDER
Definition: winuser.h:955
#define SM_CXBORDER
Definition: winuser.h:954
_Out_opt_ int * cx
Definition: commctrl.h:581
#define HAS_DLGFRAME(Style, ExStyle)
Definition: window.h:8
DWORD style
Definition: ntuser.h:670

◆ IntGetWindowBorders()

DWORD IntGetWindowBorders ( DWORD  Style,
DWORD  ExStyle 
)

Definition at line 912 of file winpos.c.

913 {
914  DWORD adjust = 0;
915 
916  if ( ExStyle & WS_EX_WINDOWEDGE ) // 1st
917  adjust = 2; /* outer */
918  else if ( ExStyle & WS_EX_STATICEDGE ) // 2nd
919  adjust = 1; /* for the outer frame always present */
920 
922  adjust += 2;
923 
925  adjust++; /* The other border */
926 
927  return adjust;
928 }
#define WS_EX_WINDOWEDGE
Definition: winuser.h:407
#define WS_EX_DLGMODALFRAME
Definition: pedump.c:645
#define WS_CAPTION
Definition: pedump.c:624
const DWORD Style
Definition: appswitch.c:71
unsigned long DWORD
Definition: ntddk_ex.h:95
#define WS_EX_CLIENTEDGE
Definition: winuser.h:384
#define WS_EX_STATICEDGE
Definition: winuser.h:403
const DWORD ExStyle
Definition: appswitch.c:72

Referenced by co_WinPosGetMinMaxInfo().

◆ IntGetWindowPlacement()

BOOL FASTCALL IntGetWindowPlacement ( PWND  Wnd,
WINDOWPLACEMENT lpwndpl 
)

Definition at line 556 of file winpos.c.

557 {
558  if (!Wnd) return FALSE;
559 
560  if(lpwndpl->length != sizeof(WINDOWPLACEMENT))
561  {
562  return FALSE;
563  }
564 
565  lpwndpl->flags = 0;
566 
567  WinPosInitInternalPos(Wnd, &Wnd->rcWindow);
568 
569  lpwndpl->showCmd = SW_HIDE;
570 
571  if ( Wnd->style & WS_MINIMIZE )
572  lpwndpl->showCmd = SW_SHOWMINIMIZED;
573  else
574  lpwndpl->showCmd = ( Wnd->style & WS_MAXIMIZE ) ? SW_SHOWMAXIMIZED : SW_SHOWNORMAL ;
575 
576  lpwndpl->rcNormalPosition = Wnd->InternalPos.NormalRect;
577 
578  if (Wnd->InternalPos.flags & WPF_MININIT) // Return if it was set!
579  {
580  lpwndpl->ptMinPosition.x = Wnd->InternalPos.IconPos.x;
581  lpwndpl->ptMinPosition.y = Wnd->InternalPos.IconPos.y;
582  }
583  else
584  lpwndpl->ptMinPosition.x = lpwndpl->ptMinPosition.y = -1;
585 
586  if ( Wnd->InternalPos.flags & WPF_MAXINIT && // Return if set and not maximized to monitor!
587  !(Wnd->state & WNDS_MAXIMIZESTOMONITOR))
588  {
589  lpwndpl->ptMaxPosition.x = Wnd->InternalPos.MaxPos.x;
590  lpwndpl->ptMaxPosition.y = Wnd->InternalPos.MaxPos.y;
591  }
592  else
593  lpwndpl->ptMaxPosition.x = lpwndpl->ptMaxPosition.y = -1;
594 
595  if ( Wnd->spwndParent == Wnd->head.rpdesk->pDeskInfo->spwnd &&
596  !(Wnd->ExStyle & WS_EX_TOOLWINDOW))
597  {
598  PMONITOR pmonitor = UserMonitorFromRect(&lpwndpl->rcNormalPosition, MONITOR_DEFAULTTOPRIMARY );
599 
600  // FIXME: support DPI aware, rcWorkDPI/Real etc..
601  if (Wnd->InternalPos.flags & WPF_MININIT)
602  {
603  lpwndpl->ptMinPosition.x -= (pmonitor->rcWork.left - pmonitor->rcMonitor.left);
604  lpwndpl->ptMinPosition.y -= (pmonitor->rcWork.top - pmonitor->rcMonitor.top);
605  }
607  pmonitor->rcMonitor.left - pmonitor->rcWork.left,
608  pmonitor->rcMonitor.top - pmonitor->rcWork.top);
609  }
610 
611  if ( Wnd->InternalPos.flags & WPF_RESTORETOMAXIMIZED || Wnd->style & WS_MAXIMIZE )
612  lpwndpl->flags |= WPF_RESTORETOMAXIMIZED;
613 
614  if ( ((Wnd->style & (WS_CHILD|WS_POPUP)) == WS_CHILD) && Wnd->InternalPos.flags & WPF_SETMINPOSITION)
615  lpwndpl->flags |= WPF_SETMINPOSITION;
616 
617  return TRUE;
618 }
DWORD ExStyle
Definition: ntuser.h:668
struct _DESKTOP * rpdesk
Definition: ntuser.h:189
VOID FASTCALL WinPosInitInternalPos(PWND Wnd, RECTL *RestoreRect)
Definition: winpos.c:478
long y
Definition: polytest.cpp:48
struct _WND::@4253 InternalPos
long x
Definition: polytest.cpp:48
#define TRUE
Definition: types.h:120
#define SW_HIDE
Definition: winuser.h:762
#define SW_SHOWMAXIMIZED
Definition: winuser.h:767
LONG top
Definition: windef.h:307
#define WPF_RESTORETOMAXIMIZED
Definition: winuser.h:2507
#define WS_CHILD
Definition: pedump.c:617
LONG left
Definition: windef.h:306
#define SW_SHOWMINIMIZED
Definition: winuser.h:765
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
RECT rcWork
Definition: monitor.h:19
PMONITOR NTAPI UserMonitorFromRect(PRECTL pRect, DWORD dwFlags)
Definition: monitor.c:405
#define FALSE
Definition: types.h:117
#define WS_MINIMIZE
Definition: pedump.c:622
THRDESKHEAD head
Definition: ntuser.h:659
#define WPF_SETMINPOSITION
Definition: winuser.h:2508
#define WPF_MAXINIT
Definition: ntuser.h:655
#define WPF_MININIT
Definition: ntuser.h:654
RECT rcWindow
Definition: ntuser.h:680
FORCEINLINE VOID RECTL_vOffsetRect(_Inout_ RECTL *prcl, _In_ INT cx, _In_ INT cy)
Definition: rect.h:31
POINT ptMinPosition
Definition: winuser.h:3268
#define SW_SHOWNORMAL
Definition: winuser.h:764
POINT ptMaxPosition
Definition: winuser.h:3269
DWORD state
Definition: ntuser.h:665
#define WS_POPUP
Definition: pedump.c:616
RECT rcNormalPosition
Definition: winuser.h:3270
#define WNDS_MAXIMIZESTOMONITOR
Definition: ntuser.h:603
struct _WND * spwndParent
Definition: ntuser.h:677
RECT rcMonitor
Definition: monitor.h:18
#define WS_MAXIMIZE
Definition: pedump.c:623
DWORD style
Definition: ntuser.h:670

Referenced by co_WinPosMinMaximize(), NtUserGetInternalWindowPos(), and NtUserGetWindowPlacement().

◆ IntGetWindowRect()

BOOL FASTCALL IntGetWindowRect ( PWND  Wnd,
RECTL Rect 
)

Definition at line 120 of file winpos.c.

121 {
122  ASSERT( Wnd );
123  ASSERT( Rect );
124  if (!Wnd) return FALSE;
125  if (!UserIsDesktopWindow(Wnd))
126  {
127  *Rect = Wnd->rcWindow;
128  }
129  else
130  {
131  Rect->left = Rect->top = 0;
132  Rect->right = Wnd->rcWindow.right;
133  Rect->bottom = Wnd->rcWindow.bottom;
134 /* Do this until Init bug is fixed. This sets 640x480, see InitMetrics.
135  Rect->right = GetSystemMetrics(SM_CXSCREEN);
136  Rect->bottom = GetSystemMetrics(SM_CYSCREEN);
137 */ }
138  return TRUE;
139 }
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:220
#define TRUE
Definition: types.h:120
LONG right
Definition: windef.h:308
#define FALSE
Definition: types.h:117
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
RECT rcWindow
Definition: ntuser.h:680
LONG bottom
Definition: windef.h:309

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

◆ IntMapWindowPoints()

INT FASTCALL IntMapWindowPoints ( PWND  FromWnd,
PWND  ToWnd,
LPPOINT  lpPoints,
UINT  cPoints 
)

Definition at line 143 of file winpos.c.

144 {
145  BOOL mirror_from, mirror_to;
146  POINT Delta;
147  UINT i;
148  int Change = 1;
149 
150  /* Note: Desktop Top and Left is always 0! */
151  Delta.x = Delta.y = 0;
152  mirror_from = mirror_to = FALSE;
153 
154  if (FromWnd && !UserIsDesktopWindow(FromWnd))
155  {
156  if (FromWnd->ExStyle & WS_EX_LAYOUTRTL)
157  {
158  mirror_from = TRUE;
159  Change = -Change;
160  Delta.x = -FromWnd->rcClient.right;
161  }
162  else
163  Delta.x = FromWnd->rcClient.left;
164  Delta.y = FromWnd->rcClient.top;
165  }
166 
167  if (ToWnd && !UserIsDesktopWindow(ToWnd))
168  {
169  if (ToWnd->ExStyle & WS_EX_LAYOUTRTL)
170  {
171  mirror_to = TRUE;
172  Change = -Change;
173  Delta.x += Change * ToWnd->rcClient.right;
174  }
175  else
176  Delta.x -= Change * ToWnd->rcClient.left;
177  Delta.y -= ToWnd->rcClient.top;
178  }
179 
180  for (i = 0; i != cPoints; i++)
181  {
182  lpPoints[i].x += Delta.x;
183  lpPoints[i].x *= Change;
184  lpPoints[i].y += Delta.y;
185  }
186 
187  if ((mirror_from || mirror_to) && cPoints == 2) /* special case for rectangle */
188  {
189  int tmp = min(lpPoints[0].x, lpPoints[1].x);
190  lpPoints[1].x = max(lpPoints[0].x, lpPoints[1].x);
191  lpPoints[0].x = tmp;
192  }
193 
194  return MAKELONG(LOWORD(Delta.x), LOWORD(Delta.y));
195 }
#define max(a, b)
Definition: svc.c:63
DWORD ExStyle
Definition: ntuser.h:668
long y
Definition: polytest.cpp:48
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:220
long x
Definition: polytest.cpp:48
#define TRUE
Definition: types.h:120
LONG top
Definition: windef.h:307
#define WS_EX_LAYOUTRTL
Definition: winuser.h:390
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
RECT rcClient
Definition: ntuser.h:681
LONG left
Definition: windef.h:306
LONG right
Definition: windef.h:308
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define FALSE
Definition: types.h:117
unsigned int BOOL
Definition: ntddk_ex.h:94
#define MAKELONG(a, b)
Definition: typedefs.h:249
static ULONG Delta
Definition: xboxvideo.c:33
#define min(a, b)
Definition: monoChain.cc:55
unsigned int UINT
Definition: ndis.h:50
#define LOWORD(l)
Definition: pedump.c:82

Referenced by DefWndDoSizeMove(), and DefWndHandleWindowPosChanged().

◆ IntRealChildWindowFromPoint()

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

Definition at line 2868 of file winpos.c.

2869 {
2870  POINTL Pt;
2871  HWND *List, *phWnd;
2872  PWND pwndHit = NULL;
2873 
2874  Pt.x = x;
2875  Pt.y = y;
2876 
2878  {
2879  Pt.x += Parent->rcClient.left;
2880  Pt.y += Parent->rcClient.top;
2881  }
2882 
2883  if (!IntPtInWindow(Parent, Pt.x, Pt.y)) return NULL;
2884 
2885  if ((List = IntWinListChildren(Parent)))
2886  {
2887  for (phWnd = List; *phWnd; phWnd++)
2888  {
2889  PWND Child;
2890  if ((Child = ValidateHwndNoErr(*phWnd)))
2891  {
2892  if ( Child->style & WS_VISIBLE && IntPtInWindow(Child, Pt.x, Pt.y) )
2893  {
2894  if ( Child->pcls->atomClassName != gpsi->atomSysClass[ICLS_BUTTON] ||
2895  (Child->style & BS_TYPEMASK) != BS_GROUPBOX )
2896  {
2898  return Child;
2899  }
2900  pwndHit = Child;
2901  }
2902  }
2903  }
2905  }
2906  return pwndHit ? pwndHit : Parent;
2907 }
PWND FASTCALL ValidateHwndNoErr(HWND hWnd)
Definition: window.c:96
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:220
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical 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:728
FORCEINLINE BOOL IntPtInWindow(PWND pwnd, INT x, INT y)
Definition: winpos.h:30
PSERVERINFO gpsi
Definition: main.c:27
#define BS_GROUPBOX
Definition: pedump.c:658
LONG y
Definition: windef.h:330
smooth NULL
Definition: ftsmooth.c:416
LIST_ENTRY List
Definition: psmgr.c:57
LONG x
Definition: windef.h:329
HWND *FASTCALL IntWinListChildren(PWND Window)
Definition: window.c:255
Definition: ntuser.h:657
#define BS_TYPEMASK
Definition: winuser.h:270
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn BOOLEAN Physical 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 ACPI_HANDLE Child
Definition: acpixf.h:728
#define ICLS_BUTTON
Definition: ntuser.h:873
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
#define USERTAG_WINDOWLIST
Definition: tags.h:297
#define WS_VISIBLE
Definition: pedump.c:620
ATOM atomSysClass[ICLS_NOTUSED+1]
Definition: ntuser.h:1013

Referenced by NtUserRealChildWindowFromPoint().

◆ IntScreenToClient()

BOOL FASTCALL IntScreenToClient ( PWND  Wnd,
LPPOINT  lpPoint 
)

Definition at line 212 of file winpos.c.

213 {
214  if (Wnd && Wnd->fnid != FNID_DESKTOP )
215  {
216  if (Wnd->ExStyle & WS_EX_LAYOUTRTL)
217  lpPoint->x = Wnd->rcClient.right - lpPoint->x;
218  else
219  lpPoint->x -= Wnd->rcClient.left;
220  lpPoint->y -= Wnd->rcClient.top;
221  }
222  return TRUE;
223 }
DWORD ExStyle
Definition: ntuser.h:668
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
#define TRUE
Definition: types.h:120
LONG top
Definition: windef.h:307
#define WS_EX_LAYOUTRTL
Definition: winuser.h:390
RECT rcClient
Definition: ntuser.h:681
LONG left
Definition: windef.h:306
LONG right
Definition: windef.h:308
DWORD fnid
Definition: ntuser.h:673
#define FNID_DESKTOP
Definition: ntuser.h:824

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

◆ IntSetWindowPlacement()

BOOL FASTCALL IntSetWindowPlacement ( PWND  Wnd,
WINDOWPLACEMENT wpl,
UINT  Flags 
)

Definition at line 662 of file winpos.c.

663 {
664  BOOL sAsync;
665  UINT SWP_Flags;
666 
670 
671  if (!Wnd || Wnd == Wnd->head.rpdesk->pDeskInfo->spwnd) return FALSE;
672 
673  if ( Flags & PLACE_MIN ) Wnd->InternalPos.IconPos = wpl->ptMinPosition;
674  if ( Flags & PLACE_MAX ) Wnd->InternalPos.MaxPos = wpl->ptMaxPosition;
675  if ( Flags & PLACE_RECT) Wnd->InternalPos.NormalRect = wpl->rcNormalPosition;
676 
677  SWP_Flags = SWP_NOZORDER | SWP_NOACTIVATE | ((wpl->flags & WPF_ASYNCWINDOWPLACEMENT) ? SWP_ASYNCWINDOWPOS : 0);
678 
679  if (Wnd->style & WS_MINIMIZE )
680  {
681  if (Flags & PLACE_MIN || Wnd->InternalPos.flags & WPF_SETMINPOSITION)
682  {
684  wpl->ptMinPosition.x, wpl->ptMinPosition.y, 0, 0,
685  SWP_NOSIZE | SWP_Flags);
686  Wnd->InternalPos.flags |= WPF_MININIT;
687  }
688  }
689  else if (Wnd->style & WS_MAXIMIZE )
690  {
691  if (Flags & PLACE_MAX)
692  {
694  wpl->ptMaxPosition.x, wpl->ptMaxPosition.y, 0, 0,
695  SWP_NOSIZE | SWP_Flags);
696  Wnd->InternalPos.flags |= WPF_MAXINIT;
697  }
698  }
699  else if (Flags & PLACE_RECT)
700  {
705  SWP_Flags);
706  }
707 
708  sAsync = (Wnd->head.pti->MessageQueue != gptiCurrent->MessageQueue && wpl->flags & WPF_ASYNCWINDOWPLACEMENT);
709 
710  if ( sAsync )
712  else
713  co_WinPosShowWindow(Wnd, wpl->showCmd);
714 
715  if ( Wnd->style & WS_MINIMIZE && !sAsync )
716  {
717  if ( wpl->flags & WPF_SETMINPOSITION )
718  Wnd->InternalPos.flags |= WPF_SETMINPOSITION;
719 
720  if ( wpl->flags & WPF_RESTORETOMAXIMIZED )
721  Wnd->InternalPos.flags |= WPF_RESTORETOMAXIMIZED;
722  }
723  return TRUE;
724 }
struct _DESKTOP * rpdesk
Definition: ntuser.h:189
long y
Definition: polytest.cpp:48
static void make_rect_onscreen(RECT *rect)
Definition: winpos.c:621
struct _WND::@4253 InternalPos
long x
Definition: polytest.cpp:48
#define TRUE
Definition: types.h:120
static void make_point_onscreen(POINT *pt)
Definition: winpos.c:651
BOOLEAN FASTCALL co_WinPosSetWindowPos(PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
Definition: winpos.c:1720
LONG top
Definition: windef.h:307
#define HWND_TOP
Definition: winuser.h:1193
#define PLACE_MIN
Definition: winpos.c:29
#define WPF_RESTORETOMAXIMIZED
Definition: winuser.h:2507
LONG left
Definition: windef.h:306
#define SWP_NOZORDER
Definition: winuser.h:1232