aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPo Lu2022-03-04 00:52:18 +0000
committerPo Lu2022-03-04 00:52:18 +0000
commit18868de46340ce8a1b2c2a1d9d81364530509e98 (patch)
treed7c0dbfeb0f5e80a9072f93d4a9d208e713dac75 /src
parentaeb25f9d3d12a18ef3881e23b32a34615355d4d0 (diff)
parent29ff903bb0379f6fef0f7dc60977e05a8c60f147 (diff)
downloademacs-18868de46340ce8a1b2c2a1d9d81364530509e98.tar.gz
emacs-18868de46340ce8a1b2c2a1d9d81364530509e98.zip
Merge from origin/emacs-28
29ff903bb0 Avoid crashes when fringe bitmaps are defined in daemon mode 92e2d19fe7 One more fix of the BPA implementation cd51d9c7ab Fix handling of brackets in BPA
Diffstat (limited to 'src')
-rw-r--r--src/bidi.c5
-rw-r--r--src/dispextern.h3
-rw-r--r--src/fringe.c17
-rw-r--r--src/w32term.c15
-rw-r--r--src/xterm.c14
5 files changed, 51 insertions, 3 deletions
diff --git a/src/bidi.c b/src/bidi.c
index 16faf655b26..dfe21c86d6d 100644
--- a/src/bidi.c
+++ b/src/bidi.c
@@ -2758,6 +2758,7 @@ bidi_find_bracket_pairs (struct bidi_it *bidi_it)
2758 (which requires the display engine to copy the cache back and 2758 (which requires the display engine to copy the cache back and
2759 forth many times). */ 2759 forth many times). */
2760 if (maxlevel == base_level 2760 if (maxlevel == base_level
2761 && (l2r_seen || r2l_seen) /* N0d */
2761 && ((base_level == 0 && !r2l_seen) 2762 && ((base_level == 0 && !r2l_seen)
2762 || (base_level == 1 && !l2r_seen))) 2763 || (base_level == 1 && !l2r_seen)))
2763 { 2764 {
@@ -2924,7 +2925,8 @@ bidi_resolve_brackets (struct bidi_it *bidi_it)
2924 eassert (bidi_it->bracket_pairing_pos > bidi_it->charpos); 2925 eassert (bidi_it->bracket_pairing_pos > bidi_it->charpos);
2925 if (bidi_it->bracket_enclosed_type == embedding_type) /* N0b */ 2926 if (bidi_it->bracket_enclosed_type == embedding_type) /* N0b */
2926 type = embedding_type; 2927 type = embedding_type;
2927 else 2928 else if (bidi_it->bracket_enclosed_type == STRONG_L /* N0c, N0d */
2929 || bidi_it->bracket_enclosed_type == STRONG_R)
2928 { 2930 {
2929 switch (bidi_it->prev_for_neutral.type) 2931 switch (bidi_it->prev_for_neutral.type)
2930 { 2932 {
@@ -2944,6 +2946,7 @@ bidi_resolve_brackets (struct bidi_it *bidi_it)
2944 break; 2946 break;
2945 default: 2947 default:
2946 /* N0d: Do not set the type for that bracket pair. */ 2948 /* N0d: Do not set the type for that bracket pair. */
2949 /* (Actuallly, this shouldn't happen.) */
2947 break; 2950 break;
2948 } 2951 }
2949 } 2952 }
diff --git a/src/dispextern.h b/src/dispextern.h
index f7755acd96b..b7cfde70339 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -3488,6 +3488,9 @@ bool update_window_fringes (struct window *, bool);
3488 3488
3489void gui_init_fringe (struct redisplay_interface *); 3489void gui_init_fringe (struct redisplay_interface *);
3490 3490
3491extern int max_used_fringe_bitmap;
3492void gui_define_fringe_bitmap (struct frame *, int);
3493
3491#ifdef HAVE_NTGUI 3494#ifdef HAVE_NTGUI
3492void w32_reset_fringes (void); 3495void w32_reset_fringes (void);
3493#endif 3496#endif
diff --git a/src/fringe.c b/src/fringe.c
index 4ea368d215b..bc4e0f1f136 100644
--- a/src/fringe.c
+++ b/src/fringe.c
@@ -1823,6 +1823,23 @@ gui_init_fringe (struct redisplay_interface *rif)
1823 } 1823 }
1824} 1824}
1825 1825
1826/* Call frame F's specific define_fringe_bitmap method for a fringe
1827 bitmap number N. Called by various *term.c functions when they
1828 need to display a fringe bitmap whose terminal-specific data is not
1829 available. */
1830void
1831gui_define_fringe_bitmap (struct frame *f, int n)
1832{
1833 struct redisplay_interface *rif = FRAME_RIF (f);
1834
1835 if (!rif || !rif->define_fringe_bitmap || n >= max_used_fringe_bitmap)
1836 return;
1837
1838 struct fringe_bitmap *fb = fringe_bitmaps[n];
1839 if (fb)
1840 rif->define_fringe_bitmap (n, fb->bits, fb->height, fb->width);
1841}
1842
1826#ifdef HAVE_NTGUI 1843#ifdef HAVE_NTGUI
1827void 1844void
1828w32_reset_fringes (void) 1845w32_reset_fringes (void)
diff --git a/src/w32term.c b/src/w32term.c
index 78777f153c0..9094843f60f 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -794,12 +794,25 @@ w32_draw_fringe_bitmap (struct window *w, struct glyph_row *row,
794 w32_fill_area (f, hdc, face->background, 794 w32_fill_area (f, hdc, face->background,
795 p->bx, p->by, p->nx, p->ny); 795 p->bx, p->by, p->nx, p->ny);
796 796
797 if (p->which && p->which < max_fringe_bmp) 797 if (p->which
798 && p->which < max_fringe_bmp
799 && p->which < max_used_fringe_bitmap)
798 { 800 {
799 HBITMAP pixmap = fringe_bmp[p->which]; 801 HBITMAP pixmap = fringe_bmp[p->which];
800 HDC compat_hdc; 802 HDC compat_hdc;
801 HANDLE horig_obj; 803 HANDLE horig_obj;
802 804
805 if (!fringe_bmp[p->which])
806 {
807 /* This fringe bitmap is known to fringe.c, but lacks the
808 HBITMAP data which shadows that bitmap. This is typical
809 to define-fringe-bitmap being called when the selected
810 frame was not a GUI frame, for example, when packages
811 that define fringe bitmaps are loaded by a daemon Emacs.
812 Create the missing HBITMAP now. */
813 gui_define_fringe_bitmap (f, p->which);
814 }
815
803 compat_hdc = CreateCompatibleDC (hdc); 816 compat_hdc = CreateCompatibleDC (hdc);
804 817
805 SaveDC (hdc); 818 SaveDC (hdc);
diff --git a/src/xterm.c b/src/xterm.c
index b6c200a27a0..2563fb31a5e 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -2640,7 +2640,9 @@ x_draw_fringe_bitmap (struct window *w, struct glyph_row *row, struct draw_fring
2640 } 2640 }
2641 2641
2642#ifdef USE_CAIRO 2642#ifdef USE_CAIRO
2643 if (p->which && p->which < max_fringe_bmp) 2643 if (p->which
2644 && p->which < max_fringe_bmp
2645 && p->which < max_used_fringe_bitmap)
2644 { 2646 {
2645 XGCValues gcv; 2647 XGCValues gcv;
2646 2648
@@ -2650,6 +2652,16 @@ x_draw_fringe_bitmap (struct window *w, struct glyph_row *row, struct draw_fring
2650 : f->output_data.x->cursor_pixel) 2652 : f->output_data.x->cursor_pixel)
2651 : face->foreground)); 2653 : face->foreground));
2652 XSetBackground (display, gc, face->background); 2654 XSetBackground (display, gc, face->background);
2655 if (!fringe_bmp[p->which])
2656 {
2657 /* This fringe bitmap is known to fringe.c, but lacks the
2658 cairo_pattern_t pattern which shadows that bitmap. This
2659 is typical to define-fringe-bitmap being called when the
2660 selected frame was not a GUI frame, for example, when
2661 packages that define fringe bitmaps are loaded by a
2662 daemon Emacs. Create the missing pattern now. */
2663 gui_define_fringe_bitmap (f, p->which);
2664 }
2653 x_cr_draw_image (f, gc, fringe_bmp[p->which], 0, p->dh, 2665 x_cr_draw_image (f, gc, fringe_bmp[p->which], 0, p->dh,
2654 p->wd, p->h, p->x, p->y, p->overlay_p); 2666 p->wd, p->h, p->x, p->y, p->overlay_p);
2655 XSetForeground (display, gc, gcv.foreground); 2667 XSetForeground (display, gc, gcv.foreground);