On Thu, 2005-09-29 at 14:09 +0200, Jean-Marc Lasgouttes wrote:
> >>>>> "Martin" == Martin Vermeer <[EMAIL PROTECTED]> writes:
> 
> Martin> Here's a better one even. Now also delete and backspace are
> Martin> treated in the same way as selfinsert.
> 
> A question: could it be possible to change needsUpdate (and thus
> cur.result()) to be of type Update::flag and pass all the information
> back to LyXFunc::dispatch by this channel only?

I looked at that, and gave up: it requires intrusive changes in cursor
and dispatchresult. As to changing needsUpdate, there are lots of
methods returning a boolean. They would all have to change. The idea is
good though.

> I guess what I'd like to know is whether we could avoid most explicit
> calls to bv().update() from LyXText::dispatch, and also the special
> casing on LFUNs names, since the LFUNs would be able to tell by
> themselves what they expect.

I did try something along those lines: it requires adding
SingleParUpdate to LyXAction. See attached (only the relevant files
included).

> For example, when a LFUN requires SinglePar, the code would test
> whether the metrics have changed to decide what to do.

Yes, I see what you want to do... I just don't see how to do so without
touching a lot of code.

> It is not that I am unhappy with the patch... 

I propose to leave it at this, and commit it in the current state.
Anything else has 'can of worms' written all over it ;-)

- Martin

Index: text3.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text3.C,v
retrieving revision 1.308
diff -u -p -r1.308 text3.C
--- text3.C	27 Sep 2005 08:42:28 -0000	1.308
+++ text3.C	29 Sep 2005 16:57:19 -0000
@@ -294,7 +294,15 @@ void LyXText::dispatch(LCursor & cur, Fu
 	CursorSlice oldTopSlice = cur.top();
 	bool oldBoundary = cur.boundary();
 	bool sel = cur.selection();
-	bool needsUpdate = !lyxaction.funcHasFlag(cmd.action, LyXAction::NoUpdate);
+	// Signals that, even if needsUpdate == false, an update of the
+	// cursor paragraph is required
+	bool singleParUpdate = lyxaction.funcHasFlag(cmd.action,
+		LyXAction::SingleParUpdate);
+	// Signals that a full-screen update is required
+	bool needsUpdate = !(lyxaction.funcHasFlag(cmd.action, 
+		LyXAction::NoUpdate) || singleParUpdate);
+	// Remember the old paragraph metric
+	Dimension olddim = cur.paragraph().dim();
 
 	switch (cmd.action) {
 
@@ -1125,13 +1133,6 @@ void LyXText::dispatch(LCursor & cur, Fu
 
 		cur.resetAnchor();
 		moveCursor(cur, false);
-
-		needsUpdate = redoParagraph(cur.pit());
-		if (!needsUpdate) {
-			// update only this paragraph
-			cur.bv().update(Update::SinglePar | Update::Force);
-		}
-
 		bv->updateScrollbar();
 		break;
 	}
@@ -1528,6 +1529,14 @@ void LyXText::dispatch(LCursor & cur, Fu
 		break;
 	}
 
+	if (singleParUpdate)
+		// Inserting characters does not change par height
+	   	if (cur.paragraph().dim().asc == olddim.asc
+		 && cur.paragraph().dim().des == olddim.des) {
+			// if so, update _only_ this paragraph
+			cur.bv().update(Update::SinglePar | Update::Force);
+		} else
+			needsUpdate = true;
 	if (!needsUpdate
 	    && &oldTopSlice.inset() == &cur.inset()
 	    && oldTopSlice.idx() == cur.idx()
Index: LyXAction.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/LyXAction.C,v
retrieving revision 1.207
diff -u -p -r1.207 LyXAction.C
--- LyXAction.C	25 Jun 2005 15:57:15 -0000	1.207
+++ LyXAction.C	29 Sep 2005 16:57:19 -0000
@@ -136,9 +136,9 @@ void LyXAction::init()
 		{ LFUN_COPY, "copy", ReadOnly },
 		{ LFUN_CUT, "cut", Noop },
 		{ LFUN_DATE_INSERT, "date-insert", Noop },
-		{ LFUN_BACKSPACE, "delete-backward", Noop },
+		{ LFUN_BACKSPACE, "delete-backward", SingleParUpdate },
 		{ LFUN_BACKSPACE_SKIP, "delete-backward-skip", Noop },
-		{ LFUN_DELETE, "delete-forward", Noop },
+		{ LFUN_DELETE, "delete-forward", SingleParUpdate },
 		{ LFUN_DELETE_SKIP, "delete-forward-skip", Noop },
 		{ LFUN_DEPTH_MIN, "depth-decrement", Noop },
 		{ LFUN_DEPTH_PLUS, "depth-increment", Noop },
@@ -257,7 +257,7 @@ void LyXAction::init()
 		{ LFUN_PRIOR, "screen-up", ReadOnly | NoUpdate},
 		{ LFUN_PRIORSEL, "screen-up-select", ReadOnly },
 		{ LFUN_SCROLL_INSET, "inset-scroll", ReadOnly },
-		{ LFUN_SELFINSERT, "self-insert", Noop },
+		{ LFUN_SELFINSERT, "self-insert", SingleParUpdate },
 		{ LFUN_SPACE_INSERT, "space-insert", Noop },
 		{ LFUN_CHARATCURSOR, "server-char-after", ReadOnly },
 		{ LFUN_GETFONT, "server-get-font", ReadOnly },
Index: LyXAction.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/LyXAction.h,v
retrieving revision 1.29
diff -u -p -r1.29 LyXAction.h
--- LyXAction.h	8 Feb 2005 02:06:34 -0000	1.29
+++ LyXAction.h	29 Sep 2005 16:57:19 -0000
@@ -51,7 +51,8 @@ public:
 		ReadOnly = 1, //< can be used in RO mode (perhaps this should change)
 		NoBuffer = 2, //< Can be used when there is no document open
 		Argument = 4, //< Requires argument
-		NoUpdate = 8 //< Does not (usually) require update
+		NoUpdate = 8, //< Does not (usually) require update
+		SingleParUpdate = 16 //< Usually only requires this par updated
 	};
 
 	LyXAction();

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to