I fix for the wrong results of TrackPopupMenu. I compared the results with Windows and Wine and it seems ok, except for the behavior of "GetLastError", when passing wrong parameters. I assume the "MENU_GetMenu" case could be ok, but somebody should look at the "WIN_GetFullHandle" case too. diff -urN wine-20031118/controls/menu.c wine-20031211/controls/menu.c --- wine-20031118/controls/menu.c 2003-11-18 20:42:31.000000000 +0100 +++ wine-20031211/controls/menu.c 2003-12-11 17:40:29.000000000 +0100 @@ -2652,6 +2652,10 @@ mt.trackFlags = 0; mt.hCurrentMenu = hmenu; mt.hTopMenu = hmenu; + /* What happens if an invalid window handle is being passed? I tried to find out what's + going on in such a case, but I know to little about communication with the wine server. + Somebody who might know about this, please add a test and return FALSE here with a + SetLastError(ERROR_INVALID_WINDOW_HANDLE); - added be A.Rosenberg 2003.12.11*/ mt.hOwnerWnd = WIN_GetFullHandle( hwnd ); mt.pt.x = x; mt.pt.y = y; @@ -2661,7 +2665,11 @@ (lprect) ? lprect->right : 0, (lprect) ? lprect->bottom : 0); fEndMenu = FALSE; - if (!(menu = MENU_GetMenu( hmenu ))) return FALSE; + if (!(menu = MENU_GetMenu( hmenu ))) + { + SetLastError(ERROR_INVALID_MENU_HANDLE); /* - added by A.Rosenberg 2003.12.11 */ + return FALSE; + } if (wFlags & TPM_BUTTONDOWN) { @@ -2926,7 +2934,8 @@ } /* The return value is only used by TrackPopupMenu */ - return ((executedMenuId != -1) ? executedMenuId : 0); + return (executedMenuId); /* changed by A.Rosenberg 2003.12.11 */ + /* required to fix return code of TrackPopupMenu */ } /*********************************************************************** @@ -3071,11 +3080,19 @@ SendMessageW( hWnd, WM_INITMENUPOPUP, (WPARAM)hMenu, 0); if (MENU_ShowPopup( hWnd, hMenu, 0, x, y, 0, 0 )) + /* -1 is returned when the menu was canceled */ ret = MENU_TrackMenu( hMenu, wFlags | TPM_POPUPMENU, 0, 0, hWnd, lpRect ); MENU_ExitTracking(hWnd); - if( (!(wFlags & TPM_RETURNCMD)) && (ret != FALSE) ) - ret = 1; + /* changed by A.Rosenberg 2003.12.11 - fixes return code when menu is being canceled*/ + if (ret < 0) + if (wFlags & TPM_RETURNCMD) + ret = 0; + else + ret = 1; + else + if ((!(wFlags & TPM_RETURNCMD)) && (ret > 0)) + ret = 1; return ret; }