[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/src/xdisp.c [emacs-unicode-2]
From: |
Miles Bader |
Subject: |
[Emacs-diffs] Changes to emacs/src/xdisp.c [emacs-unicode-2] |
Date: |
Wed, 08 Dec 2004 00:47:42 -0500 |
Index: emacs/src/xdisp.c
diff -c emacs/src/xdisp.c:1.843.2.33 emacs/src/xdisp.c:1.843.2.34
*** emacs/src/xdisp.c:1.843.2.33 Fri Nov 19 06:54:58 2004
--- emacs/src/xdisp.c Wed Dec 8 05:02:19 2004
***************
*** 810,816 ****
/* Function prototypes. */
! static void setup_for_ellipsis P_ ((struct it *));
static void mark_window_display_accurate_1 P_ ((struct window *, int));
static int single_display_prop_string_p P_ ((Lisp_Object, Lisp_Object));
static int display_prop_string_p P_ ((Lisp_Object, Lisp_Object));
--- 810,816 ----
/* Function prototypes. */
! static void setup_for_ellipsis P_ ((struct it *, int));
static void mark_window_display_accurate_1 P_ ((struct window *, int));
static int single_display_prop_string_p P_ ((Lisp_Object, Lisp_Object));
static int display_prop_string_p P_ ((Lisp_Object, Lisp_Object));
***************
*** 3230,3236 ****
it->stack[it->sp - 1].display_ellipsis_p = display_ellipsis_p;
}
else if (display_ellipsis_p)
! setup_for_ellipsis (it);
}
}
--- 3230,3236 ----
it->stack[it->sp - 1].display_ellipsis_p = display_ellipsis_p;
}
else if (display_ellipsis_p)
! setup_for_ellipsis (it, 0);
}
}
***************
*** 3238,3251 ****
}
! /* Make iterator IT return `...' next. */
static void
! setup_for_ellipsis (it)
struct it *it;
{
! if (it->dp
! && VECTORP (DISP_INVIS_VECTOR (it->dp)))
{
struct Lisp_Vector *v = XVECTOR (DISP_INVIS_VECTOR (it->dp));
it->dpvec = v->contents;
--- 3238,3254 ----
}
! /* Make iterator IT return `...' next.
! Replaces LEN characters from buffer. */
static void
! setup_for_ellipsis (it, len)
struct it *it;
+ int len;
{
! /* Use the display table definition for `...'. Invalid glyphs
! will be handled by the method returning elements from dpvec. */
! if (it->dp && VECTORP (DISP_INVIS_VECTOR (it->dp)))
{
struct Lisp_Vector *v = XVECTOR (DISP_INVIS_VECTOR (it->dp));
it->dpvec = v->contents;
***************
*** 3258,3269 ****
it->dpend = default_invis_vector + 3;
}
! /* The ellipsis display does not replace the display of the
! character at the new position. Indicate this by setting
! IT->dpvec_char_len to zero. */
! it->dpvec_char_len = 0;
!
it->current.dpvec_index = 0;
it->method = next_element_from_display_vector;
}
--- 3261,3272 ----
it->dpend = default_invis_vector + 3;
}
! it->dpvec_char_len = len;
it->current.dpvec_index = 0;
+
+ /* Remember the current face id in case glyphs specify faces.
+ IT's face is restored in set_iterator_to_next. */
+ it->saved_face_id = it->face_id;
it->method = next_element_from_display_vector;
}
***************
*** 3578,3584 ****
|| EQ (XCAR (prop), Qright_fringe))
&& CONSP (XCDR (prop)))
{
! unsigned face_id = DEFAULT_FACE_ID;
int fringe_bitmap;
/* Save current settings of IT so that we can restore them
--- 3581,3587 ----
|| EQ (XCAR (prop), Qright_fringe))
&& CONSP (XCDR (prop)))
{
! int face_id = DEFAULT_FACE_ID;
int fringe_bitmap;
/* Save current settings of IT so that we can restore them
***************
*** 3597,3606 ****
if (CONSP (XCDR (XCDR (prop))))
{
Lisp_Object face_name = XCAR (XCDR (XCDR (prop)));
!
! face_id = lookup_named_face (it->f, face_name);
! if (face_id < 0)
! return 0;
}
push_it (it);
--- 3600,3608 ----
if (CONSP (XCDR (XCDR (prop))))
{
Lisp_Object face_name = XCAR (XCDR (XCDR (prop)));
! int face_id2 = lookup_named_face (it->f, face_name, 0);
! if (face_id2 >= 0)
! face_id = face_id2;
}
push_it (it);
***************
*** 4145,4151 ****
/* If we have to display `...' for invisible text, set
the iterator up for that. */
if (display_ellipsis_p)
! setup_for_ellipsis (it);
}
else
{
--- 4147,4153 ----
/* If we have to display `...' for invisible text, set
the iterator up for that. */
if (display_ellipsis_p)
! setup_for_ellipsis (it, 0);
}
else
{
***************
*** 4937,4943 ****
we hit the end of what we iterate over. Performance note: the
function pointer `method' used here turns out to be faster than
using a sequence of if-statements. */
! int success_p = (*it->method) (it);
if (it->what == IT_CHARACTER)
{
--- 4939,4948 ----
we hit the end of what we iterate over. Performance note: the
function pointer `method' used here turns out to be faster than
using a sequence of if-statements. */
! int success_p;
!
! get_next:
! success_p = (*it->method) (it);
if (it->what == IT_CHARACTER)
{
***************
*** 4969,4982 ****
it->dpvec = v->contents;
it->dpend = v->contents + v->size;
it->current.dpvec_index = 0;
it->method = next_element_from_display_vector;
- success_p = get_next_display_element (it);
}
else
{
set_iterator_to_next (it, 0);
- success_p = get_next_display_element (it);
}
}
/* Translate control characters into `\003' or `^C' form.
--- 4974,4987 ----
it->dpvec = v->contents;
it->dpend = v->contents + v->size;
it->current.dpvec_index = 0;
+ it->saved_face_id = it->face_id;
it->method = next_element_from_display_vector;
}
else
{
set_iterator_to_next (it, 0);
}
+ goto get_next;
}
/* Translate control characters into `\003' or `^C' form.
***************
*** 5008,5013 ****
--- 5013,5019 ----
IT->ctl_chars with glyphs for what we have to
display. Then, set IT->dpvec to these glyphs. */
GLYPH g;
+ int ctl_len;
if (it->c < 128 && it->ctl_arrow_p)
{
***************
*** 5022,5035 ****
g = FAST_MAKE_GLYPH (it->c ^ 0100, 0);
XSETINT (it->ctl_chars[1], g);
!
! /* Set up IT->dpvec and return first character from it. */
! it->dpvec_char_len = it->len;
! it->dpvec = it->ctl_chars;
! it->dpend = it->dpvec + 2;
! it->current.dpvec_index = 0;
! it->method = next_element_from_display_vector;
! get_next_display_element (it);
}
else
{
--- 5028,5034 ----
g = FAST_MAKE_GLYPH (it->c ^ 0100, 0);
XSETINT (it->ctl_chars[1], g);
! ctl_len = 2;
}
else
{
***************
*** 5082,5097 ****
g = FAST_MAKE_GLYPH ((str[i] & 7) + '0', 0);
XSETINT (it->ctl_chars[i * 4 + 3], g);
}
!
! /* Set up IT->dpvec and return the first character
! from it. */
! it->dpvec_char_len = it->len;
! it->dpvec = it->ctl_chars;
! it->dpend = it->dpvec + len * 4;
! it->current.dpvec_index = 0;
! it->method = next_element_from_display_vector;
! get_next_display_element (it);
}
}
}
--- 5081,5097 ----
g = FAST_MAKE_GLYPH ((str[i] & 7) + '0', 0);
XSETINT (it->ctl_chars[i * 4 + 3], g);
}
! ctl_len = len * 4;
}
+
+ /* Set up IT->dpvec and return first character from it. */
+ it->dpvec_char_len = it->len;
+ it->dpvec = it->ctl_chars;
+ it->dpend = it->dpvec + ctl_len;
+ it->current.dpvec_index = 0;
+ it->saved_face_id = it->face_id;
+ it->method = next_element_from_display_vector;
+ goto get_next;
}
}
***************
*** 5285,5295 ****
&& IT_STRING_CHARPOS (*it) >= 0));
}
-
/* Load IT's display element fields with information about the next
display element which comes from a display table entry or from the
result of translating a control character to one of the forms `^C'
! or `\003'. IT->dpvec holds the glyphs to return as characters. */
static int
next_element_from_display_vector (it)
--- 5285,5298 ----
&& IT_STRING_CHARPOS (*it) >= 0));
}
/* Load IT's display element fields with information about the next
display element which comes from a display table entry or from the
result of translating a control character to one of the forms `^C'
! or `\003'.
!
! IT->dpvec holds the glyphs to return as characters.
! IT->saved_face_id holds the face id before the display vector--
! it is restored into IT->face_idin set_iterator_to_next. */
static int
next_element_from_display_vector (it)
***************
*** 5298,5307 ****
/* Precondition. */
xassert (it->dpvec && it->current.dpvec_index >= 0);
- /* Remember the current face id in case glyphs specify faces.
- IT's face is restored in set_iterator_to_next. */
- it->saved_face_id = it->face_id;
-
if (INTEGERP (*it->dpvec)
&& GLYPH_CHAR_VALID_P (XFASTINT (*it->dpvec)))
{
--- 5301,5306 ----
***************
*** 5485,5512 ****
struct it *it;
{
if (it->selective_display_ellipsis_p)
! {
! if (it->dp && VECTORP (DISP_INVIS_VECTOR (it->dp)))
! {
! /* Use the display table definition for `...'. Invalid glyphs
! will be handled by the method returning elements from dpvec. */
! struct Lisp_Vector *v = XVECTOR (DISP_INVIS_VECTOR (it->dp));
! it->dpvec_char_len = it->len;
! it->dpvec = v->contents;
! it->dpend = v->contents + v->size;
! it->current.dpvec_index = 0;
! it->method = next_element_from_display_vector;
! }
! else
! {
! /* Use default `...' which is stored in default_invis_vector. */
! it->dpvec_char_len = it->len;
! it->dpvec = default_invis_vector;
! it->dpend = default_invis_vector + 3;
! it->current.dpvec_index = 0;
! it->method = next_element_from_display_vector;
! }
! }
else
{
/* The face at the current position may be different from the
--- 5484,5490 ----
struct it *it;
{
if (it->selective_display_ellipsis_p)
! setup_for_ellipsis (it, it->len);
else
{
/* The face at the current position may be different from the
***************
*** 14633,14639 ****
&& glyph->u.ch == ' '))
&& trailing_whitespace_p (glyph->charpos))
{
! int face_id = lookup_named_face (f, Qtrailing_whitespace);
while (glyph >= start
&& BUFFERP (glyph->object)
--- 14611,14619 ----
&& glyph->u.ch == ' '))
&& trailing_whitespace_p (glyph->charpos))
{
! int face_id = lookup_named_face (f, Qtrailing_whitespace, 0);
! if (face_id < 0)
! return;
while (glyph >= start
&& BUFFERP (glyph->object)
***************
*** 14726,14733 ****
hscrolled. This may stop at an x-position < IT->first_visible_x
if the first glyph is partially visible or if we hit a line end. */
if (it->current_x < it->first_visible_x)
! move_it_in_display_line_to (it, ZV, it->first_visible_x,
! MOVE_TO_POS | MOVE_TO_X);
/* Get the initial row height. This is either the height of the
text hscrolled, if there is any, or zero. */
--- 14706,14715 ----
hscrolled. This may stop at an x-position < IT->first_visible_x
if the first glyph is partially visible or if we hit a line end. */
if (it->current_x < it->first_visible_x)
! {
! move_it_in_display_line_to (it, ZV, it->first_visible_x,
! MOVE_TO_POS | MOVE_TO_X);
! }
/* Get the initial row height. This is either the height of the
text hscrolled, if there is any, or zero. */
***************
*** 15056,15067 ****
{
if (!get_next_display_element (it))
{
- #ifdef HAVE_WINDOW_SYSTEM
it->continuation_lines_width = 0;
row->ends_at_zv_p = 1;
row->exact_window_width_line_p = 1;
break;
- #endif /* HAVE_WINDOW_SYSTEM */
}
if (ITERATOR_AT_END_OF_LINE_P (it))
{
--- 15038,15047 ----
***************
*** 18376,18381 ****
--- 18356,18374 ----
return x_reached;
}
+ /* Expand row matrix if too narrow. Don't expand if area
+ is not present. */
+
+ #define IT_EXPAND_MATRIX_WIDTH(it, area) \
+ { \
+ if (!fonts_changed_p \
+ && (it->glyph_row->glyphs[area] \
+ < it->glyph_row->glyphs[area + 1])) \
+ { \
+ it->w->ncols_scale_factor++; \
+ fonts_changed_p = 1; \
+ } \
+ }
/* Store one glyph for IT->char_to_display in IT->glyph_row.
Called from x_produce_glyphs when IT->glyph_row is non-null. */
***************
*** 18413,18423 ****
glyph->font_type = FONT_TYPE_UNKNOWN;
++it->glyph_row->used[area];
}
! else if (!fonts_changed_p)
! {
! it->w->ncols_scale_factor++;
! fonts_changed_p = 1;
! }
}
/* Store one glyph for the composition IT->cmp_id in IT->glyph_row.
--- 18406,18413 ----
glyph->font_type = FONT_TYPE_UNKNOWN;
++it->glyph_row->used[area];
}
! else
! IT_EXPAND_MATRIX_WIDTH (it, area);
}
/* Store one glyph for the composition IT->cmp_id in IT->glyph_row.
***************
*** 18455,18465 ****
glyph->font_type = FONT_TYPE_UNKNOWN;
++it->glyph_row->used[area];
}
! else if (!fonts_changed_p)
! {
! it->w->ncols_scale_factor++;
! fonts_changed_p = 1;
! }
}
--- 18445,18452 ----
glyph->font_type = FONT_TYPE_UNKNOWN;
++it->glyph_row->used[area];
}
! else
! IT_EXPAND_MATRIX_WIDTH (it, area);
}
***************
*** 18629,18639 ****
glyph->font_type = FONT_TYPE_UNKNOWN;
++it->glyph_row->used[area];
}
! else if (!fonts_changed_p)
! {
! it->w->ncols_scale_factor++;
! fonts_changed_p = 1;
! }
}
}
--- 18616,18623 ----
glyph->font_type = FONT_TYPE_UNKNOWN;
++it->glyph_row->used[area];
}
! else
! IT_EXPAND_MATRIX_WIDTH (it, area);
}
}
***************
*** 18677,18687 ****
glyph->font_type = FONT_TYPE_UNKNOWN;
++it->glyph_row->used[area];
}
! else if (!fonts_changed_p)
! {
! it->w->ncols_scale_factor++;
! fonts_changed_p = 1;
! }
}
--- 18661,18668 ----
glyph->font_type = FONT_TYPE_UNKNOWN;
++it->glyph_row->used[area];
}
! else
! IT_EXPAND_MATRIX_WIDTH (it, area);
}
***************
*** 18912,18918 ****
struct face *face;
struct font_info *font_info;
! face_id = lookup_named_face (it->f, face_name);
if (face_id < 0)
return make_number (-1);
--- 18893,18899 ----
struct face *face;
struct font_info *font_info;
! face_id = lookup_named_face (it->f, face_name, 0);
if (face_id < 0)
return make_number (-1);
***************
*** 20264,20269 ****
--- 20245,20251 ----
{
int x, y;
int header_line_height = WINDOW_HEADER_LINE_HEIGHT (w);
+ int width;
cursor_glyph = get_phys_cursor_glyph (w);
if (cursor_glyph == NULL)
***************
*** 20271,20279 ****
x = WINDOW_TEXT_TO_FRAME_PIXEL_X (w, w->phys_cursor.x);
y = WINDOW_TO_FRAME_PIXEL_Y (w, max (header_line_height,
cursor_row->y));
! rif->clear_frame_area (f, x, y,
! cursor_glyph->pixel_width,
cursor_row->visible_height);
}
/* Erase the cursor by redrawing the character underneath it. */
--- 20253,20262 ----
x = WINDOW_TEXT_TO_FRAME_PIXEL_X (w, w->phys_cursor.x);
y = WINDOW_TO_FRAME_PIXEL_Y (w, max (header_line_height,
cursor_row->y));
+ width = min (cursor_glyph->pixel_width,
+ window_box_width (w, TEXT_AREA) - w->phys_cursor.x);
! rif->clear_frame_area (f, x, y, width, cursor_row->visible_height);
}
/* Erase the cursor by redrawing the character underneath it. */
***************
*** 21094,21106 ****
/* If we're on a string with `help-echo' text property, arrange
for the help to be displayed. This is done by setting the
global variable help_echo_string to the help string. */
! help = Fget_text_property (pos, Qhelp_echo, string);
! if (!NILP (help))
{
! help_echo_string = help;
! XSETWINDOW (help_echo_window, w);
! help_echo_object = string;
! help_echo_pos = charpos;
}
if (NILP (pointer))
--- 21077,21092 ----
/* If we're on a string with `help-echo' text property, arrange
for the help to be displayed. This is done by setting the
global variable help_echo_string to the help string. */
! if (NILP (help))
{
! help = Fget_text_property (pos, Qhelp_echo, string);
! if (!NILP (help))
! {
! help_echo_string = help;
! XSETWINDOW (help_echo_window, w);
! help_echo_object = string;
! help_echo_pos = charpos;
! }
}
if (NILP (pointer))
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] Changes to emacs/src/xdisp.c [emacs-unicode-2],
Miles Bader <=