]> code.delx.au - gnu-emacs/blobdiff - src/dispnew.c
(x_draw_relief_rect): Add top_p and bot_p args.
[gnu-emacs] / src / dispnew.c
index 65d4726b1dfa394d73744b05a4b1e27450684649..5ceebdecf3483f6a9e4ef58371c8a0228cd87fe7 100644 (file)
@@ -1516,7 +1516,10 @@ row_equal_p (w, a, b, mouse_face_p)
       if (a->fill_line_p != b->fill_line_p
          || a->cursor_in_fringe_p != b->cursor_in_fringe_p
          || a->left_fringe_bitmap != b->left_fringe_bitmap
+         || a->left_fringe_face_id != b->left_fringe_face_id
          || a->right_fringe_bitmap != b->right_fringe_bitmap
+         || a->right_fringe_face_id != b->right_fringe_face_id
+         || a->overlay_arrow_p != b->overlay_arrow_p
          || a->exact_window_width_line_p != b->exact_window_width_line_p
          || a->overlapped_p != b->overlapped_p
          || (MATRIX_ROW_CONTINUATION_LINE_P (a)
@@ -3826,10 +3829,15 @@ update_frame (f, force_p, inhibit_hairy_id_p)
       paused_p = update_window_tree (root_window, force_p);
       update_end (f);
 
-#if 0 /* This flush is a performance bottleneck under X,
-        and it doesn't seem to be necessary anyway.  */
-      rif->flush_display (f);
-#endif
+      /* This flush is a performance bottleneck under X,
+        and it doesn't seem to be necessary anyway (in general).
+         It is necessary when resizing the window with the mouse, or
+        at least the fringes are not redrawn in a timely manner.  ++kfs */
+      if (f->force_flush_display_p)
+       {
+         rif->flush_display (f);
+         f->force_flush_display_p = 0;
+       }
     }
   else
     {
@@ -4122,19 +4130,11 @@ update_window (w, force_p)
              goto set_cursor;
            }
          else if (rc > 0)
-           /* We've scrolled the display.  */
-           force_p = 1;
-         changed_p = 1;
-       }
-
-      /* Update the header line after scrolling because a new header
-        line would otherwise overwrite lines at the top of the window
-        that can be scrolled.  */
-      if (header_line_row && header_line_row->enabled_p)
-       {
-         header_line_row->y = 0;
-         update_window_line (w, 0, &mouse_face_overwritten_p);
-         changed_p = 1;
+           {
+             /* We've scrolled the display.  */
+             force_p = 1;
+             changed_p = 1;
+           }
        }
 
       /* Update the rest of the lines.  */
@@ -4173,6 +4173,16 @@ update_window (w, force_p)
 
     set_cursor:
 
+      /* Update the header line after scrolling because a new header
+        line would otherwise overwrite lines at the top of the window
+        that can be scrolled.  */
+      if (header_line_row && header_line_row->enabled_p)
+       {
+         header_line_row->y = 0;
+         update_window_line (w, 0, &mouse_face_overwritten_p);
+         changed_p = 1;
+       }
+
       /* Fix the appearance of overlapping/overlapped rows.  */
       if (!paused_p && !w->pseudo_window_p)
        {
@@ -4519,6 +4529,7 @@ update_window_line (w, vpos, mouse_face_overwritten_p)
          || desired_row->y != current_row->y
          || desired_row->visible_height != current_row->visible_height
          || desired_row->cursor_in_fringe_p != current_row->cursor_in_fringe_p
+         || desired_row->overlay_arrow_p != current_row->overlay_arrow_p
          || current_row->redraw_fringe_bitmaps_p
          || desired_row->mode_line_p != current_row->mode_line_p
          || desired_row->exact_window_width_line_p != current_row->exact_window_width_line_p
@@ -5025,7 +5036,10 @@ scrolling_window (w, header_line_p)
            to_overlapped_p = to->overlapped_p;
            if (!from->mode_line_p && !w->pseudo_window_p
                && (to->left_fringe_bitmap != from->left_fringe_bitmap
-                   || to->right_fringe_bitmap != from->right_fringe_bitmap))
+                   || to->right_fringe_bitmap != from->right_fringe_bitmap
+                   || to->left_fringe_face_id != from->left_fringe_face_id
+                   || to->right_fringe_face_id != from->right_fringe_face_id
+                   || to->overlay_arrow_p != from->overlay_arrow_p))
              from->redraw_fringe_bitmaps_p = 1;
            assign_row (to, from);
            to->enabled_p = 1, from->enabled_p = 0;
