Added proper support for 32-bit WM_NEXTMENU.
This commit is contained in:
parent
4ff32c8aef
commit
b3ec03092f
|
@ -2323,16 +2323,20 @@ static LRESULT MENU_DoNextMenu( MTRACKER* pmt, UINT vk )
|
|||
if( (vk == VK_LEFT && menu->FocusedItem == 0 ) ||
|
||||
(vk == VK_RIGHT && menu->FocusedItem == menu->nItems - 1))
|
||||
{
|
||||
MDINEXTMENU next_menu;
|
||||
HMENU hNewMenu;
|
||||
HWND hNewWnd;
|
||||
UINT id = 0;
|
||||
LRESULT l = SendMessageA( pmt->hOwnerWnd, WM_NEXTMENU, vk,
|
||||
(IS_SYSTEM_MENU(menu)) ? GetSubMenu(pmt->hTopMenu,0) : pmt->hTopMenu );
|
||||
|
||||
next_menu.hmenuIn = (IS_SYSTEM_MENU(menu)) ? GetSubMenu(pmt->hTopMenu,0) : pmt->hTopMenu;
|
||||
next_menu.hmenuNext = 0;
|
||||
next_menu.hwndNext = 0;
|
||||
SendMessageW( pmt->hOwnerWnd, WM_NEXTMENU, vk, (LPARAM)&next_menu );
|
||||
|
||||
TRACE("%04x [%04x] -> %04x [%04x]\n",
|
||||
(UINT16)pmt->hCurrentMenu, (UINT16)pmt->hOwnerWnd, LOWORD(l), HIWORD(l) );
|
||||
pmt->hCurrentMenu, pmt->hOwnerWnd, next_menu.hmenuNext, next_menu.hwndNext );
|
||||
|
||||
if( l == 0 )
|
||||
if (!next_menu.hmenuNext || !next_menu.hwndNext)
|
||||
{
|
||||
DWORD style = GetWindowLongA( pmt->hOwnerWnd, GWL_STYLE );
|
||||
hNewWnd = pmt->hOwnerWnd;
|
||||
|
@ -2357,8 +2361,8 @@ static LRESULT MENU_DoNextMenu( MTRACKER* pmt, UINT vk )
|
|||
}
|
||||
else /* application returned a new menu to switch to */
|
||||
{
|
||||
hNewMenu = LOWORD(l);
|
||||
hNewWnd = HIWORD(l);
|
||||
hNewMenu = next_menu.hmenuNext;
|
||||
hNewWnd = next_menu.hwndNext;
|
||||
|
||||
if( IsMenu(hNewMenu) && IsWindow(hNewWnd) )
|
||||
{
|
||||
|
|
|
@ -1309,9 +1309,18 @@ INT WINPROC_MapMsg16To32A( UINT16 msg16, WPARAM16 wParam16, UINT *pmsg32,
|
|||
*plparam = (LPARAM) idThread;
|
||||
}
|
||||
return 0;
|
||||
case WM_NEXTMENU:
|
||||
{
|
||||
MDINEXTMENU *next = HeapAlloc( GetProcessHeap(), 0, sizeof(*next) );
|
||||
if (!next) return -1;
|
||||
next->hmenuIn = *plparam;
|
||||
next->hmenuNext = 0;
|
||||
next->hwndNext = 0;
|
||||
*plparam = (LPARAM)next;
|
||||
return 1;
|
||||
}
|
||||
case WM_PAINTCLIPBOARD:
|
||||
case WM_SIZECLIPBOARD:
|
||||
case WM_NEXTMENU:
|
||||
FIXME_(msg)("message %04x needs translation\n",msg16 );
|
||||
return -1;
|
||||
|
||||
|
@ -1415,6 +1424,13 @@ LRESULT WINPROC_UnmapMsg16To32A( HWND16 hwnd, UINT msg, WPARAM wParam, LPARAM lP
|
|||
HeapFree( GetProcessHeap(), 0, msg32 );
|
||||
}
|
||||
break;
|
||||
case WM_NEXTMENU:
|
||||
{
|
||||
MDINEXTMENU *next = (MDINEXTMENU *)lParam;
|
||||
result = MAKELONG( next->hmenuNext, next->hwndNext );
|
||||
HeapFree( GetProcessHeap(), 0, next );
|
||||
}
|
||||
break;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
@ -2036,9 +2052,14 @@ INT WINPROC_MapMsg32ATo16( HWND hwnd, UINT msg32, WPARAM wParam32,
|
|||
case WM_ACTIVATEAPP:
|
||||
if (*plparam) *plparam = (LPARAM)THREAD_IdToTEB((DWORD) *plparam)->htask16;
|
||||
return 0;
|
||||
case WM_NEXTMENU:
|
||||
{
|
||||
MDINEXTMENU *next = (MDINEXTMENU *)*plparam;
|
||||
*plparam = next->hmenuIn;
|
||||
return 1;
|
||||
}
|
||||
case WM_PAINTCLIPBOARD:
|
||||
case WM_SIZECLIPBOARD:
|
||||
case WM_NEXTMENU:
|
||||
FIXME_(msg)("message %04x needs translation\n", msg32 );
|
||||
return -1;
|
||||
/* following messages should not be sent to 16-bit apps */
|
||||
|
@ -2207,6 +2228,14 @@ void WINPROC_UnmapMsg32ATo16( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam,
|
|||
SEGPTR_FREE(msg16);
|
||||
}
|
||||
break;
|
||||
case WM_NEXTMENU:
|
||||
{
|
||||
MDINEXTMENU *next = (MDINEXTMENU *)lParam;
|
||||
next->hmenuNext = LOWORD(p16->lResult);
|
||||
next->hwndNext = HIWORD(p16->lResult);
|
||||
p16->lResult = 0;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue