2 * Unit tests for window message handling
4 * Copyright 1999 Ove Kaaven
5 * Copyright 2003 Dimitrie O. Paun
6 * Copyright 2004, 2005 Dmitry Timoshkov
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
23 //#define _WIN32_WINNT 0x0600 /* For WM_CHANGEUISTATE,QS_RAWINPUT,WM_DWMxxxx */
24 //#define WINVER 0x0600 /* for WM_GETTITLEBARINFOEX */
36 #include "wine/test.h"
38 #define MDI_FIRST_CHILD_ID 2004
40 /* undocumented SWP flags - from SDK 3.1 */
41 #define SWP_NOCLIENTSIZE 0x0800
42 #define SWP_NOCLIENTMOVE 0x1000
43 #define SWP_STATECHANGED 0x8000
45 #define SW_NORMALNA 0xCC /* undoc. flag in MinMaximize */
48 #define WM_KEYF1 0x004d
52 #define WM_SYSTIMER 0x0118
55 #define WND_PARENT_ID 1
56 #define WND_POPUP_ID 2
57 #define WND_CHILD_ID 3
59 #ifndef WM_LBTRACKPOINT
60 #define WM_LBTRACKPOINT 0x0131
63 /* encoded DRAWITEMSTRUCT into an LPARAM */
70 UINT type
: 4; /* ODT_* flags */
71 UINT ctl_id
: 4; /* Control ID */
72 UINT item_id
: 4; /* Menu item ID */
73 UINT action
: 4; /* ODA_* flags */
74 UINT state
: 16; /* ODS_* flags */
80 static BOOL test_DestroyWindow_flag
;
81 static HWINEVENTHOOK hEvent_hook
;
82 static HHOOK hKBD_hook
;
83 static HHOOK hCBT_hook
;
84 static DWORD cbt_hook_thread_id
;
86 static const WCHAR testWindowClassW
[] =
87 { 'T','e','s','t','W','i','n','d','o','w','C','l','a','s','s','W',0 };
90 FIXME: add tests for these
91 Window Edge Styles (Win31/Win95/98 look), in order of precedence:
92 WS_EX_DLGMODALFRAME: double border, WS_CAPTION allowed
93 WS_THICKFRAME: thick border
94 WS_DLGFRAME: double border, WS_CAPTION not allowed (but possibly shown anyway)
95 WS_BORDER (default for overlapped windows): single black border
96 none (default for child (and popup?) windows): no border
114 UINT message
; /* the WM_* code */
115 msg_flags_t flags
; /* message props */
116 WPARAM wParam
; /* expected value of wParam */
117 LPARAM lParam
; /* expected value of lParam */
118 WPARAM wp_mask
; /* mask for wParam checks */
119 LPARAM lp_mask
; /* mask for lParam checks */
122 struct recvd_message
{
123 UINT message
; /* the WM_* code */
124 msg_flags_t flags
; /* message props */
125 HWND hwnd
; /* window that received the message */
126 WPARAM wParam
; /* expected value of wParam */
127 LPARAM lParam
; /* expected value of lParam */
128 int line
; /* source line where logged */
129 const char *descr
; /* description for trace output */
130 char output
[512]; /* trace output */
133 /* Empty message sequence */
134 static const struct message WmEmptySeq
[] =
138 /* CreateWindow (for overlapped window, not initially visible) (16/32) */
139 static const struct message WmCreateOverlappedSeq
[] = {
140 { HCBT_CREATEWND
, hook
},
141 { WM_GETMINMAXINFO
, sent
},
142 { WM_NCCREATE
, sent
},
143 { WM_NCCALCSIZE
, sent
|wparam
, 0 },
144 { 0x0093, sent
|defwinproc
|optional
},
145 { 0x0094, sent
|defwinproc
|optional
},
146 { EVENT_OBJECT_REORDER
, winevent_hook
|wparam
|lparam
, 0, 0 },
148 { EVENT_OBJECT_CREATE
, winevent_hook
|wparam
|lparam
, 0, 0 },
151 /* SetWindowPos(SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE)
152 * for a not visible overlapped window.
154 static const struct message WmSWP_ShowOverlappedSeq
[] = {
155 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
},
156 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
157 { WM_NCPAINT
, sent
|wparam
|optional
, 1 },
158 { WM_GETTEXT
, sent
|defwinproc
|optional
},
159 { WM_ERASEBKGND
, sent
|optional
},
160 { HCBT_ACTIVATE
, hook
},
161 { EVENT_SYSTEM_FOREGROUND
, winevent_hook
|wparam
|lparam
, 0, 0 },
162 { WM_NOTIFYFORMAT
, sent
|optional
},
163 { WM_QUERYUISTATE
, sent
|optional
},
164 { WM_QUERYNEWPALETTE
, sent
|wparam
|lparam
|optional
, 0, 0 },
165 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_NOSIZE
|SWP_NOMOVE
}, /* Win9x: SWP_NOSENDCHANGING */
166 { WM_ACTIVATEAPP
, sent
|wparam
, 1 },
167 { WM_NCACTIVATE
, sent
},
168 { WM_GETTEXT
, sent
|defwinproc
|optional
},
169 { WM_ACTIVATE
, sent
|wparam
, 1 },
170 { HCBT_SETFOCUS
, hook
},
171 { WM_IME_SETCONTEXT
, sent
|wparam
|defwinproc
|optional
, 1 },
172 { WM_IME_NOTIFY
, sent
|wparam
|defwinproc
|optional
, 2 },
173 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
174 { WM_SETFOCUS
, sent
|wparam
|defwinproc
, 0 },
175 { WM_GETTEXT
, sent
|optional
},
176 { WM_NCPAINT
, sent
|wparam
|optional
, 1 },
177 { WM_GETTEXT
, sent
|defwinproc
|optional
},
178 { WM_ERASEBKGND
, sent
|optional
},
179 /* Win9x adds SWP_NOZORDER below */
180 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
181 { WM_GETTEXT
, sent
|optional
},
182 { WM_NCCALCSIZE
, sent
|wparam
|optional
, 1 },
183 { WM_NCPAINT
, sent
|wparam
|optional
, 1 },
184 { WM_ERASEBKGND
, sent
|optional
},
185 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
186 { WM_SYNCPAINT
, sent
|optional
},
187 { WM_GETTITLEBARINFOEX
, sent
|optional
},
188 { WM_PAINT
, sent
|optional
},
189 { WM_NCPAINT
, sent
|beginpaint
|optional
},
190 { WM_GETTEXT
, sent
|beginpaint
|defwinproc
|optional
},
191 { WM_ERASEBKGND
, sent
|beginpaint
|optional
},
194 /* SetWindowPos(SWP_HIDEWINDOW|SWP_NOSIZE|SWP_NOMOVE)
195 * for a visible overlapped window.
197 static const struct message WmSWP_HideOverlappedSeq
[] = {
198 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
},
199 { EVENT_OBJECT_HIDE
, winevent_hook
|wparam
|lparam
, 0, 0 },
200 { HCBT_ACTIVATE
, hook
|optional
},
201 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_NOSIZE
|SWP_NOMOVE
},
202 { WM_ACTIVATEAPP
, sent
|wparam
|optional
, 1 },
203 { WM_NCACTIVATE
, sent
|optional
},
204 { WM_ACTIVATE
, sent
|optional
},
205 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
209 /* SetWindowPos(SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE)
210 * for a visible overlapped window.
212 static const struct message WmSWP_ResizeSeq
[] = {
213 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_NOACTIVATE
|SWP_NOMOVE
},
214 { WM_GETMINMAXINFO
, sent
|defwinproc
},
215 { WM_NCCALCSIZE
, sent
|wparam
|optional
, TRUE
},
216 { WM_NCPAINT
, sent
|optional
},
217 { WM_GETTEXT
, sent
|defwinproc
|optional
},
218 { WM_ERASEBKGND
, sent
|optional
},
219 { WM_WINDOWPOSCHANGED
, sent
|wparam
|optional
, SWP_NOACTIVATE
|SWP_NOMOVE
|SWP_NOCLIENTMOVE
},
220 { WM_SIZE
, sent
|defwinproc
|optional
},
221 { WM_NCCALCSIZE
, sent
|wparam
|optional
, TRUE
},
222 { WM_NCPAINT
, sent
|optional
},
223 { WM_GETTEXT
, sent
|defwinproc
|optional
},
224 { WM_ERASEBKGND
, sent
|optional
},
225 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
226 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
|optional
, 0, 0 }, /* XP sends a duplicate */
230 /* SetWindowPos(SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE)
231 * for a visible popup window.
233 static const struct message WmSWP_ResizePopupSeq
[] = {
234 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_NOACTIVATE
|SWP_NOMOVE
},
235 { WM_GETMINMAXINFO
, sent
|defwinproc
|optional
}, /* Win9x */
236 { WM_NCCALCSIZE
, sent
|wparam
|optional
, TRUE
},
237 { WM_NCPAINT
, sent
|optional
},
238 { WM_GETTEXT
, sent
|defwinproc
|optional
},
239 { WM_ERASEBKGND
, sent
|optional
},
240 { WM_WINDOWPOSCHANGED
, sent
|wparam
|optional
, SWP_NOACTIVATE
|SWP_NOMOVE
|SWP_NOCLIENTMOVE
},
241 { WM_SIZE
, sent
|defwinproc
|wparam
|optional
, SIZE_RESTORED
},
242 { WM_NCCALCSIZE
, sent
|wparam
|optional
, TRUE
},
243 { WM_NCPAINT
, sent
|optional
},
244 { WM_GETTEXT
, sent
|defwinproc
|optional
},
245 { WM_ERASEBKGND
, sent
|optional
},
246 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
250 /* SetWindowPos(SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOSIZE)
251 * for a visible overlapped window.
253 static const struct message WmSWP_MoveSeq
[] = {
254 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_NOACTIVATE
|SWP_NOSIZE
},
255 { WM_NCPAINT
, sent
|optional
},
256 { WM_GETTEXT
, sent
|defwinproc
|optional
},
257 { WM_ERASEBKGND
, sent
|optional
},
258 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOCLIENTSIZE
},
259 { WM_MOVE
, sent
|defwinproc
|wparam
, 0 },
260 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
263 /* Resize with SetWindowPos(SWP_NOZORDER)
264 * for a visible overlapped window
265 * SWP_NOZORDER is stripped by the logging code
267 static const struct message WmSWP_ResizeNoZOrder
[] = {
268 { WM_WINDOWPOSCHANGING
, sent
|wparam
, /*SWP_NOZORDER|*/SWP_NOACTIVATE
},
269 { WM_GETMINMAXINFO
, sent
|defwinproc
},
270 { WM_NCCALCSIZE
, sent
|wparam
|optional
, 1 },
271 { WM_NCPAINT
, sent
|optional
},
272 { WM_GETTEXT
, sent
|defwinproc
|optional
},
273 { WM_ERASEBKGND
, sent
|optional
},
274 { WM_WINDOWPOSCHANGED
, sent
|wparam
|optional
, /*SWP_NOZORDER|*/SWP_NOACTIVATE
, 0,
275 SWP_NOMOVE
|SWP_NOCLIENTMOVE
|SWP_NOSIZE
|SWP_NOCLIENTSIZE
},
276 { WM_MOVE
, sent
|defwinproc
|optional
},
277 { WM_SIZE
, sent
|defwinproc
|optional
},
278 { WM_NCCALCSIZE
, sent
|wparam
|optional
, 1 }, /* Win9x doesn't send it */
279 { WM_NCPAINT
, sent
|optional
}, /* Win9x doesn't send it */
280 { WM_GETTEXT
, sent
|defwinproc
|optional
}, /* Win9x doesn't send it */
281 { WM_ERASEBKGND
, sent
|optional
}, /* Win9x doesn't send it */
282 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
283 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
287 /* Switch visible mdi children */
288 static const struct message WmSwitchChild
[] = {
289 /* Switch MDI child */
290 { WM_MDIACTIVATE
, sent
},/* in the MDI client */
291 { WM_WINDOWPOSCHANGING
, sent
|wparam
,SWP_NOSIZE
|SWP_NOMOVE
},/* in the 1st MDI child */
292 { EVENT_OBJECT_REORDER
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
293 { WM_CHILDACTIVATE
, sent
},/* in the 1st MDI child */
294 /* Deactivate 2nd MDI child */
295 { WM_NCACTIVATE
, sent
|wparam
|defwinproc
, 0 }, /* in the 2nd MDI child */
296 { WM_MDIACTIVATE
, sent
|defwinproc
}, /* in the 2nd MDI child */
297 { HCBT_MINMAX
, hook
|lparam
, 0, SW_MAXIMIZE
},
298 /* Preparing for maximize and maximize the 1st MDI child */
299 { WM_GETMINMAXINFO
, sent
|defwinproc
}, /* in the 1st MDI child */
300 { WM_WINDOWPOSCHANGING
, sent
|wparam
|defwinproc
, SWP_FRAMECHANGED
|SWP_STATECHANGED
}, /* in the 1st MDI child */
301 { WM_NCCALCSIZE
, sent
|wparam
|defwinproc
, 1 }, /* in the 1st MDI child */
302 { WM_CHILDACTIVATE
, sent
|defwinproc
}, /* in the 1st MDI child */
303 { WM_WINDOWPOSCHANGED
, sent
|wparam
|defwinproc
, SWP_FRAMECHANGED
|SWP_NOMOVE
|SWP_NOCLIENTMOVE
|SWP_STATECHANGED
}, /* in the 1st MDI child */
304 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_MAXIMIZED
}, /* in the 1st MDI child */
305 /* Lock redraw 2nd MDI child */
306 { WM_SETREDRAW
, sent
|wparam
|defwinproc
, 0 }, /* in the 2nd MDI child */
307 { HCBT_MINMAX
, hook
|lparam
, 0, SW_NORMALNA
},
308 /* Restore 2nd MDI child */
309 { WM_WINDOWPOSCHANGING
, sent
|wparam
|defwinproc
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_FRAMECHANGED
|SWP_STATECHANGED
},/* in the 2nd MDI child */
310 { WM_NCCALCSIZE
, sent
|wparam
|defwinproc
, 1 },/* in the 2nd MDI child */
311 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* in the 2nd MDI child */
312 { WM_WINDOWPOSCHANGED
, sent
|wparam
|defwinproc
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_FRAMECHANGED
|SWP_NOMOVE
|SWP_NOCLIENTMOVE
|SWP_STATECHANGED
}, /* in the 2nd MDI child */
313 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_RESTORED
}, /* in the 2nd MDI child */
314 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* in the 2nd MDI child */
315 /* Redraw 2nd MDI child */
316 { WM_SETREDRAW
, sent
|wparam
|defwinproc
, 1 },/* in the 2nd MDI child */
317 /* Redraw MDI frame */
318 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_NOACTIVATE
|SWP_FRAMECHANGED
|SWP_NOSIZE
|SWP_NOMOVE
},/* in MDI frame */
319 { WM_NCCALCSIZE
, sent
|wparam
, 1 },/* in MDI frame */
320 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_NOACTIVATE
|SWP_FRAMECHANGED
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
}, /* in MDI frame */
321 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* in MDI frame */
322 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* in the 1st MDI child */
323 { WM_WINDOWPOSCHANGING
, sent
|wparam
|defwinproc
, SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
}, /* in the 1st MDI child */
324 { WM_NCACTIVATE
, sent
|wparam
|defwinproc
, 1 }, /* in the 1st MDI child */
325 { HCBT_SETFOCUS
, hook
},
326 { WM_KILLFOCUS
, sent
|defwinproc
}, /* in the 2nd MDI child */
327 { WM_IME_SETCONTEXT
, sent
|wparam
|defwinproc
|optional
, 0 },/* in the 1st MDI child */
328 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 1 }, /* in MDI client */
329 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
330 { WM_SETFOCUS
, sent
},/* in the MDI client */
331 { HCBT_SETFOCUS
, hook
},
332 { WM_KILLFOCUS
, sent
},/* in the MDI client */
333 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 0 }, /* in MDI client */
334 { WM_IME_SETCONTEXT
, sent
|wparam
|defwinproc
|optional
, 1 }, /* in the 1st MDI child */
335 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
336 { WM_SETFOCUS
, sent
|defwinproc
}, /* in the 1st MDI child */
337 { WM_MDIACTIVATE
, sent
|defwinproc
},/* in the 1st MDI child */
338 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
}, /* in the 1st MDI child */
342 /* Switch visible not maximized mdi children */
343 static const struct message WmSwitchNotMaximizedChild
[] = {
344 /* Switch not maximized MDI child */
345 { WM_MDIACTIVATE
, sent
},/* in the MDI client */
346 { WM_WINDOWPOSCHANGING
, sent
|wparam
,SWP_NOSIZE
|SWP_NOMOVE
},/* in the 2nd MDI child */
347 { EVENT_OBJECT_REORDER
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
348 { WM_CHILDACTIVATE
, sent
},/* in the 2nd MDI child */
349 /* Deactivate 1st MDI child */
350 { WM_NCACTIVATE
, sent
|wparam
|defwinproc
, 0 }, /* in the 1st MDI child */
351 { WM_MDIACTIVATE
, sent
|defwinproc
}, /* in the 1st MDI child */
352 /* Activate 2nd MDI child */
353 { WM_WINDOWPOSCHANGING
, sent
|wparam
|defwinproc
, SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOACTIVATE
}, /* in the 2nd MDI child */
354 { WM_NCACTIVATE
, sent
|wparam
|defwinproc
, 1 }, /* in the 2nd MDI child */
355 { HCBT_SETFOCUS
, hook
}, /* in the 1st MDI child */
356 { WM_KILLFOCUS
, sent
|defwinproc
}, /* in the 1st MDI child */
357 { WM_IME_SETCONTEXT
, sent
|defwinproc
|optional
}, /* in the 1st MDI child */
358 { WM_IME_SETCONTEXT
, sent
|optional
}, /* in the MDI client */
359 { WM_SETFOCUS
, sent
, 0 }, /* in the MDI client */
360 { HCBT_SETFOCUS
, hook
},
361 { WM_KILLFOCUS
, sent
}, /* in the MDI client */
362 { WM_IME_SETCONTEXT
, sent
|optional
}, /* in the MDI client */
363 { WM_IME_SETCONTEXT
, sent
|defwinproc
|optional
}, /* in the 1st MDI child */
364 { WM_SETFOCUS
, sent
|defwinproc
}, /* in the 2nd MDI child */
365 { WM_MDIACTIVATE
, sent
|defwinproc
}, /* in the 2nd MDI child */
366 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
}, /* in the 2nd MDI child */
371 /* SetWindowPos(SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|
372 SWP_NOZORDER|SWP_FRAMECHANGED)
373 * for a visible overlapped window with WS_CLIPCHILDREN style set.
375 static const struct message WmSWP_FrameChanged_clip
[] = {
376 { WM_WINDOWPOSCHANGING
, sent
|wparam
|parent
, SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOACTIVATE
|SWP_FRAMECHANGED
},
377 { WM_NCCALCSIZE
, sent
|wparam
|parent
, 1 },
378 { WM_NCPAINT
, sent
|parent
|optional
}, /* wparam != 1 */
379 { WM_GETTEXT
, sent
|parent
|defwinproc
|optional
},
380 { WM_ERASEBKGND
, sent
|parent
|optional
}, /* FIXME: remove optional once Wine is fixed */
381 { WM_NCPAINT
, sent
}, /* wparam != 1 */
382 { WM_ERASEBKGND
, sent
},
383 { WM_WINDOWPOSCHANGED
, sent
|wparam
|parent
, SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOACTIVATE
|SWP_FRAMECHANGED
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
384 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
388 /* SetWindowPos(SWP_NOSIZE|SWP_NOMOVE|SWP_DEFERERASE|SWP_NOACTIVATE|
389 SWP_NOZORDER|SWP_FRAMECHANGED)
390 * for a visible overlapped window.
392 static const struct message WmSWP_FrameChangedDeferErase
[] = {
393 { WM_WINDOWPOSCHANGING
, sent
|wparam
|parent
, SWP_NOSIZE
|SWP_NOMOVE
|SWP_DEFERERASE
|SWP_NOACTIVATE
|SWP_FRAMECHANGED
},
394 { WM_NCCALCSIZE
, sent
|wparam
|parent
, 1 },
395 { WM_WINDOWPOSCHANGED
, sent
|wparam
|parent
, SWP_NOSIZE
|SWP_NOMOVE
|SWP_DEFERERASE
|SWP_NOACTIVATE
|SWP_FRAMECHANGED
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
396 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
397 { WM_PAINT
, sent
|parent
|optional
},
398 { WM_NCPAINT
, sent
|beginpaint
|parent
|optional
}, /* wparam != 1 */
399 { WM_GETTEXT
, sent
|beginpaint
|parent
|defwinproc
|optional
},
401 { WM_NCPAINT
, sent
|beginpaint
}, /* wparam != 1 */
402 { WM_ERASEBKGND
, sent
|beginpaint
|optional
},
406 /* SetWindowPos(SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|
407 SWP_NOZORDER|SWP_FRAMECHANGED)
408 * for a visible overlapped window without WS_CLIPCHILDREN style set.
410 static const struct message WmSWP_FrameChanged_noclip
[] = {
411 { WM_WINDOWPOSCHANGING
, sent
|wparam
|parent
, SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOACTIVATE
|SWP_FRAMECHANGED
},
412 { WM_NCCALCSIZE
, sent
|wparam
|parent
, 1 },
413 { WM_NCPAINT
, sent
|parent
|optional
}, /* wparam != 1 */
414 { WM_GETTEXT
, sent
|parent
|defwinproc
|optional
},
415 { WM_ERASEBKGND
, sent
|parent
|optional
},
416 { WM_WINDOWPOSCHANGED
, sent
|wparam
|parent
, SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOACTIVATE
|SWP_FRAMECHANGED
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
417 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
419 { WM_NCPAINT
, sent
|beginpaint
}, /* wparam != 1 */
420 { WM_ERASEBKGND
, sent
|beginpaint
|optional
},
424 /* ShowWindow(SW_SHOW) for a not visible overlapped window */
425 static const struct message WmShowOverlappedSeq
[] = {
426 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
427 { WM_NCPAINT
, sent
|wparam
|optional
, 1 },
428 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
},
429 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
430 { WM_NCPAINT
, sent
|wparam
|optional
, 1 },
431 { WM_GETTEXT
, sent
|defwinproc
|optional
},
432 { WM_ERASEBKGND
, sent
|optional
},
433 { HCBT_ACTIVATE
, hook
},
434 { EVENT_SYSTEM_FOREGROUND
, winevent_hook
|wparam
|lparam
, 0, 0 },
435 { WM_QUERYNEWPALETTE
, sent
|wparam
|lparam
|optional
, 0, 0 },
436 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_NOSIZE
|SWP_NOMOVE
},
437 { WM_NCPAINT
, sent
|wparam
|optional
, 1 },
438 { WM_ACTIVATEAPP
, sent
|wparam
, 1 },
439 { WM_NCACTIVATE
, sent
|wparam
, 1 },
440 { WM_GETTEXT
, sent
|defwinproc
|optional
},
441 { WM_ACTIVATE
, sent
|wparam
, 1 },
442 { HCBT_SETFOCUS
, hook
},
443 { WM_IME_SETCONTEXT
, sent
|wparam
|defwinproc
|optional
, 1 },
444 { WM_IME_NOTIFY
, sent
|wparam
|defwinproc
|optional
, 2 },
445 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
446 { WM_SETFOCUS
, sent
|wparam
|defwinproc
, 0 },
447 { WM_GETTEXT
, sent
|optional
},
448 { WM_NCPAINT
, sent
|wparam
|optional
, 1 },
449 { WM_GETTEXT
, sent
|defwinproc
|optional
},
450 { WM_ERASEBKGND
, sent
|optional
},
451 /* Win9x adds SWP_NOZORDER below */
452 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
453 { WM_NCCALCSIZE
, sent
|optional
},
454 { WM_GETTEXT
, sent
|optional
},
455 { WM_NCPAINT
, sent
|optional
},
456 { WM_ERASEBKGND
, sent
|optional
},
457 { WM_SYNCPAINT
, sent
|optional
},
458 #if 0 /* CreateWindow/ShowWindow(SW_SHOW) also generates WM_SIZE/WM_MOVE
459 * messages. Does that mean that CreateWindow doesn't set initial
460 * window dimensions for overlapped windows?
465 { WM_PAINT
, sent
|optional
},
466 { WM_NCPAINT
, sent
|beginpaint
|optional
},
469 /* ShowWindow(SW_SHOWMAXIMIZED) for a not visible overlapped window */
470 static const struct message WmShowMaxOverlappedSeq
[] = {
471 { HCBT_MINMAX
, hook
|lparam
, 0, SW_MAXIMIZE
},
472 { WM_GETMINMAXINFO
, sent
},
473 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_FRAMECHANGED
|SWP_STATECHANGED
},
474 { WM_GETMINMAXINFO
, sent
|defwinproc
},
475 { WM_NCCALCSIZE
, sent
|wparam
, TRUE
},
476 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
477 { HCBT_ACTIVATE
, hook
},
478 { EVENT_SYSTEM_FOREGROUND
, winevent_hook
|wparam
|lparam
, 0, 0 },
479 { WM_QUERYNEWPALETTE
, sent
|wparam
|lparam
|optional
, 0, 0 },
480 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_NOSIZE
|SWP_NOMOVE
},
481 { WM_ACTIVATEAPP
, sent
|wparam
, 1 },
482 { WM_NCACTIVATE
, sent
|wparam
, 1 },
483 { WM_GETTEXT
, sent
|defwinproc
|optional
},
484 { WM_ACTIVATE
, sent
|wparam
, 1 },
485 { HCBT_SETFOCUS
, hook
},
486 { WM_IME_SETCONTEXT
, sent
|wparam
|defwinproc
|optional
, 1 },
487 { WM_IME_NOTIFY
, sent
|wparam
|defwinproc
|optional
, 2 },
488 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
489 { WM_SETFOCUS
, sent
|wparam
|defwinproc
, 0 },
490 { WM_GETTEXT
, sent
|optional
},
491 { WM_NCPAINT
, sent
|wparam
|optional
, 1 },
492 { WM_GETTEXT
, sent
|defwinproc
|optional
},
493 { WM_ERASEBKGND
, sent
|optional
},
494 /* Win9x adds SWP_NOZORDER below */
495 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_FRAMECHANGED
|SWP_STATECHANGED
},
496 { WM_MOVE
, sent
|defwinproc
},
497 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_MAXIMIZED
},
498 { WM_GETTEXT
, sent
|optional
},
499 { WM_NCCALCSIZE
, sent
|optional
},
500 { WM_NCPAINT
, sent
|optional
},
501 { WM_ERASEBKGND
, sent
|optional
},
502 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
503 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
504 { WM_SYNCPAINT
, sent
|optional
},
505 { WM_GETTITLEBARINFOEX
, sent
|optional
},
506 { WM_PAINT
, sent
|optional
},
507 { WM_NCPAINT
, sent
|beginpaint
|optional
},
508 { WM_ERASEBKGND
, sent
|beginpaint
|optional
},
511 /* ShowWindow(SW_RESTORE) for a not visible maximized overlapped window */
512 static const struct message WmShowRestoreMaxOverlappedSeq
[] = {
513 { HCBT_MINMAX
, hook
|lparam
, 0, SW_RESTORE
},
514 { WM_GETTEXT
, sent
|optional
},
515 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_STATECHANGED
},
516 { WM_GETMINMAXINFO
, sent
|defwinproc
},
517 { WM_NCCALCSIZE
, sent
|wparam
, TRUE
},
518 { WM_NCPAINT
, sent
|optional
},
519 { WM_GETTEXT
, sent
|defwinproc
|optional
},
520 { WM_ERASEBKGND
, sent
|optional
},
521 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_STATECHANGED
, 0, SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
|SWP_NOSIZE
|SWP_NOMOVE
},
522 { WM_MOVE
, sent
|defwinproc
|optional
},
523 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_RESTORED
},
524 { WM_NCCALCSIZE
, sent
|wparam
|optional
, TRUE
},
525 { WM_NCPAINT
, sent
|optional
},
526 { WM_ERASEBKGND
, sent
|optional
},
527 { WM_PAINT
, sent
|optional
},
528 { WM_GETTITLEBARINFOEX
, sent
|optional
},
529 { WM_NCPAINT
, sent
|beginpaint
|optional
},
530 { WM_ERASEBKGND
, sent
|beginpaint
|optional
},
533 /* ShowWindow(SW_RESTORE) for a not visible minimized overlapped window */
534 static const struct message WmShowRestoreMinOverlappedSeq
[] = {
535 { HCBT_MINMAX
, hook
|lparam
, 0, SW_RESTORE
},
536 { WM_QUERYOPEN
, sent
|optional
},
537 { WM_GETTEXT
, sent
|optional
},
538 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_STATECHANGED
|SWP_NOCOPYBITS
},
539 { WM_GETMINMAXINFO
, sent
|defwinproc
},
540 { WM_NCCALCSIZE
, sent
|wparam
, TRUE
},
541 { HCBT_ACTIVATE
, hook
},
542 { WM_QUERYNEWPALETTE
, sent
|wparam
|lparam
|optional
, 0, 0 },
543 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_NOSIZE
|SWP_NOMOVE
},
544 { WM_ACTIVATEAPP
, sent
|wparam
, 1 },
545 { WM_NCACTIVATE
, sent
|wparam
, 1 },
546 { WM_GETTEXT
, sent
|defwinproc
|optional
},
547 { WM_ACTIVATE
, sent
|wparam
, 1 },
548 { HCBT_SETFOCUS
, hook
},
549 { WM_IME_SETCONTEXT
, sent
|wparam
|defwinproc
|optional
, 1 },
550 { WM_IME_NOTIFY
, sent
|wparam
|defwinproc
|optional
, 2 },
551 { WM_SETFOCUS
, sent
|wparam
|defwinproc
, 0 },
552 { WM_GETTEXT
, sent
|optional
},
553 { WM_NCPAINT
, sent
|wparam
|optional
, 1 },
554 { WM_GETTEXT
, sent
|defwinproc
|optional
},
555 { WM_ERASEBKGND
, sent
},
556 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_STATECHANGED
|SWP_FRAMECHANGED
|SWP_NOCOPYBITS
},
557 { WM_MOVE
, sent
|defwinproc
},
558 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_RESTORED
},
559 { WM_NCCALCSIZE
, sent
|wparam
|optional
, TRUE
},
560 { WM_NCPAINT
, sent
|wparam
|optional
, 1 },
561 { WM_ERASEBKGND
, sent
|optional
},
562 { WM_ACTIVATE
, sent
|wparam
, 1 },
563 { WM_GETTEXT
, sent
|optional
},
564 { WM_PAINT
, sent
|optional
},
565 { WM_GETTITLEBARINFOEX
, sent
|optional
},
566 { WM_NCPAINT
, sent
|beginpaint
|optional
},
567 { WM_ERASEBKGND
, sent
|beginpaint
|optional
},
570 /* ShowWindow(SW_SHOWMINIMIZED) for a not visible overlapped window */
571 static const struct message WmShowMinOverlappedSeq
[] = {
572 { HCBT_MINMAX
, hook
|lparam
, 0, SW_MINIMIZE
},
573 { HCBT_SETFOCUS
, hook
},
574 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
575 { WM_KILLFOCUS
, sent
},
576 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 0 },
577 { WM_IME_NOTIFY
, sent
|wparam
|optional
|defwinproc
, 1 },
578 { WM_GETTEXT
, sent
|optional
},
579 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_NOCOPYBITS
|SWP_SHOWWINDOW
|SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_STATECHANGED
},
580 { WM_GETMINMAXINFO
, sent
|defwinproc
},
581 { WM_NCCALCSIZE
, sent
|wparam
, TRUE
},
582 { EVENT_OBJECT_REORDER
, winevent_hook
|wparam
|lparam
, 0, 0 },
583 { WM_NCPAINT
, sent
|optional
},
584 { WM_GETTEXT
, sent
|defwinproc
|optional
},
585 { WM_WINDOWPOSCHANGED
, sent
},
586 { WM_MOVE
, sent
|defwinproc
},
587 { WM_SIZE
, sent
|defwinproc
|wparam
|lparam
, SIZE_MINIMIZED
, 0 },
588 { WM_NCCALCSIZE
, sent
|optional
},
589 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
590 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
591 { EVENT_SYSTEM_MINIMIZESTART
, winevent_hook
|wparam
|lparam
, 0, 0 },
592 { WM_NCACTIVATE
, sent
|wparam
, 0 },
593 { WM_GETTEXT
, sent
|defwinproc
|optional
},
594 { WM_ACTIVATE
, sent
},
595 { WM_ACTIVATEAPP
, sent
|wparam
, 0 },
597 /* Vista sometimes restores the window right away... */
598 { WM_SYSCOMMAND
, sent
|optional
|wparam
, SC_RESTORE
},
599 { HCBT_SYSCOMMAND
, hook
|optional
|wparam
, SC_RESTORE
},
600 { HCBT_MINMAX
, hook
|optional
|lparam
, 0, SW_RESTORE
},
601 { WM_QUERYOPEN
, sent
|optional
},
602 { WM_WINDOWPOSCHANGING
, sent
|optional
|wparam
, SWP_FRAMECHANGED
|SWP_STATECHANGED
},
603 { WM_GETMINMAXINFO
, sent
|optional
|defwinproc
},
604 { WM_NCCALCSIZE
, sent
|optional
|wparam
, TRUE
},
605 { HCBT_ACTIVATE
, hook
|optional
},
606 { WM_ACTIVATEAPP
, sent
|optional
|wparam
, 1 },
607 { WM_NCACTIVATE
, sent
|optional
},
608 { WM_GETTEXT
, sent
|optional
},
609 { WM_ACTIVATE
, sent
|optional
|wparam
, 1 },
610 { HCBT_SETFOCUS
, hook
|optional
},
611 { WM_IME_SETCONTEXT
, sent
|wparam
|defwinproc
|optional
, 1 },
612 { WM_IME_NOTIFY
, sent
|wparam
|defwinproc
|optional
, 2 },
613 { WM_SETFOCUS
, sent
|optional
},
614 { WM_NCPAINT
, sent
|optional
},
615 { WM_GETTEXT
, sent
|defwinproc
|optional
},
616 { WM_ERASEBKGND
, sent
|optional
},
617 { WM_WINDOWPOSCHANGED
, sent
|optional
|wparam
, SWP_FRAMECHANGED
|SWP_STATECHANGED
},
618 { WM_MOVE
, sent
|defwinproc
|optional
},
619 { WM_SIZE
, sent
|defwinproc
|optional
|wparam
, SIZE_RESTORED
},
620 { WM_ACTIVATE
, sent
|optional
|wparam
, 1 },
621 { WM_SYSCOMMAND
, sent
|optional
|wparam
, SC_RESTORE
},
622 { HCBT_SYSCOMMAND
, hook
|optional
|wparam
, SC_RESTORE
},
624 { WM_PAINT
, sent
|optional
},
625 { WM_NCPAINT
, sent
|beginpaint
|optional
},
626 { WM_ERASEBKGND
, sent
|beginpaint
|optional
},
629 /* ShowWindow(SW_HIDE) for a visible overlapped window */
630 static const struct message WmHideOverlappedSeq
[] = {
631 { WM_SHOWWINDOW
, sent
|wparam
, 0 },
632 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
},
633 { EVENT_OBJECT_HIDE
, winevent_hook
|wparam
|lparam
, 0, 0 },
634 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
635 { WM_SIZE
, sent
|optional
}, /* XP doesn't send it */
636 { WM_MOVE
, sent
|optional
}, /* XP doesn't send it */
637 { WM_NCACTIVATE
, sent
|wparam
|optional
, 0 },
638 { WM_ACTIVATE
, sent
|wparam
|optional
, 0 },
639 { WM_ACTIVATEAPP
, sent
|wparam
|optional
, 0 },
640 { HCBT_SETFOCUS
, hook
|optional
},
641 { WM_KILLFOCUS
, sent
|wparam
, 0 },
642 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 0 },
643 { WM_IME_NOTIFY
, sent
|wparam
|optional
|defwinproc
, 1 },
646 /* DestroyWindow for a visible overlapped window */
647 static const struct message WmDestroyOverlappedSeq
[] = {
648 { HCBT_DESTROYWND
, hook
},
649 { 0x0090, sent
|optional
},
650 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
651 { EVENT_OBJECT_HIDE
, winevent_hook
|wparam
|lparam
, 0, 0 },
652 { 0x0090, sent
|optional
},
653 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
654 { WM_NCACTIVATE
, sent
|optional
|wparam
, 0 },
655 { WM_ACTIVATE
, sent
|optional
},
656 { WM_ACTIVATEAPP
, sent
|optional
|wparam
, 0 },
657 { WM_KILLFOCUS
, sent
|optional
|wparam
, 0 },
658 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 0 },
659 { WM_IME_NOTIFY
, sent
|wparam
|optional
|defwinproc
, 1 },
660 { EVENT_OBJECT_DESTROY
, winevent_hook
|wparam
|lparam
, 0, 0 },
661 { WM_DESTROY
, sent
},
662 { WM_NCDESTROY
, sent
},
665 /* CreateWindow(WS_MAXIMIZE|WS_VISIBLE) for popup window */
666 static const struct message WmCreateMaxPopupSeq
[] = {
667 { HCBT_CREATEWND
, hook
},
668 { WM_NCCREATE
, sent
},
669 { WM_NCCALCSIZE
, sent
|wparam
, 0 },
671 { EVENT_OBJECT_CREATE
, winevent_hook
|wparam
|lparam
, 0, 0 },
672 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
674 { HCBT_MINMAX
, hook
|lparam
, 0, SW_MAXIMIZE
},
675 { WM_GETMINMAXINFO
, sent
},
676 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_NOACTIVATE
|SWP_FRAMECHANGED
|SWP_STATECHANGED
},
677 { WM_NCCALCSIZE
, sent
|wparam
, TRUE
},
678 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_NOACTIVATE
|SWP_FRAMECHANGED
|SWP_NOREDRAW
|SWP_STATECHANGED
},
679 { WM_MOVE
, sent
|defwinproc
},
680 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_MAXIMIZED
},
681 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
682 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
683 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
},
684 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
685 { HCBT_ACTIVATE
, hook
},
686 { EVENT_SYSTEM_FOREGROUND
, winevent_hook
|wparam
|lparam
, 0, 0 },
687 { WM_QUERYNEWPALETTE
, sent
|wparam
|lparam
|optional
, 0, 0 },
688 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_NOSIZE
|SWP_NOMOVE
},
689 { WM_NCPAINT
, sent
|wparam
|optional
, 1 },
690 { WM_ERASEBKGND
, sent
|optional
},
691 { WM_WINDOWPOSCHANGED
, sent
|wparam
|optional
, SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
|SWP_NOMOVE
|SWP_NOSIZE
},
692 { WM_ACTIVATEAPP
, sent
|wparam
, 1 },
693 { WM_NCACTIVATE
, sent
},
694 { WM_ACTIVATE
, sent
|wparam
, 1 },
695 { HCBT_SETFOCUS
, hook
},
696 { WM_IME_SETCONTEXT
, sent
|wparam
|defwinproc
|optional
, 1 },
697 { WM_IME_NOTIFY
, sent
|wparam
|defwinproc
|optional
, 2 },
698 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
699 { WM_SETFOCUS
, sent
|wparam
|defwinproc
, 0 },
700 { WM_GETTEXT
, sent
|optional
},
701 { WM_SYNCPAINT
, sent
|wparam
|optional
, 4 },
702 { WM_NCPAINT
, sent
|wparam
|optional
, 1 },
703 { WM_ERASEBKGND
, sent
|optional
},
704 { WM_NCPAINT
, sent
|wparam
|defwinproc
|optional
, 1 },
705 { WM_ERASEBKGND
, sent
|defwinproc
|optional
},
706 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
|SWP_SHOWWINDOW
|SWP_NOMOVE
|SWP_NOSIZE
},
709 /* CreateWindow(WS_MAXIMIZE) for popup window, not initially visible */
710 static const struct message WmCreateInvisibleMaxPopupSeq
[] = {
711 { HCBT_CREATEWND
, hook
},
712 { WM_NCCREATE
, sent
},
713 { WM_NCCALCSIZE
, sent
|wparam
, 0 },
715 { EVENT_OBJECT_CREATE
, winevent_hook
|wparam
|lparam
, 0, 0 },
716 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
718 { HCBT_MINMAX
, hook
|lparam
, 0, SW_MAXIMIZE
},
719 { WM_GETMINMAXINFO
, sent
},
720 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_NOACTIVATE
|SWP_FRAMECHANGED
|SWP_STATECHANGED
},
721 { WM_NCCALCSIZE
, sent
|wparam
, TRUE
},
722 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_NOACTIVATE
|SWP_FRAMECHANGED
|SWP_NOREDRAW
|SWP_STATECHANGED
},
723 { WM_MOVE
, sent
|defwinproc
},
724 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_MAXIMIZED
},
725 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
728 /* ShowWindow(SW_SHOWMAXIMIZED) for a resized not visible popup window */
729 static const struct message WmShowMaxPopupResizedSeq
[] = {
730 { HCBT_MINMAX
, hook
|lparam
, 0, SW_MAXIMIZE
},
731 { WM_GETMINMAXINFO
, sent
},
732 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_FRAMECHANGED
},
733 { WM_NCCALCSIZE
, sent
|wparam
, TRUE
},
734 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
735 { HCBT_ACTIVATE
, hook
},
736 { EVENT_SYSTEM_FOREGROUND
, winevent_hook
|wparam
|lparam
, 0, 0 },
737 { WM_QUERYNEWPALETTE
, sent
|wparam
|lparam
|optional
, 0, 0 },
738 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_NOSIZE
|SWP_NOMOVE
},
739 { WM_NCPAINT
, sent
|wparam
|optional
, 1 },
740 { WM_ERASEBKGND
, sent
|optional
},
741 { WM_WINDOWPOSCHANGED
, sent
|wparam
|optional
, SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
742 { WM_ACTIVATEAPP
, sent
|wparam
, 1 },
743 { WM_NCACTIVATE
, sent
},
744 { WM_ACTIVATE
, sent
|wparam
, 1 },
745 { HCBT_SETFOCUS
, hook
},
746 { WM_IME_SETCONTEXT
, sent
|wparam
|defwinproc
|optional
, 1 },
747 { WM_IME_NOTIFY
, sent
|wparam
|defwinproc
|optional
, 2 },
748 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
749 { WM_SETFOCUS
, sent
|wparam
|defwinproc
, 0 },
750 { WM_GETTEXT
, sent
|optional
},
751 { WM_NCPAINT
, sent
|wparam
|optional
, 1 },
752 { WM_ERASEBKGND
, sent
|optional
},
753 { WM_WINDOWPOSCHANGED
, sent
},
754 /* WinNT4.0 sends WM_MOVE */
755 { WM_MOVE
, sent
|defwinproc
|optional
},
756 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_MAXIMIZED
},
757 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
760 /* ShowWindow(SW_SHOWMAXIMIZED) for a not visible popup window */
761 static const struct message WmShowMaxPopupSeq
[] = {
762 { HCBT_MINMAX
, hook
|lparam
, 0, SW_MAXIMIZE
},
763 { WM_GETMINMAXINFO
, sent
},
764 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_FRAMECHANGED
},
765 { WM_NCCALCSIZE
, sent
|wparam
, TRUE
},
766 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
767 { HCBT_ACTIVATE
, hook
},
768 { EVENT_SYSTEM_FOREGROUND
, winevent_hook
|wparam
|lparam
, 0, 0 },
769 { WM_QUERYNEWPALETTE
, sent
|wparam
|lparam
|optional
, 0, 0 },
770 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_NOSIZE
|SWP_NOMOVE
},
771 { WM_ACTIVATEAPP
, sent
|wparam
, 1 },
772 { WM_NCACTIVATE
, sent
},
773 { WM_ACTIVATE
, sent
|wparam
, 1 },
774 { HCBT_SETFOCUS
, hook
},
775 { WM_IME_SETCONTEXT
, sent
|wparam
|defwinproc
|optional
, 1 },
776 { WM_IME_NOTIFY
, sent
|wparam
|defwinproc
|optional
, 2 },
777 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
778 { WM_SETFOCUS
, sent
|wparam
|defwinproc
, 0 },
779 { WM_GETTEXT
, sent
|optional
},
780 { WM_SYNCPAINT
, sent
|wparam
|optional
, 4 },
781 { WM_NCPAINT
, sent
|wparam
|optional
, 1 },
782 { WM_ERASEBKGND
, sent
|optional
},
783 { WM_NCPAINT
, sent
|wparam
|defwinproc
|optional
, 1 },
784 { WM_ERASEBKGND
, sent
|defwinproc
|optional
},
785 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
|SWP_SHOWWINDOW
|SWP_FRAMECHANGED
|SWP_NOMOVE
|SWP_NOSIZE
},
786 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
789 /* CreateWindow(WS_VISIBLE) for popup window */
790 static const struct message WmCreatePopupSeq
[] = {
791 { HCBT_CREATEWND
, hook
},
792 { WM_NCCREATE
, sent
},
793 { WM_NCCALCSIZE
, sent
|wparam
, 0 },
795 { EVENT_OBJECT_CREATE
, winevent_hook
|wparam
|lparam
, 0, 0 },
796 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
798 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
799 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
},
800 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
801 { HCBT_ACTIVATE
, hook
},
802 { EVENT_SYSTEM_FOREGROUND
, winevent_hook
|wparam
|lparam
, 0, 0 },
803 { WM_QUERYNEWPALETTE
, sent
|wparam
|lparam
|optional
, 0, 0 },
804 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_NOSIZE
|SWP_NOMOVE
},
805 { WM_NCPAINT
, sent
|wparam
|optional
, 1 },
806 { WM_ERASEBKGND
, sent
|optional
},
807 { WM_WINDOWPOSCHANGED
, sent
|wparam
|optional
, SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
808 { WM_ACTIVATEAPP
, sent
|wparam
, 1 },
809 { WM_NCACTIVATE
, sent
},
810 { WM_ACTIVATE
, sent
|wparam
, 1 },
811 { HCBT_SETFOCUS
, hook
},
812 { WM_IME_SETCONTEXT
, sent
|wparam
|defwinproc
|optional
, 1 },
813 { WM_IME_NOTIFY
, sent
|wparam
|defwinproc
|optional
, 2 },
814 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
815 { WM_SETFOCUS
, sent
|wparam
|defwinproc
, 0 },
816 { WM_GETTEXT
, sent
|optional
},
817 { WM_SYNCPAINT
, sent
|wparam
|optional
, 4 },
818 { WM_NCPAINT
, sent
|wparam
|optional
, 1 },
819 { WM_ERASEBKGND
, sent
|optional
},
820 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_NOCLIENTMOVE
|SWP_NOCLIENTSIZE
|SWP_SHOWWINDOW
|SWP_NOMOVE
|SWP_NOSIZE
},
823 /* ShowWindow(SW_SHOWMAXIMIZED) for a visible popup window */
824 static const struct message WmShowVisMaxPopupSeq
[] = {
825 { HCBT_MINMAX
, hook
|lparam
, 0, SW_MAXIMIZE
},
826 { WM_GETMINMAXINFO
, sent
},
827 { WM_GETTEXT
, sent
|optional
},
828 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_STATECHANGED
},
829 { WM_GETTEXT
, sent
|optional
},
830 { WM_NCCALCSIZE
, sent
|wparam
, TRUE
},
831 { WM_QUERYNEWPALETTE
, sent
|wparam
|lparam
|optional
, 0, 0 },
832 { WM_NCPAINT
, sent
|wparam
|optional
, 1 },
833 { WM_ERASEBKGND
, sent
|optional
},
834 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_STATECHANGED
},
835 { WM_MOVE
, sent
|defwinproc
},
836 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_MAXIMIZED
},
837 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
840 /* CreateWindow (for a child popup window, not initially visible) */
841 static const struct message WmCreateChildPopupSeq
[] = {
842 { HCBT_CREATEWND
, hook
},
843 { WM_NCCREATE
, sent
},
844 { WM_NCCALCSIZE
, sent
|wparam
, 0 },
846 { EVENT_OBJECT_CREATE
, winevent_hook
|wparam
|lparam
, 0, 0 },
847 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
851 /* CreateWindow (for a popup window, not initially visible,
852 * which sets WS_VISIBLE in WM_CREATE handler)
854 static const struct message WmCreateInvisiblePopupSeq
[] = {
855 { HCBT_CREATEWND
, hook
},
856 { WM_NCCREATE
, sent
},
857 { WM_NCCALCSIZE
, sent
|wparam
, 0 },
859 { WM_STYLECHANGING
, sent
},
860 { WM_STYLECHANGED
, sent
},
861 { EVENT_OBJECT_CREATE
, winevent_hook
|wparam
|lparam
, 0, 0 },
862 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
866 /* SetWindowPos(SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE|SWP_NOZORDER)
867 * for a popup window with WS_VISIBLE style set
869 static const struct message WmShowVisiblePopupSeq_2
[] = {
870 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
873 /* SetWindowPos(SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE)
874 * for a popup window with WS_VISIBLE style set
876 static const struct message WmShowVisiblePopupSeq_3
[] = {
877 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
},
878 { HCBT_ACTIVATE
, hook
},
879 { EVENT_SYSTEM_FOREGROUND
, winevent_hook
|wparam
|lparam
, 0, 0 },
880 { WM_QUERYNEWPALETTE
, sent
|wparam
|lparam
|optional
, 0, 0 },
881 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_NOSIZE
|SWP_NOMOVE
},
882 { WM_NCACTIVATE
, sent
},
883 { WM_ACTIVATE
, sent
|wparam
, 1 },
884 { HCBT_SETFOCUS
, hook
},
885 { WM_KILLFOCUS
, sent
|parent
},
886 { WM_IME_SETCONTEXT
, sent
|parent
|wparam
|optional
, 0 },
887 { WM_IME_SETCONTEXT
, sent
|wparam
|defwinproc
|optional
, 1 },
888 { WM_IME_NOTIFY
, sent
|wparam
|defwinproc
|optional
, 2 },
889 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
890 { WM_SETFOCUS
, sent
|defwinproc
},
891 { WM_GETTEXT
, sent
|optional
},
892 { WM_WINDOWPOSCHANGED
, sent
|wparam
|optional
, SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
, 0, SWP_SHOWWINDOW
},
895 /* CreateWindow (for child window, not initially visible) */
896 static const struct message WmCreateChildSeq
[] = {
897 { HCBT_CREATEWND
, hook
},
898 { WM_NCCREATE
, sent
},
899 /* child is inserted into parent's child list after WM_NCCREATE returns */
900 { WM_NCCALCSIZE
, sent
|wparam
, 0 },
902 { EVENT_OBJECT_CREATE
, winevent_hook
|wparam
|lparam
, 0, 0 },
903 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
905 { WM_PARENTNOTIFY
, sent
|parent
|wparam
, WM_CREATE
},
908 /* CreateWindow (for maximized child window, not initially visible) */
909 static const struct message WmCreateMaximizedChildSeq
[] = {
910 { HCBT_CREATEWND
, hook
},
911 { WM_NCCREATE
, sent
},
912 { WM_NCCALCSIZE
, sent
|wparam
, 0 },
914 { EVENT_OBJECT_CREATE
, winevent_hook
|wparam
|lparam
, 0, 0 },
915 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
917 { HCBT_MINMAX
, hook
|lparam
, 0, SW_MAXIMIZE
},
918 { WM_GETMINMAXINFO
, sent
},
919 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_STATECHANGED
},
920 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
921 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOMOVE
|SWP_NOREDRAW
|SWP_NOCLIENTMOVE
|SWP_STATECHANGED
},
922 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_MAXIMIZED
},
923 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
924 { WM_PARENTNOTIFY
, sent
|parent
|wparam
, WM_CREATE
},
927 /* CreateWindow (for a child window, initially visible) */
928 static const struct message WmCreateVisibleChildSeq
[] = {
929 { HCBT_CREATEWND
, hook
},
930 { WM_NCCREATE
, sent
},
931 /* child is inserted into parent's child list after WM_NCCREATE returns */
932 { WM_NCCALCSIZE
, sent
|wparam
, 0 },
933 { EVENT_OBJECT_REORDER
, winevent_hook
|wparam
|lparam
, 0, 0 },
935 { EVENT_OBJECT_CREATE
, winevent_hook
|wparam
|lparam
, 0, 0 },
936 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
938 { WM_PARENTNOTIFY
, sent
|parent
|wparam
, WM_CREATE
},
939 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
940 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOACTIVATE
},
941 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
942 { WM_ERASEBKGND
, sent
|parent
|optional
},
943 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOACTIVATE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
944 { WM_NCCALCSIZE
, sent
|wparam
|optional
, 1 }, /* WinXP */
945 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
948 /* ShowWindow(SW_SHOW) for a not visible child window */
949 static const struct message WmShowChildSeq
[] = {
950 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
951 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
952 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
953 { WM_ERASEBKGND
, sent
|parent
|optional
},
954 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
957 /* ShowWindow(SW_HIDE) for a visible child window */
958 static const struct message WmHideChildSeq
[] = {
959 { WM_SHOWWINDOW
, sent
|wparam
, 0 },
960 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
961 { EVENT_OBJECT_HIDE
, winevent_hook
|wparam
|lparam
, 0, 0 },
962 { WM_ERASEBKGND
, sent
|parent
|optional
},
963 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
966 /* ShowWindow(SW_HIDE) for a visible child window checking all parent events*/
967 static const struct message WmHideChildSeq2
[] = {
968 { WM_SHOWWINDOW
, sent
|wparam
, 0 },
969 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
970 { EVENT_OBJECT_HIDE
, winevent_hook
|wparam
|lparam
, 0, 0 },
971 { WM_ERASEBKGND
, sent
|parent
|optional
},
972 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
975 /* SetWindowPos(SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE)
976 * for a not visible child window
978 static const struct message WmShowChildSeq_2
[] = {
979 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
},
980 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
981 { WM_CHILDACTIVATE
, sent
},
982 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
985 /* SetWindowPos(SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE|SWP_NOACTIVATE)
986 * for a not visible child window
988 static const struct message WmShowChildSeq_3
[] = {
989 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOACTIVATE
},
990 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
991 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOACTIVATE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
994 /* SetWindowPos(SWP_SHOWWINDOW|SWP_NOSIZE|SWP_NOMOVE)
995 * for a visible child window with a caption
997 static const struct message WmShowChildSeq_4
[] = {
998 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
},
999 { WM_CHILDACTIVATE
, sent
},
1002 /* ShowWindow(SW_MINIMIZE) for child with invisible parent */
1003 static const struct message WmShowChildInvisibleParentSeq_1
[] = {
1004 { HCBT_MINMAX
, hook
|lparam
, 0, SW_MINIMIZE
},
1005 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_FRAMECHANGED
|SWP_NOCOPYBITS
|SWP_STATECHANGED
, 0, SWP_NOACTIVATE
},
1006 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
1007 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
1008 { WM_CHILDACTIVATE
, sent
|optional
},
1009 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_FRAMECHANGED
|SWP_NOREDRAW
|SWP_NOCOPYBITS
|SWP_STATECHANGED
, 0, SWP_NOACTIVATE
},
1010 { WM_MOVE
, sent
|defwinproc
},
1011 { WM_SIZE
, sent
|defwinproc
|wparam
|lparam
, SIZE_MINIMIZED
, 0 },
1012 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1013 { EVENT_SYSTEM_MINIMIZESTART
, winevent_hook
|wparam
|lparam
, 0, 0 },
1014 /* FIXME: Wine creates an icon/title window while Windows doesn't */
1015 { WM_PARENTNOTIFY
, sent
|parent
|wparam
|optional
, WM_CREATE
},
1016 { WM_GETTEXT
, sent
|optional
},
1019 /* repeated ShowWindow(SW_MINIMIZE) for child with invisible parent */
1020 static const struct message WmShowChildInvisibleParentSeq_1r
[] = {
1021 { HCBT_MINMAX
, hook
|lparam
, 0, SW_MINIMIZE
},
1024 /* ShowWindow(SW_MAXIMIZE) for child with invisible parent */
1025 static const struct message WmShowChildInvisibleParentSeq_2
[] = {
1026 { HCBT_MINMAX
, hook
|lparam
, 0, SW_MAXIMIZE
},
1027 { WM_GETMINMAXINFO
, sent
},
1028 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_FRAMECHANGED
|SWP_STATECHANGED
},
1029 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
1030 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
1031 { WM_CHILDACTIVATE
, sent
},
1032 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_FRAMECHANGED
|SWP_NOMOVE
|SWP_NOREDRAW
|SWP_NOCLIENTMOVE
|SWP_STATECHANGED
},
1033 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_MAXIMIZED
},
1034 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1037 /* repeated ShowWindow(SW_MAXIMIZE) for child with invisible parent */
1038 static const struct message WmShowChildInvisibleParentSeq_2r
[] = {
1039 { HCBT_MINMAX
, hook
|lparam
, 0, SW_MAXIMIZE
},
1042 /* ShowWindow(SW_SHOWMINIMIZED) for child with invisible parent */
1043 static const struct message WmShowChildInvisibleParentSeq_3
[] = {
1044 { HCBT_MINMAX
, hook
|lparam
, 0, SW_SHOWMINIMIZED
},
1045 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_FRAMECHANGED
|SWP_NOCOPYBITS
|SWP_STATECHANGED
},
1046 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
1047 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
1048 { WM_CHILDACTIVATE
, sent
},
1049 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_FRAMECHANGED
|SWP_NOREDRAW
|SWP_NOCOPYBITS
|SWP_STATECHANGED
},
1050 { WM_MOVE
, sent
|defwinproc
},
1051 { WM_SIZE
, sent
|defwinproc
|wparam
|lparam
, SIZE_MINIMIZED
, 0 },
1052 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1053 { EVENT_SYSTEM_MINIMIZESTART
, winevent_hook
|wparam
|lparam
, 0, 0 },
1054 /* FIXME: Wine creates an icon/title window while Windows doesn't */
1055 { WM_PARENTNOTIFY
, sent
|parent
|wparam
|optional
, WM_CREATE
},
1056 { WM_GETTEXT
, sent
|optional
},
1059 /* repeated ShowWindow(SW_SHOWMINIMIZED) for child with invisible parent */
1060 static const struct message WmShowChildInvisibleParentSeq_3r
[] = {
1061 { HCBT_MINMAX
, hook
|lparam
, 0, SW_SHOWMINIMIZED
},
1064 /* ShowWindow(SW_SHOWMINNOACTIVE) for child with invisible parent */
1065 static const struct message WmShowChildInvisibleParentSeq_4
[] = {
1066 { HCBT_MINMAX
, hook
|lparam
, 0, SW_SHOWMINNOACTIVE
},
1067 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOCOPYBITS
|SWP_STATECHANGED
},
1068 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
1069 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
1070 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOREDRAW
|SWP_NOCOPYBITS
|SWP_STATECHANGED
},
1071 { WM_MOVE
, sent
|defwinproc
},
1072 { WM_SIZE
, sent
|defwinproc
|wparam
|lparam
, SIZE_MINIMIZED
, 0 },
1073 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1074 { EVENT_SYSTEM_MINIMIZESTART
, winevent_hook
|wparam
|lparam
, 0, 0 },
1075 /* FIXME: Wine creates an icon/title window while Windows doesn't */
1076 { WM_PARENTNOTIFY
, sent
|parent
|wparam
|optional
, WM_CREATE
},
1077 { WM_GETTEXT
, sent
|optional
},
1080 /* repeated ShowWindow(SW_SHOWMINNOACTIVE) for child with invisible parent */
1081 static const struct message WmShowChildInvisibleParentSeq_4r
[] = {
1082 { HCBT_MINMAX
, hook
|lparam
, 0, SW_SHOWMINNOACTIVE
},
1085 /* ShowWindow(SW_SHOW) for child with invisible parent */
1086 static const struct message WmShowChildInvisibleParentSeq_5
[] = {
1087 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
1090 /* ShowWindow(SW_HIDE) for child with invisible parent */
1091 static const struct message WmHideChildInvisibleParentSeq
[] = {
1092 { WM_SHOWWINDOW
, sent
|wparam
, 0 },
1095 /* SetWindowPos(SWP_SHOWWINDOW) for child with invisible parent */
1096 static const struct message WmShowChildInvisibleParentSeq_6
[] = {
1097 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOACTIVATE
},
1098 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
1099 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOACTIVATE
|SWP_NOREDRAW
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
1102 /* SetWindowPos(SWP_HIDEWINDOW) for child with invisible parent */
1103 static const struct message WmHideChildInvisibleParentSeq_2
[] = {
1104 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
1105 { EVENT_OBJECT_HIDE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1106 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOREDRAW
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
1109 /* DestroyWindow for a visible child window */
1110 static const struct message WmDestroyChildSeq
[] = {
1111 { HCBT_DESTROYWND
, hook
},
1112 { 0x0090, sent
|optional
},
1113 { WM_PARENTNOTIFY
, sent
|parent
|wparam
, WM_DESTROY
},
1114 { WM_SHOWWINDOW
, sent
|wparam
, 0 },
1115 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
1116 { EVENT_OBJECT_HIDE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1117 { WM_ERASEBKGND
, sent
|parent
|optional
},
1118 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
1119 { HCBT_SETFOCUS
, hook
}, /* set focus to a parent */
1120 { WM_KILLFOCUS
, sent
},
1121 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 0 },
1122 { WM_IME_SETCONTEXT
, sent
|wparam
|parent
|optional
, 1 },
1123 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
1124 { WM_SETFOCUS
, sent
|parent
},
1125 { EVENT_OBJECT_DESTROY
, winevent_hook
|wparam
|lparam
, 0, 0 },
1126 { WM_DESTROY
, sent
},
1127 { WM_DESTROY
, sent
|optional
}, /* some other (IME?) window */
1128 { WM_NCDESTROY
, sent
|optional
}, /* some other (IME?) window */
1129 { WM_NCDESTROY
, sent
},
1132 /* visible child window destroyed by thread exit */
1133 static const struct message WmExitThreadSeq
[] = {
1134 { WM_NCDESTROY
, sent
}, /* actually in grandchild */
1135 { WM_PAINT
, sent
|parent
},
1136 { WM_ERASEBKGND
, sent
|parent
|beginpaint
},
1139 /* DestroyWindow for a visible child window with invisible parent */
1140 static const struct message WmDestroyInvisibleChildSeq
[] = {
1141 { HCBT_DESTROYWND
, hook
},
1142 { 0x0090, sent
|optional
},
1143 { WM_PARENTNOTIFY
, sent
|parent
|wparam
, WM_DESTROY
},
1144 { WM_SHOWWINDOW
, sent
|wparam
, 0 },
1145 { EVENT_OBJECT_DESTROY
, winevent_hook
|wparam
|lparam
, 0, 0 },
1146 { WM_DESTROY
, sent
},
1147 { WM_NCDESTROY
, sent
},
1150 /* Moving the mouse in nonclient area */
1151 static const struct message WmMouseMoveInNonClientAreaSeq
[] = { /* FIXME: add */
1152 { WM_NCHITTEST
, sent
},
1153 { WM_SETCURSOR
, sent
},
1154 { WM_NCMOUSEMOVE
, posted
},
1157 /* Moving the mouse in client area */
1158 static const struct message WmMouseMoveInClientAreaSeq
[] = { /* FIXME: add */
1159 { WM_NCHITTEST
, sent
},
1160 { WM_SETCURSOR
, sent
},
1161 { WM_MOUSEMOVE
, posted
},
1164 /* Moving by dragging the title bar (after WM_NCHITTEST and WM_SETCURSOR) (outline move) */
1165 static const struct message WmDragTitleBarSeq
[] = { /* FIXME: add */
1166 { WM_NCLBUTTONDOWN
, sent
|wparam
, HTCAPTION
},
1167 { WM_SYSCOMMAND
, sent
|defwinproc
|wparam
, SC_MOVE
+2 },
1168 { WM_GETMINMAXINFO
, sent
|defwinproc
},
1169 { WM_ENTERSIZEMOVE
, sent
|defwinproc
},
1170 { WM_WINDOWPOSCHANGING
, sent
|wparam
|defwinproc
, 0 },
1171 { WM_WINDOWPOSCHANGED
, sent
|wparam
|defwinproc
, 0 },
1172 { WM_MOVE
, sent
|defwinproc
},
1173 { WM_EXITSIZEMOVE
, sent
|defwinproc
},
1176 /* Sizing by dragging the thick borders (after WM_NCHITTEST and WM_SETCURSOR) (outline move) */
1177 static const struct message WmDragThickBordersBarSeq
[] = { /* FIXME: add */
1178 { WM_NCLBUTTONDOWN
, sent
|wparam
, 0xd },
1179 { WM_SYSCOMMAND
, sent
|defwinproc
|wparam
, 0xf004 },
1180 { WM_GETMINMAXINFO
, sent
|defwinproc
},
1181 { WM_ENTERSIZEMOVE
, sent
|defwinproc
},
1182 { WM_SIZING
, sent
|defwinproc
|wparam
, 4}, /* one for each mouse movement */
1183 { WM_WINDOWPOSCHANGING
, sent
|wparam
|defwinproc
, 0 },
1184 { WM_GETMINMAXINFO
, sent
|defwinproc
},
1185 { WM_NCCALCSIZE
, sent
|defwinproc
|wparam
, 1 },
1186 { WM_NCPAINT
, sent
|defwinproc
|wparam
, 1 },
1187 { WM_GETTEXT
, sent
|defwinproc
},
1188 { WM_ERASEBKGND
, sent
|defwinproc
},
1189 { WM_WINDOWPOSCHANGED
, sent
|wparam
|defwinproc
, 0 },
1190 { WM_MOVE
, sent
|defwinproc
},
1191 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_RESTORED
},
1192 { WM_EXITSIZEMOVE
, sent
|defwinproc
},
1195 /* Resizing child window with MoveWindow (32) */
1196 static const struct message WmResizingChildWithMoveWindowSeq
[] = {
1197 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_NOACTIVATE
},
1198 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
1199 { WM_ERASEBKGND
, sent
|parent
|optional
},
1200 { WM_ERASEBKGND
, sent
|optional
},
1201 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_NOACTIVATE
},
1202 { WM_MOVE
, sent
|defwinproc
},
1203 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_RESTORED
},
1204 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1207 /* Clicking on inactive button */
1208 static const struct message WmClickInactiveButtonSeq
[] = { /* FIXME: add */
1209 { WM_NCHITTEST
, sent
},
1210 { WM_PARENTNOTIFY
, sent
|parent
|wparam
, WM_LBUTTONDOWN
},
1211 { WM_MOUSEACTIVATE
, sent
},
1212 { WM_MOUSEACTIVATE
, sent
|parent
|defwinproc
},
1213 { WM_SETCURSOR
, sent
},
1214 { WM_SETCURSOR
, sent
|parent
|defwinproc
},
1215 { WM_LBUTTONDOWN
, posted
},
1216 { WM_KILLFOCUS
, posted
|parent
},
1217 { WM_SETFOCUS
, posted
},
1218 { WM_CTLCOLORBTN
, posted
|parent
},
1219 { BM_SETSTATE
, posted
},
1220 { WM_CTLCOLORBTN
, posted
|parent
},
1221 { WM_LBUTTONUP
, posted
},
1222 { BM_SETSTATE
, posted
},
1223 { WM_CTLCOLORBTN
, posted
|parent
},
1224 { WM_COMMAND
, posted
|parent
},
1227 /* Reparenting a button (16/32) */
1228 /* The last child (button) reparented gets topmost for its new parent. */
1229 static const struct message WmReparentButtonSeq
[] = { /* FIXME: add */
1230 { WM_SHOWWINDOW
, sent
|wparam
, 0 },
1231 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOMOVE
|SWP_NOSIZE
},
1232 { EVENT_OBJECT_HIDE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1233 { WM_ERASEBKGND
, sent
|parent
},
1234 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOMOVE
|SWP_NOSIZE
},
1235 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_NOSIZE
},
1236 { WM_CHILDACTIVATE
, sent
},
1237 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_NOSIZE
|SWP_NOREDRAW
},
1238 { WM_MOVE
, sent
|defwinproc
},
1239 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
1242 /* Creation of a custom dialog (32) */
1243 static const struct message WmCreateCustomDialogSeq
[] = {
1244 { HCBT_CREATEWND
, hook
},
1245 { WM_GETMINMAXINFO
, sent
},
1246 { WM_NCCREATE
, sent
},
1247 { WM_NCCALCSIZE
, sent
|wparam
, 0 },
1248 { EVENT_OBJECT_REORDER
, winevent_hook
|wparam
|lparam
, 0, 0 },
1249 { WM_CREATE
, sent
},
1250 { EVENT_OBJECT_CREATE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1251 { WM_NOTIFYFORMAT
, sent
|optional
},
1252 { WM_QUERYUISTATE
, sent
|optional
},
1253 { WM_WINDOWPOSCHANGING
, sent
|optional
},
1254 { WM_GETMINMAXINFO
, sent
|optional
},
1255 { WM_NCCALCSIZE
, sent
|optional
},
1256 { WM_WINDOWPOSCHANGED
, sent
|optional
},
1257 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
1258 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
},
1259 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
1260 { HCBT_ACTIVATE
, hook
},
1261 { EVENT_SYSTEM_FOREGROUND
, winevent_hook
|wparam
|lparam
, 0, 0 },
1264 { WM_QUERYNEWPALETTE
, sent
|wparam
|lparam
|optional
, 0, 0 },
1266 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_NOSIZE
|SWP_NOMOVE
},
1268 { WM_NCACTIVATE
, sent
},
1269 { WM_GETTEXT
, sent
|optional
|defwinproc
},
1270 { WM_GETTEXT
, sent
|optional
|defwinproc
},
1271 { WM_GETTEXT
, sent
|optional
|defwinproc
},
1272 { EVENT_OBJECT_DEFACTIONCHANGE
, winevent_hook
|wparam
|lparam
|optional
, OBJID_CLIENT
, 0 },
1273 { WM_ACTIVATE
, sent
|wparam
, 1 },
1274 { WM_GETTEXT
, sent
|optional
},
1275 { WM_KILLFOCUS
, sent
|parent
},
1276 { WM_IME_SETCONTEXT
, sent
|parent
|wparam
|optional
, 0 },
1277 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 1 },
1278 { WM_IME_NOTIFY
, sent
|wparam
|defwinproc
|optional
, 2 },
1279 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
1280 { WM_SETFOCUS
, sent
},
1281 { WM_GETDLGCODE
, sent
|defwinproc
|wparam
, 0 },
1282 { WM_NCPAINT
, sent
|wparam
, 1 },
1283 { WM_GETTEXT
, sent
|optional
|defwinproc
},
1284 { WM_GETTEXT
, sent
|optional
|defwinproc
},
1285 { WM_ERASEBKGND
, sent
},
1286 { WM_CTLCOLORDLG
, sent
|optional
|defwinproc
},
1287 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
1288 { WM_GETTEXT
, sent
|optional
},
1289 { WM_GETTEXT
, sent
|optional
},
1290 { WM_NCCALCSIZE
, sent
|optional
},
1291 { WM_NCPAINT
, sent
|optional
},
1292 { WM_GETTEXT
, sent
|optional
|defwinproc
},
1293 { WM_GETTEXT
, sent
|optional
|defwinproc
},
1294 { WM_ERASEBKGND
, sent
|optional
},
1295 { WM_CTLCOLORDLG
, sent
|optional
|defwinproc
},
1296 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1297 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
1301 /* Calling EndDialog for a custom dialog (32) */
1302 static const struct message WmEndCustomDialogSeq
[] = {
1303 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
1304 { EVENT_OBJECT_HIDE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1305 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
1306 { WM_GETTEXT
, sent
|optional
},
1307 { HCBT_ACTIVATE
, hook
},
1308 { WM_NCACTIVATE
, sent
|wparam
, 0 },
1309 { WM_GETTEXT
, sent
|optional
|defwinproc
},
1310 { WM_GETTEXT
, sent
|optional
|defwinproc
},
1311 { WM_ACTIVATE
, sent
|wparam
, 0 },
1312 { EVENT_SYSTEM_FOREGROUND
, winevent_hook
|wparam
|lparam
, 0, 0 },
1313 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
1314 { WM_WINDOWPOSCHANGED
, sent
|wparam
|optional
, SWP_NOACTIVATE
|SWP_NOREDRAW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
1315 { WM_GETTEXT
, sent
|optional
|defwinproc
},
1316 { WM_GETTEXT
, sent
|optional
|defwinproc
},
1317 { HCBT_SETFOCUS
, hook
},
1318 { WM_KILLFOCUS
, sent
},
1319 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 0 },
1320 { WM_IME_SETCONTEXT
, sent
|parent
|wparam
|defwinproc
|optional
, 1 },
1321 { WM_IME_NOTIFY
, sent
|wparam
|optional
, 1 },
1322 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
1323 { WM_SETFOCUS
, sent
|parent
|defwinproc
},
1326 /* ShowWindow(SW_SHOW) for a custom dialog (initially invisible) */
1327 static const struct message WmShowCustomDialogSeq
[] = {
1328 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
1329 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
},
1330 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
1331 { HCBT_ACTIVATE
, hook
},
1332 { EVENT_SYSTEM_FOREGROUND
, winevent_hook
|wparam
|lparam
, 0, 0 },
1334 { WM_QUERYNEWPALETTE
, sent
|wparam
|lparam
|optional
, 0, 0 },
1336 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_NOSIZE
|SWP_NOMOVE
},
1337 { WM_ACTIVATEAPP
, sent
|wparam
|optional
, 1 },
1338 { WM_NCACTIVATE
, sent
},
1339 { WM_ACTIVATE
, sent
|wparam
, 1 },
1340 { WM_GETTEXT
, sent
|optional
},
1342 { WM_KILLFOCUS
, sent
|parent
},
1343 { WM_IME_SETCONTEXT
, sent
|parent
|wparam
|optional
, 0 },
1344 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 1 },
1345 { WM_IME_NOTIFY
, sent
|wparam
|defwinproc
|optional
, 2 },
1346 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
1347 { WM_SETFOCUS
, sent
},
1348 { WM_GETDLGCODE
, sent
|defwinproc
|wparam
, 0 },
1349 { WM_NCPAINT
, sent
|wparam
, 1 },
1350 { WM_ERASEBKGND
, sent
},
1351 { WM_CTLCOLORDLG
, sent
|defwinproc
},
1352 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
1355 /* Creation and destruction of a modal dialog (32) */
1356 static const struct message WmModalDialogSeq
[] = {
1357 { WM_CANCELMODE
, sent
|parent
},
1358 { HCBT_SETFOCUS
, hook
},
1359 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
1360 { WM_KILLFOCUS
, sent
|parent
},
1361 { WM_IME_SETCONTEXT
, sent
|parent
|wparam
|optional
, 0 },
1362 { EVENT_OBJECT_STATECHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1363 { WM_ENABLE
, sent
|parent
|wparam
, 0 },
1364 { HCBT_CREATEWND
, hook
},
1365 { EVENT_OBJECT_REORDER
, winevent_hook
|wparam
|lparam
, 0, 0 },
1366 { EVENT_OBJECT_CREATE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1367 { WM_SETFONT
, sent
},
1368 { WM_INITDIALOG
, sent
},
1369 { WM_CHANGEUISTATE
, sent
|optional
},
1370 { WM_UPDATEUISTATE
, sent
|optional
},
1371 { WM_SHOWWINDOW
, sent
},
1372 { HCBT_ACTIVATE
, hook
},
1373 { EVENT_SYSTEM_FOREGROUND
, winevent_hook
|wparam
|lparam
, 0, 0 },
1374 { WM_QUERYNEWPALETTE
, sent
|wparam
|lparam
|optional
, 0, 0 },
1375 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_NOSIZE
|SWP_NOMOVE
},
1376 { WM_NCACTIVATE
, sent
},
1377 { WM_GETTEXT
, sent
|optional
},
1378 { WM_ACTIVATE
, sent
|wparam
, 1 },
1379 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOACTIVATE
},
1380 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
1381 { WM_NCPAINT
, sent
|optional
},
1382 { WM_GETTEXT
, sent
|optional
},
1383 { WM_ERASEBKGND
, sent
|optional
},
1384 { WM_CTLCOLORDLG
, sent
|optional
},
1385 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOACTIVATE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
1386 { WM_GETTEXT
, sent
|optional
},
1387 { WM_NCCALCSIZE
, sent
|optional
},
1388 { WM_NCPAINT
, sent
|optional
},
1389 { WM_GETTEXT
, sent
|optional
},
1390 { WM_ERASEBKGND
, sent
|optional
},
1391 { WM_CTLCOLORDLG
, sent
|optional
},
1392 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1393 { WM_PAINT
, sent
|optional
},
1394 { WM_CTLCOLORBTN
, sent
|optional
},
1395 { WM_GETTITLEBARINFOEX
, sent
|optional
},
1396 { WM_ENTERIDLE
, sent
|parent
|optional
},
1397 { WM_ENTERIDLE
, sent
|parent
|optional
},
1398 { WM_ENTERIDLE
, sent
|parent
|optional
},
1399 { WM_ENTERIDLE
, sent
|parent
|optional
},
1400 { WM_ENTERIDLE
, sent
|parent
|optional
},
1401 { WM_ENTERIDLE
, sent
|parent
|optional
},
1402 { WM_ENTERIDLE
, sent
|parent
|optional
},
1403 { WM_ENTERIDLE
, sent
|parent
|optional
},
1404 { WM_ENTERIDLE
, sent
|parent
|optional
},
1405 { WM_ENTERIDLE
, sent
|parent
|optional
},
1406 { WM_ENTERIDLE
, sent
|parent
|optional
},
1407 { WM_ENTERIDLE
, sent
|parent
|optional
},
1408 { WM_ENTERIDLE
, sent
|parent
|optional
},
1409 { WM_ENTERIDLE
, sent
|parent
|optional
},
1410 { WM_ENTERIDLE
, sent
|parent
|optional
},
1411 { WM_ENTERIDLE
, sent
|parent
|optional
},
1412 { WM_ENTERIDLE
, sent
|parent
|optional
},
1413 { WM_ENTERIDLE
, sent
|parent
|optional
},
1414 { WM_ENTERIDLE
, sent
|parent
|optional
},
1415 { WM_ENTERIDLE
, sent
|parent
|optional
},
1417 { EVENT_OBJECT_STATECHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1418 { WM_ENABLE
, sent
|parent
|wparam
, 1 },
1419 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOACTIVATE
},
1420 { EVENT_OBJECT_HIDE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1421 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOACTIVATE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
1422 { WM_GETTEXT
, sent
|optional
},
1423 { HCBT_ACTIVATE
, hook
},
1424 { WM_NCACTIVATE
, sent
|wparam
, 0 },
1425 { WM_GETTEXT
, sent
|optional
},
1426 { WM_ACTIVATE
, sent
|wparam
, 0 },
1427 { EVENT_SYSTEM_FOREGROUND
, winevent_hook
|wparam
|lparam
, 0, 0 },
1428 { WM_WINDOWPOSCHANGING
, sent
|optional
},
1429 { WM_WINDOWPOSCHANGED
, sent
|optional
},
1430 { HCBT_SETFOCUS
, hook
},
1431 { WM_IME_SETCONTEXT
, sent
|parent
|wparam
|defwinproc
|optional
, 1 },
1432 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
1433 { WM_SETFOCUS
, sent
|parent
|defwinproc
},
1434 { EVENT_SYSTEM_DIALOGEND
, winevent_hook
|wparam
|lparam
, 0, 0 },
1435 { HCBT_DESTROYWND
, hook
},
1436 { 0x0090, sent
|optional
},
1437 { EVENT_OBJECT_DESTROY
, winevent_hook
|wparam
|lparam
, 0, 0 },
1438 { WM_DESTROY
, sent
},
1439 { WM_NCDESTROY
, sent
},
1442 /* Creation of a modal dialog that is resized inside WM_INITDIALOG (32) */
1443 static const struct message WmCreateModalDialogResizeSeq
[] = { /* FIXME: add */
1444 /* (inside dialog proc, handling WM_INITDIALOG) */
1445 { WM_WINDOWPOSCHANGING
, sent
|wparam
, 0 },
1446 { WM_NCCALCSIZE
, sent
},
1447 { WM_NCACTIVATE
, sent
|parent
|wparam
, 0 },
1448 { WM_GETTEXT
, sent
|defwinproc
},
1449 { WM_ACTIVATE
, sent
|parent
|wparam
, 0 },
1450 { WM_WINDOWPOSCHANGING
, sent
|wparam
, 0 },
1451 { WM_WINDOWPOSCHANGING
, sent
|parent
},
1452 { WM_NCACTIVATE
, sent
|wparam
, 1 },
1453 { WM_ACTIVATE
, sent
|wparam
, 1 },
1454 { WM_WINDOWPOSCHANGED
, sent
|wparam
, 0 },
1455 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_RESTORED
},
1456 /* (setting focus) */
1457 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
1458 { WM_WINDOWPOSCHANGING
, sent
|wparam
, 0 },
1459 { WM_NCPAINT
, sent
},
1460 { WM_GETTEXT
, sent
|defwinproc
},
1461 { WM_ERASEBKGND
, sent
},
1462 { WM_CTLCOLORDLG
, sent
|defwinproc
},
1463 { WM_WINDOWPOSCHANGED
, sent
|wparam
, 0 },
1465 /* (bunch of WM_CTLCOLOR* for each control) */
1466 { WM_PAINT
, sent
|parent
},
1467 { WM_ENTERIDLE
, sent
|parent
|wparam
, 0 },
1468 { WM_SETCURSOR
, sent
|parent
},
1471 /* SetMenu for NonVisible windows with size change*/
1472 static const struct message WmSetMenuNonVisibleSizeChangeSeq
[] = {
1473 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
1474 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
1475 { EVENT_OBJECT_REORDER
, winevent_hook
|wparam
|lparam
, 0, 0 },
1476 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOREDRAW
},
1477 { WM_MOVE
, sent
|defwinproc
},
1478 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_RESTORED
},
1479 { WM_NCCALCSIZE
,sent
|wparam
|optional
, 1 }, /* XP */
1480 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1481 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
|optional
, 0, 0 }, /* XP sends a duplicate */
1482 { WM_GETTEXT
, sent
|optional
},
1483 { WM_NCCALCSIZE
, sent
|wparam
|optional
, 1 },
1486 /* SetMenu for NonVisible windows with no size change */
1487 static const struct message WmSetMenuNonVisibleNoSizeChangeSeq
[] = {
1488 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
1489 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
1490 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOREDRAW
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
1491 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1494 /* SetMenu for Visible windows with size change */
1495 static const struct message WmSetMenuVisibleSizeChangeSeq
[] = {
1496 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
1497 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
1498 { 0x0093, sent
|defwinproc
|optional
},
1499 { EVENT_OBJECT_REORDER
, winevent_hook
|wparam
|lparam
, 0, 0 },
1500 { WM_NCPAINT
, sent
|optional
}, /* wparam != 1 */
1501 { 0x0093, sent
|defwinproc
|optional
},
1502 { 0x0093, sent
|defwinproc
|optional
},
1503 { 0x0091, sent
|defwinproc
|optional
},
1504 { 0x0092, sent
|defwinproc
|optional
},
1505 { WM_GETTEXT
, sent
|defwinproc
|optional
},
1506 { WM_ERASEBKGND
, sent
|optional
},
1507 { WM_ACTIVATE
, sent
|optional
},
1508 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
1509 { WM_MOVE
, sent
|defwinproc
},
1510 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_RESTORED
},
1511 { 0x0093, sent
|optional
},
1512 { WM_NCCALCSIZE
, sent
|wparam
|optional
, 1 },
1513 { 0x0093, sent
|defwinproc
|optional
},
1514 { WM_NCPAINT
, sent
|optional
}, /* wparam != 1 */
1515 { 0x0093, sent
|defwinproc
|optional
},
1516 { 0x0093, sent
|defwinproc
|optional
},
1517 { 0x0091, sent
|defwinproc
|optional
},
1518 { 0x0092, sent
|defwinproc
|optional
},
1519 { WM_ERASEBKGND
, sent
|optional
},
1520 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1521 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
|optional
, 0, 0 }, /* XP sends a duplicate */
1524 /* SetMenu for Visible windows with no size change */
1525 static const struct message WmSetMenuVisibleNoSizeChangeSeq
[] = {
1526 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
1527 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
1528 { WM_NCPAINT
, sent
|optional
}, /* wparam != 1 */
1529 { WM_GETTEXT
, sent
|defwinproc
|optional
},
1530 { WM_ERASEBKGND
, sent
|optional
},
1531 { WM_ACTIVATE
, sent
|optional
},
1532 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
1533 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1536 /* DrawMenuBar for a visible window */
1537 static const struct message WmDrawMenuBarSeq
[] =
1539 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
1540 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
1541 { 0x0093, sent
|defwinproc
|optional
},
1542 { WM_NCPAINT
, sent
|optional
}, /* wparam != 1 */
1543 { 0x0093, sent
|defwinproc
|optional
},
1544 { 0x0093, sent
|defwinproc
|optional
},
1545 { 0x0091, sent
|defwinproc
|optional
},
1546 { 0x0092, sent
|defwinproc
|optional
},
1547 { WM_GETTEXT
, sent
|defwinproc
|optional
},
1548 { WM_ERASEBKGND
, sent
|optional
},
1549 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
1550 { 0x0093, sent
|optional
},
1551 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1555 static const struct message WmSetRedrawFalseSeq
[] =
1557 { WM_SETREDRAW
, sent
|wparam
, 0 },
1561 static const struct message WmSetRedrawTrueSeq
[] =
1563 { WM_SETREDRAW
, sent
|wparam
, 1 },
1567 static const struct message WmEnableWindowSeq_1
[] =
1569 { WM_CANCELMODE
, sent
|wparam
|lparam
, 0, 0 },
1570 { EVENT_OBJECT_STATECHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1571 { HCBT_SETFOCUS
, hook
|optional
},
1572 { WM_KILLFOCUS
, sent
|optional
},
1573 { WM_ENABLE
, sent
|wparam
|lparam
, FALSE
, 0 },
1577 static const struct message WmEnableWindowSeq_2
[] =
1579 { EVENT_OBJECT_STATECHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1580 { WM_ENABLE
, sent
|wparam
|lparam
, TRUE
, 0 },
1584 static const struct message WmGetScrollRangeSeq
[] =
1586 { SBM_GETRANGE
, sent
},
1589 static const struct message WmGetScrollInfoSeq
[] =
1591 { SBM_GETSCROLLINFO
, sent
},
1594 static const struct message WmSetScrollRangeSeq
[] =
1596 /* MSDN claims that Windows sends SBM_SETRANGE message, but win2k SP4
1597 sends SBM_SETSCROLLINFO.
1599 { SBM_SETSCROLLINFO
, sent
},
1602 /* SetScrollRange for a window without a non-client area */
1603 static const struct message WmSetScrollRangeHSeq_empty
[] =
1605 { EVENT_OBJECT_VALUECHANGE
, winevent_hook
|wparam
|lparam
, OBJID_HSCROLL
, 0 },
1608 static const struct message WmSetScrollRangeVSeq_empty
[] =
1610 { EVENT_OBJECT_VALUECHANGE
, winevent_hook
|wparam
|lparam
, OBJID_VSCROLL
, 0 },
1613 static const struct message WmSetScrollRangeHVSeq
[] =
1615 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOMOVE
|SWP_NOSIZE
},
1616 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
1617 { WM_GETTEXT
, sent
|defwinproc
|optional
},
1618 { WM_ERASEBKGND
, sent
|optional
},
1619 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOMOVE
|SWP_NOSIZE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
1620 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1621 { EVENT_OBJECT_VALUECHANGE
, winevent_hook
|lparam
|optional
, 0/*OBJID_HSCROLL or OBJID_VSCROLL*/, 0 },
1624 /* SetScrollRange for a window with a non-client area */
1625 static const struct message WmSetScrollRangeHV_NC_Seq
[] =
1627 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOMOVE
|SWP_NOSIZE
},
1628 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
1629 { EVENT_OBJECT_REORDER
, winevent_hook
|wparam
|lparam
, 0, 0 },
1630 { WM_NCPAINT
, sent
|optional
},
1631 { WM_STYLECHANGING
, sent
|defwinproc
|optional
},
1632 { WM_STYLECHANGED
, sent
|defwinproc
|optional
},
1633 { WM_STYLECHANGING
, sent
|defwinproc
|optional
},
1634 { WM_STYLECHANGED
, sent
|defwinproc
|optional
},
1635 { WM_STYLECHANGING
, sent
|defwinproc
|optional
},
1636 { WM_STYLECHANGED
, sent
|defwinproc
|optional
},
1637 { WM_STYLECHANGING
, sent
|defwinproc
|optional
},
1638 { WM_STYLECHANGED
, sent
|defwinproc
|optional
},
1639 { WM_GETTEXT
, sent
|defwinproc
|optional
},
1640 { WM_GETTEXT
, sent
|defwinproc
|optional
},
1641 { WM_ERASEBKGND
, sent
|optional
},
1642 { WM_CTLCOLORDLG
, sent
|defwinproc
|optional
}, /* sent to a parent of the dialog */
1643 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOMOVE
|SWP_NOSIZE
|SWP_NOCLIENTMOVE
, 0, SWP_NOCLIENTSIZE
},
1644 { WM_SIZE
, sent
|defwinproc
|optional
},
1645 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1646 { EVENT_OBJECT_VALUECHANGE
, winevent_hook
|lparam
|optional
, 0/*OBJID_HSCROLL or OBJID_VSCROLL*/, 0 },
1647 { WM_GETTEXT
, sent
|optional
},
1648 { WM_GETTEXT
, sent
|optional
},
1649 { WM_GETTEXT
, sent
|optional
},
1650 { WM_GETTEXT
, sent
|optional
},
1653 /* test if we receive the right sequence of messages */
1654 /* after calling ShowWindow( SW_SHOWNA) */
1655 static const struct message WmSHOWNAChildInvisParInvis
[] = {
1656 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
1659 static const struct message WmSHOWNAChildVisParInvis
[] = {
1660 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
1663 static const struct message WmSHOWNAChildVisParVis
[] = {
1664 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
1665 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOACTIVATE
},
1668 static const struct message WmSHOWNAChildInvisParVis
[] = {
1669 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
1670 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
1671 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
1672 { WM_ERASEBKGND
, sent
|optional
},
1673 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOACTIVATE
|SWP_NOCLIENTMOVE
},
1676 static const struct message WmSHOWNATopVisible
[] = {
1677 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
1678 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOACTIVATE
},
1679 { WM_NCPAINT
, sent
|wparam
|optional
, 1 },
1680 { WM_GETTEXT
, sent
|defwinproc
|optional
},
1681 { WM_ERASEBKGND
, sent
|optional
},
1682 { WM_WINDOWPOSCHANGED
, sent
|optional
},
1685 static const struct message WmSHOWNATopInvisible
[] = {
1686 { WM_NOTIFYFORMAT
, sent
|optional
},
1687 { WM_QUERYUISTATE
, sent
|optional
},
1688 { WM_WINDOWPOSCHANGING
, sent
|optional
},
1689 { WM_GETMINMAXINFO
, sent
|optional
},
1690 { WM_NCCALCSIZE
, sent
|optional
},
1691 { WM_WINDOWPOSCHANGED
, sent
|optional
},
1692 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
1693 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
1694 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
1695 { WM_NCPAINT
, sent
|wparam
|optional
, 1 },
1696 { WM_GETTEXT
, sent
|defwinproc
|optional
},
1697 { WM_ERASEBKGND
, sent
|optional
},
1698 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
1699 { WM_NCCALCSIZE
, sent
|wparam
|optional
, 1 },
1700 { WM_NCPAINT
, sent
|wparam
|optional
, 1 },
1701 { WM_ERASEBKGND
, sent
|optional
},
1702 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
1703 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
1708 static int after_end_dialog
, test_def_id
;
1709 static int sequence_cnt
, sequence_size
;
1710 static struct recvd_message
* sequence
;
1711 static int log_all_parent_messages
;
1712 static int paint_loop_done
;
1714 /* user32 functions */
1715 static HWND (WINAPI
*pGetAncestor
)(HWND
,UINT
);
1716 static BOOL (WINAPI
*pGetMenuInfo
)(HMENU
,LPCMENUINFO
);
1717 static void (WINAPI
*pNotifyWinEvent
)(DWORD
, HWND
, LONG
, LONG
);
1718 static BOOL (WINAPI
*pSetMenuInfo
)(HMENU
,LPCMENUINFO
);
1719 static HWINEVENTHOOK (WINAPI
*pSetWinEventHook
)(DWORD
, DWORD
, HMODULE
, WINEVENTPROC
, DWORD
, DWORD
, DWORD
);
1720 static BOOL (WINAPI
*pTrackMouseEvent
)(TRACKMOUSEEVENT
*);
1721 static BOOL (WINAPI
*pUnhookWinEvent
)(HWINEVENTHOOK
);
1722 static BOOL (WINAPI
*pGetMonitorInfoA
)(HMONITOR
,LPMONITORINFO
);
1723 static HMONITOR (WINAPI
*pMonitorFromPoint
)(POINT
,DWORD
);
1724 /* kernel32 functions */
1725 static BOOL (WINAPI
*pGetCPInfoExA
)(UINT
, DWORD
, LPCPINFOEXA
);
1727 static void init_procs(void)
1729 HMODULE user32
= GetModuleHandleA("user32.dll");
1730 HMODULE kernel32
= GetModuleHandleA("kernel32.dll");
1732 #define GET_PROC(dll, func) \
1733 p ## func = (void*)GetProcAddress(dll, #func); \
1735 trace("GetProcAddress(%s) failed\n", #func); \
1738 GET_PROC(user32
, GetAncestor
)
1739 GET_PROC(user32
, GetMenuInfo
)
1740 GET_PROC(user32
, NotifyWinEvent
)
1741 GET_PROC(user32
, SetMenuInfo
)
1742 GET_PROC(user32
, SetWinEventHook
)
1743 GET_PROC(user32
, TrackMouseEvent
)
1744 GET_PROC(user32
, UnhookWinEvent
)
1745 GET_PROC(user32
, GetMonitorInfoA
)
1746 GET_PROC(user32
, MonitorFromPoint
)
1748 GET_PROC(kernel32
, GetCPInfoExA
)
1753 static const char *get_winpos_flags(UINT flags
)
1755 static char buffer
[300];
1758 #define DUMP(flag) do { if (flags & flag) { strcat( buffer, "|" #flag ); flags &= ~flag; } } while(0)
1759 DUMP( SWP_SHOWWINDOW
);
1760 DUMP( SWP_HIDEWINDOW
);
1761 DUMP( SWP_NOACTIVATE
);
1762 DUMP( SWP_FRAMECHANGED
);
1763 DUMP( SWP_NOCOPYBITS
);
1764 DUMP( SWP_NOOWNERZORDER
);
1765 DUMP( SWP_NOSENDCHANGING
);
1766 DUMP( SWP_DEFERERASE
);
1767 DUMP( SWP_ASYNCWINDOWPOS
);
1768 DUMP( SWP_NOZORDER
);
1769 DUMP( SWP_NOREDRAW
);
1772 DUMP( SWP_NOCLIENTSIZE
);
1773 DUMP( SWP_NOCLIENTMOVE
);
1774 if (flags
) sprintf(buffer
+ strlen(buffer
),"|0x%04x", flags
);
1779 static BOOL
ignore_message( UINT message
)
1781 /* these are always ignored */
1782 return (message
>= 0xc000 ||
1783 message
== WM_GETICON
||
1784 message
== WM_GETOBJECT
||
1785 message
== WM_TIMECHANGE
||
1786 message
== WM_DISPLAYCHANGE
||
1787 message
== WM_DEVICECHANGE
||
1788 message
== WM_DWMNCRENDERINGCHANGED
);
1792 #define add_message(msg) add_message_(__LINE__,msg);
1793 static void add_message_(int line
, const struct recvd_message
*msg
)
1795 struct recvd_message
*seq
;
1800 sequence
= HeapAlloc( GetProcessHeap(), 0, sequence_size
* sizeof(*sequence
) );
1802 if (sequence_cnt
== sequence_size
)
1805 sequence
= HeapReAlloc( GetProcessHeap(), 0, sequence
, sequence_size
* sizeof(*sequence
) );
1809 seq
= &sequence
[sequence_cnt
];
1810 seq
->hwnd
= msg
->hwnd
;
1811 seq
->message
= msg
->message
;
1812 seq
->flags
= msg
->flags
;
1813 seq
->wParam
= msg
->wParam
;
1814 seq
->lParam
= msg
->lParam
;
1816 seq
->descr
= msg
->descr
;
1821 if (msg
->flags
& hook
)
1823 static const char * const CBT_code_name
[10] =
1831 "HCBT_CLICKSKIPPED",
1836 const char *code_name
= (msg
->message
<= HCBT_SETFOCUS
) ? CBT_code_name
[msg
->message
] : "Unknown";
1838 sprintf( seq
->output
, "%s: hook %d (%s) wp %08lx lp %08lx",
1839 msg
->descr
, msg
->message
, code_name
, msg
->wParam
, msg
->lParam
);
1841 else if (msg
->flags
& winevent_hook
)
1843 sprintf( seq
->output
, "%s: winevent %p %08x %08lx %08lx",
1844 msg
->descr
, msg
->hwnd
, msg
->message
, msg
->wParam
, msg
->lParam
);
1848 switch (msg
->message
)
1850 case WM_WINDOWPOSCHANGING
:
1851 case WM_WINDOWPOSCHANGED
:
1853 WINDOWPOS
*winpos
= (WINDOWPOS
*)msg
->lParam
;
1855 sprintf( seq
->output
, "%s: %p WM_WINDOWPOS%s wp %08lx lp %08lx after %p x %d y %d cx %d cy %d flags %s",
1856 msg
->descr
, msg
->hwnd
,
1857 (msg
->message
== WM_WINDOWPOSCHANGING
) ? "CHANGING" : "CHANGED",
1858 msg
->wParam
, msg
->lParam
, winpos
->hwndInsertAfter
,
1859 winpos
->x
, winpos
->y
, winpos
->cx
, winpos
->cy
,
1860 get_winpos_flags(winpos
->flags
) );
1862 /* Log only documented flags, win2k uses 0x1000 and 0x2000
1863 * in the high word for internal purposes
1865 seq
->wParam
= winpos
->flags
& 0xffff;
1866 /* We are not interested in the flags that don't match under XP and Win9x */
1867 seq
->wParam
&= ~SWP_NOZORDER
;
1873 DRAW_ITEM_STRUCT di
;
1874 DRAWITEMSTRUCT
*dis
= (DRAWITEMSTRUCT
*)msg
->lParam
;
1876 sprintf( seq
->output
, "%s: %p WM_DRAWITEM: type %x, ctl_id %x, item_id %x, action %x, state %x",
1877 msg
->descr
, msg
->hwnd
, dis
->CtlType
, dis
->CtlID
,
1878 dis
->itemID
, dis
->itemAction
, dis
->itemState
);
1881 di
.u
.item
.type
= dis
->CtlType
;
1882 di
.u
.item
.ctl_id
= dis
->CtlID
;
1883 if (dis
->CtlType
== ODT_LISTBOX
||
1884 dis
->CtlType
== ODT_COMBOBOX
||
1885 dis
->CtlType
== ODT_MENU
)
1886 di
.u
.item
.item_id
= dis
->itemID
;
1887 di
.u
.item
.action
= dis
->itemAction
;
1888 di
.u
.item
.state
= dis
->itemState
;
1890 seq
->lParam
= di
.u
.lp
;
1894 if (msg
->message
>= 0xc000) return; /* ignore registered messages */
1895 sprintf( seq
->output
, "%s: %p %04x wp %08lx lp %08lx",
1896 msg
->descr
, msg
->hwnd
, msg
->message
, msg
->wParam
, msg
->lParam
);
1898 if (msg
->flags
& (sent
|posted
|parent
|defwinproc
|beginpaint
))
1899 sprintf( seq
->output
+ strlen(seq
->output
), " (flags %x)", msg
->flags
);
1906 /* try to make sure pending X events have been processed before continuing */
1907 static void flush_events(void)
1911 int min_timeout
= 100;
1912 DWORD time
= GetTickCount() + diff
;
1916 if (MsgWaitForMultipleObjects( 0, NULL
, FALSE
, min_timeout
, QS_ALLINPUT
) == WAIT_TIMEOUT
) break;
1917 while (PeekMessage( &msg
, 0, 0, 0, PM_REMOVE
)) DispatchMessage( &msg
);
1918 diff
= time
- GetTickCount();
1922 static void flush_sequence(void)
1924 HeapFree(GetProcessHeap(), 0, sequence
);
1926 sequence_cnt
= sequence_size
= 0;
1929 static void dump_sequence(const struct message
*expected
, const char *context
, const char *file
, int line
)
1931 const struct recvd_message
*actual
= sequence
;
1932 unsigned int count
= 0;
1934 trace_(file
, line
)("Failed sequence %s:\n", context
);
1935 while (expected
->message
&& actual
->message
)
1937 if (actual
->output
[0])
1939 if (expected
->flags
& hook
)
1941 trace_(file
, line
)( " %u: expected: hook %04x - actual: %s\n",
1942 count
, expected
->message
, actual
->output
);
1944 else if (expected
->flags
& winevent_hook
)
1946 trace_(file
, line
)( " %u: expected: winevent %04x - actual: %s\n",
1947 count
, expected
->message
, actual
->output
);
1949 else if (expected
->flags
& kbd_hook
)
1951 trace_(file
, line
)( " %u: expected: kbd %04x - actual: %s\n",
1952 count
, expected
->message
, actual
->output
);
1956 trace_(file
, line
)( " %u: expected: msg %04x - actual: %s\n",
1957 count
, expected
->message
, actual
->output
);
1961 if (expected
->message
== actual
->message
)
1963 if ((expected
->flags
& defwinproc
) != (actual
->flags
& defwinproc
) &&
1964 (expected
->flags
& optional
))
1966 /* don't match messages if their defwinproc status differs */
1975 /* silently drop winevent messages if there is no support for them */
1976 else if ((expected
->flags
& optional
) || ((expected
->flags
& winevent_hook
) && !hEvent_hook
))
1986 /* optional trailing messages */
1987 while (expected
->message
&& ((expected
->flags
& optional
) ||
1988 ((expected
->flags
& winevent_hook
) && !hEvent_hook
)))
1990 trace_(file
, line
)( " %u: expected: msg %04x - actual: nothing\n", count
, expected
->message
);
1995 if (expected
->message
)
1997 trace_(file
, line
)( " %u: expected: msg %04x - actual: nothing\n", count
, expected
->message
);
2001 while (actual
->message
&& actual
->output
[0])
2003 trace_(file
, line
)( " %u: expected: nothing - actual: %s\n", count
, actual
->output
);
2009 #define ok_sequence( exp, contx, todo) \
2010 ok_sequence_( (exp), (contx), (todo), __FILE__, __LINE__)
2013 static void ok_sequence_(const struct message
*expected_list
, const char *context
, int todo
,
2014 const char *file
, int line
)
2016 static const struct recvd_message end_of_sequence
;
2017 const struct message
*expected
= expected_list
;
2018 const struct recvd_message
*actual
;
2019 int failcount
= 0, dump
= 0;
2020 unsigned int count
= 0;
2022 add_message(&end_of_sequence
);
2026 while (expected
->message
&& actual
->message
)
2028 if (expected
->message
== actual
->message
&&
2029 !((expected
->flags
^ actual
->flags
) & (hook
|winevent_hook
|kbd_hook
)))
2031 if (expected
->flags
& wparam
)
2033 if (((expected
->wParam
^ actual
->wParam
) & ~expected
->wp_mask
) && todo
)
2037 if (strcmp(winetest_platform
, "wine")) dump
++;
2038 ok_( file
, line
) (FALSE
,
2039 "%s: %u: in msg 0x%04x expecting wParam 0x%lx got 0x%lx\n",
2040 context
, count
, expected
->message
, expected
->wParam
, actual
->wParam
);
2045 ok_( file
, line
)( ((expected
->wParam
^ actual
->wParam
) & ~expected
->wp_mask
) == 0,
2046 "%s: %u: in msg 0x%04x expecting wParam 0x%lx got 0x%lx\n",
2047 context
, count
, expected
->message
, expected
->wParam
, actual
->wParam
);
2048 if ((expected
->wParam
^ actual
->wParam
) & ~expected
->wp_mask
) dump
++;
2052 if (expected
->flags
& lparam
)
2054 if (((expected
->lParam
^ actual
->lParam
) & ~expected
->lp_mask
) && todo
)
2058 if (strcmp(winetest_platform
, "wine")) dump
++;
2059 ok_( file
, line
) (FALSE
,
2060 "%s: %u: in msg 0x%04x expecting lParam 0x%lx got 0x%lx\n",
2061 context
, count
, expected
->message
, expected
->lParam
, actual
->lParam
);
2066 ok_( file
, line
)(((expected
->lParam
^ actual
->lParam
) & ~expected
->lp_mask
) == 0,
2067 "%s: %u: in msg 0x%04x expecting lParam 0x%lx got 0x%lx\n",
2068 context
, count
, expected
->message
, expected
->lParam
, actual
->lParam
);
2069 if ((expected
->lParam
^ actual
->lParam
) & ~expected
->lp_mask
) dump
++;
2072 if ((expected
->flags
& optional
) &&
2073 ((expected
->flags
^ actual
->flags
) & (defwinproc
|parent
)))
2075 /* don't match optional messages if their defwinproc or parent status differs */
2080 if ((expected
->flags
& defwinproc
) != (actual
->flags
& defwinproc
) && todo
)
2084 if (strcmp(winetest_platform
, "wine")) dump
++;
2085 ok_( file
, line
) (FALSE
,
2086 "%s: %u: the msg 0x%04x should %shave been sent by DefWindowProc\n",
2087 context
, count
, expected
->message
, (expected
->flags
& defwinproc
) ? "" : "NOT ");
2092 ok_( file
, line
) ((expected
->flags
& defwinproc
) == (actual
->flags
& defwinproc
),
2093 "%s: %u: the msg 0x%04x should %shave been sent by DefWindowProc\n",
2094 context
, count
, expected
->message
, (expected
->flags
& defwinproc
) ? "" : "NOT ");
2095 if ((expected
->flags
& defwinproc
) != (actual
->flags
& defwinproc
)) dump
++;
2098 ok_( file
, line
) ((expected
->flags
& beginpaint
) == (actual
->flags
& beginpaint
),
2099 "%s: %u: the msg 0x%04x should %shave been sent by BeginPaint\n",
2100 context
, count
, expected
->message
, (expected
->flags
& beginpaint
) ? "" : "NOT ");
2101 if ((expected
->flags
& beginpaint
) != (actual
->flags
& beginpaint
)) dump
++;
2103 ok_( file
, line
) ((expected
->flags
& (sent
|posted
)) == (actual
->flags
& (sent
|posted
)),
2104 "%s: %u: the msg 0x%04x should have been %s\n",
2105 context
, count
, expected
->message
, (expected
->flags
& posted
) ? "posted" : "sent");
2106 if ((expected
->flags
& (sent
|posted
)) != (actual
->flags
& (sent
|posted
))) dump
++;
2108 ok_( file
, line
) ((expected
->flags
& parent
) == (actual
->flags
& parent
),
2109 "%s: %u: the msg 0x%04x was expected in %s\n",
2110 context
, count
, expected
->message
, (expected
->flags
& parent
) ? "parent" : "child");
2111 if ((expected
->flags
& parent
) != (actual
->flags
& parent
)) dump
++;
2113 ok_( file
, line
) ((expected
->flags
& hook
) == (actual
->flags
& hook
),
2114 "%s: %u: the msg 0x%04x should have been sent by a hook\n",
2115 context
, count
, expected
->message
);
2116 if ((expected
->flags
& hook
) != (actual
->flags
& hook
)) dump
++;
2118 ok_( file
, line
) ((expected
->flags
& winevent_hook
) == (actual
->flags
& winevent_hook
),
2119 "%s: %u: the msg 0x%04x should have been sent by a winevent hook\n",
2120 context
, count
, expected
->message
);
2121 if ((expected
->flags
& winevent_hook
) != (actual
->flags
& winevent_hook
)) dump
++;
2123 ok_( file
, line
) ((expected
->flags
& kbd_hook
) == (actual
->flags
& kbd_hook
),
2124 "%s: %u: the msg 0x%04x should have been sent by a keyboard hook\n",
2125 context
, count
, expected
->message
);
2126 if ((expected
->flags
& kbd_hook
) != (actual
->flags
& kbd_hook
)) dump
++;
2131 /* silently drop hook messages if there is no support for them */
2132 else if ((expected
->flags
& optional
) ||
2133 ((expected
->flags
& hook
) && !hCBT_hook
) ||
2134 ((expected
->flags
& winevent_hook
) && !hEvent_hook
) ||
2135 ((expected
->flags
& kbd_hook
) && !hKBD_hook
))
2141 if (strcmp(winetest_platform
, "wine")) dump
++;
2142 ok_( file
, line
) (FALSE
, "%s: %u: the msg 0x%04x was expected, but got msg 0x%04x instead\n",
2143 context
, count
, expected
->message
, actual
->message
);
2149 ok_( file
, line
) (FALSE
, "%s: %u: the msg 0x%04x was expected, but got msg 0x%04x instead\n",
2150 context
, count
, expected
->message
, actual
->message
);
2158 /* skip all optional trailing messages */
2159 while (expected
->message
&& ((expected
->flags
& optional
) ||
2160 ((expected
->flags
& hook
) && !hCBT_hook
) ||
2161 ((expected
->flags
& winevent_hook
) && !hEvent_hook
)))
2167 if (expected
->message
|| actual
->message
) {
2169 if (strcmp(winetest_platform
, "wine")) dump
++;
2170 ok_( file
, line
) (FALSE
, "%s: %u: the msg sequence is not complete: expected %04x - actual %04x\n",
2171 context
, count
, expected
->message
, actual
->message
);
2177 if (expected
->message
|| actual
->message
)
2180 ok_( file
, line
) (FALSE
, "%s: %u: the msg sequence is not complete: expected %04x - actual %04x\n",
2181 context
, count
, expected
->message
, actual
->message
);
2184 if( todo
&& !failcount
) /* succeeded yet marked todo */
2186 if (!strcmp(winetest_platform
, "wine")) dump
++;
2187 ok_( file
, line
)( TRUE
, "%s: marked \"todo_wine\" but succeeds\n", context
);
2191 if (dump
) dump_sequence(expected_list
, context
, file
, line
);
2195 #define expect(EXPECTED,GOT) ok((GOT)==(EXPECTED), "Expected %d, got %d\n", (EXPECTED), (GOT))
2197 /******************************** MDI test **********************************/
2199 /* CreateWindow for MDI frame window, initially visible */
2200 static const struct message WmCreateMDIframeSeq
[] = {
2201 { HCBT_CREATEWND
, hook
},
2202 { WM_GETMINMAXINFO
, sent
},
2203 { WM_NCCREATE
, sent
},
2204 { WM_NCCALCSIZE
, sent
|wparam
, 0 },
2205 { EVENT_OBJECT_REORDER
, winevent_hook
|wparam
|lparam
, 0, 0 },
2206 { WM_CREATE
, sent
},
2207 { EVENT_OBJECT_CREATE
, winevent_hook
|wparam
|lparam
, 0, 0 },
2208 { WM_NOTIFYFORMAT
, sent
|optional
},
2209 { WM_QUERYUISTATE
, sent
|optional
},
2210 { WM_WINDOWPOSCHANGING
, sent
|optional
},
2211 { WM_GETMINMAXINFO
, sent
|optional
},
2212 { WM_NCCALCSIZE
, sent
|optional
},
2213 { WM_WINDOWPOSCHANGED
, sent
|optional
},
2214 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
2215 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
},
2216 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
2217 { HCBT_ACTIVATE
, hook
},
2218 { EVENT_SYSTEM_FOREGROUND
, winevent_hook
|wparam
|lparam
, 0, 0 },
2219 { WM_QUERYNEWPALETTE
, sent
|wparam
|lparam
|optional
, 0, 0 },
2220 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_NOSIZE
|SWP_NOMOVE
}, /* XP */
2221 { WM_ACTIVATEAPP
, sent
|wparam
|optional
, 1 }, /* Win9x doesn't send it */
2222 { WM_NCACTIVATE
, sent
},
2223 { WM_GETTEXT
, sent
|defwinproc
|optional
},
2224 { WM_ACTIVATE
, sent
|wparam
, 1 },
2225 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_NOSIZE
|SWP_NOMOVE
}, /* Win9x */
2226 { HCBT_SETFOCUS
, hook
},
2227 { WM_IME_SETCONTEXT
, sent
|wparam
|defwinproc
|optional
, 1 },
2228 { WM_IME_NOTIFY
, sent
|wparam
|defwinproc
|optional
, 2 },
2229 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2230 { WM_SETFOCUS
, sent
|wparam
|defwinproc
, 0 },
2231 /* Win9x adds SWP_NOZORDER below */
2232 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2233 { WM_NCCALCSIZE
, sent
|wparam
|optional
, 1 }, /* XP */
2234 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
2235 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
2239 /* DestroyWindow for MDI frame window, initially visible */
2240 static const struct message WmDestroyMDIframeSeq
[] = {
2241 { HCBT_DESTROYWND
, hook
},
2242 { 0x0090, sent
|optional
},
2243 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2244 { EVENT_OBJECT_HIDE
, winevent_hook
|wparam
|lparam
, 0, 0 },
2245 { WM_NCACTIVATE
, sent
|wparam
|optional
, 0 }, /* Win9x */
2246 { WM_WINDOWPOSCHANGED
, sent
|wparam
|optional
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2247 { WM_NCACTIVATE
, sent
|wparam
|optional
, 0 }, /* XP */
2248 { WM_ACTIVATE
, sent
|wparam
|optional
, 0 }, /* Win9x */
2249 { WM_ACTIVATEAPP
, sent
|wparam
|optional
, 0 }, /* Win9x */
2250 { EVENT_OBJECT_HIDE
, winevent_hook
|wparam
|lparam
, OBJID_CARET
, 0 },
2251 { EVENT_OBJECT_DESTROY
, winevent_hook
|wparam
|lparam
, 0, 0 },
2252 { WM_DESTROY
, sent
},
2253 { WM_NCDESTROY
, sent
},
2256 /* CreateWindow for MDI client window, initially visible */
2257 static const struct message WmCreateMDIclientSeq
[] = {
2258 { HCBT_CREATEWND
, hook
},
2259 { WM_NCCREATE
, sent
},
2260 { WM_NCCALCSIZE
, sent
|wparam
, 0 },
2261 { EVENT_OBJECT_REORDER
, winevent_hook
|wparam
|lparam
|optional
, 0, 0 },
2262 { WM_CREATE
, sent
},
2263 { EVENT_OBJECT_REORDER
, winevent_hook
|wparam
|lparam
|optional
, 0, 0 },
2264 { EVENT_OBJECT_CREATE
, winevent_hook
|wparam
|lparam
, 0, 0 },
2265 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
2267 { WM_PARENTNOTIFY
, sent
|wparam
, WM_CREATE
}, /* in MDI frame */
2268 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
2269 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2270 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
2271 { WM_WINDOWPOSCHANGED
, sent
|wparam
|optional
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2274 /* ShowWindow(SW_SHOW) for MDI client window */
2275 static const struct message WmShowMDIclientSeq
[] = {
2276 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
2277 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2278 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
2279 { WM_WINDOWPOSCHANGED
, sent
|wparam
|optional
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2282 /* ShowWindow(SW_HIDE) for MDI client window */
2283 static const struct message WmHideMDIclientSeq
[] = {
2284 { WM_SHOWWINDOW
, sent
|wparam
, 0 },
2285 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2286 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
|optional
, 0, 0 }, /* win2000 */
2287 { EVENT_OBJECT_HIDE
, winevent_hook
|wparam
|lparam
|optional
, 0, 0 }, /* XP */
2288 { WM_WINDOWPOSCHANGED
, sent
|wparam
|optional
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2291 /* DestroyWindow for MDI client window, initially visible */
2292 static const struct message WmDestroyMDIclientSeq
[] = {
2293 { HCBT_DESTROYWND
, hook
},
2294 { 0x0090, sent
|optional
},
2295 { WM_PARENTNOTIFY
, sent
|wparam
, WM_DESTROY
}, /* in MDI frame */
2296 { WM_SHOWWINDOW
, sent
|wparam
, 0 },
2297 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2298 { EVENT_OBJECT_HIDE
, winevent_hook
|wparam
|lparam
, 0, 0 },
2299 { WM_WINDOWPOSCHANGED
, sent
|wparam
|optional
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2300 { EVENT_OBJECT_DESTROY
, winevent_hook
|wparam
|lparam
, 0, 0 },
2301 { WM_DESTROY
, sent
},
2302 { WM_NCDESTROY
, sent
},
2305 /* CreateWindow for MDI child window, initially visible */
2306 static const struct message WmCreateMDIchildVisibleSeq
[] = {
2307 { HCBT_CREATEWND
, hook
},
2308 { WM_NCCREATE
, sent
},
2309 { WM_NCCALCSIZE
, sent
|wparam
, 0 },
2310 { WM_CREATE
, sent
},
2311 { EVENT_OBJECT_CREATE
, winevent_hook
|wparam
|lparam
, 0, 0 },
2312 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
2314 /* Win2k sends wparam set to
2315 * MAKEWPARAM(WM_CREATE, MDI_FIRST_CHILD_ID + nTotalCreated),
2316 * while Win9x doesn't bother to set child window id according to
2317 * CLIENTCREATESTRUCT.idFirstChild
2319 { WM_PARENTNOTIFY
, sent
/*|wparam, WM_CREATE*/ }, /* in MDI client */
2320 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
2321 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2322 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
2323 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2324 { WM_MDIREFRESHMENU
, sent
/*|wparam|lparam, 0, 0*/ },
2325 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
},
2326 { WM_CHILDACTIVATE
, sent
|wparam
|lparam
, 0, 0 },
2327 { WM_WINDOWPOSCHANGING
, sent
|wparam
|defwinproc
, SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2329 /* Win9x: message sequence terminates here. */
2331 { WM_NCACTIVATE
, sent
|wparam
|defwinproc
, 1 },
2332 { HCBT_SETFOCUS
, hook
}, /* in MDI client */
2333 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 1 }, /* in MDI client */
2334 { WM_IME_NOTIFY
, sent
|wparam
|optional
, 2 }, /* in MDI client */
2335 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2336 { WM_SETFOCUS
, sent
}, /* in MDI client */
2337 { HCBT_SETFOCUS
, hook
},
2338 { WM_KILLFOCUS
, sent
}, /* in MDI client */
2339 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 0 }, /* in MDI client */
2340 { WM_IME_SETCONTEXT
, sent
|wparam
|defwinproc
|optional
, 1 },
2341 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2342 { WM_SETFOCUS
, sent
|defwinproc
},
2343 { WM_MDIACTIVATE
, sent
|defwinproc
},
2346 /* CreateWindow for MDI child window with invisible parent */
2347 static const struct message WmCreateMDIchildInvisibleParentSeq
[] = {
2348 { HCBT_CREATEWND
, hook
},
2349 { WM_GETMINMAXINFO
, sent
},
2350 { WM_NCCREATE
, sent
},
2351 { WM_NCCALCSIZE
, sent
|wparam
, 0 },
2352 { EVENT_OBJECT_REORDER
, winevent_hook
|wparam
|lparam
|optional
, 0, 0 },
2353 { WM_CREATE
, sent
},
2354 { EVENT_OBJECT_CREATE
, winevent_hook
|wparam
|lparam
, 0, 0 },
2355 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
2357 { WM_PARENTNOTIFY
, sent
/*|wparam, WM_CREATE*/ }, /* in MDI client */
2358 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
2359 { WM_MDIREFRESHMENU
, sent
}, /* in MDI client */
2360 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
},
2361 { WM_CHILDACTIVATE
, sent
|wparam
|lparam
, 0, 0 },
2362 { WM_WINDOWPOSCHANGING
, sent
|wparam
|defwinproc
, SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2364 /* Win9x: message sequence terminates here. */
2366 { WM_NCACTIVATE
, sent
|wparam
|defwinproc
, 1 },
2367 { HCBT_SETFOCUS
, hook
}, /* in MDI client */
2368 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 1 }, /* in MDI client */
2369 { WM_IME_NOTIFY
, sent
|wparam
|optional
, 2 }, /* in MDI client */
2370 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2371 { WM_SETFOCUS
, sent
}, /* in MDI client */
2372 { HCBT_SETFOCUS
, hook
},
2373 { WM_KILLFOCUS
, sent
}, /* in MDI client */
2374 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 0 }, /* in MDI client */
2375 { WM_IME_SETCONTEXT
, sent
|wparam
|defwinproc
|optional
, 1 },
2376 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2377 { WM_SETFOCUS
, sent
|defwinproc
},
2378 { WM_MDIACTIVATE
, sent
|defwinproc
},
2381 /* DestroyWindow for MDI child window, initially visible */
2382 static const struct message WmDestroyMDIchildVisibleSeq
[] = {
2383 { HCBT_DESTROYWND
, hook
},
2384 /* Win2k sends wparam set to
2385 * MAKEWPARAM(WM_DESTROY, MDI_FIRST_CHILD_ID + nTotalCreated),
2386 * while Win9x doesn't bother to set child window id according to
2387 * CLIENTCREATESTRUCT.idFirstChild
2389 { 0x0090, sent
|optional
},
2390 { WM_PARENTNOTIFY
, sent
/*|wparam, WM_DESTROY*/ }, /* in MDI client */
2391 { WM_SHOWWINDOW
, sent
|wparam
, 0 },
2392 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2393 { EVENT_OBJECT_HIDE
, winevent_hook
|wparam
|lparam
, 0, 0 },
2394 { WM_ERASEBKGND
, sent
|parent
|optional
},
2395 { WM_WINDOWPOSCHANGED
, sent
|wparam
|optional
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2397 /* { WM_DESTROY, sent }
2398 * Win9x: message sequence terminates here.
2401 { HCBT_SETFOCUS
, hook
}, /* set focus to MDI client */
2402 { WM_KILLFOCUS
, sent
},
2403 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 0 },
2404 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 1 }, /* in MDI client */
2405 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2406 { WM_SETFOCUS
, sent
}, /* in MDI client */
2408 { HCBT_SETFOCUS
, hook
}, /* MDI client sets focus back to MDI child */
2409 { WM_KILLFOCUS
, sent
}, /* in MDI client */
2410 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 0 }, /* in MDI client */
2411 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 1 },
2412 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2413 { WM_SETFOCUS
, sent
}, /* in MDI client */
2415 { EVENT_OBJECT_DESTROY
, winevent_hook
|wparam
|lparam
, 0, 0 },
2417 { HCBT_SETFOCUS
, hook
}, /* set focus to MDI client */
2418 { WM_KILLFOCUS
, sent
},
2419 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 0 },
2420 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 1 }, /* in MDI client */
2421 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2422 { WM_SETFOCUS
, sent
}, /* in MDI client */
2424 { HCBT_SETFOCUS
, hook
}, /* MDI client sets focus back to MDI child */
2425 { WM_KILLFOCUS
, sent
}, /* in MDI client */
2426 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 0 }, /* in MDI client */
2427 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 1 },
2428 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2429 { WM_SETFOCUS
, sent
}, /* in MDI client */
2431 { WM_DESTROY
, sent
},
2433 { HCBT_SETFOCUS
, hook
}, /* set focus to MDI client */
2434 { WM_KILLFOCUS
, sent
},
2435 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 0 },
2436 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 1 }, /* in MDI client */
2437 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2438 { WM_SETFOCUS
, sent
}, /* in MDI client */
2440 { HCBT_SETFOCUS
, hook
}, /* MDI client sets focus back to MDI child */
2441 { WM_KILLFOCUS
, sent
}, /* in MDI client */
2442 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 0 }, /* in MDI client */
2443 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 1 },
2444 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2445 { WM_SETFOCUS
, sent
}, /* in MDI client */
2447 { WM_NCDESTROY
, sent
},
2450 /* CreateWindow for MDI child window, initially invisible */
2451 static const struct message WmCreateMDIchildInvisibleSeq
[] = {
2452 { HCBT_CREATEWND
, hook
},
2453 { WM_NCCREATE
, sent
},
2454 { WM_NCCALCSIZE
, sent
|wparam
, 0 },
2455 { WM_CREATE
, sent
},
2456 { EVENT_OBJECT_CREATE
, winevent_hook
|wparam
|lparam
, 0, 0 },
2457 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
2459 /* Win2k sends wparam set to
2460 * MAKEWPARAM(WM_CREATE, MDI_FIRST_CHILD_ID + nTotalCreated),
2461 * while Win9x doesn't bother to set child window id according to
2462 * CLIENTCREATESTRUCT.idFirstChild
2464 { WM_PARENTNOTIFY
, sent
/*|wparam, WM_CREATE*/ }, /* in MDI client */
2467 /* DestroyWindow for MDI child window, initially invisible */
2468 static const struct message WmDestroyMDIchildInvisibleSeq
[] = {
2469 { HCBT_DESTROYWND
, hook
},
2470 /* Win2k sends wparam set to
2471 * MAKEWPARAM(WM_DESTROY, MDI_FIRST_CHILD_ID + nTotalCreated),
2472 * while Win9x doesn't bother to set child window id according to
2473 * CLIENTCREATESTRUCT.idFirstChild
2475 { 0x0090, sent
|optional
},
2476 { WM_PARENTNOTIFY
, sent
/*|wparam, WM_DESTROY*/ }, /* in MDI client */
2477 { EVENT_OBJECT_DESTROY
, winevent_hook
|wparam
|lparam
, 0, 0 },
2478 { WM_DESTROY
, sent
},
2479 { WM_NCDESTROY
, sent
},
2480 /* FIXME: Wine destroys an icon/title window while Windows doesn't */
2481 { WM_PARENTNOTIFY
, sent
|wparam
|optional
, WM_DESTROY
}, /* MDI client */
2484 /* CreateWindow for the 1st MDI child window, initially visible and maximized */
2485 static const struct message WmCreateMDIchildVisibleMaxSeq1
[] = {
2486 { HCBT_CREATEWND
, hook
},
2487 { WM_NCCREATE
, sent
},
2488 { WM_NCCALCSIZE
, sent
|wparam
, 0 },
2489 { WM_CREATE
, sent
},
2490 { EVENT_OBJECT_CREATE
, winevent_hook
|wparam
|lparam
, 0, 0 },
2491 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
2493 { HCBT_MINMAX
, hook
|lparam
, 0, SW_MAXIMIZE
},
2494 { WM_GETMINMAXINFO
, sent
},
2495 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_STATECHANGED
},
2496 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2497 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOMOVE
|SWP_NOREDRAW
|SWP_NOCLIENTMOVE
|SWP_STATECHANGED
},
2498 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_MAXIMIZED
},
2500 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2501 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2502 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2503 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI frame */
2504 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI child */
2505 /* Win2k sends wparam set to
2506 * MAKEWPARAM(WM_CREATE, MDI_FIRST_CHILD_ID + nTotalCreated),
2507 * while Win9x doesn't bother to set child window id according to
2508 * CLIENTCREATESTRUCT.idFirstChild
2510 { WM_PARENTNOTIFY
, sent
/*|wparam, WM_CREATE*/ }, /* in MDI client */
2511 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
2512 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2513 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
2514 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2515 { WM_MDIREFRESHMENU
, sent
/*|wparam|lparam, 0, 0*/ },
2516 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
},
2517 { WM_CHILDACTIVATE
, sent
|wparam
|lparam
, 0, 0 },
2518 { WM_WINDOWPOSCHANGING
, sent
|wparam
|defwinproc
|optional
, SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
, 0, SWP_FRAMECHANGED
},
2520 /* Win9x: message sequence terminates here. */
2522 { WM_NCACTIVATE
, sent
|wparam
|defwinproc
|optional
, 1 },
2523 { HCBT_SETFOCUS
, hook
|optional
}, /* in MDI client */
2524 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 1 }, /* in MDI client */
2525 { WM_IME_NOTIFY
, sent
|wparam
|optional
, 2 }, /* in MDI client */
2526 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2527 { WM_SETFOCUS
, sent
|optional
}, /* in MDI client */
2528 { HCBT_SETFOCUS
, hook
|optional
},
2529 { WM_KILLFOCUS
, sent
|optional
}, /* in MDI client */
2530 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 0 }, /* in MDI client */
2531 { WM_IME_SETCONTEXT
, sent
|wparam
|defwinproc
|optional
, 1 },
2532 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2533 { WM_SETFOCUS
, sent
|defwinproc
|optional
},
2534 { WM_MDIACTIVATE
, sent
|defwinproc
|optional
},
2536 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2537 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2538 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2539 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI frame */
2542 /* CreateWindow for the 2nd MDI child window, initially visible and maximized */
2543 static const struct message WmCreateMDIchildVisibleMaxSeq2
[] = {
2544 /* restore the 1st MDI child */
2545 { WM_SETREDRAW
, sent
|wparam
, 0 },
2546 { HCBT_MINMAX
, hook
|lparam
, 0, SW_SHOWNORMAL
},
2547 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_STATECHANGED
},
2548 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2549 { WM_CHILDACTIVATE
, sent
|wparam
|lparam
, 0, 0 },
2550 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOMOVE
|SWP_NOREDRAW
|SWP_NOCLIENTMOVE
|SWP_STATECHANGED
},
2551 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_RESTORED
},
2553 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2554 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2555 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2556 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI frame */
2557 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI child */
2558 { WM_SETREDRAW
, sent
|wparam
, 1 }, /* in the 1st MDI child */
2559 /* create the 2nd MDI child */
2560 { HCBT_CREATEWND
, hook
},
2561 { WM_NCCREATE
, sent
},
2562 { WM_NCCALCSIZE
, sent
|wparam
, 0 },
2563 { WM_CREATE
, sent
},
2564 { EVENT_OBJECT_CREATE
, winevent_hook
|wparam
|lparam
, 0, 0 },
2565 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
2567 { HCBT_MINMAX
, hook
|lparam
, 0, SW_MAXIMIZE
},
2568 { WM_GETMINMAXINFO
, sent
},
2569 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_STATECHANGED
},
2570 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2571 { EVENT_OBJECT_REORDER
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2572 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOMOVE
|SWP_NOREDRAW
|SWP_NOCLIENTMOVE
|SWP_STATECHANGED
},
2573 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_MAXIMIZED
},
2575 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2576 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2577 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2578 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI frame */
2579 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI child */
2580 /* Win2k sends wparam set to
2581 * MAKEWPARAM(WM_CREATE, MDI_FIRST_CHILD_ID + nTotalCreated),
2582 * while Win9x doesn't bother to set child window id according to
2583 * CLIENTCREATESTRUCT.idFirstChild
2585 { WM_PARENTNOTIFY
, sent
/*|wparam, WM_CREATE*/ }, /* in MDI client */
2586 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
2587 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2588 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
2589 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2590 { WM_MDIREFRESHMENU
, sent
/*|wparam|lparam, 0, 0*/ },
2591 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
},
2592 { WM_CHILDACTIVATE
, sent
|wparam
|lparam
, 0, 0 },
2594 { WM_NCACTIVATE
, sent
|wparam
|defwinproc
, 0 }, /* in the 1st MDI child */
2595 { WM_MDIACTIVATE
, sent
|defwinproc
}, /* in the 1st MDI child */
2597 { WM_WINDOWPOSCHANGING
, sent
|wparam
|defwinproc
, SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2599 /* Win9x: message sequence terminates here. */
2601 { WM_NCACTIVATE
, sent
|wparam
|defwinproc
, 1 },
2602 { HCBT_SETFOCUS
, hook
},
2603 { WM_KILLFOCUS
, sent
|defwinproc
|optional
}, /* in the 1st MDI child */
2604 { WM_IME_SETCONTEXT
, sent
|wparam
|defwinproc
|optional
, 0 }, /* in the 1st MDI child */
2605 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 1 }, /* in MDI client */
2606 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2607 { WM_SETFOCUS
, sent
}, /* in MDI client */
2608 { HCBT_SETFOCUS
, hook
},
2609 { WM_KILLFOCUS
, sent
}, /* in MDI client */
2610 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 0 }, /* in MDI client */
2611 { WM_IME_SETCONTEXT
, sent
|wparam
|defwinproc
|optional
, 1 },
2612 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2613 { WM_SETFOCUS
, sent
|defwinproc
},
2615 { WM_MDIACTIVATE
, sent
|defwinproc
},
2617 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2618 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2619 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2620 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI frame */
2623 /* WM_MDICREATE MDI child window, initially visible and maximized */
2624 static const struct message WmCreateMDIchildVisibleMaxSeq3
[] = {
2625 { WM_MDICREATE
, sent
},
2626 { HCBT_CREATEWND
, hook
},
2627 { WM_NCCREATE
, sent
},
2628 { WM_NCCALCSIZE
, sent
|wparam
, 0 },
2629 { WM_CREATE
, sent
},
2630 { EVENT_OBJECT_CREATE
, winevent_hook
|wparam
|lparam
, 0, 0 },
2631 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
2633 { HCBT_MINMAX
, hook
|lparam
, 0, SW_MAXIMIZE
},
2634 { WM_GETMINMAXINFO
, sent
},
2635 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_STATECHANGED
},
2636 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2637 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOMOVE
|SWP_NOREDRAW
|SWP_NOCLIENTMOVE
|SWP_STATECHANGED
},
2638 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_MAXIMIZED
},
2641 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2642 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2643 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2644 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI frame */
2645 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI child */
2647 /* Win2k sends wparam set to
2648 * MAKEWPARAM(WM_CREATE, MDI_FIRST_CHILD_ID + nTotalCreated),
2649 * while Win9x doesn't bother to set child window id according to
2650 * CLIENTCREATESTRUCT.idFirstChild
2652 { WM_PARENTNOTIFY
, sent
/*|wparam, WM_CREATE*/ }, /* in MDI client */
2653 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
2654 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2656 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
2658 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2659 { WM_MDIREFRESHMENU
, sent
/*|wparam|lparam, 0, 0*/ },
2660 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOSIZE
|SWP_NOMOVE
},
2662 { WM_CHILDACTIVATE
, sent
|wparam
|lparam
, 0, 0 },
2663 { WM_WINDOWPOSCHANGING
, sent
|wparam
|defwinproc
, SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2665 /* Win9x: message sequence terminates here. */
2667 { WM_NCACTIVATE
, sent
|wparam
|defwinproc
, 1 },
2668 { WM_SETFOCUS
, sent
|optional
}, /* in MDI client */
2669 { HCBT_SETFOCUS
, hook
}, /* in MDI client */
2670 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 1 }, /* in MDI client */
2671 { WM_IME_NOTIFY
, sent
|wparam
|optional
, 2 },
2672 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
|optional
, OBJID_CLIENT
, 0 },
2673 { WM_SETFOCUS
, sent
|optional
}, /* in MDI client */
2674 { HCBT_SETFOCUS
, hook
|optional
},
2675 { WM_KILLFOCUS
, sent
}, /* in MDI client */
2676 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 0 }, /* in MDI client */
2677 { WM_IME_SETCONTEXT
, sent
|wparam
|defwinproc
|optional
, 1 },
2678 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2679 { WM_SETFOCUS
, sent
|defwinproc
},
2681 { WM_MDIACTIVATE
, sent
|defwinproc
},
2684 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2685 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2686 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2687 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 },
2690 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2691 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2692 { 0x0093, sent
|defwinproc
|optional
},
2693 { 0x0093, sent
|defwinproc
|optional
},
2694 { 0x0093, sent
|defwinproc
|optional
},
2695 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2696 { WM_MOVE
, sent
|defwinproc
},
2697 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_RESTORED
},
2700 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_NOACTIVATE
},
2701 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2702 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_NOACTIVATE
|SWP_NOMOVE
|SWP_NOCLIENTMOVE
},
2703 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
2706 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_NOACTIVATE
},
2707 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2708 { 0x0093, sent
|optional
},
2709 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_NOACTIVATE
|SWP_NOMOVE
|SWP_NOCLIENTMOVE
},
2710 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_MAXIMIZED
},
2712 { 0x0093, sent
|optional
},
2713 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI child */
2714 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI client */
2715 { WM_NCCALCSIZE
, sent
|wparam
|optional
, 1 }, /* XP sends it to MDI frame */
2716 { 0x0093, sent
|defwinproc
|optional
},
2717 { 0x0093, sent
|defwinproc
|optional
},
2718 { 0x0093, sent
|defwinproc
|optional
},
2719 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI frame */
2720 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* XP sends a duplicate */
2724 /* CreateWindow for the 1st MDI child window, initially invisible and maximized */
2725 static const struct message WmCreateMDIchildInvisibleMaxSeq4
[] = {
2726 { HCBT_CREATEWND
, hook
},
2727 { WM_GETMINMAXINFO
, sent
},
2728 { WM_NCCREATE
, sent
},
2729 { WM_NCCALCSIZE
, sent
|wparam
, 0 },
2730 { EVENT_OBJECT_REORDER
, winevent_hook
|wparam
|lparam
, 0, 0 },
2731 { WM_CREATE
, sent
},
2732 { EVENT_OBJECT_CREATE
, winevent_hook
|wparam
|lparam
, 0, 0 },
2733 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
2734 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
, 0, SWP_NOZORDER
}, /* MDI frame */
2735 { WM_NCCALCSIZE
, sent
|wparam
|optional
, 1 }, /* MDI frame */
2736 { WM_WINDOWPOSCHANGED
, sent
|wparam
|optional
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
, 0, SWP_NOZORDER
}, /* MDI frame */
2738 { HCBT_MINMAX
, hook
|lparam
, 0, SW_MAXIMIZE
},
2739 { WM_GETMINMAXINFO
, sent
},
2740 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_STATECHANGED
},
2741 { WM_GETMINMAXINFO
, sent
|defwinproc
},
2742 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2743 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOREDRAW
|SWP_STATECHANGED
},
2744 { WM_MOVE
, sent
|defwinproc
},
2745 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_MAXIMIZED
},
2747 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2748 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2749 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2750 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI frame */
2751 { WM_NCCALCSIZE
, sent
|wparam
|optional
, 1 }, /* MDI child */
2752 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI child */
2753 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI child */
2754 /* Win2k sends wparam set to
2755 * MAKEWPARAM(WM_CREATE, MDI_FIRST_CHILD_ID + nTotalCreated),
2756 * while Win9x doesn't bother to set child window id according to
2757 * CLIENTCREATESTRUCT.idFirstChild
2759 { WM_PARENTNOTIFY
, sent
/*|wparam, WM_CREATE*/ }, /* in MDI client */
2762 /* WM_SYSCOMMAND/SC_CLOSE for the 2nd MDI child window, initially visible and maximized */
2763 static const struct message WmDestroyMDIchildVisibleMaxSeq2
[] = {
2764 { WM_SYSCOMMAND
, sent
|wparam
, SC_CLOSE
},
2765 { HCBT_SYSCOMMAND
, hook
},
2766 { WM_CLOSE
, sent
|defwinproc
},
2767 { WM_MDIDESTROY
, sent
}, /* in MDI client */
2769 /* bring the 1st MDI child to top */
2770 { WM_WINDOWPOSCHANGING
, sent
|wparam
|defwinproc
, SWP_NOSIZE
|SWP_NOMOVE
}, /* in the 1st MDI child */
2771 { WM_WINDOWPOSCHANGING
, sent
|wparam
|defwinproc
, SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
}, /* in the 2nd MDI child */
2773 { EVENT_OBJECT_REORDER
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2775 { WM_CHILDACTIVATE
, sent
|defwinproc
|wparam
|lparam
, 0, 0 }, /* in the 1st MDI child */
2776 { WM_NCACTIVATE
, sent
|wparam
|defwinproc
, 0 }, /* in the 1st MDI child */
2777 { WM_MDIACTIVATE
, sent
|defwinproc
}, /* in the 1st MDI child */
2779 /* maximize the 1st MDI child */
2780 { HCBT_MINMAX
, hook
|lparam
, 0, SW_MAXIMIZE
},
2781 { WM_GETMINMAXINFO
, sent
|defwinproc
},
2782 { WM_WINDOWPOSCHANGING
, sent
|wparam
|defwinproc
, SWP_FRAMECHANGED
|SWP_STATECHANGED
},
2783 { WM_NCCALCSIZE
, sent
|defwinproc
|wparam
, 1 },
2784 { WM_CHILDACTIVATE
, sent
|defwinproc
|wparam
|lparam
, 0, 0 },
2785 { WM_WINDOWPOSCHANGED
, sent
|wparam
|defwinproc
, SWP_FRAMECHANGED
|SWP_NOMOVE
|SWP_NOREDRAW
|SWP_NOCLIENTMOVE
|SWP_STATECHANGED
},
2786 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_MAXIMIZED
},
2788 /* restore the 2nd MDI child */
2789 { WM_SETREDRAW
, sent
|defwinproc
|wparam
, 0 },
2790 { HCBT_MINMAX
, hook
|lparam
, 0, SW_NORMALNA
},
2791 { WM_WINDOWPOSCHANGING
, sent
|wparam
|defwinproc
, SWP_NOACTIVATE
|SWP_FRAMECHANGED
|SWP_SHOWWINDOW
|SWP_STATECHANGED
},
2792 { WM_NCCALCSIZE
, sent
|defwinproc
|wparam
, 1 },
2794 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
2796 { WM_WINDOWPOSCHANGED
, sent
|wparam
|defwinproc
, SWP_NOACTIVATE
|SWP_FRAMECHANGED
|SWP_SHOWWINDOW
|SWP_NOMOVE
|SWP_NOREDRAW
|SWP_NOCLIENTMOVE
|SWP_STATECHANGED
},
2797 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_RESTORED
},
2799 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI frame */
2801 { WM_SETREDRAW
, sent
|defwinproc
|wparam
, 1 },
2803 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2804 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2805 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2806 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI frame */
2807 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI child */
2809 /* bring the 1st MDI child to top */
2810 { WM_WINDOWPOSCHANGING
, sent
|wparam
|defwinproc
, SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2811 { WM_NCACTIVATE
, sent
|wparam
|defwinproc
, 1 },
2812 { HCBT_SETFOCUS
, hook
},
2813 { WM_KILLFOCUS
, sent
|defwinproc
},
2814 { WM_IME_SETCONTEXT
, sent
|wparam
|defwinproc
|optional
, 0 },
2815 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 1 }, /* in MDI client */
2816 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2817 { WM_SETFOCUS
, sent
}, /* in MDI client */
2818 { HCBT_SETFOCUS
, hook
},
2819 { WM_KILLFOCUS
, sent
}, /* in MDI client */
2820 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 0 }, /* in MDI client */
2821 { WM_IME_SETCONTEXT
, sent
|wparam
|defwinproc
|optional
, 1 },
2822 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2823 { WM_SETFOCUS
, sent
|defwinproc
},
2824 { WM_MDIACTIVATE
, sent
|defwinproc
},
2825 { WM_WINDOWPOSCHANGED
, sent
|wparam
|defwinproc
, SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOREDRAW
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2827 /* apparently ShowWindow(SW_SHOW) on an MDI client */
2828 { WM_SHOWWINDOW
, sent
|wparam
, 1 },
2829 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2830 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
2831 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_SHOWWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2832 { WM_MDIREFRESHMENU
, sent
},
2834 { HCBT_DESTROYWND
, hook
},
2835 /* Win2k sends wparam set to
2836 * MAKEWPARAM(WM_DESTROY, MDI_FIRST_CHILD_ID + nTotalCreated),
2837 * while Win9x doesn't bother to set child window id according to
2838 * CLIENTCREATESTRUCT.idFirstChild
2840 { 0x0090, sent
|defwinproc
|optional
},
2841 { WM_PARENTNOTIFY
, sent
/*|wparam, WM_DESTROY*/ }, /* in MDI client */
2842 { WM_SHOWWINDOW
, sent
|defwinproc
|wparam
, 0 },
2843 { WM_WINDOWPOSCHANGING
, sent
|wparam
|defwinproc
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2844 { EVENT_OBJECT_HIDE
, winevent_hook
|wparam
|lparam
, 0, 0 },
2845 { WM_ERASEBKGND
, sent
|parent
|optional
},
2846 { WM_WINDOWPOSCHANGED
, sent
|wparam
|defwinproc
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2848 { EVENT_OBJECT_DESTROY
, winevent_hook
|wparam
|lparam
, 0, 0 },
2849 { WM_DESTROY
, sent
|defwinproc
},
2850 { WM_NCDESTROY
, sent
|defwinproc
},
2853 /* WM_MDIDESTROY for the single MDI child window, initially visible and maximized */
2854 static const struct message WmDestroyMDIchildVisibleMaxSeq1
[] = {
2855 { WM_MDIDESTROY
, sent
}, /* in MDI client */
2856 { WM_SHOWWINDOW
, sent
|wparam
, 0 },
2857 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2858 { EVENT_OBJECT_HIDE
, winevent_hook
|wparam
|lparam
, 0, 0 },
2859 { WM_ERASEBKGND
, sent
|parent
|optional
},
2860 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2862 { HCBT_SETFOCUS
, hook
},
2863 { WM_KILLFOCUS
, sent
},
2864 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 0 },
2865 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 1 }, /* in MDI client */
2866 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2867 { WM_SETFOCUS
, sent
}, /* in MDI client */
2868 { HCBT_SETFOCUS
, hook
},
2869 { WM_KILLFOCUS
, sent
}, /* in MDI client */
2870 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 0 }, /* in MDI client */
2871 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 1 },
2872 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2873 { WM_SETFOCUS
, sent
},
2876 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2877 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2878 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOREDRAW
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2879 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI child */
2882 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2883 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2884 { 0x0093, sent
|defwinproc
|optional
},
2885 { 0x0093, sent
|defwinproc
|optional
},
2886 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2887 { WM_MOVE
, sent
|defwinproc
},
2888 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_RESTORED
},
2891 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_NOACTIVATE
},
2892 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2893 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_NOACTIVATE
|SWP_NOMOVE
|SWP_NOCLIENTMOVE
},
2894 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
2897 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_NOACTIVATE
},
2898 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2899 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_NOACTIVATE
|SWP_NOMOVE
|SWP_NOREDRAW
|SWP_NOCLIENTMOVE
},
2900 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_MAXIMIZED
},
2903 { WM_WINDOWPOSCHANGING
, sent
|wparam
|defwinproc
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2904 { WM_NCCALCSIZE
, sent
|wparam
|defwinproc
, 1 },
2905 { WM_WINDOWPOSCHANGED
, sent
|wparam
|defwinproc
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOREDRAW
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2906 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI child */
2909 { WM_WINDOWPOSCHANGING
, sent
|wparam
|defwinproc
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2910 { WM_NCCALCSIZE
, sent
|wparam
|defwinproc
, 1 },
2911 { 0x0093, sent
|defwinproc
|optional
},
2912 { 0x0093, sent
|defwinproc
|optional
},
2913 { 0x0093, sent
|defwinproc
|optional
},
2914 { WM_WINDOWPOSCHANGED
, sent
|wparam
|defwinproc
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2915 { WM_MOVE
, sent
|defwinproc
},
2916 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_RESTORED
},
2919 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_NOACTIVATE
},
2920 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2921 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_NOACTIVATE
|SWP_NOMOVE
|SWP_NOCLIENTMOVE
},
2922 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
2925 { WM_WINDOWPOSCHANGING
, sent
|wparam
|defwinproc
, SWP_NOACTIVATE
},
2926 { WM_NCCALCSIZE
, sent
|wparam
|defwinproc
, 1 },
2927 { WM_WINDOWPOSCHANGED
, sent
|wparam
|defwinproc
, SWP_NOACTIVATE
|SWP_NOMOVE
|SWP_NOREDRAW
|SWP_NOCLIENTMOVE
},
2928 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_MAXIMIZED
},
2929 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI child */
2930 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI client */
2932 { 0x0093, sent
|defwinproc
|optional
},
2933 { WM_NCCALCSIZE
, sent
|wparam
|defwinproc
|optional
, 1 }, /* XP sends it to MDI frame */
2934 { 0x0093, sent
|defwinproc
|optional
},
2935 { 0x0093, sent
|defwinproc
|optional
},
2936 { 0x0093, sent
|defwinproc
|optional
},
2937 { 0x0093, sent
|optional
},
2939 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI frame */
2940 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI child */
2941 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI client */
2942 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI frame */
2943 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* XP sends a duplicate */
2946 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2947 { WM_NCCALCSIZE
, sent
|wparam
|optional
, 1 },
2948 { 0x0093, sent
|defwinproc
|optional
},
2949 { 0x0093, sent
|defwinproc
|optional
},
2950 { 0x0093, sent
|defwinproc
|optional
},
2951 { WM_WINDOWPOSCHANGED
, sent
|wparam
|optional
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2952 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI frame */
2953 { 0x0093, sent
|optional
},
2955 { WM_NCACTIVATE
, sent
|wparam
, 0 },
2956 { WM_MDIACTIVATE
, sent
},
2958 { HCBT_MINMAX
, hook
|lparam
, 0, SW_SHOWNORMAL
},
2959 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_SHOWWINDOW
|SWP_STATECHANGED
},
2960 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2962 { EVENT_OBJECT_SHOW
, winevent_hook
|wparam
|lparam
, 0, 0 },
2964 { WM_CHILDACTIVATE
, sent
|wparam
|lparam
, 0, 0 },
2965 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_SHOWWINDOW
|SWP_NOMOVE
|SWP_NOCLIENTMOVE
|SWP_STATECHANGED
},
2966 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_RESTORED
},
2969 { WM_WINDOWPOSCHANGING
, sent
|wparam
|defwinproc
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2970 { WM_NCCALCSIZE
, sent
|wparam
|defwinproc
, 1 },
2971 { WM_WINDOWPOSCHANGED
, sent
|wparam
|defwinproc
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
2972 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI child */
2975 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2976 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2977 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
2978 { WM_MOVE
, sent
|defwinproc
},
2979 { WM_SIZE
, sent
|defwinproc
|wparam
, SIZE_RESTORED
},
2982 { WM_WINDOWPOSCHANGING
, sent
|wparam
, SWP_NOACTIVATE
},
2983 { WM_NCCALCSIZE
, sent
|wparam
, 1 },
2984 { WM_WINDOWPOSCHANGED
, sent
|wparam
, SWP_NOACTIVATE
|SWP_NOMOVE
|SWP_NOCLIENTMOVE
},
2985 { WM_SIZE
, sent
|wparam
, SIZE_RESTORED
},
2986 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI child */
2987 { WM_NCCALCSIZE
, sent
|wparam
|optional
, 1 }, /* XP */
2988 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI client */
2989 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* MDI frame */
2990 { EVENT_OBJECT_LOCATIONCHANGE
, winevent_hook
|wparam
|lparam
, 0, 0 }, /* XP sends a duplicate */
2992 { HCBT_SETFOCUS
, hook
},
2993 { WM_KILLFOCUS
, sent
},
2994 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 0 },
2995 { WM_IME_SETCONTEXT
, sent
|wparam
|optional
, 1 }, /* in MDI client */
2996 { EVENT_OBJECT_FOCUS
, winevent_hook
|wparam
|lparam
, OBJID_CLIENT
, 0 },
2997 { WM_SETFOCUS
, sent
}, /* in MDI client */
2999 { WM_MDIREFRESHMENU
, sent
}, /* in MDI client */
3001 { HCBT_DESTROYWND
, hook
},
3002 /* Win2k sends wparam set to
3003 * MAKEWPARAM(WM_DESTROY, MDI_FIRST_CHILD_ID + nTotalCreated),
3004 * while Win9x doesn't bother to set child window id according to
3005 * CLIENTCREATESTRUCT.idFirstChild
3007 { 0x0090, sent
|optional
},
3008 { WM_PARENTNOTIFY
, sent
/*|wparam, WM_DESTROY*/ }, /* in MDI client */
3010 { WM_SHOWWINDOW
, sent
|wparam
, 0 },
3011 { WM_WINDOWPOSCHANGING
, sent
|wparam
|optional
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
},
3012 { EVENT_OBJECT_HIDE
, winevent_hook
|wparam
|lparam
, 0, 0 },
3013 { WM_ERASEBKGND
, sent
|parent
|optional
},
3014 { WM_WINDOWPOSCHANGED
, sent
|wparam
|optional
, SWP_HIDEWINDOW
|SWP_NOACTIVATE
|SWP_NOSIZE
|SWP_NOMOVE
|SWP_NOCLIENTSIZE
|SWP_NOCLIENTMOVE
},
3016 { EVENT_OBJECT_DESTROY
, winevent_hook
|wparam
|lparam
, 0, 0 },
3017 { WM_DESTROY
, sent
},
3018 { WM_NCDESTROY
, sent
},
3021 /* ShowWindow(SW_MAXIMIZE) for a not visible MDI child window */