summaryrefslogtreecommitdiff
path: root/lisp/international/mule.el
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2019-07-13 11:32:18 +0300
committerEli Zaretskii <eliz@gnu.org>2019-07-13 11:32:18 +0300
commitb2783ba6f4c663556709f524a2ff34f18072e9f3 (patch)
treed7bdc97efe5a1be3bb459c6fe630c69622f41c5b /lisp/international/mule.el
parentbd962f7fd471a07bae1950976e066ad0c3009532 (diff)
downloademacs-b2783ba6f4c663556709f524a2ff34f18072e9f3.tar.gz
Avoid loading mule-util at startup
* lisp/international/mule-util.el (char-displayable-p): Move from here... * lisp/international/mule.el (char-displayable-p): ...to here. This avoids always loading mule-util at startup due to a call to 'char-displayable-p' in 'startup--setup-quote-display'.
Diffstat (limited to 'lisp/international/mule.el')
-rw-r--r--lisp/international/mule.el55
1 files changed, 55 insertions, 0 deletions
diff --git a/lisp/international/mule.el b/lisp/international/mule.el
index 21f3118a98e..ec6f6476888 100644
--- a/lisp/international/mule.el
+++ b/lisp/international/mule.el
@@ -481,6 +481,61 @@ Return -1 if charset isn't an ISO 2022 one."
(or charset
(error "Invalid Emacs-mule charset ID: %d" charset-id))
(make-char charset code1 code2)))
+
+(defun char-displayable-p (char)
+ "Return non-nil if we should be able to display CHAR.
+On a multi-font display, the test is only whether there is an
+appropriate font from the selected frame's fontset to display
+CHAR's charset in general. Since fonts may be specified on a
+per-character basis, this may not be accurate."
+ (cond ((< char 128)
+ ;; ASCII characters are always displayable.
+ t)
+ ((not enable-multibyte-characters)
+ ;; Maybe there's a font for it, but we can't put it in the buffer.
+ nil)
+ (t
+ (let ((font-glyph (internal-char-font nil char)))
+ (if font-glyph
+ (if (consp font-glyph)
+ ;; On a window system, a character is displayable
+ ;; if a font for that character is in the default
+ ;; face of the currently selected frame.
+ (car font-glyph)
+ ;; On a text terminal supporting glyph codes, CHAR is
+ ;; displayable if its glyph code is nonnegative.
+ (<= 0 font-glyph))
+ ;; On a text terminal without glyph codes, CHAR is displayable
+ ;; if the coding system for the terminal can encode it.
+ (let ((coding (terminal-coding-system)))
+ (when coding
+ (let ((cs-list (coding-system-get coding :charset-list)))
+ (cond
+ ((listp cs-list)
+ (catch 'tag
+ (mapc #'(lambda (charset)
+ (if (encode-char char charset)
+ (throw 'tag charset)))
+ cs-list)
+ nil))
+ ((eq cs-list 'iso-2022)
+ (catch 'tag2
+ (mapc #'(lambda (charset)
+ (if (and (plist-get (charset-plist charset)
+ :iso-final-char)
+ (encode-char char charset))
+ (throw 'tag2 charset)))
+ charset-list)
+ nil))
+ ((eq cs-list 'emacs-mule)
+ (catch 'tag3
+ (mapc #'(lambda (charset)
+ (if (and (plist-get (charset-plist charset)
+ :emacs-mule-id)
+ (encode-char char charset))
+ (throw 'tag3 charset)))
+ charset-list)
+ nil)))))))))))
;; Save the ASCII case table in case we need it later. Some locales
;; (such as Turkish) modify the case behavior of ASCII characters,