Two more small bugs introduced by the B-tree reorg: scroll() now
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Tue, 17 Apr 2001 09:25:52 +0000 (09:25 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Tue, 17 Apr 2001 09:25:52 +0000 (09:25 +0000)
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

index ab1b225..657aff7 100644 (file)
@@ -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) {