diff --git a/src/window/popupwindow.cpp b/src/window/popupwindow.cpp index 7454d363..99c471c7 100644 --- a/src/window/popupwindow.cpp +++ b/src/window/popupwindow.cpp @@ -126,7 +126,20 @@ qint32 ProxyPopupWindow::relativeY() const { PopupAnchor* ProxyPopupWindow::anchor() { return &this->mAnchor; } void ProxyPopupWindow::reposition() { - if (this->window != nullptr) { - PopupPositioner::instance()->reposition(&this->mAnchor, this->window); + // not gated on pendingReposition as a polish might not be triggered in edge cases + if (this->window) { + this->pendingReposition = true; + this->schedulePolish(); + } +} + +void ProxyPopupWindow::onPolished() { + this->ProxyWindowBase::onPolished(); + if (this->pendingReposition) { + this->pendingReposition = false; + + if (this->window) { + PopupPositioner::instance()->reposition(&this->mAnchor, this->window); + } } } diff --git a/src/window/popupwindow.hpp b/src/window/popupwindow.hpp index a1e535f7..63ae97ff 100644 --- a/src/window/popupwindow.hpp +++ b/src/window/popupwindow.hpp @@ -87,6 +87,7 @@ public: void completeWindow() override; void postCompleteWindow() override; + void onPolished() override; void setScreen(QuickshellScreenInfo* screen) override; void setVisible(bool visible) override; @@ -119,4 +120,5 @@ private: PopupAnchor mAnchor {this}; bool wantsVisible = false; + bool pendingReposition = false; };