From 16a43933e891bae502efbe367e32608fcfffdec3 Mon Sep 17 00:00:00 2001 From: Chong Yidong Date: Mon, 18 Apr 2011 19:21:31 -0400 Subject: [PATCH] Allow glyphless-char-display to distinguish between X and text terminals. Use this for Tabulated List mode. * lisp/emacs-lisp/tabulated-list.el (tabulated-list-mode): Use a custom glyphless-char-display table. (tabulated-list-glyphless-char-display): New var. * src/term.c (produce_glyphless_glyph): Handle cons cell entry in glyphless-char-display. * src/xdisp.c (lookup_glyphless_char_display) (produce_glyphless_glyph): Handle cons cell entry in glyphless-char-display. (Vglyphless_char_display): Document it. --- etc/NEWS | 3 +++ lisp/ChangeLog | 6 +++++ lisp/emacs-lisp/tabulated-list.el | 13 ++++++++- src/ChangeLog | 10 +++++++ src/term.c | 2 ++ src/xdisp.c | 44 +++++++++++++++++++++---------- 6 files changed, 63 insertions(+), 15 deletions(-) diff --git a/etc/NEWS b/etc/NEWS index 869e95216e5..69540fa1f54 100644 --- a/etc/NEWS +++ b/etc/NEWS @@ -779,6 +779,9 @@ sc.el, x-menu.el, rnews.el, rnewspost.el * Lisp changes in Emacs 24.1 +** `glyphless-char-table' can now distinguish between graphical and +text terminal display, via a char-table entry that is a cons cell. + ** `open-network-stream' can now be used to open an encrypted stream. It now accepts an optional `:type' parameter for initiating a TLS connection, directly or via STARTTLS. To do STARTTLS, additional diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 373ae63bfe5..2e024d34981 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2011-04-18 Chong Yidong + + * emacs-lisp/tabulated-list.el (tabulated-list-mode): Use a custom + glyphless-char-display table. + (tabulated-list-glyphless-char-display): New var. + 2011-04-18 Sam Steingold * vc/add-log.el (change-log-font-lock-keywords): Add "Thanks to" diff --git a/lisp/emacs-lisp/tabulated-list.el b/lisp/emacs-lisp/tabulated-list.el index 6409c2206bc..2fdfa9525b1 100644 --- a/lisp/emacs-lisp/tabulated-list.el +++ b/lisp/emacs-lisp/tabulated-list.el @@ -143,6 +143,15 @@ If ADVANCE is non-nil, move forward by one line afterwards." map) "Local keymap for `tabulated-list-mode' sort buttons.") +(defvar tabulated-list-glyphless-char-display + (let ((table (make-char-table 'glyphless-char-display nil))) + (set-char-table-parent table glyphless-char-display) + ;; Some text terminals can't display the unicode arrows; be safe. + (aset table 9650 (cons nil "^")) + (aset table 9660 (cons nil "v")) + table) + "The `glyphless-char-display' table in Tabulated List buffers.") + (defun tabulated-list-init-header () "Set up header line for the Tabulated List buffer." (let ((x tabulated-list-padding) @@ -341,7 +350,9 @@ as the ewoc pretty-printer." (setq truncate-lines t) (setq buffer-read-only t) (set (make-local-variable 'revert-buffer-function) - 'tabulated-list-revert)) + 'tabulated-list-revert) + (set (make-local-variable 'glyphless-char-display) + tabulated-list-glyphless-char-display)) (put 'tabulated-list-mode 'mode-class 'special) diff --git a/src/ChangeLog b/src/ChangeLog index 22e85967b82..40174020bf4 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,13 @@ +2011-04-18 Chong Yidong + + * xdisp.c (lookup_glyphless_char_display) + (produce_glyphless_glyph): Handle cons cell entry in + glyphless-char-display. + (Vglyphless_char_display): Document it. + + * term.c (produce_glyphless_glyph): Handle cons cell entry in + glyphless-char-display. + 2011-04-17 Chong Yidong * xdisp.c (get_next_display_element): Remove unnecessary ifdefs. diff --git a/src/term.c b/src/term.c index df13d7c0db2..cae83f4d269 100644 --- a/src/term.c +++ b/src/term.c @@ -1936,6 +1936,8 @@ produce_glyphless_glyph (struct it *it, int for_no_font, Lisp_Object acronym) { if (! STRINGP (acronym) && CHAR_TABLE_P (Vglyphless_char_display)) acronym = CHAR_TABLE_REF (Vglyphless_char_display, it->c); + if (CONSP (acronym)) + acronym = XCDR (acronym); buf[0] = '['; str = STRINGP (acronym) ? SSDATA (acronym) : ""; for (len = 0; len < 6 && str[len] && ASCII_BYTE_P (str[len]); len++) diff --git a/src/xdisp.c b/src/xdisp.c index eaab8dac18d..574c84fc086 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -5540,9 +5540,19 @@ lookup_glyphless_char_display (int c, struct it *it) if (CHAR_TABLE_P (Vglyphless_char_display) && CHAR_TABLE_EXTRA_SLOTS (XCHAR_TABLE (Vglyphless_char_display)) >= 1) - glyphless_method = (c >= 0 - ? CHAR_TABLE_REF (Vglyphless_char_display, c) - : XCHAR_TABLE (Vglyphless_char_display)->extras[0]); + { + if (c >= 0) + { + glyphless_method = CHAR_TABLE_REF (Vglyphless_char_display, c); + if (CONSP (glyphless_method)) + glyphless_method = FRAME_WINDOW_P (it->f) + ? XCAR (glyphless_method) + : XCDR (glyphless_method); + } + else + glyphless_method = XCHAR_TABLE (Vglyphless_char_display)->extras[0]; + } + retry: if (NILP (glyphless_method)) { @@ -22315,6 +22325,8 @@ produce_glyphless_glyph (struct it *it, int for_no_font, Lisp_Object acronym) { if (! STRINGP (acronym) && CHAR_TABLE_P (Vglyphless_char_display)) acronym = CHAR_TABLE_REF (Vglyphless_char_display, it->c); + if (CONSP (acronym)) + acronym = XCAR (acronym); str = STRINGP (acronym) ? SSDATA (acronym) : ""; } else @@ -26950,17 +26962,21 @@ cursor shapes. */); Fput (Qglyphless_char_display, Qchar_table_extra_slots, make_number (1)); DEFVAR_LISP ("glyphless-char-display", Vglyphless_char_display, - doc: /* Char-table to control displaying of glyphless characters. -Each element, if non-nil, is an ASCII acronym string (displayed in a box) -or one of these symbols: - hex-code: display the hexadecimal code of a character in a box - empty-box: display as an empty box - thin-space: display as 1-pixel width space - zero-width: don't display - -It has one extra slot to control the display of a character for which -no font is found. The value of the slot is `hex-code' or `empty-box'. -The default is `empty-box'. */); + doc: /* Char-table defining glyphless characters. +Each element, if non-nil, should be one of the following: + an ASCII acronym string: display this string in a box + `hex-code': display the hexadecimal code of a character in a box + `empty-box': display as an empty box + `thin-space': display as 1-pixel width space + `zero-width': don't display +An element may also be a cons cell (GRAPHICAL . TEXT), which specifies the +display method for graphical terminals and text terminals respectively. +GRAPHICAL and TEXT should each have one of the values listed above. + +The char-table has one extra slot to control the display of a character for +which no font is found. This slot only takes effect on graphical terminals. +Its value should be an ASCII acronym string, `hex-code', `empty-box', or +`thin-space'. The default is `empty-box'. */); Vglyphless_char_display = Fmake_char_table (Qglyphless_char_display, Qnil); Fset_char_table_extra_slot (Vglyphless_char_display, make_number (0), Qempty_box); -- 2.39.2