]> git.eshelyaron.com Git - emacs.git/commitdiff
Recalculate default font when switching font backend
authorRobert Pluim <rpluim@gmail.com>
Mon, 16 Mar 2020 16:21:02 +0000 (17:21 +0100)
committerRobert Pluim <rpluim@gmail.com>
Tue, 17 Mar 2020 15:58:09 +0000 (16:58 +0100)
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.

src/dispextern.h
src/frame.c
src/nsterm.m
src/w32fns.c
src/w32term.c
src/w32term.h
src/xfns.c
src/xterm.c
src/xterm.h

index 6246c7c08083cb40a8f774418a4c61cce2c9697a..724aad4227e3e212b6fecfaeaea594407b854338 100644 (file)
@@ -3003,6 +3003,9 @@ struct redisplay_interface
   /* Cancel hourglass cursor on frame F.  */
   void (*hide_hourglass) (struct frame *f);
 
+  /* Called to (re)calculate the default face when changing the font
+     backend.  */
+  void (*default_font_parameter) (struct frame *f, Lisp_Object parms);
 #endif /* HAVE_WINDOW_SYSTEM */
 };
 
index 88d6f22fc0a5c50e187b1617da9eb218f44c7f85..ecf175f4f993525b58673cbc9e007a65270eb7ff 100644 (file)
@@ -4565,7 +4565,11 @@ gui_set_font_backend (struct frame *f, Lisp_Object new_value, Lisp_Object old_va
     return;
 
   if (FRAME_FONT (f))
-    free_all_realized_faces (Qnil);
+    {
+      Lisp_Object frame;
+      XSETFRAME (frame, f);
+      free_all_realized_faces (frame);
+    }
 
   new_value = font_update_drivers (f, NILP (new_value) ? Qt : new_value);
   if (NILP (new_value))
@@ -4579,10 +4583,8 @@ gui_set_font_backend (struct frame *f, Lisp_Object new_value, Lisp_Object old_va
 
   if (FRAME_FONT (f))
     {
-      Lisp_Object frame;
-
-      XSETFRAME (frame, f);
-      gui_set_font (f, Fframe_parameter (frame, Qfont), Qnil);
+      /* Reconsider default font after backend(s) change (Bug#23386).  */
+      FRAME_RIF(f)->default_font_parameter (f, Qnil);
       face_change = true;
       windows_or_buffers_changed = 18;
     }
index ed2d82ceaef9b1f5bbdd0ec41063d7330d6c116a..e92e3d5a6f50834524c1a7dd7f7a09938665a669 100644 (file)
@@ -5132,6 +5132,13 @@ ns_initialize_display_info (struct ns_display_info *dpyinfo)
     reset_mouse_highlight (&dpyinfo->mouse_highlight);
 }
 
+/* This currently does nothing, since it's only really needed when
+   changing the font-backend, but macOS currently only has one
+   possible backend.  This may change if we add HarfBuzz support.  */
+static void
+ns_default_font_parameter (struct frame *f, Lisp_Object parms)
+{
+}
 
 /* This and next define (many of the) public functions in this file.  */
 /* 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 =
   ns_draw_window_divider,
   ns_shift_glyphs_for_insert,
   ns_show_hourglass,
-  ns_hide_hourglass
+  ns_hide_hourglass,
+  ns_default_font_parameter
 };
 
 
index 61e22e5700964ee434ef6cbbd04a0418a226f3e4..2f01fb52e923394844a988ecdafa1b61f22cef3d 100644 (file)
@@ -5749,7 +5749,7 @@ do_unwind_create_frame (Lisp_Object frame)
   unwind_create_frame (frame);
 }
 
-static void
+void
 w32_default_font_parameter (struct frame *f, Lisp_Object parms)
 {
   struct w32_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
index f515f5604d6c676ead5f0e1d93558173cfaddc69..76cf6bd6964a842f2d76cb70a41232428690243d 100644 (file)
@@ -7249,7 +7249,8 @@ static struct redisplay_interface w32_redisplay_interface =
   w32_draw_window_divider,
   w32_shift_glyphs_for_insert,
   w32_show_hourglass,
-  w32_hide_hourglass
+  w32_hide_hourglass,
+  w32_default_font_parameter
 };
 
 static void w32_delete_terminal (struct terminal *term);
index 737764b8942a4fa150fd045ab5946155e1de362a..f8a8a727e8ac2a91ca0dd7a3c74d9381149ee020 100644 (file)
@@ -267,6 +267,10 @@ extern void w32con_show_cursor (void);
 extern const char *w32_get_string_resource (void *v_rdb,
                                             const char *name,
                                             const char *class);
+
+/* w32fns.c */
+extern void w32_default_font_parameter (struct frame* f, Lisp_Object parms);
+
 \f
 #define PIX_TYPE COLORREF
 
index 276ea1c39353179d1ca5e9a688c0028888452cb1..afe1ceef81afe4d1a5d7736482ae900d87e855c5 100644 (file)
@@ -3555,7 +3555,7 @@ do_unwind_create_frame (Lisp_Object frame)
   unwind_create_frame (frame);
 }
 
-static void
+void
 x_default_font_parameter (struct frame *f, Lisp_Object parms)
 {
   struct x_display_info *dpyinfo = FRAME_DISPLAY_INFO (f);
index 21d99f0c7bbc8c7acb8f270123e0187e231aad99..2ba3c009402f44c0bd8ca4e8fa9607322a5dcef2 100644 (file)
@@ -13374,7 +13374,8 @@ static struct redisplay_interface x_redisplay_interface =
     x_draw_window_divider,
     x_shift_glyphs_for_insert, /* Never called; see comment in function.  */
     x_show_hourglass,
-    x_hide_hourglass
+    x_hide_hourglass,
+    x_default_font_parameter
   };
 
 
index 51e75890b60dab1b1dbb16bea5c4a2d9e3e7824e..bc10043c54c1eaaab844e541da80951a5683bb59 100644 (file)
@@ -1056,6 +1056,7 @@ extern void x_real_pos_and_offsets (struct frame *f,
                                     int *xptr,
                                     int *yptr,
                                     int *outer_border);
+extern void x_default_font_parameter (struct frame* f, Lisp_Object parms);
 
 /* From xrdb.c.  */