From a4450583b0e39704fd2dfc1e2486117af735bd77 Mon Sep 17 00:00:00 2001 From: simon Date: Tue, 17 Apr 2001 09:25:52 +0000 Subject: [PATCH] Two more small bugs introduced by the B-tree reorg: scroll() now requires fix_cpos() to be called after it (otherwise cpos might point to a line that isn't where you remember it being), and a mis-aimed incpos() was causing forward selection dragging not to include the char under the mouse. Both fixed. git-svn-id: svn://svn.tartarus.org/sgt/putty@1063 cda61777-01e9-0310-a592-d414129be87e --- terminal.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/terminal.c b/terminal.c index ab1b2254..657aff74 100644 --- a/terminal.c +++ b/terminal.c @@ -461,6 +461,11 @@ static void check_selection (pos from, pos to) { * Scroll the screen. (`lines' is +ve for scrolling forward, -ve * for backward.) `sb' is TRUE if the scrolling is permitted to * affect the scrollback buffer. + * + * NB this function invalidates all pointers into lines of the + * screen data structures. In particular, you MUST call fix_cpos + * after calling scroll() and before doing anything else that + * uses the cpos shortcut pointer. */ static void scroll (int topline, int botline, int lines, int sb) { unsigned long *line, *line2; @@ -1244,12 +1249,14 @@ void term_out(void) { compatibility(VT102); if (curs.y <= marg_b) scroll (curs.y, marg_b, -def(esc_args[0], 1), FALSE); + fix_cpos; seen_disp_event = TRUE; break; case 'M': /* delete lines */ compatibility(VT102); if (curs.y <= marg_b) scroll (curs.y, marg_b, def(esc_args[0], 1), TRUE); + fix_cpos; seen_disp_event = TRUE; break; case '@': /* insert chars */ @@ -2218,7 +2225,7 @@ void term_mouse (Mouse_Button b, Mouse_Action a, int x, int y) { } else { selstart = selanchor; selend = selpoint; - incpos(selpoint); + incpos(selend); } sel_spread(); } else if ((b == MB_SELECT || b == MB_EXTEND) && a == MA_RELEASE) { -- 2.11.0