From 3a3bf84cfc75a63f7a819acbd64c3a40a24476d6 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 9 Sep 2019 10:51:59 +0300 Subject: [PATCH] Fix crash in SeparatePanel destruction. We should destroy layers before panel widget destructor started. We do it already for MainWindow in clearWidgetsHook. --- .../view/export_view_panel_controller.cpp | 13 +++++++------ .../export/view/export_view_panel_controller.h | 3 +-- .../SourceFiles/ui/widgets/separate_panel.cpp | 18 ++++++++++++++---- .../SourceFiles/ui/widgets/separate_panel.h | 1 + 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/Telegram/SourceFiles/export/view/export_view_panel_controller.cpp b/Telegram/SourceFiles/export/view/export_view_panel_controller.cpp index dcf3e27fc6..64552d2d6a 100644 --- a/Telegram/SourceFiles/export/view/export_view_panel_controller.cpp +++ b/Telegram/SourceFiles/export/view/export_view_panel_controller.cpp @@ -133,6 +133,13 @@ PanelController::PanelController(not_null process) }, _lifetime); } +PanelController::~PanelController() { + if (_saveSettingsTimer.isActive()) { + saveSettings(); + } + _panel->destroyLayer(); +} + void PanelController::activatePanel() { _panel->showAndActivate(); } @@ -386,11 +393,5 @@ void PanelController::saveSettings() const { Local::WriteExportSettings(settings); } -PanelController::~PanelController() { - if (_saveSettingsTimer.isActive()) { - saveSettings(); - } -} - } // namespace View } // namespace Export diff --git a/Telegram/SourceFiles/export/view/export_view_panel_controller.h b/Telegram/SourceFiles/export/view/export_view_panel_controller.h index 59ea153e9e..106fb13484 100644 --- a/Telegram/SourceFiles/export/view/export_view_panel_controller.h +++ b/Telegram/SourceFiles/export/view/export_view_panel_controller.h @@ -35,6 +35,7 @@ class Panel; class PanelController { public: PanelController(not_null process); + ~PanelController(); void activatePanel(); void stopWithConfirmation(FnMut callback = nullptr); @@ -49,8 +50,6 @@ public: return ContentFromState(_process->state()); } - ~PanelController(); - private: void fillParams(const PasswordCheckState &state); void stopExport(); diff --git a/Telegram/SourceFiles/ui/widgets/separate_panel.cpp b/Telegram/SourceFiles/ui/widgets/separate_panel.cpp index e784285646..a87ae04db5 100644 --- a/Telegram/SourceFiles/ui/widgets/separate_panel.cpp +++ b/Telegram/SourceFiles/ui/widgets/separate_panel.cpp @@ -291,13 +291,23 @@ void SeparatePanel::ensureLayerCreated() { ) | rpl::filter([=] { return _layer != nullptr; // Last hide finish is sent from destructor. }) | rpl::start_with_next([=] { - if (Ui::InFocusChain(_layer)) { - setFocus(); - } - _layer = nullptr; + destroyLayer(); }, _layer->lifetime()); } +void SeparatePanel::destroyLayer() { + if (!_layer) { + return; + } + + auto layer = base::take(_layer); + const auto resetFocus = Ui::InFocusChain(layer); + if (resetFocus) { + setFocus(); + } + layer = nullptr; +} + void SeparatePanel::showInner(base::unique_qptr inner) { Expects(!size().isEmpty()); diff --git a/Telegram/SourceFiles/ui/widgets/separate_panel.h b/Telegram/SourceFiles/ui/widgets/separate_panel.h index bb286c7596..cdf439ae5f 100644 --- a/Telegram/SourceFiles/ui/widgets/separate_panel.h +++ b/Telegram/SourceFiles/ui/widgets/separate_panel.h @@ -41,6 +41,7 @@ public: LayerOptions options, anim::type animated); void showToast(const QString &text); + void destroyLayer(); rpl::producer<> backRequests() const; rpl::producer<> closeRequests() const;