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

Reply via email to