emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Truncating scroll runs that copy to where we copied to


From: YAMAMOTO Mitsuharu
Subject: Truncating scroll runs that copy to where we copied to
Date: Sun, 20 Nov 2011 16:13:59 +0900
User-agent: Wanderlust/2.14.0 (Africa) SEMI/1.14.6 (Maruoka) FLIM/1.14.8 (Shij┼Ź) APEL/10.6 Emacs/22.3 (sparc-sun-solaris2.8) MULE/5.0 (SAKAKI)

I think that `scrolling_window' needs to truncate scroll runs that
copy to where we copied to; otherwise, `assign_row (to, from)' assigns
a previously disabled bogus row in the desired matrix when we have an
overlap in the copy destination.  Such truncation can also avoid
unnecessary copy in the actual graphics operation.

Could someone double-check the code below?

                                     YAMAMOTO Mitsuharu
                                address@hidden

=== modified file 'src/dispnew.c'
*** src/dispnew.c       2011-11-19 08:39:42 +0000
--- src/dispnew.c       2011-11-20 06:44:25 +0000
***************
*** 4552,4562 ****
            rif->clear_window_mouse_face (w);
            rif->scroll_run_hook (w, r);
  
!           /* Invalidate runs that copy from where we copied to.  */
            for (j = i + 1; j < nruns; ++j)
              {
                struct run *p = runs[j];
  
                if ((p->current_y >= r->desired_y
                     && p->current_y < r->desired_y + r->height)
                    || (p->current_y + p->height >= r->desired_y
--- 4552,4594 ----
            rif->clear_window_mouse_face (w);
            rif->scroll_run_hook (w, r);
  
!           /* Truncate runs that copy to where we copied to, and
!              invalidate runs that copy from where we copied to.  */
            for (j = i + 1; j < nruns; ++j)
              {
                struct run *p = runs[j];
  
+               if (p->nrows > 0
+                   && p->desired_vpos < r->desired_vpos + r->nrows
+                   && p->desired_vpos + p->nrows > r->desired_vpos)
+                 {
+                   if (p->desired_vpos < r->desired_vpos)
+                     {
+                       p->nrows = r->desired_vpos - p->desired_vpos;
+                       p->height = r->desired_y - p->desired_y;
+                     }
+                   else
+                     {
+                       int nrows_copied = (r->desired_vpos + r->nrows
+                                           - p->desired_vpos);
+ 
+                       if (p->nrows <= nrows_copied)
+                         p->nrows = 0;
+                       else
+                         {
+                           int height_copied = (r->desired_y + r->height
+                                                - p->desired_y);
+ 
+                           p->current_vpos += nrows_copied;
+                           p->desired_vpos += nrows_copied;
+                           p->nrows -= nrows_copied;
+                           p->current_y += height_copied;
+                           p->desired_y += height_copied;
+                           p->height -= height_copied;
+                         }
+                     }
+                 }
+ 
                if ((p->current_y >= r->desired_y
                     && p->current_y < r->desired_y + r->height)
                    || (p->current_y + p->height >= r->desired_y




reply via email to

[Prev in Thread] Current Thread [Next in Thread]