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()) {