Fix stay-on-top Ui::Window-s on macOS.

This commit is contained in:
John Preston 2021-06-08 17:11:02 +04:00
parent 7bc9e12614
commit 1c004580eb
6 changed files with 38 additions and 8 deletions

View file

@ -23,6 +23,7 @@ public:
void setTitleStyle(const style::WindowTitle &st) override;
void setMinimumSize(QSize size) override;
void setFixedSize(QSize size) override;
void setStaysOnTop(bool enabled) override;
void setGeometry(QRect rect) override;
void close() override;

View file

@ -117,6 +117,7 @@ public:
[[nodiscard]] QRect controlsRect() const;
[[nodiscard]] bool checkNativeMove(void *nswindow) const;
void activateBeforeNativeMove();
void setStaysOnTop(bool enabled);
void close();
private:
@ -127,6 +128,7 @@ private:
[[nodiscard]] Fn<void(bool)> toggleCustomTitleCallback();
[[nodiscard]] Fn<void()> enforceStyleCallback();
void enforceStyle();
const not_null<WindowHelper*> _owner;
const WindowObserver *_observer = nullptr;
@ -141,13 +143,14 @@ private:
};
WindowHelper::Private::Private(not_null<WindowHelper*> owner)
: _owner(owner)
, _observer([[WindowObserver alloc] initWithToggle:toggleCustomTitleCallback() enforce:enforceStyleCallback()]) {
: _owner(owner) {
init();
}
WindowHelper::Private::~Private() {
[_observer release];
if (_observer) {
[_observer release];
}
}
int WindowHelper::Private::customTitleHeight() const {
@ -201,6 +204,12 @@ void WindowHelper::Private::activateBeforeNativeMove() {
[_nativeWindow makeKeyAndOrderFront:_nativeWindow];
}
void WindowHelper::Private::setStaysOnTop(bool enabled) {
_owner->BasicWindowHelper::setStaysOnTop(enabled);
resolveWeakPointers();
initCustomTitle();
}
void WindowHelper::Private::close() {
const auto weak = Ui::MakeWeak(_owner->window());
QCloseEvent e;
@ -218,11 +227,13 @@ Fn<void(bool)> WindowHelper::Private::toggleCustomTitleCallback() {
}
Fn<void()> WindowHelper::Private::enforceStyleCallback() {
return crl::guard(_owner->window(), [=] {
if (_nativeWindow && _customTitleHeight > 0) {
[_nativeWindow setStyleMask:[_nativeWindow styleMask] | NSFullSizeContentViewWindowMask];
}
});
return crl::guard(_owner->window(), [=] { enforceStyle(); });
}
void WindowHelper::Private::enforceStyle() {
if (_nativeWindow && _customTitleHeight > 0) {
[_nativeWindow setStyleMask:[_nativeWindow styleMask] | NSFullSizeContentViewWindowMask];
}
}
void WindowHelper::Private::initOpenGL() {
@ -246,6 +257,10 @@ void WindowHelper::Private::initCustomTitle() {
[_nativeWindow setTitlebarAppearsTransparent:YES];
if (_observer) {
[_observer release];
}
_observer = [[WindowObserver alloc] initWithToggle:toggleCustomTitleCallback() enforce:enforceStyleCallback()];
[[NSNotificationCenter defaultCenter] addObserver:_observer selector:@selector(windowWillEnterFullScreen:) name:NSWindowWillEnterFullScreenNotification object:_nativeWindow];
[[NSNotificationCenter defaultCenter] addObserver:_observer selector:@selector(windowWillExitFullScreen:) name:NSWindowWillExitFullScreenNotification object:_nativeWindow];
[[NSNotificationCenter defaultCenter] addObserver:_observer selector:@selector(windowDidExitFullScreen:) name:NSWindowDidExitFullScreenNotification object:_nativeWindow];
@ -342,6 +357,10 @@ void WindowHelper::setFixedSize(QSize size) {
(_title ? _title->height() : 0) + size.height());
}
void WindowHelper::setStaysOnTop(bool enabled) {
_private->setStaysOnTop(enabled);
}
void WindowHelper::setGeometry(QRect rect) {
window()->setGeometry(
rect.marginsAdded({ 0, (_title ? _title->height() : 0), 0, 0 }));

View file

@ -52,6 +52,10 @@ void BasicWindowHelper::setFixedSize(QSize size) {
_window->setFixedSize(size);
}
void BasicWindowHelper::setStaysOnTop(bool enabled) {
_window->setWindowFlag(Qt::WindowStaysOnTopHint, enabled);
}
void BasicWindowHelper::setGeometry(QRect rect) {
_window->setGeometry(rect);
}

View file

@ -32,6 +32,7 @@ public:
virtual void setTitleStyle(const style::WindowTitle &st);
virtual void setMinimumSize(QSize size);
virtual void setFixedSize(QSize size);
virtual void setStaysOnTop(bool enabled);
virtual void setGeometry(QRect rect);
virtual void showFullScreen();
virtual void showNormal();

View file

@ -44,6 +44,10 @@ void Window::setFixedSize(QSize size) {
_helper->setFixedSize(size);
}
void Window::setStaysOnTop(bool enabled) {
_helper->setStaysOnTop(enabled);
}
void Window::setGeometry(QRect rect) {
_helper->setGeometry(rect);
}

View file

@ -41,6 +41,7 @@ public:
void setTitleStyle(const style::WindowTitle &st);
void setMinimumSize(QSize size);
void setFixedSize(QSize size);
void setStaysOnTop(bool enabled);
void setGeometry(QRect rect);
void showFullScreen();
void showNormal();