aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorRobert Pluim2020-03-16 17:21:02 +0100
committerRobert Pluim2020-03-17 16:58:09 +0100
commit5747a59a886e16fadbd04c385c43628b1d8f50df (patch)
tree0bc7cffa4d127fa213af9b13d7c050cc2c8e7b1b /src
parenta2dd8c4234c9a858e273ea22129962cee58fa4ce (diff)
downloademacs-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.h3
-rw-r--r--src/frame.c12
-rw-r--r--src/nsterm.m10
-rw-r--r--src/w32fns.c2
-rw-r--r--src/w32term.c3
-rw-r--r--src/w32term.h4
-rw-r--r--src/xfns.c2
-rw-r--r--src/xterm.c3
-rw-r--r--src/xterm.h1
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. */
5138static void
5139ns_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
5752static void 5752void
5753w32_default_font_parameter (struct frame *f, Lisp_Object parms) 5753w32_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
7255static void w32_delete_terminal (struct terminal *term); 7256static 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);
267extern const char *w32_get_string_resource (void *v_rdb, 267extern 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 */
272extern 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
3558static void 3558void
3559x_default_font_parameter (struct frame *f, Lisp_Object parms) 3559x_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);
1059extern void x_default_font_parameter (struct frame* f, Lisp_Object parms);
1059 1060
1060/* From xrdb.c. */ 1061/* From xrdb.c. */
1061 1062