diff options
author | Tobias Markmann <tm@ayena.de> | 2017-05-15 09:19:12 (GMT) |
---|---|---|
committer | Kevin Smith <kevin.smith@isode.com> | 2017-05-15 10:09:59 (GMT) |
commit | d93be16eb1bb43ba602fcd7398fc0e46084dbd7f (patch) | |
tree | d179b69f67fcfbdebba202a96bab1f6ac08cd84f /Swift | |
parent | 24baaf8ad66354c17a6d6ba4438e95d6798564a8 (diff) | |
download | swift-d93be16eb1bb43ba602fcd7398fc0e46084dbd7f.zip swift-d93be16eb1bb43ba602fcd7398fc0e46084dbd7f.tar.bz2 |
Unregister as event filter in QtFilterWidget dtor
When QtFilterWidget is deleted, it is still registered as
event filter and events might be sent to an already deleted
QtFilterWidget, causing a crash.
SWIFT-247
Test-Information:
All unit tests pass, roster filtering still works, and Swift
does not crash on exit on macOS 10.12.4 with Qt 5.4.2.
Change-Id: I84a7e1af64d1376db3dfdd0fd7cf95b547cca9a1
Diffstat (limited to 'Swift')
-rw-r--r-- | Swift/QtUI/Roster/QtFilterWidget.cpp | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/Swift/QtUI/Roster/QtFilterWidget.cpp b/Swift/QtUI/Roster/QtFilterWidget.cpp index 2e1ead9..4df4a39 100644 --- a/Swift/QtUI/Roster/QtFilterWidget.cpp +++ b/Swift/QtUI/Roster/QtFilterWidget.cpp @@ -1,81 +1,82 @@ /* - * Copyright (c) 2014-2016 Isode Limited. + * Copyright (c) 2014-2017 Isode Limited. * All rights reserved. * See the COPYING file for more information. */ /* * Copyright (c) 2013 Tobias Markmann * Licensed under the simplified BSD license. * See Documentation/Licenses/BSD-simplified.txt for more information. */ #include <Swift/QtUI/Roster/QtFilterWidget.h> #include <QEvent> #include <QKeyEvent> #include <QLayout> #include <QString> #include <QVBoxLayout> #include <Swift/Controllers/UIEvents/RequestChatUIEvent.h> #include <Swift/Controllers/UIEvents/UIEventStream.h> #include <Swift/QtUI/QtClosableLineEdit.h> #include <Swift/QtUI/QtSwiftUtil.h> namespace Swift { QtFilterWidget::QtFilterWidget(QWidget* parent, QtTreeWidget* treeView, UIEventStream* eventStream, QBoxLayout* layout) : QWidget(parent), treeView_(treeView), eventStream_(eventStream), fuzzyRosterFilter_(nullptr), isModifierSinglePressed_(false) { int targetIndex = layout->indexOf(treeView); QVBoxLayout* vboxLayout = new QVBoxLayout(this); vboxLayout->setSpacing(0); vboxLayout->setContentsMargins(0,0,0,0); filterLineEdit_ = new QtClosableLineEdit(this); filterLineEdit_->hide(); vboxLayout->addWidget(filterLineEdit_); vboxLayout->addWidget(treeView); setLayout(vboxLayout); layout->insertWidget(targetIndex, this); filterLineEdit_->installEventFilter(this); - treeView->installEventFilter(this); + treeView_->installEventFilter(this); sourceModel_ = treeView_->model(); } QtFilterWidget::~QtFilterWidget() { - + filterLineEdit_->removeEventFilter(this); + treeView_->removeEventFilter(this); } bool QtFilterWidget::eventFilter(QObject*, QEvent* event) { if (event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease || // InputMethodQuery got introduced in Qt 5. #if QT_VERSION >= 0x050000 event->type() == QEvent::InputMethodQuery || #endif event->type() == QEvent::InputMethod) { event->ignore(); QKeyEvent* keyEvent = dynamic_cast<QKeyEvent*>(event); if (keyEvent) { if (keyEvent->key() == Qt::Key_Up || keyEvent->key() == Qt::Key_Down) { return false; } else if ((keyEvent->key() == Qt::Key_Left || keyEvent->key() == Qt::Key_Right) && filterLineEdit_->text().isEmpty()) { return false; } else if (keyEvent->key() == Qt::Key_Alt && event->type() == QEvent::KeyPress) { isModifierSinglePressed_ = true; } else if ((keyEvent->key() == Qt::Key_Alt && event->type() == QEvent::KeyRelease && isModifierSinglePressed_) || (keyEvent->key() == Qt::Key_Menu)) { QPoint itemOffset(2,2); QPoint contextMenuPosition = treeView_->visualRect(treeView_->currentIndex()).topLeft() + itemOffset;; QApplication::postEvent(treeView_, new QContextMenuEvent(QContextMenuEvent::Keyboard, contextMenuPosition, treeView_->mapToGlobal(contextMenuPosition))); return true; } else if (keyEvent->key() == Qt::Key_Return) { JID target = treeView_->selectedJID(); if (target.isValid()) { eventStream_->send(std::make_shared<RequestChatUIEvent>(target)); } |