Make sure buffer is live before retrieving underline properties (Bug#38038)

* src/window.h (WINDOW_BUFFER_LOCAL_VALUE): New macro.
* src/nsterm.m (ns_draw_text_decoration):
* src/w32term.c (w32_draw_glyph_string):
* src/xterm.c (x_draw_glyph_string): Make sure buffer is live
before retrieving underline properties from it (Bug#38038).
This commit is contained in:
Martin Rudalics 2019-11-12 16:44:30 +01:00
parent 6eaf62df20
commit 1e5392a4ae
4 changed files with 41 additions and 29 deletions

View file

@ -3435,19 +3435,22 @@ Note that CURSOR_WIDTH is meaningful only for (h)bar cursors.
unsigned long descent = s->y + s->height - s->ybase;
unsigned long minimum_offset;
BOOL underline_at_descent_line, use_underline_position_properties;
Lisp_Object val = buffer_local_value (Qunderline_minimum_offset,
s->w->contents);
if (FIXNUMP (val))
minimum_offset = XFIXNAT (val);
else
minimum_offset = 1;
val = buffer_local_value (Qx_underline_at_descent_line,
s->w->contents);
underline_at_descent_line = !(NILP (val) || EQ (val, Qunbound));
val = buffer_local_value (Qx_use_underline_position_properties,
s->w->contents);
use_underline_position_properties =
!(NILP (val) || EQ (val, Qunbound));
Lisp_Object val = (WINDOW_BUFFER_LOCAL_VALUE
(Qunderline_minimum_offset, s->w));
if (FIXNUMP (val))
minimum_offset = XFIXNAT (val);
else
minimum_offset = 1;
val = (WINDOW_BUFFER_LOCAL_VALUE
(Qx_underline_at_descent_line, s->w));
underline_at_descent_line = !(NILP (val) || EQ (val, Qunbound));
val = (WINDOW_BUFFER_LOCAL_VALUE
(Qx_use_underline_position_properties, s->w));
use_underline_position_properties
= !(NILP (val) || EQ (val, Qunbound));
/* Use underline thickness of font, defaulting to 1. */
thickness = (font && font->underline_thickness > 0)

View file

@ -2512,20 +2512,21 @@ w32_draw_glyph_string (struct glyph_string *s)
unsigned long minimum_offset;
BOOL underline_at_descent_line;
BOOL use_underline_position_properties;
Lisp_Object val
= buffer_local_value (Qunderline_minimum_offset,
s->w->contents);
Lisp_Object val = (WINDOW_BUFFER_LOCAL_VALUE
(Qunderline_minimum_offset, s->w));
if (FIXNUMP (val))
minimum_offset = max (0, XFIXNUM (val));
else
minimum_offset = 1;
val = buffer_local_value (Qx_underline_at_descent_line,
s->w->contents);
val = (WINDOW_BUFFER_LOCAL_VALUE
(Qx_underline_at_descent_line, s->w));
underline_at_descent_line
= !(NILP (val) || EQ (val, Qunbound));
val
= buffer_local_value (Qx_use_underline_position_properties,
s->w->contents);
val = (WINDOW_BUFFER_LOCAL_VALUE
(Qx_use_underline_position_properties, s->w));
use_underline_position_properties
= !(NILP (val) || EQ (val, Qunbound));

View file

@ -608,6 +608,13 @@ wset_next_buffers (struct window *w, Lisp_Object val)
? (W)->contents \
: Qnil)
/* Local value of variable V in window W's buffer. Nil if W has no
buffer. */
#define WINDOW_BUFFER_LOCAL_VALUE(V, W) \
(BUFFERP ((W)->contents) \
? buffer_local_value(V, (W)->contents) \
: Qnil)
/* Return the canonical column width of the frame of window W. */
#define WINDOW_FRAME_COLUMN_WIDTH(W) \
(FRAME_COLUMN_WIDTH (WINDOW_XFRAME ((W))))

View file

@ -3847,20 +3847,21 @@ x_draw_glyph_string (struct glyph_string *s)
unsigned long minimum_offset;
bool underline_at_descent_line;
bool use_underline_position_properties;
Lisp_Object val
= buffer_local_value (Qunderline_minimum_offset,
s->w->contents);
Lisp_Object val = (WINDOW_BUFFER_LOCAL_VALUE
(Qunderline_minimum_offset, s->w));
if (FIXNUMP (val))
minimum_offset = max (0, XFIXNUM (val));
else
minimum_offset = 1;
val = buffer_local_value (Qx_underline_at_descent_line,
s->w->contents);
val = (WINDOW_BUFFER_LOCAL_VALUE
(Qx_underline_at_descent_line, s->w));
underline_at_descent_line
= !(NILP (val) || EQ (val, Qunbound));
val
= buffer_local_value (Qx_use_underline_position_properties,
s->w->contents);
val = (WINDOW_BUFFER_LOCAL_VALUE
(Qx_use_underline_position_properties, s->w));
use_underline_position_properties
= !(NILP (val) || EQ (val, Qunbound));