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
)
745 // WINDOWPLACEMENT wp;
748 // ATM, This is for Hook call.
749 if (NtUserMessageCall( hWnd
, WM_SYSCOMMAND
, wParam
, lParam
, 0, NUMC_DEFWINDOWPROC
, FALSE
))
752 switch (wParam
& 0xfff0)
756 DefWndDoSizeMove(hWnd
, wParam
);
759 FIXME("SysCommand SC_MINIMIZE\n");
760 /* wp.length = sizeof(WINDOWPLACEMENT);
761 if(GetWindowPlacement(hWnd, &wp))
763 wp.showCmd = SW_MINIMIZE;
764 SetWindowPlacement(hWnd, &wp);
766 if (hWnd
== GetForegroundWindow())
767 ShowOwnedPopups(hWnd
,FALSE
);
768 ShowWindow( hWnd
, SW_MINIMIZE
);
771 FIXME("SysCommand SC_MAXIMIZE\n");
772 /* wp.length = sizeof(WINDOWPLACEMENT);
773 if(GetWindowPlacement(hWnd, &wp))
775 wp.showCmd = SW_MAXIMIZE;
776 SetWindowPlacement(hWnd, &wp);
778 if (IsIconic(hWnd
) && hWnd
== GetForegroundWindow())
779 ShowOwnedPopups(hWnd
,TRUE
);
780 ShowWindow( hWnd
, SW_MAXIMIZE
);
783 FIXME("SysCommand SC_RESTORE\n");
784 /* wp.length = sizeof(WINDOWPLACEMENT);
785 if(GetWindowPlacement(hWnd, &wp))
787 wp.showCmd = SW_RESTORE;
788 SetWindowPlacement(hWnd, &wp);
790 if (IsIconic(hWnd
) && hWnd
== GetForegroundWindow())
791 ShowOwnedPopups(hWnd
,TRUE
);
792 ShowWindow( hWnd
, SW_RESTORE
);
795 SendMessageA(hWnd
, WM_CLOSE
, 0, 0);
799 Pt
.x
= (short)LOWORD(lParam
);
800 Pt
.y
= (short)HIWORD(lParam
);
801 MenuTrackMouseMenuBar(hWnd
, wParam
& 0x000f, Pt
);
805 MenuTrackKbdMenuBar(hWnd
, wParam
, (WCHAR
)lParam
);
810 Pt
.x
= (short)LOWORD(lParam
);
811 Pt
.y
= (short)HIWORD(lParam
);
812 DefWndTrackScrollBar(hWnd
, wParam
, Pt
);
817 /* FIXME: Implement */
826 DefWndHandleWindowPosChanging(HWND hWnd
, WINDOWPOS
* Pos
)
828 POINT maxTrack
, minTrack
;
829 LONG style
= GetWindowLongA(hWnd
, GWL_STYLE
);
831 if (Pos
->flags
& SWP_NOSIZE
) return 0;
832 if ((style
& WS_THICKFRAME
) || ((style
& (WS_POPUP
| WS_CHILD
)) == 0))
834 WinPosGetMinMaxInfo(hWnd
, NULL
, NULL
, &minTrack
, &maxTrack
);
835 Pos
->cx
= min(Pos
->cx
, maxTrack
.x
);
836 Pos
->cy
= min(Pos
->cy
, maxTrack
.y
);
837 if (!(style
& WS_MINIMIZE
))
839 if (Pos
->cx
< minTrack
.x
) Pos
->cx
= minTrack
.x
;
840 if (Pos
->cy
< minTrack
.y
) Pos
->cy
= minTrack
.y
;
845 Pos
->cx
= max(Pos
->cx
, 0);
846 Pos
->cy
= max(Pos
->cy
, 0);
851 /* Undocumented flags. */
852 #define SWP_NOCLIENTMOVE 0x0800
853 #define SWP_NOCLIENTSIZE 0x1000
856 DefWndHandleWindowPosChanged(HWND hWnd
, WINDOWPOS
* Pos
)
860 GetClientRect(hWnd
, &Rect
);
861 MapWindowPoints(hWnd
, (GetWindowLongW(hWnd
, GWL_STYLE
) & WS_CHILD
?
862 GetParent(hWnd
) : NULL
), (LPPOINT
) &Rect
, 2);
864 if (! (Pos
->flags
& SWP_NOCLIENTMOVE
))
866 SendMessageW(hWnd
, WM_MOVE
, 0, MAKELONG(Rect
.left
, Rect
.top
));
869 if (! (Pos
->flags
& SWP_NOCLIENTSIZE
))
871 WPARAM wp
= SIZE_RESTORED
;
876 else if (IsIconic(hWnd
))
880 SendMessageW(hWnd
, WM_SIZE
, wp
,
881 MAKELONG(Rect
.right
- Rect
.left
, Rect
.bottom
- Rect
.top
));
887 /***********************************************************************
890 * Default colors for control painting.
893 DefWndControlColor(HDC hDC
, UINT ctlType
)
895 if (CTLCOLOR_SCROLLBAR
== ctlType
)
897 HBRUSH hb
= GetSysColorBrush(COLOR_SCROLLBAR
);
898 COLORREF bk
= GetSysColor(COLOR_3DHILIGHT
);
899 SetTextColor(hDC
, GetSysColor(COLOR_3DFACE
));
902 /* if COLOR_WINDOW happens to be the same as COLOR_3DHILIGHT
903 * we better use 0x55aa bitmap brush to make scrollbar's background
904 * look different from the window background.
906 if (bk
== GetSysColor(COLOR_WINDOW
))
908 static const WORD wPattern55AA
[] =
910 0x5555, 0xaaaa, 0x5555, 0xaaaa,
911 0x5555, 0xaaaa, 0x5555, 0xaaaa
913 static HBITMAP hPattern55AABitmap
= NULL
;
914 static HBRUSH hPattern55AABrush
= NULL
;
915 if (hPattern55AABrush
== NULL
)
917 hPattern55AABitmap
= CreateBitmap(8, 8, 1, 1, wPattern55AA
);
918 hPattern55AABrush
= CreatePatternBrush(hPattern55AABitmap
);
920 return hPattern55AABrush
;
926 SetTextColor(hDC
, GetSysColor(COLOR_WINDOWTEXT
));
928 if ((CTLCOLOR_EDIT
== ctlType
) || (CTLCOLOR_LISTBOX
== ctlType
))
930 SetBkColor(hDC
, GetSysColor(COLOR_WINDOW
));
934 SetBkColor(hDC
, GetSysColor(COLOR_3DFACE
));
935 return GetSysColorBrush(COLOR_3DFACE
);
938 return GetSysColorBrush(COLOR_WINDOW
);
941 static void DefWndPrint( HWND hwnd
, HDC hdc
, ULONG uFlags
)
946 if ( (uFlags
& PRF_CHECKVISIBLE
) &&
947 !IsWindowVisible(hwnd
) )
951 * Unimplemented flags.
953 if ( (uFlags
& PRF_CHILDREN
) ||
954 (uFlags
& PRF_OWNED
) ||
955 (uFlags
& PRF_NONCLIENT
) )
957 FIXME("WM_PRINT message with unsupported flags\n");
963 if ( uFlags
& PRF_ERASEBKGND
)
964 SendMessageW(hwnd
, WM_ERASEBKGND
, (WPARAM
)hdc
, 0);
969 if ( uFlags
& PRF_CLIENT
)
970 SendMessageW(hwnd
, WM_PRINTCLIENT
, (WPARAM
)hdc
, PRF_CLIENT
);
974 UserSendUiUpdateMsg(HWND hwnd
, LPARAM lParam
)
976 SendMessageW(hwnd
, WM_UPDATEUISTATE
, (WPARAM
)lParam
, 0);
982 DefWndScreenshot(HWND hWnd
)
994 hdc
= GetWindowDC(hWnd
);
995 GetWindowRect(hWnd
, &rect
);
996 w
= rect
.right
- rect
.left
;
997 h
= rect
.bottom
- rect
.top
;
999 hbitmap
= CreateCompatibleBitmap(hdc
, w
, h
);
1000 hdc2
= CreateCompatibleDC(hdc
);
1001 SelectObject(hdc2
, hbitmap
);
1003 BitBlt(hdc2
, 0, 0, w
, h
,
1007 SetClipboardData(CF_BITMAP
, hbitmap
);
1009 ReleaseDC(hWnd
, hdc
);
1010 ReleaseDC(hWnd
, hdc2
);
1019 User32DefWindowProc(HWND hWnd
,
1029 return DefWndNCPaint(hWnd
, (HRGN
)wParam
, -1);
1034 return DefWndNCCalcSize(hWnd
, (BOOL
)wParam
, (RECT
*)lParam
);
1039 return DefWndNCActivate(hWnd
, wParam
);
1045 Point
.x
= GET_X_LPARAM(lParam
);
1046 Point
.y
= GET_Y_LPARAM(lParam
);
1047 return (DefWndNCHitTest(hWnd
, Point
));
1050 case WM_LBUTTONDOWN
:
1051 case WM_RBUTTONDOWN
:
1052 case WM_MBUTTONDOWN
:
1053 iF10Key
= iMenuSysKey
= 0;
1056 case WM_NCLBUTTONDOWN
:
1058 return (DefWndNCLButtonDown(hWnd
, wParam
, lParam
));
1061 case WM_LBUTTONDBLCLK
:
1062 return (DefWndNCLButtonDblClk(hWnd
, HTCLIENT
, lParam
));
1064 case WM_NCLBUTTONDBLCLK
:
1066 return (DefWndNCLButtonDblClk(hWnd
, wParam
, lParam
));
1069 case WM_WINDOWPOSCHANGING
:
1071 return (DefWndHandleWindowPosChanging(hWnd
, (WINDOWPOS
*)lParam
));
1074 case WM_WINDOWPOSCHANGED
:
1076 return (DefWndHandleWindowPosChanged(hWnd
, (WINDOWPOS
*)lParam
));
1079 case WM_NCRBUTTONDOWN
:
1081 /* in Windows, capture is taken when right-clicking on the caption bar */
1082 if (wParam
== HTCAPTION
)
1092 if (hWnd
== GetCapture())
1096 Pt
.x
= GET_X_LPARAM(lParam
);
1097 Pt
.y
= GET_Y_LPARAM(lParam
);
1098 ClientToScreen(hWnd
, &Pt
);
1099 lParam
= MAKELPARAM(Pt
.x
, Pt
.y
);
1102 SendMessageW(hWnd
, WM_CONTEXTMENU
, (WPARAM
)hWnd
, lParam
);
1106 SendMessageA(hWnd
, WM_CONTEXTMENU
, (WPARAM
)hWnd
, lParam
);
1111 case WM_NCRBUTTONUP
:
1113 * FIXME : we must NOT send WM_CONTEXTMENU on a WM_NCRBUTTONUP (checked
1114 * in Windows), but what _should_ we do? According to MSDN :
1115 * "If it is appropriate to do so, the system sends the WM_SYSCOMMAND
1116 * message to the window". When is it appropriate?
1120 case WM_CONTEXTMENU
:
1122 if (GetWindowLongW(hWnd
, GWL_STYLE
) & WS_CHILD
)
1126 SendMessageW(GetParent(hWnd
), Msg
, wParam
, lParam
);
1130 SendMessageA(GetParent(hWnd
), WM_CONTEXTMENU
, wParam
, lParam
);
1139 Style
= GetWindowLongW(hWnd
, GWL_STYLE
);
1141 Pt
.x
= GET_X_LPARAM(lParam
);
1142 Pt
.y
= GET_Y_LPARAM(lParam
);
1143 if (Style
& WS_CHILD
)
1145 ScreenToClient(GetParent(hWnd
), &Pt
);
1148 HitCode
= DefWndNCHitTest(hWnd
, Pt
);
1150 if (HitCode
== HTCAPTION
|| HitCode
== HTSYSMENU
)
1155 if((SystemMenu
= GetSystemMenu(hWnd
, FALSE
)))
1157 MenuInitSysMenuPopup(SystemMenu
, GetWindowLongW(hWnd
, GWL_STYLE
),
1158 GetClassLongW(hWnd
, GCL_STYLE
), HitCode
);
1160 if(HitCode
== HTCAPTION
)
1161 Flags
= TPM_LEFTBUTTON
| TPM_RIGHTBUTTON
;
1163 Flags
= TPM_LEFTBUTTON
;
1165 TrackPopupMenu(SystemMenu
, Flags
,
1166 Pt
.x
, Pt
.y
, 0, hWnd
, NULL
);
1175 DefWndPrint(hWnd
, (HDC
)wParam
, lParam
);
1183 HDC hDC
= BeginPaint(hWnd
, &Ps
);
1187 if (GetWindowLongW(hWnd
, GWL_STYLE
) & WS_MINIMIZE
&&
1188 (hIcon
= (HICON
)GetClassLongW(hWnd
, GCL_HICON
)) != NULL
)
1192 GetClientRect(hWnd
, &ClientRect
);
1193 x
= (ClientRect
.right
- ClientRect
.left
-
1194 GetSystemMetrics(SM_CXICON
)) / 2;
1195 y
= (ClientRect
.bottom
- ClientRect
.top
-
1196 GetSystemMetrics(SM_CYICON
)) / 2;
1197 DrawIcon(hDC
, x
, y
, hIcon
);
1199 EndPaint(hWnd
, &Ps
);
1207 hRgn
= CreateRectRgn(0, 0, 0, 0);
1208 if (GetUpdateRgn(hWnd
, hRgn
, FALSE
) != NULLREGION
)
1210 RedrawWindow(hWnd
, NULL
, hRgn
,
1211 RDW_ERASENOW
| RDW_ERASE
| RDW_FRAME
|
1220 DefWndSetRedraw(hWnd
, wParam
);
1226 DestroyWindow(hWnd
);
1230 case WM_MOUSEACTIVATE
:
1232 if (GetWindowLongW(hWnd
, GWL_STYLE
) & WS_CHILD
)
1237 Ret
= SendMessageW(GetParent(hWnd
), WM_MOUSEACTIVATE
,
1242 Ret
= SendMessageA(GetParent(hWnd
), WM_MOUSEACTIVATE
,
1250 return ((LOWORD(lParam
) >= HTCLIENT
) ? MA_ACTIVATE
: MA_NOACTIVATE
);
1255 /* Check if the window is minimized. */
1256 if (LOWORD(wParam
) != WA_INACTIVE
&&
1257 !(GetWindowLongW(hWnd
, GWL_STYLE
) & WS_MINIMIZE
))
1266 if (GetWindowLongW(hWnd
, GWL_STYLE
) & WS_CHILD
)
1270 return (SendMessageW(GetParent(hWnd
), WM_MOUSEWHEEL
,
1275 return (SendMessageA(GetParent(hWnd
), WM_MOUSEWHEEL
,
1283 case WM_ICONERASEBKGND
:
1286 HBRUSH hBrush
= (HBRUSH
)GetClassLongW(hWnd
, GCL_HBRBACKGROUND
);
1292 if (GetClassLongW(hWnd
, GCL_STYLE
) & CS_PARENTDC
)
1294 /* can't use GetClipBox with a parent DC or we fill the whole parent */
1295 GetClientRect(hWnd
, &Rect
);
1296 DPtoLP((HDC
)wParam
, (LPPOINT
)&Rect
, 2);
1300 GetClipBox((HDC
)wParam
, &Rect
);
1302 FillRect((HDC
)wParam
, &Rect
, hBrush
);
1306 case WM_CTLCOLORMSGBOX
:
1307 case WM_CTLCOLOREDIT
:
1308 case WM_CTLCOLORLISTBOX
:
1309 case WM_CTLCOLORBTN
:
1310 case WM_CTLCOLORDLG
:
1311 case WM_CTLCOLORSTATIC
:
1312 case WM_CTLCOLORSCROLLBAR
:
1313 return (LRESULT
) DefWndControlColor((HDC
)wParam
, Msg
- WM_CTLCOLORMSGBOX
);
1316 return (LRESULT
) DefWndControlColor((HDC
)wParam
, HIWORD(lParam
));
1320 ULONG Style
= GetWindowLongW(hWnd
, GWL_STYLE
);
1322 if (Style
& WS_CHILD
)
1324 if (LOWORD(lParam
) < HTLEFT
|| LOWORD(lParam
) > HTBOTTOMRIGHT
)
1329 bResult
= SendMessageW(GetParent(hWnd
), WM_SETCURSOR
,
1334 bResult
= SendMessageA(GetParent(hWnd
), WM_SETCURSOR
,
1343 return (DefWndHandleSetCursor(hWnd
, wParam
, lParam
, Style
));
1347 return (DefWndHandleSysCommand(hWnd
, wParam
, lParam
));
1350 if(wParam
== VK_F10
) iF10Key
= VK_F10
;
1353 /* FIXME: This is also incomplete. */
1356 if (HIWORD(lParam
) & KEYDATA_ALT
)
1358 /* if( HIWORD(lParam) & ~KEYDATA_PREVSTATE ) */
1359 if ( (wParam
== VK_MENU
|| wParam
== VK_LMENU
1360 || wParam
== VK_RMENU
) && !iMenuSysKey
)
1367 if (wParam
== VK_F4
) /* Try to close the window */
1369 HWND top
= GetAncestor(hWnd
, GA_ROOT
);
1370 if (!(GetClassLongW(top
, GCL_STYLE
) & CS_NOCLOSE
))
1373 PostMessageW(top
, WM_SYSCOMMAND
, SC_CLOSE
, 0);
1375 PostMessageA(top
, WM_SYSCOMMAND
, SC_CLOSE
, 0);
1378 else if (wParam
== VK_SNAPSHOT
)
1381 while (GetParent(hwnd
) != NULL
)
1383 hwnd
= GetParent(hwnd
);
1385 DefWndScreenshot(hwnd
);
1388 else if( wParam
== VK_F10
)
1390 else if( wParam
== VK_ESCAPE
&& (GetKeyState(VK_SHIFT
) & 0x8000))
1391 SendMessageW( hWnd
, WM_SYSCOMMAND
, SC_KEYMENU
, ' ' );
1398 /* Press and release F10 or ALT */
1399 if (((wParam
== VK_MENU
|| wParam
== VK_LMENU
|| wParam
== VK_RMENU
)
1400 && iMenuSysKey
) || ((wParam
== VK_F10
) && iF10Key
))
1401 SendMessageW( GetAncestor( hWnd
, GA_ROOT
), WM_SYSCOMMAND
, SC_KEYMENU
, 0L );
1402 iMenuSysKey
= iF10Key
= 0;
1409 if (wParam
== '\r' && IsIconic(hWnd
))
1411 PostMessageW( hWnd
, WM_SYSCOMMAND
, SC_RESTORE
, 0L );
1414 if ((HIWORD(lParam
) & KEYDATA_ALT
) && wParam
)
1416 if (wParam
== '\t' || wParam
== '\x1b') break;
1417 if (wParam
== ' ' && (GetWindowLongW( hWnd
, GWL_STYLE
) & WS_CHILD
))
1418 SendMessageW( GetParent(hWnd
), Msg
, wParam
, lParam
);
1420 SendMessageW( hWnd
, WM_SYSCOMMAND
, SC_KEYMENU
, wParam
);
1422 else /* check for Ctrl-Esc */
1423 if (wParam
!= '\x1b') MessageBeep(0);
1429 if (lParam
) // Call when it is necessary.
1430 NtUserMessageCall( hWnd
, Msg
, wParam
, lParam
, 0, NUMC_DEFWINDOWPROC
, FALSE
);
1437 /* FIXME: Check for a desktop. */
1438 if (!(GetWindowLongW( hWnd
, GWL_STYLE
) & WS_CHILD
)) EndMenu();
1439 if (GetCapture() == hWnd
)
1453 case WM_QUERYDROPOBJECT
:
1455 if (GetWindowLongW(hWnd
, GWL_EXSTYLE
) & WS_EX_ACCEPTFILES
)
1462 case WM_QUERYDRAGICON
:
1467 hIcon
= (HICON
)GetClassLongW(hWnd
, GCL_HICON
);
1470 return ((LRESULT
)hIcon
);
1472 for (Len
= 1; Len
< 64; Len
++)
1474 if ((hIcon
= LoadIconW(NULL
, MAKEINTRESOURCEW(Len
))) != NULL
)
1476 return((LRESULT
)hIcon
);
1479 return ((LRESULT
)LoadIconW(0, IDI_APPLICATION
));
1482 /* FIXME: WM_ISACTIVEICON */
1484 case WM_NOTIFYFORMAT
:
1486 if (lParam
== NF_QUERY
)
1487 return IsWindowUnicode(hWnd
) ? NFR_UNICODE
: NFR_ANSI
;
1493 INT Index
= (wParam
!= 0) ? GCL_HICON
: GCL_HICONSM
;
1494 HICON hOldIcon
= (HICON
)GetClassLongW(hWnd
, Index
);
1495 SetClassLongW(hWnd
, Index
, lParam
);
1496 SetWindowPos(hWnd
, 0, 0, 0, 0, 0,
1497 SWP_FRAMECHANGED
| SWP_NOSIZE
| SWP_NOMOVE
|
1498 SWP_NOACTIVATE
| SWP_NOZORDER
);
1499 return ((LRESULT
)hOldIcon
);
1504 INT Index
= (wParam
== ICON_BIG
) ? GCL_HICON
: GCL_HICONSM
;
1505 return (GetClassLongW(hWnd
, Index
));
1512 SendMessageW(GetParent(hWnd
), Msg
, wParam
, lParam
);
1516 SendMessageA(GetParent(hWnd
), Msg
, wParam
, lParam
);
1523 THRDCARETINFO CaretInfo
;
1526 case 0xffff: /* Caret timer */
1527 /* switch showing byte in win32k and get information about the caret */
1528 if(NtUserSwitchCaretShowing(&CaretInfo
) && (CaretInfo
.hWnd
== hWnd
))
1530 DrawCaret(hWnd
, &CaretInfo
);
1538 case WM_QUERYENDSESSION
:
1543 case WM_INPUTLANGCHANGEREQUEST
:
1547 if(wParam
& INPUTLANGCHANGE_BACKWARD
1548 && wParam
& INPUTLANGCHANGE_FORWARD
)
1553 //FIXME: What to do with INPUTLANGCHANGE_SYSCHARSET ?
1555 if(wParam
& INPUTLANGCHANGE_BACKWARD
) NewHkl
= (HKL
) HKL_PREV
;
1556 else if(wParam
& INPUTLANGCHANGE_FORWARD
) NewHkl
= (HKL
) HKL_NEXT
;
1557 else NewHkl
= (HKL
) lParam
;
1559 NtUserActivateKeyboardLayout(NewHkl
, 0);
1564 case WM_INPUTLANGCHANGE
:
1566 //FIXME: What to do?
1571 if (wParam
) PostQuitMessage(0);
1574 case WM_QUERYUISTATE
:
1577 PWINDOW Wnd
= ValidateHwnd(hWnd
);
1581 Ret
|= UISF_HIDEFOCUS
;
1583 Ret
|= UISF_HIDEACCEL
;
1588 case WM_CHANGEUISTATE
:
1590 BOOL AlwaysShowCues
= TRUE
;
1591 WORD Action
= LOWORD(wParam
);
1592 WORD Flags
= HIWORD(wParam
);
1595 SystemParametersInfoW(SPI_GETKEYBOARDCUES
, 0, &AlwaysShowCues
, 0);
1599 Wnd
= ValidateHwnd(hWnd
);
1600 if (!Wnd
|| lParam
!= 0)
1603 if (Flags
& ~(UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
))
1606 if (Flags
& UISF_ACTIVE
)
1608 WARN("WM_CHANGEUISTATE does not yet support UISF_ACTIVE!\n");
1611 if (Action
== UIS_INITIALIZE
)
1613 PDESKTOP Desk
= GetThreadDesktopInfo();
1617 Action
= Desk
->LastInputWasKbd
? UIS_CLEAR
: UIS_SET
;
1618 Flags
= UISF_HIDEFOCUS
| UISF_HIDEACCEL
;
1620 /* We need to update wParam in case we need to send out messages */
1621 wParam
= MAKEWPARAM(Action
, Flags
);
1627 /* See if we actually need to change something */
1628 if ((Flags
& UISF_HIDEFOCUS
) && !Wnd
->HideFocus
)
1630 if ((Flags
& UISF_HIDEACCEL
) && !Wnd
->HideAccel
)
1633 /* Don't need to do anything... */
1637 /* See if we actually need to change something */
1638 if ((Flags
& UISF_HIDEFOCUS
) && Wnd
->HideFocus
)
1640 if ((Flags
& UISF_HIDEACCEL
) && Wnd
->HideAccel
)
1643 /* Don't need to do anything... */
1647 WARN("WM_CHANGEUISTATE: Unsupported Action 0x%x\n", Action
);
1651 if ((Wnd
->Style
& WS_CHILD
) && Wnd
->Parent
!= NULL
)
1653 /* We're a child window and we need to pass this message down until
1654 we reach the root */
1655 hWnd
= UserHMGetHandle((PWINDOW
)DesktopPtrToUser(Wnd
->Parent
));
1659 /* We're a top level window, we need to change the UI state */
1660 Msg
= WM_UPDATEUISTATE
;
1664 return SendMessageW(hWnd
, Msg
, wParam
, lParam
);
1666 return SendMessageA(hWnd
, Msg
, wParam
, lParam
);
1669 case WM_UPDATEUISTATE
:
1672 BOOL AlwaysShowCues
= TRUE
;
1673 WORD Action
= LOWORD(wParam
);
1674 WORD Flags
= HIWORD(wParam
);
1677 SystemParametersInfoW(SPI_GETKEYBOARDCUES
, 0, &AlwaysShowCues
, 0);
1681 Wnd
= ValidateHwnd(hWnd
);
1682 if (!Wnd
|| lParam
!= 0)
1685 if (Flags
& ~(UISF_HIDEFOCUS
| UISF_HIDEACCEL
| UISF_ACTIVE
))
1688 if (Flags
& UISF_ACTIVE
)
1690 WARN("WM_UPDATEUISTATE does not yet support UISF_ACTIVE!\n");
1693 if (Action
== UIS_INITIALIZE
)
1695 PDESKTOP Desk
= GetThreadDesktopInfo();
1699 Action
= Desk
->LastInputWasKbd
? UIS_CLEAR
: UIS_SET
;
1700 Flags
= UISF_HIDEFOCUS
| UISF_HIDEACCEL
;
1702 /* We need to update wParam for broadcasting the update */
1703 wParam
= MAKEWPARAM(Action
, Flags
);
1709 /* See if we actually need to change something */
1710 if ((Flags
& UISF_HIDEFOCUS
) && !Wnd
->HideFocus
)
1712 if ((Flags
& UISF_HIDEACCEL
) && !Wnd
->HideAccel
)
1715 /* Don't need to do anything... */
1720 /* See if we actually need to change something */
1721 if ((Flags
& UISF_HIDEFOCUS
) && Wnd
->HideFocus
)
1723 if ((Flags
& UISF_HIDEACCEL
) && Wnd
->HideAccel
)
1726 /* Don't need to do anything... */
1731 WARN("WM_UPDATEUISTATE: Unsupported Action 0x%x\n", Action
);
1735 /* Pack the information and call win32k */
1738 if (!NtUserCallTwoParam((DWORD
)hWnd
, (DWORD
)Flags
| ((DWORD
)Action
<< 3), TWOPARAM_ROUTINE_ROS_UPDATEUISTATE
))
1742 /* Always broadcast the update to all children */
1743 EnumChildWindows(hWnd
,
1744 UserSendUiUpdateMsg
,
1756 DefWindowProcA(HWND hWnd
,
1764 SPY_EnterMessage(SPY_DEFWNDPROC
, hWnd
, Msg
, wParam
, lParam
);
1769 ANSI_STRING AnsiString
;
1770 UNICODE_STRING UnicodeString
;
1771 LPCREATESTRUCTA cs
= (LPCREATESTRUCTA
)lParam
;
1772 /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
1773 * may have child window IDs instead of window name */
1777 RtlInitAnsiString(&AnsiString
, (LPSTR
)cs
->lpszName
);
1778 RtlAnsiStringToUnicodeString(&UnicodeString
, &AnsiString
, TRUE
);
1779 NtUserDefSetText(hWnd
, &UnicodeString
);
1780 RtlFreeUnicodeString(&UnicodeString
);
1783 NtUserDefSetText(hWnd
, NULL
);
1789 case WM_GETTEXTLENGTH
:
1794 Wnd
= ValidateHwnd(hWnd
);
1795 if (Wnd
!= NULL
&& Wnd
->WindowName
.Length
!= 0)
1797 buf
= DesktopPtrToUser(Wnd
->WindowName
.Buffer
);
1799 NT_SUCCESS(RtlUnicodeToMultiByteSize(&len
,
1801 Wnd
->WindowName
.Length
)))
1803 Result
= (LRESULT
)len
;
1812 PSTR outbuf
= (PSTR
)lParam
;
1815 Wnd
= ValidateHwnd(hWnd
);
1816 if (Wnd
!= NULL
&& wParam
!= 0)
1818 if (Wnd
->WindowName
.Buffer
!= NULL
)
1819 buf
= DesktopPtrToUser(Wnd
->WindowName
.Buffer
);
1825 if (Wnd
->WindowName
.Length
!= 0)
1827 copy
= min(Wnd
->WindowName
.Length
/ sizeof(WCHAR
), wParam
- 1);
1828 Result
= WideCharToMultiByte(CP_ACP
,
1836 outbuf
[Result
] = '\0';
1847 ANSI_STRING AnsiString
;
1848 UNICODE_STRING UnicodeString
;
1852 RtlInitAnsiString(&AnsiString
, (LPSTR
)lParam
);
1853 RtlAnsiStringToUnicodeString(&UnicodeString
, &AnsiString
, TRUE
);
1854 NtUserDefSetText(hWnd
, &UnicodeString
);
1855 RtlFreeUnicodeString(&UnicodeString
);
1858 NtUserDefSetText(hWnd
, NULL
);
1860 if ((GetWindowLongW(hWnd
, GWL_STYLE
) & WS_CAPTION
) == WS_CAPTION
)
1862 DefWndNCPaint(hWnd
, (HRGN
)1, -1);
1869 /* FIXME: Implement these. */
1871 case WM_IME_KEYDOWN
:
1873 case WM_IME_STARTCOMPOSITION
:
1874 case WM_IME_COMPOSITION
:
1875 case WM_IME_ENDCOMPOSITION
:
1877 case WM_IME_SETCONTEXT
:
1878 FIXME("FIXME: WM_IME_* conversion isn't implemented yet!");
1881 Result
= User32DefWindowProc(hWnd
, Msg
, wParam
, lParam
, FALSE
);
1884 SPY_ExitMessage(SPY_RESULT_DEFWND
, hWnd
, Msg
, Result
, wParam
, lParam
);
1890 DefWindowProcW(HWND hWnd
,
1898 SPY_EnterMessage(SPY_DEFWNDPROC
, hWnd
, Msg
, wParam
, lParam
);
1903 UNICODE_STRING UnicodeString
;
1904 LPCREATESTRUCTW cs
= (LPCREATESTRUCTW
)lParam
;
1905 /* check for string, as static icons, bitmaps (SS_ICON, SS_BITMAP)
1906 * may have child window IDs instead of window name */
1909 RtlInitUnicodeString(&UnicodeString
, (LPWSTR
)cs
->lpszName
);
1911 NtUserDefSetText( hWnd
, (cs
->lpszName
? &UnicodeString
: NULL
));
1916 case WM_GETTEXTLENGTH
:
1921 Wnd
= ValidateHwnd(hWnd
);
1922 if (Wnd
!= NULL
&& Wnd
->WindowName
.Length
!= 0)
1924 buf
= DesktopPtrToUser(Wnd
->WindowName
.Buffer
);
1926 NT_SUCCESS(RtlUnicodeToMultiByteSize(&len
,
1928 Wnd
->WindowName
.Length
)))
1930 Result
= (LRESULT
)len
;
1939 PWSTR outbuf
= (PWSTR
)lParam
;
1941 Wnd
= ValidateHwnd(hWnd
);
1942 if (Wnd
!= NULL
&& wParam
!= 0)
1944 if (Wnd
->WindowName
.Buffer
!= NULL
)
1945 buf
= DesktopPtrToUser(Wnd
->WindowName
.Buffer
);
1951 if (Wnd
->WindowName
.Length
!= 0)
1953 Result
= min(Wnd
->WindowName
.Length
/ sizeof(WCHAR
), wParam
- 1);
1954 RtlCopyMemory(outbuf
,
1956 Result
* sizeof(WCHAR
));
1957 outbuf
[Result
] = L
'\0';
1968 UNICODE_STRING UnicodeString
;
1971 RtlInitUnicodeString(&UnicodeString
, (LPWSTR
)lParam
);
1973 NtUserDefSetText(hWnd
, (lParam
? &UnicodeString
: NULL
));
1975 if ((GetWindowLongW(hWnd
, GWL_STYLE
) & WS_CAPTION
) == WS_CAPTION
)
1977 DefWndNCPaint(hWnd
, (HRGN
)1, -1);
1985 SendMessageW(hWnd
, WM_CHAR
, wParam
, lParam
);
1990 case WM_IME_SETCONTEXT
:
1993 FIXME("FIXME: WM_IME_SETCONTEXT is not implemented!");
1999 Result
= User32DefWindowProc(hWnd
, Msg
, wParam
, lParam
, TRUE
);
2001 SPY_ExitMessage(SPY_RESULT_DEFWND
, hWnd
, Msg
, Result
, wParam
, lParam
);