diff --git a/ui/platform/linux/ui_utility_linux.cpp b/ui/platform/linux/ui_utility_linux.cpp index 45b0791..eda2916 100644 --- a/ui/platform/linux/ui_utility_linux.cpp +++ b/ui/platform/linux/ui_utility_linux.cpp @@ -615,5 +615,11 @@ void ShowWindowMenu(not_null widget, const QPoint &point) { #endif // !DESKTOP_APP_DISABLE_X11_INTEGRATION } +void SetGeometryWithPossibleScreenChange( + not_null widget, + QRect geometry) { + widget->setGeometry(geometry); +} + } // namespace Platform } // namespace Ui diff --git a/ui/platform/mac/ui_utility_mac.mm b/ui/platform/mac/ui_utility_mac.mm index 9f30cec..02bc70b 100644 --- a/ui/platform/mac/ui_utility_mac.mm +++ b/ui/platform/mac/ui_utility_mac.mm @@ -164,5 +164,11 @@ std::optional IsOverlapped( return false; } +void SetGeometryWithPossibleScreenChange( + not_null widget, + QRect geometry) { + widget->setGeometry(geometry); +} + } // namespace Platform } // namespace Ui diff --git a/ui/platform/ui_platform_utility.h b/ui/platform/ui_platform_utility.h index a54076d..c2d304e 100644 --- a/ui/platform/ui_platform_utility.h +++ b/ui/platform/ui_platform_utility.h @@ -45,6 +45,10 @@ void ShowWindowMenu(not_null widget, const QPoint &point); void FixPopupMenuNativeEmojiPopup(not_null menu); +void SetGeometryWithPossibleScreenChange( + not_null widget, + QRect geometry); + } // namespace Ui::Platform // Platform dependent implementations. diff --git a/ui/platform/win/ui_utility_win.cpp b/ui/platform/win/ui_utility_win.cpp index c1abcaf..9ac0e72 100644 --- a/ui/platform/win/ui_utility_win.cpp +++ b/ui/platform/win/ui_utility_win.cpp @@ -16,6 +16,10 @@ #include #include +#include "base/event_filter.h" +#include +#include + using namespace Microsoft::WRL; namespace Ui::Platform { @@ -177,4 +181,19 @@ void FixPopupMenuNativeEmojiPopup(not_null menu) { menu->lifetime().make_state(menu)); } +void SetGeometryWithPossibleScreenChange( + not_null widget, + QRect geometry) { + const auto screen = QGuiApplication::screenAt(geometry.center()); + const auto window = widget->window(); + window->createWinId(); + const auto handle = window->windowHandle(); + if (handle->screen() != screen) { + handle->setScreen(screen); + window->move(screen->availableGeometry().topLeft()); + window->show(); + } + widget->setGeometry(geometry); +} + } // namespace Ui::Platform diff --git a/ui/platform/win/ui_window_win.cpp b/ui/platform/win/ui_window_win.cpp index 5327495..3de9191 100644 --- a/ui/platform/win/ui_window_win.cpp +++ b/ui/platform/win/ui_window_win.cpp @@ -356,7 +356,9 @@ void WindowHelper::setFixedSize(QSize size) { } void WindowHelper::setGeometry(QRect rect) { - window()->setGeometry(rect.marginsAdded({ 0, titleHeight(), 0, 0 })); + SetGeometryWithPossibleScreenChange( + window(), + rect.marginsAdded({ 0, titleHeight(), 0, 0 })); } void WindowHelper::showFullScreen() { diff --git a/ui/ui_utility.cpp b/ui/ui_utility.cpp index ded550d..26b284f 100644 --- a/ui/ui_utility.cpp +++ b/ui/ui_utility.cpp @@ -252,4 +252,10 @@ QPoint MapFrom( return { MapFrom(to, from, rect.topLeft()), rect.size() }; } +void SetGeometryWithPossibleScreenChange( + not_null widget, + QRect geometry) { + Platform::SetGeometryWithPossibleScreenChange(widget, geometry); +} + } // namespace Ui diff --git a/ui/ui_utility.h b/ui/ui_utility.h index 4913831..5e2dd81 100644 --- a/ui/ui_utility.h +++ b/ui/ui_utility.h @@ -207,4 +207,8 @@ int WheelDirection(not_null e); not_null from, QRect rect); +void SetGeomtryWithPossibleScreenChange( + not_null widget, + QRect geometry); + } // namespace Ui