From c8a379e85e365416ed0bae7aa1d0da0619ba45e8 Mon Sep 17 00:00:00 2001 From: John Preston Date: Mon, 24 Oct 2016 18:35:26 +0300 Subject: [PATCH] Fix crash: transfer QMenu ownership to PopupMenu. Not tested. --- Telegram/SourceFiles/ui/flatinput.cpp | 8 ++++---- Telegram/SourceFiles/ui/flattextarea.cpp | 2 +- Telegram/SourceFiles/ui/popupmenu.cpp | 13 ++++++++----- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Telegram/SourceFiles/ui/flatinput.cpp b/Telegram/SourceFiles/ui/flatinput.cpp index 5f835f9a87..d950fc5fda 100644 --- a/Telegram/SourceFiles/ui/flatinput.cpp +++ b/Telegram/SourceFiles/ui/flatinput.cpp @@ -243,7 +243,7 @@ void FlatInput::updatePlaceholderText() { } void FlatInput::contextMenuEvent(QContextMenuEvent *e) { - if (QMenu *menu = createStandardContextMenu()) { + if (auto menu = createStandardContextMenu()) { (new PopupMenu(menu))->popup(e->globalPos()); } } @@ -1281,7 +1281,7 @@ void InputArea::Inner::paintEvent(QPaintEvent *e) { } void InputArea::Inner::contextMenuEvent(QContextMenuEvent *e) { - if (QMenu *menu = createStandardContextMenu()) { + if (auto menu = createStandardContextMenu()) { (new PopupMenu(menu))->popup(e->globalPos()); } } @@ -2028,7 +2028,7 @@ void InputField::Inner::paintEvent(QPaintEvent *e) { } void InputField::Inner::contextMenuEvent(QContextMenuEvent *e) { - if (QMenu *menu = createStandardContextMenu()) { + if (auto menu = createStandardContextMenu()) { (new PopupMenu(menu))->popup(e->globalPos()); } } @@ -2236,7 +2236,7 @@ void MaskedInputField::updatePlaceholderText() { } void MaskedInputField::contextMenuEvent(QContextMenuEvent *e) { - if (QMenu *menu = createStandardContextMenu()) { + if (auto menu = createStandardContextMenu()) { (new PopupMenu(menu))->popup(e->globalPos()); } } diff --git a/Telegram/SourceFiles/ui/flattextarea.cpp b/Telegram/SourceFiles/ui/flattextarea.cpp index c6230c438a..e1445775ec 100644 --- a/Telegram/SourceFiles/ui/flattextarea.cpp +++ b/Telegram/SourceFiles/ui/flattextarea.cpp @@ -1420,7 +1420,7 @@ void FlatTextarea::dropEvent(QDropEvent *e) { } void FlatTextarea::contextMenuEvent(QContextMenuEvent *e) { - if (QMenu *menu = createStandardContextMenu()) { + if (auto menu = createStandardContextMenu()) { (new PopupMenu(menu))->popup(e->globalPos()); } } diff --git a/Telegram/SourceFiles/ui/popupmenu.cpp b/Telegram/SourceFiles/ui/popupmenu.cpp index e6649b6293..3bb06e31ff 100644 --- a/Telegram/SourceFiles/ui/popupmenu.cpp +++ b/Telegram/SourceFiles/ui/popupmenu.cpp @@ -35,7 +35,7 @@ PopupMenu::PopupMenu(const style::PopupMenu &st) : TWidget(nullptr) init(); } -PopupMenu::PopupMenu(QMenu *menu, const style::PopupMenu &st) : TWidget(0) +PopupMenu::PopupMenu(QMenu *menu, const style::PopupMenu &st) : TWidget(nullptr) , _st(st) , _menu(menu) , _itemHeight(_st.itemPadding.top() + _st.itemFont->height + _st.itemPadding.bottom()) @@ -43,6 +43,9 @@ PopupMenu::PopupMenu(QMenu *menu, const style::PopupMenu &st) : TWidget(0) , _shadow(_st.shadow) , a_opacity(1) , _a_hide(animation(this, &PopupMenu::step_hide)) { + _menu->setParent(this); + _menu->hide(); + init(); for (auto action : menu->actions()) { addAction(action); @@ -72,11 +75,11 @@ QAction *PopupMenu::addAction(const QString &text, const QObject *receiver, cons QAction *PopupMenu::addAction(QAction *a) { connect(a, SIGNAL(changed()), this, SLOT(actionChanged())); _actions.push_back(a); - if (a->menu()) { - _menus.push_back(new PopupMenu(a->menu())); + if (auto submenu = a->menu()) { + _menus.push_back(new PopupMenu(submenu)); _menus.back()->deleteOnHide(false); } else { - _menus.push_back(0); + _menus.push_back(nullptr); } _texts.push_back(QString()); _shortcutTexts.push_back(QString()); @@ -503,7 +506,7 @@ void PopupMenu::showMenu(const QPoint &p, PopupMenu *parent, PressSource source) PopupMenu::~PopupMenu() { clearActions(true); - delete _menu; + #if defined Q_OS_LINUX32 || defined Q_OS_LINUX64 if (auto w = App::wnd()) { w->onReActivate();