Account for chrome padding and menu bar when auto-relocating windows

This commit is contained in:
elasota
2020-04-05 18:30:04 -04:00
parent f56d879d12
commit b827048c36
3 changed files with 18 additions and 5 deletions

View File

@@ -145,6 +145,7 @@ namespace PortabilityLayer
PLPasStr GetItemText(const THandle<Menu> &menu, unsigned int index) const override; PLPasStr GetItemText(const THandle<Menu> &menu, unsigned int index) const override;
bool IsPointInMenuBar(const Vec2i &point) 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; bool FindMenuShortcut(uint16_t &menuID, uint16_t &itemID, uint8_t shortcutChar) override;
void MenuSelect(const Vec2i &initialPoint, int16_t *outMenu, uint16_t *outItem) 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<uint32_t>(point.m_y) < kMenuBarHeight; return point.m_y >= 0 && static_cast<uint32_t>(point.m_y) < kMenuBarHeight;
} }
uint16_t MenuManagerImpl::GetMenuBarHeight() const
{
return kMenuBarHeight;
}
bool MenuManagerImpl::FindMenuShortcut(uint16_t &menuID, uint16_t &itemID, uint8_t shortcutChar) bool MenuManagerImpl::FindMenuShortcut(uint16_t &menuID, uint16_t &itemID, uint8_t shortcutChar)
{ {

View File

@@ -40,6 +40,7 @@ namespace PortabilityLayer
virtual PLPasStr GetItemText(const THandle<Menu> &menu, unsigned int index) const = 0; virtual PLPasStr GetItemText(const THandle<Menu> &menu, unsigned int index) const = 0;
virtual bool IsPointInMenuBar(const Vec2i &point) 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 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; virtual void MenuSelect(const Vec2i &initialPoint, int16_t *outMenu, uint16_t *outItem) = 0;

View File

@@ -813,6 +813,8 @@ namespace PortabilityLayer
void WindowManagerImpl::HandleScreenResolutionChange(uint32_t prevWidth, uint32_t prevHeight, uint32_t newWidth, uint32_t newHeight) 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()) for (PortabilityLayer::WindowImpl *window = m_windowStackTop; window != nullptr; window = window->GetWindowBelow())
{ {
uint16_t chromePadding[WindowChromeSides::kCount]; uint16_t chromePadding[WindowChromeSides::kCount];
@@ -834,13 +836,18 @@ namespace PortabilityLayer
} }
int64_t newY = 0; int64_t newY = 0;
if (newHeight <= paddedHeight || prevHeight <= paddedHeight) if (window->m_wmY < static_cast<int32_t>(menuBarHeight))
newY = (static_cast<int64_t>(newHeight) - paddedHeight) / 2; newY = window->m_wmY;
else else
{ {
uint32_t prevClearanceY = prevHeight - paddedHeight; if (newHeight <= (paddedHeight + menuBarHeight) || prevHeight <= paddedHeight + menuBarHeight)
uint32_t newClearanceY = newHeight - paddedHeight; newY = (static_cast<int64_t>(newHeight) - paddedHeight - menuBarHeight) / 2 + menuBarHeight;
newY = static_cast<int64_t>(window->m_wmY) * static_cast<int64_t>(newClearanceY) / static_cast<int64_t>(prevClearanceY); else
{
uint32_t prevClearanceY = prevHeight - paddedHeight - menuBarHeight;
uint32_t newClearanceY = newHeight - paddedHeight - menuBarHeight;
newY = (static_cast<int64_t>(window->m_wmY) - static_cast<int64_t>(menuBarHeight) - chromePadding[WindowChromeSides::kTop]) * static_cast<int64_t>(newClearanceY) / static_cast<int64_t>(prevClearanceY) + menuBarHeight + chromePadding[WindowChromeSides::kTop];
}
} }
newX = std::max<int64_t>(0, std::min<int64_t>(newX, newWidth - 1)); newX = std::max<int64_t>(0, std::min<int64_t>(newX, newWidth - 1));