From 76a1e8a279b7e1cf98e321b6c06a2bf415393a7a Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Sat, 3 Feb 2018 17:57:41 -0500 Subject: [PATCH] Fix theme/font init in daemon Emacs Possibly addresses #399 and #400 --- core/core-ui.el | 66 ++++++++++++++++++++++++------------------------- 1 file changed, 32 insertions(+), 34 deletions(-) diff --git a/core/core-ui.el b/core/core-ui.el index feb651fab..c1c297518 100644 --- a/core/core-ui.el +++ b/core/core-ui.el @@ -433,53 +433,51 @@ character that looks like a space that `whitespace-mode' won't affect.") ;; Theme & font ;; -(defun doom|init-theme (&optional frame) +(defun doom|init-theme () "Set the theme and load the font, in that order." - (with-selected-frame (or frame (selected-frame)) - (when (and (not (daemonp)) (symbolp doom-theme)) - (load-theme doom-theme t)) - (add-hook 'after-make-frame-functions #'doom|init-theme-in-daemon) - (run-hooks 'doom-init-theme-hook))) + (when doom-theme + (load-theme doom-theme t)) + (add-hook 'after-make-frame-functions #'doom|init-theme-in-frame) + (run-hooks 'doom-init-theme-hook)) (defun doom|init-fonts (&optional frame) "Initialize fonts." (add-hook 'after-make-frame-functions #'doom|init-fonts) - (if (not frame) - (when (fontp doom-font) - (map-put default-frame-alist 'font (font-xlfd-name doom-font))) - (when (display-graphic-p) - (or frame (setq frame (selected-frame))) - (condition-case-unless-debug ex - (progn - (when (fontp doom-font) - (set-face-attribute 'fixed-pitch frame :font doom-font)) - ;; Fallback to `doom-unicode-font' for Unicode characters - (when (fontp doom-unicode-font) - (set-fontset-font t 'unicode doom-unicode-font frame)) - ;; ...and for variable-pitch-mode: - (when (fontp doom-variable-pitch-font) - (set-face-attribute 'variable-pitch frame :font doom-variable-pitch-font))) - ('error - (if (string-prefix-p "Font not available: " (error-message-string ex)) - (lwarn 'doom-ui :warning - "Could not find the '%s' font on your system, falling back to system font" - (font-get (caddr ex) :family)) - (lwarn 'doom-ui :error - "Unexpected error while initializing fonts: %s" - (error-message-string ex)))))))) + (when (fontp doom-font) + (map-put default-frame-alist 'font (font-xlfd-name doom-font))) + (when (display-graphic-p) + (or frame (setq frame (selected-frame))) + (condition-case-unless-debug ex + (progn + (when (fontp doom-font) + (set-face-attribute 'fixed-pitch frame :font doom-font)) + ;; Fallback to `doom-unicode-font' for Unicode characters + (when (fontp doom-unicode-font) + (set-fontset-font t 'unicode doom-unicode-font frame)) + ;; ...and for variable-pitch-mode: + (when (fontp doom-variable-pitch-font) + (set-face-attribute 'variable-pitch frame :font doom-variable-pitch-font))) + ('error + (if (string-prefix-p "Font not available: " (error-message-string ex)) + (lwarn 'doom-ui :warning + "Could not find the '%s' font on your system, falling back to system font" + (font-get (caddr ex) :family)) + (lwarn 'doom-ui :error + "Unexpected error while initializing fonts: %s" + (error-message-string ex))))))) ;; Getting themes to remain consistent across GUI Emacs, terminal Emacs and ;; daemon Emacs is hairy. `doom|init-theme' sorts out the initial GUI frame. -;; Attaching that hook to `after-make-frame-functions' sorts out daemon and -;; emacsclient frames. +;; Attaching `doom|init-theme-in-frame' to `after-make-frame-functions' sorts +;; out daemon and emacsclient frames. ;; ;; There will still be issues with simultaneous gui and terminal (emacsclient) ;; frames, however. There's always `doom//reload-theme' if you need it! -(defun doom|init-theme-in-daemon (frame) +(defun doom|init-theme-in-frame (frame) "Reloads the theme in new daemon or tty frames." (when (or (daemonp) (not (display-graphic-p))) - (doom|init-theme frame) - (remove-hook 'after-make-frame-functions #'doom|init-theme-in-daemon))) + (with-selected-frame frame + (doom|init-theme)))) (add-hook! 'doom-init-ui-hook #'(doom|init-theme doom|init-fonts))