diff --git a/autotests/src/kateview_test.cpp b/autotests/src/kateview_test.cpp --- a/autotests/src/kateview_test.cpp +++ b/autotests/src/kateview_test.cpp @@ -62,6 +62,23 @@ KTextEditor::Cursor::invalid()); QCOMPARE(view1->cursorToCoordinate(KTextEditor::Cursor(3, 1)), QPoint(-1, -1)); + // check consistency between cursorToCoordinate(view->cursorPosition() and cursorPositionCoordinates() + // random position + view1->setCursorPosition(KTextEditor::Cursor(0, 3)); + QCOMPARE(view1->coordinatesToCursor(view1->cursorToCoordinate(view1->cursorPosition())), + KTextEditor::Cursor(0, 3)); + QCOMPARE(view1->coordinatesToCursor(view1->cursorPositionCoordinates()), KTextEditor::Cursor(0, 3)); + // end of line + view1->setCursorPosition(KTextEditor::Cursor(0, 9)); + QCOMPARE(view1->coordinatesToCursor(view1->cursorToCoordinate(KTextEditor::Cursor(0, 9))), + KTextEditor::Cursor(0, 9)); + QCOMPARE(view1->coordinatesToCursor(view1->cursorPositionCoordinates()), KTextEditor::Cursor(0, 9)); + // empty line + view1->setCursorPosition(KTextEditor::Cursor(2, 0)); + QCOMPARE(view1->coordinatesToCursor(view1->cursorToCoordinate(KTextEditor::Cursor(2, 0))), + KTextEditor::Cursor(2, 0)); + QCOMPARE(view1->coordinatesToCursor(view1->cursorPositionCoordinates()), KTextEditor::Cursor(2, 0)); + // same test again, but with message widget on top visible KTextEditor::Message *message = new KTextEditor::Message("Jo World!", KTextEditor::Message::Information); doc.postMessage(message); diff --git a/src/view/kateview.cpp b/src/view/kateview.cpp --- a/src/view/kateview.cpp +++ b/src/view/kateview.cpp @@ -2545,7 +2545,7 @@ QPoint KTextEditor::ViewPrivate::cursorPositionCoordinates() const { // map from ViewInternal to View coordinates - const QPoint pt = m_viewInternal->cursorCoordinates(); + const QPoint pt = m_viewInternal->cursorCoordinates(false); return pt == QPoint(-1, -1) ? pt : m_viewInternal->mapToParent(pt); } diff --git a/src/view/kateviewinternal.cpp b/src/view/kateviewinternal.cpp --- a/src/view/kateviewinternal.cpp +++ b/src/view/kateviewinternal.cpp @@ -765,6 +765,11 @@ const int y = (int)viewLine * renderer()->lineHeight(); KateTextLayout layout = cache()->viewLine(viewLine); + + if (cursor.column() > layout.lineLayout().textLength()) { + return QPoint(-1, -1); + } + int x = 0; // only set x value if we have a valid layout (bug #171027) @@ -2789,7 +2794,7 @@ ret = renderer()->xToCursor(thisLine, coord.x(), !m_view->wrapCursor()); } - if (ret.column() == view()->document()->lineLength(ret.line())) { + if (ret.column() > view()->document()->lineLength(ret.line())) { // The cursor is beyond the end of the line; in that case the renderer // gives the index of the character behind the last one. return KTextEditor::Cursor::invalid();