diff options
| author | Po Lu | 2022-03-04 00:52:18 +0000 |
|---|---|---|
| committer | Po Lu | 2022-03-04 00:52:18 +0000 |
| commit | 18868de46340ce8a1b2c2a1d9d81364530509e98 (patch) | |
| tree | d7c0dbfeb0f5e80a9072f93d4a9d208e713dac75 /src | |
| parent | aeb25f9d3d12a18ef3881e23b32a34615355d4d0 (diff) | |
| parent | 29ff903bb0379f6fef0f7dc60977e05a8c60f147 (diff) | |
| download | emacs-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.c | 5 | ||||
| -rw-r--r-- | src/dispextern.h | 3 | ||||
| -rw-r--r-- | src/fringe.c | 17 | ||||
| -rw-r--r-- | src/w32term.c | 15 | ||||
| -rw-r--r-- | src/xterm.c | 14 |
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 | ||
| 3489 | void gui_init_fringe (struct redisplay_interface *); | 3489 | void gui_init_fringe (struct redisplay_interface *); |
| 3490 | 3490 | ||
| 3491 | extern int max_used_fringe_bitmap; | ||
| 3492 | void gui_define_fringe_bitmap (struct frame *, int); | ||
| 3493 | |||
| 3491 | #ifdef HAVE_NTGUI | 3494 | #ifdef HAVE_NTGUI |
| 3492 | void w32_reset_fringes (void); | 3495 | void 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. */ | ||
| 1830 | void | ||
| 1831 | gui_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 |
| 1827 | void | 1844 | void |
| 1828 | w32_reset_fringes (void) | 1845 | w32_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); |