Skip to content

Commit 24d3d22

Browse files
madewokherdrbernon
authored andcommitted
win32u: Implement EVENT_OBJECT_DESTROY.
(cherry picked from commit a5c22b5)
1 parent 9326da9 commit 24d3d22

File tree

2 files changed

+26
-18
lines changed

2 files changed

+26
-18
lines changed

dlls/user32/tests/msg.c

+13-13
Original file line numberDiff line numberDiff line change
@@ -724,7 +724,7 @@ static const struct message WmDestroyOverlappedSeq[] = {
724724
{ WM_KILLFOCUS, sent|optional|wparam, 0 },
725725
{ WM_IME_SETCONTEXT, sent|wparam|optional, 0 },
726726
{ WM_IME_NOTIFY, sent|wparam|optional|defwinproc, 1 },
727-
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|winevent_hook_todo, 0, 0 },
727+
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 },
728728
{ WM_DESTROY, sent },
729729
{ WM_NCDESTROY, sent },
730730
{ 0 }
@@ -1626,7 +1626,7 @@ static const struct message WmDestroyChildSeq[] = {
16261626
{ WM_IME_SETCONTEXT, sent|wparam|parent|optional, 1 },
16271627
{ EVENT_OBJECT_FOCUS, winevent_hook|wparam|lparam, OBJID_CLIENT, 0 },
16281628
{ WM_SETFOCUS, sent|parent },
1629-
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|winevent_hook_todo, 0, 0 },
1629+
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 },
16301630
{ WM_DESTROY, sent },
16311631
{ WM_DESTROY, sent|optional }, /* some other (IME?) window */
16321632
{ WM_NCDESTROY, sent|optional }, /* some other (IME?) window */
@@ -1646,7 +1646,7 @@ static const struct message WmDestroyInvisibleChildSeq[] = {
16461646
{ 0x0090, sent|optional },
16471647
{ WM_PARENTNOTIFY, sent|parent|wparam, WM_DESTROY },
16481648
{ WM_SHOWWINDOW, sent|wparam, 0 },
1649-
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|winevent_hook_todo, 0, 0 },
1649+
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 },
16501650
{ WM_DESTROY, sent },
16511651
{ WM_NCDESTROY, sent },
16521652
{ 0 }
@@ -2991,7 +2991,7 @@ static const struct message WmDestroyMDIframeSeq[] = {
29912991
{ WM_ACTIVATE, sent|wparam|optional, 0 }, /* Win9x */
29922992
{ WM_ACTIVATEAPP, sent|wparam|optional, 0 }, /* Win9x */
29932993
{ EVENT_OBJECT_HIDE, winevent_hook|wparam|lparam|winevent_hook_todo, OBJID_CARET, 0 },
2994-
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|winevent_hook_todo, 0, 0 },
2994+
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 },
29952995
{ WM_DESTROY, sent },
29962996
{ WM_NCDESTROY, sent },
29972997
{ 0 }
@@ -3040,7 +3040,7 @@ static const struct message WmDestroyMDIclientSeq[] = {
30403040
{ WM_WINDOWPOSCHANGING, sent|wparam|optional, SWP_HIDEWINDOW|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE },
30413041
{ EVENT_OBJECT_HIDE, winevent_hook|wparam|lparam, 0, 0 },
30423042
{ WM_WINDOWPOSCHANGED, sent|wparam|optional, SWP_HIDEWINDOW|SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTSIZE|SWP_NOCLIENTMOVE },
3043-
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|winevent_hook_todo, 0, 0 },
3043+
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 },
30443044
{ WM_DESTROY, sent },
30453045
{ WM_NCDESTROY, sent },
30463046
{ 0 }
@@ -3242,7 +3242,7 @@ static const struct message WmDestroyMDIchildInvisibleSeq[] = {
32423242
*/
32433243
{ 0x0090, sent|optional },
32443244
{ WM_PARENTNOTIFY, sent /*|wparam, WM_DESTROY*/ }, /* in MDI client */
3245-
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|winevent_hook_todo, 0, 0 },
3245+
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 },
32463246
{ WM_DESTROY, sent },
32473247
{ WM_NCDESTROY, sent },
32483248
/* FIXME: Wine destroys an icon/title window while Windows doesn't */
@@ -12571,7 +12571,7 @@ static const struct message destroy_window_with_children[] = {
1257112571
{ WM_DESTROY, sent|wparam|lparam, 0, WND_POPUP_ID }, /* popup */
1257212572
{ WM_CAPTURECHANGED, sent|wparam|lparam, 0, WND_POPUP_ID }, /* popup */
1257312573
{ WM_NCDESTROY, sent|wparam|lparam, 0, WND_POPUP_ID }, /* popup */
12574-
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|winevent_hook_todo, 0, 0 }, /* parent */
12574+
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 }, /* parent */
1257512575
{ WM_DESTROY, sent|wparam|lparam, 0, WND_PARENT_ID }, /* parent */
1257612576
{ WM_DESTROY, sent|wparam|lparam, 0, WND_CHILD_ID + 2 }, /* child2 */
1257712577
{ WM_DESTROY, sent|wparam|lparam, 0, WND_CHILD_ID + 1 }, /* child1 */
@@ -14253,7 +14253,7 @@ static const struct message WmQuitDialogSeq[] = {
1425314253
{ EVENT_SYSTEM_DIALOGEND, winevent_hook|wparam|lparam|winevent_hook_todo, 0, 0 },
1425414254
{ HCBT_DESTROYWND, hook },
1425514255
{ 0x0090, sent|optional }, /* Vista */
14256-
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|winevent_hook_todo, 0, 0 },
14256+
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 },
1425714257
{ WM_DESTROY, sent },
1425814258
{ WM_NCDESTROY, sent },
1425914259
{ 0 }
@@ -16987,7 +16987,7 @@ static const struct message wm_popup_menu_1[] =
1698716987
{ EVENT_SYSTEM_MENUPOPUPEND, winevent_hook|wparam|lparam|winevent_hook_todo, OBJID_CLIENT, 0 },
1698816988
{ HCBT_DESTROYWND, hook|optional }, /* Win9x doesn't create a window */
1698916989
{ EVENT_OBJECT_HIDE, winevent_hook|wparam|lparam, 0, 0 },
16990-
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|winevent_hook_todo, 0, 0 },
16990+
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 },
1699116991
{ WM_UNINITMENUPOPUP, sent|lparam, 0, 0 },
1699216992
{ WM_MENUSELECT, sent|wparam|lparam, MAKEWPARAM(0,0xffff), 0 },
1699316993
{ WM_EXITMENULOOP, sent|wparam|lparam, 0, 0 },
@@ -17037,12 +17037,12 @@ static const struct message wm_popup_menu_2[] =
1703717037
{ EVENT_SYSTEM_MENUPOPUPEND, winevent_hook|wparam|lparam|winevent_hook_todo, OBJID_CLIENT, 0 },
1703817038
{ HCBT_DESTROYWND, hook },
1703917039
{ EVENT_OBJECT_HIDE, winevent_hook|wparam|lparam, 0, 0 },
17040-
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|winevent_hook_todo, 0, 0 },
17040+
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 },
1704117041
{ WM_UNINITMENUPOPUP, sent|lparam, 0, 0 },
1704217042
{ EVENT_SYSTEM_MENUPOPUPEND, winevent_hook|wparam|lparam|winevent_hook_todo, OBJID_CLIENT, 0 },
1704317043
{ HCBT_DESTROYWND, hook|optional }, /* Win9x doesn't send it */
1704417044
{ EVENT_OBJECT_HIDE, winevent_hook|wparam|lparam, 0, 0 },
17045-
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|winevent_hook_todo, 0, 0 },
17045+
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 },
1704617046
{ WM_UNINITMENUPOPUP, sent|lparam, 0, 0 },
1704717047
{ WM_MENUSELECT, sent|wparam|lparam, MAKEWPARAM(0,0xffff), 0 },
1704817048
{ WM_EXITMENULOOP, sent|wparam|lparam, 0, 0 },
@@ -17092,12 +17092,12 @@ static const struct message wm_popup_menu_3[] =
1709217092
{ EVENT_SYSTEM_MENUPOPUPEND, winevent_hook|wparam|lparam|winevent_hook_todo, OBJID_CLIENT, 0 },
1709317093
{ HCBT_DESTROYWND, hook },
1709417094
{ EVENT_OBJECT_HIDE, winevent_hook|wparam|lparam, 0, 0 },
17095-
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|winevent_hook_todo, 0, 0 },
17095+
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 },
1709617096
{ WM_UNINITMENUPOPUP, sent|lparam, 0, 0 },
1709717097
{ EVENT_SYSTEM_MENUPOPUPEND, winevent_hook|wparam|lparam|winevent_hook_todo, OBJID_CLIENT, 0 },
1709817098
{ HCBT_DESTROYWND, hook|optional }, /* Win9x doesn't send it */
1709917099
{ EVENT_OBJECT_HIDE, winevent_hook|wparam|lparam, 0, 0 },
17100-
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam|winevent_hook_todo, 0, 0 },
17100+
{ EVENT_OBJECT_DESTROY, winevent_hook|wparam|lparam, 0, 0 },
1710117101
{ WM_UNINITMENUPOPUP, sent|lparam, 0, 0 },
1710217102
{ WM_MENUSELECT, sent|wparam|lparam, MAKEWPARAM(0,0xffff), 0 },
1710317103
{ WM_EXITMENULOOP, sent|wparam|lparam, 0, 0 },

