mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2025-01-05 11:45:45 +00:00
Merge from emacs-24; up to 2014-06-26T21:51:25Z!rgm@gnu.org.
This commit is contained in:
commit
8afcf7e9d7
@ -1,3 +1,8 @@
|
||||
2014-07-29 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
* tutorial.el (tutorial--display-changes): Accept punctuation
|
||||
characters before the key binding. (Bug#18146)
|
||||
|
||||
2014-07-31 Fabián Ezequiel Gallina <fgallina@gnu.org>
|
||||
|
||||
* progmodes/python.el: Shell output capture enhancements.
|
||||
|
@ -548,7 +548,11 @@ with some explanatory links."
|
||||
(start (point))
|
||||
(case-fold-search nil)
|
||||
(keybindings-regexp
|
||||
(concat "[[:space:]]\\("
|
||||
;; Accept either [:space:] or [:punct:] before the key
|
||||
;; binding because the Hebrew tutorial uses directional
|
||||
;; controls and Hebrew character maqaf, the Hebrew hyphen,
|
||||
;; immediately before the binding string.
|
||||
(concat "\\([[:space:]]\\|[[:punct:]]\\)\\("
|
||||
(mapconcat (lambda (kdf) (regexp-quote
|
||||
(tutorial--key-description
|
||||
(nth 1 kdf))))
|
||||
|
@ -1,3 +1,35 @@
|
||||
2014-08-01 Eli Zaretskii <eliz@gnu.org>
|
||||
|
||||
Fix display of R2L lines when the last character fits only partially.
|
||||
See http://lists.gnu.org/archive/html/emacs-devel/2014-07/msg00476.html
|
||||
for the details.
|
||||
* xdisp.c (extend_face_to_end_of_line): If the last glyph of an
|
||||
R2L row is visible only partially, give the row a negative x
|
||||
offset.
|
||||
(display_line): Fix the calculation of the glyph whose pixel width
|
||||
is used to decide whether the last produced glyph fits on the
|
||||
line. When the last glyph fits only partially, give the row a
|
||||
negative x offset.
|
||||
|
||||
Fix hscroll of R2L lines that begin with a TAB or another wide glyph.
|
||||
* xdisp.c (append_stretch_glyph): In a R2L glyph row, decrease the
|
||||
pixel width of the first glyph that is hscrolled from display.
|
||||
(display_line): In R2L glyph rows, don't give a negative offset to
|
||||
row->x when the first glyph begins before first_visible_x.
|
||||
|
||||
* xdisp.c (display_line): If called with iterator set up to write
|
||||
to a marginal area, delay the call to handle_line_prefix until we
|
||||
switch back to the text area. (Bug#18035)
|
||||
|
||||
* .gdbinit (xwindow): The members total_cols, total_lines,
|
||||
left_col, and top_line are C integers (and has been so for the
|
||||
last 1.5 years).
|
||||
|
||||
2014-08-01 Andreas Schwab <schwab@suse.de>
|
||||
|
||||
* macros.c (Fstart_kbd_macro): Initialize kbd_macro_ptr and
|
||||
kbd_macro_end together with kbd_macro_buffer. (Bug#18140)
|
||||
|
||||
2014-08-01 Dmitry Antipov <dmantipov@yandex.ru>
|
||||
|
||||
* atimer.c (toplevel) [HAVE_TIMERFD]: Include errno.h.
|
||||
|
@ -63,6 +63,8 @@ macro before appending to it. */)
|
||||
{
|
||||
current_kboard->kbd_macro_buffer = xmalloc (30 * word_size);
|
||||
current_kboard->kbd_macro_bufsize = 30;
|
||||
current_kboard->kbd_macro_ptr = current_kboard->kbd_macro_buffer;
|
||||
current_kboard->kbd_macro_end = current_kboard->kbd_macro_buffer;
|
||||
}
|
||||
update_mode_lines = 19;
|
||||
if (NILP (append))
|
||||
|
80
src/xdisp.c
80
src/xdisp.c
@ -19337,6 +19337,12 @@ extend_face_to_end_of_line (struct it *it)
|
||||
it->face_id = saved_face_id;
|
||||
it->start_of_box_run_p = saved_box_start;
|
||||
}
|
||||
/* If stretch_width comes out negative, it means that the
|
||||
last glyph is only partially visible. In R2L rows, we
|
||||
want the leftmost glyph to be partially visible, so we
|
||||
need to give the row the corresponding left offset. */
|
||||
if (stretch_width < 0)
|
||||
it->glyph_row->x = stretch_width;
|
||||
}
|
||||
#endif /* HAVE_WINDOW_SYSTEM */
|
||||
}
|
||||
@ -19963,6 +19969,7 @@ display_line (struct it *it)
|
||||
int cvpos;
|
||||
ptrdiff_t min_pos = ZV + 1, max_pos = 0;
|
||||
ptrdiff_t min_bpos IF_LINT (= 0), max_bpos IF_LINT (= 0);
|
||||
bool pending_handle_line_prefix = false;
|
||||
|
||||
/* We always start displaying at hpos zero even if hscrolled. */
|
||||
eassert (it->hpos == 0 && it->current_x == 0);
|
||||
@ -20023,12 +20030,22 @@ display_line (struct it *it)
|
||||
min_pos = CHARPOS (this_line_min_pos);
|
||||
min_bpos = BYTEPOS (this_line_min_pos);
|
||||
}
|
||||
else if (it->area == TEXT_AREA)
|
||||
{
|
||||
/* We only do this when not calling move_it_in_display_line_to
|
||||
above, because that function calls itself handle_line_prefix. */
|
||||
handle_line_prefix (it);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* We only do this when not calling `move_it_in_display_line_to'
|
||||
above, because move_it_in_display_line_to calls
|
||||
handle_line_prefix itself. */
|
||||
handle_line_prefix (it);
|
||||
/* Line-prefix and wrap-prefix are always displayed in the text
|
||||
area. But if this is the first call to display_line after
|
||||
init_iterator, the iterator might have been set up to write
|
||||
into a marginal area, e.g. if the line begins with some
|
||||
display property that writes to the margins. So we need to
|
||||
wait with the call to handle_line_prefix until whatever
|
||||
writes to the margin has done its job. */
|
||||
pending_handle_line_prefix = true;
|
||||
}
|
||||
|
||||
/* Get the initial row height. This is either the height of the
|
||||
@ -20161,6 +20178,14 @@ display_line (struct it *it)
|
||||
row->extra_line_spacing = max (row->extra_line_spacing,
|
||||
it->max_extra_line_spacing);
|
||||
set_iterator_to_next (it, 1);
|
||||
/* If we didn't handle the line/wrap prefix above, and the
|
||||
call to set_iterator_to_next just switched to TEXT_AREA,
|
||||
process the prefix now. */
|
||||
if (it->area == TEXT_AREA && pending_handle_line_prefix)
|
||||
{
|
||||
pending_handle_line_prefix = false;
|
||||
handle_line_prefix (it);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -20190,7 +20215,12 @@ display_line (struct it *it)
|
||||
it->max_phys_ascent + it->max_phys_descent);
|
||||
row->extra_line_spacing = max (row->extra_line_spacing,
|
||||
it->max_extra_line_spacing);
|
||||
if (it->current_x - it->pixel_width < it->first_visible_x)
|
||||
if (it->current_x - it->pixel_width < it->first_visible_x
|
||||
/* In R2L rows, we arrange in extend_face_to_end_of_line
|
||||
to add a right offset to the line, by a suitable
|
||||
change to the stretch glyph that is the leftmost
|
||||
glyph of the line. */
|
||||
&& !row->reversed_p)
|
||||
row->x = x - it->first_visible_x;
|
||||
/* Record the maximum and minimum buffer positions seen so
|
||||
far in glyphs that will be displayed by this row. */
|
||||
@ -20204,7 +20234,13 @@ display_line (struct it *it)
|
||||
|
||||
for (i = 0; i < nglyphs; ++i, x = new_x)
|
||||
{
|
||||
glyph = row->glyphs[TEXT_AREA] + n_glyphs_before + i;
|
||||
/* Identify the glyphs added by the last call to
|
||||
PRODUCE_GLYPHS. In R2L rows, they are prepended to
|
||||
the previous glyphs. */
|
||||
if (!row->reversed_p)
|
||||
glyph = row->glyphs[TEXT_AREA] + n_glyphs_before + i;
|
||||
else
|
||||
glyph = row->glyphs[TEXT_AREA] + nglyphs - 1 - i;
|
||||
new_x = x + glyph->pixel_width;
|
||||
|
||||
if (/* Lines are continued. */
|
||||
@ -20404,10 +20440,20 @@ display_line (struct it *it)
|
||||
if (it->bidi_p)
|
||||
RECORD_MAX_MIN_POS (it);
|
||||
|
||||
if (x < it->first_visible_x)
|
||||
if (x < it->first_visible_x && !row->reversed_p)
|
||||
/* Glyph is partially visible, i.e. row starts at
|
||||
negative X position. */
|
||||
negative X position. Don't do that in R2L
|
||||
rows, where we arrange to add a right offset to
|
||||
the line in extend_face_to_end_of_line, by a
|
||||
suitable change to the stretch glyph that is
|
||||
the leftmost glyph of the line. */
|
||||
row->x = x - it->first_visible_x;
|
||||
/* When the last glyph of an R2L row only fits
|
||||
partially on the line, we need to set row->x to a
|
||||
negative offset, so that the leftmost glyph is
|
||||
the one that is partially visible. */
|
||||
if (row->reversed_p && new_x > it->last_visible_x)
|
||||
row->x = it->last_visible_x - new_x;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -25305,6 +25351,24 @@ append_stretch_glyph (struct it *it, Lisp_Object object,
|
||||
for (g = glyph - 1; g >= it->glyph_row->glyphs[area]; g--)
|
||||
g[1] = *g;
|
||||
glyph = it->glyph_row->glyphs[area];
|
||||
|
||||
/* Decrease the width of the first glyph of the row that
|
||||
begins before first_visible_x (e.g., due to hscroll).
|
||||
This is so the overall width of the row becomes smaller
|
||||
by the scroll amount, and the stretch glyph appended by
|
||||
extend_face_to_end_of_line will be wider, to shift the
|
||||
row glyphs to the right. (In L2R rows, the corresponding
|
||||
left-shift effect is accomplished by setting row->x to a
|
||||
negative value, which won't work with R2L rows.)
|
||||
|
||||
This must leave us with a positive value of WIDTH, since
|
||||
otherwise the call to move_it_in_display_line_to at the
|
||||
beginning of display_line would have got past the entire
|
||||
first glyph, and then it->current_x would have been
|
||||
greater or equal to it->first_visible_x. */
|
||||
if (it->current_x < it->first_visible_x)
|
||||
width -= it->first_visible_x - it->current_x;
|
||||
eassert (width > 0);
|
||||
}
|
||||
glyph->charpos = CHARPOS (it->position);
|
||||
glyph->object = object;
|
||||
|
Loading…
Reference in New Issue
Block a user