diff --git a/ui/platform/linux/ui_utility_linux.h b/ui/platform/linux/ui_utility_linux.h index d03c657..ce28a8e 100644 --- a/ui/platform/linux/ui_utility_linux.h +++ b/ui/platform/linux/ui_utility_linux.h @@ -29,9 +29,6 @@ inline void UpdateOverlayed(not_null widget) { inline void ShowOverAll(not_null widget, bool canFocus) { } -inline void BringToBack(not_null widget) { -} - inline void DisableSystemWindowResize(not_null widget, QSize ratio) { } diff --git a/ui/platform/mac/ui_utility_mac.mm b/ui/platform/mac/ui_utility_mac.mm index 2b188d4..8ada998 100644 --- a/ui/platform/mac/ui_utility_mac.mm +++ b/ui/platform/mac/ui_utility_mac.mm @@ -77,11 +77,6 @@ void ShowOverAll(not_null widget, bool canFocus) { } } -void BringToBack(not_null widget) { - NSWindow *wnd = [reinterpret_cast(widget->winId()) window]; - [wnd setLevel:NSModalPanelWindowLevel]; -} - void DrainMainQueue() { #ifndef OS_MAC_STORE _dispatch_main_queue_callback_4CF(nullptr); diff --git a/ui/platform/mac/ui_window_mac.mm b/ui/platform/mac/ui_window_mac.mm index a436206..557d623 100644 --- a/ui/platform/mac/ui_window_mac.mm +++ b/ui/platform/mac/ui_window_mac.mm @@ -137,6 +137,7 @@ private: void init(); void initOpenGL(); void resolveWeakPointers(); + void revalidateWeakPointers() const; void initCustomTitle(); [[nodiscard]] Fn toggleCustomTitleCallback(); @@ -148,6 +149,7 @@ private: NSWindow * __weak _nativeWindow = nil; NSView * __weak _nativeView = nil; + bool _hadNativeValues = false; std::unique_ptr _layerCreationChecker; @@ -171,6 +173,7 @@ int WindowHelper::Private::customTitleHeight() const { } QRect WindowHelper::Private::controlsRect() const { + revalidateWeakPointers(); const auto button = [&](NSWindowButton type) { auto view = [_nativeWindow standardWindowButton:type]; if (!view) { @@ -201,6 +204,7 @@ QRect WindowHelper::Private::controlsRect() const { } bool WindowHelper::Private::checkNativeMove(void *nswindow) const { + revalidateWeakPointers(); if (_nativeWindow != nswindow || ([_nativeWindow styleMask] & NSWindowStyleMaskFullScreen) == NSWindowStyleMaskFullScreen) { return false; @@ -214,6 +218,7 @@ bool WindowHelper::Private::checkNativeMove(void *nswindow) const { } void WindowHelper::Private::activateBeforeNativeMove() { + revalidateWeakPointers(); [_nativeWindow makeKeyAndOrderFront:_nativeWindow]; } @@ -225,6 +230,7 @@ void WindowHelper::Private::setStaysOnTop(bool enabled) { } void WindowHelper::Private::setNativeTitleVisibility(bool visible) { + revalidateWeakPointers(); if (!_nativeWindow) { return; } @@ -236,7 +242,11 @@ void WindowHelper::Private::close() { const auto weak = Ui::MakeWeak(_owner->window()); QCloseEvent e; qApp->sendEvent(_owner->window(), &e); - if (e.isAccepted() && weak && _nativeWindow) { + if (!e.isAccepted() || !weak) { + return; + } + revalidateWeakPointers(); + if (_nativeWindow) { [_nativeWindow close]; } } @@ -253,6 +263,7 @@ Fn WindowHelper::Private::enforceStyleCallback() { } void WindowHelper::Private::enforceStyle() { + revalidateWeakPointers(); if (_nativeWindow && _customTitleHeight > 0) { [_nativeWindow setStyleMask:[_nativeWindow styleMask] | NSWindowStyleMaskFullSizeContentView]; } @@ -263,14 +274,24 @@ void WindowHelper::Private::initOpenGL() { } void WindowHelper::Private::resolveWeakPointers() { - _owner->window()->createWinId(); + if (!_owner->window()->winId()) { + _owner->window()->createWinId(); + } _nativeView = reinterpret_cast(_owner->window()->winId()); _nativeWindow = _nativeView ? [_nativeView window] : nullptr; + _hadNativeValues = true; Ensures(_nativeWindow != nullptr); } +void WindowHelper::Private::revalidateWeakPointers() const { + if (_nativeWindow || !_hadNativeValues) { + return; + } + const_cast(this)->resolveWeakPointers(); +} + void WindowHelper::Private::initCustomTitle() { if (![_nativeWindow respondsToSelector:@selector(contentLayoutRect)] || ![_nativeWindow respondsToSelector:@selector(setTitlebarAppearsTransparent:)]) { diff --git a/ui/platform/ui_platform_utility.h b/ui/platform/ui_platform_utility.h index 0bc0fd4..2d10077 100644 --- a/ui/platform/ui_platform_utility.h +++ b/ui/platform/ui_platform_utility.h @@ -25,7 +25,6 @@ void ReInitOnTopPanel(not_null panel); void UpdateOverlayed(not_null widget); void ShowOverAll(not_null widget, bool canFocus = true); -void BringToBack(not_null widget); void IgnoreAllActivation(not_null widget); void ClearTransientParent(not_null widget); diff --git a/ui/platform/win/ui_utility_win.h b/ui/platform/win/ui_utility_win.h index 391acf2..b03df5c 100644 --- a/ui/platform/win/ui_utility_win.h +++ b/ui/platform/win/ui_utility_win.h @@ -32,9 +32,6 @@ inline void ReInitOnTopPanel(not_null panel) { inline void ShowOverAll(not_null widget, bool canFocus) { } -inline void BringToBack(not_null widget) { -} - inline void ClearTransientParent(not_null widget) { }