summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Markmann <tm@ayena.de>2017-05-15 09:19:12 (GMT)
committerKevin Smith <kevin.smith@isode.com>2017-05-15 10:09:59 (GMT)
commitd93be16eb1bb43ba602fcd7398fc0e46084dbd7f (patch)
treed179b69f67fcfbdebba202a96bab1f6ac08cd84f
parent24baaf8ad66354c17a6d6ba4438e95d6798564a8 (diff)
downloadswift-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
-rw-r--r--Swift/QtUI/Roster/QtFilterWidget.cpp7
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));
}