From e3ed29ad5b799fa1425c137d2296f48ce5995a5b Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Tue, 22 Jun 2010 19:34:58 +0200 Subject: [PATCH] Fix wordwrap when using Qt > 4.6.3 Qt changed the behavior of QTextBoundaryFinder in commit e6ac173, to make it more consistent and to fix a bug in QtWebkit (cf. https://bugs.webkit.org/show_bug.cgi?id=31076). Unfortunately this means we have to remove our wordwrap workaround for newer versions of Qt, so we're adding a runtime version check for that. Please note that if you're using a 4.7 snapshot that's too old, you'll have broken wordwrap now. Upgrade Qt. --- src/qtui/chatlinemodelitem.cpp | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/qtui/chatlinemodelitem.cpp b/src/qtui/chatlinemodelitem.cpp index 824e9dab..29efa754 100644 --- a/src/qtui/chatlinemodelitem.cpp +++ b/src/qtui/chatlinemodelitem.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-09 by the Quassel Project * + * Copyright (C) 2005-2010 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -183,8 +183,26 @@ void ChatLineModelItem::computeWrapList() const { layout.endLayout(); while((idx = finder.toNextBoundary()) >= 0 && idx <= length) { - if(idx < length) - idx++; // the boundary is *before* the actual character + + // QTextBoundaryFinder has inconsistent behavior in Qt version up to and including 4.6.3 (at least). + // It doesn't point to the position we should break, but to the character before that. + // Unfortunately Qt decided to fix this by changing the behavior of QTBF, so now we have to add a version + // check. At the time of this writing, I'm still trying to get this reverted upstream... + // + // cf. https://bugs.webkit.org/show_bug.cgi?id=31076 and Qt commit e6ac173 + static int needWorkaround = -1; + if(needWorkaround < 0) { + needWorkaround = 0; + QStringList versions = QString(qVersion()).split('.'); + if(versions.count() == 3 && versions.at(0).toInt() == 4) { + if(versions.at(1).toInt() <= 6 && versions.at(2).toInt() <= 3) + needWorkaround = 1; + } + } + if(needWorkaround == 1) { + if(idx < length) + idx++; + } if(idx == oldidx) continue; -- 2.20.1