diff --git a/ui/platform/mac/ui_window_mac.h b/ui/platform/mac/ui_window_mac.h index 31dda13..dd5b9bd 100644 --- a/ui/platform/mac/ui_window_mac.h +++ b/ui/platform/mac/ui_window_mac.h @@ -19,6 +19,7 @@ public: ~WindowHelper(); not_null body() override; + QMargins frameMargins() override; void setTitle(const QString &title) override; void setTitleStyle(const style::WindowTitle &st) override; void setMinimumSize(QSize size) override; diff --git a/ui/platform/mac/ui_window_mac.mm b/ui/platform/mac/ui_window_mac.mm index 3bea72e..22e3863 100644 --- a/ui/platform/mac/ui_window_mac.mm +++ b/ui/platform/mac/ui_window_mac.mm @@ -300,11 +300,9 @@ void WindowHelper::Private::init() { WindowHelper::WindowHelper(not_null window) : BasicWindowHelper(window) , _private(std::make_unique(this)) -, _title(_private->customTitleHeight() - ? Ui::CreateChild( - window.get(), - _private->customTitleHeight()) - : nullptr) +, _title(Ui::CreateChild( + window.get(), + _private->customTitleHeight())) , _body(Ui::CreateChild(window.get())) { if (_title->shouldBeHidden()) { updateCustomTitleVisibility(); @@ -319,26 +317,26 @@ not_null WindowHelper::body() { return _body; } +QMargins WindowHelper::frameMargins() { + const auto titleHeight = !_title->isHidden() ? _title->height() : 0; + return QMargins{ 0, titleHeight, 0, 0 }; +} + void WindowHelper::setTitle(const QString &title) { - if (_title) { - _title->setText(title); - } - window()->setWindowTitle( - (!_title || !_titleVisible) ? title : QString()); + _title->setText(title); + window()->setWindowTitle(_titleVisible ? QString() : title); } void WindowHelper::setTitleStyle(const style::WindowTitle &st) { - if (_title) { - _title->setStyle(st); - if (_title->shouldBeHidden()) { - updateCustomTitleVisibility(); - } + _title->setStyle(st); + if (_title->shouldBeHidden()) { + updateCustomTitleVisibility(); } } void WindowHelper::updateCustomTitleVisibility(bool force) { - auto visible = !_title->shouldBeHidden() && _titleVisible; - if (!_title || (!force && _title->isHidden() != visible)) { + const auto visible = !_title->shouldBeHidden() && _titleVisible; + if (!force && _title->isHidden() != visible) { return; } _title->setVisible(visible); @@ -346,15 +344,11 @@ void WindowHelper::updateCustomTitleVisibility(bool force) { } void WindowHelper::setMinimumSize(QSize size) { - window()->setMinimumSize( - size.width(), - (_title ? _title->height() : 0) + size.height()); + window()->setMinimumSize(size.width(), _title->height() + size.height()); } void WindowHelper::setFixedSize(QSize size) { - window()->setFixedSize( - size.width(), - (_title ? _title->height() : 0) + size.height()); + window()->setFixedSize(size.width(), _title->height() + size.height()); } void WindowHelper::setStaysOnTop(bool enabled) { @@ -362,8 +356,7 @@ void WindowHelper::setStaysOnTop(bool enabled) { } void WindowHelper::setGeometry(QRect rect) { - window()->setGeometry( - rect.marginsAdded({ 0, (_title ? _title->height() : 0), 0, 0 })); + window()->setGeometry(rect.marginsAdded({ 0, _title->height(), 0, 0 })); } void WindowHelper::setupBodyTitleAreaEvents() { diff --git a/ui/platform/ui_platform_window.cpp b/ui/platform/ui_platform_window.cpp index c2f5fc4..a9046dc 100644 --- a/ui/platform/ui_platform_window.cpp +++ b/ui/platform/ui_platform_window.cpp @@ -37,6 +37,10 @@ not_null BasicWindowHelper::body() { return _window; } +QMargins BasicWindowHelper::frameMargins() { + return nativeFrameMargins(); +} + void BasicWindowHelper::setTitle(const QString &title) { _window->setWindowTitle(title); } @@ -86,6 +90,16 @@ void BasicWindowHelper::setBodyTitleArea( setupBodyTitleAreaEvents(); } +QMargins BasicWindowHelper::nativeFrameMargins() const { + const auto inner = window()->geometry(); + const auto outer = window()->frameGeometry(); + return QMargins( + inner.x() - outer.x(), + inner.y() - outer.y(), + outer.x() + outer.width() - inner.x() - inner.width(), + outer.y() + outer.height() - inner.y() - inner.height()); +} + void BasicWindowHelper::setupBodyTitleAreaEvents() { // This is not done on macOS, because startSystemMove // doesn't work from event handler there. @@ -243,6 +257,12 @@ not_null DefaultWindowHelper::body() { return _body; } +QMargins DefaultWindowHelper::frameMargins() { + return _title->isHidden() + ? BasicWindowHelper::nativeFrameMargins() + : QMargins{ 0, _title->height(), 0, 0 }; +} + bool DefaultWindowHelper::hasShadow() const { const auto center = window()->geometry().center(); return WindowExtentsSupported() && TranslucentWindowsSupported(center); diff --git a/ui/platform/ui_platform_window.h b/ui/platform/ui_platform_window.h index 3580b11..fb84190 100644 --- a/ui/platform/ui_platform_window.h +++ b/ui/platform/ui_platform_window.h @@ -28,6 +28,7 @@ public: virtual ~BasicWindowHelper() = default; [[nodiscard]] virtual not_null body(); + [[nodiscard]] virtual QMargins frameMargins(); virtual void setTitle(const QString &title); virtual void setTitleStyle(const style::WindowTitle &st); virtual void setNativeFrame(bool enabled); @@ -51,6 +52,7 @@ protected: ? _bodyTitleAreaTestMethod(point) : WindowTitleHitTestFlag(); } + [[nodiscard]] QMargins nativeFrameMargins() const; private: virtual void setupBodyTitleAreaEvents(); @@ -66,6 +68,7 @@ public: explicit DefaultWindowHelper(not_null window); not_null body() override; + QMargins frameMargins() override; void setTitle(const QString &title) override; void setTitleStyle(const style::WindowTitle &st) override; void setNativeFrame(bool enabled) override; diff --git a/ui/platform/win/ui_window_win.cpp b/ui/platform/win/ui_window_win.cpp index 130d63e..21c9ea8 100644 --- a/ui/platform/win/ui_window_win.cpp +++ b/ui/platform/win/ui_window_win.cpp @@ -185,6 +185,12 @@ not_null WindowHelper::body() { return _body; } +QMargins WindowHelper::frameMargins() { + return _title->isHidden() + ? BasicWindowHelper::nativeFrameMargins() + : QMargins{ 0, _title->height(), 0, 0 }; +} + void WindowHelper::setTitle(const QString &title) { _title->setText(title); window()->setWindowTitle(title); diff --git a/ui/platform/win/ui_window_win.h b/ui/platform/win/ui_window_win.h index 955e156..dadf5db 100644 --- a/ui/platform/win/ui_window_win.h +++ b/ui/platform/win/ui_window_win.h @@ -22,6 +22,7 @@ public: ~WindowHelper(); not_null body() override; + QMargins frameMargins() override; void setTitle(const QString &title) override; void setTitleStyle(const style::WindowTitle &st) override; void setNativeFrame(bool enabled) override; diff --git a/ui/widgets/rp_window.cpp b/ui/widgets/rp_window.cpp index 7adad8f..48f3a77 100644 --- a/ui/widgets/rp_window.cpp +++ b/ui/widgets/rp_window.cpp @@ -28,6 +28,10 @@ not_null RpWindow::body() const { return _helper->body().get(); } +QMargins RpWindow::frameMargins() const { + return _helper->frameMargins(); +} + void RpWindow::setTitle(const QString &title) { _helper->setTitle(title); } diff --git a/ui/widgets/rp_window.h b/ui/widgets/rp_window.h index 49524fd..4f4996e 100644 --- a/ui/widgets/rp_window.h +++ b/ui/widgets/rp_window.h @@ -36,6 +36,7 @@ public: [[nodiscard]] not_null body(); [[nodiscard]] not_null body() const; + [[nodiscard]] QMargins frameMargins() const; void setTitle(const QString &title); void setTitleStyle(const style::WindowTitle &st);