diff --git a/win32ss/user/ntuser/menu.c b/win32ss/user/ntuser/menu.c index 0dc6bac3759..b8177594df0 100644 --- a/win32ss/user/ntuser/menu.c +++ b/win32ss/user/ntuser/menu.c @@ -2911,9 +2911,22 @@ static BOOL FASTCALL MENU_ShowPopup(PWND pwndOwner, PMENU menu, UINT id, UINT fl x -= width - xanchor; if( x + width > monitor->rcMonitor.right) - x = monitor->rcMonitor.right - width; + { + /* If we would flip around our origin, would we go off screen on the other side? */ + if (x - width < monitor->rcMonitor.left) + x = monitor->rcMonitor.right - width; + else + x -= width; + } + } + if( x < monitor->rcMonitor.left ) + { + /* If we would flip around our origin, would we go off screen on the other side? */ + if (x + width > monitor->rcMonitor.right) + x = monitor->rcMonitor.left; + else + x += width; } - if( x < monitor->rcMonitor.left ) x = monitor->rcMonitor.left; if( y + height > monitor->rcMonitor.bottom) { @@ -2921,9 +2934,22 @@ static BOOL FASTCALL MENU_ShowPopup(PWND pwndOwner, PMENU menu, UINT id, UINT fl y -= height + yanchor; if( y + height > monitor->rcMonitor.bottom) - y = monitor->rcMonitor.bottom - height; + { + /* If we would flip around our origin, would we go off screen on the other side? */ + if (y - height < monitor->rcMonitor.top) + y = monitor->rcMonitor.bottom - height; + else + y -= height; + } + } + if( y < monitor->rcMonitor.top ) + { + /* If we would flip around our origin, would we go off screen on the other side? */ + if (y + height > monitor->rcMonitor.bottom) + y = monitor->rcMonitor.top; + else + y += height; } - if( y < monitor->rcMonitor.top ) y = monitor->rcMonitor.top; pWnd = ValidateHwndNoErr( menu->hWnd );