Minor fix for KDE 4.2.2 Konsole text selection regression

Lawrence Stewart lstewart at freebsd.org
Mon Apr 27 09:49:58 UTC 2009


Hi All,

The upgrade from KDE 4.2.1 to 4.2.2 introduced a small but annoying 
regression into the Konsole app. Double click text selection no longer 
works correctly.

The bug is documented here:

https://bugs.kde.org/show_bug.cgi?id=189651

The attached patch can be stuck in the files directory of the 
x11/kdebase4 port to fix the issue until KDE ships an update.

Cheers,
Lawrence
-------------- next part --------------
Index: TerminalDisplay.cpp
===================================================================
--- ../apps/konsole/src/TerminalDisplay.cpp	(.../4.2.2/kdebase/apps/konsole/src/TerminalDisplay.cpp)	(revision 959808)
+++ ../apps/konsole/src/TerminalDisplay.cpp	(.../4.2.1/kdebase/apps/konsole/src/TerminalDisplay.cpp)	(revision 959808)
@@ -2172,12 +2155,11 @@
   _wordSelectionMode = true;
 
   // find word boundaries...
-  QChar selClass = charClass(_image[i].character);
   {
      // find the start of the word
      int x = bgnSel.x();
      while ( ((x>0) || (bgnSel.y()>0 && (_lineProperties[bgnSel.y()-1] & LINE_WRAPPED) )) 
-                     && charClass(_image[i-1].character) == selClass )
+                     && !isCharBoundary(_image[i-1].character) )
      {  
        i--; 
        if (x>0) 
@@ -2196,7 +2178,7 @@
      i = loc( endSel.x(), endSel.y() );
      x = endSel.x();
      while( ((x<_usedColumns-1) || (endSel.y()<_usedLines-1 && (_lineProperties[endSel.y()] & LINE_WRAPPED) )) 
-                     && charClass(_image[i+1].character) == selClass )
+                     && !isCharBoundary(_image[i+1].character) )
      { 
          i++; 
          if (x<_usedColumns-1) 
@@ -2350,7 +2332,16 @@
   return QWidget::focusNextPrevChild( next );
 }
 
+// Returns true upon a word boundary
+// TODO determine if the below charClass() is actually required
+bool TerminalDisplay::isCharBoundary(QChar qch) const
+{
+    if ( _wordCharacters.contains(qch, Qt::CaseInsensitive) ) return true;
+    if ( qch.isSpace() ) return true;
 
+    return false;
+}
+
 QChar TerminalDisplay::charClass(QChar qch) const
 {
     if ( qch.isSpace() ) return ' ';
Index: TerminalDisplay.h
===================================================================
--- ../apps/konsole/src/TerminalDisplay.h	(.../4.2.2/kdebase/apps/konsole/src/TerminalDisplay.h)	(revision 959808)
+++ ../apps/konsole/src/TerminalDisplay.h	(.../4.2.1/kdebase/apps/konsole/src/TerminalDisplay.h)	(revision 959808)
@@ -566,6 +563,9 @@
     //     - Other characters (returns the input character)
     QChar charClass(QChar ch) const;
 
+    // Returns true upon a word boundary
+    bool isCharBoundary(QChar ch) const;
+
     void clearImage();
 
     void mouseTripleClickEvent(QMouseEvent* ev);


More information about the freebsd-ports mailing list