diff --git a/PortabilityLayer/MenuManager.cpp b/PortabilityLayer/MenuManager.cpp index a56fbda..3d779c6 100644 --- a/PortabilityLayer/MenuManager.cpp +++ b/PortabilityLayer/MenuManager.cpp @@ -145,6 +145,7 @@ namespace PortabilityLayer PLPasStr GetItemText(const THandle &menu, unsigned int index) const override; bool IsPointInMenuBar(const Vec2i &point) const override; + uint16_t GetMenuBarHeight() const override; bool FindMenuShortcut(uint16_t &menuID, uint16_t &itemID, uint8_t shortcutChar) override; void MenuSelect(const Vec2i &initialPoint, int16_t *outMenu, uint16_t *outItem) override; @@ -598,6 +599,10 @@ namespace PortabilityLayer return point.m_y >= 0 && static_cast(point.m_y) < kMenuBarHeight; } + uint16_t MenuManagerImpl::GetMenuBarHeight() const + { + return kMenuBarHeight; + } bool MenuManagerImpl::FindMenuShortcut(uint16_t &menuID, uint16_t &itemID, uint8_t shortcutChar) { diff --git a/PortabilityLayer/MenuManager.h b/PortabilityLayer/MenuManager.h index 365f3e0..4e5cf38 100644 --- a/PortabilityLayer/MenuManager.h +++ b/PortabilityLayer/MenuManager.h @@ -40,6 +40,7 @@ namespace PortabilityLayer virtual PLPasStr GetItemText(const THandle &menu, unsigned int index) const = 0; virtual bool IsPointInMenuBar(const Vec2i &point) const = 0; + virtual uint16_t GetMenuBarHeight() const = 0; virtual bool FindMenuShortcut(uint16_t &menuID, uint16_t &itemID, uint8_t shortcutChar) = 0; virtual void MenuSelect(const Vec2i &initialPoint, int16_t *outMenu, uint16_t *outItem) = 0; diff --git a/PortabilityLayer/WindowManager.cpp b/PortabilityLayer/WindowManager.cpp index 689fc62..8f531f4 100644 --- a/PortabilityLayer/WindowManager.cpp +++ b/PortabilityLayer/WindowManager.cpp @@ -813,6 +813,8 @@ namespace PortabilityLayer void WindowManagerImpl::HandleScreenResolutionChange(uint32_t prevWidth, uint32_t prevHeight, uint32_t newWidth, uint32_t newHeight) { + const uint32_t menuBarHeight = PortabilityLayer::MenuManager::GetInstance()->GetMenuBarHeight(); + for (PortabilityLayer::WindowImpl *window = m_windowStackTop; window != nullptr; window = window->GetWindowBelow()) { uint16_t chromePadding[WindowChromeSides::kCount]; @@ -834,13 +836,18 @@ namespace PortabilityLayer } int64_t newY = 0; - if (newHeight <= paddedHeight || prevHeight <= paddedHeight) - newY = (static_cast(newHeight) - paddedHeight) / 2; + if (window->m_wmY < static_cast(menuBarHeight)) + newY = window->m_wmY; else { - uint32_t prevClearanceY = prevHeight - paddedHeight; - uint32_t newClearanceY = newHeight - paddedHeight; - newY = static_cast(window->m_wmY) * static_cast(newClearanceY) / static_cast(prevClearanceY); + if (newHeight <= (paddedHeight + menuBarHeight) || prevHeight <= paddedHeight + menuBarHeight) + newY = (static_cast(newHeight) - paddedHeight - menuBarHeight) / 2 + menuBarHeight; + else + { + uint32_t prevClearanceY = prevHeight - paddedHeight - menuBarHeight; + uint32_t newClearanceY = newHeight - paddedHeight - menuBarHeight; + newY = (static_cast(window->m_wmY) - static_cast(menuBarHeight) - chromePadding[WindowChromeSides::kTop]) * static_cast(newClearanceY) / static_cast(prevClearanceY) + menuBarHeight + chromePadding[WindowChromeSides::kTop]; + } } newX = std::max(0, std::min(newX, newWidth - 1));