3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS user32.dll
5 * FILE: lib/user32/windows/window.c
6 * PURPOSE: Window management
7 * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
9 * 06-06-2001 CSH Created
12 /* INCLUDES ******************************************************************/
16 #include <wine/debug.h>
17 WINE_DEFAULT_DEBUG_CHANNEL(user32
);
20 #define WM_SETVISIBLE 9
22 #ifndef WM_QUERYDROPOBJECT
23 #define WM_QUERYDROPOBJECT 0x022B
26 LRESULT
DefWndNCPaint(HWND hWnd
, HRGN hRgn
, BOOL Active
);
27 LRESULT
DefWndNCCalcSize(HWND hWnd
, BOOL CalcSizeStruct
, RECT
*Rect
);
28 LRESULT
DefWndNCActivate(HWND hWnd
, WPARAM wParam
);
29 LRESULT
DefWndNCHitTest(HWND hWnd
, POINT Point
);
30 LRESULT
DefWndNCLButtonDown(HWND hWnd
, WPARAM wParam
, LPARAM lParam
);
31 LRESULT
DefWndNCLButtonDblClk(HWND hWnd
, WPARAM wParam
, LPARAM lParam
);
32 void FASTCALL
MenuInitSysMenuPopup(HMENU Menu
, DWORD Style
, DWORD ClsStyle
, LONG HitTest
);
34 /* GLOBALS *******************************************************************/
36 /* Bits in the dwKeyData */
37 #define KEYDATA_ALT 0x2000
38 #define KEYDATA_PREVSTATE 0x4000
40 static short iF10Key
= 0;
41 static short iMenuSysKey
= 0;
43 /* FUNCTIONS *****************************************************************/
46 InitStockObjects(void)
48 /* FIXME - Instead of copying the stuff to usermode we should map the tables to
49 userland. The current implementation has one big flaw: the system color
50 table doesn't get updated when another process changes them. That's why
51 we should rather map the table into usermode. But it only affects the
52 SysColors table - the pens, brushes and stock objects are not affected
53 as their handles never change. But it'd be faster to map them, too. */
62 GetSysColor(int nIndex
)
64 if(nIndex
>= 0 && nIndex
<= NUM_SYSCOLORS
)
66 return g_psi
->SysColors
[nIndex
];
69 SetLastError(ERROR_INVALID_PARAMETER
);
77 GetSysColorPen(int nIndex
)
79 if(nIndex
>= 0 && nIndex
<= NUM_SYSCOLORS
)
81 return g_psi
->SysColorPens
[nIndex
];
84 SetLastError(ERROR_INVALID_PARAMETER
);
92 GetSysColorBrush(int nIndex
)
94 if(nIndex
>= 0 && nIndex
<= NUM_SYSCOLORS
)
96 return g_psi
->SysColorBrushes
[nIndex
];
99 SetLastError(ERROR_INVALID_PARAMETER
);
110 CONST INT
*lpaElements
,
111 CONST COLORREF
*lpaRgbValues
)
113 return NtUserSetSysColors(cElements
, lpaElements
, lpaRgbValues
, 0);
117 UserGetInsideRectNC(PWINDOW Wnd
, RECT
*rect
)
123 ExStyle
= Wnd
->ExStyle
;
125 rect
->top
= rect
->left
= 0;
126 rect
->right
= Wnd
->WindowRect
.right
- Wnd
->WindowRect
.left
;
127 rect
->bottom
= Wnd
->WindowRect
.bottom
- Wnd
->WindowRect
.top
;
129 if (Style
& WS_ICONIC
)
134 /* Remove frame from rectangle */
135 if (UserHasThickFrameStyle(Style
, ExStyle
))
137 InflateRect(rect
, -GetSystemMetrics(SM_CXFRAME
),
138 -GetSystemMetrics(SM_CYFRAME
));
142 if (UserHasDlgFrameStyle(Style
, ExStyle
))
144 InflateRect(rect
, -GetSystemMetrics(SM_CXDLGFRAME
),
145 -GetSystemMetrics(SM_CYDLGFRAME
));
146 /* FIXME: this isn't in NC_AdjustRect? why not? */
147 if (ExStyle
& WS_EX_DLGMODALFRAME
)
148 InflateRect( rect
, -1, 0 );
152 if (UserHasThinFrameStyle(Style
, ExStyle
))
154 InflateRect(rect
, -GetSystemMetrics(SM_CXBORDER
),
155 -GetSystemMetrics(SM_CYBORDER
));
163 DefWndSetRedraw(HWND hWnd
, WPARAM wParam
)
165 LONG Style
= GetWindowLong(hWnd
, GWL_STYLE
);
166 /* Content can be redrawn after a change. */
169 if (!(Style
& WS_VISIBLE
)) /* Not Visible */
171 SetWindowLong(hWnd
, GWL_STYLE
, WS_VISIBLE
);
174 else /* Content cannot be redrawn after a change. */
176 if (Style
& WS_VISIBLE
) /* Visible */
178 RedrawWindow( hWnd
, NULL
, 0, RDW_ALLCHILDREN
| RDW_VALIDATE
);
179 Style
&= ~WS_VISIBLE
;
180 SetWindowLong(hWnd
, GWL_STYLE
, Style
); /* clear bits */
188 DefWndHandleSetCursor(HWND hWnd
, WPARAM wParam
, LPARAM lParam
, ULONG Style
)
190 /* Not for child windows. */
191 if (hWnd
!= (HWND
)wParam
)
196 switch((INT_PTR
) LOWORD(lParam
))
200 WORD Msg
= HIWORD(lParam
);
201 if (Msg
== WM_LBUTTONDOWN
|| Msg
== WM_MBUTTONDOWN
||
202 Msg
== WM_RBUTTONDOWN
|| Msg
== WM_XBUTTONDOWN
)
211 HICON hCursor
= (HICON
)GetClassLongW(hWnd
, GCL_HCURSOR
);
223 if (Style
& WS_MAXIMIZE
)
227 return((LRESULT
)SetCursor(LoadCursorW(0, IDC_SIZEWE
)));
233 if (Style
& WS_MAXIMIZE
)
237 return((LRESULT
)SetCursor(LoadCursorW(0, IDC_SIZENS
)));
243 if (Style
& WS_MAXIMIZE
)
247 return((LRESULT
)SetCursor(LoadCursorW(0, IDC_SIZENWSE
)));
253 if (GetWindowLongW(hWnd
, GWL_STYLE
) & WS_MAXIMIZE
)
257 return((LRESULT
)SetCursor(LoadCursorW(0, IDC_SIZENESW
)));
260 return((LRESULT
)SetCursor(LoadCursorW(0, IDC_ARROW
)));
264 DefWndStartSizeMove(HWND hWnd
, PWINDOW Wnd
, WPARAM wParam
, POINT
*capturePoint
)
270 ULONG Style
= Wnd
->Style
;
272 rectWindow
= Wnd
->WindowRect
;
274 if ((wParam
& 0xfff0) == SC_MOVE
)
276 /* Move pointer at the center of the caption */
278 UserGetInsideRectNC(Wnd
, &rect
);
279 if (Style
& WS_SYSMENU
)
280 rect
.left
+= GetSystemMetrics(SM_CXSIZE
) + 1;
281 if (Style
& WS_MINIMIZEBOX
)
282 rect
.right
-= GetSystemMetrics(SM_CXSIZE
) + 1;
283 if (Style
& WS_MAXIMIZEBOX
)
284 rect
.right
-= GetSystemMetrics(SM_CXSIZE
) + 1;
285 pt
.x
= rectWindow
.left
+ (rect
.right
- rect
.left
) / 2;
286 pt
.y
= rectWindow
.top
+ rect
.top
+ GetSystemMetrics(SM_CYSIZE
)/2;
295 if (GetMessageW(&msg
, NULL
, 0, 0) <= 0)
300 hittest
= DefWndNCHitTest(hWnd
, msg
.pt
);
301 if ((hittest
< HTLEFT
) || (hittest
> HTBOTTOMRIGHT
))
313 pt
.x
=(rectWindow
.left
+rectWindow
.right
)/2;
314 pt
.y
= rectWindow
.top
+ GetSystemMetrics(SM_CYFRAME
) / 2;
318 pt
.x
=(rectWindow
.left
+rectWindow
.right
)/2;
319 pt
.y
= rectWindow
.bottom
- GetSystemMetrics(SM_CYFRAME
) / 2;
323 pt
.x
= rectWindow
.left
+ GetSystemMetrics(SM_CXFRAME
) / 2;
324 pt
.y
=(rectWindow
.top
+rectWindow
.bottom
)/2;
328 pt
.x
= rectWindow
.right
- GetSystemMetrics(SM_CXFRAME
) / 2;
329 pt
.y
=(rectWindow
.top
+rectWindow
.bottom
)/2;
332 case VK_ESCAPE
: return 0;
338 SetCursorPos( pt
.x
, pt
.y
);
339 DefWndHandleSetCursor(hWnd
, (WPARAM
)hWnd
, MAKELONG(hittest
, WM_MOUSEMOVE
), Style
);
343 #define ON_LEFT_BORDER(hit) \
344 (((hit) == HTLEFT) || ((hit) == HTTOPLEFT) || ((hit) == HTBOTTOMLEFT))
345 #define ON_RIGHT_BORDER(hit) \
346 (((hit) == HTRIGHT) || ((hit) == HTTOPRIGHT) || ((hit) == HTBOTTOMRIGHT))
347 #define ON_TOP_BORDER(hit) \
348 (((hit) == HTTOP) || ((hit) == HTTOPLEFT) || ((hit) == HTTOPRIGHT))
349 #define ON_BOTTOM_BORDER(hit) \
350 (((hit) == HTBOTTOM) || ((hit) == HTBOTTOMLEFT) || ((hit) == HTBOTTOMRIGHT))
353 UserDrawWindowFrame(HDC hdc
, const RECT
*rect
,
354 ULONG width
, ULONG height
)
356 static HBRUSH hDraggingRectBrush
= NULL
;
359 if(!hDraggingRectBrush
)
361 static HBITMAP hDraggingPattern
= NULL
;
362 const DWORD Pattern
[4] = {0x5555AAAA, 0x5555AAAA, 0x5555AAAA, 0x5555AAAA};
364 hDraggingPattern
= CreateBitmap(8, 8, 1, 1, Pattern
);
365 hDraggingRectBrush
= CreatePatternBrush(hDraggingPattern
);
368 hbrush
= SelectObject( hdc
, hDraggingRectBrush
);
369 PatBlt( hdc
, rect
->left
, rect
->top
,
370 rect
->right
- rect
->left
- width
, height
, PATINVERT
);
371 PatBlt( hdc
, rect
->left
, rect
->top
+ height
, width
,
372 rect
->bottom
- rect
->top
- height
, PATINVERT
);
373 PatBlt( hdc
, rect
->left
+ width
, rect
->bottom
- 1,
374 rect
->right
- rect
->left
- width
, -height
, PATINVERT
);
375 PatBlt( hdc
, rect
->right
- 1, rect
->top
, -width
,
376 rect
->bottom
- rect
->top
- height
, PATINVERT
);
377 SelectObject( hdc
, hbrush
);
381 UserDrawMovingFrame(HDC hdc
, RECT
*rect
, BOOL thickframe
)
385 UserDrawWindowFrame(hdc
, rect
, GetSystemMetrics(SM_CXFRAME
), GetSystemMetrics(SM_CYFRAME
));
389 UserDrawWindowFrame(hdc
, rect
, 1, 1);
394 DefWndDoSizeMove(HWND hwnd
, WORD wParam
)
398 RECT sizingRect
, mouseRect
, origRect
, clipRect
, unmodRect
;
400 LONG hittest
= (LONG
)(wParam
& 0x0f);
401 HCURSOR hDragCursor
= 0, hOldCursor
= 0;
402 POINT minTrack
, maxTrack
;
403 POINT capturePoint
, pt
;
404 ULONG Style
, ExStyle
;
408 DWORD dwPoint
= GetMessagePos();
409 BOOL DragFullWindows
= FALSE
;
410 HWND hWndParent
= NULL
;
413 Wnd
= ValidateHwnd(hwnd
);
418 ExStyle
= Wnd
->ExStyle
;
419 iconic
= (Style
& WS_MINIMIZE
) != 0;
421 SystemParametersInfoA(SPI_GETDRAGFULLWINDOWS
, 0, &DragFullWindows
, 0);
423 pt
.x
= GET_X_LPARAM(dwPoint
);
424 pt
.y
= GET_Y_LPARAM(dwPoint
);
427 if ((Style
& WS_MAXIMIZE
) || !IsWindowVisible(hwnd
))
432 thickframe
= UserHasThickFrameStyle(Style
, ExStyle
) && !(Style
& WS_MINIMIZE
);
433 if ((wParam
& 0xfff0) == SC_MOVE
)
437 hittest
= DefWndStartSizeMove(hwnd
, Wnd
, wParam
, &capturePoint
);
450 if (hittest
&& ((wParam
& 0xfff0) != SC_MOUSEMENU
))
452 hittest
+= (HTLEFT
- WMSZ_LEFT
);
457 hittest
= DefWndStartSizeMove(hwnd
, Wnd
, wParam
, &capturePoint
);
466 /* Get min/max info */
468 WinPosGetMinMaxInfo(hwnd
, NULL
, NULL
, &minTrack
, &maxTrack
);
469 sizingRect
= Wnd
->WindowRect
;
470 if (Style
& WS_CHILD
)
472 hWndParent
= GetParent(hwnd
);
473 MapWindowPoints( 0, hWndParent
, (LPPOINT
)&sizingRect
, 2 );
474 unmodRect
= sizingRect
;
475 GetClientRect(hWndParent
, &mouseRect
);
476 clipRect
= mouseRect
;
477 MapWindowPoints(hWndParent
, HWND_DESKTOP
, (LPPOINT
)&clipRect
, 2);
481 if(!(ExStyle
& WS_EX_TOPMOST
))
483 SystemParametersInfoW(SPI_GETWORKAREA
, 0, &clipRect
, 0);
484 mouseRect
= clipRect
;
488 SetRect(&mouseRect
, 0, 0, GetSystemMetrics(SM_CXSCREEN
), GetSystemMetrics(SM_CYSCREEN
));
489 clipRect
= mouseRect
;
491 unmodRect
= sizingRect
;
493 ClipCursor(&clipRect
);
495 origRect
= sizingRect
;
496 if (ON_LEFT_BORDER(hittest
))
498 mouseRect
.left
= max( mouseRect
.left
, sizingRect
.right
-maxTrack
.x
);
499 mouseRect
.right
= min( mouseRect
.right
, sizingRect
.right
-minTrack
.x
);
501 else if (ON_RIGHT_BORDER(hittest
))
503 mouseRect
.left
= max( mouseRect
.left
, sizingRect
.left
+minTrack
.x
);
504 mouseRect
.right
= min( mouseRect
.right
, sizingRect
.left
+maxTrack
.x
);
506 if (ON_TOP_BORDER(hittest
))
508 mouseRect
.top
= max( mouseRect
.top
, sizingRect
.bottom
-maxTrack
.y
);
509 mouseRect
.bottom
= min( mouseRect
.bottom
,sizingRect
.bottom
-minTrack
.y
);
511 else if (ON_BOTTOM_BORDER(hittest
))
513 mouseRect
.top
= max( mouseRect
.top
, sizingRect
.top
+minTrack
.y
);
514 mouseRect
.bottom
= min( mouseRect
.bottom
, sizingRect
.top
+maxTrack
.y
);
516 if (Style
& WS_CHILD
)
518 MapWindowPoints( hWndParent
, 0, (LPPOINT
)&mouseRect
, 2 );
521 SendMessageA( hwnd
, WM_ENTERSIZEMOVE
, 0, 0 );
522 (void)NtUserSetGUIThreadHandle(MSQ_STATE_MOVESIZE
, hwnd
);
523 if (GetCapture() != hwnd
) SetCapture( hwnd
);
525 if (Style
& WS_CHILD
)
527 /* Retrieve a default cache DC (without using the window style) */
528 hdc
= GetDCEx(hWndParent
, 0, DCX_CACHE
);
534 DesktopRgn
= CreateRectRgnIndirect(&clipRect
);
537 SelectObject(hdc
, DesktopRgn
);
539 if( iconic
) /* create a cursor for dragging */
541 HICON hIcon
= (HICON
)GetClassLongW(hwnd
, GCL_HICON
);
542 if(!hIcon
) hIcon
= (HICON
)SendMessageW( hwnd
, WM_QUERYDRAGICON
, 0, 0L);
543 if( hIcon
) hDragCursor
= CursorIconToCursor( hIcon
, TRUE
);
544 if( !hDragCursor
) iconic
= FALSE
;
547 /* invert frame if WIN31_LOOK to indicate mouse click on caption */
548 if( !iconic
&& !DragFullWindows
)
550 UserDrawMovingFrame( hdc
, &sizingRect
, thickframe
);
557 if (GetMessageW(&msg
, 0, 0, 0) <= 0)
560 /* Exit on button-up, Return, or Esc */
561 if ((msg
.message
== WM_LBUTTONUP
) ||
562 ((msg
.message
== WM_KEYDOWN
) &&
563 ((msg
.wParam
== VK_RETURN
) || (msg
.wParam
== VK_ESCAPE
)))) break;
565 if (msg
.message
== WM_PAINT
)
567 if(!iconic
&& !DragFullWindows
) UserDrawMovingFrame( hdc
, &sizingRect
, thickframe
);
568 UpdateWindow( msg
.hwnd
);
569 if(!iconic
&& !DragFullWindows
) UserDrawMovingFrame( hdc
, &sizingRect
, thickframe
);
573 if ((msg
.message
!= WM_KEYDOWN
) && (msg
.message
!= WM_MOUSEMOVE
))
574 continue; /* We are not interested in other messages */
578 if (msg
.message
== WM_KEYDOWN
) switch(msg
.wParam
)
580 case VK_UP
: pt
.y
-= 8; break;
581 case VK_DOWN
: pt
.y
+= 8; break;
582 case VK_LEFT
: pt
.x
-= 8; break;
583 case VK_RIGHT
: pt
.x
+= 8; break;
586 pt
.x
= max( pt
.x
, mouseRect
.left
);
587 pt
.x
= min( pt
.x
, mouseRect
.right
);
588 pt
.y
= max( pt
.y
, mouseRect
.top
);
589 pt
.y
= min( pt
.y
, mouseRect
.bottom
);
591 dx
= pt
.x
- capturePoint
.x
;
592 dy
= pt
.y
- capturePoint
.y
;
600 if( iconic
) /* ok, no system popup tracking */
602 hOldCursor
= SetCursor(hDragCursor
);
607 if (msg
.message
== WM_KEYDOWN
) SetCursorPos( pt
.x
, pt
.y
);
610 RECT newRect
= unmodRect
;
611 WPARAM wpSizingHit
= 0;
613 if (hittest
== HTCAPTION
) OffsetRect( &newRect
, dx
, dy
);
614 if (ON_LEFT_BORDER(hittest
)) newRect
.left
+= dx
;
615 else if (ON_RIGHT_BORDER(hittest
)) newRect
.right
+= dx
;
616 if (ON_TOP_BORDER(hittest
)) newRect
.top
+= dy
;
617 else if (ON_BOTTOM_BORDER(hittest
)) newRect
.bottom
+= dy
;
618 if(!iconic
&& !DragFullWindows
) UserDrawMovingFrame( hdc
, &sizingRect
, thickframe
);
621 /* determine the hit location */
622 if (hittest
>= HTLEFT
&& hittest
<= HTBOTTOMRIGHT
)
623 wpSizingHit
= WMSZ_LEFT
+ (hittest
- HTLEFT
);
625 SendMessageA( hwnd
, WM_SIZING
, wpSizingHit
, (LPARAM
)&newRect
);
630 UserDrawMovingFrame( hdc
, &newRect
, thickframe
);
632 /* To avoid any deadlocks, all the locks on the windows
633 structures must be suspended before the SetWindowPos */
634 SetWindowPos( hwnd
, 0, newRect
.left
, newRect
.top
,
635 newRect
.right
- newRect
.left
,
636 newRect
.bottom
- newRect
.top
,
637 ( hittest
== HTCAPTION
) ? SWP_NOSIZE
: 0 );
640 sizingRect
= newRect
;
649 if( moved
) /* restore cursors, show icon title later on */
652 SetCursor( hOldCursor
);
654 DestroyCursor( hDragCursor
);
656 else if(!DragFullWindows
)
657 UserDrawMovingFrame( hdc
, &sizingRect
, thickframe
);
659 if (Style
& WS_CHILD
)
660 ReleaseDC( hWndParent
, hdc
);
666 DeleteObject(DesktopRgn
);
669 (void)NtUserSetGUIThreadHandle(MSQ_STATE_MOVESIZE
, NULL
);
670 SendMessageA( hwnd
, WM_EXITSIZEMOVE
, 0, 0 );
671 SendMessageA( hwnd
, WM_SETVISIBLE
, !IsIconic(hwnd
), 0L);
673 /* window moved or resized */
676 /* if the moving/resizing isn't canceled call SetWindowPos
677 * with the new position or the new size of the window
679 if (!((msg
.message
== WM_KEYDOWN
) && (msg
.wParam
== VK_ESCAPE
)) )
681 /* NOTE: SWP_NOACTIVATE prevents document window activation in Word 6 */
683 SetWindowPos( hwnd
, 0, sizingRect
.left
, sizingRect
.top
,
684 sizingRect
.right
- sizingRect
.left
,
685 sizingRect
.bottom
- sizingRect
.top
,
686 ( hittest
== HTCAPTION
) ? SWP_NOSIZE
: 0 );
688 else { /* restore previous size/position */
690 SetWindowPos( hwnd
, 0, origRect
.left
, origRect
.top
,
691 origRect
.right
- origRect
.left
,
692 origRect
.bottom
- origRect
.top
,
693 ( hittest
== HTCAPTION
) ? SWP_NOSIZE
: 0 );
698 if( Style
& WS_MINIMIZE
)
700 /* Single click brings up the system menu when iconized */
704 if( Style
& WS_SYSMENU
)
705 SendMessageA( hwnd
, WM_SYSCOMMAND
,
706 SC_MOUSEMENU
+ HTSYSMENU
, MAKELONG(pt
.x
,pt
.y
));
712 /***********************************************************************
713 * DefWndTrackScrollBar
715 * Track a mouse button press on the horizontal or vertical scroll-bar.
718 DefWndTrackScrollBar(HWND Wnd
, WPARAM wParam
, POINT Pt
)
722 if (SC_HSCROLL
== (wParam
& 0xfff0))
724 if (HTHSCROLL
!= (wParam
& 0x0f))
730 else /* SC_VSCROLL */
732 if (HTVSCROLL
!= (wParam
& 0x0f))
738 ScrollTrackScrollBar(Wnd
, ScrollBar
, Pt
);
743 DefWndHandleSysCommand(HWND hWnd
, WPARAM wParam
, LPARAM lParam
)
748 switch (wParam
& 0xfff0)
752 DefWndDoSizeMove(hWnd
, wParam
);
755 wp
.length
= sizeof(WINDOWPLACEMENT
);
756 if(GetWindowPlacement(hWnd
, &wp
))
758 wp
.showCmd
= SW_MINIMIZE
;
759 SetWindowPlacement(hWnd
, &wp
);
763 wp
.length
= sizeof(WINDOWPLACEMENT
);
764 if(GetWindowPlacement(hWnd
, &wp
))
766 wp
.showCmd
= SW_MAXIMIZE
;
767 SetWindowPlacement(hWnd
, &wp
);
771 wp
.length
= sizeof(WINDOWPLACEMENT
);
772 if(GetWindowPlacement(hWnd
, &wp
))
774 wp
.showCmd
= SW_RESTORE
;
775 SetWindowPlacement(hWnd
, &wp
);
779 SendMessageA(hWnd
, WM_CLOSE
, 0, 0);
783 Pt
.x
= (short)LOWORD(lParam
);
784 Pt
.y
= (short)HIWORD(lParam
);
785 MenuTrackMouseMenuBar(hWnd
, wParam
& 0x000f, Pt
);
789 MenuTrackKbdMenuBar(hWnd
, wParam
, (WCHAR
)lParam
);
794 Pt
.x
= (short)LOWORD(lParam
);
795 Pt
.y
= (short)HIWORD(lParam
);
796 DefWndTrackScrollBar(hWnd
, wParam
, Pt
);
801 /* FIXME: Implement */
810 DefWndHandleWindowPosChanging(HWND hWnd
, WINDOWPOS
* Pos
)
812 POINT maxTrack
, minTrack
;
813 LONG style
= GetWindowLongA(hWnd
, GWL_STYLE
);
815 if (Pos
->flags
& SWP_NOSIZE
) return 0;
816 if ((style
& WS_THICKFRAME
) || ((style
& (WS_POPUP
| WS_CHILD
)) == 0))
818 WinPosGetMinMaxInfo(hWnd
, NULL
, NULL
, &minTrack
, &maxTrack
);
819 Pos
->cx
= min(Pos
->cx
, maxTrack
.x
);
820 Pos
->cy
= min(Pos
->cy
, maxTrack
.y
);
821 if (!(style
& WS_MINIMIZE
))
823 if (Pos
->cx
< minTrack
.x
) Pos
->cx
= minTrack
.x
;
824 if (Pos
->cy
< minTrack
.y
) Pos
->cy
= minTrack
.y
;
829 Pos
->cx
= max(Pos
->cx
, 0);
830 Pos
->cy
= max(Pos
->cy
, 0);
835 /* Undocumented flags. */
836 #define SWP_NOCLIENTMOVE 0x0800
837 #define SWP_NOCLIENTSIZE 0x1000
840 DefWndHandleWindowPosChanged(HWND hWnd
, WINDOWPOS
* Pos
)
844 GetClientRect(hWnd
, &Rect
);
845 MapWindowPoints(hWnd
, (GetWindowLongW(hWnd
, GWL_STYLE
) & WS_CHILD
?
846 GetParent(hWnd
) : NULL
), (LPPOINT
) &Rect
, 2);
848 if (! (Pos
->flags
& SWP_NOCLIENTMOVE
))
850 SendMessageW(hWnd
, WM_MOVE
, 0, MAKELONG(Rect
.left
, Rect
.top
));
853 if (! (Pos
->flags
& SWP_NOCLIENTSIZE
))
855 WPARAM wp
= SIZE_RESTORED
;
860 else if (IsIconic(hWnd
))
864 SendMessageW(hWnd
, WM_SIZE
, wp
,
865 MAKELONG(Rect
.right
- Rect
.left
, Rect
.bottom
- Rect
.top
));
871 /***********************************************************************
874 * Default colors for control painting.
877 DefWndControlColor(HDC hDC
, UINT ctlType
)
879 if (CTLCOLOR_SCROLLBAR
== ctlType
)
881 HBRUSH hb
= GetSysColorBrush(COLOR_SCROLLBAR
);
882 COLORREF bk
= GetSysColor(COLOR_3DHILIGHT
);
883 SetTextColor(hDC
, GetSysColor(COLOR_3DFACE
));
886 /* if COLOR_WINDOW happens to be the same as COLOR_3DHILIGHT
887 * we better use 0x55aa bitmap brush to make scrollbar's background
888 * look different from the window background.
890 if (bk
== GetSysColor(COLOR_WINDOW
))
892 static const WORD wPattern55AA
[] =
894 0x5555, 0xaaaa, 0x5555, 0xaaaa,
895 0x5555, 0xaaaa, 0x5555, 0xaaaa
897 static HBITMAP hPattern55AABitmap
= NULL
;
898 static HBRUSH hPattern55AABrush
= NULL
;
899 if (hPattern55AABrush
== NULL
)
901 hPattern55AABitmap
= CreateBitmap(8, 8, 1, 1, wPattern55AA
);
902 hPattern55AABrush
= CreatePatternBrush(hPattern55AABitmap
);
904 return hPattern55AABrush
;
910 SetTextColor(hDC
, GetSysColor(COLOR_WINDOWTEXT
));
912 if ((CTLCOLOR_EDIT
== ctlType
) || (CTLCOLOR_LISTBOX
== ctlType
))
914 SetBkColor(hDC
, GetSysColor(COLOR_WINDOW
));
918 SetBkColor(hDC
, GetSysColor(COLOR_3DFACE
));
919 return GetSysColorBrush(COLOR_3DFACE
);
922 return GetSysColorBrush(COLOR_WINDOW
);
925 static void DefWndPrint( HWND hwnd
, HDC hdc
, ULONG uFlags
)
930 if ( (uFlags
& PRF_CHECKVISIBLE
) &&
931 !IsWindowVisible(hwnd
) )
935 * Unimplemented flags.
937 if ( (uFlags
& PRF_CHILDREN
) ||
938 (uFlags
& PRF_OWNED
) ||
939 (uFlags
& PRF_NONCLIENT
) )
941 FIXME("WM_PRINT message with unsupported flags\n");
947 if ( uFlags
& PRF_ERASEBKGND
)
948 SendMessageW(hwnd
, WM_ERASEBKGND
, (WPARAM
)hdc
, 0);
953 if ( uFlags
& PRF_CLIENT
)
954 SendMessageW(hwnd
, WM_PRINTCLIENT
, (WPARAM
)hdc
, PRF_CLIENT
);
958 UserSendUiUpdateMsg(HWND hwnd
, LPARAM lParam
)
960 SendMessageW(hwnd
, WM_UPDATEUISTATE
, (WPARAM
)lParam
, 0);
966 DefWndScreenshot(HWND hWnd
)
978 hdc
= GetWindowDC(hWnd
);
979 GetWindowRect(hWnd
, &rect
);
980 w
= rect
.right
- rect
.left
;
981 h
= rect
.bottom
- rect
.top
;
983 hbitmap
= CreateCompatibleBitmap(hdc
, w
, h
);
984 hdc2
= CreateCompatibleDC(hdc
);
985 SelectObject(hdc2
, hbitmap
);
987 BitBlt(hdc2
, 0, 0, w
, h
,
991 SetClipboardData(CF_BITMAP
, hbitmap
);
993 ReleaseDC(hWnd
, hdc
);
994 ReleaseDC(hWnd
, hdc2
);
1003 User32DefWindowProc(HWND hWnd
,
1013 return DefWndNCPaint(hWnd
, (HRGN
)wParam
, -1);
1018 return DefWndNCCalcSize(hWnd
, (BOOL
)wParam
, (RECT
*)lParam
);
1023 return DefWndNCActivate(hWnd
, wParam
);
1029 Point
.x
= GET_X_LPARAM(lParam
);
1030 Point
.y
= GET_Y_LPARAM(lParam
);
1031 return (DefWndNCHitTest(hWnd
, Point
));
1034 case WM_LBUTTONDOWN
:
1035 case WM_RBUTTONDOWN
:
1036 case WM_MBUTTONDOWN
:
1037 iF10Key
= iMenuSysKey
= 0;
1040 case WM_NCLBUTTONDOWN
:
1042 return (DefWndNCLButtonDown(hWnd
, wParam
, lParam
));
1045 case WM_LBUTTONDBLCLK
:
1046 return (DefWndNCLButtonDblClk(hWnd
, HTCLIENT
, lParam
));
1048 case WM_NCLBUTTONDBLCLK
:
1050 return (DefWndNCLButtonDblClk(hWnd
, wParam
, lParam
));
1053 case WM_WINDOWPOSCHANGING
:
1055 return (DefWndHandleWindowPosChanging(hWnd
, (WINDOWPOS
*)lParam
));
1058 case WM_WINDOWPOSCHANGED
:
1060 return (DefWndHandleWindowPosChanged(hWnd
, (WINDOWPOS
*)lParam
));
1063 case WM_NCRBUTTONDOWN
:
1065 /* in Windows, capture is taken when right-clicking on the caption bar */
1066 if (wParam
== HTCAPTION
)
1076 if (hWnd
== GetCapture())
1080 Pt
.x
= GET_X_LPARAM(lParam
);
1081 Pt
.y
= GET_Y_LPARAM(lParam
);
1082 ClientToScreen(hWnd
, &Pt
);
1083 lParam
= MAKELPARAM(Pt
.x
, Pt
.y
);
1086 SendMessageW(hWnd
, WM_CONTEXTMENU
, (WPARAM
)hWnd
, lParam
);
1090 SendMessageA(hWnd
, WM_CONTEXTMENU
, (WPARAM
)hWnd
, lParam
);
1095 case WM_NCRBUTTONUP
:
1097 * FIXME : we must NOT send WM_CONTEXTMENU on a WM_NCRBUTTONUP (checked
1098 * in Windows), but what _should_ we do? According to MSDN :
1099 * "If it is appropriate to do so, the system sends the WM_SYSCOMMAND
1100 * message to the window". When is it appropriate?
1104 case WM_CONTEXTMENU
:
1106 if (GetWindowLongW(hWnd
, GWL_STYLE
) & WS_CHILD
)
1110 SendMessageW(GetParent(hWnd
), Msg
, wParam
, lParam
);
1114 SendMessageA(GetParent(hWnd
), WM_CONTEXTMENU
, wParam
, lParam
);
1123 Style
= GetWindowLongW(hWnd
, GWL_STYLE
);
1125 Pt
.x
= GET_X_LPARAM(lParam
);
1126 Pt
.y
= GET_Y_LPARAM(lParam
);
1127 if (Style
& WS_CHILD
)
1129 ScreenToClient(GetParent(hWnd
), &Pt
);
1132 HitCode
= DefWndNCHitTest(hWnd
, Pt
);
1134 if (HitCode
== HTCAPTION
|| HitCode
== HTSYSMENU
)
1139 if((SystemMenu
= GetSystemMenu(hWnd
, FALSE
)))
1141 MenuInitSysMenuPopup(SystemMenu
, GetWindowLongW(hWnd
, GWL_STYLE
),
1142 GetClassLongW(hWnd
, GCL_STYLE
), HitCode
);
1144 if(HitCode
== HTCAPTION
)
1145 Flags
= TPM_LEFTBUTTON
| TPM_RIGHTBUTTON
;
1147 Flags
= TPM_LEFTBUTTON
;
1149 TrackPopupMenu(SystemMenu
, Flags
,
1150 Pt
.x
, Pt
.y
, 0, hWnd
, NULL
);
1159 DefWndPrint(hWnd
, (HDC
)wParam
, lParam
);
1167 HDC hDC
= BeginPaint(hWnd
, &Ps
);
1171 if (GetWindowLongW(hWnd
, GWL_STYLE
) & WS_MINIMIZE
&&
1172 (hIcon
= (HICON
)GetClassLongW(hWnd
, GCL_HICON
)) != NULL
)
1176 GetClientRect(hWnd
, &ClientRect
);
1177 x
= (ClientRect
.right
- ClientRect
.left
-
1178 GetSystemMetrics(SM_CXICON
)) / 2;
1179 y
= (ClientRect
.bottom
- ClientRect
.top
-
1180 GetSystemMetrics(SM_CYICON
)) / 2;
1181 DrawIcon(hDC
, x
, y
, hIcon
);
1183 EndPaint(hWnd
, &Ps
);
1191 hRgn
= CreateRectRgn(0, 0, 0, 0);
1192 if (GetUpdateRgn(hWnd
, hRgn
, FALSE
) != NULLREGION
)
1194 RedrawWindow(hWnd
, NULL
, hRgn
,
1195 RDW_ERASENOW
| RDW_ERASE
| RDW_FRAME
|
1204 DefWndSetRedraw(hWnd
, wParam
);
1210 DestroyWindow(hWnd
);
1214 case WM_MOUSEACTIVATE
:
1216 if (GetWindowLongW(hWnd
, GWL_STYLE
) & WS_CHILD
)
1221 Ret
= SendMessageW(GetParent(hWnd
), WM_MOUSEACTIVATE
,
1226 Ret
= SendMessageA(GetParent(hWnd
), WM_MOUSEACTIVATE
,
1234 return ((LOWORD(lParam
) >= HTCLIENT
) ? MA_ACTIVATE
: MA_NOACTIVATE
);
1239 /* Check if the window is minimized. */
1240 if (LOWORD(wParam
) != WA_INACTIVE
&&
1241 !(GetWindowLongW(hWnd
, GWL_STYLE
) & WS_MINIMIZE
))
1250 if (GetWindowLongW(hWnd
, GWL_STYLE
) & WS_CHILD
)
1254 return (SendMessageW(GetParent(hWnd
), WM_MOUSEWHEEL
,
1259 return (SendMessageA(GetParent(hWnd
), WM_MOUSEWHEEL
,
1267 case WM_ICONERASEBKGND
:
1270 HBRUSH hBrush
= (HBRUSH
)GetClassLongW(hWnd
, GCL_HBRBACKGROUND
);
1276 if (GetClassLongW(hWnd
, GCL_STYLE
) & CS_PARENTDC
)
1278 /* can't use GetClipBox with a parent DC or we fill the whole parent */
1279 GetClientRect(hWnd
, &Rect
);
1280 DPtoLP((HDC
)wParam
, (LPPOINT
)&Rect
, 2);
1284 GetClipBox((HDC
)wParam
, &Rect
);
1286 FillRect((HDC
)wParam
, &Rect
, hBrush
);
1290 case WM_CTLCOLORMSGBOX
:
1291 case WM_CTLCOLOREDIT
:
1292 case WM_CTLCOLORLISTBOX
:
1293 case WM_CTLCOLORBTN
:
1294 case WM_CTLCOLORDLG
:
1295 case WM_CTLCOLORSTATIC
:
1296 case WM_CTLCOLORSCROLLBAR
:
1297 return (LRESULT
) DefWndControlColor((HDC
)wParam
, Msg
- WM_CTLCOLORMSGBOX
);
1300 return (LRESULT
) DefWndControlColor((HDC
)wParam
, HIWORD(lParam
));
1304 ULONG Style
= GetWindowLongW(hWnd
, GWL_STYLE
);
1306 if (Style
& WS_CHILD
)
1308 if (LOWORD(lParam
) < HTLEFT
|| LOWORD(lParam
) > HTBOTTOMRIGHT
)
1313 bResult
= SendMessageW(GetParent(hWnd
), WM_SETCURSOR
,
1318 bResult
= SendMessageA(GetParent(hWnd
), WM_SETCURSOR
,
1327 return (DefWndHandleSetCursor(hWnd
, wParam
, lParam
, Style
));
1331 return (DefWndHandleSysCommand(hWnd
, wParam
, lParam
));
1334 if(wParam
== VK_F10
) iF10Key
= VK_F10
;
1337 /* FIXME: This is also incomplete. */
1340 if (HIWORD(lParam
) & KEYDATA_ALT
)
1342 /* if( HIWORD(lParam) & ~KEYDATA_PREVSTATE ) */
1343 if ( (wParam
== VK_MENU
|| wParam
== VK_LMENU
1344 || wParam
== VK_RMENU
) && !iMenuSysKey
)
1351 if (wParam
== VK_F4
) /* Try to close the window */
1353 HWND top
= GetAncestor(hWnd
, GA_ROOT
);
1354 if (!(GetClassLongW(top
, GCL_STYLE
) & CS_NOCLOSE
))
1357 PostMessageW(top
, WM_SYSCOMMAND
, SC_CLOSE
, 0);
1359 PostMessageA(top
, WM_SYSCOMMAND
, SC_CLOSE
, 0);
1362 else if (wParam
== VK_SNAPSHOT
)
1365 while (GetParent(hwnd
) != NULL
)
1367 hwnd
= GetParent(hwnd
);
1369 DefWndScreenshot(hwnd
);
1372 else if( wParam
== VK_F10
)
1374 else if( wParam
== VK_ESCAPE
&& (GetKeyState(VK_SHIFT
) & 0x8000))
1375 SendMessageW( hWnd
, WM_SYSCOMMAND
, SC_KEYMENU
, ' ' );
1382 /* Press and release F10 or ALT */
1383 if (((wParam
== VK_MENU
|| wParam
== VK_LMENU
|| wParam
== VK_RMENU
)
1384 && iMenuSysKey
) || ((wParam
== VK_F10
) && iF10Key
))
1385 SendMessageW( GetAncestor( hWnd
, GA_ROOT
), WM_SYSCOMMAND
, SC_KEYMENU
, 0L );
1386 iMenuSysKey
= iF10Key
= 0;
1393 if (wParam
== '\r' && IsIconic(hWnd
))
1395 PostMessageW( hWnd
, WM_SYSCOMMAND
, SC_RESTORE
, 0L );
1398 if ((HIWORD(lParam
) & KEYDATA_ALT
) && wParam
)
1400 if (wParam
== '\t' || wParam
== '\x1b') break;
1401 if (wParam
== ' ' && (GetWindowLongW( hWnd
, GWL_STYLE
) & WS_CHILD
))
1402 SendMessageW( GetParent(hWnd
), Msg
, wParam
, lParam
);
1404 SendMessageW( hWnd
, WM_SYSCOMMAND
, SC_KEYMENU
, wParam
);
1406 else /* check for Ctrl-Esc */
1407 if (wParam
!= '\x1b') MessageBeep(0);
1416 if (!lParam
) return 0;
1417 Style
= GetWindowLongW(hWnd
, GWL_STYLE
);
1418 if ((Style
& WS_VISIBLE
) && wParam
) return 0;
1419 if (!(Style
& WS_VISIBLE
) && !wParam
) return 0;
1420 if (!GetWindow(hWnd
, GW_OWNER
)) return 0;
1421 Ret
= NtUserCallTwoParam((DWORD
) hWnd
, (DWORD
) wParam
, TWOPARAM_ROUTINE_ROS_SHOWWINDOW
);
1424 if( Ret
== -1) return 0;
1427 ShowWindow(hWnd
, wParam
? SW_SHOWNOACTIVATE
: SW_HIDE
);
1434 /* FIXME: Check for a desktop. */
1435 if (!(GetWindowLongW( hWnd
, GWL_STYLE
) & WS_CHILD
)) EndMenu();
1436 if (GetCapture() == hWnd
)
1450 case WM_QUERYDROPOBJECT
:
1452 if (GetWindowLongW(hWnd
, GWL_EXSTYLE
) & WS_EX_ACCEPTFILES
)
1459 case WM_QUERYDRAGICON
:
1464 hIcon
= (HICON
)GetClassLongW(hWnd
, GCL_HICON
);
1467 return ((LRESULT
)hIcon
);
1469 for (Len
= 1; Len
< 64; Len
++)
1471 if ((hIcon
= LoadIconW(NULL
, MAKEINTRESOURCEW(Len
))) != NULL
)
1473 return((LRESULT
)hIcon
);
1476 return ((LRESULT
)LoadIconW(0, IDI_APPLICATION
));
1479 /* FIXME: WM_ISACTIVEICON */
1481 case WM_NOTIFYFORMAT
:
1483 if (lParam
== NF_QUERY
)
1484 return IsWindowUnicode(hWnd
) ? NFR_UNICODE
: NFR_ANSI
;
1490 INT Index
= (wParam
!= 0) ? GCL_HICON
: GCL_HICONSM
;
1491 HICON hOldIcon
= (HICON
)GetClassLongW(hWnd
, Index
);
1492 SetClassLongW(hWnd
, Index
, lParam
);
1493 SetWindowPos(hWnd
, 0, 0, 0, 0, 0,
1494 SWP_FRAMECHANGED
| SWP_NOSIZE
| SWP_NOMOVE
|
1495 SWP_NOACTIVATE
| SWP_NOZORDER
);
1496 return ((LRESULT
)hOldIcon
);
1501 INT Index
= (wParam
== ICON_BIG
) ? GCL_HICON
: GCL_HICONSM
;
1502 return (GetClassLongW(hWnd
, Index
));
1509 SendMessageW(GetParent(hWnd
), Msg
, wParam
, lParam
);
1513 SendMessageA(GetParent(hWnd
), Msg
, wParam
, lParam
);
1520 THRDCARETINFO CaretInfo
;
1523 case 0xffff: /* Caret timer */
1524 /* switch showing byte in win32k and get information about the caret */
1525 if(NtUserSwitchCaretShowing(&CaretInfo
) && (CaretInfo
.hWnd
== hWnd
))
1527 DrawCaret(hWnd
, &CaretInfo
);
1535 case WM_QUERYENDSESSION
:
1540 case WM_INPUTLANGCHANGEREQUEST
:
1544 if(wParam
& INPUTLANGCHANGE_BACKWARD
1545 && wParam
& INPUTLANGCHANGE_FORWARD
)
1550 //FIXME: What to do with INPUTLANGCHANGE_SYSCHARSET ?
1552 if(wParam
& INPUTLANGCHANGE_BACKWARD
) NewHkl
= (HKL
) HKL_PREV
;
1553 else if(wParam
& INPUTLANGCHANGE_FORWARD
) NewHkl
= (HKL
) HKL_NEXT
;
1554 else NewHkl
= (HKL
) lParam
;
1556 NtUserActivateKeyboardLayout(NewHkl
, 0);
1561 case WM_INPUTLANGCHANGE
:
1563 //FIXME: What to do?
1568 if (wParam
) PostQuitMessage(0);
1571 case WM_QUERYUISTATE
:
1574 PWINDOW Wnd
= ValidateHwnd(hWnd
);
1578 Ret
|= UISF_HIDEFOCUS
;
1580 Ret
|= UISF_HIDEACCEL
;
1585 case WM_CHANGEUISTATE
:
1587 BOOL AlwaysShowCues
= TRUE
;
1588 WORD Action
= LOWORD(wParam
);
1589 WORD Flags
= HIWORD(wParam
);
1592 SystemParametersInfoW(SPI_GETKEYBOARDCUES
, 0, &AlwaysShowCues
, 0);
1596 Wnd
= ValidateHwnd(hWnd
);
1597 if (!Wnd
|| lParam
!= 0)
1600 if (Flags
& ~(UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
))
1603 if (Flags
& UISF_ACTIVE
)
1605 WARN("WM_CHANGEUISTATE does not yet support UISF_ACTIVE!\n");
1608 if (Action
== UIS_INITIALIZE
)
1610 PDESKTOP Desk
= GetThreadDesktopInfo();
1614 Action
= Desk
->LastInputWasKbd
? UIS_CLEAR
: UIS_SET
;
1615 Flags
= UISF_HIDEFOCUS
| UISF_HIDEACCEL
;
1617 /* We need to update wParam in case we need to send out messages */
1618 wParam
= MAKEWPARAM(Action
, Flags
);
1624 /* See if we actually need to change something */
1625 if ((Flags
& UISF_HIDEFOCUS
) && !Wnd
->HideFocus
)
1627 if ((Flags
& UISF_HIDEACCEL
) && !Wnd
->HideAccel
)
1630 /* Don't need to do anything... */
1634 /* See if we actually need to change something */
1635 if ((Flags
& UISF_HIDEFOCUS
) && Wnd
->HideFocus
)
1637 if ((Flags
& UISF_HIDEACCEL
) && Wnd
->HideAccel
)
1640 /* Don't need to do anything... */
1644 WARN("WM_CHANGEUISTATE: Unsupported Action 0x%x\n", Action
);
1648 if ((Wnd
->Style
& WS_CHILD
) && Wnd
->Parent
!= NULL
)
1650 /* We're a child window and we need to pass this message down until
1651 we reach the root */
1652 hWnd
= UserHMGetHandle((PWINDOW
)DesktopPtrToUser(Wnd
->Parent
));
1656 /* We're a top level window, we need to change the UI state */
1657 Msg
= WM_UPDATEUISTATE
;
1661 return SendMessageW(hWnd
, Msg
, wParam
, lParam
);
1663 return SendMessageA(hWnd
, Msg
, wParam
, lParam
);
1666 case WM_UPDATEUISTATE
:
1669 BOOL AlwaysShowCues
= TRUE
;
1670 WORD Action
= LOWORD(wParam
);
1671 WORD Flags
= HIWORD(wParam
);
1674 SystemParametersInfoW(SPI_GETKEYBOARDCUES
, 0, &AlwaysShowCues
, 0);
1678 Wnd
= ValidateHwnd(hWnd
);
1679 if (!Wnd
|| lParam
!= 0)
1682 if (Flags
& ~(UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
))
1685 if (Flags
& UISF_ACTIVE
)
1687 WARN("WM_UPDATEUISTATE does not yet support UISF_ACTIVE!\n");
1690 if (Action
== UIS_INITIALIZE
)
1692 PDESKTOP Desk
= GetThreadDesktopInfo();
1696 Action
= Desk
->LastInputWasKbd
? UIS_CLEAR
: UIS_SET
;
1697 Flags
= UISF_HIDEFOCUS
| UISF_HIDEACCEL
;
1699 /* We need to update wParam for broadcasting the update */
1700 wParam
= MAKEWPARAM(Action
, Flags
);
1706 /* See if we actually need to change something */
1707 if ((Flags
& UISF_HIDEFOCUS
) && !Wnd
->HideFocus
)
1709 if ((Flags
& UISF_HIDEACCEL
) && !Wnd
->HideAccel
)
1712 /* Don't need to do anything... */
1717 /* See if we actually need to change something */
1718 if ((Flags
& UISF_HIDEFOCUS
) && Wnd
->HideFocus
)
1720 if ((Flags
& UISF_HIDEACCEL
) && Wnd
->HideAccel
)
1723 /* Don't need to do anything... */
1728 WARN("WM_UPDATEUISTATE: Unsupported Action 0x%x\n", Action
);
1732 /* Pack the information and call win32k */
1735 if (!NtUserCallTwoParam((DWORD
)hWnd
, (DWORD
)Flags
| ((DWORD
)Action
<< 3), TWOPARAM_ROUTINE_ROS_UPDATEUISTATE
))
1739 /* Always broadcast the update to all children */
1740 EnumChildWindows(hWnd
,
1741 UserSendUiUpdateMsg
,
1753 DefWindowProcA(HWND hWnd
,
1761 SPY_EnterMessage(SPY_DEFWNDPROC
, hWnd
, Msg
, wParam
, lParam
);
1766 ANSI_STRING AnsiString
;
1767 UNICODE_STRING UnicodeString
;
1768 LPCREATESTRUCTA cs
= (LPCREATESTRUCTA
)lParam
;
1769 /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
1770 * may have child window IDs instead of window name */
1774 RtlInitAnsiString(&AnsiString
, (LPSTR
)cs
->lpszName
);
1775 RtlAnsiStringToUnicodeString(&UnicodeString
, &AnsiString
, TRUE
);
1776 NtUserDefSetText(hWnd
, &UnicodeString
);
1777 RtlFreeUnicodeString(&UnicodeString
);
1780 NtUserDefSetText(hWnd
, NULL
);
1786 case WM_GETTEXTLENGTH
:
1791 Wnd
= ValidateHwnd(hWnd
);
1792 if (Wnd
!= NULL
&& Wnd
->WindowName
.Length
!= 0)
1794 buf
= DesktopPtrToUser(Wnd
->WindowName
.Buffer
);
1796 NT_SUCCESS(RtlUnicodeToMultiByteSize(&len
,
1798 Wnd
->WindowName
.Length
)))
1800 Result
= (LRESULT
)len
;
1809 PSTR outbuf
= (PSTR
)lParam
;
1812 Wnd
= ValidateHwnd(hWnd
);
1813 if (Wnd
!= NULL
&& wParam
!= 0)
1815 if (Wnd
->WindowName
.Buffer
!= NULL
)
1816 buf
= DesktopPtrToUser(Wnd
->WindowName
.Buffer
);
1822 if (Wnd
->WindowName
.Length
!= 0)
1824 copy
= min(Wnd
->WindowName
.Length
/ sizeof(WCHAR
), wParam
- 1);
1825 Result
= WideCharToMultiByte(CP_ACP
,
1833 outbuf
[Result
] = '\0';
1844 ANSI_STRING AnsiString
;
1845 UNICODE_STRING UnicodeString
;
1849 RtlInitAnsiString(&AnsiString
, (LPSTR
)lParam
);
1850 RtlAnsiStringToUnicodeString(&UnicodeString
, &AnsiString
, TRUE
);
1851 NtUserDefSetText(hWnd
, &UnicodeString
);
1852 RtlFreeUnicodeString(&UnicodeString
);
1855 NtUserDefSetText(hWnd
, NULL
);
1857 if ((GetWindowLongW(hWnd
, GWL_STYLE
) & WS_CAPTION
) == WS_CAPTION
)
1859 DefWndNCPaint(hWnd
, (HRGN
)1, -1);
1866 /* FIXME: Implement these. */
1868 case WM_IME_KEYDOWN
:
1870 case WM_IME_STARTCOMPOSITION
:
1871 case WM_IME_COMPOSITION
:
1872 case WM_IME_ENDCOMPOSITION
:
1874 case WM_IME_SETCONTEXT
:
1875 FIXME("FIXME: WM_IME_* conversion isn't implemented yet!");
1878 Result
= User32DefWindowProc(hWnd
, Msg
, wParam
, lParam
, FALSE
);
1881 SPY_ExitMessage(SPY_RESULT_DEFWND
, hWnd
, Msg
, Result
, wParam
, lParam
);
1887 DefWindowProcW(HWND hWnd
,
1895 SPY_EnterMessage(SPY_DEFWNDPROC
, hWnd
, Msg
, wParam
, lParam
);
1900 UNICODE_STRING UnicodeString
;
1901 LPCREATESTRUCTW cs
= (LPCREATESTRUCTW
)lParam
;
1902 /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
1903 * may have child window IDs instead of window name */
1906 RtlInitUnicodeString(&UnicodeString
, (LPWSTR
)cs
->lpszName
);
1908 NtUserDefSetText( hWnd
, (cs
->lpszName
? &UnicodeString
: NULL
));
1913 case WM_GETTEXTLENGTH
:
1918 Wnd
= ValidateHwnd(hWnd
);
1919 if (Wnd
!= NULL
&& Wnd
->WindowName
.Length
!= 0)
1921 buf
= DesktopPtrToUser(Wnd
->WindowName
.Buffer
);
1923 NT_SUCCESS(RtlUnicodeToMultiByteSize(&len
,
1925 Wnd
->WindowName
.Length
)))
1927 Result
= (LRESULT
)len
;
1936 PWSTR outbuf
= (PWSTR
)lParam
;
1938 Wnd
= ValidateHwnd(hWnd
);
1939 if (Wnd
!= NULL
&& wParam
!= 0)
1941 if (Wnd
->WindowName
.Buffer
!= NULL
)
1942 buf
= DesktopPtrToUser(Wnd
->WindowName
.Buffer
);
1948 if (Wnd
->WindowName
.Length
!= 0)
1950 Result
= min(Wnd
->WindowName
.Length
/ sizeof(WCHAR
), wParam
- 1);
1951 RtlCopyMemory(outbuf
,
1953 Result
* sizeof(WCHAR
));
1954 outbuf
[Result
] = L
'\0';
1965 UNICODE_STRING UnicodeString
;
1968 RtlInitUnicodeString(&UnicodeString
, (LPWSTR
)lParam
);
1970 NtUserDefSetText(hWnd
, (lParam
? &UnicodeString
: NULL
));
1972 if ((GetWindowLongW(hWnd
, GWL_STYLE
) & WS_CAPTION
) == WS_CAPTION
)
1974 DefWndNCPaint(hWnd
, (HRGN
)1, -1);
1982 SendMessageW(hWnd
, WM_CHAR
, wParam
, lParam
);
1987 case WM_IME_SETCONTEXT
:
1990 FIXME("FIXME: WM_IME_SETCONTEXT is not implemented!");
1996 Result
= User32DefWindowProc(hWnd
, Msg
, wParam
, lParam
, TRUE
);
1998 SPY_ExitMessage(SPY_RESULT_DEFWND
, hWnd
, Msg
, Result
, wParam
, lParam
);