@@ -5037,8 +5051,8 @@ scrolling_window (w, header_line_p)
   for (i = 0; i < row_entry_idx; ++i)
     row_table[row_entry_pool[i].bucket] = NULL;
 
-  /* Value is non-zero to indicate that we scrolled the display.  */
-  return 1;
+  /* Value is > 0 to indicate that we scrolled the display.  */
+  return nruns;
 }
 
 
@@ -5716,6 +5730,9 @@ buffer_posn_from_coords (w, x, y, pos, object, dx, dy, width, height)
   struct text_pos startp;
   Lisp_Object string;
   struct glyph_row *row;
+#ifdef HAVE_WINDOW_SYSTEM
+  struct image *img = 0;
+#endif
   int x0, x1;
 
   current_buffer = XBUFFER (w->buffer);
@@ -5741,7 +5758,6 @@ buffer_posn_from_coords (w, x, y, pos, object, dx, dy, width, height)
 #ifdef HAVE_WINDOW_SYSTEM
   if (it.what == IT_IMAGE)
     {
-      struct image *img;
       if ((img = IMAGE_FROM_ID (it.f, it.image_id)) != NULL
          && !NILP (img->spec))
        *object = img->spec;
@@ -5754,12 +5770,22 @@ buffer_posn_from_coords (w, x, y, pos, object, dx, dy, width, height)
       if (it.hpos < row->used[TEXT_AREA])
        {
          struct glyph *glyph = row->glyphs[TEXT_AREA] + it.hpos;
-         *width = glyph->pixel_width;
-         *height = glyph->ascent + glyph->descent;
 #ifdef HAVE_WINDOW_SYSTEM
-         if (glyph->type == IMAGE_GLYPH)
-           *dy -= row->ascent - glyph->ascent;
+         if (img)
+           {
+             *dy -= row->ascent - glyph->ascent;
+             *dx += glyph->slice.x;
+             *dy += glyph->slice.y;
+             /* Image slices positions are still relative to the entire image */
+             *width = img->width;
+             *height = img->height;
+           }
+         else
 #endif
+           {
+             *width = glyph->pixel_width;
+             *height = glyph->ascent + glyph->descent;
+           }
        }
       else
        {
@@ -5897,13 +5923,13 @@ marginal_area_string (w, part, x, y, charpos, object, dx, dy, width, height)
         it's the one we were looking for.  */
       if (area == RIGHT_MARGIN_AREA)
        x0 = ((WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w)
-              ? WINDOW_LEFT_FRINGE_WIDTH (w) 
+              ? WINDOW_LEFT_FRINGE_WIDTH (w)
               : WINDOW_TOTAL_FRINGE_WIDTH (w))
              + window_box_width (w, LEFT_MARGIN_AREA)
              + window_box_width (w, TEXT_AREA));
       else
        x0 = (WINDOW_HAS_FRINGES_OUTSIDE_MARGINS (w)
-             ? WINDOW_LEFT_FRINGE_WIDTH (w) 
+             ? WINDOW_LEFT_FRINGE_WIDTH (w)
              : 0);
 
       glyph = row->glyphs[area];
@@ -5925,6 +5951,8 @@ marginal_area_string (w, part, x, y, charpos, object, dx, dy, width, height)
              if (img != NULL)
                *object = img->spec;
              y0 -= row->ascent - glyph->ascent;
+             x0 += glyph->slice.x;
+             y0 += glyph->slice.y;
            }
 #endif
        }