X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fqtui%2Fchatviewsearchcontroller.cpp;h=930aea52759cb4183602b26aebb7a88c17cc06ef;hp=e21dc8a484c1108791034a5e6e3ed50821ffb70d;hb=158443f71d48215eea8b47b836b61afd77654b78;hpb=695758015a80eb8c158a9ac4c0f1c0b547e70df3 diff --git a/src/qtui/chatviewsearchcontroller.cpp b/src/qtui/chatviewsearchcontroller.cpp index e21dc8a4..930aea52 100644 --- a/src/qtui/chatviewsearchcontroller.cpp +++ b/src/qtui/chatviewsearchcontroller.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2015 by the Quassel Project * + * Copyright (C) 2005-2018 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -30,13 +30,7 @@ #include "messagemodel.h" ChatViewSearchController::ChatViewSearchController(QObject *parent) - : QObject(parent), - _scene(0), - _currentHighlight(0), - _caseSensitive(false), - _searchSenders(false), - _searchMsgs(true), - _searchOnlyRegularMsgs(true) + : QObject(parent) { } @@ -65,8 +59,8 @@ void ChatViewSearchController::setScene(ChatScene *scene) return; if (_scene) { - disconnect(_scene, 0, this, 0); - disconnect(Client::messageModel(), 0, this, 0); + disconnect(_scene, nullptr, this, nullptr); + disconnect(Client::messageModel(), nullptr, this, nullptr); qDeleteAll(_highlightItems); _highlightItems.clear(); } @@ -166,6 +160,30 @@ void ChatViewSearchController::updateHighlights(bool reuse) _currentHighlight = start; break; } + if (end == 0 && start == 0) { + // Sometimes we can run into an issue where the start and end are both set + // to zero. Rather than endlessly spin this loop, bail out. Search seems + // to work fine. + // [Test case] + // Unfortunately, this seems specific to the contents of a buffer. First, + // find a buffer that you've encountered freezing, and keep track of what + // was loaded, where it was, and the two most recent search terms. + // For example... + // 1. Load some backlog to a buffer + // 2. Search for term with any number of matches + // 3. Making sure to -type over existing words without first backspacing-, + // search for another term with only one match + // Expected: Search results found, no freezing + // Actual: Quassel hangs. startPos and endPos = same place, start = 0, + // end = 0, _currentHighlight appears to retain values from the + // previous search. + + // Reset _currentHighlight to start, otherwise it'll retain the value from + // previous search, resulting in an index-out-of-bounds error. + _currentHighlight = start; + // Escape from the loop! + break; + } int pivot = (end + start) / 2; QPointF pivotPos = _highlightItems[pivot]->scenePos(); if (startPos.y() == endPos.y()) { @@ -333,7 +351,7 @@ void ChatViewSearchController::repositionHighlights(ChatLine *line) void ChatViewSearchController::sceneDestroyed() { // WARNING: don't call any methods on scene! - _scene = 0; + _scene = nullptr; // the items will be automatically deleted when the scene is destroyed // so we just have to clear the list; _highlightItems.clear();