This is the 1.5 port of the patch discussed with Juergen. Unfortunately, shift-pagedown does not begin a selection, and I do not see why. Juergen?
JMarc
Index: src/text3.C =================================================================== --- src/text3.C (revision 14419) +++ src/text3.C (working copy) @@ -399,65 +399,21 @@ finishChange(cur, false); break; - case LFUN_WORD_FORWARD: - if (!cur.mark()) - cur.clearSelection(); - if (isRTL(cur.paragraph())) - needsUpdate = cursorLeftOneWord(cur); - else - needsUpdate = cursorRightOneWord(cur); - finishChange(cur, false); - break; - - case LFUN_WORD_BACKWARD: - if (!cur.mark()) - cur.clearSelection(); - if (isRTL(cur.paragraph())) - needsUpdate = cursorRightOneWord(cur); - else - needsUpdate = cursorLeftOneWord(cur); - finishChange(cur, false); - break; - case LFUN_BUFFER_BEGIN: - if (cur.depth() == 1) { - if (!cur.mark()) - cur.clearSelection(); - needsUpdate = cursorTop(cur); - finishChange(cur, false); - } else { - cur.undispatched(); - } - break; - case LFUN_BUFFER_BEGIN_SELECT: + cur.selHandle(cmd.action == LFUN_BUFFER_BEGIN_SELECT); if (cur.depth() == 1) { - if (!cur.selection()) - cur.resetAnchor(); needsUpdate = cursorTop(cur); - finishChange(cur, true); } else { cur.undispatched(); } break; case LFUN_BUFFER_END: - if (cur.depth() == 1) { - if (!cur.mark()) - cur.clearSelection(); - needsUpdate = cursorBottom(cur); - finishChange(cur, false); - } else { - cur.undispatched(); - } - break; - case LFUN_BUFFER_END_SELECT: + cur.selHandle(cmd.action == LFUN_BUFFER_END_SELECT); if (cur.depth() == 1) { - if (!cur.selection()) - cur.resetAnchor(); needsUpdate = cursorBottom(cur); - finishChange(cur, true); } else { cur.undispatched(); } @@ -525,83 +481,72 @@ break; case LFUN_PARAGRAPH_UP: - if (!cur.mark()) - cur.clearSelection(); + case LFUN_PARAGRAPH_UP_SELECT: + cur.selHandle(cmd.action == LFUN_PARAGRAPH_UP_SELECT); needsUpdate = cursorUpParagraph(cur); - finishChange(cur, false); break; - case LFUN_PARAGRAPH_UP_SELECT: - if (!cur.selection()) - cur.resetAnchor(); - cursorUpParagraph(cur); - finishChange(cur, true); - break; - case LFUN_PARAGRAPH_DOWN: - if (!cur.mark()) - cur.clearSelection(); + case LFUN_PARAGRAPH_DOWN_SELECT: + cur.selHandle(cmd.action == LFUN_PARAGRAPH_DOWN_SELECT); needsUpdate = cursorDownParagraph(cur); - finishChange(cur, false); break; - case LFUN_PARAGRAPH_DOWN_SELECT: - if (!cur.selection()) - cur.resetAnchor(); - cursorDownParagraph(cur); - finishChange(cur, true); - break; - + case LFUN_SCREEN_UP: case LFUN_SCREEN_UP_SELECT: update(cur); - if (!cur.selection()) - cur.resetAnchor(); - needsUpdate = cursorPrevious(cur); - finishChange(cur, true); + cur.selHandle(cmd.action == LFUN_SCREEN_UP_SELECT); + if (cur.pit() == 0 && cur.textRow().pos() == 0) { + cur.undispatched(); + cmd = FuncRequest(LFUN_FINISHED_UP); + } else { + needsUpdate = cursorPrevious(cur); + } break; + case LFUN_SCREEN_DOWN: case LFUN_SCREEN_DOWN_SELECT: update(cur); - if (!cur.selection()) - cur.resetAnchor(); - needsUpdate = cursorNext(cur); - finishChange(cur, true); + cur.selHandle(cmd.action == LFUN_SCREEN_DOWN_SELECT); + if (cur.pit() == cur.lastpit() + && cur.textRow().endpos() == cur.lastpos()) { + cur.undispatched(); + cmd = FuncRequest(LFUN_FINISHED_DOWN); + } else { + needsUpdate = cursorNext(cur); + } break; + case LFUN_LINE_BEGIN: case LFUN_LINE_BEGIN_SELECT: update(cur); - if (!cur.selection()) - cur.resetAnchor(); + cur.selHandle(cmd.action == LFUN_LINE_BEGIN_SELECT); needsUpdate = cursorHome(cur); - finishChange(cur, true); break; + case LFUN_LINE_END: case LFUN_LINE_END_SELECT: update(cur); - if (!cur.selection()) - cur.resetAnchor(); + cur.selHandle(cmd.action == LFUN_LINE_END_SELECT); needsUpdate = cursorEnd(cur); - finishChange(cur, true); break; + case LFUN_WORD_FORWARD: case LFUN_WORD_FORWARD_SELECT: - if (!cur.selection()) - cur.resetAnchor(); + cur.selHandle(cmd.action == LFUN_WORD_FORWARD_SELECT); if (isRTL(cur.paragraph())) - cursorLeftOneWord(cur); + needsUpdate = cursorLeftOneWord(cur); else - cursorRightOneWord(cur); - finishChange(cur, true); + needsUpdate = cursorRightOneWord(cur); break; + case LFUN_WORD_BACKWARD: case LFUN_WORD_BACKWARD_SELECT: - if (!cur.selection()) - cur.resetAnchor(); + cur.selHandle(cmd.action == LFUN_WORD_BACKWARD_SELECT); if (isRTL(cur.paragraph())) - cursorRightOneWord(cur); + needsUpdate = cursorRightOneWord(cur); else - cursorLeftOneWord(cur); - finishChange(cur, true); + needsUpdate = cursorLeftOneWord(cur); break; case LFUN_WORD_SELECT: { @@ -610,47 +555,6 @@ break; } - case LFUN_SCREEN_UP: - update(cur); - if (!cur.mark()) - cur.clearSelection(); - finishChange(cur, false); - if (cur.pit() == 0 && cur.textRow().pos() == 0) { - cur.undispatched(); - cmd = FuncRequest(LFUN_FINISHED_UP); - } else { - needsUpdate = cursorPrevious(cur); - } - break; - - case LFUN_SCREEN_DOWN: - update(cur); - if (!cur.mark()) - cur.clearSelection(); - finishChange(cur, false); - if (cur.pit() == cur.lastpit() - && cur.textRow().endpos() == cur.lastpos()) { - cur.undispatched(); - cmd = FuncRequest(LFUN_FINISHED_DOWN); - } else { - needsUpdate = cursorNext(cur); - } - break; - - case LFUN_LINE_BEGIN: - if (!cur.mark()) - cur.clearSelection(); - needsUpdate = cursorHome(cur); - finishChange(cur, false); - break; - - case LFUN_LINE_END: - if (!cur.mark()) - cur.clearSelection(); - needsUpdate = cursorEnd(cur); - finishChange(cur, false); - break; - case LFUN_BREAK_LINE: { // Not allowed by LaTeX (labels or empty par) if (cur.pos() > cur.paragraph().beginOfBody()) {