dlls/win32u/window.c

+13-5
Original file line numberDiff line numberDiff line change
@@ -4690,7 +4690,7 @@ HICON WINAPI NtUserInternalGetWindowIcon( HWND hwnd, UINT type )
46904690
/***********************************************************************
46914691
* send_destroy_message
46924692
*/
4693-
static void send_destroy_message( HWND hwnd )
4693+
static void send_destroy_message( HWND hwnd, BOOL winevent )
46944694
{
46954695
GUITHREADINFO info;
46964696

@@ -4703,6 +4703,9 @@ static void send_destroy_message( HWND hwnd )
47034703

47044704
if (hwnd == NtUserGetClipboardOwner()) release_clipboard_owner( hwnd );
47054705

4706+
if (winevent)
4707+
NtUserNotifyWinEvent( EVENT_OBJECT_DESTROY, hwnd, OBJID_WINDOW, 0 );
4708+
47064709
send_message( hwnd, WM_DESTROY, 0, 0);
47074710

47084711
/*
@@ -4718,7 +4721,7 @@ static void send_destroy_message( HWND hwnd )
47184721

47194722
for (i = 0; children[i]; i++)
47204723
{
4721-
if (is_window( children[i] )) send_destroy_message( children[i] );
4724+
if (is_window( children[i] )) send_destroy_message( children[i], FALSE );
47224725
}
47234726
free( children );
47244727
}
@@ -4825,7 +4828,7 @@ LRESULT destroy_window( HWND hwnd )
48254828
/***********************************************************************
48264829
* NtUserDestroyWindow (win32u.@)
48274830
*/
4828-
BOOL WINAPI NtUserDestroyWindow( HWND hwnd )
4831+
static BOOL user_destroy_window( HWND hwnd, BOOL winevent )
48294832
{
48304833
BOOL is_child;
48314834

@@ -4885,7 +4888,7 @@ BOOL WINAPI NtUserDestroyWindow( HWND hwnd )
48854888
if (get_window_relative( children[i], GW_OWNER ) != hwnd) continue;
48864889
if (is_current_thread_window( children[i] ))
48874890
{
4888-
NtUserDestroyWindow( children[i] );
4891+
user_destroy_window( children[i], FALSE );
48894892
got_one = TRUE;
48904893
continue;
48914894
}
@@ -4896,13 +4899,18 @@ BOOL WINAPI NtUserDestroyWindow( HWND hwnd )
48964899
}
48974900
}
48984901

4899-
send_destroy_message( hwnd );
4902+
send_destroy_message( hwnd, winevent );
49004903
if (!is_window( hwnd )) return TRUE;
49014904

49024905
destroy_window( hwnd );
49034906
return TRUE;
49044907
}
49054908

4909+
BOOL WINAPI NtUserDestroyWindow( HWND hwnd )
4910+
{
4911+
return user_destroy_window( hwnd, TRUE );
4912+
}
4913+
49064914
/*****************************************************************************
49074915
* destroy_thread_windows
49084916
*

0 commit comments

Comments
 (0)