diff options
author | Eli Zaretskii <eliz@gnu.org> | 2022-03-03 20:31:33 +0200 |
---|---|---|
committer | Eli Zaretskii <eliz@gnu.org> | 2022-03-03 20:31:33 +0200 |
commit | 29ff903bb0379f6fef0f7dc60977e05a8c60f147 (patch) | |
tree | 3d59d3c4a0bb8e4f0902bccd431c9de26d9299dd /src/xterm.c | |
parent | 92e2d19fe787ce73db15d1549880b54743c0d929 (diff) | |
download | emacs-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.c | 14 |
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); |