Commit f12c5bfc authored by Alexandre Julliard's avatar Alexandre Julliard

user32: Use a finally handler to make sure capture is always released when exiting the menu loop.

parent 58010a97
...@@ -56,6 +56,7 @@ ...@@ -56,6 +56,7 @@
#include "wownt32.h" #include "wownt32.h"
#include "wine/server.h" #include "wine/server.h"
#include "wine/unicode.h" #include "wine/unicode.h"
#include "wine/exception.h"
#include "win.h" #include "win.h"
#include "controls.h" #include "controls.h"
#include "user_private.h" #include "user_private.h"
...@@ -2964,6 +2965,11 @@ static void MENU_KeyRight( MTRACKER* pmt, UINT wFlags ) ...@@ -2964,6 +2965,11 @@ static void MENU_KeyRight( MTRACKER* pmt, UINT wFlags )
} }
} }
static void CALLBACK release_capture( BOOL __normal )
{
set_capture_window( 0, GUI_INMENUMODE, NULL );
}
/*********************************************************************** /***********************************************************************
* MENU_TrackMenu * MENU_TrackMenu
* *
...@@ -3011,7 +3017,7 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, INT x, INT y, ...@@ -3011,7 +3017,7 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, INT x, INT y,
capture_win = (wFlags & TPM_POPUPMENU) ? menu->hWnd : mt.hOwnerWnd; capture_win = (wFlags & TPM_POPUPMENU) ? menu->hWnd : mt.hOwnerWnd;
set_capture_window( capture_win, GUI_INMENUMODE, NULL ); set_capture_window( capture_win, GUI_INMENUMODE, NULL );
while (!fEndMenu) __TRY while (!fEndMenu)
{ {
menu = MENU_GetMenu( mt.hCurrentMenu ); menu = MENU_GetMenu( mt.hCurrentMenu );
if (!menu) /* sometimes happens if I do a window manager close */ if (!menu) /* sometimes happens if I do a window manager close */
...@@ -3232,8 +3238,7 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, INT x, INT y, ...@@ -3232,8 +3238,7 @@ static BOOL MENU_TrackMenu( HMENU hmenu, UINT wFlags, INT x, INT y,
PeekMessageW( &msg, 0, msg.message, msg.message, PM_REMOVE ); PeekMessageW( &msg, 0, msg.message, msg.message, PM_REMOVE );
else mt.trackFlags &= ~TF_SKIPREMOVE; else mt.trackFlags &= ~TF_SKIPREMOVE;
} }
__FINALLY( release_capture )
set_capture_window( 0, GUI_INMENUMODE, NULL );
/* If dropdown is still painted and the close box is clicked on /* If dropdown is still painted and the close box is clicked on
then the menu will be destroyed as part of the DispatchMessage above. then the menu will be destroyed as part of the DispatchMessage above.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment