emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

emacs-27 5747a59: Recalculate default font when switching font backend


From: Robert Pluim
Subject: emacs-27 5747a59: Recalculate default font when switching font backend
Date: Tue, 17 Mar 2020 12:05:22 -0400 (EDT)

branch: emacs-27
commit 5747a59a886e16fadbd04c385c43628b1d8f50df
Author: Robert Pluim <address@hidden>
Commit: Robert Pluim <address@hidden>

    Recalculate default font when switching font backend
    
    This is an updated version of the patch by Dmitry Antipov
    <address@hidden> 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 |  3 +++
 src/frame.c      | 12 +++++++-----
 src/nsterm.m     | 10 +++++++++-
 src/w32fns.c     |  2 +-
 src/w32term.c    |  3 ++-
 src/w32term.h    |  4 ++++
 src/xfns.c       |  2 +-
 src/xterm.c      |  3 ++-
 src/xterm.h      |  1 +
 9 files changed, 30 insertions(+), 10 deletions(-)

diff --git a/src/dispextern.h b/src/dispextern.h
index 6246c7c..724aad4 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -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 */
 };
 
diff --git a/src/frame.c b/src/frame.c
index 88d6f22..ecf175f 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
     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;
     }
diff --git a/src/nsterm.m b/src/nsterm.m
index ed2d82c..e92e3d5 100644
--- a/src/nsterm.m
+++ b/src/nsterm.m
@@ -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
 };
 
 
diff --git a/src/w32fns.c b/src/w32fns.c
index 61e22e5..2f01fb5 100644
--- a/src/w32fns.c
+++ b/src/w32fns.c
@@ -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);
diff --git a/src/w32term.c b/src/w32term.c
index f515f56..76cf6bd 100644
--- a/src/w32term.c
+++ b/src/w32term.c
@@ -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);
diff --git a/src/w32term.h b/src/w32term.h
index 737764b..f8a8a72 100644
--- a/src/w32term.h
+++ b/src/w32term.h
@@ -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);
+
 
 #define PIX_TYPE COLORREF
 
diff --git a/src/xfns.c b/src/xfns.c
index 276ea1c..afe1cee 100644
--- a/src/xfns.c
+++ b/src/xfns.c
@@ -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);
diff --git a/src/xterm.c b/src/xterm.c
index 21d99f0..2ba3c00 100644
--- a/src/xterm.c
+++ b/src/xterm.c
@@ -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
   };
 
 
diff --git a/src/xterm.h b/src/xterm.h
index 51e7589..bc10043 100644
--- a/src/xterm.h
+++ b/src/xterm.h
@@ -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.  */
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]