summaryrefslogtreecommitdiff
path: root/src/xterm.c
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2022-03-03 20:31:33 +0200
committerEli Zaretskii <eliz@gnu.org>2022-03-03 20:31:33 +0200
commit29ff903bb0379f6fef0f7dc60977e05a8c60f147 (patch)
tree3d59d3c4a0bb8e4f0902bccd431c9de26d9299dd /src/xterm.c
parent92e2d19fe787ce73db15d1549880b54743c0d929 (diff)
downloademacs-29ff903bb0379f6fef0f7dc60977e05a8c60f147.tar.gz
Avoid crashes when fringe bitmaps are defined in daemon mode
* src/dispextern.h (gui_define_fringe_bitmap): Add prototype. (max_used_fringe_bitmap): Add declaration. * src/fringe.c (gui_define_fringe_bitmap): New function. * src/w32term.c (w32_draw_fringe_bitmap): * src/xterm.c (x_draw_fringe_bitmap) [USE_CAIRO]: Call 'gui_define_fringe_bitmap' if the terminal-specific bitmap data is not available when a fringe bitmap is about to be drawn. Don't try to draw a bitmap that is not known to fringe.c. (Bug#54183)
Diffstat (limited to 'src/xterm.c')
-rw-r--r--src/xterm.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/xterm.c b/src/xterm.c
index 59413eafd48..9a8c3e9ad76 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -1426,7 +1426,9 @@ x_draw_fringe_bitmap (struct window *w, struct glyph_row *row, struct draw_fring
}
#ifdef USE_CAIRO
- if (p->which && p->which < max_fringe_bmp)
+ if (p->which
+ && p->which < max_fringe_bmp
+ && p->which < max_used_fringe_bitmap)
{
XGCValues gcv;
@@ -1436,6 +1438,16 @@ x_draw_fringe_bitmap (struct window *w, struct glyph_row *row, struct draw_fring
: f->output_data.x->cursor_pixel)
: face->foreground));
XSetBackground (display, gc, face->background);
+ if (!fringe_bmp[p->which])
+ {
+ /* This fringe bitmap is known to fringe.c, but lacks the
+ cairo_pattern_t pattern which shadows that bitmap. This
+ is typical to define-fringe-bitmap being called when the
+ selected frame was not a GUI frame, for example, when
+ packages that define fringe bitmaps are loaded by a
+ daemon Emacs. Create the missing pattern now. */
+ gui_define_fringe_bitmap (f, p->which);
+ }
x_cr_draw_image (f, gc, fringe_bmp[p->which], 0, p->dh,
p->wd, p->h, p->x, p->y, p->overlay_p);
XSetForeground (display, gc, gcv.foreground);