emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] Changes to emacs/src/macterm.c


From: Andrew Choi
Subject: [Emacs-diffs] Changes to emacs/src/macterm.c
Date: Fri, 30 Aug 2002 20:53:12 -0400

Index: emacs/src/macterm.c
diff -c emacs/src/macterm.c:1.18 emacs/src/macterm.c:1.19
*** emacs/src/macterm.c:1.18    Fri Aug 30 08:02:10 2002
--- emacs/src/macterm.c Fri Aug 30 20:53:12 2002
***************
*** 443,448 ****
--- 443,450 ----
  static int x_intersect_rectangles P_ ((Rect *, Rect *, Rect *));
  static void expose_frame P_ ((struct frame *, int, int, int, int));
  static int expose_window_tree P_ ((struct window *, Rect *));
+ static void expose_overlaps P_ ((struct window *, struct glyph_row *,
+                                struct glyph_row *));
  static int expose_window P_ ((struct window *, Rect *));
  static void expose_area P_ ((struct window *, struct glyph_row *,
                             Rect *, enum glyph_row_area));
***************
*** 6240,6247 ****
  }
  
  
! /* Redraw the part of window W intersection rectagle FR.  Pixel
!    coordinates in FR are frame relative.  Call this function with
     input blocked.  Value is non-zero if the exposure overwrites
     mouse-face.  */
  
--- 6242,6282 ----
  }
  
  
! /* Redraw those parts of glyphs rows during expose event handling that
!    overlap other rows.  Redrawing of an exposed line writes over parts
!    of lines overlapping that exposed line; this function fixes that.
! 
!    W is the window being exposed.  FIRST_OVERLAPPING_ROW is the first
!    row in W's current matrix that is exposed and overlaps other rows.
!    LAST_OVERLAPPING_ROW is the last such row.  */
! 
! static void
! expose_overlaps (w, first_overlapping_row, last_overlapping_row)
!      struct window *w;
!      struct glyph_row *first_overlapping_row;
!      struct glyph_row *last_overlapping_row;
! {
!   struct glyph_row *row;
!   
!   for (row = first_overlapping_row; row <= last_overlapping_row; ++row)
!     if (row->overlapping_p)
!       {
!       xassert (row->enabled_p && !row->mode_line_p);
!         
!       if (row->used[LEFT_MARGIN_AREA])
!         x_fix_overlapping_area (w, row, LEFT_MARGIN_AREA);
!   
!       if (row->used[TEXT_AREA])
!         x_fix_overlapping_area (w, row, TEXT_AREA);
!   
!       if (row->used[RIGHT_MARGIN_AREA])
!         x_fix_overlapping_area (w, row, RIGHT_MARGIN_AREA);
!       }
! }
! 
! 
! /* Redraw the part of window W intersection rectangle FR.  Pixel
!    coordinates in FR are frame-relative.  Call this function with
     input blocked.  Value is non-zero if the exposure overwrites
     mouse-face.  */
  
***************
*** 6281,6287 ****
        int yb = window_text_bottom_y (w);
        struct glyph_row *row;
        int cursor_cleared_p;
! 
        TRACE ((stderr, "expose_window (%d, %d, %d, %d)\n",
              r.left, r.top, r.right, r.bottom));
  
--- 6316,6323 ----
        int yb = window_text_bottom_y (w);
        struct glyph_row *row;
        int cursor_cleared_p;
!       struct glyph_row *first_overlapping_row, *last_overlapping_row;
!   
        TRACE ((stderr, "expose_window (%d, %d, %d, %d)\n",
              r.left, r.top, r.right, r.bottom));
  
***************
*** 6301,6307 ****
        else
        cursor_cleared_p = 0;
  
!       /* Find the first row intersecting the rectangle R.  */
        for (row = w->current_matrix->rows;
           row->enabled_p;
           ++row)
--- 6337,6344 ----
        else
        cursor_cleared_p = 0;
  
!       /* Update lines intersecting rectangle R.  */
!       first_overlapping_row = last_overlapping_row = NULL;
        for (row = w->current_matrix->rows;
           row->enabled_p;
           ++row)
***************
*** 6314,6323 ****
              || (r.top >= y0 && r.top < y1)
              || (r.bottom > y0 && r.bottom < y1))
            {
              if (expose_line (w, row, &r))
                mouse_face_overwritten_p = 1;
            }
! 
          if (y1 >= yb)
            break;
        }
--- 6351,6367 ----
              || (r.top >= y0 && r.top < y1)
              || (r.bottom > y0 && r.bottom < y1))
            {
+             if (row->overlapping_p)
+               {
+                 if (first_overlapping_row == NULL)
+                   first_overlapping_row = row;
+                 last_overlapping_row = row;
+               }
+             
              if (expose_line (w, row, &r))
                mouse_face_overwritten_p = 1;
            }
!             
          if (y1 >= yb)
            break;
        }
***************
*** 6334,6342 ****
  
        if (!w->pseudo_window_p)
        {
          /* Draw border between windows.  */
          x_draw_vertical_border (w);
! 
          /* Turn the cursor on again.  */
          if (cursor_cleared_p)
            x_update_window_cursor (w, 1);
--- 6378,6390 ----
  
        if (!w->pseudo_window_p)
        {
+         /* Fix the display of overlapping rows.  */
+         if (first_overlapping_row)
+           expose_overlaps (w, first_overlapping_row, last_overlapping_row);
+         
          /* Draw border between windows.  */
          x_draw_vertical_border (w);
!       
          /* Turn the cursor on again.  */
          if (cursor_cleared_p)
            x_update_window_cursor (w, 1);




reply via email to

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