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

Alexandre Julliard julliard at winehq.org
Mon Jan 26 10:14:13 CST 2009


Module: wine
Branch: master
Commit: f12c5bfca3a1f00a07bc4aede53f9fceddd8e8f6
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=f12c5bfca3a1f00a07bc4aede53f9fceddd8e8f6

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Mon Jan 26 15:08:49 2009 +0100

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

---

 dlls/user32/menu.c |   11 ++++++++---
 1 files changed, 8 insertions(+), 3 deletions(-)

diff --git a/dlls/user32/menu.c b/dlls/user32/menu.c
index 3fbb941..05596af 100644
--- a/dlls/user32/menu.c
+++ b/dlls/user32/menu.c
@@ -56,6 +56,7 @@
 #include "wownt32.h"
 #include "wine/server.h"
 #include "wine/unicode.h"
+#include "wine/exception.h"
 #include "win.h"
 #include "controls.h"
 #include "user_private.h"
@@ -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
  *
@@ -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;
     set_capture_window( capture_win, GUI_INMENUMODE, NULL );
 
-    while (!fEndMenu)
+    __TRY while (!fEndMenu)
     {
 	menu = MENU_GetMenu( mt.hCurrentMenu );
 	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,
 	    PeekMessageW( &msg, 0, msg.message, msg.message, PM_REMOVE );
 	else mt.trackFlags &= ~TF_SKIPREMOVE;
     }
-
-    set_capture_window( 0, GUI_INMENUMODE, NULL );
+    __FINALLY( release_capture )
 
     /* If dropdown is still painted and the close box is clicked on
        then the menu will be destroyed as part of the DispatchMessage above.




More information about the wine-cvs mailing list