changeset 6627:f8471ecf787b

(make_frame_glyphs): If EMPTY, don't leave junk in ->total_charstarts. (scroll_frame_lines): Typo in previous change. Arg POS_ADJUST replaced with arg NEWPOS.
author Richard M. Stallman <rms@gnu.org>
date Fri, 01 Apr 1994 10:13:32 +0000
parents 59c44532d2a0
children c359dfd21b00
files src/dispnew.c
diffstat 1 files changed, 27 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/src/dispnew.c	Fri Apr 01 10:12:10 1994 +0000
+++ b/src/dispnew.c	Fri Apr 01 10:13:32 1994 +0000
@@ -265,9 +265,13 @@
       /* Make the buffer used by decode_mode_spec.  This buffer is also
          used as temporary storage when updating the frame.  See scroll.c. */
       unsigned int total_glyphs = (width + 2) * sizeof (GLYPH);
+      unsigned int total_charstarts = (width + 2) * sizeof (int);
 
       new->total_contents = (GLYPH *) xmalloc (total_glyphs);
       bzero (new->total_contents, total_glyphs);
+
+      new->total_charstarts = (int *) xmalloc (total_charstarts);
+      bzero (new->total_charstarts, total_glyphs);
     }
   else
     {
@@ -595,13 +599,14 @@
    Returns nonzero if done, zero if terminal cannot scroll them.  */
 
 int
-scroll_frame_lines (frame, from, end, amount, pos_adjust)
+scroll_frame_lines (frame, from, end, amount, newpos)
      register FRAME_PTR frame;
-     int from, end, amount, pos_adjust;
+     int from, end, amount, newpos;
 {
   register int i;
   register struct frame_glyphs *current_frame
     = FRAME_CURRENT_GLYPHS (frame);
+  int pos_adjust;
 
   if (!line_ins_del_ok)
     return 0;
@@ -623,24 +628,28 @@
 		     amount * sizeof (GLYPH *));
 
       rotate_vector (current_frame->charstarts + from,
-		     sizeof (GLYPH *) * (end + amount - from),
-		     amount * sizeof (GLYPH *));
+		     sizeof (int *) * (end + amount - from),
+		     amount * sizeof (int *));
+
+      /* Adjust the lines by an amount
+	 that puts the first of them at NEWPOS.  */
+      pos_adjust = newpos - current_frame->charstarts[i][0];
 
       /* Offset each char position in the charstarts lines we moved
 	 by pos_adjust.  */
       for (i = from + amount; i < end; i++)
 	{
-	  int *line = current_frame->charstarts[from];
+	  int *line = current_frame->charstarts[i];
 	  int col;
-	  for (col = 0; col < current_frame->used[from]; col++)
+	  for (col = 0; col < current_frame->used[i]; col++)
 	    line[col] += pos_adjust;
 	}
       for (i = from; i <= from + amount; i++)
 	{
-	  int *line = current_frame->charstarts[from];
+	  int *line = current_frame->charstarts[i];
 	  int col;
 	  line[0] = -1;
-	  for (col = 0; col < current_frame->used[from]; col++)
+	  for (col = 0; col < current_frame->used[i]; col++)
 	    line[col] = 0;
 	}
 
@@ -714,24 +723,28 @@
 		     amount * sizeof (GLYPH *));
 
       rotate_vector (current_frame->charstarts + from + amount,
-		     sizeof (GLYPH *) * (end - from - amount),
-		     amount * sizeof (GLYPH *));
+		     sizeof (int *) * (end - from - amount),
+		     amount * sizeof (int *));
+
+      /* Adjust the lines by an amount
+	 that puts the first of them at NEWPOS.  */
+      pos_adjust = newpos - current_frame->charstarts[i][0];
 
       /* Offset each char position in the charstarts lines we moved
 	 by pos_adjust.  */
       for (i = from + amount; i < end + amount; i++)
 	{
-	  int *line = current_frame->charstarts[from];
+	  int *line = current_frame->charstarts[i];
 	  int col;
-	  for (col = 0; col < current_frame->used[from]; col++)
+	  for (col = 0; col < current_frame->used[i]; col++)
 	    line[col] += pos_adjust;
 	}
       for (i = end + amount; i <= end; i++)
 	{
-	  int *line = current_frame->charstarts[from];
+	  int *line = current_frame->charstarts[i];
 	  int col;
 	  line[0] = -1;
-	  for (col = 0; col < current_frame->used[from]; col++)
+	  for (col = 0; col < current_frame->used[i]; col++)
 	    line[col] = 0;
 	}