Fix wordwrap when using Qt > 4.6.3
authorManuel Nickschas <sputnick@quassel-irc.org>
Tue, 22 Jun 2010 17:34:58 +0000 (19:34 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Sun, 5 Sep 2010 09:10:34 +0000 (11:10 +0200)
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

index 824e9da..29efa75 100644 (file)
@@ -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;