Fix stay-on-top Ui::Window-s on macOS.
This commit is contained in:
parent
7bc9e12614
commit
1c004580eb
6 changed files with 38 additions and 8 deletions
|
|
@ -23,6 +23,7 @@ public:
|
||||||
void setTitleStyle(const style::WindowTitle &st) override;
|
void setTitleStyle(const style::WindowTitle &st) override;
|
||||||
void setMinimumSize(QSize size) override;
|
void setMinimumSize(QSize size) override;
|
||||||
void setFixedSize(QSize size) override;
|
void setFixedSize(QSize size) override;
|
||||||
|
void setStaysOnTop(bool enabled) override;
|
||||||
void setGeometry(QRect rect) override;
|
void setGeometry(QRect rect) override;
|
||||||
void close() override;
|
void close() override;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -117,6 +117,7 @@ public:
|
||||||
[[nodiscard]] QRect controlsRect() const;
|
[[nodiscard]] QRect controlsRect() const;
|
||||||
[[nodiscard]] bool checkNativeMove(void *nswindow) const;
|
[[nodiscard]] bool checkNativeMove(void *nswindow) const;
|
||||||
void activateBeforeNativeMove();
|
void activateBeforeNativeMove();
|
||||||
|
void setStaysOnTop(bool enabled);
|
||||||
void close();
|
void close();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
@ -127,6 +128,7 @@ private:
|
||||||
|
|
||||||
[[nodiscard]] Fn<void(bool)> toggleCustomTitleCallback();
|
[[nodiscard]] Fn<void(bool)> toggleCustomTitleCallback();
|
||||||
[[nodiscard]] Fn<void()> enforceStyleCallback();
|
[[nodiscard]] Fn<void()> enforceStyleCallback();
|
||||||
|
void enforceStyle();
|
||||||
|
|
||||||
const not_null<WindowHelper*> _owner;
|
const not_null<WindowHelper*> _owner;
|
||||||
const WindowObserver *_observer = nullptr;
|
const WindowObserver *_observer = nullptr;
|
||||||
|
|
@ -141,13 +143,14 @@ private:
|
||||||
};
|
};
|
||||||
|
|
||||||
WindowHelper::Private::Private(not_null<WindowHelper*> owner)
|
WindowHelper::Private::Private(not_null<WindowHelper*> owner)
|
||||||
: _owner(owner)
|
: _owner(owner) {
|
||||||
, _observer([[WindowObserver alloc] initWithToggle:toggleCustomTitleCallback() enforce:enforceStyleCallback()]) {
|
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
WindowHelper::Private::~Private() {
|
WindowHelper::Private::~Private() {
|
||||||
[_observer release];
|
if (_observer) {
|
||||||
|
[_observer release];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int WindowHelper::Private::customTitleHeight() const {
|
int WindowHelper::Private::customTitleHeight() const {
|
||||||
|
|
@ -201,6 +204,12 @@ void WindowHelper::Private::activateBeforeNativeMove() {
|
||||||
[_nativeWindow makeKeyAndOrderFront:_nativeWindow];
|
[_nativeWindow makeKeyAndOrderFront:_nativeWindow];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WindowHelper::Private::setStaysOnTop(bool enabled) {
|
||||||
|
_owner->BasicWindowHelper::setStaysOnTop(enabled);
|
||||||
|
resolveWeakPointers();
|
||||||
|
initCustomTitle();
|
||||||
|
}
|
||||||
|
|
||||||
void WindowHelper::Private::close() {
|
void WindowHelper::Private::close() {
|
||||||
const auto weak = Ui::MakeWeak(_owner->window());
|
const auto weak = Ui::MakeWeak(_owner->window());
|
||||||
QCloseEvent e;
|
QCloseEvent e;
|
||||||
|
|
@ -218,11 +227,13 @@ Fn<void(bool)> WindowHelper::Private::toggleCustomTitleCallback() {
|
||||||
}
|
}
|
||||||
|
|
||||||
Fn<void()> WindowHelper::Private::enforceStyleCallback() {
|
Fn<void()> WindowHelper::Private::enforceStyleCallback() {
|
||||||
return crl::guard(_owner->window(), [=] {
|
return crl::guard(_owner->window(), [=] { enforceStyle(); });
|
||||||
if (_nativeWindow && _customTitleHeight > 0) {
|
}
|
||||||
[_nativeWindow setStyleMask:[_nativeWindow styleMask] | NSFullSizeContentViewWindowMask];
|
|
||||||
}
|
void WindowHelper::Private::enforceStyle() {
|
||||||
});
|
if (_nativeWindow && _customTitleHeight > 0) {
|
||||||
|
[_nativeWindow setStyleMask:[_nativeWindow styleMask] | NSFullSizeContentViewWindowMask];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void WindowHelper::Private::initOpenGL() {
|
void WindowHelper::Private::initOpenGL() {
|
||||||
|
|
@ -246,6 +257,10 @@ void WindowHelper::Private::initCustomTitle() {
|
||||||
|
|
||||||
[_nativeWindow setTitlebarAppearsTransparent:YES];
|
[_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(windowWillEnterFullScreen:) name:NSWindowWillEnterFullScreenNotification object:_nativeWindow];
|
||||||
[[NSNotificationCenter defaultCenter] addObserver:_observer selector:@selector(windowWillExitFullScreen:) name:NSWindowWillExitFullScreenNotification object:_nativeWindow];
|
[[NSNotificationCenter defaultCenter] addObserver:_observer selector:@selector(windowWillExitFullScreen:) name:NSWindowWillExitFullScreenNotification object:_nativeWindow];
|
||||||
[[NSNotificationCenter defaultCenter] addObserver:_observer selector:@selector(windowDidExitFullScreen:) name:NSWindowDidExitFullScreenNotification 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());
|
(_title ? _title->height() : 0) + size.height());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WindowHelper::setStaysOnTop(bool enabled) {
|
||||||
|
_private->setStaysOnTop(enabled);
|
||||||
|
}
|
||||||
|
|
||||||
void WindowHelper::setGeometry(QRect rect) {
|
void WindowHelper::setGeometry(QRect rect) {
|
||||||
window()->setGeometry(
|
window()->setGeometry(
|
||||||
rect.marginsAdded({ 0, (_title ? _title->height() : 0), 0, 0 }));
|
rect.marginsAdded({ 0, (_title ? _title->height() : 0), 0, 0 }));
|
||||||
|
|
|
||||||
|
|
@ -52,6 +52,10 @@ void BasicWindowHelper::setFixedSize(QSize size) {
|
||||||
_window->setFixedSize(size);
|
_window->setFixedSize(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BasicWindowHelper::setStaysOnTop(bool enabled) {
|
||||||
|
_window->setWindowFlag(Qt::WindowStaysOnTopHint, enabled);
|
||||||
|
}
|
||||||
|
|
||||||
void BasicWindowHelper::setGeometry(QRect rect) {
|
void BasicWindowHelper::setGeometry(QRect rect) {
|
||||||
_window->setGeometry(rect);
|
_window->setGeometry(rect);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ public:
|
||||||
virtual void setTitleStyle(const style::WindowTitle &st);
|
virtual void setTitleStyle(const style::WindowTitle &st);
|
||||||
virtual void setMinimumSize(QSize size);
|
virtual void setMinimumSize(QSize size);
|
||||||
virtual void setFixedSize(QSize size);
|
virtual void setFixedSize(QSize size);
|
||||||
|
virtual void setStaysOnTop(bool enabled);
|
||||||
virtual void setGeometry(QRect rect);
|
virtual void setGeometry(QRect rect);
|
||||||
virtual void showFullScreen();
|
virtual void showFullScreen();
|
||||||
virtual void showNormal();
|
virtual void showNormal();
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,10 @@ void Window::setFixedSize(QSize size) {
|
||||||
_helper->setFixedSize(size);
|
_helper->setFixedSize(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Window::setStaysOnTop(bool enabled) {
|
||||||
|
_helper->setStaysOnTop(enabled);
|
||||||
|
}
|
||||||
|
|
||||||
void Window::setGeometry(QRect rect) {
|
void Window::setGeometry(QRect rect) {
|
||||||
_helper->setGeometry(rect);
|
_helper->setGeometry(rect);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,7 @@ public:
|
||||||
void setTitleStyle(const style::WindowTitle &st);
|
void setTitleStyle(const style::WindowTitle &st);
|
||||||
void setMinimumSize(QSize size);
|
void setMinimumSize(QSize size);
|
||||||
void setFixedSize(QSize size);
|
void setFixedSize(QSize size);
|
||||||
|
void setStaysOnTop(bool enabled);
|
||||||
void setGeometry(QRect rect);
|
void setGeometry(QRect rect);
|
||||||
void showFullScreen();
|
void showFullScreen();
|
||||||
void showNormal();
|
void showNormal();
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue