diff lisp/disp-table.el @ 5118:e0db3c197671 ben-lisp-object

merge up to latest default branch, doesn't compile yet
author Ben Wing <ben@xemacs.org>
date Sat, 26 Dec 2009 21:18:49 -0600
parents 3742ea8250b5 1f0aa40cafe0
children e84ee15ca495
line wrap: on
line diff
--- a/lisp/disp-table.el	Sat Dec 26 00:20:27 2009 -0600
+++ b/lisp/disp-table.el	Sat Dec 26 21:18:49 2009 -0600
@@ -1,6 +1,6 @@
 ;;; disp-table.el --- functions for dealing with char tables.
 
-;; Copyright (C) 1987, 1994, 1997 Free Software Foundation, Inc.
+;; Copyright (C) 1987, 1994, 1997, 2007 Free Software Foundation, Inc.
 ;; Copyright (C) 1995 Sun Microsystems.
 ;; Copyright (C) 2005 Ben Wing.
 
@@ -28,69 +28,81 @@
 
 ;;; Commentary:
 
-;; #### Needs work.
-
 ;; Rewritten for XEmacs July 1995, Ben Wing.
 ;; November 1998?, display tables generalized to char/range tables, Hrvoje
 ;; Niksic.
-;; February 2005, rewrite this file to handle generalized display tables,
-;; Ben Wing.
+;; July 2007, rewrite this file to handle generalized display tables,
+;; Aidan Kehoe.
 
 ;;; Code:
 
+;;;###autoload
+(defun make-display-table ()
+  "Return a new, empty display table.
+
+This returns a generic character table; previously it returned a vector, but
+that was not helpful when dealing with internationalized characters above
+?\xFF.  See `make-char-table' for details of character tables in general.  To
+write code that works with both vectors and character tables, add something
+like the following to the beginning of your file, and use
+`put-display-table' to set what a given character is displayed as, and
+`get-display-table' to examine what that character is currently displayed
+as:
+
+\(defun-when-void put-display-table (range value display-table)
+  \"Set the value for char RANGE to VALUE in DISPLAY-TABLE.  \"
+  (if (sequencep display-table)
+      (aset display-table range value)
+    (put-char-table range value display-table)))
+
+\(defun-when-void get-display-table (character display-table)
+  \"Find value for CHARACTER in DISPLAY-TABLE.  \"
+  (if (sequencep display-table)
+      (aref display-table character)
+    (get-char-table character display-table)))
+
+In this implementation, `put-display-table' and `get-display-table' are
+aliases of `put-char-table' and `get-char-table' respectively, and are
+always available."
+  (make-char-table 'generic))
+
+;;;###autoload
+(defalias 'put-display-table #'put-char-table)
+
+;;;###autoload
+(defalias 'get-display-table #'get-char-table)
+
 (defun describe-display-table (dt)
   "Describe the display table DT in a help buffer."
   (with-displaying-help-buffer
    (lambda ()
-     (princ "\nCharacter display glyph sequences:\n")
-     (flet ((describe-display-table-entry
-	      (entry stream)
-	      ;; #### Write better version
-	      (princ entry stream))
-	    (describe-display-table-range
-	      (first last entry)
-	      (if (eq first last)
-		  (princ (format "%s\t\t"
-				 (single-key-description (int-char first))))
-		(let ((str (format "%s - %s"
-				   (single-key-description (int-char first))
-				   (single-key-description (int-char last)))))
-		  (princ str)
-		  (princ (make-string (max (- 2 (/ (length str)
-						   tab-width)) 1) ?\t))))
-	      (describe-display-table-entry entry standard-output)
-	      (terpri)))
-       (cond ((vectorp dt)
-	      (save-excursion
-	       (let ((vector (make-vector 256 nil))
-		     (i 0))
-		 (while (< i 256)
-		   (aset vector i (aref dt i))
-		   (incf i))
-		 ;; FSF calls `describe-vector' here, but it is so incredibly
-		 ;; lame a function for that name that I cannot bring myself
-		 ;; to port it.  Here is what `describe-vector' does:
-		 (terpri)
-		 (let ((old (aref vector 0))
-		       (oldpos 0)
-		       (i 1))
-		   (while (<= i 256)
-		     (when (or (= i 256)
-			       (not (equal old (aref vector i))))
-		       (describe-display-table-range oldpos (1- i) old)
-		       (or (= i 256)
-			   (setq old (aref vector i)
-				 oldpos i)))
-		     (incf i))))))
-	     ((char-table-p dt)
-	      (describe-char-table dt 'map-char-table
-	       'describe-display-table-entry
-	       standard-output))
-	     ((range-table-p dt)
-	      (map-range-table
-	       #'(lambda (beg end value)
-		   (describe-display-table-range beg end value))
-	       dt)))))))
+     (map-char-table
+      (lambda (range value)
+        (cond
+         ((eq range t)
+          (princ "\nAll characters: \n")
+          (princ (format "  %S" value)))
+         ((eq 'charset (and (symbolp range) (type-of (find-charset range))))
+          (princ (format "\n\nCharset %S: \n" (charset-name range)))
+          (princ (format "  %S" value)))
+         ((vectorp range)
+          (princ (format "\n\nCharset %S, row %d \n"
+                         (charset-name (aref value 0))
+                         (aref value 1)))
+          (princ (format "  %S\n\n" value)))
+         ((characterp range)
+          (princ (format "\nCharacter U+%04X, %S: "
+                         range (if (fboundp 'split-char)
+                                   (split-char range)
+                                 (list 'ascii (char-to-int range)))))
+          (princ (format "  %S" value))))
+        nil) dt)
+     (princ 
+      "\n\nFor some of the various other glyphs that GNU Emacs uses the display
+table for, see the XEmacs specifiers `truncation-glyph' ,
+`continuation-glyph', `control-arrow-glyph', `octal-escape-glyph' and the
+others described in the docstring of `make-glyph'. \n\n"))))
+
 
 ;;;###autoload
 (defun describe-current-display-table (&optional domain)
@@ -102,28 +114,6 @@
 	(describe-display-table disptab)
       (message "No display table"))))
 
-;;;###autoload
-(defun make-display-table ()
-  "Return a new, empty display table.
-Modify a display table using `put-display-table'.  Look up in display tables
-using `get-display-table'.  The exact format of display tables and their
-specs is described in `current-display-table'."
-  ;; #### This should do something smarter.
-  ;; #### Should use range table but there are bugs in range table and
-  ;; perhaps in callers not expecting this.
-  ;(make-range-table 'start-closed-end-closed)
-  ;(make-vector 256 nil)
-  ;; #### Should be type `display-table'
-  (make-char-table 'generic))
-
-(defun display-table-p (object)
-  "Return t if OBJECT is a display table.
-See `make-display-table'."
-  (or (and (vectorp object) (= (length object) 256))
-      (and (char-table-p object) (memq (char-table-type object)
-				       '(char generic display)))
-      (range-table-p object)))
-
 ;; #### we need a generic frob-specifier function.
 ;; #### this also needs to be redone like frob-face-property.
 
@@ -132,6 +122,7 @@
 ;; #### Need more thinking about basic primitives for modifying a specifier.
 ;; cf `modify-specifier-instances'.
 
+;;;###autoload
 (defun frob-display-table (fdt-function fdt-locale &optional tag-set)
   (or fdt-locale (setq fdt-locale 'global))
   (or (specifier-spec-list current-display-table fdt-locale tag-set)
@@ -147,78 +138,42 @@
 		(cdar (specifier-spec-list current-display-table
 					   fdt-locale tag-set)))))))
 
-(defun put-display-table-range (l h spec display-table)
-  "Display characters in range L .. H, inclusive, in DISPLAY-TABLE using SPEC.
-Display tables are described in `current-display-table'."
-  (check-argument-type 'display-table-p display-table)
-  (cond ((vectorp display-table)
-	 (while (<= l h)
-	   (aset display-table l spec)
-	   (setq l (1+ l))))
-	((char-table-p display-table)
-	 (while (<= l h)
-	   (put-char-table l spec display-table)
-	   (setq l (1+ l))))
-	((range-table-p display-table)
-	 (put-range-table l h spec display-table))))
-
-(defun put-display-table (ch spec display-table)
-  "Display character spec CH in DISPLAY-TABLE using SPEC.
-CH can be a character, a charset, or t for all characters.
-Display tables are described in `current-display-table'."
-  (cond ((eq ch t)
-	 (cond ((vectorp display-table)
-		(put-display-table-range 0 (1- (length display-table)) spec
-					 display-table))
-	       ((range-table-p display-table)
-		; major hack
-		(put-display-table-range 0 (string-to-int "3FFFFFFF" 16)
-					 spec display-table))
-	       ((char-table-p display-table)
-		(put-char-table t spec display-table))))
-	((charsetp ch)
-	 (cond ((vectorp display-table)
-		;; #### fix
-		nil)
-	       ((range-table-p display-table)
-		;; #### fix
-		nil)
-	       ((char-table-p display-table)
-		(put-char-table ch spec display-table))))
-	(t (put-display-table-range ch ch spec display-table))))
-
-(defun get-display-table (char display-table)
-  "Return SPEC of CHAR in DISPLAY-TABLE.
-See `current-display-table'."
-  (check-argument-type 'display-table-p display-table)
-  (cond ((vectorp display-table)
-	 (aref display-table char))
-	((char-table-p display-table)
-	 (get-char-table char display-table))
-	((range-table-p display-table)
-	 (get-range-table char display-table))))
-
 (defun standard-display-8bit-1 (dt l h)
   (while (<= l h)
-    (put-display-table l (char-to-string l) dt)
+    (remove-char-table (int-to-char l) dt)
     (setq l (1+ l))))
 
 ;;;###autoload
 (defun standard-display-8bit (l h &optional locale)
-  "Display characters in the range L to H literally."
+  "Display characters in the range L to H literally [sic].
+
+GNU Emacs includes this function.  There, `literally' has no good meaning.
+Under XEmacs, this function makes characters with numeric values in the
+range L to H display as themselves; that is, as ASCII, latin-iso8859-1,
+latin-iso8859-2 or whatever.  See `standard-display-default' for the inverse
+function.  "
   (frob-display-table
    (lambda (x)
      (standard-display-8bit-1 x l h))
    locale))
 
 (defun standard-display-default-1 (dt l h)
+  "Misnamed function under XEmacs. See `standard-display-default'."
   (while (<= l h)
-    (put-display-table l nil dt)
+    (put-char-table (int-to-char l) (format "\\%o" l) dt)
     (setq l (1+ l))))
 
 ;;;###autoload
 (defun standard-display-default (l h &optional locale)
-  "Display characters in the range L to H using the default notation."
+  "Display characters in the range L to H using octal escape notation.
+
+In the XEmacs context this function is misnamed.  Under GNU Emacs,
+characters in the range #xA0 to #xFF display as octal escapes unless
+`standard-display-european' has been called; this function neutralizes the
+effects of `standard-display-european'.  Under XEmacs, those characters
+normally do not display as octal escapes (this ignores hackery like
+specifying the X11 font character set on non-Mule builds) and this function
+sets them to display as octal escapes.  "
   (frob-display-table
    (lambda (x)
      (standard-display-default-1 x l h))
@@ -229,7 +184,7 @@
   "Display character C using printable string S."
   (frob-display-table
    (lambda (x)
-     (put-display-table c s x))
+     (put-char-table c s x))
    locale))
 
 ;;;###autoload
@@ -239,9 +194,8 @@
 the SO/SI characters."
   (frob-display-table
    (lambda (x)
-     (put-display-table c (concat "\016" (char-to-string sc) "\017") x))
-   locale
-   'tty))
+     (put-char-table c (concat "\016" (char-to-string sc) "\017") x))
+   locale '(tty)))
 
 ;;;###autoload
 (defun standard-display-graphic (c gc &optional locale)
@@ -249,38 +203,41 @@
 This only has an effect on TTY devices and assumes VT100-compatible escapes."
   (frob-display-table
    (lambda (x)
-     (put-display-table c (concat "\e(0" (char-to-string gc) "\e(B") x))
-   locale
-   'tty))
-
-;;; #### the FSF equivalent of this makes this character be displayed
-;;; in the 'underline face.  There's no current way to do this with
-;;; XEmacs display tables.
+     (put-char-table c (concat "\e(0" (char-to-string gc) "\e(B") x))
+   locale '(tty)))
 
 ;;;###autoload
 (defun standard-display-underline (c uc &optional locale)
   "Display character C as character UC plus underlining."
   (frob-display-table
    (lambda (x)
-     (put-display-table c (concat "\e[4m" (char-to-string uc) "\e[m") x))
-   locale
-   'tty))
+     (let (glyph)
+       (setq glyph (make-glyph (vector 'string :data (char-to-string uc))))
+       (set-glyph-face glyph 'underline)
+       (put-char-table c glyph x)))
+   locale))
 
 ;;;###autoload
 (defun standard-display-european (arg &optional locale)
-  "Toggle display of European characters encoded with ISO 8859.
-When enabled, characters in the range of 160 to 255 display not
-as octal escapes, but as accented characters.
-With prefix argument, enable European character display iff arg is positive."
+  "Toggle display of European characters encoded with ISO 8859-1.
+When enabled (the default), characters in the range of 160 to 255 display
+as accented characters. With negative prefix argument, display characters in
+that range as octal escapes.  
+
+If you want to work in a Western European language under XEmacs, it
+shouldn't be necessary to call this function--things should just work.  But
+it's in a sufficient number of init files that we're not in a hurry to
+remove it.  "
   (interactive "P")
-  (frob-display-table
-   (lambda (x)
-     (if (or (<= (prefix-numeric-value arg) 0)
-             (and (null arg)
-                  (equal (get-display-table 160 x) (char-to-string 160))))
-         (standard-display-default-1 x 160 255)
-       (standard-display-8bit-1 x 160 255)))
-   locale))
+  (if (<= (prefix-numeric-value arg) 0)
+      (frob-display-table
+       (lambda (x)
+         (standard-display-default-1 x 160 255))
+       locale)
+    (frob-display-table
+     (lambda (x)
+       (standard-display-8bit-1 x 160 255))
+       locale)))
 
 (provide 'disp-table)