ReactOS 0.4.17-dev-923-g4c9a150
winpos.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * PURPOSE: Windows
5 * PROGRAMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
6 * Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
7 */
8
9#include <win32k.h>
10#include <immdev.h>
12
13/* GLOBALS *******************************************************************/
14
15#define MINMAX_NOSWP (0x00010000)
16
17#define SWP_EX_NOCOPY 0x0001
18#define SWP_EX_PAINTSELF 0x0002
19
20#define SWP_AGG_NOGEOMETRYCHANGE \
21 (SWP_NOSIZE | SWP_NOCLIENTSIZE | SWP_NOZORDER)
22#define SWP_AGG_NOPOSCHANGE \
23 (SWP_NOSIZE | SWP_NOMOVE | SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE | SWP_NOZORDER)
24#define SWP_AGG_STATUSFLAGS \
25 (SWP_AGG_NOPOSCHANGE | SWP_FRAMECHANGED | SWP_HIDEWINDOW | SWP_SHOWWINDOW)
26#define SWP_AGG_NOCLIENTCHANGE \
27 (SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE)
28
29#define EMPTYPOINT(pt) ((pt).x == -1 && (pt).y == -1)
30#define PLACE_MIN 0x0001
31#define PLACE_MAX 0x0002
32#define PLACE_RECT 0x0004
33
34/* FUNCTIONS *****************************************************************/
35
36#if DBG
37/***********************************************************************
38 * dump_winpos_flags
39 */
40static void dump_winpos_flags(UINT flags)
41{
42 static const DWORD dumped_flags = (SWP_NOSIZE | SWP_NOMOVE | SWP_NOZORDER | SWP_NOREDRAW |
47 TRACE("flags:");
48 if(flags & SWP_NOSIZE) TRACE(" SWP_NOSIZE");
49 if(flags & SWP_NOMOVE) TRACE(" SWP_NOMOVE");
50 if(flags & SWP_NOZORDER) TRACE(" SWP_NOZORDER");
51 if(flags & SWP_NOREDRAW) TRACE(" SWP_NOREDRAW");
52 if(flags & SWP_NOACTIVATE) TRACE(" SWP_NOACTIVATE");
53 if(flags & SWP_FRAMECHANGED) TRACE(" SWP_FRAMECHANGED");
54 if(flags & SWP_SHOWWINDOW) TRACE(" SWP_SHOWWINDOW");
55 if(flags & SWP_HIDEWINDOW) TRACE(" SWP_HIDEWINDOW");
56 if(flags & SWP_NOCOPYBITS) TRACE(" SWP_NOCOPYBITS");
57 if(flags & SWP_NOOWNERZORDER) TRACE(" SWP_NOOWNERZORDER");
58 if(flags & SWP_NOSENDCHANGING) TRACE(" SWP_NOSENDCHANGING");
59 if(flags & SWP_DEFERERASE) TRACE(" SWP_DEFERERASE");
60 if(flags & SWP_ASYNCWINDOWPOS) TRACE(" SWP_ASYNCWINDOWPOS");
61 if(flags & SWP_NOCLIENTSIZE) TRACE(" SWP_NOCLIENTSIZE");
62 if(flags & SWP_NOCLIENTMOVE) TRACE(" SWP_NOCLIENTMOVE");
63 if(flags & SWP_STATECHANGED) TRACE(" SWP_STATECHANGED");
64
65 if(flags & ~dumped_flags) TRACE(" %08x", flags & ~dumped_flags);
66 TRACE("\n");
67}
68#endif
69
72{
74 if (Window == NULL)
75 {
76 Point->x = Point->y = 0;
77 return FALSE;
78 }
79 Point->x = Window->rcClient.left;
80 Point->y = Window->rcClient.top;
81
82 return TRUE;
83}
84
93{
94 ASSERT( Wnd );
95 ASSERT( Rect );
96 if (Wnd->style & WS_MINIMIZED)
97 {
98 Rect->left = Rect->top = 0;
101 return;
102 }
103 if (!UserIsDesktopWindow(Wnd))
104 {
105 *Rect = Wnd->rcClient;
107 }
108 else
109 {
110 Rect->left = Rect->top = 0;
111 Rect->right = Wnd->rcClient.right;
112 Rect->bottom = Wnd->rcClient.bottom;
113 /* Do this until Init bug is fixed. This sets 640x480, see InitMetrics.
114 Rect->right = UserGetSystemMetrics(SM_CXSCREEN);
115 Rect->bottom = UserGetSystemMetrics(SM_CYSCREEN);
116 */
117 }
118}
119
122{
123 ASSERT( Wnd );
124 ASSERT( Rect );
125 if (!Wnd) return FALSE;
126 if (!UserIsDesktopWindow(Wnd))
127 {
128 *Rect = Wnd->rcWindow;
129 }
130 else
131 {
132 Rect->left = Rect->top = 0;
133 Rect->right = Wnd->rcWindow.right;
134 Rect->bottom = Wnd->rcWindow.bottom;
135/* Do this until Init bug is fixed. This sets 640x480, see InitMetrics.
136 Rect->right = GetSystemMetrics(SM_CXSCREEN);
137 Rect->bottom = GetSystemMetrics(SM_CYSCREEN);
138*/ }
139 return TRUE;
140}
141
142
144IntMapWindowPoints(PWND FromWnd, PWND ToWnd, LPPOINT lpPoints, UINT cPoints)
145{
146 BOOL mirror_from, mirror_to;
147 POINT Delta;
148 UINT i;
149 int Change = 1;
150
151 /* Note: Desktop Top and Left is always 0! */
152 Delta.x = Delta.y = 0;
153 mirror_from = mirror_to = FALSE;
154
155 if (FromWnd && !UserIsDesktopWindow(FromWnd))
156 {
157 if (FromWnd->ExStyle & WS_EX_LAYOUTRTL)
158 {
159 mirror_from = TRUE;
160 Change = -Change;
161 Delta.x = -FromWnd->rcClient.right;
162 }
163 else
164 Delta.x = FromWnd->rcClient.left;
165 Delta.y = FromWnd->rcClient.top;
166 }
167
168 if (ToWnd && !UserIsDesktopWindow(ToWnd))
169 {
170 if (ToWnd->ExStyle & WS_EX_LAYOUTRTL)
171 {
172 mirror_to = TRUE;
173 Change = -Change;
174 Delta.x += Change * ToWnd->rcClient.right;
175 }
176 else
177 Delta.x -= Change * ToWnd->rcClient.left;
178 Delta.y -= ToWnd->rcClient.top;
179 }
180
181 for (i = 0; i != cPoints; i++)
182 {
183 lpPoints[i].x += Delta.x;
184 lpPoints[i].x *= Change;
185 lpPoints[i].y += Delta.y;
186 }
187
188 if ((mirror_from || mirror_to) && cPoints == 2) /* special case for rectangle */
189 {
190 int tmp = min(lpPoints[0].x, lpPoints[1].x);
191 lpPoints[1].x = max(lpPoints[0].x, lpPoints[1].x);
192 lpPoints[0].x = tmp;
193 }
194
195 return MAKELONG(LOWORD(Delta.x), LOWORD(Delta.y));
196}
197
200{
201 if (Wnd && Wnd->fnid != FNID_DESKTOP )
202 {
203 if (Wnd->ExStyle & WS_EX_LAYOUTRTL)
204 lpPoint->x = Wnd->rcClient.right - lpPoint->x;
205 else
206 lpPoint->x += Wnd->rcClient.left;
207 lpPoint->y += Wnd->rcClient.top;
208 }
209 return TRUE;
210}
211
214{
215 if (Wnd && Wnd->fnid != FNID_DESKTOP )
216 {
217 if (Wnd->ExStyle & WS_EX_LAYOUTRTL)
218 lpPoint->x = Wnd->rcClient.right - lpPoint->x;
219 else
220 lpPoint->x -= Wnd->rcClient.left;
221 lpPoint->y -= Wnd->rcClient.top;
222 }
223 return TRUE;
224}
225
227{
228 do
229 {
230 if ( (pWnd->style & (WS_POPUP|WS_CHILD)) != WS_CHILD ||
231 !(pWnd = pWnd->spwndParent) )
232 return TRUE;
233 }
234 while (pWnd->style & WS_VISIBLE);
235 return FALSE;
236}
237
239{
240 PWND pWnd;
241 PDESKTOP rpdesk = gptiCurrent->rpdesk;
242
243 if ( rpdesk &&
244 (pWnd = rpdesk->pDeskInfo->spwnd->spwndChild) &&
245 pWnd->ExStyle & WS_EX_TOPMOST)
246 {
247 for (;;)
248 {
249 if (!pWnd->spwndNext) break;
250 if (!(pWnd->spwndNext->ExStyle & WS_EX_TOPMOST)) break;
251 pWnd = pWnd->spwndNext;
252 }
253 return pWnd;
254 }
255 return NULL;
256}
257
258VOID
260{
261 if (Window->hrgnClip)
262 {
263 /* Delete no longer needed region handle */
265 GreDeleteObject(Window->hrgnClip);
266 Window->hrgnClip = NULL;
267 }
268
269 if (hRgnClip > HRGN_WINDOW)
270 {
271 /*if (!UserIsDesktopWindow(Window))
272 {
273 NtGdiOffsetRgn(hRgnClip, Window->rcWindow.left, Window->rcWindow.top);
274 }*/
275 /* Set public ownership */
277
278 Window->hrgnClip = hRgnClip;
279 }
280}
281
282//
283// This helps with CORE-6129 forcing modal dialog active when another app is minimized or closed.
284//
286{
287 BOOL ActivePrev, FindTopWnd;
288 PWND pWndTopMost, pWndChild, pWndSetActive, pWndTemp, pWndDesk;
291
292 //ERR("AOWM 1 %p\n", UserHMGetHandle(Wnd));
293 ActivePrev = (pti->MessageQueue->spwndActivePrev != NULL);
294 FindTopWnd = TRUE;
295
296 if ((pWndTopMost = IntGetLastTopMostWindow()))
297 pWndChild = pWndTopMost->spwndNext;
298 else
299 pWndChild = Wnd->spwndParent->spwndChild;
300
301 for (;;)
302 {
303 if ( ActivePrev )
304 pWndSetActive = pti->MessageQueue->spwndActivePrev;
305 else
306 pWndSetActive = pWndChild;
307
308 pWndTemp = NULL;
309
310 while(pWndSetActive)
311 {
312 if ( VerifyWnd(pWndSetActive) &&
313 !(pWndSetActive->ExStyle & WS_EX_NOACTIVATE) &&
314 (pWndSetActive->style & (WS_VISIBLE|WS_DISABLED)) == WS_VISIBLE &&
315 (!(pWndSetActive->style & WS_ICONIC) /* FIXME MinMax pos? */ ) )
316 {
317 if (!(pWndSetActive->ExStyle & WS_EX_TOOLWINDOW) )
318 {
319 UserRefObjectCo(pWndSetActive, &Ref);
320 //ERR("ActivateOtherWindowMin Set FG 1\n");
321 co_IntSetForegroundWindow(pWndSetActive);
322 UserDerefObjectCo(pWndSetActive);
323 //ERR("AOWM 2 Exit Good %p\n", UserHMGetHandle(pWndSetActive));
324 return TRUE;
325 }
326 if (!pWndTemp ) pWndTemp = pWndSetActive;
327 }
328 if ( ActivePrev )
329 {
330 ActivePrev = FALSE;
331 pWndSetActive = pWndChild;
332 }
333 else
334 pWndSetActive = pWndSetActive->spwndNext;
335 }
336
337 if ( !FindTopWnd ) break;
338 FindTopWnd = FALSE;
339
340 if ( pWndChild )
341 {
342 pWndChild = pWndChild->spwndParent->spwndChild;
343 continue;
344 }
345
346 if (!(pWndDesk = IntGetThreadDesktopWindow(pti)))
347 {
348 pWndChild = NULL;
349 continue;
350 }
351 pWndChild = pWndDesk->spwndChild;
352 }
353
354 if ((pWndSetActive = pWndTemp))
355 {
356 UserRefObjectCo(pWndSetActive, &Ref);
357 //ERR("ActivateOtherWindowMin Set FG 2\n");
358 co_IntSetForegroundWindow(pWndSetActive);
359 UserDerefObjectCo(pWndSetActive);
360 //ERR("AOWM 3 Exit Good %p\n", UserHMGetHandle(pWndSetActive));
361 return TRUE;
362 }
363 //ERR("AOWM 4 Bad\n");
364 return FALSE;
365}
366
367/*******************************************************************
368 * can_activate_window
369 *
370 * Check if we can activate the specified window.
371 */
372static
374{
375 LONG style;
376
377 if (!Wnd) return FALSE;
378
379 style = Wnd->style;
380 if (!(style & WS_VISIBLE)) return FALSE;
381 if (style & WS_MINIMIZE) return FALSE;
382 if ((style & (WS_POPUP|WS_CHILD)) == WS_CHILD) return FALSE;
383 if (Wnd->ExStyle & WS_EX_NOACTIVATE) return FALSE;
384 return TRUE;
385 /* FIXME: This window could be disable because the child that closed
386 was a popup. */
387 //return !(style & WS_DISABLED);
388}
389
390
391/*******************************************************************
392 * WinPosActivateOtherWindow
393 *
394 * Activates window other than pWnd.
395 */
398{
399 PWND WndTo = NULL;
401
402 ASSERT_REFS_CO(Wnd);
403
404 if (IntIsDesktopWindow(Wnd))
405 {
406 //ERR("WinPosActivateOtherWindow Set Focus Msg Q No window!\n");
408 return;
409 }
410
411 /* If this is popup window, try to activate the owner first. */
412 if ((Wnd->style & WS_POPUP) && (WndTo = Wnd->spwndOwner))
413 {
414 TRACE("WPAOW Popup with Owner\n");
415 WndTo = UserGetAncestor( WndTo, GA_ROOT );
416 if (can_activate_window(WndTo)) goto done;
417 }
418
419 /* Pick a next top-level window. */
420 /* FIXME: Search for non-tooltip windows first. */
421 WndTo = Wnd;
422 for (;;)
423 {
424 if (!(WndTo = WndTo->spwndNext)) break;
425 if (can_activate_window( WndTo )) goto done;
426 }
427
428 /*
429 Fixes wine win.c:test_SetParent last ShowWindow test after popup dies.
430 Check for previous active window to bring to top.
431 */
432 if (Wnd)
433 {
434 WndTo = Wnd->head.pti->MessageQueue->spwndActivePrev;
435 if (can_activate_window( WndTo )) goto done;
436 }
437
438 // Find any window to bring to top. Works Okay for wine since it does not see X11 windows.
439 WndTo = UserGetDesktopWindow();
440 if ((WndTo == NULL) || (WndTo->spwndChild == NULL))
441 {
442 //ERR("WinPosActivateOtherWindow No window!\n");
443 return;
444 }
445 WndTo = WndTo->spwndChild;
446 for (;;)
447 {
448 if (WndTo == Wnd)
449 {
450 WndTo = NULL;
451 break;
452 }
453 if (can_activate_window( WndTo )) goto done;
454 if (!(WndTo = WndTo->spwndNext)) break;
455 }
456
457done:
458 if (WndTo) UserRefObjectCo(WndTo, &Ref);
459
461 {
462 /* ReactOS can pass WndTo = NULL to co_IntSetForegroundWindow and returns FALSE. */
463 //ERR("WinPosActivateOtherWindow Set FG 0x%p hWnd %p\n", WndTo, WndTo ? UserHMGetHandle(WndTo) : NULL);
464 if (co_IntSetForegroundWindow(WndTo))
465 {
466 if (WndTo) UserDerefObjectCo(WndTo);
467 return;
468 }
469 }
470 //ERR("WinPosActivateOtherWindow Set Active 0x%p\n",WndTo);
471 if (!UserSetActiveWindow(WndTo)) /* Ok for WndTo to be NULL here */
472 {
473 //ERR("WPAOW SA 1\n");
475 }
476 if (WndTo) UserDerefObjectCo(WndTo);
477}
478
481{
482 POINT Size;
483 RECTL Rect = *RestoreRect;
484
486 {
488 -Wnd->spwndParent->rcClient.left,
489 -Wnd->spwndParent->rcClient.top);
490 }
491
492 Size.x = Rect.left;
493 Size.y = Rect.top;
494
495 if (!Wnd->InternalPosInitialized)
496 {
497 // FIXME: Use check point Atom..
498 Wnd->InternalPos.flags = 0;
499 Wnd->InternalPos.MaxPos.x = Wnd->InternalPos.MaxPos.y = -1;
500 Wnd->InternalPos.IconPos.x = Wnd->InternalPos.IconPos.y = -1;
501 Wnd->InternalPos.NormalRect = Rect;
503 }
504
505 if (Wnd->style & WS_MINIMIZE)
506 {
507 Wnd->InternalPos.IconPos = Size;
508 Wnd->InternalPos.flags |= WPF_MININIT;
509 }
510 else if (Wnd->style & WS_MAXIMIZE)
511 {
512 Wnd->InternalPos.flags |= WPF_MAXINIT;
513
514 if ( Wnd->spwndParent == Wnd->head.rpdesk->pDeskInfo->spwnd )
515 {
517 {
518 Wnd->InternalPos.flags &= ~WPF_MAXINIT;
519 Wnd->InternalPos.MaxPos.x = Wnd->InternalPos.MaxPos.y = -1;
520 }
521 else
522 {
523 RECTL WorkArea;
524 PMONITOR pmonitor = UserMonitorFromRect(&Rect, MONITOR_DEFAULTTOPRIMARY );
525 // FIXME: support DPI aware, rcWorkDPI/Real etc..
526 WorkArea = pmonitor->rcMonitor;
527
528 if (Wnd->style & WS_MAXIMIZEBOX)
529 { // Support (Wnd->state & WNDS_HASCAPTION) || pmonitor->cFullScreen too.
530 if ((Wnd->style & WS_CAPTION) == WS_CAPTION || !(Wnd->style & (WS_CHILD | WS_POPUP)))
531 {
532 WorkArea = pmonitor->rcWork;
533 //ERR("rcWork\n");
534 }
535 }
536
537 Wnd->InternalPos.MaxPos.x = Rect.left - WorkArea.left;
538 Wnd->InternalPos.MaxPos.y = Rect.top - WorkArea.top;
539
540 /*ERR("WinPosIP 2 X %d = R.l %d - W.l %d | Y %d = R.t %d - W.t %d\n",
541 Wnd->InternalPos.MaxPos.x,
542 Rect.left, WorkArea.left,
543 Wnd->InternalPos.MaxPos.y,
544 Rect.top, WorkArea.top);*/
545 }
546 }
547 else
548 Wnd->InternalPos.MaxPos = Size;
549 }
550 else
551 {
552 /* Lie about the snap; Windows does this so applications don't save their
553 * position as a snap but rather the unsnapped "real" position. */
554 if (!IntIsWindowSnapped(Wnd) ||
555 RECTL_bIsEmptyRect(&Wnd->InternalPos.NormalRect))
556 {
557 Wnd->InternalPos.NormalRect = Rect;
558 }
559 }
560}
561
562BOOL
565{
566 if (!Wnd) return FALSE;
567
568 if(lpwndpl->length != sizeof(WINDOWPLACEMENT))
569 {
570 ERR("length mismatch: %u\n", lpwndpl->length);
571 return FALSE;
572 }
573
574 lpwndpl->flags = 0;
575
577
578 lpwndpl->showCmd = SW_HIDE;
579
580 if ( Wnd->style & WS_MINIMIZE )
581 lpwndpl->showCmd = SW_SHOWMINIMIZED;
582 else
583 lpwndpl->showCmd = ( Wnd->style & WS_MAXIMIZE ) ? SW_SHOWMAXIMIZED : SW_SHOWNORMAL ;
584
585 lpwndpl->rcNormalPosition = Wnd->InternalPos.NormalRect;
586
587 if (Wnd->InternalPos.flags & WPF_MININIT) // Return if it was set!
588 {
589 lpwndpl->ptMinPosition.x = Wnd->InternalPos.IconPos.x;
590 lpwndpl->ptMinPosition.y = Wnd->InternalPos.IconPos.y;
591 }
592 else
593 lpwndpl->ptMinPosition.x = lpwndpl->ptMinPosition.y = -1;
594
595 if ( Wnd->InternalPos.flags & WPF_MAXINIT && // Return if set and not maximized to monitor!
597 {
598 lpwndpl->ptMaxPosition.x = Wnd->InternalPos.MaxPos.x;
599 lpwndpl->ptMaxPosition.y = Wnd->InternalPos.MaxPos.y;
600 }
601 else
602 lpwndpl->ptMaxPosition.x = lpwndpl->ptMaxPosition.y = -1;
603
604 if ( Wnd->spwndParent == Wnd->head.rpdesk->pDeskInfo->spwnd &&
605 !(Wnd->ExStyle & WS_EX_TOOLWINDOW))
606 {
607 PMONITOR pmonitor = UserMonitorFromRect(&lpwndpl->rcNormalPosition, MONITOR_DEFAULTTOPRIMARY );
608
609 // FIXME: support DPI aware, rcWorkDPI/Real etc..
610 if (Wnd->InternalPos.flags & WPF_MININIT)
611 {
612 lpwndpl->ptMinPosition.x -= (pmonitor->rcWork.left - pmonitor->rcMonitor.left);
613 lpwndpl->ptMinPosition.y -= (pmonitor->rcWork.top - pmonitor->rcMonitor.top);
614 }
616 pmonitor->rcMonitor.left - pmonitor->rcWork.left,
617 pmonitor->rcMonitor.top - pmonitor->rcWork.top);
618 }
619
620 if ( Wnd->InternalPos.flags & WPF_RESTORETOMAXIMIZED || Wnd->style & WS_MAXIMIZE )
621 lpwndpl->flags |= WPF_RESTORETOMAXIMIZED;
622
623 if ( ((Wnd->style & (WS_CHILD|WS_POPUP)) == WS_CHILD) && Wnd->InternalPos.flags & WPF_SETMINPOSITION)
624 lpwndpl->flags |= WPF_SETMINPOSITION;
625
626 return TRUE;
627}
628
629/* make sure the specified rect is visible on screen */
631{
632 PMONITOR pmonitor = UserMonitorFromRect( rect, MONITOR_DEFAULTTONEAREST ); // Wine uses this.
633
634 // FIXME: support DPI aware, rcWorkDPI/Real etc..
635 if (!pmonitor) return;
636 /* FIXME: map coordinates from rcWork to rcMonitor */
637 if (rect->right <= pmonitor->rcWork.left)
638 {
639 rect->right += pmonitor->rcWork.left - rect->left;
640 rect->left = pmonitor->rcWork.left;
641 }
642 else if (rect->left >= pmonitor->rcWork.right)
643 {
644 rect->left += pmonitor->rcWork.right - rect->right;
645 rect->right = pmonitor->rcWork.right;
646 }
647 if (rect->bottom <= pmonitor->rcWork.top)
648 {
649 rect->bottom += pmonitor->rcWork.top - rect->top;
650 rect->top = pmonitor->rcWork.top;
651 }
652 else if (rect->top >= pmonitor->rcWork.bottom)
653 {
654 rect->top += pmonitor->rcWork.bottom - rect->bottom;
655 rect->bottom = pmonitor->rcWork.bottom;
656 }
657}
658
659/* make sure the specified point is visible on screen */
661{
662 RECT rect;
663
664 RECTL_vSetRect( &rect, pt->x, pt->y, pt->x + 1, pt->y + 1 );
666 pt->x = rect.left;
667 pt->y = rect.top;
668}
669
672{
673 BOOL sAsync;
674 UINT SWP_Flags;
675
679
680 if (!Wnd || Wnd == Wnd->head.rpdesk->pDeskInfo->spwnd) return FALSE;
681
682 if ( Flags & PLACE_MIN ) Wnd->InternalPos.IconPos = wpl->ptMinPosition;
683 if ( Flags & PLACE_MAX ) Wnd->InternalPos.MaxPos = wpl->ptMaxPosition;
684 if ( Flags & PLACE_RECT) Wnd->InternalPos.NormalRect = wpl->rcNormalPosition;
685
686 SWP_Flags = SWP_NOZORDER | SWP_NOACTIVATE | ((wpl->flags & WPF_ASYNCWINDOWPLACEMENT) ? SWP_ASYNCWINDOWPOS : 0);
687
688 if (Wnd->style & WS_MINIMIZE )
689 {
690 if (Flags & PLACE_MIN || Wnd->InternalPos.flags & WPF_SETMINPOSITION)
691 {
693 wpl->ptMinPosition.x, wpl->ptMinPosition.y, 0, 0,
694 SWP_NOSIZE | SWP_Flags);
695 Wnd->InternalPos.flags |= WPF_MININIT;
696 }
697 }
698 else if (Wnd->style & WS_MAXIMIZE )
699 {
700 if (Flags & PLACE_MAX)
701 {
703 wpl->ptMaxPosition.x, wpl->ptMaxPosition.y, 0, 0,
704 SWP_NOSIZE | SWP_Flags);
705 Wnd->InternalPos.flags |= WPF_MAXINIT;
706 }
707 }
708 else if (Flags & PLACE_RECT)
709 {
714 SWP_Flags);
715 }
716
717 sAsync = (Wnd->head.pti->MessageQueue != gptiCurrent->MessageQueue && wpl->flags & WPF_ASYNCWINDOWPLACEMENT);
718
719 if ( sAsync )
721 else
722 co_WinPosShowWindow(Wnd, wpl->showCmd);
723
724 if ( Wnd->style & WS_MINIMIZE && !sAsync )
725 {
726 if ( wpl->flags & WPF_SETMINPOSITION )
727 Wnd->InternalPos.flags |= WPF_SETMINPOSITION;
728
729 if ( wpl->flags & WPF_RESTORETOMAXIMIZED )
731 }
732 return TRUE;
733}
734
735UINT
738{
739 RECTL rectParent;
740 PWND Child;
741 INT x, y, xspacing, yspacing, sx, sy;
742
744
745 IntGetClientRect( parent, &rectParent );
746 // FIXME: Support Minimize Metrics gspv.mm.iArrange.
747 // Default: ARW_BOTTOMLEFT
748 x = rectParent.left;
749 y = rectParent.bottom;
750
753
754 Child = parent->spwndChild;
755 while(Child)
756 {
757 if((Child->style & WS_MINIMIZE) != 0 )
758 {
760 UserRefObjectCo(Child, &Ref);
761
763 sy = y - yspacing - UserGetSystemMetrics(SM_CYBORDER);
764
765 Child->InternalPos.IconPos.x = sx;
766 Child->InternalPos.IconPos.y = sy;
767 Child->InternalPos.flags |= WPF_MININIT;
768
770
772
773 if (x <= rectParent.right - xspacing)
774 x += xspacing;
775 else
776 {
777 x = rectParent.left;
778 y -= yspacing;
779 }
780 }
781 Child = Child->spwndNext;
782 }
783 return yspacing;
784}
785
786static VOID FASTCALL
788{
789 RECT rectParent;
790 PWND pwndChild, pwndParent;
791 int x, y, xspacing, yspacing;
792
793 pwndParent = Window->spwndParent;
794 if (UserIsDesktopWindow(pwndParent))
795 {
796 ERR("FIXME: Parent is Desktop, Min off screen!\n");
797 /* FIXME: ReactOS doesn't support iconic minimize to desktop */
798 Pos->x = Pos->y = -32000;
799 Window->InternalPos.flags |= WPF_MININIT;
800 Window->InternalPos.IconPos.x = Pos->x;
801 Window->InternalPos.IconPos.y = Pos->y;
802 return;
803 }
804
805 IntGetClientRect( pwndParent, &rectParent );
806 // FIXME: Support Minimize Metrics gspv.mm.iArrange.
807 // Default: ARW_BOTTOMLEFT
808 x = rectParent.left;
809 y = rectParent.bottom;
810
813
814 // Set to default position when minimized.
816 Pos->y = y - yspacing - UserGetSystemMetrics(SM_CYBORDER);
817
818 for (pwndChild = pwndParent->spwndChild; pwndChild; pwndChild = pwndChild->spwndNext)
819 {
820 if (pwndChild == Window) continue;
821
822 if ((pwndChild->style & (WS_VISIBLE|WS_MINIMIZE)) != (WS_VISIBLE|WS_MINIMIZE) )
823 {
824 continue;
825 }
826
827 if ( pwndChild->InternalPos.IconPos.x != Pos->x && pwndChild->InternalPos.IconPos.y != Pos->y )
828 {
829 break;
830 }
831 if (x <= rectParent.right - xspacing)
832 x += xspacing;
833 else
834 {
835 x = rectParent.left;
836 y -= yspacing;
837 }
839 Pos->y = y - yspacing - UserGetSystemMetrics(SM_CYBORDER);
840 }
841
842 Window->InternalPos.IconPos.x = Pos->x;
843 Window->InternalPos.IconPos.y = Pos->y;
844 Window->InternalPos.flags |= WPF_MININIT;
845 TRACE("Position is set! X:%d Y:%d\n",Pos->x,Pos->y);
846 return;
847}
848
849BOOL
851{
852 if (Style & WS_MINIMIZE)
853 return TRUE;
855 return TRUE;
857 return FALSE;
858 if (Style & WS_THICKFRAME)
859 return TRUE;
860 Style &= WS_CAPTION;
861 if (Style == WS_DLGFRAME || Style == WS_CAPTION)
862 return TRUE;
863 return FALSE;
864}
865
868{
869 if(HAS_DLGFRAME(Wnd->style, Wnd->ExStyle) && !(Wnd->style & WS_MINIMIZE))
870 {
873 }
874 else
875 {
876 if(HAS_THICKFRAME(Wnd->style, Wnd->ExStyle)&& !(Wnd->style & WS_MINIMIZE))
877 {
880 }
881 else if(HAS_THINFRAME(Wnd->style, Wnd->ExStyle))
882 {
885 }
886 else
887 {
888 *cx = *cy = 0;
889 }
890 }
891}
892
893VOID
895{
896 DWORD Border = 0;
897
899 Border += 2;
901 Border += 1; /* for the outer frame always present */
902 if ((ExStyle & WS_EX_CLIENTEDGE) && WithClient)
903 Border += 2;
905 Border ++; /* The other border */
906 Size->cx = Size->cy = Border;
907 if ((Style & WS_THICKFRAME) && !(Style & WS_MINIMIZE)) /* The resize border */
908 {
911 }
914}
915
916//
917// Fix CORE-5177
918// See winetests:user32:win.c:wine_AdjustWindowRectEx,
919// Simplified version.
920//
922{
923 DWORD adjust = 0;
924
925 if ( ExStyle & WS_EX_WINDOWEDGE ) // 1st
926 adjust = 2; /* outer */
927 else if ( ExStyle & WS_EX_STATICEDGE ) // 2nd
928 adjust = 1; /* for the outer frame always present */
929
931 adjust += 2;
932
934 adjust++; /* The other border */
935
936 return adjust;
937}
938
941 POINT* MinTrack, POINT* MaxTrack)
942{
943 MINMAXINFO MinMax;
944 PMONITOR monitor;
945 INT xinc, yinc;
946 LONG style = Window->style;
947 LONG adjustedStyle;
948 LONG exstyle = Window->ExStyle;
949 RECT rc;
950 DWORD adjust;
951
953
954 /* Compute default values */
955
956 rc = Window->rcWindow;
957 MinMax.ptReserved.x = rc.left;
958 MinMax.ptReserved.y = rc.top;
959
960 if ((style & WS_CAPTION) == WS_CAPTION)
961 adjustedStyle = style & ~WS_BORDER; /* WS_CAPTION = WS_DLGFRAME | WS_BORDER */
962 else
963 adjustedStyle = style;
964
965 if (Window->spwndParent)
966 IntGetClientRect(Window->spwndParent, &rc);
967
968 adjust = IntGetWindowBorders(adjustedStyle, exstyle);
969
970 // Handle special case while maximized. CORE-15893
971 if ((adjustedStyle & WS_THICKFRAME) && !(adjustedStyle & WS_CHILD) && !(adjustedStyle & WS_MINIMIZE))
972 adjust += 1;
973
974 xinc = yinc = adjust;
975
976 if ((adjustedStyle & WS_THICKFRAME) && (adjustedStyle & WS_CHILD) && !(adjustedStyle & WS_MINIMIZE))
977 {
980 }
981
985
986 xinc = -rc.left;
987 yinc = -rc.top;
988
989 MinMax.ptMaxSize.x = rc.right - rc.left;
990 MinMax.ptMaxSize.y = rc.bottom - rc.top;
991 if (style & (WS_DLGFRAME | WS_BORDER))
992 {
995 }
996 else
997 {
998 MinMax.ptMinTrackSize.x = 2 * xinc;
999 MinMax.ptMinTrackSize.y = 2 * yinc;
1000 }
1003 MinMax.ptMaxPosition.x = -xinc;
1004 MinMax.ptMaxPosition.y = -yinc;
1005
1006 if (!EMPTYPOINT(Window->InternalPos.MaxPos)) MinMax.ptMaxPosition = Window->InternalPos.MaxPos;
1007
1009
1010 /* if the app didn't change the values, adapt them for the current monitor */
1011 if ((monitor = UserGetPrimaryMonitor()))
1012 {
1013 RECT rc_work;
1014
1015 rc_work = monitor->rcMonitor;
1016
1017 if (style & WS_MAXIMIZEBOX)
1018 {
1019 if ((style & WS_CAPTION) == WS_CAPTION || !(style & (WS_CHILD | WS_POPUP)))
1020 rc_work = monitor->rcWork;
1021 }
1022
1023 if (MinMax.ptMaxSize.x == UserGetSystemMetrics(SM_CXSCREEN) + 2 * xinc &&
1024 MinMax.ptMaxSize.y == UserGetSystemMetrics(SM_CYSCREEN) + 2 * yinc)
1025 {
1026 MinMax.ptMaxSize.x = (rc_work.right - rc_work.left) + 2 * xinc;
1027 MinMax.ptMaxSize.y = (rc_work.bottom - rc_work.top) + 2 * yinc;
1028 }
1029 if (MinMax.ptMaxPosition.x == -xinc && MinMax.ptMaxPosition.y == -yinc)
1030 {
1031 MinMax.ptMaxPosition.x = rc_work.left - xinc;
1032 MinMax.ptMaxPosition.y = rc_work.top - yinc;
1033 }
1034 if (MinMax.ptMaxSize.x >= (monitor->rcMonitor.right - monitor->rcMonitor.left) &&
1035 MinMax.ptMaxSize.y >= (monitor->rcMonitor.bottom - monitor->rcMonitor.top) )
1036 {
1038 }
1039 else
1040 Window->state &= ~WNDS_MAXIMIZESTOMONITOR;
1041 }
1042
1043
1044 MinMax.ptMaxTrackSize.x = max(MinMax.ptMaxTrackSize.x,
1045 MinMax.ptMinTrackSize.x);
1046 MinMax.ptMaxTrackSize.y = max(MinMax.ptMaxTrackSize.y,
1047 MinMax.ptMinTrackSize.y);
1048
1049 if (MaxSize)
1050 *MaxSize = MinMax.ptMaxSize;
1051 if (MaxPos)
1052 *MaxPos = MinMax.ptMaxPosition;
1053 if (MinTrack)
1054 *MinTrack = MinMax.ptMinTrackSize;
1055 if (MaxTrack)
1056 *MaxTrack = MinMax.ptMaxTrackSize;
1057
1058 return 0; // FIXME: What does it return? Wine returns MINMAXINFO.
1059}
1060
1061static
1062BOOL
1064{
1065 PWND ParentWnd = Child->spwndParent;
1066
1067 while (ParentWnd)
1068 {
1069 if (ParentWnd->style & WS_CLIPCHILDREN)
1070 break;
1071
1072 if (ParentWnd->hrgnUpdate != 0)
1073 {
1074 IntInvalidateWindows( ParentWnd,
1077 }
1078
1079 ParentWnd = ParentWnd->spwndParent;
1080 }
1081
1082 return TRUE;
1083}
1084
1085static
1087FixClientRect(PRECTL ClientRect, PRECTL WindowRect)
1088{
1089 if (ClientRect->left < WindowRect->left)
1090 {
1091 ClientRect->left = WindowRect->left;
1092 }
1093 else if (WindowRect->right < ClientRect->left)
1094 {
1095 ClientRect->left = WindowRect->right;
1096 }
1097 if (ClientRect->right < WindowRect->left)
1098 {
1099 ClientRect->right = WindowRect->left;
1100 }
1101 else if (WindowRect->right < ClientRect->right)
1102 {
1103 ClientRect->right = WindowRect->right;
1104 }
1105 if (ClientRect->top < WindowRect->top)
1106 {
1107 ClientRect->top = WindowRect->top;
1108 }
1109 else if (WindowRect->bottom < ClientRect->top)
1110 {
1111 ClientRect->top = WindowRect->bottom;
1112 }
1113 if (ClientRect->bottom < WindowRect->top)
1114 {
1115 ClientRect->bottom = WindowRect->top;
1116 }
1117 else if (WindowRect->bottom < ClientRect->bottom)
1118 {
1119 ClientRect->bottom = WindowRect->bottom;
1120 }
1121}
1122/***********************************************************************
1123 * get_valid_rects
1124 *
1125 * Compute the valid rects from the old and new client rect and WVR_* flags.
1126 * Helper for WM_NCCALCSIZE handling.
1127 */
1128static
1130get_valid_rects( RECTL *old_client, RECTL *new_client, UINT flags, RECTL *valid )
1131{
1132 int cx, cy;
1133
1134 if (flags & WVR_REDRAW)
1135 {
1138 return;
1139 }
1140
1141 if (flags & WVR_VALIDRECTS)
1142 {
1143 if (!RECTL_bIntersectRect( &valid[0], &valid[0], new_client ) ||
1144 !RECTL_bIntersectRect( &valid[1], &valid[1], old_client ))
1145 {
1148 return;
1149 }
1151 }
1152 else
1153 {
1154 valid[0] = *new_client;
1155 valid[1] = *old_client;
1156 }
1157
1158 /* make sure the rectangles have the same size */
1159 cx = min( valid[0].right - valid[0].left, valid[1].right - valid[1].left );
1160 cy = min( valid[0].bottom - valid[0].top, valid[1].bottom - valid[1].top );
1161
1162 if (flags & WVR_ALIGNBOTTOM)
1163 {
1164 valid[0].top = valid[0].bottom - cy;
1165 valid[1].top = valid[1].bottom - cy;
1166 }
1167 else
1168 {
1169 valid[0].bottom = valid[0].top + cy;
1170 valid[1].bottom = valid[1].top + cy;
1171 }
1172 if (flags & WVR_ALIGNRIGHT)
1173 {
1174 valid[0].left = valid[0].right - cx;
1175 valid[1].left = valid[1].right - cx;
1176 }
1177 else
1178 {
1179 valid[0].right = valid[0].left + cx;
1180 valid[1].right = valid[1].left + cx;
1181 }
1182}
1183
1184static
1186co_WinPosDoNCCALCSize(PWND Window, PWINDOWPOS WinPos, RECTL* WindowRect, RECTL* ClientRect, RECTL* validRects)
1187{
1188 PWND Parent;
1189 UINT wvrFlags = 0;
1190
1192
1193 /* Send WM_NCCALCSIZE message to get new client area */
1194 if ((WinPos->flags & (SWP_FRAMECHANGED | SWP_NOSIZE)) != SWP_NOSIZE)
1195 {
1197 WINDOWPOS winposCopy;
1198
1199 params.rgrc[0] = *WindowRect; // new coordinates of a window that has been moved or resized
1200 params.rgrc[1] = Window->rcWindow; // window before it was moved or resized
1201 params.rgrc[2] = Window->rcClient; // client area before the window was moved or resized
1202
1203 Parent = Window->spwndParent;
1204 if (0 != (Window->style & WS_CHILD) && Parent)
1205 {
1206 RECTL_vOffsetRect(&(params.rgrc[0]), - Parent->rcClient.left, - Parent->rcClient.top);
1207 RECTL_vOffsetRect(&(params.rgrc[1]), - Parent->rcClient.left, - Parent->rcClient.top);
1208 RECTL_vOffsetRect(&(params.rgrc[2]), - Parent->rcClient.left, - Parent->rcClient.top);
1209 }
1210
1211 params.lppos = &winposCopy;
1212 winposCopy = *WinPos;
1213
1215
1216 /* If the application send back garbage, ignore it */
1217 if (params.rgrc[0].left <= params.rgrc[0].right &&
1218 params.rgrc[0].top <= params.rgrc[0].bottom)
1219 {
1220 *ClientRect = params.rgrc[0]; // First rectangle contains the coordinates of the new client rectangle resulting from the move or resize
1221 if ((Window->style & WS_CHILD) && Parent)
1222 {
1223 RECTL_vOffsetRect(ClientRect, Parent->rcClient.left, Parent->rcClient.top);
1224 }
1225 FixClientRect(ClientRect, WindowRect);
1226 }
1227
1228 if (ClientRect->left != Window->rcClient.left ||
1229 ClientRect->top != Window->rcClient.top)
1230 {
1231 WinPos->flags &= ~SWP_NOCLIENTMOVE;
1232 }
1233
1234 if (ClientRect->right - ClientRect->left != Window->rcClient.right - Window->rcClient.left)
1235 {
1236 WinPos->flags &= ~SWP_NOCLIENTSIZE;
1237 }
1238 else
1239 wvrFlags &= ~WVR_HREDRAW;
1240
1241 if (ClientRect->bottom - ClientRect->top != Window->rcClient.bottom - Window->rcClient.top)
1242 {
1243 WinPos->flags &= ~SWP_NOCLIENTSIZE;
1244 }
1245 else
1246 wvrFlags &= ~WVR_VREDRAW;
1247
1248 validRects[0] = params.rgrc[1]; // second rectangle contains the valid destination rectangle
1249 validRects[1] = params.rgrc[2]; // third rectangle contains the valid source rectangle
1250 }
1251 else
1252 {
1253 if (!(WinPos->flags & SWP_NOMOVE) &&
1254 (ClientRect->left != Window->rcClient.left ||
1255 ClientRect->top != Window->rcClient.top))
1256 {
1257 WinPos->flags &= ~SWP_NOCLIENTMOVE;
1258 }
1259 }
1260
1262 {
1263 RECTL_vSetEmptyRect( &validRects[0] );
1264 RECTL_vSetEmptyRect( &validRects[1] );
1265 }
1266 else get_valid_rects( &Window->rcClient, ClientRect, wvrFlags, validRects );
1267
1268 return wvrFlags;
1269}
1270
1271static
1274 PWINDOWPOS WinPos,
1275 PRECTL WindowRect,
1276 PRECTL ClientRect)
1277{
1279
1280 /* Send WM_WINDOWPOSCHANGING message */
1281
1282 if (!(WinPos->flags & SWP_NOSENDCHANGING)
1283 && !((WinPos->flags & SWP_AGG_NOCLIENTCHANGE) && (WinPos->flags & SWP_SHOWWINDOW)))
1284 {
1285 TRACE("Sending WM_WINDOWPOSCHANGING to hwnd %p flags %04x.\n", UserHMGetHandle(Window), WinPos->flags);
1287 }
1288
1289 /* Calculate new position and size */
1290
1291 *WindowRect = Window->rcWindow;
1292 *ClientRect = (Window->style & WS_MINIMIZE) ? Window->rcWindow : Window->rcClient;
1293
1294 if (!(WinPos->flags & SWP_NOSIZE))
1295 {
1296 if (Window->style & WS_MINIMIZE)
1297 {
1298 WindowRect->right = WindowRect->left + UserGetSystemMetrics(SM_CXMINIMIZED);
1299 WindowRect->bottom = WindowRect->top + UserGetSystemMetrics(SM_CYMINIMIZED);
1300 }
1301 else
1302 {
1303 WindowRect->right = WindowRect->left + WinPos->cx;
1304 WindowRect->bottom = WindowRect->top + WinPos->cy;
1305 }
1306 }
1307
1308 if (!(WinPos->flags & SWP_NOMOVE))
1309 {
1310 INT X, Y;
1311 PWND Parent;
1312 X = WinPos->x;
1313 Y = WinPos->y;
1314
1315 Parent = Window->spwndParent;
1316
1317 // Parent child position issue is in here. SetParent_W7 test CORE-6651.
1318 if (//((Window->style & WS_CHILD) != 0) && <- Fixes wine msg test_SetParent: "rects do not match", the last test.
1319 Parent &&
1320 Parent != Window->head.rpdesk->pDeskInfo->spwnd)
1321 {
1322 TRACE("Not SWP_NOMOVE 1 Parent client offset X %d Y %d\n",X,Y);
1323 X += Parent->rcClient.left;
1324 Y += Parent->rcClient.top;
1325 TRACE("Not SWP_NOMOVE 2 Parent client offset X %d Y %d\n",X,Y);
1326 }
1327
1328 WindowRect->left = X;
1329 WindowRect->top = Y;
1330 WindowRect->right += X - Window->rcWindow.left;
1331 WindowRect->bottom += Y - Window->rcWindow.top;
1332
1333 RECTL_vOffsetRect(ClientRect, X - Window->rcWindow.left,
1334 Y - Window->rcWindow.top);
1335 }
1337
1338 TRACE( "hwnd %p, after %p, swp %d,%d %dx%d flags %08x\n",
1339 WinPos->hwnd, WinPos->hwndInsertAfter, WinPos->x, WinPos->y,
1340 WinPos->cx, WinPos->cy, WinPos->flags );
1341 TRACE("WindowRect: %d %d %d %d\n", WindowRect->left,WindowRect->top,WindowRect->right,WindowRect->bottom);
1342 TRACE("ClientRect: %d %d %d %d\n", ClientRect->left,ClientRect->top,ClientRect->right,ClientRect->bottom);
1343
1344 return TRUE;
1345}
1346
1347/*
1348 * Fix Z order taking into account owned popups -
1349 * basically we need to maintain them above the window that owns them
1350 *
1351 * FIXME: hide/show owned popups when owner visibility changes.
1352 *
1353 * ReactOS: See bug CORE-6129 and CORE-6554.
1354 *
1355 */
1357 // Pass all the win:test_children/popup_zorder tests except "move hwnd_F and its popups down" which is if'ed out.
1358 // Side effect, breaks more of the DeferWindowPos api tests, but wine breaks more!!!!
1359static
1362{
1363 HWND *List = NULL;
1364 HWND Owner;
1365 LONG Style;
1366 PWND DesktopWindow, ChildObject;
1367 int i;
1368
1369 TRACE("(%p) hInsertAfter = %p\n", Window, hWndInsertAfter );
1370
1371 Style = Window->style;
1372
1373 if (Style & WS_CHILD)
1374 {
1375 TRACE("Window is child\n");
1376 return hWndInsertAfter;
1377 }
1378
1379 Owner = (Window->spwndOwner ? UserHMGetHandle(Window->spwndOwner) : NULL);
1380
1381 if (Owner)
1382 {
1383 /* Make sure this popup stays above the owner */
1384
1385 if (hWndInsertAfter != HWND_TOPMOST)
1386 {
1387 DesktopWindow = UserGetDesktopWindow();
1388 List = IntWinListChildren(DesktopWindow);
1389
1390 if (List != NULL)
1391 {
1392 for (i = 0; List[i]; i++)
1393 {
1394 BOOL topmost = FALSE;
1395
1396 ChildObject = ValidateHwndNoErr(List[i]);
1397 if (ChildObject)
1398 {
1399 topmost = (ChildObject->ExStyle & WS_EX_TOPMOST) != 0;
1400 }
1401
1402 if (List[i] == Owner)
1403 {
1404 /* We found its Owner, so we must handle it here. */
1405 if (i > 0)
1406 {
1407 if (List[i - 1] != UserHMGetHandle(Window))
1408 {
1409 /*
1410 * If the popup to be inserted is not already just
1411 * before the Owner, insert it there. The modified
1412 * hWndInsertAfter will be handled below.
1413 *
1414 * (NOTE: Do not allow hWndInsertAfter to become equal
1415 * to the popup's window handle, as this would cause
1416 * the popup to link to itself).
1417 */
1418 hWndInsertAfter = List[i - 1];
1419 }
1420 else
1421 {
1422 /* If the popup to be inserted is already
1423 * before the Owner, we are done. */
1425 return hWndInsertAfter;
1426 }
1427 }
1428 else
1429 {
1430 hWndInsertAfter = topmost ? HWND_TOPMOST : HWND_TOP;
1431 }
1432 break;
1433 }
1434
1435 if (hWndInsertAfter == HWND_TOP || hWndInsertAfter == HWND_NOTOPMOST)
1436 {
1437 if (!topmost) break;
1438 }
1439 else if (List[i] == hWndInsertAfter) break;
1440 }
1441 }
1442 else
1443 return hWndInsertAfter;
1444 }
1445 }
1446
1447 if (hWndInsertAfter == HWND_BOTTOM)
1448 {
1449 ERR("Window is HWND_BOTTOM hwnd %p\n",hWndInsertAfter);
1451 goto done;
1452 }
1453
1454 if (!List)
1455 {
1456 DesktopWindow = UserGetDesktopWindow();
1457 List = IntWinListChildren(DesktopWindow);
1458 }
1459
1460 if (List != NULL)
1461 {
1462 i = 0;
1463
1464 if (hWndInsertAfter == HWND_TOP || hWndInsertAfter == HWND_NOTOPMOST)
1465 {
1466 if (hWndInsertAfter == HWND_NOTOPMOST || !(Window->ExStyle & WS_EX_TOPMOST))
1467 {
1468 TRACE("skip all the topmost windows\n");
1469 /* skip all the topmost windows */
1470 while (List[i] &&
1471 (ChildObject = ValidateHwndNoErr(List[i])) &&
1472 (ChildObject->ExStyle & WS_EX_TOPMOST)) i++;
1473 }
1474 }
1475 else if (hWndInsertAfter != HWND_TOPMOST)
1476 {
1477 /* skip windows that are already placed correctly */
1478 for (i = 0; List[i]; i++)
1479 {
1480 if (List[i] == hWndInsertAfter) break;
1481 if (List[i] == UserHMGetHandle(Window))
1482 {
1484 goto done; /* nothing to do if window is moving backwards in z-order */
1485 }
1486 }
1487 }
1488
1489 for (; List[i]; i++)
1490 {
1491 PWND Wnd;
1493
1494 if (List[i] == UserHMGetHandle(Window))
1495 break;
1496
1497 if (!(Wnd = ValidateHwndNoErr(List[i])))
1498 continue;
1499
1500 Owner = (Wnd->spwndOwner ? UserHMGetHandle(Wnd->spwndOwner) : NULL);
1501
1502 if (Owner != UserHMGetHandle(Window)) continue;
1503
1504 UserRefObjectCo(Wnd, &Ref);
1505 TRACE( "moving %p owned by %p after %p\n", List[i], UserHMGetHandle(Window), hWndInsertAfter );
1506 co_WinPosSetWindowPos(Wnd, hWndInsertAfter, 0, 0, 0, 0,
1508
1509 UserDerefObjectCo(Wnd);
1510 hWndInsertAfter = List[i];
1511 }
1513 }
1514done:
1515 return hWndInsertAfter;
1516}
1518
1519/***********************************************************************
1520 * WinPosInternalMoveWindow
1521 *
1522 * Update WindowRect and ClientRect of Window and all of its children
1523 * We keep both WindowRect and ClientRect in screen coordinates internally
1524 */
1525static
1528{
1529 PWND Child;
1530
1531 ASSERT(Window != Window->spwndChild);
1532 TRACE("InternalMoveWin X %d Y %d\n", MoveX, MoveY);
1533
1534 Window->rcWindow.left += MoveX;
1535 Window->rcWindow.right += MoveX;
1536 Window->rcWindow.top += MoveY;
1537 Window->rcWindow.bottom += MoveY;
1538
1539 Window->rcClient.left += MoveX;
1540 Window->rcClient.right += MoveX;
1541 Window->rcClient.top += MoveY;
1542 Window->rcClient.bottom += MoveY;
1543
1544 for(Child = Window->spwndChild; Child; Child = Child->spwndNext)
1545 {
1546 WinPosInternalMoveWindow(Child, MoveX, MoveY);
1547 }
1548}
1549
1550/*
1551 * WinPosFixupSWPFlags
1552 *
1553 * Fix redundant flags and values in the WINDOWPOS structure.
1554 */
1555static
1558{
1559 PWND Parent;
1560 POINT pt;
1561
1562 /* Finally make sure that all coordinates are valid */
1563 if (WinPos->x < -32768) WinPos->x = -32768;
1564 else if (WinPos->x > 32767) WinPos->x = 32767;
1565 if (WinPos->y < -32768) WinPos->y = -32768;
1566 else if (WinPos->y > 32767) WinPos->y = 32767;
1567
1568 WinPos->cx = max(WinPos->cx, 0);
1569 WinPos->cy = max(WinPos->cy, 0);
1570
1572 if (!IntIsWindowVisible( Parent ) &&
1573 /* Fix B : wine msg test_SetParent:WmSetParentSeq_2:25 wParam bits! */
1575
1576 if (Wnd->style & WS_VISIBLE) WinPos->flags &= ~SWP_SHOWWINDOW;
1577 else
1578 {
1579 WinPos->flags &= ~SWP_HIDEWINDOW;
1580 if (!(WinPos->flags & SWP_SHOWWINDOW)) WinPos->flags |= SWP_NOREDRAW;
1581 }
1582
1583 /* Check for right size */
1584 if (Wnd->rcWindow.right - Wnd->rcWindow.left == WinPos->cx &&
1585 Wnd->rcWindow.bottom - Wnd->rcWindow.top == WinPos->cy)
1586 {
1587 WinPos->flags |= SWP_NOSIZE;
1588 }
1589
1590 pt.x = WinPos->x;
1591 pt.y = WinPos->y;
1593 TRACE("WPFU C2S wpx %d wpy %d ptx %d pty %d\n",WinPos->x,WinPos->y,pt.x,pt.y);
1594 /* Check for right position */
1595 if (Wnd->rcWindow.left == pt.x && Wnd->rcWindow.top == pt.y)
1596 {
1597 //ERR("In right pos\n");
1598 WinPos->flags |= SWP_NOMOVE;
1599 }
1600
1601 if ( WinPos->hwnd != UserGetForegroundWindow() && (Wnd->style & (WS_POPUP | WS_CHILD)) != WS_CHILD)
1602 {
1603 /* Bring to the top when activating */
1604 if (!(WinPos->flags & (SWP_NOACTIVATE|SWP_HIDEWINDOW)) &&
1605 (WinPos->flags & SWP_NOZORDER ||
1606 (WinPos->hwndInsertAfter != HWND_TOPMOST && WinPos->hwndInsertAfter != HWND_NOTOPMOST)))
1607 {
1608 WinPos->flags &= ~SWP_NOZORDER;
1609 WinPos->hwndInsertAfter = (0 != (Wnd->ExStyle & WS_EX_TOPMOST) ? HWND_TOPMOST : HWND_TOP);
1610 }
1611 }
1612
1613 /* Check hwndInsertAfter */
1614 if (!(WinPos->flags & SWP_NOZORDER))
1615 {
1616 /* Fix sign extension */
1617 if (WinPos->hwndInsertAfter == (HWND)0xffff)
1618 {
1619 WinPos->hwndInsertAfter = HWND_TOPMOST;
1620 }
1621 else if (WinPos->hwndInsertAfter == (HWND)0xfffe)
1622 {
1624 }
1625
1626 if (WinPos->hwndInsertAfter == HWND_TOP)
1627 {
1628 /* Keep it topmost when it's already topmost */
1629 if ((Wnd->ExStyle & WS_EX_TOPMOST) != 0)
1630 WinPos->hwndInsertAfter = HWND_TOPMOST;
1631
1632 if (IntGetWindow(WinPos->hwnd, GW_HWNDFIRST) == WinPos->hwnd)
1633 {
1634 WinPos->flags |= SWP_NOZORDER;
1635 }
1636 }
1637 else if (WinPos->hwndInsertAfter == HWND_BOTTOM)
1638 {
1639 if (!(Wnd->ExStyle & WS_EX_TOPMOST) && IntGetWindow(WinPos->hwnd, GW_HWNDLAST) == WinPos->hwnd)
1640 WinPos->flags |= SWP_NOZORDER;
1641 }
1642 else if (WinPos->hwndInsertAfter == HWND_TOPMOST)
1643 {
1644 if ((Wnd->ExStyle & WS_EX_TOPMOST) && IntGetWindow(WinPos->hwnd, GW_HWNDFIRST) == WinPos->hwnd)
1645 WinPos->flags |= SWP_NOZORDER;
1646 }
1647 else if (WinPos->hwndInsertAfter == HWND_NOTOPMOST)
1648 {
1649 if (!(Wnd->ExStyle & WS_EX_TOPMOST))
1650 WinPos->flags |= SWP_NOZORDER;
1651 }
1652 else /* hwndInsertAfter must be a sibling of the window */
1653 {
1654 PWND InsAfterWnd;
1655
1656 InsAfterWnd = ValidateHwndNoErr(WinPos->hwndInsertAfter);
1657 if(!InsAfterWnd)
1658 {
1659 return TRUE;
1660 }
1661
1662 if (InsAfterWnd->spwndParent != Wnd->spwndParent)
1663 {
1664 /* Note from wine User32 Win test_SetWindowPos:
1665 "Returns TRUE also for windows that are not siblings"
1666 "Does not seem to do anything even without passing flags, still returns TRUE"
1667 "Same thing the other way around."
1668 ".. and with these windows."
1669 */
1670 return FALSE;
1671 }
1672 else
1673 {
1674 /*
1675 * We don't need to change the Z order of hwnd if it's already
1676 * inserted after hwndInsertAfter or when inserting hwnd after
1677 * itself.
1678 */
1679 if ((WinPos->hwnd == WinPos->hwndInsertAfter) ||
1680 ((InsAfterWnd->spwndNext) && (WinPos->hwnd == UserHMGetHandle(InsAfterWnd->spwndNext))))
1681 {
1682 WinPos->flags |= SWP_NOZORDER;
1683 }
1684 }
1685 }
1686 }
1687
1688 return TRUE;
1689}
1690
1691//
1692// This is a NC HACK fix for forcing painting of non client areas.
1693// Further troubleshooting in painting.c is required to remove this hack.
1694// See CORE-7166 & CORE-15934
1695//
1696VOID
1698{
1699 HDC hDC;
1700 PREGION RgnUpdate;
1701 UINT RgnType;
1702 BOOL Create = FALSE;
1703
1704 if (Wnd->hrgnUpdate == NULL)
1705 {
1706 Wnd->hrgnUpdate = NtGdiCreateRectRgn(0, 0, 0, 0);
1708 Create = TRUE;
1709 }
1710
1711 if (Wnd->hrgnUpdate != HRGN_WINDOW)
1712 {
1713 RgnUpdate = REGION_LockRgn(Wnd->hrgnUpdate);
1714 if (RgnUpdate)
1715 {
1716 RgnType = IntGdiCombineRgn(RgnUpdate, RgnUpdate, pRgn, RGN_OR);
1717 REGION_UnlockRgn(RgnUpdate);
1718 if (RgnType == NULLREGION)
1719 {
1722 Wnd->hrgnUpdate = NULL;
1723 Create = FALSE;
1724 }
1725 }
1726 }
1727
1728 IntSendNCPaint( Wnd, hRgn ); // Region can be deleted by the application.
1729
1730 if (Wnd->hrgnUpdate)
1731 {
1732 hDC = UserGetDCEx( Wnd,
1733 Wnd->hrgnUpdate,
1735
1737 // Kill the loop, so Clear before we send.
1739 {
1741 }
1742 UserReleaseDC(Wnd, hDC, FALSE);
1743 }
1744
1745 if (Create)
1746 {
1749 Wnd->hrgnUpdate = NULL;
1750 }
1751}
1752
1754{
1755 HWND *phwnd;
1756 PWND pwndNode, pwndDesktop = UserGetDesktopWindow();
1757 PWINDOWLIST pWL;
1759
1760 if (!pwndDesktop)
1761 return;
1762
1763 /* Enumerate the windows to get the IME windows (of default and non-default) */
1764 pWL = IntBuildHwndList(pwndDesktop->spwndChild, IACE_LIST, gptiCurrent);
1765 if (!pWL)
1766 return;
1767
1768 for (phwnd = pWL->ahwnd; *phwnd != HWND_TERMINATOR; ++phwnd)
1769 {
1771 break;
1772
1773 pwndNode = ValidateHwndNoErr(*phwnd);
1774 if (pwndNode == NULL ||
1775 pwndNode->head.pti != gptiCurrent ||
1777 {
1778 continue;
1779 }
1780
1781 /* Now hwndNode is an IME window of the current thread */
1782 UserRefObjectCo(pwndNode, &Ref);
1784 UserDerefObjectCo(pwndNode);
1785 }
1786
1787 IntFreeHwndList(pWL);
1788}
1789
1790/* x and y are always screen relative */
1793 PWND Window,
1794 HWND WndInsertAfter,
1795 INT x,
1796 INT y,
1797 INT cx,
1798 INT cy,
1799 UINT flags
1800 )
1801{
1802 WINDOWPOS WinPos;
1803 RECTL NewWindowRect;
1804 RECTL NewClientRect;
1805 RECTL valid_rects[2];
1806 PREGION VisBefore = NULL;
1807 PREGION VisBeforeJustClient = NULL;
1808 PREGION VisAfter = NULL;
1810 ULONG WvrFlags = 0;
1811 RECTL OldWindowRect, OldClientRect;
1812 int RgnType;
1813 HDC Dc;
1815 PWND Ancestor;
1816 BOOL bPointerInWindow, PosChanged = FALSE;
1818
1820
1821 TRACE("pwnd %p, after %p, %d,%d (%dx%d), flags 0x%x\n",
1822 Window, WndInsertAfter, x, y, cx, cy, flags);
1823#if DBG
1824 dump_winpos_flags(flags);
1825#endif
1826
1827 /* FIXME: Get current active window from active queue. Why? since r2915. */
1828
1829 bPointerInWindow = IntPtInWindow(Window, gpsi->ptCursor.x, gpsi->ptCursor.y);
1830
1831 WinPos.hwnd = UserHMGetHandle(Window);
1832 WinPos.hwndInsertAfter = WndInsertAfter;
1833 WinPos.x = x;
1834 WinPos.y = y;
1835 WinPos.cx = cx;
1836 WinPos.cy = cy;
1837 WinPos.flags = flags;
1838
1839 if ( flags & SWP_ASYNCWINDOWPOS )
1840 {
1841 LRESULT lRes;
1843 if ( ppos )
1844 {
1845 WinPos.flags &= ~SWP_ASYNCWINDOWPOS; // Clear flag.
1846 *ppos = WinPos;
1847 /* Yes it's a pointer inside Win32k! */
1848 lRes = co_IntSendMessageNoWait( WinPos.hwnd, WM_ASYNC_SETWINDOWPOS, 0, (LPARAM)ppos);
1849 /* We handle this the same way as Event Hooks and Hooks. */
1850 if ( !lRes )
1851 {
1853 return FALSE;
1854 }
1855 return TRUE;
1856 }
1857 return FALSE;
1858 }
1859
1860 co_WinPosDoWinPosChanging(Window, &WinPos, &NewWindowRect, &NewClientRect);
1861
1862 /* Does the window still exist? */
1863 if (!IntIsWindow(WinPos.hwnd))
1864 {
1865 TRACE("WinPosSetWindowPos: Invalid handle 0x%p!\n",WinPos.hwnd);
1867 return FALSE;
1868 }
1869
1870 /* Fix up the flags. */
1871 if (!WinPosFixupFlags(&WinPos, Window))
1872 {
1873 // See Note.
1874 return TRUE;
1875 }
1876
1877 Ancestor = UserGetAncestor(Window, GA_PARENT);
1878 if ( (WinPos.flags & (SWP_NOZORDER | SWP_HIDEWINDOW | SWP_SHOWWINDOW)) != SWP_NOZORDER &&
1879 Ancestor && UserHMGetHandle(Ancestor) == IntGetDesktopWindow() )
1880 {
1882 }
1883
1884 if (!(WinPos.flags & SWP_NOREDRAW))
1885 {
1886 /* Compute the visible region before the window position is changed */
1887 if (!(WinPos.flags & SWP_SHOWWINDOW) &&
1888 (WinPos.flags & (SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER |
1891 {
1893 (Window->style & WS_CLIPSIBLINGS) ? TRUE : FALSE);
1894
1895 if ( VisBefore != NULL &&
1896 REGION_Complexity(VisBefore) == NULLREGION )
1897 {
1898 REGION_Delete(VisBefore);
1899 VisBefore = NULL;
1900 }
1901 else if(VisBefore)
1902 {
1903 REGION_bOffsetRgn(VisBefore, -Window->rcWindow.left, -Window->rcWindow.top);
1904 }
1905
1906 /* Calculate the non client area for resizes, as this is used in the copy region */
1907 if ((WinPos.flags & (SWP_NOSIZE | SWP_FRAMECHANGED)) != SWP_NOSIZE)
1908 {
1909 VisBeforeJustClient = VIS_ComputeVisibleRegion(Window, TRUE, FALSE,
1910 (Window->style & WS_CLIPSIBLINGS) ? TRUE : FALSE);
1911
1912 if ( VisBeforeJustClient != NULL &&
1913 REGION_Complexity(VisBeforeJustClient) == NULLREGION )
1914 {
1915 REGION_Delete(VisBeforeJustClient);
1916 VisBeforeJustClient = NULL;
1917 }
1918 else if(VisBeforeJustClient)
1919 {
1920 REGION_bOffsetRgn(VisBeforeJustClient, -Window->rcWindow.left, -Window->rcWindow.top);
1921 }
1922 }
1923 }
1924 }
1925
1927 if (Window->hrgnNewFrame)
1928 {
1929 SelectWindowRgn( Window, Window->hrgnNewFrame ); // Should be PSMWP->acvr->hrgnClip
1930 Window->hrgnNewFrame = NULL;
1931 }
1932
1933 WvrFlags = co_WinPosDoNCCALCSize(Window, &WinPos, &NewWindowRect, &NewClientRect, valid_rects);
1934
1935// ERR("co_WinPosDoNCCALCSize returned 0x%x\n valid dest: %d %d %d %d\n valid src : %d %d %d %d\n", WvrFlags,
1936// valid_rects[0].left,valid_rects[0].top,valid_rects[0].right,valid_rects[0].bottom,
1937// valid_rects[1].left,valid_rects[1].top,valid_rects[1].right,valid_rects[1].bottom);
1938
1939 /* Validate link windows. (also take into account shell window in hwndShellWindow) */
1940 if (!(WinPos.flags & SWP_NOZORDER) && WinPos.hwnd != UserGetShellWindow())
1941 {
1943 }
1944
1945 OldWindowRect = Window->rcWindow;
1946 OldClientRect = Window->rcClient;
1947
1948 if (NewClientRect.left != OldClientRect.left ||
1949 NewClientRect.top != OldClientRect.top)
1950 {
1951 // Move child window if their parent is moved. Keep Child window relative to Parent...
1953 NewClientRect.left - OldClientRect.left,
1954 NewClientRect.top - OldClientRect.top);
1955 PosChanged = TRUE;
1956 }
1957
1958 Window->rcWindow = NewWindowRect;
1959 Window->rcClient = NewClientRect;
1960
1961 /* erase parent when hiding or resizing child */
1962 if (WinPos.flags & SWP_HIDEWINDOW)
1963 {
1964 /* Clear the update region */
1966 NULL,
1967 0,
1969
1970 if (UserIsDesktopWindow(Window->spwndParent))
1972
1973 Window->style &= ~WS_VISIBLE; //IntSetStyle( Window, 0, WS_VISIBLE );
1974 Window->head.pti->cVisWindows--;
1976 }
1977 else if (WinPos.flags & SWP_SHOWWINDOW)
1978 {
1979 if (Window->style & WS_CHILD)
1980 {
1981 if ((Window->style & WS_POPUP) && (Window->ExStyle & WS_EX_APPWINDOW))
1982 {
1984 if (!(WinPos.flags & SWP_NOACTIVATE))
1986 }
1987 }
1988 else if ((Window->ExStyle & WS_EX_APPWINDOW) ||
1989 (!(Window->ExStyle & WS_EX_TOOLWINDOW) && !Window->spwndOwner &&
1990 (!Window->spwndParent || UserIsDesktopWindow(Window->spwndParent))))
1991 {
1993 {
1995 if (!(WinPos.flags & SWP_NOACTIVATE))
1997 }
1998 }
1999
2000 Window->style |= WS_VISIBLE; //IntSetStyle( Window, WS_VISIBLE, 0 );
2001 Window->head.pti->cVisWindows++;
2003 }
2004 else
2005 {
2007 }
2008
2009 if (Window->hrgnUpdate != NULL && Window->hrgnUpdate != HRGN_WINDOW)
2010 {
2011 NtGdiOffsetRgn(Window->hrgnUpdate,
2012 NewWindowRect.left - OldWindowRect.left,
2013 NewWindowRect.top - OldWindowRect.top);
2014 }
2015
2016 DceResetActiveDCEs(Window); // For WS_VISIBLE changes.
2017
2018 // Change or update, set send non-client paint flag.
2019 if ( Window->style & WS_VISIBLE &&
2020 (WinPos.flags & SWP_STATECHANGED || (!(Window->state2 & WNDS2_WIN31COMPAT) && WinPos.flags & SWP_NOREDRAW ) ) )
2021 {
2022 TRACE("Set WNDS_SENDNCPAINT %p\n",Window);
2023 Window->state |= WNDS_SENDNCPAINT;
2024 }
2025
2026 /*
2027 * Request a full non-client repaint when the frame geometry changes.
2028 * Otherwise, copied bits can retain parts of the old frame. CORE-20769.
2029 */
2030 if ((Window->style & WS_VISIBLE) &&
2031 ((WinPos.flags & SWP_FRAMECHANGED) ||
2032 (OldWindowRect.right - OldWindowRect.left) != (NewWindowRect.right - NewWindowRect.left) ||
2033 (OldWindowRect.bottom - OldWindowRect.top) != (NewWindowRect.bottom - NewWindowRect.top)))
2034 {
2035 Window->state |= WNDS_SENDNCPAINT;
2037 }
2038
2039 if ((!(WinPos.flags & SWP_NOREDRAW) && ((WinPos.flags & SWP_AGG_STATUSFLAGS) != SWP_AGG_NOPOSCHANGE)) ||
2040 ((WinPos.flags & SWP_NOZORDER) && (WinPos.flags & SWP_NOOWNERZORDER)))
2041 {
2042 /* Determine the new visible region */
2044 (Window->style & WS_CLIPSIBLINGS) ? TRUE : FALSE);
2045
2046 if ( VisAfter != NULL &&
2047 REGION_Complexity(VisAfter) == NULLREGION )
2048 {
2049 REGION_Delete(VisAfter);
2050 VisAfter = NULL;
2051 }
2052 else if(VisAfter)
2053 {
2054 /* Clip existing update region to new window size */
2055 if (Window->hrgnUpdate != NULL)
2056 {
2057 PREGION RgnUpdate = REGION_LockRgn(Window->hrgnUpdate);
2058 if (RgnUpdate)
2059 {
2060 RgnType = IntGdiCombineRgn(RgnUpdate, RgnUpdate, VisAfter, RGN_AND);
2061 REGION_UnlockRgn(RgnUpdate);
2062 }
2063 }
2064 REGION_bOffsetRgn(VisAfter, -Window->rcWindow.left, -Window->rcWindow.top);
2065 }
2066
2067 /*
2068 * Determine which pixels can be copied from the old window position
2069 * to the new. Those pixels must be visible in both the old and new
2070 * position. Also, check the class style to see if the windows of this
2071 * class need to be completely repainted on (horizontal/vertical) size
2072 * change.
2073 */
2074 if (VisBefore != NULL &&
2075 VisAfter != NULL &&
2076 !(WvrFlags & WVR_REDRAW) &&
2077 !(WinPos.flags & SWP_NOCOPYBITS) &&
2078 !(Window->ExStyle & WS_EX_TRANSPARENT))
2079 {
2080
2081 /*
2082 * If this is (also) a window resize, the whole nonclient area
2083 * needs to be repainted. So we limit the copy to the client area,
2084 * 'cause there is no use in copying it (would possibly cause
2085 * "flashing" too). However, if the copy region is already empty,
2086 * we don't have to crop (can't take anything away from an empty
2087 * region...)
2088 */
2089
2090 CopyRgn = IntSysCreateRectpRgn(0, 0, 0, 0);
2091 if ((WinPos.flags & SWP_NOSIZE) && (WinPos.flags & SWP_NOCLIENTSIZE))
2092 RgnType = IntGdiCombineRgn(CopyRgn, VisAfter, VisBefore, RGN_AND);
2093 else if (VisBeforeJustClient != NULL)
2094 {
2095 RgnType = IntGdiCombineRgn(CopyRgn, VisAfter, VisBeforeJustClient, RGN_AND);
2096 }
2097
2098 /* Now use in copying bits which are in the update region. */
2099 if (Window->hrgnUpdate != NULL)
2100 {
2101 PREGION RgnUpdate = REGION_LockRgn(Window->hrgnUpdate);
2102 if (RgnUpdate)
2103 {
2104 REGION_bOffsetRgn(CopyRgn, NewWindowRect.left, NewWindowRect.top);
2106 REGION_bOffsetRgn(CopyRgn, -NewWindowRect.left, -NewWindowRect.top);
2107 REGION_UnlockRgn(RgnUpdate);
2108 }
2109 }
2110
2111 /*
2112 * Now, get the bounding box of the copy region. If it's empty
2113 * there's nothing to copy. Also, it's no use copying bits onto
2114 * themselves.
2115 */
2117 {
2118 /* Nothing to copy, clean up */
2120 CopyRgn = NULL;
2121 }
2122 else if ( OldWindowRect.left != NewWindowRect.left ||
2123 OldWindowRect.top != NewWindowRect.top ||
2124 (WinPos.flags & SWP_FRAMECHANGED) )
2125 {
2126 HRGN DcRgn = NtGdiCreateRectRgn(0, 0, 0, 0);
2127 PREGION DcRgnObj = REGION_LockRgn(DcRgn);
2128
2129 /*
2130 * Small trick here: there is no function to bitblt a region. So
2131 * we set the region as the clipping region, take the bounding box
2132 * of the region and bitblt that. Since nothing outside the clipping
2133 * region is copied, this has the effect of bitblt'ing the region.
2134 *
2135 * Since NtUserGetDCEx takes ownership of the clip region, we need
2136 * to create a copy of CopyRgn and pass that. We need CopyRgn later
2137 */
2139 REGION_bOffsetRgn(DcRgnObj, NewWindowRect.left, NewWindowRect.top);
2140 REGION_UnlockRgn(DcRgnObj);
2141 Dc = UserGetDCEx( Window,
2142 DcRgn,
2143 DCX_WINDOW|DCX_CACHE|DCX_INTERSECTRGN|DCX_CLIPSIBLINGS|DCX_KEEPCLIPRGN); // DCX_WINDOW will set first, go read WinDC.c.
2144 NtGdiBitBlt( Dc,
2145 CopyRect.left, CopyRect.top,
2146 CopyRect.right - CopyRect.left,
2147 CopyRect.bottom - CopyRect.top,
2148 Dc,
2149 CopyRect.left + (OldWindowRect.left - NewWindowRect.left),
2150 CopyRect.top + (OldWindowRect.top - NewWindowRect.top),
2151 SRCCOPY,
2153 0);
2154
2157 GreDeleteObject(DcRgn);
2158 }
2159 }
2160 else
2161 {
2162 CopyRgn = NULL;
2163 }
2164
2165 /* We need to redraw what wasn't visible before or force a redraw */
2166 if (VisAfter != NULL)
2167 {
2168 PREGION DirtyRgn = IntSysCreateRectpRgn(0, 0, 0, 0);
2169 if (DirtyRgn)
2170 {
2171 if (CopyRgn != NULL)
2172 {
2173 RgnType = IntGdiCombineRgn(DirtyRgn, VisAfter, CopyRgn, RGN_DIFF);
2174 }
2175 else
2176 {
2177 RgnType = IntGdiCombineRgn(DirtyRgn, VisAfter, 0, RGN_COPY);
2178 }
2179
2180 if (RgnType != ERROR && RgnType != NULLREGION) // Regions moved.
2181 {
2182 /* old code
2183 NtGdiOffsetRgn(DirtyRgn, Window->rcWindow.left, Window->rcWindow.top);
2184 IntInvalidateWindows( Window,
2185 DirtyRgn,
2186 RDW_ERASE | RDW_FRAME | RDW_INVALIDATE | RDW_ALLCHILDREN);
2187 }
2188 GreDeleteObject(DirtyRgn);
2189 */
2190
2191 PWND Parent = Window->spwndParent;
2192
2193 REGION_bOffsetRgn( DirtyRgn, Window->rcWindow.left, Window->rcWindow.top);
2194
2195 if ( (Window->style & WS_CHILD) && (Parent) && !(Parent->style & WS_CLIPCHILDREN))
2196 {
2199 }
2201 }
2202 else if (RgnType != ERROR && RgnType == NULLREGION) // Must be the same. See CORE-7166 & CORE-15934, NC HACK fix.
2203 {
2204 if ( !PosChanged &&
2205 !(WinPos.flags & SWP_DEFERERASE) &&
2206 (WinPos.flags & SWP_FRAMECHANGED) )
2207 {
2208 PWND pwnd = Window;
2209 PWND Parent = Window->spwndParent;
2210
2211 if ( pwnd->style & WS_CHILD ) // Fix ProgMan menu bar drawing.
2212 {
2213 TRACE("SWP_FRAMECHANGED win child %p Parent %p\n",pwnd,Parent);
2214 pwnd = Parent ? Parent : pwnd;
2215 }
2216
2217 if ( !(pwnd->style & WS_CHILD) )
2218 {
2219 /*
2220 * Check if we have these specific windows style bits set/reset.
2221 * FIXME: There may be other combinations of styles that need this handling as well.
2222 * This fixes the ReactOS Calculator buttons disappearing in CORE-16827.
2223 */
2224 if ((Window->style & WS_CLIPSIBLINGS) && !(Window->style & (WS_POPUP | WS_CLIPCHILDREN | WS_SIZEBOX)))
2225 {
2226 IntSendNCPaint(pwnd, HRGN_WINDOW); // Paint the whole frame.
2227 }
2228 else // Use region handling
2229 {
2230 HRGN DcRgn = NtGdiCreateRectRgn(0, 0, 0, 0);
2231 PREGION DcRgnObj = REGION_LockRgn(DcRgn);
2232 TRACE("SWP_FRAMECHANGED win %p hRgn %p\n",pwnd, DcRgn);
2233 IntGdiCombineRgn(DcRgnObj, VisBefore, NULL, RGN_COPY);
2234 REGION_UnlockRgn(DcRgnObj);
2235 ForceNCPaintErase(pwnd, DcRgn, DcRgnObj);
2236 GreDeleteObject(DcRgn);
2237 }
2238 }
2239 }
2240 }
2241 REGION_Delete(DirtyRgn);
2242 }
2243 }
2244
2245 /* Expose what was covered before but not covered anymore */
2246 if (VisBefore != NULL)
2247 {
2248 PREGION ExposedRgn = IntSysCreateRectpRgn(0, 0, 0, 0);
2249 if (ExposedRgn)
2250 {
2251 RgnType = IntGdiCombineRgn(ExposedRgn, VisBefore, NULL, RGN_COPY);
2252 REGION_bOffsetRgn(ExposedRgn,
2253 OldWindowRect.left - NewWindowRect.left,
2254 OldWindowRect.top - NewWindowRect.top);
2255
2256 if (VisAfter != NULL)
2257 RgnType = IntGdiCombineRgn(ExposedRgn, ExposedRgn, VisAfter, RGN_DIFF);
2258
2259 if (RgnType != ERROR && RgnType != NULLREGION)
2260 {
2262 }
2263 REGION_Delete(ExposedRgn);
2264 }
2265 }
2266 }
2267
2268 if (!(WinPos.flags & (SWP_NOACTIVATE|SWP_HIDEWINDOW)))
2269 {
2270 if ((Window->style & (WS_CHILD | WS_POPUP)) == WS_CHILD)
2271 {
2273 }
2274 else
2275 {
2276 //ERR("SetWindowPos Set FG Window!\n");
2277 if ( pti->MessageQueue->spwndActive != Window ||
2278 pti->MessageQueue != gpqForeground )
2279 {
2280 //ERR("WPSWP : set active window\n");
2281 if (!(Window->state & WNDS_BEINGACTIVATED)) // Inside SAW?
2282 {
2283 co_IntSetForegroundWindow(Window); // Fixes SW_HIDE issues. Wine win test_SetActiveWindow & test_SetForegroundWindow.
2284 }
2285 }
2286 }
2287 }
2288
2289 if ( !PosChanged &&
2290 (WinPos.flags & SWP_FRAMECHANGED) &&
2291 !(WinPos.flags & SWP_DEFERERASE) && // Prevent sending WM_SYNCPAINT message.
2292 VisAfter )
2293 {
2294 PWND Parent = Window->spwndParent;
2295 if ( !(Window->style & WS_CHILD) && (Parent) && (Parent->style & WS_CLIPCHILDREN))
2296 {
2297 TRACE("SWP_FRAMECHANGED Parent %p WS_CLIPCHILDREN %p\n",Parent,Window);
2298 UserSyncAndPaintWindows(Parent, RDW_CLIPCHILDREN); // NC should redraw here, see NC HACK fix.
2299 }
2300 }
2301
2302 // Fix wine msg test_SetFocus, prevents sending WM_WINDOWPOSCHANGED.
2303 if ( VisBefore == NULL &&
2304 VisBeforeJustClient == NULL &&
2305 !(Window->ExStyle & WS_EX_TOPMOST) &&
2307 {
2308 TRACE("No drawing, set no Z order and no redraw!\n");
2310 }
2311
2312 if (VisBefore != NULL)
2313 {
2314 REGION_Delete(VisBefore);
2315 VisBefore = NULL;
2316 }
2317 if (VisBeforeJustClient != NULL)
2318 {
2319 REGION_Delete(VisBeforeJustClient);
2320 VisBeforeJustClient = NULL;
2321 }
2322 if (VisAfter != NULL)
2323 {
2324 REGION_Delete(VisAfter);
2325 VisAfter = NULL;
2326 }
2327 if (CopyRgn != NULL)
2328 {
2330 CopyRgn = NULL;
2331 }
2332
2333 if(!(flags & SWP_DEFERERASE))
2334 {
2335 /* erase parent when hiding or resizing child */
2336 if ((flags & SWP_HIDEWINDOW) ||
2337 (!(flags & SWP_SHOWWINDOW) &&
2339 {
2340 PWND Parent = Window->spwndParent;
2343 }
2344
2345 /* Give newly shown windows a chance to redraw */
2348 {
2350 }
2351 }
2352
2353 /* And last, send the WM_WINDOWPOSCHANGED message */
2354
2355 TRACE("\tstatus hwnd %p flags = %04x\n", Window ? UserHMGetHandle(Window) : NULL, WinPos.flags & SWP_AGG_STATUSFLAGS);
2356
2359 {
2360 /* WM_WINDOWPOSCHANGED is sent even if SWP_NOSENDCHANGING is set
2361 and always contains final window position.
2362 */
2363 WinPos.x = NewWindowRect.left;
2364 WinPos.y = NewWindowRect.top;
2365 WinPos.cx = NewWindowRect.right - NewWindowRect.left;
2366 WinPos.cy = NewWindowRect.bottom - NewWindowRect.top;
2367 TRACE("WM_WINDOWPOSCHANGED hwnd %p Flags %04x\n",WinPos.hwnd,WinPos.flags);
2369 }
2370
2371 if ( WinPos.flags & SWP_FRAMECHANGED || WinPos.flags & SWP_STATECHANGED ||
2372 !(WinPos.flags & SWP_NOCLIENTSIZE) || !(WinPos.flags & SWP_NOCLIENTMOVE) )
2373 {
2374 PWND pWnd = ValidateHwndNoErr(WinPos.hwnd);
2375 if (pWnd)
2376 IntNotifyWinEvent(EVENT_OBJECT_LOCATIONCHANGE, pWnd, OBJID_WINDOW, CHILDID_SELF, WEF_SETBYWNDPTI);
2377 }
2378
2379 /* Send WM_IME_SYSTEM:IMS_UPDATEIMEUI to the IME windows if necessary */
2380 if ((WinPos.flags & (SWP_NOMOVE | SWP_NOSIZE)) != (SWP_NOMOVE | SWP_NOSIZE))
2381 {
2382 if (IS_IMM_MODE())
2384 }
2385
2386 if(bPointerInWindow != IntPtInWindow(Window, gpsi->ptCursor.x, gpsi->ptCursor.y))
2387 {
2388 /* Generate mouse move message */
2389 MSG msg;
2390 msg.message = WM_MOUSEMOVE;
2391 msg.wParam = UserGetMouseButtonsState();
2392 msg.lParam = MAKELPARAM(gpsi->ptCursor.x, gpsi->ptCursor.y);
2393 msg.pt = gpsi->ptCursor;
2395 }
2396
2397 return TRUE;
2398}
2399
2402{
2404
2406
2407 *ClientRect = *WindowRect;
2409
2410 FixClientRect(ClientRect, WindowRect);
2411
2412 return Result;
2413}
2414
2415void FASTCALL
2417{
2418 RECTL Rect;
2419 LPARAM lParam;
2421
2422 IntGetClientRect(Wnd, &Rect);
2423 lParam = MAKELONG(Rect.right-Rect.left, Rect.bottom-Rect.top);
2424
2425 Wnd->state &= ~WNDS_SENDSIZEMOVEMSGS;
2426
2427 if (Wnd->style & WS_MAXIMIZE)
2428 {
2430 }
2431 else if (Wnd->style & WS_MINIMIZE)
2432 {
2434 lParam = 0;
2435 }
2436
2438
2440 lParam = MAKELONG(Wnd->rcClient.left, Wnd->rcClient.top);
2441 else
2442 lParam = MAKELONG(Wnd->rcClient.left-Wnd->spwndParent->rcClient.left, Wnd->rcClient.top-Wnd->spwndParent->rcClient.top);
2443
2445
2447}
2448
2450co_WinPosMinMaximize(PWND Wnd, UINT ShowFlag, RECT* NewPos)
2451{
2452 POINT Size;
2453 WINDOWPLACEMENT wpl;
2454 LONG old_style;
2455 UINT SwpFlags = 0;
2456
2457 ASSERT_REFS_CO(Wnd);
2458
2459 wpl.length = sizeof(wpl);
2460 IntGetWindowPlacement( Wnd, &wpl );
2461
2463 {
2464 ERR("WinPosMinMaximize WH_CBT Call Hook return!\n");
2465 return SWP_NOSIZE | SWP_NOMOVE;
2466 }
2467 if (Wnd->style & WS_MINIMIZE)
2468 {
2469 switch (ShowFlag)
2470 {
2471 case SW_MINIMIZE:
2472 case SW_SHOWMINNOACTIVE:
2473 case SW_SHOWMINIMIZED:
2474 case SW_FORCEMINIMIZE:
2475 return SWP_NOSIZE | SWP_NOMOVE;
2476 }
2478 {
2479 return(SWP_NOSIZE | SWP_NOMOVE);
2480 }
2481 SwpFlags |= SWP_NOCOPYBITS;
2482 }
2483 switch (ShowFlag)
2484 {
2485 case SW_MINIMIZE:
2486 case SW_SHOWMINNOACTIVE:
2487 case SW_SHOWMINIMIZED:
2488 case SW_FORCEMINIMIZE:
2489 {
2490 //ERR("MinMaximize Minimize\n");
2491 if (Wnd->style & WS_MAXIMIZE)
2492 {
2493 Wnd->InternalPos.flags |= WPF_RESTORETOMAXIMIZED;
2494 }
2495 else
2496 {
2497 Wnd->InternalPos.flags &= ~WPF_RESTORETOMAXIMIZED;
2498 }
2499
2500 old_style = IntSetStyle( Wnd, WS_MINIMIZE, WS_MAXIMIZE );
2501
2503
2504 if (!(Wnd->InternalPos.flags & WPF_SETMINPOSITION))
2505 Wnd->InternalPos.flags &= ~WPF_MININIT;
2506
2508
2509 if (!(old_style & WS_MINIMIZE))
2510 {
2511 SwpFlags |= SWP_STATECHANGED;
2513 }
2514
2515 RECTL_vSetRect(NewPos, wpl.ptMinPosition.x, wpl.ptMinPosition.y,
2518 SwpFlags |= SWP_NOCOPYBITS;
2519 break;
2520 }
2521
2522 case SW_MAXIMIZE:
2523 {
2524 //ERR("MinMaximize Maximize\n");
2525 IntSetSnapEdge(Wnd, HTNOWHERE); /* Mark as not snapped (for Win+Left,Up,Down) */
2526 if ((Wnd->style & WS_MAXIMIZE) && (Wnd->style & WS_VISIBLE))
2527 {
2528 SwpFlags = SWP_NOSIZE | SWP_NOMOVE;
2529 break;
2530 }
2532
2533 /*ERR("Maximize: %d,%d %dx%d\n",
2534 wpl.ptMaxPosition.x, wpl.ptMaxPosition.y, Size.x, Size.y);
2535 */
2536 old_style = IntSetStyle( Wnd, WS_MAXIMIZE, WS_MINIMIZE );
2537 /*if (old_style & WS_MINIMIZE)
2538 {
2539 IntShowOwnedPopups(Wnd, TRUE);
2540 }*/
2541
2542 if (!(old_style & WS_MAXIMIZE)) SwpFlags |= SWP_STATECHANGED;
2543 RECTL_vSetRect(NewPos, wpl.ptMaxPosition.x, wpl.ptMaxPosition.y,
2544 //wpl.ptMaxPosition.x + Size.x, wpl.ptMaxPosition.y + Size.y);
2545 Size.x, Size.y);
2546 break;
2547 }
2548
2549 case SW_SHOWNOACTIVATE:
2550 Wnd->InternalPos.flags &= ~WPF_RESTORETOMAXIMIZED;
2551 /* fall through */
2552 case SW_SHOWNORMAL:
2553 case SW_RESTORE:
2554 case SW_SHOWDEFAULT: /* FIXME: should have its own handler */
2555 {
2556 //ERR("MinMaximize Restore\n");
2557 old_style = IntSetStyle( Wnd, 0, WS_MINIMIZE | WS_MAXIMIZE );
2558 if (old_style & WS_MINIMIZE)
2559 {
2561
2562 if (Wnd->InternalPos.flags & WPF_RESTORETOMAXIMIZED)
2563 {
2565 IntSetStyle( Wnd, WS_MAXIMIZE, 0 );
2566 SwpFlags |= SWP_STATECHANGED;
2567 RECTL_vSetRect(NewPos, wpl.ptMaxPosition.x, wpl.ptMaxPosition.y,
2568 wpl.ptMaxPosition.x + Size.x, wpl.ptMaxPosition.y + Size.y);
2569 break;
2570 }
2571 else
2572 {
2573 *NewPos = wpl.rcNormalPosition;
2574 if (ShowFlag != SW_SHOWNORMAL && ShowFlag != SW_SHOWDEFAULT)
2575 {
2576 UINT edge = IntGetWindowSnapEdge(Wnd);
2577 if (edge)
2578 co_IntCalculateSnapPosition(Wnd, edge, NewPos);
2579 }
2580 NewPos->right -= NewPos->left;
2581 NewPos->bottom -= NewPos->top;
2582 break;
2583 }
2584 }
2585 else
2586 {
2587 if (!(old_style & WS_MAXIMIZE))
2588 {
2589 break;
2590 }
2591 SwpFlags |= SWP_STATECHANGED;
2592 Wnd->InternalPos.flags &= ~WPF_RESTORETOMAXIMIZED;
2593 *NewPos = wpl.rcNormalPosition;
2594 NewPos->right -= NewPos->left;
2595 NewPos->bottom -= NewPos->top;
2596 break;
2597 }
2598 }
2599 }
2600 return SwpFlags;
2601}
2602
2603// SW_FORCEMINIMIZE
2605{
2606 HRGN hRgn;
2607 PREGION pRgn;
2608
2609 if ((pWnd->style & (WS_MINIMIZE | WS_VISIBLE)) != WS_VISIBLE)
2610 return;
2611
2612 if (pWnd->state & WNDS_DESTROYED)
2613 return;
2614
2615 pWnd->ExStyle &= ~WS_EX_MAKEVISIBLEWHENUNGHOSTED;
2616
2617 IntSetStyle(pWnd, 0, WS_VISIBLE);
2618
2619 // Invalidate and redraw the window region
2621 pRgn = REGION_LockRgn(hRgn);
2623 REGION_UnlockRgn(pRgn);
2625
2626 // Activate the other window if necessary
2627 if (pWnd->spwndParent == pWnd->head.rpdesk->pDeskInfo->spwnd)
2629}
2630
2631/*
2632 ShowWindow does not set SWP_FRAMECHANGED!!! Fix wine msg test_SetParent:WmSetParentSeq_2:23 wParam bits!
2633 */
2636{
2637 BOOLEAN WasVisible;
2638 UINT Swp = 0, EventMsg = 0;
2639 RECTL NewPos = {0, 0, 0, 0};
2640 BOOLEAN ShowFlag;
2641 LONG style;
2642 PWND Parent;
2643 PTHREADINFO pti;
2644 //HRGN VisibleRgn;
2645 BOOL ShowOwned = FALSE;
2646 BOOL FirstTime = FALSE;
2647 ASSERT_REFS_CO(Wnd);
2648 //KeRosDumpStackFrames(NULL, 20);
2650 WasVisible = (Wnd->style & WS_VISIBLE) != 0;
2651 style = Wnd->style;
2652
2653 TRACE("co_WinPosShowWindow START hwnd %p Cmd %d usicmd %u\n",
2654 UserHMGetHandle(Wnd), Cmd, pti->ppi->usi.wShowWindow);
2655
2656 if ( pti->ppi->usi.dwFlags & STARTF_USESHOWWINDOW )
2657 {
2658 if ((Wnd->style & (WS_POPUP|WS_CHILD)) != WS_CHILD)
2659 {
2660 if ((Wnd->style & WS_CAPTION) == WS_CAPTION)
2661 {
2662 if (Wnd->spwndOwner == NULL)
2663 {
2664 if ( Cmd == SW_SHOWNORMAL || Cmd == SW_SHOW)
2665 {
2667 }
2668 FirstTime = TRUE;
2669 TRACE("co_WPSW FT 1\n");
2670 }
2671 }
2672 }
2673 }
2674
2675 if ( Cmd == SW_SHOWDEFAULT )
2676 {
2677 if ( pti->ppi->usi.dwFlags & STARTF_USESHOWWINDOW )
2678 {
2679 Cmd = pti->ppi->usi.wShowWindow;
2680 FirstTime = TRUE;
2681 TRACE("co_WPSW FT 2\n");
2682 }
2683 }
2684
2685 if (FirstTime)
2686 {
2688 }
2689
2690 switch (Cmd)
2691 {
2692 case SW_HIDE:
2693 {
2694 if (!WasVisible)
2695 {
2696 //ERR("co_WinPosShowWindow Exit Bad\n");
2697 return FALSE;
2698 }
2700 if (Wnd != pti->MessageQueue->spwndActive)
2702 break;
2703 }
2704
2705 case SW_FORCEMINIMIZE:
2707 return WasVisible;
2708
2709 case SW_SHOWMINNOACTIVE:
2711 /* Fall through. */
2712 case SW_SHOWMINIMIZED:
2713 case SW_MINIMIZE: /* CORE-15669: SW_MINIMIZE also shows */
2714 Swp |= SWP_SHOWWINDOW;
2715 {
2716 Swp |= SWP_NOACTIVATE;
2717 if (!(style & WS_MINIMIZE))
2718 {
2720 // Fix wine Win test_SetFocus todo #1 & #2,
2721 if (Cmd == SW_SHOWMINIMIZED)
2722 {
2723 //ERR("co_WinPosShowWindow Set focus 1\n");
2724 if ((style & (WS_CHILD | WS_POPUP)) == WS_CHILD)
2726 else
2727 co_UserSetFocus(0);
2728 }
2729
2730 Swp |= co_WinPosMinMaximize(Wnd, Cmd, &NewPos);
2731
2732 EventMsg = EVENT_SYSTEM_MINIMIZESTART;
2733 }
2734 else
2735 {
2736 if (WasVisible)
2737 {
2738 //ERR("co_WinPosShowWindow Exit Good\n");
2739 return TRUE;
2740 }
2741 Swp |= SWP_NOSIZE | SWP_NOMOVE;
2742 }
2743 break;
2744 }
2745
2746 case SW_SHOWMAXIMIZED:
2747 {
2748 Swp |= SWP_SHOWWINDOW;
2749 if (!(style & WS_MAXIMIZE))
2750 {
2751 ShowOwned = TRUE;
2752
2753 Swp |= co_WinPosMinMaximize(Wnd, SW_MAXIMIZE, &NewPos);
2754
2755 EventMsg = EVENT_SYSTEM_MINIMIZEEND;
2756 }
2757 else
2758 {
2759 if (WasVisible)
2760 {
2761 //ERR("co_WinPosShowWindow Exit Good 1\n");
2762 return TRUE;
2763 }
2764 Swp |= SWP_NOSIZE | SWP_NOMOVE;
2765 }
2766 break;
2767 }
2768
2769 case SW_SHOWNA:
2771 if (style & WS_CHILD && !(Wnd->ExStyle & WS_EX_MDICHILD)) Swp |= SWP_NOZORDER;
2772 break;
2773 case SW_SHOW:
2774 if (WasVisible) return(TRUE); // Nothing to do!
2776 /* Don't activate the topmost window. */
2777 if (style & WS_CHILD && !(Wnd->ExStyle & WS_EX_MDICHILD)) Swp |= SWP_NOACTIVATE | SWP_NOZORDER;
2778 break;
2779
2780 case SW_SHOWNOACTIVATE:
2782 /* Fall through. */
2783 case SW_SHOWNORMAL:
2784 case SW_SHOWDEFAULT:
2785 case SW_RESTORE:
2786 if (!WasVisible) Swp |= SWP_SHOWWINDOW;
2787 if (style & (WS_MINIMIZE | WS_MAXIMIZE))
2788 {
2789 Swp |= co_WinPosMinMaximize(Wnd, Cmd, &NewPos);
2790 if (style & WS_MINIMIZE) EventMsg = EVENT_SYSTEM_MINIMIZEEND;
2791 }
2792 else
2793 {
2794 if (WasVisible)
2795 {
2796 //ERR("co_WinPosShowWindow Exit Good 3\n");
2797 return TRUE;
2798 }
2799 Swp |= SWP_NOSIZE | SWP_NOMOVE;
2800 }
2801 if ( style & WS_CHILD &&
2802 !(Wnd->ExStyle & WS_EX_MDICHILD) &&
2803 !(Swp & SWP_STATECHANGED))
2805 break;
2806
2807 default:
2808 //ERR("co_WinPosShowWindow Exit Good 4\n");
2809 return FALSE;
2810 }
2811
2812 ShowFlag = (Cmd != SW_HIDE);
2813
2814 if ((ShowFlag != WasVisible || Cmd == SW_SHOWNA) && Cmd != SW_SHOWMAXIMIZED && !(Swp & SWP_STATECHANGED))
2815 {
2817#if 0 // Fix wine msg test_SetParent:WmSetParentSeq_1:2
2818 if (!(Wnd->state2 & WNDS2_WIN31COMPAT)) // <------------- XP sets this bit!
2820#endif
2821 if (!VerifyWnd(Wnd)) return WasVisible;
2822 }
2823
2824 /* We can't activate a child window */
2825 if ((Wnd->style & WS_CHILD) &&
2826 !(Wnd->ExStyle & WS_EX_MDICHILD) &&
2827 Cmd != SW_SHOWNA)
2828 {
2829 //ERR("SWP Child No active and ZOrder\n");
2831 }
2832
2833#if 0 // Explorer issues with common controls? Someone does not know how CS_SAVEBITS works.
2834 // Breaks startup and shutdown active window...
2835 if ((Wnd->style & (WS_POPUP|WS_CHILD)) != WS_CHILD &&
2836 Wnd->pcls->style & CS_SAVEBITS &&
2837 ((Cmd == SW_SHOW) || (Cmd == SW_NORMAL)))
2838 {
2839 ERR("WinPosShowWindow Set active\n");
2840 //UserSetActiveWindow(Wnd);
2841 co_IntSetForegroundWindow(Wnd); // HACK
2843 }
2844#endif
2845
2846 if (IsChildVisible(Wnd) || Swp & SWP_STATECHANGED)
2847 {
2848 TRACE("Child is Vis %s or State changed %s. ShowFlag %s Swp %04x\n",
2849 (IsChildVisible(Wnd) ? "TRUE" : "FALSE"), (Swp & SWP_STATECHANGED ? "TRUE" : "FALSE"),
2850 (ShowFlag ? "TRUE" : "FALSE"),LOWORD(Swp));
2852 0 != (Wnd->ExStyle & WS_EX_TOPMOST) ? HWND_TOPMOST : HWND_TOP,
2853 NewPos.left,
2854 NewPos.top,
2855 NewPos.right, // NewPos.right - NewPos.left, when minimized and restore, the window becomes smaller.
2856 NewPos.bottom,// NewPos.bottom - NewPos.top,
2857 LOWORD(Swp));
2858 }
2859 else
2860 {
2861 TRACE("Parent Vis?\n");
2862 /* if parent is not visible simply toggle WS_VISIBLE and return */
2863 if (ShowFlag) IntSetStyle( Wnd, WS_VISIBLE, 0 );
2864 else IntSetStyle( Wnd, 0, WS_VISIBLE );
2865 }
2866
2867 if ( EventMsg ) IntNotifyWinEvent(EventMsg, Wnd, OBJID_WINDOW, CHILDID_SELF, WEF_SETBYWNDPTI);
2868
2869 if ( ShowOwned ) IntShowOwnedPopups(Wnd, TRUE );
2870
2871 if ((Cmd == SW_HIDE) || (Cmd == SW_MINIMIZE))
2872 {
2873 if ( Wnd == pti->MessageQueue->spwndActive && pti->MessageQueue == IntGetFocusMessageQueue() )
2874 {
2876 {
2877 if (!ActivateOtherWindowMin(Wnd))
2878 {
2880 }
2881 }
2882 else
2883 {
2885 }
2886 }
2887
2888 /* Revert focus to parent */
2889 if (Wnd == pti->MessageQueue->spwndFocus)
2890 {
2891 Parent = Wnd->spwndParent;
2893 Parent = 0;
2895 }
2896 // Hide, just return.
2897 if (Cmd == SW_HIDE) return WasVisible;
2898 }
2899
2900 /* FIXME: Check for window destruction. */
2901
2902 if ((Wnd->state & WNDS_SENDSIZEMOVEMSGS) &&
2903 !(Wnd->state2 & WNDS2_INDESTROY))
2904 {
2906 }
2907
2908 /* if previous state was minimized Windows sets focus to the window */
2909 if (style & WS_MINIMIZE)
2910 {
2911 co_UserSetFocus(Wnd);
2912 // Fix wine Win test_SetFocus todo #3,
2914 }
2915 //ERR("co_WinPosShowWindow EXIT\n");
2916 return WasVisible;
2917}
2918
2919static PWND
2921 IN PWND ScopeWin,
2922 IN POINT *Point,
2923 IN OUT USHORT *HitTest,
2924 IN BOOL Ignore
2925 )
2926{
2927 HWND *List, *phWnd;
2928 PWND pwndChild = NULL;
2929
2930 /* not visible */
2931 if (!(ScopeWin->style & WS_VISIBLE))
2932 {
2933 return NULL;
2934 }
2935
2936 /* not in window or in window region */
2937 if (!IntPtInWindow(ScopeWin, Point->x, Point->y))
2938 {
2939 return NULL;
2940 }
2941
2942 /* transparent */
2943 if ((ScopeWin->ExStyle & (WS_EX_LAYERED|WS_EX_TRANSPARENT)) == (WS_EX_LAYERED|WS_EX_TRANSPARENT))
2944 {
2945 return NULL;
2946 }
2947
2948 if (!Ignore && (ScopeWin->style & WS_DISABLED))
2949 { /* disabled child */
2950 if ((ScopeWin->style & (WS_POPUP|WS_CHILD)) == WS_CHILD) return NULL;
2951 /* process the hit error */
2952 *HitTest = HTERROR;
2953 return ScopeWin;
2954 }
2955
2956 /* not minimized and check if point is inside the window */
2957 if (!(ScopeWin->style & WS_MINIMIZE) &&
2958 RECTL_bPointInRect(&ScopeWin->rcClient, Point->x, Point->y) )
2959 {
2960 UserReferenceObject(ScopeWin);
2961
2962 List = IntWinListChildren(ScopeWin);
2963 if (List)
2964 {
2965 for (phWnd = List; *phWnd; ++phWnd)
2966 {
2967 if (!(pwndChild = ValidateHwndNoErr(*phWnd)))
2968 {
2969 continue;
2970 }
2971
2972 pwndChild = co_WinPosSearchChildren(pwndChild, Point, HitTest, Ignore);
2973
2974 if (pwndChild != NULL)
2975 {
2976 /* We found a window. Don't send any more WM_NCHITTEST messages */
2978 UserDereferenceObject(ScopeWin);
2979 return pwndChild;
2980 }
2981 }
2983 }
2984 UserDereferenceObject(ScopeWin);
2985 }
2986
2987 if (ScopeWin->head.pti == PsGetCurrentThreadWin32Thread())
2988 {
2989 *HitTest = (USHORT)co_IntSendMessage(UserHMGetHandle(ScopeWin), WM_NCHITTEST, 0, MAKELONG(Point->x, Point->y));
2990
2991 if ((*HitTest) == (USHORT)HTTRANSPARENT)
2992 {
2993 return NULL;
2994 }
2995 }
2996 else
2997 {
2998 if (*HitTest == HTNOWHERE && pwndChild == NULL) *HitTest = HTCLIENT;
2999 }
3000
3001 return ScopeWin;
3002}
3003
3006 IN PWND ScopeWin,
3007 IN POINT *WinPoint,
3008 IN OUT USHORT* HitTest,
3009 IN BOOL Ignore)
3010{
3011 PWND Window;
3012 POINT Point = *WinPoint;
3014
3015 if( ScopeWin == NULL )
3016 {
3017 ScopeWin = UserGetDesktopWindow();
3018 if(ScopeWin == NULL)
3019 return NULL;
3020 }
3021
3022 *HitTest = HTNOWHERE;
3023
3024 ASSERT_REFS_CO(ScopeWin);
3025 UserRefObjectCo(ScopeWin, &Ref);
3026
3027 Window = co_WinPosSearchChildren(ScopeWin, &Point, HitTest, Ignore);
3028
3029 UserDerefObjectCo(ScopeWin);
3030 if (Window)
3032 ASSERT_REFS_CO(ScopeWin);
3033
3034 return Window;
3035}
3036
3039{
3040 POINTL Pt;
3041 HWND *List, *phWnd;
3042 PWND pwndHit = NULL;
3043
3044 Pt.x = x;
3045 Pt.y = y;
3046
3048 {
3049 Pt.x += Parent->rcClient.left;
3050 Pt.y += Parent->rcClient.top;
3051 }
3052
3053 if (!IntPtInWindow(Parent, Pt.x, Pt.y)) return NULL;
3054
3056 {
3057 for (phWnd = List; *phWnd; phWnd++)
3058 {
3059 PWND Child;
3060 if ((Child = ValidateHwndNoErr(*phWnd)))
3061 {
3062 if ( Child->style & WS_VISIBLE && IntPtInWindow(Child, Pt.x, Pt.y) )
3063 {
3064 if ( Child->pcls->atomClassName != gpsi->atomSysClass[ICLS_BUTTON] ||
3065 (Child->style & BS_TYPEMASK) != BS_GROUPBOX )
3066 {
3068 return Child;
3069 }
3070 pwndHit = Child;
3071 }
3072 }
3073 }
3075 }
3076 return pwndHit ? pwndHit : Parent;
3077}
3078
3081{
3082 POINTL Pt;
3083 HWND *List, *phWnd;
3084 PWND pwndHit = NULL;
3085
3086 Pt.x = x;
3087 Pt.y = y;
3088
3090 {
3091 if (Parent->ExStyle & WS_EX_LAYOUTRTL)
3092 Pt.x = Parent->rcClient.right - Pt.x;
3093 else
3094 Pt.x += Parent->rcClient.left;
3095 Pt.y += Parent->rcClient.top;
3096 }
3097
3098 if (!IntPtInWindow(Parent, Pt.x, Pt.y)) return NULL;
3099
3101 {
3102 for (phWnd = List; *phWnd; phWnd++)
3103 {
3104 PWND Child;
3105 if ((Child = ValidateHwndNoErr(*phWnd)))
3106 {
3107 if (uiFlags & (CWP_SKIPINVISIBLE|CWP_SKIPDISABLED))
3108 {
3109 if (!(Child->style & WS_VISIBLE) && (uiFlags & CWP_SKIPINVISIBLE)) continue;
3110 if ((Child->style & WS_DISABLED) && (uiFlags & CWP_SKIPDISABLED)) continue;
3111 }
3112
3113 if (uiFlags & CWP_SKIPTRANSPARENT)
3114 {
3115 if (Child->ExStyle & WS_EX_TRANSPARENT) continue;
3116 }
3117
3118 if (IntPtInWindow(Child, Pt.x, Pt.y))
3119 {
3120 pwndHit = Child;
3121 break;
3122 }
3123 }
3124 }
3126 }
3127 return pwndHit ? pwndHit : Parent;
3128}
3129
3130HDWP
3133 HWND hwnd,
3134 HWND hwndAfter,
3135 INT x,
3136 INT y,
3137 INT cx,
3138 INT cy,
3139 UINT flags )
3140{
3141 PSMWP pDWP;
3142 int i;
3143 HDWP retvalue = hdwp;
3144
3145 TRACE("hdwp %p, hwnd %p, after %p, %d,%d (%dx%d), flags %08x\n",
3146 hdwp, hwnd, hwndAfter, x, y, cx, cy, flags);
3147
3148 if (flags & ~(SWP_NOSIZE | SWP_NOMOVE |
3153 {
3155 return NULL;
3156 }
3157
3158 if (!(pDWP = (PSMWP)UserGetObject(gHandleTable, hdwp, TYPE_SETWINDOWPOS)))
3159 {
3161 return NULL;
3162 }
3163
3164 for (i = 0; i < pDWP->ccvr; i++)
3165 {
3166 if (pDWP->acvr[i].pos.hwnd == hwnd)
3167 {
3168 /* Merge with the other changes */
3169 if (!(flags & SWP_NOZORDER))
3170 {
3171 pDWP->acvr[i].pos.hwndInsertAfter = hwndAfter;
3172 }
3173 if (!(flags & SWP_NOMOVE))
3174 {
3175 pDWP->acvr[i].pos.x = x;
3176 pDWP->acvr[i].pos.y = y;
3177 }
3178 if (!(flags & SWP_NOSIZE))
3179 {
3180 pDWP->acvr[i].pos.cx = cx;
3181 pDWP->acvr[i].pos.cy = cy;
3182 }
3183 pDWP->acvr[i].pos.flags &= flags | ~(SWP_NOSIZE | SWP_NOMOVE |
3189 goto END;
3190 }
3191 }
3192 if (pDWP->ccvr >= pDWP->ccvrAlloc)
3193 {
3194 PCVR newpos = ExAllocatePoolWithTag(PagedPool, pDWP->ccvrAlloc * 2 * sizeof(CVR), USERTAG_SWP);
3195 if (!newpos)
3196 {
3197 retvalue = NULL;
3198 goto END;
3199 }
3200 RtlZeroMemory(newpos, pDWP->ccvrAlloc * 2 * sizeof(CVR));
3201 RtlCopyMemory(newpos, pDWP->acvr, pDWP->ccvrAlloc * sizeof(CVR));
3203 pDWP->ccvrAlloc *= 2;
3204 pDWP->acvr = newpos;
3205 }
3206 pDWP->acvr[pDWP->ccvr].pos.hwnd = hwnd;
3207 pDWP->acvr[pDWP->ccvr].pos.hwndInsertAfter = hwndAfter;
3208 pDWP->acvr[pDWP->ccvr].pos.x = x;
3209 pDWP->acvr[pDWP->ccvr].pos.y = y;
3210 pDWP->acvr[pDWP->ccvr].pos.cx = cx;
3211 pDWP->acvr[pDWP->ccvr].pos.cy = cy;
3212 pDWP->acvr[pDWP->ccvr].pos.flags = flags;
3213 pDWP->acvr[pDWP->ccvr].hrgnClip = NULL;
3214 pDWP->acvr[pDWP->ccvr].hrgnInterMonitor = NULL;
3215 pDWP->ccvr++;
3216END:
3217 return retvalue;
3218}
3219
3221{
3222 PSMWP pDWP;
3223 PCVR winpos;
3224 BOOL res = TRUE;
3225 int i;
3226
3227 TRACE("%p\n", hdwp);
3228
3229 if (!(pDWP = (PSMWP)UserGetObject(gHandleTable, hdwp, TYPE_SETWINDOWPOS)))
3230 {
3232 return FALSE;
3233 }
3234
3235 for (i = 0, winpos = pDWP->acvr; res && i < pDWP->ccvr; i++, winpos++)
3236 {
3237 PWND pwnd;
3239
3240 TRACE("hwnd %p, after %p, %d,%d (%dx%d), flags %08x\n",
3241 winpos->pos.hwnd, winpos->pos.hwndInsertAfter, winpos->pos.x, winpos->pos.y,
3242 winpos->pos.cx, winpos->pos.cy, winpos->pos.flags);
3243
3244 pwnd = ValidateHwndNoErr(winpos->pos.hwnd);
3245 if (!pwnd)
3246 continue;
3247
3248 UserRefObjectCo(pwnd, &Ref);
3249
3250 if (bAsync)
3251 {
3252 LRESULT lRes;
3254 if ( ppos )
3255 {
3256 *ppos = winpos->pos;
3257 /* Yes it's a pointer inside Win32k! */
3258 lRes = co_IntSendMessageNoWait( winpos->pos.hwnd, WM_ASYNC_SETWINDOWPOS, 0, (LPARAM)ppos);
3259 /* We handle this the same way as Event Hooks and Hooks. */
3260 if ( !lRes )
3261 {
3263 }
3264 }
3265 }
3266 else
3267 res = co_WinPosSetWindowPos( pwnd,
3268 winpos->pos.hwndInsertAfter,
3269 winpos->pos.x,
3270 winpos->pos.y,
3271 winpos->pos.cx,
3272 winpos->pos.cy,
3273 winpos->pos.flags);
3274
3275 // Hack to pass tests.... Must have some work to do so clear the error.
3276 if (res && (winpos->pos.flags & (SWP_NOMOVE|SWP_NOSIZE|SWP_NOZORDER)) == SWP_NOZORDER )
3278
3279 UserDerefObjectCo(pwnd);
3280 }
3281
3285 return res;
3286}
3287
3288/*
3289 * @implemented
3290 */
3293 LONG x,
3294 LONG y,
3295 UINT uiFlags)
3296{
3297 PWND pwndParent;
3298 TRACE("Enter NtUserChildWindowFromPointEx\n");
3300 if ((pwndParent = UserGetWindowObject(hwndParent)))
3301 {
3302 pwndParent = IntChildWindowFromPointEx(pwndParent, x, y, uiFlags);
3303 }
3304 UserLeave();
3305 TRACE("Leave NtUserChildWindowFromPointEx\n");
3306 return pwndParent ? UserHMGetHandle(pwndParent) : NULL;
3307}
3308
3309/*
3310 * @implemented
3311 */
3314 BOOL bAsync)
3315{
3316 BOOL Ret;
3317 TRACE("Enter NtUserEndDeferWindowPosEx\n");
3319 Ret = IntEndDeferWindowPosEx(WinPosInfo, bAsync);
3320 TRACE("Leave NtUserEndDeferWindowPosEx, ret=%i\n", Ret);
3321 UserLeave();
3322 return Ret;
3323}
3324
3325/*
3326 * @implemented
3327 */
3328HDWP APIENTRY
3329NtUserDeferWindowPos(HDWP WinPosInfo,
3330 HWND Wnd,
3331 HWND WndInsertAfter,
3332 int x,
3333 int y,
3334 int cx,
3335 int cy,
3336 UINT Flags)
3337{
3338 PWND pWnd, pWndIA;
3339 HDWP Ret = NULL;
3343
3344 TRACE("Enter NtUserDeferWindowPos\n");
3346
3347 if ( Flags & Tmp )
3348 {
3350 goto Exit;
3351 }
3352
3353 pWnd = UserGetWindowObject(Wnd);
3354 if (!pWnd || UserIsDesktopWindow(pWnd) || UserIsMessageWindow(pWnd))
3355 {
3356 goto Exit;
3357 }
3358
3359 if ( WndInsertAfter &&
3360 WndInsertAfter != HWND_BOTTOM &&
3361 WndInsertAfter != HWND_TOPMOST &&
3362 WndInsertAfter != HWND_NOTOPMOST )
3363 {
3364 pWndIA = UserGetWindowObject(WndInsertAfter);
3365 if (!pWndIA || UserIsDesktopWindow(pWndIA) || UserIsMessageWindow(pWndIA))
3366 {
3367 goto Exit;
3368 }
3369 }
3370
3371 Ret = IntDeferWindowPos(WinPosInfo, Wnd, WndInsertAfter, x, y, cx, cy, Flags);
3372
3373Exit:
3374 TRACE("Leave NtUserDeferWindowPos, ret=%p\n", Ret);
3375 UserLeave();
3376 return Ret;
3377}
3378
3379/*
3380 * @implemented
3381 */
3384 LPRECT rectWnd,
3385 LPPOINT ptIcon)
3386{
3387 PWND Window;
3388 DWORD Ret = 0;
3389 BOOL Hit = FALSE;
3390 WINDOWPLACEMENT wndpl;
3391
3393
3395 {
3396 Hit = FALSE;
3397 goto Exit;
3398 }
3399
3400 _SEH2_TRY
3401 {
3402 if(rectWnd)
3403 {
3404 ProbeForWrite(rectWnd,
3405 sizeof(RECT),
3406 1);
3407 }
3408 if(ptIcon)
3409 {
3410 ProbeForWrite(ptIcon,
3411 sizeof(POINT),
3412 1);
3413 }
3414
3415 }
3417 {
3419 Hit = TRUE;
3420 }
3421 _SEH2_END;
3422
3423 wndpl.length = sizeof(WINDOWPLACEMENT);
3424
3425 if (IntGetWindowPlacement(Window, &wndpl) && !Hit)
3426 {
3427 _SEH2_TRY
3428 {
3429 if (rectWnd)
3430 {
3431 RtlCopyMemory(rectWnd, &wndpl.rcNormalPosition , sizeof(RECT));
3432 }
3433 if (ptIcon)
3434 {
3435 RtlCopyMemory(ptIcon, &wndpl.ptMinPosition, sizeof(POINT));
3436 }
3437
3438 }
3440 {
3442 Hit = TRUE;
3443 }
3444 _SEH2_END;
3445
3446 if (!Hit) Ret = wndpl.showCmd;
3447 }
3448Exit:
3449 UserLeave();
3450 return Ret;
3451}
3452
3453/*
3454 * @implemented
3455 */
3458 WINDOWPLACEMENT *lpwndpl)
3459{
3460 PWND Wnd;
3461 WINDOWPLACEMENT Safepl;
3463 BOOL Ret = FALSE;
3464
3465 TRACE("Enter NtUserGetWindowPlacement\n");
3467
3468 if (!(Wnd = UserGetWindowObject(hWnd)))
3469 goto Exit; // Return FALSE
3470
3471 Status = MmCopyFromCaller(&Safepl, lpwndpl, sizeof(WINDOWPLACEMENT));
3472 if (!NT_SUCCESS(Status))
3473 {
3475 goto Exit; // Return FALSE
3476 }
3477
3478 // This function doesn't check the length. Just overwrite it
3479 Safepl.length = sizeof(WINDOWPLACEMENT);
3480
3481 IntGetWindowPlacement(Wnd, &Safepl);
3482
3483 Status = MmCopyToCaller(lpwndpl, &Safepl, sizeof(WINDOWPLACEMENT));
3484 if (!NT_SUCCESS(Status))
3485 {
3487 goto Exit; // Return FALSE
3488 }
3489
3490 Ret = TRUE;
3491
3492Exit:
3493 TRACE("Leave NtUserGetWindowPlacement, ret=%i\n", Ret);
3494 UserLeave();
3495 return Ret;
3496}
3497
3498DWORD
3501 HWND hWnd,
3502 UINT cmd, // Wine SW_ commands
3503 BOOL Hide)
3504{
3505 PWND pWnd;
3506
3507 TRACE("Enter NtUserMinMaximize\n");
3509
3510 pWnd = UserGetWindowObject(hWnd);
3511 if (!pWnd || UserIsDesktopWindow(pWnd) || UserIsMessageWindow(pWnd))
3512 {
3513 goto Exit;
3514 }
3515
3516 if ( cmd > SW_MAX || pWnd->state2 & WNDS2_INDESTROY)
3517 {
3519 goto Exit;
3520 }
3521
3522 cmd |= Hide ? SW_HIDE : 0;
3523
3524 co_WinPosShowWindow(pWnd, cmd);
3525
3526Exit:
3527 TRACE("Leave NtUserMinMaximize\n");
3528 UserLeave();
3529 return 0; // Always NULL?
3530}
3531
3532/*
3533 * @implemented
3534 */
3537 HWND hWnd,
3538 int X,
3539 int Y,
3540 int nWidth,
3541 int nHeight,
3542 BOOL bRepaint)
3543{
3544 return NtUserSetWindowPos(hWnd, 0, X, Y, nWidth, nHeight,
3545 (bRepaint ? SWP_NOZORDER | SWP_NOACTIVATE :
3547}
3548
3549/*
3550 * @implemented
3551 */
3554 LONG x,
3555 LONG y)
3556{
3557 PWND pwndParent;
3558 TRACE("Enter NtUserRealChildWindowFromPoint\n");
3560 if ((pwndParent = UserGetWindowObject(Parent)))
3561 {
3562 pwndParent = IntRealChildWindowFromPoint(pwndParent, x, y);
3563 }
3564 UserLeave();
3565 TRACE("Leave NtUserRealChildWindowFromPoint\n");
3566 return pwndParent ? UserHMGetHandle(pwndParent) : NULL;
3567}
3568
3569/*
3570 * @implemented
3571 */
3574 HWND hWnd,
3575 HWND hWndInsertAfter,
3576 int X,
3577 int Y,
3578 int cx,
3579 int cy,
3580 UINT uFlags)
3581{
3582 PWND Window, pWndIA;
3583 BOOL ret = FALSE;
3585
3586 TRACE("Enter NtUserSetWindowPos\n");
3588
3589 if (!(Window = UserGetWindowObject(hWnd)) ||
3591 {
3592 ERR("NtUserSetWindowPos bad window handle!\n");
3593 goto Exit; // Return FALSE
3594 }
3595
3596 if ( hWndInsertAfter != HWND_TOP &&
3597 hWndInsertAfter != HWND_BOTTOM &&
3598 hWndInsertAfter != HWND_TOPMOST &&
3599 hWndInsertAfter != HWND_NOTOPMOST )
3600 {
3601 if (!(pWndIA = UserGetWindowObject(hWndInsertAfter)) ||
3602 UserIsDesktopWindow(pWndIA) || UserIsMessageWindow(pWndIA))
3603 {
3604 ERR("NtUserSetWindowPos bad insert window handle!\n");
3605 goto Exit; // Return FALSE
3606 }
3607 }
3608
3609 /* First make sure that coordinates are valid for WM_WINDOWPOSCHANGING */
3610 if (!(uFlags & SWP_NOMOVE))
3611 {
3612 if (X < -32768) X = -32768;
3613 else if (X > 32767) X = 32767;
3614 if (Y < -32768) Y = -32768;
3615 else if (Y > 32767) Y = 32767;
3616 }
3617 if (!(uFlags & SWP_NOSIZE))
3618 {
3619 if (cx < 0) cx = 0;
3620 else if (cx > 32767) cx = 32767;
3621 if (cy < 0) cy = 0;
3622 else if (cy > 32767) cy = 32767;
3623 }
3624
3625 UserRefObjectCo(Window, &Ref);
3626 ret = co_WinPosSetWindowPos(Window, hWndInsertAfter, X, Y, cx, cy, uFlags);
3628
3629Exit:
3630 TRACE("Leave NtUserSetWindowPos, ret=%i\n", ret);
3631 UserLeave();
3632 return ret;
3633}
3634
3635/*
3636 * @implemented
3637 */
3640 HWND hWnd,
3641 HRGN hRgn,
3642 BOOL bRedraw)
3643{
3644 HRGN hrgnCopy = NULL;
3645 PWND Window;
3647 INT Ret = 0;
3648
3649 TRACE("Enter NtUserSetWindowRgn\n");
3651
3652 if (!(Window = UserGetWindowObject(hWnd)) ||
3654 {
3655 goto Exit; // Return 0
3656 }
3657
3658 if (hRgn) // The region will be deleted in user32.
3659 {
3661 {
3662 hrgnCopy = NtGdiCreateRectRgn(0, 0, 0, 0);
3663 /* The coordinates of a window's window region are relative to the
3664 upper-left corner of the window, not the client area of the window. */
3665 NtGdiCombineRgn( hrgnCopy, hRgn, 0, RGN_COPY);
3666 }
3667 else
3668 goto Exit; // Return 0
3669 }
3670
3672 if (hrgnCopy)
3673 {
3674 Window->hrgnNewFrame = hrgnCopy; // Should be PSMWP->acvr->hrgnClip
3675 }
3676 else
3677 {
3678 Window->hrgnNewFrame = HRGN_WINDOW;
3679 }
3681 Ret = (INT)co_WinPosSetWindowPos(Window, HWND_TOP, 0, 0, 0, 0, bRedraw ? flags : (flags | SWP_NOREDRAW));
3682
3683Exit:
3684 TRACE("Leave NtUserSetWindowRgn, ret=%i\n", Ret);
3685 UserLeave();
3686 return Ret;
3687}
3688
3689/*
3690 * @implemented
3691 */
3694 HWND hwnd,
3695 UINT showCmd,
3696 LPRECT lprect,
3697 LPPOINT lppt)
3698{
3699 WINDOWPLACEMENT wndpl;
3700 UINT flags;
3701 PWND Wnd;
3702 RECT rect;
3703 POINT pt = {0};
3704 BOOL Ret = FALSE;
3706
3707 TRACE("Enter NtUserSetWindowPlacement\n");
3709
3710 if (!(Wnd = UserGetWindowObject(hwnd)) || // FIXME:
3712 {
3713 goto Exit; // Return FALSE
3714 }
3715
3716 _SEH2_TRY
3717 {
3718 if (lppt)
3719 {
3720 ProbeForRead(lppt, sizeof(POINT), 1);
3721 RtlCopyMemory(&pt, lppt, sizeof(POINT));
3722 }
3723 if (lprect)
3724 {
3725 ProbeForRead(lprect, sizeof(RECT), 1);
3726 RtlCopyMemory(&rect, lprect, sizeof(RECT));
3727 }
3728 }
3730 {
3732 _SEH2_YIELD(goto Exit); // Return FALSE
3733 }
3734 _SEH2_END
3735
3736 wndpl.length = sizeof(wndpl);
3737 wndpl.showCmd = showCmd;
3738 wndpl.flags = flags = 0;
3739
3740 if ( lppt )
3741 {
3742 flags |= PLACE_MIN;
3743 wndpl.flags |= WPF_SETMINPOSITION;
3744 wndpl.ptMinPosition = pt;
3745 }
3746 if ( lprect )
3747 {
3748 flags |= PLACE_RECT;
3749 wndpl.rcNormalPosition = rect;
3750 }
3751
3752 UserRefObjectCo(Wnd, &Ref);
3753 IntSetWindowPlacement(Wnd, &wndpl, flags);
3754 UserDerefObjectCo(Wnd);
3755 Ret = TRUE;
3756
3757Exit:
3758 TRACE("Leave NtUserSetWindowPlacement, ret=%i\n", Ret);
3759 UserLeave();
3760 return Ret;
3761}
3762
3763/*
3764 * @implemented
3765 */
3768 WINDOWPLACEMENT *lpwndpl)
3769{
3770 PWND Wnd;
3771 WINDOWPLACEMENT Safepl;
3772 UINT Flags;
3773 BOOL Ret = FALSE;
3775
3776 TRACE("Enter NtUserSetWindowPlacement\n");
3778
3779 _SEH2_TRY
3780 {
3781 ProbeForRead(lpwndpl, sizeof(*lpwndpl), 1);
3782 Safepl = *lpwndpl;
3783 }
3785 {
3787 _SEH2_YIELD(goto Exit); // Return FALSE
3788 }
3789 _SEH2_END
3790
3791 /* Backwards-compatibility: Win 3.x doesn't check the length */
3793 Safepl.length = sizeof(Safepl);
3794
3795 if (Safepl.length != sizeof(Safepl))
3796 {
3798 goto Exit;
3799 }
3800
3802 if (Safepl.flags & WPF_SETMINPOSITION)
3803 Flags |= PLACE_MIN;
3804
3806 if (!Wnd)
3807 goto Exit; // Return FALSE
3808
3809 UserRefObjectCo(Wnd, &Ref);
3810 if (!UserIsDesktopWindow(Wnd) && !UserIsMessageWindow(Wnd))
3811 Ret = IntSetWindowPlacement(Wnd, &Safepl, Flags);
3812 UserDerefObjectCo(Wnd);
3813
3814Exit:
3815 TRACE("Leave NtUserSetWindowPlacement, ret=%i\n", Ret);
3816 UserLeave();
3817 return Ret;
3818}
3819
3820/*
3821 * @implemented
3822 */
3825{
3826 PWND Window;
3828 BOOL ret = FALSE;
3830
3831 TRACE("Enter NtUserShowWindowAsync\n");
3833
3834 if (!(Window = UserGetWindowObject(hWnd)) ||
3836 {
3837 goto Exit; // Return FALSE
3838 }
3839
3840 if ( nCmdShow > SW_MAX )
3841 {
3843 goto Exit; // Return FALSE
3844 }
3845
3846 UserRefObjectCo(Window, &Ref);
3849 if (Result != -1 && Result != 0) ret = TRUE;
3850
3851Exit:
3852 TRACE("Leave NtUserShowWindowAsync, ret=%i\n", ret);
3853 UserLeave();
3854 return ret;
3855}
3856
3857/*
3858 * @implemented
3859 */
3862{
3863 PWND Window;
3864 BOOL ret = FALSE;
3866
3867 TRACE("Enter NtUserShowWindow hWnd %p SW_ %d\n",hWnd, nCmdShow);
3869
3870 if (!(Window = UserGetWindowObject(hWnd)) ||
3872 {
3873 goto Exit; // Return FALSE
3874 }
3875
3876 if ( nCmdShow > SW_MAX || Window->state2 & WNDS2_INDESTROY)
3877 {
3879 goto Exit; // Return FALSE
3880 }
3881
3882 UserRefObjectCo(Window, &Ref);
3883 ret = co_WinPosShowWindow(Window, nCmdShow);
3885
3886Exit:
3887 TRACE("Leave NtUserShowWindow, ret=%i\n", ret);
3888 UserLeave();
3889 return ret;
3890}
3891
3892
3893/*
3894 * @implemented
3895 */
3898{
3899 POINT pt;
3900 HWND Ret = NULL;
3901 PWND DesktopWindow, Window;
3902 USHORT hittest;
3904
3905 TRACE("Enter NtUserWindowFromPoint\n");
3907
3908 if ((DesktopWindow = UserGetWindowObject(IntGetDesktopWindow())))
3909 {
3910 //PTHREADINFO pti;
3911
3912 pt.x = X;
3913 pt.y = Y;
3914
3915 // Hmm... Threads live on desktops thus we have a reference on the desktop and indirectly the desktop window.
3916 // It is possible this referencing is useless, though it should not hurt...
3917 UserRefObjectCo(DesktopWindow, &Ref);
3918
3919 //pti = PsGetCurrentThreadWin32Thread();
3920 Window = co_WinPosWindowFromPoint(DesktopWindow, &pt, &hittest, FALSE);
3921 if (Window)
3922 {
3923 Ret = UserHMGetHandle(Window);
3924 }
3925
3926 UserDerefObjectCo(DesktopWindow);
3927 }
3928
3929 TRACE("Leave NtUserWindowFromPoint, ret=%p\n", Ret);
3930 UserLeave();
3931 return Ret;
3932}
3933
3934/* Windows 10 (1903?)
3935BOOL APIENTRY
3936NtUserIsWindowArranged(HWND hWnd)
3937{
3938 PWND pwnd = UserGetWindowObject(hWnd);
3939 return pwnd && IntIsWindowSnapped(pwnd);
3940}
3941*/
3942
3945{
3948 return HTNOWHERE;
3949}
3950
3953{
3954 POINT maxs, mint, maxt;
3955 UINT width, height;
3956 UserSystemParametersInfo(SPI_GETWORKAREA, 0, Pos, 0); /* FIXME: MultiMon of PWND */
3957
3958 co_WinPosGetMinMaxInfo(Wnd, &maxs, NULL, &mint, &maxt);
3959 width = Pos->right - Pos->left;
3960 width = min(min(max(width / 2, mint.x), maxt.x), width);
3961 height = Pos->bottom - Pos->top;
3962 height = min(max(height, mint.y), maxt.y);
3963
3964 switch (Edge)
3965 {
3966 case HTTOP: /* Maximized (Calculate RECT snap preview for SC_MOVE) */
3967 height = min(Pos->bottom - Pos->top, maxs.y);
3968 break;
3969 case HTLEFT:
3970 Pos->right = width;
3971 break;
3972 case HTRIGHT:
3973 Pos->left = Pos->right - width;
3974 break;
3975 default:
3976 ERR("Unexpected snap edge %#x\n", Edge);
3977 }
3978 Pos->bottom = Pos->top + height;
3979}
3980
3983{
3984 RECT newPos;
3985 BOOLEAN wasSnapped = IntIsWindowSnapped(Wnd);
3986 UINT normal = !(Wnd->style & (WS_MAXIMIZE | WS_MINIMIZE));
3988 BOOLEAN hasRef = FALSE;
3989
3990 if (Edge == HTTOP)
3991 {
3993 return;
3994 }
3995 else if (Edge != HTNOWHERE)
3996 {
3997 UserRefObjectCo(Wnd, &ref);
3998 hasRef = TRUE;
3999 co_IntCalculateSnapPosition(Wnd, Edge, &newPos);
4000 IntSetSnapInfo(Wnd, Edge, (wasSnapped || !normal) ? NULL : &Wnd->rcWindow);
4001 }
4002 else if (wasSnapped)
4003 {
4004 if (!normal)
4005 {
4007 return;
4008 }
4009 newPos = Wnd->InternalPos.NormalRect; /* Copy RECT now before it is lost */
4011 }
4012 else
4013 {
4014 return; /* Already unsnapped, do nothing */
4015 }
4016
4017 TRACE("WindowSnap: %d->%d\n", IntGetWindowSnapEdge(Wnd), Edge);
4019 newPos.left,
4020 newPos.top,
4021 newPos.right - newPos.left,
4022 newPos.bottom - newPos.top,
4023 0);
4024 if (hasRef)
4025 UserDerefObjectCo(Wnd);
4026}
4027
4030{
4032 UINT style = 0;
4033 switch (Edge)
4034 {
4035 case HTNOWHERE:
4036 style = 0;
4037 break;
4038 case HTTOP: /* Maximize throws away the snap */
4039 style = 0;
4040 break;
4041 case HTLEFT:
4043 break;
4044 case HTRIGHT:
4046 break;
4047 default:
4048 ERR("Unexpected snap edge %#x\n", Edge);
4049 }
4050 Wnd->ExStyle2 = (Wnd->ExStyle2 & ~styleMask) | style;
4051}
4052
4055{
4056 RECT r;
4057 IntSetSnapEdge(Wnd, Edge);
4058 if (Edge == HTNOWHERE)
4059 {
4061 Pos = (Wnd->style & WS_MINIMIZE) ? NULL : &r;
4062 }
4063 if (Pos)
4064 {
4065 Wnd->InternalPos.NormalRect = *Pos;
4066 }
4067}
4068
4069/* EOF */
static HDC hDC
Definition: 3dtext.c:33
#define DCX_USESTYLE
Definition: GetDCEx.c:10
ACPI_PHYSICAL_ADDRESS ACPI_SIZE BOOLEAN Warn UINT32 *TableIdx UINT32 ACPI_TABLE_HEADER *OutTableHeader ACPI_TABLE_HEADER **OutTable ACPI_HANDLE UINT32 ACPI_WALK_CALLBACK ACPI_WALK_CALLBACK void void **ReturnValue UINT32 ACPI_BUFFER *RetPathPtr ACPI_OBJECT_HANDLER void *Data ACPI_OBJECT_HANDLER void **Data ACPI_STRING ACPI_OBJECT_LIST ACPI_BUFFER *ReturnObjectBuffer ACPI_DEVICE_INFO **ReturnBuffer ACPI_HANDLE Parent
Definition: acpixf.h:732
unsigned char BOOLEAN
Definition: actypes.h:127
const DWORD Style
Definition: appswitch.c:72
const DWORD ExStyle
Definition: appswitch.c:73
#define msg(x)
Definition: auth_time.c:54
HWND hWnd
Definition: settings.c:17
LONG NTSTATUS
Definition: precomp.h:26
@ Create
Definition: registry.c:563
#define ERR(fmt,...)
Definition: precomp.h:57
#define DBG_DEFAULT_CHANNEL(ch)
Definition: debug.h:106
RECT rect
Definition: combotst.c:67
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define SWP_NOCLIENTSIZE
Definition: msg.h:31
#define SWP_NOCLIENTMOVE
Definition: msg.h:32
static HWND hwndParent
Definition: cryptui.c:299
VOID FASTCALL DceResetActiveDCEs(PWND Window)
Definition: windc.c:816
ush Pos
Definition: deflate.h:92
#define ERROR_SUCCESS
Definition: deptool.c:10
#define UserIsMessageWindow(pWnd)
Definition: desktop.h:199
#define UserIsDesktopWindow(pWnd)
Definition: desktop.h:196
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG Flags
Definition: dispmprt.h:245
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define APIENTRY
Definition: api.h:79
#define Y(I)
UINT uFlags
Definition: api.c:59
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define pt(x, y)
Definition: drawing.c:79
return ret
Definition: mutex.c:147
#define END()
Definition: resources.c:586
r parent
Definition: btrfs.c:3010
VOID FASTCALL IntEngWindowChanged(_In_ struct _WND *Window, _In_ FLONG flChanged)
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PagedPool
Definition: env_spec_w32.h:308
#define ERROR(name)
Definition: error_private.h:53
VOID NTAPI ProbeForRead(IN CONST VOID *Address, IN SIZE_T Length, IN ULONG Alignment)
Definition: exintrin.c:102
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
Definition: exintrin.c:143
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
HWND FASTCALL co_UserSetFocus(PWND Window)
Definition: focus.c:1311
BOOL FASTCALL IntCheckFullscreen(PWND Window)
Definition: focus.c:78
BOOL FASTCALL UserSetActiveWindow(_In_opt_ PWND Wnd)
Definition: focus.c:1258
PUSER_MESSAGE_QUEUE gpqForeground
Definition: focus.c:13
VOID FASTCALL UpdateShellHook(PWND Window)
Definition: focus.c:98
BOOL FASTCALL co_IntSetForegroundWindow(PWND Window)
Definition: focus.c:1545
HWND FASTCALL UserGetForegroundWindow(VOID)
Definition: focus.c:1418
BOOLEAN valid
Status
Definition: gdiplustypes.h:24
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLdouble GLdouble GLdouble r
Definition: gl.h:2055
GLint GLint GLsizei width
Definition: gl.h:1546
GLuint res
Definition: glext.h:9613
GLdouble GLdouble GLdouble GLdouble top
Definition: glext.h:10859
GLdouble GLdouble right
Definition: glext.h:10859
GLenum const GLfloat * params
Definition: glext.h:5645
GLint left
Definition: glext.h:7726
GLbitfield flags
Definition: glext.h:7161
GLint GLint bottom
Definition: glext.h:7726
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
unsigned int UINT
Definition: sysinfo.c:13
#define X(b, s)
PSERVERINFO gpsi
Definition: imm.c:18
#define IMS_UPDATEIMEUI
Definition: imm32_undoc.h:48
#define WM_IME_SYSTEM
Definition: imm32_undoc.h:32
#define WNDS2_WIN31COMPAT
Definition: ntuser.h:653
#define ICLS_IME
Definition: ntuser.h:931
#define WNDS2_FORCEFULLNCPAINTCLIPRGN
Definition: ntuser.h:668
#define TIF_INCLEANUP
Definition: ntuser.h:266
#define WNDS_BEINGACTIVATED
Definition: ntuser.h:629
#define FNID_DESKTOP
Definition: ntuser.h:866
#define WNDS_DESTROYED
Definition: ntuser.h:640
#define WNDS_SENDNCPAINT
Definition: ntuser.h:620
#define UserHMGetHandle(obj)
Definition: ntuser.h:233
#define WNDS_MAXIMIZESTOMONITOR
Definition: ntuser.h:639
#define IS_IMM_MODE()
Definition: ntuser.h:1216
#define ICLS_BUTTON
Definition: ntuser.h:916
@ TYPE_SETWINDOWPOS
Definition: ntuser.h:47
#define WNDS_ERASEBACKGROUND
Definition: ntuser.h:619
#define WEF_SETBYWNDPTI
Definition: ntuser.h:239
#define WS_EX2_VERTICALLYMAXIMIZEDLEFT
Definition: ntuser.h:684
#define WPF_MAXINIT
Definition: ntuser.h:691
#define WNDS2_INDESTROY
Definition: ntuser.h:652
#define WNDS_SENDSIZEMOVEMSGS
Definition: ntuser.h:613
#define WS_EX2_VERTICALLYMAXIMIZEDRIGHT
Definition: ntuser.h:685
#define WPF_MININIT
Definition: ntuser.h:690
#define HRGN_WINDOW
Definition: ntuser.h:365
#define WNDS_SENDERASEBACKGROUND
Definition: ntuser.h:618
#define EXCEPTION_EXECUTE_HANDLER
Definition: excpt.h:90
if(dx< 0)
Definition: linetemp.h:194
LONG_PTR LPARAM
Definition: minwindef.h:175
LONG_PTR LRESULT
Definition: minwindef.h:176
UINT_PTR WPARAM
Definition: minwindef.h:174
#define MmCopyToCaller(x, y, z)
Definition: mmcopy.h:19
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
static HDC
Definition: imagelist.c:88
static HRGN hRgn
Definition: mapping.c:32
#define SWP_STATECHANGED
Definition: msg.c:44
#define min(a, b)
Definition: monoChain.cc:55
VOID FASTCALL co_MsqInsertMouseMessage(MSG *Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: msgqueue.c:580
@ WM_ASYNC_SHOWWINDOW
Definition: msgqueue.h:117
@ WM_ASYNC_SETWINDOWPOS
Definition: msgqueue.h:118
_Out_writes_bytes_to_opt_ AbsoluteSecurityDescriptorSize PSECURITY_DESCRIPTOR _Inout_ PULONG _Out_writes_bytes_to_opt_ DaclSize PACL _Inout_ PULONG _Out_writes_bytes_to_opt_ SaclSize PACL _Inout_ PULONG _Out_writes_bytes_to_opt_ OwnerSize PSID Owner
Definition: rtlfuncs.h:1629
#define FASTCALL
Definition: nt_native.h:50
#define GDI_OBJ_HMGR_POWNED
Definition: ntgdihdl.h:117
#define GDI_OBJ_HMGR_PUBLIC
Definition: ntgdihdl.h:116
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
LRESULT APIENTRY co_HOOK_CallHooks(INT HookId, INT Code, WPARAM wParam, LPARAM lParam)
Definition: hook.c:1102
BOOL FASTCALL IntClientToScreen(PWND Wnd, LPPOINT lpPoint)
Definition: winpos.c:199
UINT FASTCALL co_WinPosMinMaximize(PWND Wnd, UINT ShowFlag, RECT *NewPos)
Definition: winpos.c:2450
INT APIENTRY NtUserSetWindowRgn(HWND hWnd, HRGN hRgn, BOOL bRedraw)
Definition: winpos.c:3639
BOOL APIENTRY NtUserSetWindowPlacement(HWND hWnd, WINDOWPLACEMENT *lpwndpl)
Definition: winpos.c:3767
DWORD APIENTRY NtUserMinMaximize(HWND hWnd, UINT cmd, BOOL Hide)
Definition: winpos.c:3500
VOID FASTCALL IntSetSnapInfo(PWND Wnd, UINT Edge, IN const RECT *Pos OPTIONAL)
Definition: winpos.c:4054
UINT FASTCALL co_WinPosArrangeIconicWindows(PWND parent)
Definition: winpos.c:737
static VOID FASTCALL FixClientRect(PRECTL ClientRect, PRECTL WindowRect)
Definition: winpos.c:1087
BOOL FASTCALL IntSetWindowPlacement(PWND Wnd, WINDOWPLACEMENT *wpl, UINT Flags)
Definition: winpos.c:671
static BOOL FASTCALL co_WinPosDoWinPosChanging(PWND Window, PWINDOWPOS WinPos, PRECTL WindowRect, PRECTL ClientRect)
Definition: winpos.c:1273
VOID FASTCALL co_WinPosActivateOtherWindow(PWND Wnd)
Definition: winpos.c:397
BOOLEAN FASTCALL co_WinPosSetWindowPos(PWND Window, HWND WndInsertAfter, INT x, INT y, INT cx, INT cy, UINT flags)
Definition: winpos.c:1792
VOID FASTCALL co_IntSnapWindow(PWND Wnd, UINT Edge)
Definition: winpos.c:3982
static BOOL FASTCALL WinPosFixupFlags(WINDOWPOS *WinPos, PWND Wnd)
Definition: winpos.c:1557
BOOL APIENTRY NtUserMoveWindow(HWND hWnd, int X, int Y, int nWidth, int nHeight, BOOL bRepaint)
Definition: winpos.c:3536
INT FASTCALL IntMapWindowPoints(PWND FromWnd, PWND ToWnd, LPPOINT lpPoints, UINT cPoints)
Definition: winpos.c:144
BOOL FASTCALL IsChildVisible(PWND pWnd)
Definition: winpos.c:226
PWND FASTCALL IntGetLastTopMostWindow(VOID)
Definition: winpos.c:238
BOOL APIENTRY NtUserSetWindowPos(HWND hWnd, HWND hWndInsertAfter, int X, int Y, int cx, int cy, UINT uFlags)
Definition: winpos.c:3573
VOID ForceNCPaintErase(PWND Wnd, HRGN hRgn, PREGION pRgn)
Definition: winpos.c:1697
#define EMPTYPOINT(pt)
Definition: winpos.c:29
DWORD APIENTRY NtUserGetInternalWindowPos(HWND hWnd, LPRECT rectWnd, LPPOINT ptIcon)
Definition: winpos.c:3383
static void make_point_onscreen(POINT *pt)
Definition: winpos.c:660
DWORD IntGetWindowBorders(DWORD Style, DWORD ExStyle)
Definition: winpos.c:921
VOID FASTCALL co_IntCalculateSnapPosition(PWND Wnd, UINT Edge, OUT RECT *Pos)
Definition: winpos.c:3952
VOID FASTCALL WinPosInitInternalPos(PWND Wnd, RECTL *RestoreRect)
Definition: winpos.c:480
DWORD APIENTRY NtUserSetInternalWindowPos(HWND hwnd, UINT showCmd, LPRECT lprect, LPPOINT lppt)
Definition: winpos.c:3693
BOOL FASTCALL IntGetWindowPlacement(PWND Wnd, WINDOWPLACEMENT *lpwndpl)
Definition: winpos.c:564
static PWND co_WinPosSearchChildren(IN PWND ScopeWin, IN POINT *Point, IN OUT USHORT *HitTest, IN BOOL Ignore)
Definition: winpos.c:2920
static VOID FASTCALL get_valid_rects(RECTL *old_client, RECTL *new_client, UINT flags, RECTL *valid)
Definition: winpos.c:1130
BOOL FASTCALL ActivateOtherWindowMin(PWND Wnd)
Definition: winpos.c:285
static void make_rect_onscreen(RECT *rect)
Definition: winpos.c:630
#define PLACE_RECT
Definition: winpos.c:32
PWND APIENTRY co_WinPosWindowFromPoint(IN PWND ScopeWin, IN POINT *WinPoint, IN OUT USHORT *HitTest, IN BOOL Ignore)
Definition: winpos.c:3005
#define SWP_AGG_STATUSFLAGS
Definition: winpos.c:24
static VOID FASTCALL WinPosFindIconPos(PWND Window, POINT *Pos)
Definition: winpos.c:787
BOOL APIENTRY NtUserShowWindow(HWND hWnd, LONG nCmdShow)
Definition: winpos.c:3861
#define PLACE_MAX
Definition: winpos.c:31
HWND APIENTRY NtUserRealChildWindowFromPoint(HWND Parent, LONG x, LONG y)
Definition: winpos.c:3553
LRESULT FASTCALL co_WinPosGetNonClientSize(PWND Window, RECT *WindowRect, RECT *ClientRect)
Definition: winpos.c:2401
static VOID FASTCALL WinPosInternalMoveWindow(PWND Window, INT MoveX, INT MoveY)
Definition: winpos.c:1527
VOID FASTCALL IntGetClientRect(PWND Wnd, RECTL *Rect)
Definition: winpos.c:92
BOOL APIENTRY NtUserShowWindowAsync(HWND hWnd, LONG nCmdShow)
Definition: winpos.c:3824
static BOOL IntValidateParent(PWND Child, PREGION ValidateRgn)
Definition: winpos.c:1063
BOOL FASTCALL IntGetWindowRect(PWND Wnd, RECTL *Rect)
Definition: winpos.c:121
#define SWP_AGG_NOCLIENTCHANGE
Definition: winpos.c:26
UINT FASTCALL co_WinPosGetMinMaxInfo(PWND Window, POINT *MaxSize, POINT *MaxPos, POINT *MinTrack, POINT *MaxTrack)
Definition: winpos.c:940
static HWND FASTCALL WinPosDoOwnedPopups(PWND Window, HWND hWndInsertAfter)
Definition: winpos.c:1361
BOOL FASTCALL IntScreenToClient(PWND Wnd, LPPOINT lpPoint)
Definition: winpos.c:213
PWND APIENTRY IntChildWindowFromPointEx(PWND Parent, LONG x, LONG y, UINT uiFlags)
Definition: winpos.c:3080
BOOL APIENTRY NtUserGetWindowPlacement(HWND hWnd, WINDOWPLACEMENT *lpwndpl)
Definition: winpos.c:3457
static BOOL FASTCALL can_activate_window(PWND Wnd OPTIONAL)
Definition: winpos.c:373
void FASTCALL co_WinPosSendSizeMove(PWND Wnd)
Definition: winpos.c:2416
BOOL UserHasWindowEdge(DWORD Style, DWORD ExStyle)
Definition: winpos.c:850
HWND APIENTRY NtUserWindowFromPoint(LONG X, LONG Y)
Definition: winpos.c:3897
HDWP APIENTRY NtUserDeferWindowPos(HDWP WinPosInfo, HWND Wnd, HWND WndInsertAfter, int x, int y, int cx, int cy, UINT Flags)
Definition: winpos.c:3329
HWND APIENTRY NtUserChildWindowFromPointEx(HWND hwndParent, LONG x, LONG y, UINT uiFlags)
Definition: winpos.c:3292
BOOLEAN FASTCALL co_WinPosShowWindow(PWND Wnd, INT Cmd)
Definition: winpos.c:2635
BOOL FASTCALL IntGetClientOrigin(PWND Window OPTIONAL, LPPOINT Point)
Definition: winpos.c:71
#define SWP_AGG_NOGEOMETRYCHANGE
Definition: winpos.c:20
VOID UserGetWindowBorders(DWORD Style, DWORD ExStyle, SIZE *Size, BOOL WithClient)
Definition: winpos.c:894
#define SWP_AGG_NOPOSCHANGE
Definition: winpos.c:22
VOID FASTCALL IntGetWindowBorderMeasures(PWND Wnd, UINT *cx, UINT *cy)
Definition: winpos.c:867
VOID SelectWindowRgn(PWND Window, HRGN hRgnClip)
Definition: winpos.c:259
PWND FASTCALL IntRealChildWindowFromPoint(PWND Parent, LONG x, LONG y)
Definition: winpos.c:3038
UINT FASTCALL IntGetWindowSnapEdge(PWND Wnd)
Definition: winpos.c:3944
void IntForceMinimizeWindow(PWND pWnd)
Definition: winpos.c:2604
HDWP FASTCALL IntDeferWindowPos(HDWP hdwp, HWND hwnd, HWND hwndAfter, INT x, INT y, INT cx, INT cy, UINT flags)
Definition: winpos.c:3132
VOID FASTCALL IntSetSnapEdge(PWND Wnd, UINT Edge)
Definition: winpos.c:4029
#define PLACE_MIN
Definition: winpos.c:30
BOOL APIENTRY NtUserEndDeferWindowPosEx(HDWP WinPosInfo, BOOL bAsync)
Definition: winpos.c:3313
BOOL FASTCALL IntEndDeferWindowPosEx(HDWP hdwp, BOOL bAsync)
Definition: winpos.c:3220
static LONG FASTCALL co_WinPosDoNCCALCSize(PWND Window, PWINDOWPOS WinPos, RECTL *WindowRect, RECTL *ClientRect, RECTL *validRects)
Definition: winpos.c:1186
static VOID FASTCALL IntImeWindowPosChanged(VOID)
Definition: winpos.c:1753
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:255
PTHREADINFO gptiCurrent
Definition: ntuser.c:15
VOID FASTCALL UserEnterShared(VOID)
Definition: ntuser.c:241
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:247
static __inline VOID UserDerefObjectCo(PVOID obj)
Definition: object.h:44
static __inline VOID UserRefObjectCo(PVOID obj, PUSER_REFERENCE_ENTRY UserReferenceEntry)
Definition: object.h:28
@ normal
Definition: optimize.h:166
#define RDW_CLIPCHILDREN
Definition: painting.h:15
#define LOWORD(l)
Definition: pedump.c:82
#define WS_CHILD
Definition: pedump.c:617
#define WS_CAPTION
Definition: pedump.c:624
#define WS_SIZEBOX
Definition: pedump.c:642
#define WS_ICONIC
Definition: pedump.c:641
#define WS_MAXIMIZEBOX
Definition: pedump.c:632
#define WS_EX_DLGMODALFRAME
Definition: pedump.c:645
#define WS_MAXIMIZE
Definition: pedump.c:623
#define WS_BORDER
Definition: pedump.c:625
#define WS_POPUP
Definition: pedump.c:616
#define WS_MINIMIZE
Definition: pedump.c:622
#define WS_VISIBLE
Definition: pedump.c:620
#define WS_EX_TOPMOST
Definition: pedump.c:647
long LONG
Definition: pedump.c:60
#define BS_GROUPBOX
Definition: pedump.c:658
#define WS_DISABLED
Definition: pedump.c:621
#define WS_DLGFRAME
Definition: pedump.c:626
#define WS_EX_TRANSPARENT
Definition: pedump.c:649
#define WS_CLIPSIBLINGS
Definition: pedump.c:618
unsigned short USHORT
Definition: pedump.c:61
#define WS_CLIPCHILDREN
Definition: pedump.c:619
#define WS_THICKFRAME
Definition: pedump.c:630
#define INT
Definition: polytest.cpp:20
#define MmCopyFromCaller
Definition: polytest.cpp:29
_Out_opt_ int _Out_opt_ int * cy
Definition: commctrl.h:586
_Out_opt_ int * cx
Definition: commctrl.h:585
__kernel_entry W32KAPI INT APIENTRY NtGdiCombineRgn(_In_ HRGN hrgnDst, _In_ HRGN hrgnSrc1, _In_opt_ HRGN hrgnSrc2, _In_ INT iMode)
__kernel_entry W32KAPI BOOL APIENTRY NtGdiBitBlt(_In_ HDC hdcDst, _In_ INT x, _In_ INT y, _In_ INT cx, _In_ INT cy, _In_opt_ HDC hdcSrc, _In_ INT xSrc, _In_ INT ySrc, _In_ DWORD rop4, _In_ DWORD crBackColor, _In_ FLONG fl)
__kernel_entry W32KAPI HRGN APIENTRY NtGdiCreateRectRgn(_In_ INT xLeft, _In_ INT yTop, _In_ INT xRight, _In_ INT yBottom)
__kernel_entry W32KAPI INT APIENTRY NtGdiOffsetRgn(_In_ HRGN hrgn, _In_ INT cx, _In_ INT cy)
Definition: region.c:3961
#define SW_SHOWNORMAL
Definition: winuser.h:781
#define WS_EX_LAYOUTRTL
Definition: winuser.h:390
#define WM_ERASEBKGND
Definition: winuser.h:1653
#define HCBT_MINMAX
Definition: winuser.h:56
#define SW_SHOWMAXIMIZED
Definition: winuser.h:784
#define GW_HWNDFIRST
Definition: winuser.h:775
BOOL WINAPI CopyRect(_Out_ LPRECT, _In_ LPCRECT)
#define WS_EX_STATICEDGE
Definition: winuser.h:403
#define SM_CXMINIMIZED
Definition: winuser.h:1031
#define SW_HIDE
Definition: winuser.h:779
#define SWP_NOACTIVATE
Definition: winuser.h:1253
#define SWP_NOREDRAW
Definition: winuser.h:1257
#define WM_SYSCOMMAND
Definition: winuser.h:1769
#define GW_HWNDLAST
Definition: winuser.h:776
#define SWP_NOREPOSITION
Definition: winuser.h:1261
#define GA_ROOT
Definition: winuser.h:2893
#define SWP_FRAMECHANGED
Definition: winuser.h:1251
#define MAKELPARAM(l, h)
Definition: winuser.h:4116
#define CWP_SKIPTRANSPARENT
Definition: winuser.h:210
#define DCX_CACHE
Definition: winuser.h:2150
#define SM_CYSCREEN
Definition: winuser.h:971
#define DCX_WINDOW
Definition: winuser.h:2149
#define HWND_TOPMOST
Definition: winuser.h:1219
#define WM_QUERYOPEN
Definition: winuser.h:1652
#define HSHELL_WINDOWDESTROYED
Definition: winuser.h:1267
#define WM_WINDOWPOSCHANGING
Definition: winuser.h:1689
#define WM_CHILDACTIVATE
Definition: winuser.h:1666
#define WS_EX_APPWINDOW
Definition: winuser.h:383
#define SM_CXMINTRACK
Definition: winuser.h:1008
#define SW_MINIMIZE
Definition: winuser.h:787
#define HSHELL_WINDOWCREATED
Definition: winuser.h:1266
#define WVR_VALIDRECTS
Definition: winuser.h:2558
#define SM_CYMINIMIZED
Definition: winuser.h:1032
#define WVR_ALIGNTOP
Definition: winuser.h:2551
#define WM_SIZE
Definition: winuser.h:1639
#define HTERROR
Definition: winuser.h:2508
#define SM_CXFRAME
Definition: winuser.h:1005
#define BS_TYPEMASK
Definition: winuser.h:270
#define SWP_NOMOVE
Definition: winuser.h:1255
#define WS_EX_NOACTIVATE
Definition: winuser.h:395
#define RDW_NOINTERNALPAINT
Definition: winuser.h:1228
#define WM_NCHITTEST
Definition: winuser.h:1714
#define WS_EX_TOOLWINDOW
Definition: winuser.h:404
#define SW_SHOWNOACTIVATE
Definition: winuser.h:785
#define GA_PARENT
Definition: winuser.h:2892
#define SWP_NOSIZE
Definition: winuser.h:1256
#define WM_MOUSEMOVE
Definition: winuser.h:1803
#define RDW_ERASE
Definition: winuser.h:1222
#define SIZE_MINIMIZED
Definition: winuser.h:2542
#define RDW_NOCHILDREN
Definition: winuser.h:1233
#define WH_CBT
Definition: winuser.h:35
#define WVR_ALIGNLEFT
Definition: winuser.h:2552
#define SWP_ASYNCWINDOWPOS
Definition: winuser.h:1264
#define SWP_DEFERERASE
Definition: winuser.h:1263
#define DCX_CLIPSIBLINGS
Definition: winuser.h:2152
#define SM_CYFRAME
Definition: winuser.h:1007
#define WM_ACTIVATE
Definition: winuser.h:1640
#define WM_SHOWWINDOW
Definition: winuser.h:1656
#define SW_SHOWDEFAULT
Definition: winuser.h:791
#define SW_SHOWMINIMIZED
Definition: winuser.h:782
#define SM_CYBORDER
Definition: winuser.h:976
#define DCX_INTERSECTRGN
Definition: winuser.h:2158
#define SW_FORCEMINIMIZE
Definition: winuser.h:792
#define CWP_SKIPDISABLED
Definition: winuser.h:209
#define HWND_TOP
Definition: winuser.h:1218
#define WS_EX_MDICHILD
Definition: winuser.h:394
#define SW_SHOWNA
Definition: winuser.h:789
#define SM_CXMAXTRACK
Definition: winuser.h:1033
#define WVR_REDRAW
Definition: winuser.h:2557
#define WM_GETMINMAXINFO
Definition: winuser.h:1668
#define SIZE_MAXIMIZED
Definition: winuser.h:2543
#define SWP_NOCOPYBITS
Definition: winuser.h:1254
#define RDW_ALLCHILDREN
Definition: winuser.h:1232
#define SM_CXBORDER
Definition: winuser.h:975
#define HTRIGHT
Definition: winuser.h:2525
#define RDW_ERASENOW
Definition: winuser.h:1230
#define RDW_FRAME
Definition: winuser.h:1223
#define SM_CYMAXTRACK
Definition: winuser.h:1034
#define HTCLIENT
Definition: winuser.h:2511
#define SWP_SHOWWINDOW
Definition: winuser.h:1259
#define WS_EX_WINDOWEDGE
Definition: winuser.h:407
BOOL WINAPI ValidateRgn(_In_ HWND, _In_opt_ HRGN)
#define HTNOWHERE
Definition: winuser.h:2510
#define WS_EX_LAYERED
Definition: winuser.h:389
#define SM_CXDLGFRAME
Definition: winuser.h:977
#define WA_ACTIVE
Definition: winuser.h:2665
#define CWP_SKIPINVISIBLE
Definition: winuser.h:208
#define WM_MOVE
Definition: winuser.h:1638
#define SWP_HIDEWINDOW
Definition: winuser.h:1252
#define WVR_ALIGNRIGHT
Definition: winuser.h:2554
#define SIZE_RESTORED
Definition: winuser.h:2541
#define CS_SAVEBITS
Definition: winuser.h:665
#define HTTOP
Definition: winuser.h:2526
#define HTTRANSPARENT
Definition: winuser.h:2509
#define WPF_RESTORETOMAXIMIZED
Definition: winuser.h:2568
#define SWP_NOOWNERZORDER
Definition: winuser.h:1260
#define SW_RESTORE
Definition: winuser.h:790
#define SM_CYDLGFRAME
Definition: winuser.h:979
#define SW_SHOW
Definition: winuser.h:786
#define WS_EX_CLIENTEDGE
Definition: winuser.h:384
#define SM_CXSCREEN
Definition: winuser.h:970
#define RDW_NOFRAME
Definition: winuser.h:1227
#define SWP_NOZORDER
Definition: winuser.h:1258
#define SW_MAXIMIZE
Definition: winuser.h:783
#define HTLEFT
Definition: winuser.h:2523
#define WM_NCCALCSIZE
Definition: winuser.h:1713
struct _WINDOWPLACEMENT WINDOWPLACEMENT
#define RDW_NOERASE
Definition: winuser.h:1226
#define RDW_VALIDATE
Definition: winuser.h:1229
#define WM_WINDOWPOSCHANGED
Definition: winuser.h:1690
#define SWP_NOSENDCHANGING
Definition: winuser.h:1262
#define HWND_NOTOPMOST
Definition: winuser.h:1217
#define WPF_SETMINPOSITION
Definition: winuser.h:2569
#define SW_NORMAL
Definition: winuser.h:780
#define SW_SHOWMINNOACTIVE
Definition: winuser.h:788
#define WVR_ALIGNBOTTOM
Definition: winuser.h:2553
#define SM_CYMINTRACK
Definition: winuser.h:1009
#define RDW_INVALIDATE
Definition: winuser.h:1225
#define SW_MAX
Definition: winuser.h:793
#define HWND_BOTTOM
Definition: winuser.h:1216
#define SC_MAXIMIZE
Definition: winuser.h:2624
#define _SEH2_GetExceptionCode()
Definition: pseh2_64.h:204
#define _SEH2_EXCEPT(...)
Definition: pseh2_64.h:104
#define _SEH2_END
Definition: pseh2_64.h:194
#define _SEH2_TRY
Definition: pseh2_64.h:93
#define _SEH2_YIELD(__stmt)
Definition: pseh2_64.h:207
for(i=0;i< sizeof(testsuite)/sizeof(testsuite[0]);++i) ok(call_test(testsuite[i].func)
#define GreCreateRectRgnIndirect(prc)
Definition: region.h:96
@ Cmd
Definition: sacdrv.h:278
static void Exit(void)
Definition: sock.c:1330
#define TRACE(s)
Definition: solgame.cpp:4
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
long y
Definition: dcommon.idl:24
long x
Definition: dcommon.idl:24
long bottom
Definition: polytest.cpp:53
long right
Definition: polytest.cpp:53
long top
Definition: polytest.cpp:53
long left
Definition: polytest.cpp:53
Definition: dcommon.idl:28
long bottom
Definition: dcommon.idl:29
long right
Definition: dcommon.idl:29
long left
Definition: dcommon.idl:29
long top
Definition: dcommon.idl:29
Definition: window.c:29
RTL_ATOM atomClassName
Definition: ntuser.h:572
UINT style
Definition: ntuser.h:584
Definition: winpos.h:4
WINDOWPOS pos
Definition: winpos.h:5
HRGN hrgnClip
Definition: winpos.h:16
HRGN hrgnInterMonitor
Definition: winpos.h:17
struct _WND * spwnd
Definition: ntuser.h:140
PDESKTOPINFO pDeskInfo
Definition: desktop.h:8
RECT rcWork
Definition: monitor.h:19
RECT rcMonitor
Definition: monitor.h:18
LONG y
Definition: windef.h:130
LONG x
Definition: windef.h:129
USERSTARTUPINFO usi
Definition: win32.h:280
Definition: region.h:8
Definition: winpos.h:21
PCVR acvr
Definition: winpos.h:27
INT ccvr
Definition: winpos.h:25
INT ccvrAlloc
Definition: winpos.h:26
struct _DESKTOP * rpdesk
Definition: ntuser.h:197
PPROCESSINFO ppi
Definition: win32.h:89
DWORD dwExpWinVer
Definition: win32.h:113
FLONG TIF_flags
Definition: win32.h:96
struct _DESKTOP * rpdesk
Definition: win32.h:93
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:90
Definition: object.h:4
POINT ptMaxPosition
Definition: winuser.h:3402
RECT rcNormalPosition
Definition: winuser.h:3403
POINT ptMinPosition
Definition: winuser.h:3401
HWND hwnd
Definition: winuser.h:3696
UINT flags
Definition: winuser.h:3702
HWND hwndInsertAfter
Definition: winuser.h:3697
Definition: ntuser.h:698
DWORD ExStyle
Definition: ntuser.h:708
PCLS pcls
Definition: ntuser.h:724
DWORD ExStyle2
Definition: ntuser.h:749
struct _WND * spwndOwner
Definition: ntuser.h:719
struct _WND::@6139 InternalPos
THRDESKHEAD head
Definition: ntuser.h:699
DWORD style
Definition: ntuser.h:710
DWORD state2
Definition: ntuser.h:706
struct _WND * spwndChild
Definition: ntuser.h:718
DWORD fnid
Definition: ntuser.h:713
RECT rcClient
Definition: ntuser.h:721
HRGN hrgnUpdate
Definition: ntuser.h:725
DWORD state
Definition: ntuser.h:705
struct _WND * spwndNext
Definition: ntuser.h:715
RECT rcWindow
Definition: ntuser.h:720
UINT InternalPosInitialized
Definition: ntuser.h:761
struct _WND * spwndParent
Definition: ntuser.h:717
Definition: ftp_var.h:139
Definition: send.c:48
Definition: style.c:91
DMUS_IO_STYLE style
Definition: style.c:95
POINT ptMaxPosition
Definition: winuser.h:3737
POINT ptMaxSize
Definition: winuser.h:3736
POINT ptMinTrackSize
Definition: winuser.h:3738
POINT ptReserved
Definition: winuser.h:3735
POINT ptMaxTrackSize
Definition: winuser.h:3739
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
ATOM atomSysClass[ICLS_NOTUSED+1]
Definition: ntuser.h:1064
WORD wShowWindow
Definition: win32.h:221
HWND ahwnd[ANYSIZE_ARRAY]
Definition: window.h:91
#define max(a, b)
Definition: svc.c:63
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
int32_t INT
Definition: typedefs.h:58
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define IN
Definition: typedefs.h:39
#define MAKELONG(a, b)
Definition: typedefs.h:249
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
#define DCX_KEEPCLIPRGN
Definition: undocuser.h:69
#define WM_SETVISIBLE
Definition: undocuser.h:33
#define WS_MINIMIZED
Definition: undocuser.h:20
VOID FASTCALL UserSyncAndPaintWindows(PWND pWnd, ULONG Flags)
Definition: painting.c:623
VOID FASTCALL IntSendNCPaint(PWND pWnd, HRGN hRgn)
Definition: painting.c:350
VOID FASTCALL co_IntPaintWindows(PWND Wnd, ULONG Flags, BOOL Recurse)
Definition: painting.c:405
BOOL FASTCALL co_UserRedrawWindow(PWND Window, const RECTL *UpdateRect, PREGION UpdateRgn, ULONG Flags)
Definition: painting.c:897
VOID FASTCALL IntInvalidateWindows(PWND Wnd, PREGION Rgn, ULONG Flags)
Definition: painting.c:645
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:123
PWND FASTCALL UserGetAncestor(PWND Wnd, UINT Type)
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
HWND FASTCALL UserGetShellWindow(VOID)
Definition: window.c:3684
INT FASTCALL UserReleaseDC(PWND Window, HDC hDc, BOOL EndPaint)
Definition: windc.c:918
HDC FASTCALL UserGetDCEx(PWND Window OPTIONAL, HANDLE ClipRegion, ULONG Flags)
PREGION FASTCALL VIS_ComputeVisibleRegion(PWND Wnd, BOOLEAN ClientArea, BOOLEAN ClipChildren, BOOLEAN ClipSiblings)
Definition: vis.c:13
VOID FASTCALL co_VIS_WindowLayoutChanged(PWND Wnd, PREGION NewlyExposed)
Definition: vis.c:145
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
Definition: wdfdevice.h:4539
_Must_inspect_result_ _In_ WDFDEVICE _In_ WDFDEVICE Child
Definition: wdffdo.h:536
_Must_inspect_result_ _In_ WDFCMRESLIST List
Definition: wdfresource.h:550
VOID FASTCALL SetLastNtError(_In_ NTSTATUS Status)
Definition: error.c:30
BOOL NTAPI GreDeleteObject(HGDIOBJ hobj)
Definition: gdiobj.c:1158
BOOL NTAPI GreIsHandleValid(HGDIOBJ hobj)
Definition: gdiobj.c:1146
VOID FASTCALL RECTL_vInflateRect(_Inout_ RECTL *rect, _In_ INT dx, _In_ INT dy)
Definition: rect.c:101
BOOL FASTCALL RECTL_bIntersectRect(_Out_ RECTL *prclDst, _In_ const RECTL *prcl1, _In_ const RECTL *prcl2)
Definition: rect.c:55
FORCEINLINE VOID RECTL_vSetRect(_Out_ RECTL *prcl, _In_ LONG left, _In_ LONG top, _In_ LONG right, _In_ LONG bottom)
Definition: rect.h:5
FORCEINLINE BOOL RECTL_bPointInRect(_In_ const RECTL *prcl, _In_ INT x, _In_ INT y)
Definition: rect.h:52
FORCEINLINE BOOL RECTL_bIsEmptyRect(_In_ const RECTL *prcl)
Definition: rect.h:44
FORCEINLINE VOID RECTL_vOffsetRect(_Inout_ RECTL *prcl, _In_ INT cx, _In_ INT cy)
Definition: rect.h:31
FORCEINLINE VOID RECTL_vSetEmptyRect(_Out_ RECTL *prcl)
Definition: rect.h:20
INT FASTCALL REGION_Complexity(PREGION prgn)
Definition: region.c:554
VOID FASTCALL REGION_Delete(PREGION pRgn)
Definition: region.c:2449
PREGION FASTCALL REGION_LockRgn(_In_ HRGN hrgn)
Definition: region.c:2358
BOOL FASTCALL IntGdiSetRegionOwner(HRGN hRgn, DWORD OwnerMask)
Definition: region.c:2459
VOID FASTCALL REGION_UnlockRgn(_In_ PREGION prgn)
Definition: region.c:2373
INT FASTCALL REGION_GetRgnBox(PREGION Rgn, PRECTL pRect)
Definition: region.c:2543
PREGION FASTCALL IntSysCreateRectpRgn(INT LeftRect, INT TopRect, INT RightRect, INT BottomRect)
Definition: region.c:2407
BOOL FASTCALL REGION_bOffsetRgn(_Inout_ PREGION prgn, _In_ INT cx, _In_ INT cy)
Definition: region.c:2707
INT FASTCALL IntGdiCombineRgn(PREGION prgnDest, PREGION prgnSrc1, PREGION prgnSrc2, INT iCombineMode)
Definition: region.c:2487
#define ValidateHwndNoErr(hwnd)
Definition: precomp.h:97
PWND FASTCALL UserGetDesktopWindow(VOID)
Definition: desktop.c:1413
VOID FASTCALL IntSetFocusMessageQueue(PUSER_MESSAGE_QUEUE NewQueue)
Definition: desktop.c:1347
HWND FASTCALL IntGetDesktopWindow(VOID)
Definition: desktop.c:1402
PUSER_MESSAGE_QUEUE FASTCALL IntGetFocusMessageQueue(VOID)
Definition: desktop.c:1335
VOID co_IntShellHookNotify(WPARAM Message, WPARAM wParam, LPARAM lParam)
Definition: desktop.c:1712
PWND FASTCALL IntGetThreadDesktopWindow(PTHREADINFO pti)
Definition: desktop.c:1387
VOID FASTCALL IntNotifyWinEvent(DWORD Event, PWND pWnd, LONG idObject, LONG idChild, DWORD flags)
Definition: event.c:178
WORD FASTCALL UserGetMouseButtonsState(VOID)
Definition: mouse.c:22
LRESULT FASTCALL co_IntSendMessageNoWait(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1763
LRESULT FASTCALL co_IntSendMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1495
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:209
PMONITOR NTAPI UserMonitorFromRect(PRECTL pRect, DWORD dwFlags)
Definition: monitor.c:469
PMONITOR NTAPI UserGetPrimaryMonitor(VOID)
Definition: monitor.c:102
PVOID UserGetObject(PUSER_HANDLE_TABLE ht, HANDLE handle, HANDLE_TYPE type)
Definition: object.c:499
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:647
BOOL FASTCALL UserDeleteObject(HANDLE h, HANDLE_TYPE type)
Definition: object.c:740
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13
VOID FASTCALL UserReferenceObject(PVOID obj)
Definition: object.c:754
BOOL FASTCALL UserSystemParametersInfo(UINT uiAction, UINT uiParam, PVOID pvParam, UINT fWinIni)
Definition: sysparams.c:2137
#define USERTAG_SWP
Definition: tags.h:281
#define USERTAG_WINDOWLIST
Definition: tags.h:298
ULONG FASTCALL IntSetStyle(PWND pwnd, ULONG set_bits, ULONG clear_bits)
Definition: window.c:144
HWND *FASTCALL IntWinListChildren(PWND Window)
Definition: window.c:275
VOID FASTCALL IntFreeHwndList(PWINDOWLIST pwlTarget)
Definition: window.c:1467
BOOL FASTCALL IntShowOwnedPopups(PWND OwnerWnd, BOOL fShow)
Definition: window.c:4654
PWND FASTCALL VerifyWnd(PWND pWnd)
Definition: window.c:88
HWND FASTCALL IntGetWindow(HWND hWnd, UINT uCmd)
Definition: window.c:382
BOOL FASTCALL IntIsWindow(HWND hWnd)
Definition: window.c:177
PWINDOWLIST FASTCALL IntBuildHwndList(PWND pwnd, DWORD dwFlags, PTHREADINFO pti)
Definition: window.c:1422
VOID FASTCALL IntLinkHwnd(PWND Wnd, HWND hWndPrev)
Definition: window.c:985
BOOL FASTCALL IntIsWindowVisible(PWND Wnd)
Definition: window.c:190
#define OBJID_WINDOW
Definition: winable.h:15
#define CHILDID_SELF
Definition: winable.h:14
#define STARTF_USEPOSITION
Definition: winbase.h:470
#define STARTF_USESHOWWINDOW
Definition: winbase.h:468
#define STARTF_USESIZE
Definition: winbase.h:469
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:21
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
#define WOC_RGN_CLIENT
Definition: winddi.h:1265
#define HAS_DLGFRAME(Style, ExStyle)
Definition: window.h:9
#define HAS_THINFRAME(Style, ExStyle)
Definition: window.h:17
#define IntIsDesktopWindow(WndObj)
Definition: window.h:25
#define WINVER_WINNT4
Definition: window.h:57
#define HAS_THICKFRAME(Style, ExStyle)
Definition: window.h:13
#define HWND_TERMINATOR
Definition: window.h:83
#define IACE_LIST
Definition: window.h:106
#define CopyRgn(hrgnDst, hrgnSrc)
Definition: windowsx.h:73
#define ERROR_INVALID_DWP_HANDLE
Definition: winerror.h:1231
#define ERROR_INVALID_WINDOW_HANDLE
Definition: winerror.h:1226
#define ERROR_INVALID_FLAGS
Definition: winerror.h:907
#define RGN_DIFF
Definition: wingdi.h:358
#define NULLREGION
Definition: wingdi.h:361
#define RGN_COPY
Definition: wingdi.h:357
#define RGN_AND
Definition: wingdi.h:356
#define CLR_INVALID
Definition: wingdi.h:883
#define SRCCOPY
Definition: wingdi.h:333
#define RGN_OR
Definition: wingdi.h:359
FORCEINLINE BOOLEAN IntIsWindowSnapped(PWND Wnd)
Definition: winpos.h:95
FORCEINLINE BOOL IntPtInWindow(PWND pwnd, INT x, INT y)
Definition: winpos.h:30
UINT8 bAsync
Definition: wlntfytests.c:96
_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:409