diff options
| author | Robert Pluim | 2020-03-16 17:21:02 +0100 |
|---|---|---|
| committer | Robert Pluim | 2020-03-17 16:58:09 +0100 |
| commit | 5747a59a886e16fadbd04c385c43628b1d8f50df (patch) | |
| tree | 0bc7cffa4d127fa213af9b13d7c050cc2c8e7b1b /src | |
| parent | a2dd8c4234c9a858e273ea22129962cee58fa4ce (diff) | |
| download | emacs-5747a59a886e16fadbd04c385c43628b1d8f50df.tar.gz emacs-5747a59a886e16fadbd04c385c43628b1d8f50df.zip | |
Recalculate default font when switching font backend
This is an updated version of the patch by Dmitry Antipov
<dmantipov@yandex.ru> in
<https://debbugs.gnu.org/cgi/bugreport.cgi?bug=23386#43>.
Fixes Bug#23386
* src/dispextern.h (struct redisplay_interface): New member
default_font_parameter.
* src/xterm.h: Add prototype for x_default_font_parameter.
* src/xterm.c (x_redisplay_interface): Initialize
default_font_parameter member.
* src/xfns.c (x_default_font_parameter): Make non-static.
* src/w32term.h: Add prototype for w32_default_font_parameter
* src/w32fns.c (w32_default_font_parameter): Make non-static.
* src/w32term.c (w32_redisplay_interface): Initialize
default_font_parameter member.
* src/nsterm.m (ns_redisplay_interface): Add dummy
ns_default_font_parameter (there is currently only one possible font
backend on macOS). Initialize default_font_parameter member.
* src/frame.c (gui_set_font_backend): Recalculate default font using
RIF default_font_parameter to avoid crash when changing font backend.
Diffstat (limited to 'src')
| -rw-r--r-- | src/dispextern.h | 3 | ||||
| -rw-r--r-- | src/frame.c | 12 | ||||
| -rw-r--r-- | src/nsterm.m | 10 | ||||
| -rw-r--r-- | src/w32fns.c | 2 | ||||
| -rw-r--r-- | src/w32term.c | 3 | ||||
| -rw-r--r-- | src/w32term.h | 4 | ||||
| -rw-r--r-- | src/xfns.c | 2 | ||||
| -rw-r--r-- | src/xterm.c | 3 | ||||
| -rw-r--r-- | src/xterm.h | 1 |
9 files changed, 30 insertions, 10 deletions
diff --git a/src/dispextern.h b/src/dispextern.h index 6246c7c0808..724aad4227e 100644 --- a/src/dispextern.h +++ b/src/dispextern.h | |||
| @@ -3003,6 +3003,9 @@ struct redisplay_interface | |||
| 3003 | /* Cancel hourglass cursor on frame F. */ | 3003 | /* Cancel hourglass cursor on frame F. */ |
| 3004 | void (*hide_hourglass) (struct frame *f); | 3004 | void (*hide_hourglass) (struct frame *f); |
| 3005 | 3005 | ||
| 3006 | /* Called to (re)calculate the default face when changing the font | ||
| 3007 | backend. */ | ||
| 3008 | void (*default_font_parameter) (struct frame *f, Lisp_Object parms); | ||
| 3006 | #endif /* HAVE_WINDOW_SYSTEM */ | 3009 | #endif /* HAVE_WINDOW_SYSTEM */ |
| 3007 | }; | 3010 | }; |
| 3008 | 3011 | ||
diff --git a/src/frame.c b/src/frame.c index 88d6f22fc0a..ecf175f4f99 100644 --- a/src/frame.c +++ b/src/frame.c | |||
| @@ -4565,7 +4565,11 @@ gui_set_font_backend (struct frame *f, Lisp_Object new_value, Lisp_Object old_va | |||
| 4565 | return; | 4565 | return; |
| 4566 | 4566 | ||
| 4567 | if (FRAME_FONT (f)) | 4567 | if (FRAME_FONT (f)) |
| 4568 | free_all_realized_faces (Qnil); | 4568 | { |
| 4569 | Lisp_Object frame; | ||
| 4570 | XSETFRAME (frame, f); | ||
| 4571 | free_all_realized_faces (frame); | ||
| 4572 | } | ||
| 4569 | 4573 | ||
| 4570 | new_value = font_update_drivers (f, NILP (new_value) ? Qt : new_value); | 4574 | new_value = font_update_drivers (f, NILP (new_value) ? Qt : new_value); |
| 4571 | if (NILP (new_value)) | 4575 | if (NILP (new_value)) |
| @@ -4579,10 +4583,8 @@ gui_set_font_backend (struct frame *f, Lisp_Object new_value, Lisp_Object old_va | |||
| 4579 | 4583 | ||
| 4580 | if (FRAME_FONT (f)) | 4584 | if (FRAME_FONT (f)) |
| 4581 | { | 4585 | { |
| 4582 | Lisp_Object frame; | 4586 | /* Reconsider default font after backend(s) change (Bug#23386). */ |
| 4583 | 4587 | FRAME_RIF(f)->default_font_parameter (f, Qnil); | |
| 4584 | XSETFRAME (frame, f); | ||
| 4585 | gui_set_font (f, Fframe_parameter (frame, Qfont), Qnil); | ||
| 4586 | face_change = true; | 4588 | face_change = true; |
| 4587 | windows_or_buffers_changed = 18; | 4589 | windows_or_buffers_changed = 18; |
| 4588 | } | 4590 | } |
diff --git a/src/nsterm.m b/src/nsterm.m index ed2d82ceaef..e92e3d5a6f5 100644 --- a/src/nsterm.m +++ b/src/nsterm.m | |||
| @@ -5132,6 +5132,13 @@ ns_initialize_display_info (struct ns_display_info *dpyinfo) | |||
| 5132 | reset_mouse_highlight (&dpyinfo->mouse_highlight); | 5132 | reset_mouse_highlight (&dpyinfo->mouse_highlight); |
| 5133 | } | 5133 | } |
| 5134 | 5134 | ||
| 5135 | /* This currently does nothing, since it's only really needed when | ||
| 5136 | changing the font-backend, but macOS currently only has one | ||
| 5137 | possible backend. This may change if we add HarfBuzz support. */ | ||
| 5138 | static void | ||
| 5139 | ns_default_font_parameter (struct frame *f, Lisp_Object parms) | ||
| 5140 | { | ||
| 5141 | } | ||
| 5135 | 5142 | ||
| 5136 | /* This and next define (many of the) public functions in this file. */ | 5143 | /* This and next define (many of the) public functions in this file. */ |
| 5137 | /* gui_* are generic versions in xdisp.c that we, and other terms, get away | 5144 | /* gui_* are generic versions in xdisp.c that we, and other terms, get away |
| @@ -5167,7 +5174,8 @@ static struct redisplay_interface ns_redisplay_interface = | |||
| 5167 | ns_draw_window_divider, | 5174 | ns_draw_window_divider, |
| 5168 | ns_shift_glyphs_for_insert, | 5175 | ns_shift_glyphs_for_insert, |
| 5169 | ns_show_hourglass, | 5176 | ns_show_hourglass, |
| 5170 | ns_hide_hourglass | 5177 | ns_hide_hourglass, |
| 5178 | ns_default_font_parameter | ||
| 5171 | }; | 5179 | }; |
| 5172 | 5180 | ||
| 5173 | 5181 | ||
diff --git a/src/w32fns.c b/src/w32fns.c index 61e22e57009..2f01fb52e92 100644 --- a/src/w32fns.c +++ b/src/w32fns.c | |||
| @@ -5749,7 +5749,7 @@ do_unwind_create_frame (Lisp_Object frame) | |||
| 5749 | unwind_create_frame (frame); | 5749 | unwind_create_frame (frame); |
| 5750 | } | 5750 | } |
| 5751 | 5751 | ||
| 5752 | static void | 5752 | void |
| 5753 | w32_default_font_parameter (struct frame *f, Lisp_Object parms) | 5753 | w32_default_font_parameter (struct frame *f, Lisp_Object parms) |
| 5754 | { | 5754 | { |
| 5755 | struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); | 5755 | struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); |
diff --git a/src/w32term.c b/src/w32term.c index f515f5604d6..76cf6bd6964 100644 --- a/src/w32term.c +++ b/src/w32term.c | |||
| @@ -7249,7 +7249,8 @@ static struct redisplay_interface w32_redisplay_interface = | |||
| 7249 | w32_draw_window_divider, | 7249 | w32_draw_window_divider, |
| 7250 | w32_shift_glyphs_for_insert, | 7250 | w32_shift_glyphs_for_insert, |
| 7251 | w32_show_hourglass, | 7251 | w32_show_hourglass, |
| 7252 | w32_hide_hourglass | 7252 | w32_hide_hourglass, |
| 7253 | w32_default_font_parameter | ||
| 7253 | }; | 7254 | }; |
| 7254 | 7255 | ||
| 7255 | static void w32_delete_terminal (struct terminal *term); | 7256 | static void w32_delete_terminal (struct terminal *term); |
diff --git a/src/w32term.h b/src/w32term.h index 737764b8942..f8a8a727e8a 100644 --- a/src/w32term.h +++ b/src/w32term.h | |||
| @@ -267,6 +267,10 @@ extern void w32con_show_cursor (void); | |||
| 267 | extern const char *w32_get_string_resource (void *v_rdb, | 267 | extern const char *w32_get_string_resource (void *v_rdb, |
| 268 | const char *name, | 268 | const char *name, |
| 269 | const char *class); | 269 | const char *class); |
| 270 | |||
| 271 | /* w32fns.c */ | ||
| 272 | extern void w32_default_font_parameter (struct frame* f, Lisp_Object parms); | ||
| 273 | |||
| 270 | 274 | ||
| 271 | #define PIX_TYPE COLORREF | 275 | #define PIX_TYPE COLORREF |
| 272 | 276 | ||
diff --git a/src/xfns.c b/src/xfns.c index 276ea1c3935..afe1ceef81a 100644 --- a/src/xfns.c +++ b/src/xfns.c | |||
| @@ -3555,7 +3555,7 @@ do_unwind_create_frame (Lisp_Object frame) | |||
| 3555 | unwind_create_frame (frame); | 3555 | unwind_create_frame (frame); |
| 3556 | } | 3556 | } |
| 3557 | 3557 | ||
| 3558 | static void | 3558 | void |
| 3559 | x_default_font_parameter (struct frame *f, Lisp_Object parms) | 3559 | x_default_font_parameter (struct frame *f, Lisp_Object parms) |
| 3560 | { | 3560 | { |
| 3561 | struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); | 3561 | struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f); |
diff --git a/src/xterm.c b/src/xterm.c index 21d99f0c7bb..2ba3c009402 100644 --- a/src/xterm.c +++ b/src/xterm.c | |||
| @@ -13374,7 +13374,8 @@ static struct redisplay_interface x_redisplay_interface = | |||
| 13374 | x_draw_window_divider, | 13374 | x_draw_window_divider, |
| 13375 | x_shift_glyphs_for_insert, /* Never called; see comment in function. */ | 13375 | x_shift_glyphs_for_insert, /* Never called; see comment in function. */ |
| 13376 | x_show_hourglass, | 13376 | x_show_hourglass, |
| 13377 | x_hide_hourglass | 13377 | x_hide_hourglass, |
| 13378 | x_default_font_parameter | ||
| 13378 | }; | 13379 | }; |
| 13379 | 13380 | ||
| 13380 | 13381 | ||
diff --git a/src/xterm.h b/src/xterm.h index 51e75890b60..bc10043c54c 100644 --- a/src/xterm.h +++ b/src/xterm.h | |||
| @@ -1056,6 +1056,7 @@ extern void x_real_pos_and_offsets (struct frame *f, | |||
| 1056 | int *xptr, | 1056 | int *xptr, |
| 1057 | int *yptr, | 1057 | int *yptr, |
| 1058 | int *outer_border); | 1058 | int *outer_border); |
| 1059 | extern void x_default_font_parameter (struct frame* f, Lisp_Object parms); | ||
| 1059 | 1060 | ||
| 1060 | /* From xrdb.c. */ | 1061 | /* From xrdb.c. */ |
| 1061 | 1062 | ||