[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/lisp/term/x-win.el [emacs-unicode-2]
From: |
Kenichi Handa |
Subject: |
[Emacs-diffs] Changes to emacs/lisp/term/x-win.el [emacs-unicode-2] |
Date: |
Mon, 08 Sep 2003 08:56:19 -0400 |
Index: emacs/lisp/term/x-win.el
diff -c /dev/null emacs/lisp/term/x-win.el:1.165.2.1
*** /dev/null Mon Sep 8 08:56:19 2003
--- emacs/lisp/term/x-win.el Mon Sep 8 08:53:41 2003
***************
*** 0 ****
--- 1,2438 ----
+ ;;; x-win.el --- parse relevant switches and set up for X -*-coding:
iso-2022-7bit;-*-
+
+ ;; Copyright (C) 1993, 1994, 2001, 2002 Free Software Foundation, Inc.
+
+ ;; Author: FSF
+ ;; Keywords: terminals, i18n
+
+ ;; This file is part of GNU Emacs.
+
+ ;; GNU Emacs is free software; you can redistribute it and/or modify
+ ;; it under the terms of the GNU General Public License as published by
+ ;; the Free Software Foundation; either version 2, or (at your option)
+ ;; any later version.
+
+ ;; GNU Emacs is distributed in the hope that it will be useful,
+ ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+ ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ ;; GNU General Public License for more details.
+
+ ;; You should have received a copy of the GNU General Public License
+ ;; along with GNU Emacs; see the file COPYING. If not, write to the
+ ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ ;; Boston, MA 02111-1307, USA.
+
+ ;;; Commentary:
+
+ ;; X-win.el: this file is loaded from ../lisp/startup.el when it recognizes
+ ;; that X windows are to be used. Command line switches are parsed and those
+ ;; pertaining to X are processed and removed from the command line. The
+ ;; X display is opened and hooks are set for popping up the initial window.
+
+ ;; startup.el will then examine startup files, and eventually call the hooks
+ ;; which create the first window(s).
+
+ ;;; Code:
+
+ ;; These are the standard X switches from the Xt Initialize.c file of
+ ;; Release 4.
+
+ ;; Command line Resource Manager string
+
+ ;; +rv *reverseVideo
+ ;; +synchronous *synchronous
+ ;; -background *background
+ ;; -bd *borderColor
+ ;; -bg *background
+ ;; -bordercolor *borderColor
+ ;; -borderwidth .borderWidth
+ ;; -bw .borderWidth
+ ;; -display .display
+ ;; -fg *foreground
+ ;; -fn *font
+ ;; -font *font
+ ;; -foreground *foreground
+ ;; -geometry .geometry
+ ;; -i .iconType
+ ;; -itype .iconType
+ ;; -iconic .iconic
+ ;; -name .name
+ ;; -reverse *reverseVideo
+ ;; -rv *reverseVideo
+ ;; -selectionTimeout .selectionTimeout
+ ;; -synchronous *synchronous
+ ;; -xrm
+
+ ;; An alist of X options and the function which handles them. See
+ ;; ../startup.el.
+
+ (if (not (eq window-system 'x))
+ (error "%s: Loading x-win.el but not compiled for X" (invocation-name)))
+
+ (require 'frame)
+ (require 'mouse)
+ (require 'scroll-bar)
+ (require 'faces)
+ (require 'select)
+ (require 'menu-bar)
+ (require 'fontset)
+
+ (defvar x-invocation-args)
+
+ (defvar x-command-line-resources nil)
+
+ ;; Handler for switches of the form "-switch value" or "-switch".
+ (defun x-handle-switch (switch)
+ (let ((aelt (assoc switch command-line-x-option-alist)))
+ (if aelt
+ (let ((param (nth 3 aelt))
+ (value (nth 4 aelt)))
+ (if value
+ (setq default-frame-alist
+ (cons (cons param value)
+ default-frame-alist))
+ (setq default-frame-alist
+ (cons (cons param
+ (car x-invocation-args))
+ default-frame-alist)
+ x-invocation-args (cdr x-invocation-args)))))))
+
+ ;; Handler for switches of the form "-switch n"
+ (defun x-handle-numeric-switch (switch)
+ (let ((aelt (assoc switch command-line-x-option-alist)))
+ (if aelt
+ (let ((param (nth 3 aelt)))
+ (setq default-frame-alist
+ (cons (cons param
+ (string-to-int (car x-invocation-args)))
+ default-frame-alist)
+ x-invocation-args
+ (cdr x-invocation-args))))))
+
+ ;; Handle options that apply to initial frame only
+ (defun x-handle-initial-switch (switch)
+ (let ((aelt (assoc switch command-line-x-option-alist)))
+ (if aelt
+ (let ((param (nth 3 aelt))
+ (value (nth 4 aelt)))
+ (if value
+ (setq initial-frame-alist
+ (cons (cons param value)
+ initial-frame-alist))
+ (setq initial-frame-alist
+ (cons (cons param
+ (car x-invocation-args))
+ initial-frame-alist)
+ x-invocation-args (cdr x-invocation-args)))))))
+
+ ;; Make -iconic apply only to the initial frame!
+ (defun x-handle-iconic (switch)
+ (setq initial-frame-alist
+ (cons '(visibility . icon) initial-frame-alist)))
+
+ ;; Handle the -xrm option.
+ (defun x-handle-xrm-switch (switch)
+ (unless (consp x-invocation-args)
+ (error "%s: missing argument to `%s' option" (invocation-name) switch))
+ (setq x-command-line-resources
+ (if (null x-command-line-resources)
+ (car x-invocation-args)
+ (concat x-command-line-resources "\n" (car x-invocation-args))))
+ (setq x-invocation-args (cdr x-invocation-args)))
+
+ ;; Handle the geometry option
+ (defun x-handle-geometry (switch)
+ (let* ((geo (x-parse-geometry (car x-invocation-args)))
+ (left (assq 'left geo))
+ (top (assq 'top geo))
+ (height (assq 'height geo))
+ (width (assq 'width geo)))
+ (if (or height width)
+ (setq default-frame-alist
+ (append default-frame-alist
+ '((user-size . t))
+ (if height (list height))
+ (if width (list width)))
+ initial-frame-alist
+ (append initial-frame-alist
+ '((user-size . t))
+ (if height (list height))
+ (if width (list width)))))
+ (if (or left top)
+ (setq initial-frame-alist
+ (append initial-frame-alist
+ '((user-position . t))
+ (if left (list left))
+ (if top (list top)))))
+ (setq x-invocation-args (cdr x-invocation-args))))
+
+ ;; Handle the -name option. Set the variable x-resource-name
+ ;; to the option's operand; set the name of
+ ;; the initial frame, too.
+ (defun x-handle-name-switch (switch)
+ (or (consp x-invocation-args)
+ (error "%s: missing argument to `%s' option" (invocation-name) switch))
+ (setq x-resource-name (car x-invocation-args)
+ x-invocation-args (cdr x-invocation-args))
+ (setq initial-frame-alist (cons (cons 'name x-resource-name)
+ initial-frame-alist)))
+
+ (defvar x-display-name nil
+ "The X display name specifying server and X frame.")
+
+ (defun x-handle-display (switch)
+ (setq x-display-name (car x-invocation-args)
+ x-invocation-args (cdr x-invocation-args))
+ ;; Make subshell programs see the same DISPLAY value Emacs really uses.
+ ;; Note that this isn't completely correct, since Emacs can use
+ ;; multiple displays. However, there is no way to tell an already
+ ;; running subshell which display the user is currently typing on.
+ (setenv "DISPLAY" x-display-name))
+
+ (defun x-handle-args (args)
+ "Process the X-related command line options in ARGS.
+ This is done before the user's startup file is loaded. They are copied to
+ `x-invocation-args', from which the X-related things are extracted, first
+ the switch (e.g., \"-fg\") in the following code, and possible values
+ \(e.g., \"black\") in the option handler code (e.g., x-handle-switch).
+ This function returns ARGS minus the arguments that have been processed."
+ ;; We use ARGS to accumulate the args that we don't handle here, to return.
+ (setq x-invocation-args args
+ args nil)
+ (while (and x-invocation-args
+ (not (equal (car x-invocation-args) "--")))
+ (let* ((this-switch (car x-invocation-args))
+ (orig-this-switch this-switch)
+ completion argval aelt handler)
+ (setq x-invocation-args (cdr x-invocation-args))
+ ;; Check for long options with attached arguments
+ ;; and separate out the attached option argument into argval.
+ (if (string-match "^--[^=]*=" this-switch)
+ (setq argval (substring this-switch (match-end 0))
+ this-switch (substring this-switch 0 (1- (match-end 0)))))
+ ;; Complete names of long options.
+ (if (string-match "^--" this-switch)
+ (progn
+ (setq completion (try-completion this-switch
command-line-x-option-alist))
+ (if (eq completion t)
+ ;; Exact match for long option.
+ nil
+ (if (stringp completion)
+ (let ((elt (assoc completion command-line-x-option-alist)))
+ ;; Check for abbreviated long option.
+ (or elt
+ (error "Option `%s' is ambiguous" this-switch))
+ (setq this-switch completion))))))
+ (setq aelt (assoc this-switch command-line-x-option-alist))
+ (if aelt (setq handler (nth 2 aelt)))
+ (if handler
+ (if argval
+ (let ((x-invocation-args
+ (cons argval x-invocation-args)))
+ (funcall handler this-switch))
+ (funcall handler this-switch))
+ (setq args (cons orig-this-switch args)))))
+ (nconc (nreverse args) x-invocation-args))
+
+ ;; Handle the --smid switch. This is used by the session manager
+ ;; to give us back our session id we had on the previous run.
+ (defun x-handle-smid (switch)
+ (or (consp x-invocation-args)
+ (error "%s: missing argument to `%s' option" (invocation-name) switch))
+ (setq x-session-previous-id (car x-invocation-args)
+ x-invocation-args (cdr x-invocation-args)))
+
+ (defvar emacs-save-session-functions nil
+ "Special hook run when a save-session event occurs.
+ The functions do not get any argument.
+ Functions can return non-nil to inform the session manager that the
+ window system shutdown should be aborted.
+
+ See also `emacs-session-save'.")
+
+ (defun emacs-session-filename (session-id)
+ "Construct a filename to save the session in based on SESSION-ID.
+ If the directory ~/.emacs.d exists, we make a filename in there, otherwise
+ a file in the home directory."
+ (let ((basename (concat "session." session-id))
+ (emacs-dir "~/.emacs.d/"))
+ (expand-file-name (if (file-directory-p emacs-dir)
+ (concat emacs-dir basename)
+ (concat "~/.emacs-" basename)))))
+
+ (defun emacs-session-save ()
+ "This function is called when the window system is shutting down.
+ If this function returns non-nil, the window system shutdown is cancelled.
+
+ When a session manager tells Emacs that the window system is shutting
+ down, this function is called. It calls the functions in the hook
+ `emacs-save-session-functions'. Functions are called with the current
+ buffer set to a temporary buffer. Functions should use `insert' to insert
+ lisp code to save the session state. The buffer is saved
+ in a file in the home directory of the user running Emacs. The file
+ is evaluated when Emacs is restarted by the session manager.
+
+ If any of the functions returns non-nil, no more functions are called
+ and this function returns non-nil. This will inform the session manager
+ that it should abort the window system shutdown."
+ (let ((filename (emacs-session-filename x-session-id))
+ (buf (get-buffer-create (concat " *SES " x-session-id))))
+ (when (file-exists-p filename)
+ (delete-file filename))
+ (with-current-buffer buf
+ (let ((cancel-shutdown (condition-case nil
+ ;; A return of t means cancel the shutdown.
+ (run-hook-with-args-until-success
+ 'emacs-save-session-functions)
+ (error t))))
+ (unless cancel-shutdown
+ (write-file filename))
+ (kill-buffer buf)
+ cancel-shutdown))))
+
+ (defun emacs-session-restore (previous-session-id)
+ "Restore the Emacs session if started by a session manager.
+ The file saved by `emacs-session-save' is evaluated and deleted if it
+ exists."
+ (let ((filename (emacs-session-filename previous-session-id)))
+ (when (file-exists-p filename)
+ (load-file filename)
+ (delete-file filename)
+ (message "Restored session data"))))
+
+
+
+
+ ;;
+ ;; Standard X cursor shapes, courtesy of Mr. Fox, who wanted ALL of them.
+ ;;
+
+ (defconst x-pointer-X-cursor 0)
+ (defconst x-pointer-arrow 2)
+ (defconst x-pointer-based-arrow-down 4)
+ (defconst x-pointer-based-arrow-up 6)
+ (defconst x-pointer-boat 8)
+ (defconst x-pointer-bogosity 10)
+ (defconst x-pointer-bottom-left-corner 12)
+ (defconst x-pointer-bottom-right-corner 14)
+ (defconst x-pointer-bottom-side 16)
+ (defconst x-pointer-bottom-tee 18)
+ (defconst x-pointer-box-spiral 20)
+ (defconst x-pointer-center-ptr 22)
+ (defconst x-pointer-circle 24)
+ (defconst x-pointer-clock 26)
+ (defconst x-pointer-coffee-mug 28)
+ (defconst x-pointer-cross 30)
+ (defconst x-pointer-cross-reverse 32)
+ (defconst x-pointer-crosshair 34)
+ (defconst x-pointer-diamond-cross 36)
+ (defconst x-pointer-dot 38)
+ (defconst x-pointer-dotbox 40)
+ (defconst x-pointer-double-arrow 42)
+ (defconst x-pointer-draft-large 44)
+ (defconst x-pointer-draft-small 46)
+ (defconst x-pointer-draped-box 48)
+ (defconst x-pointer-exchange 50)
+ (defconst x-pointer-fleur 52)
+ (defconst x-pointer-gobbler 54)
+ (defconst x-pointer-gumby 56)
+ (defconst x-pointer-hand1 58)
+ (defconst x-pointer-hand2 60)
+ (defconst x-pointer-heart 62)
+ (defconst x-pointer-icon 64)
+ (defconst x-pointer-iron-cross 66)
+ (defconst x-pointer-left-ptr 68)
+ (defconst x-pointer-left-side 70)
+ (defconst x-pointer-left-tee 72)
+ (defconst x-pointer-leftbutton 74)
+ (defconst x-pointer-ll-angle 76)
+ (defconst x-pointer-lr-angle 78)
+ (defconst x-pointer-man 80)
+ (defconst x-pointer-middlebutton 82)
+ (defconst x-pointer-mouse 84)
+ (defconst x-pointer-pencil 86)
+ (defconst x-pointer-pirate 88)
+ (defconst x-pointer-plus 90)
+ (defconst x-pointer-question-arrow 92)
+ (defconst x-pointer-right-ptr 94)
+ (defconst x-pointer-right-side 96)
+ (defconst x-pointer-right-tee 98)
+ (defconst x-pointer-rightbutton 100)
+ (defconst x-pointer-rtl-logo 102)
+ (defconst x-pointer-sailboat 104)
+ (defconst x-pointer-sb-down-arrow 106)
+ (defconst x-pointer-sb-h-double-arrow 108)
+ (defconst x-pointer-sb-left-arrow 110)
+ (defconst x-pointer-sb-right-arrow 112)
+ (defconst x-pointer-sb-up-arrow 114)
+ (defconst x-pointer-sb-v-double-arrow 116)
+ (defconst x-pointer-shuttle 118)
+ (defconst x-pointer-sizing 120)
+ (defconst x-pointer-spider 122)
+ (defconst x-pointer-spraycan 124)
+ (defconst x-pointer-star 126)
+ (defconst x-pointer-target 128)
+ (defconst x-pointer-tcross 130)
+ (defconst x-pointer-top-left-arrow 132)
+ (defconst x-pointer-top-left-corner 134)
+ (defconst x-pointer-top-right-corner 136)
+ (defconst x-pointer-top-side 138)
+ (defconst x-pointer-top-tee 140)
+ (defconst x-pointer-trek 142)
+ (defconst x-pointer-ul-angle 144)
+ (defconst x-pointer-umbrella 146)
+ (defconst x-pointer-ur-angle 148)
+ (defconst x-pointer-watch 150)
+ (defconst x-pointer-xterm 152)
+
+ ;;
+ ;; Available colors
+ ;;
+
+ (defvar x-colors '("LightGreen"
+ "light green"
+ "DarkRed"
+ "dark red"
+ "DarkMagenta"
+ "dark magenta"
+ "DarkCyan"
+ "dark cyan"
+ "DarkBlue"
+ "dark blue"
+ "DarkGray"
+ "dark gray"
+ "DarkGrey"
+ "dark grey"
+ "grey100"
+ "gray100"
+ "grey99"
+ "gray99"
+ "grey98"
+ "gray98"
+ "grey97"
+ "gray97"
+ "grey96"
+ "gray96"
+ "grey95"
+ "gray95"
+ "grey94"
+ "gray94"
+ "grey93"
+ "gray93"
+ "grey92"
+ "gray92"
+ "grey91"
+ "gray91"
+ "grey90"
+ "gray90"
+ "grey89"
+ "gray89"
+ "grey88"
+ "gray88"
+ "grey87"
+ "gray87"
+ "grey86"
+ "gray86"
+ "grey85"
+ "gray85"
+ "grey84"
+ "gray84"
+ "grey83"
+ "gray83"
+ "grey82"
+ "gray82"
+ "grey81"
+ "gray81"
+ "grey80"
+ "gray80"
+ "grey79"
+ "gray79"
+ "grey78"
+ "gray78"
+ "grey77"
+ "gray77"
+ "grey76"
+ "gray76"
+ "grey75"
+ "gray75"
+ "grey74"
+ "gray74"
+ "grey73"
+ "gray73"
+ "grey72"
+ "gray72"
+ "grey71"
+ "gray71"
+ "grey70"
+ "gray70"
+ "grey69"
+ "gray69"
+ "grey68"
+ "gray68"
+ "grey67"
+ "gray67"
+ "grey66"
+ "gray66"
+ "grey65"
+ "gray65"
+ "grey64"
+ "gray64"
+ "grey63"
+ "gray63"
+ "grey62"
+ "gray62"
+ "grey61"
+ "gray61"
+ "grey60"
+ "gray60"
+ "grey59"
+ "gray59"
+ "grey58"
+ "gray58"
+ "grey57"
+ "gray57"
+ "grey56"
+ "gray56"
+ "grey55"
+ "gray55"
+ "grey54"
+ "gray54"
+ "grey53"
+ "gray53"
+ "grey52"
+ "gray52"
+ "grey51"
+ "gray51"
+ "grey50"
+ "gray50"
+ "grey49"
+ "gray49"
+ "grey48"
+ "gray48"
+ "grey47"
+ "gray47"
+ "grey46"
+ "gray46"
+ "grey45"
+ "gray45"
+ "grey44"
+ "gray44"
+ "grey43"
+ "gray43"
+ "grey42"
+ "gray42"
+ "grey41"
+ "gray41"
+ "grey40"
+ "gray40"
+ "grey39"
+ "gray39"
+ "grey38"
+ "gray38"
+ "grey37"
+ "gray37"
+ "grey36"
+ "gray36"
+ "grey35"
+ "gray35"
+ "grey34"
+ "gray34"
+ "grey33"
+ "gray33"
+ "grey32"
+ "gray32"
+ "grey31"
+ "gray31"
+ "grey30"
+ "gray30"
+ "grey29"
+ "gray29"
+ "grey28"
+ "gray28"
+ "grey27"
+ "gray27"
+ "grey26"
+ "gray26"
+ "grey25"
+ "gray25"
+ "grey24"
+ "gray24"
+ "grey23"
+ "gray23"
+ "grey22"
+ "gray22"
+ "grey21"
+ "gray21"
+ "grey20"
+ "gray20"
+ "grey19"
+ "gray19"
+ "grey18"
+ "gray18"
+ "grey17"
+ "gray17"
+ "grey16"
+ "gray16"
+ "grey15"
+ "gray15"
+ "grey14"
+ "gray14"
+ "grey13"
+ "gray13"
+ "grey12"
+ "gray12"
+ "grey11"
+ "gray11"
+ "grey10"
+ "gray10"
+ "grey9"
+ "gray9"
+ "grey8"
+ "gray8"
+ "grey7"
+ "gray7"
+ "grey6"
+ "gray6"
+ "grey5"
+ "gray5"
+ "grey4"
+ "gray4"
+ "grey3"
+ "gray3"
+ "grey2"
+ "gray2"
+ "grey1"
+ "gray1"
+ "grey0"
+ "gray0"
+ "thistle4"
+ "thistle3"
+ "thistle2"
+ "thistle1"
+ "MediumPurple4"
+ "MediumPurple3"
+ "MediumPurple2"
+ "MediumPurple1"
+ "purple4"
+ "purple3"
+ "purple2"
+ "purple1"
+ "DarkOrchid4"
+ "DarkOrchid3"
+ "DarkOrchid2"
+ "DarkOrchid1"
+ "MediumOrchid4"
+ "MediumOrchid3"
+ "MediumOrchid2"
+ "MediumOrchid1"
+ "plum4"
+ "plum3"
+ "plum2"
+ "plum1"
+ "orchid4"
+ "orchid3"
+ "orchid2"
+ "orchid1"
+ "magenta4"
+ "magenta3"
+ "magenta2"
+ "magenta1"
+ "VioletRed4"
+ "VioletRed3"
+ "VioletRed2"
+ "VioletRed1"
+ "maroon4"
+ "maroon3"
+ "maroon2"
+ "maroon1"
+ "PaleVioletRed4"
+ "PaleVioletRed3"
+ "PaleVioletRed2"
+ "PaleVioletRed1"
+ "LightPink4"
+ "LightPink3"
+ "LightPink2"
+ "LightPink1"
+ "pink4"
+ "pink3"
+ "pink2"
+ "pink1"
+ "HotPink4"
+ "HotPink3"
+ "HotPink2"
+ "HotPink1"
+ "DeepPink4"
+ "DeepPink3"
+ "DeepPink2"
+ "DeepPink1"
+ "red4"
+ "red3"
+ "red2"
+ "red1"
+ "OrangeRed4"
+ "OrangeRed3"
+ "OrangeRed2"
+ "OrangeRed1"
+ "tomato4"
+ "tomato3"
+ "tomato2"
+ "tomato1"
+ "coral4"
+ "coral3"
+ "coral2"
+ "coral1"
+ "DarkOrange4"
+ "DarkOrange3"
+ "DarkOrange2"
+ "DarkOrange1"
+ "orange4"
+ "orange3"
+ "orange2"
+ "orange1"
+ "LightSalmon4"
+ "LightSalmon3"
+ "LightSalmon2"
+ "LightSalmon1"
+ "salmon4"
+ "salmon3"
+ "salmon2"
+ "salmon1"
+ "brown4"
+ "brown3"
+ "brown2"
+ "brown1"
+ "firebrick4"
+ "firebrick3"
+ "firebrick2"
+ "firebrick1"
+ "chocolate4"
+ "chocolate3"
+ "chocolate2"
+ "chocolate1"
+ "tan4"
+ "tan3"
+ "tan2"
+ "tan1"
+ "wheat4"
+ "wheat3"
+ "wheat2"
+ "wheat1"
+ "burlywood4"
+ "burlywood3"
+ "burlywood2"
+ "burlywood1"
+ "sienna4"
+ "sienna3"
+ "sienna2"
+ "sienna1"
+ "IndianRed4"
+ "IndianRed3"
+ "IndianRed2"
+ "IndianRed1"
+ "RosyBrown4"
+ "RosyBrown3"
+ "RosyBrown2"
+ "RosyBrown1"
+ "DarkGoldenrod4"
+ "DarkGoldenrod3"
+ "DarkGoldenrod2"
+ "DarkGoldenrod1"
+ "goldenrod4"
+ "goldenrod3"
+ "goldenrod2"
+ "goldenrod1"
+ "gold4"
+ "gold3"
+ "gold2"
+ "gold1"
+ "yellow4"
+ "yellow3"
+ "yellow2"
+ "yellow1"
+ "LightYellow4"
+ "LightYellow3"
+ "LightYellow2"
+ "LightYellow1"
+ "LightGoldenrod4"
+ "LightGoldenrod3"
+ "LightGoldenrod2"
+ "LightGoldenrod1"
+ "khaki4"
+ "khaki3"
+ "khaki2"
+ "khaki1"
+ "DarkOliveGreen4"
+ "DarkOliveGreen3"
+ "DarkOliveGreen2"
+ "DarkOliveGreen1"
+ "OliveDrab4"
+ "OliveDrab3"
+ "OliveDrab2"
+ "OliveDrab1"
+ "chartreuse4"
+ "chartreuse3"
+ "chartreuse2"
+ "chartreuse1"
+ "green4"
+ "green3"
+ "green2"
+ "green1"
+ "SpringGreen4"
+ "SpringGreen3"
+ "SpringGreen2"
+ "SpringGreen1"
+ "PaleGreen4"
+ "PaleGreen3"
+ "PaleGreen2"
+ "PaleGreen1"
+ "SeaGreen4"
+ "SeaGreen3"
+ "SeaGreen2"
+ "SeaGreen1"
+ "DarkSeaGreen4"
+ "DarkSeaGreen3"
+ "DarkSeaGreen2"
+ "DarkSeaGreen1"
+ "aquamarine4"
+ "aquamarine3"
+ "aquamarine2"
+ "aquamarine1"
+ "DarkSlateGray4"
+ "DarkSlateGray3"
+ "DarkSlateGray2"
+ "DarkSlateGray1"
+ "cyan4"
+ "cyan3"
+ "cyan2"
+ "cyan1"
+ "turquoise4"
+ "turquoise3"
+ "turquoise2"
+ "turquoise1"
+ "CadetBlue4"
+ "CadetBlue3"
+ "CadetBlue2"
+ "CadetBlue1"
+ "PaleTurquoise4"
+ "PaleTurquoise3"
+ "PaleTurquoise2"
+ "PaleTurquoise1"
+ "LightCyan4"
+ "LightCyan3"
+ "LightCyan2"
+ "LightCyan1"
+ "LightBlue4"
+ "LightBlue3"
+ "LightBlue2"
+ "LightBlue1"
+ "LightSteelBlue4"
+ "LightSteelBlue3"
+ "LightSteelBlue2"
+ "LightSteelBlue1"
+ "SlateGray4"
+ "SlateGray3"
+ "SlateGray2"
+ "SlateGray1"
+ "LightSkyBlue4"
+ "LightSkyBlue3"
+ "LightSkyBlue2"
+ "LightSkyBlue1"
+ "SkyBlue4"
+ "SkyBlue3"
+ "SkyBlue2"
+ "SkyBlue1"
+ "DeepSkyBlue4"
+ "DeepSkyBlue3"
+ "DeepSkyBlue2"
+ "DeepSkyBlue1"
+ "SteelBlue4"
+ "SteelBlue3"
+ "SteelBlue2"
+ "SteelBlue1"
+ "DodgerBlue4"
+ "DodgerBlue3"
+ "DodgerBlue2"
+ "DodgerBlue1"
+ "blue4"
+ "blue3"
+ "blue2"
+ "blue1"
+ "RoyalBlue4"
+ "RoyalBlue3"
+ "RoyalBlue2"
+ "RoyalBlue1"
+ "SlateBlue4"
+ "SlateBlue3"
+ "SlateBlue2"
+ "SlateBlue1"
+ "azure4"
+ "azure3"
+ "azure2"
+ "azure1"
+ "MistyRose4"
+ "MistyRose3"
+ "MistyRose2"
+ "MistyRose1"
+ "LavenderBlush4"
+ "LavenderBlush3"
+ "LavenderBlush2"
+ "LavenderBlush1"
+ "honeydew4"
+ "honeydew3"
+ "honeydew2"
+ "honeydew1"
+ "ivory4"
+ "ivory3"
+ "ivory2"
+ "ivory1"
+ "cornsilk4"
+ "cornsilk3"
+ "cornsilk2"
+ "cornsilk1"
+ "LemonChiffon4"
+ "LemonChiffon3"
+ "LemonChiffon2"
+ "LemonChiffon1"
+ "NavajoWhite4"
+ "NavajoWhite3"
+ "NavajoWhite2"
+ "NavajoWhite1"
+ "PeachPuff4"
+ "PeachPuff3"
+ "PeachPuff2"
+ "PeachPuff1"
+ "bisque4"
+ "bisque3"
+ "bisque2"
+ "bisque1"
+ "AntiqueWhite4"
+ "AntiqueWhite3"
+ "AntiqueWhite2"
+ "AntiqueWhite1"
+ "seashell4"
+ "seashell3"
+ "seashell2"
+ "seashell1"
+ "snow4"
+ "snow3"
+ "snow2"
+ "snow1"
+ "thistle"
+ "MediumPurple"
+ "medium purple"
+ "purple"
+ "BlueViolet"
+ "blue violet"
+ "DarkViolet"
+ "dark violet"
+ "DarkOrchid"
+ "dark orchid"
+ "MediumOrchid"
+ "medium orchid"
+ "orchid"
+ "plum"
+ "violet"
+ "magenta"
+ "VioletRed"
+ "violet red"
+ "MediumVioletRed"
+ "medium violet red"
+ "maroon"
+ "PaleVioletRed"
+ "pale violet red"
+ "LightPink"
+ "light pink"
+ "pink"
+ "DeepPink"
+ "deep pink"
+ "HotPink"
+ "hot pink"
+ "red"
+ "OrangeRed"
+ "orange red"
+ "tomato"
+ "LightCoral"
+ "light coral"
+ "coral"
+ "DarkOrange"
+ "dark orange"
+ "orange"
+ "LightSalmon"
+ "light salmon"
+ "salmon"
+ "DarkSalmon"
+ "dark salmon"
+ "brown"
+ "firebrick"
+ "chocolate"
+ "tan"
+ "SandyBrown"
+ "sandy brown"
+ "wheat"
+ "beige"
+ "burlywood"
+ "peru"
+ "sienna"
+ "SaddleBrown"
+ "saddle brown"
+ "IndianRed"
+ "indian red"
+ "RosyBrown"
+ "rosy brown"
+ "DarkGoldenrod"
+ "dark goldenrod"
+ "goldenrod"
+ "LightGoldenrod"
+ "light goldenrod"
+ "gold"
+ "yellow"
+ "LightYellow"
+ "light yellow"
+ "LightGoldenrodYellow"
+ "light goldenrod yellow"
+ "PaleGoldenrod"
+ "pale goldenrod"
+ "khaki"
+ "DarkKhaki"
+ "dark khaki"
+ "OliveDrab"
+ "olive drab"
+ "ForestGreen"
+ "forest green"
+ "YellowGreen"
+ "yellow green"
+ "LimeGreen"
+ "lime green"
+ "GreenYellow"
+ "green yellow"
+ "MediumSpringGreen"
+ "medium spring green"
+ "chartreuse"
+ "green"
+ "LawnGreen"
+ "lawn green"
+ "SpringGreen"
+ "spring green"
+ "PaleGreen"
+ "pale green"
+ "LightSeaGreen"
+ "light sea green"
+ "MediumSeaGreen"
+ "medium sea green"
+ "SeaGreen"
+ "sea green"
+ "DarkSeaGreen"
+ "dark sea green"
+ "DarkOliveGreen"
+ "dark olive green"
+ "DarkGreen"
+ "dark green"
+ "aquamarine"
+ "MediumAquamarine"
+ "medium aquamarine"
+ "CadetBlue"
+ "cadet blue"
+ "LightCyan"
+ "light cyan"
+ "cyan"
+ "turquoise"
+ "MediumTurquoise"
+ "medium turquoise"
+ "DarkTurquoise"
+ "dark turquoise"
+ "PaleTurquoise"
+ "pale turquoise"
+ "PowderBlue"
+ "powder blue"
+ "LightBlue"
+ "light blue"
+ "LightSteelBlue"
+ "light steel blue"
+ "SteelBlue"
+ "steel blue"
+ "LightSkyBlue"
+ "light sky blue"
+ "SkyBlue"
+ "sky blue"
+ "DeepSkyBlue"
+ "deep sky blue"
+ "DodgerBlue"
+ "dodger blue"
+ "blue"
+ "RoyalBlue"
+ "royal blue"
+ "MediumBlue"
+ "medium blue"
+ "LightSlateBlue"
+ "light slate blue"
+ "MediumSlateBlue"
+ "medium slate blue"
+ "SlateBlue"
+ "slate blue"
+ "DarkSlateBlue"
+ "dark slate blue"
+ "CornflowerBlue"
+ "cornflower blue"
+ "NavyBlue"
+ "navy blue"
+ "navy"
+ "MidnightBlue"
+ "midnight blue"
+ "LightGray"
+ "light gray"
+ "LightGrey"
+ "light grey"
+ "grey"
+ "gray"
+ "LightSlateGrey"
+ "light slate grey"
+ "LightSlateGray"
+ "light slate gray"
+ "SlateGrey"
+ "slate grey"
+ "SlateGray"
+ "slate gray"
+ "DimGrey"
+ "dim grey"
+ "DimGray"
+ "dim gray"
+ "DarkSlateGrey"
+ "dark slate grey"
+ "DarkSlateGray"
+ "dark slate gray"
+ "black"
+ "white"
+ "MistyRose"
+ "misty rose"
+ "LavenderBlush"
+ "lavender blush"
+ "lavender"
+ "AliceBlue"
+ "alice blue"
+ "azure"
+ "MintCream"
+ "mint cream"
+ "honeydew"
+ "seashell"
+ "LemonChiffon"
+ "lemon chiffon"
+ "ivory"
+ "cornsilk"
+ "moccasin"
+ "NavajoWhite"
+ "navajo white"
+ "PeachPuff"
+ "peach puff"
+ "bisque"
+ "BlanchedAlmond"
+ "blanched almond"
+ "PapayaWhip"
+ "papaya whip"
+ "AntiqueWhite"
+ "antique white"
+ "linen"
+ "OldLace"
+ "old lace"
+ "FloralWhite"
+ "floral white"
+ "gainsboro"
+ "WhiteSmoke"
+ "white smoke"
+ "GhostWhite"
+ "ghost white"
+ "snow")
+ "The list of X colors from the `rgb.txt' file.
+ XConsortium: rgb.txt,v 10.41 94/02/20 18:39:36 rws Exp")
+
+ (defun xw-defined-colors (&optional frame)
+ "Internal function called by `defined-colors', which see."
+ (or frame (setq frame (selected-frame)))
+ (let ((all-colors x-colors)
+ (this-color nil)
+ (defined-colors nil))
+ (while all-colors
+ (setq this-color (car all-colors)
+ all-colors (cdr all-colors))
+ (and (color-supported-p this-color frame t)
+ (setq defined-colors (cons this-color defined-colors))))
+ defined-colors))
+
+ ;;;; Function keys
+
+ (substitute-key-definition 'suspend-emacs 'iconify-or-deiconify-frame
+ global-map)
+
+ ;; Map certain keypad keys into ASCII characters
+ ;; that people usually expect.
+ (define-key function-key-map [backspace] [127])
+ (define-key function-key-map [delete] [127])
+ (define-key function-key-map [tab] [?\t])
+ (define-key function-key-map [linefeed] [?\n])
+ (define-key function-key-map [clear] [?\C-l])
+ (define-key function-key-map [return] [?\C-m])
+ (define-key function-key-map [escape] [?\e])
+ (define-key function-key-map [M-backspace] [?\M-\d])
+ (define-key function-key-map [M-delete] [?\M-\d])
+ (define-key function-key-map [M-tab] [?\M-\t])
+ (define-key function-key-map [M-linefeed] [?\M-\n])
+ (define-key function-key-map [M-clear] [?\M-\C-l])
+ (define-key function-key-map [M-return] [?\M-\C-m])
+ (define-key function-key-map [M-escape] [?\M-\e])
+ (define-key function-key-map [iso-lefttab] [backtab])
+ (define-key function-key-map [S-iso-lefttab] [backtab])
+
+ ;; These tell read-char how to convert
+ ;; these special chars to ASCII.
+ (put 'backspace 'ascii-character 127)
+ (put 'delete 'ascii-character 127)
+ (put 'tab 'ascii-character ?\t)
+ (put 'linefeed 'ascii-character ?\n)
+ (put 'clear 'ascii-character 12)
+ (put 'return 'ascii-character 13)
+ (put 'escape 'ascii-character ?\e)
+
+
+ ;;;; Keysyms
+
+ (defun vendor-specific-keysyms (vendor)
+ "Return the appropriate value of `system-key-alist' for VENDOR.
+ VENDOR is a string containing the name of the X Server's vendor,
+ as returned by `x-server-vendor'."
+ ;; Fixme: Drop Apollo now?
+ (cond ((string-equal vendor "Apollo Computer Inc.")
+ '((65280 . linedel)
+ (65281 . chardel)
+ (65282 . copy)
+ (65283 . cut)
+ (65284 . paste)
+ (65285 . move)
+ (65286 . grow)
+ (65287 . cmd)
+ (65288 . shell)
+ (65289 . leftbar)
+ (65290 . rightbar)
+ (65291 . leftbox)
+ (65292 . rightbox)
+ (65293 . upbox)
+ (65294 . downbox)
+ (65295 . pop)
+ (65296 . read)
+ (65297 . edit)
+ (65298 . save)
+ (65299 . exit)
+ (65300 . repeat)))
+ ((or (string-equal vendor "Hewlett-Packard Incorporated")
+ (string-equal vendor "Hewlett-Packard Company"))
+ '(( 168 . mute-acute)
+ ( 169 . mute-grave)
+ ( 170 . mute-asciicircum)
+ ( 171 . mute-diaeresis)
+ ( 172 . mute-asciitilde)
+ ( 175 . lira)
+ ( 190 . guilder)
+ ( 252 . block)
+ ( 256 . longminus)
+ (65388 . reset)
+ (65389 . system)
+ (65390 . user)
+ (65391 . clearline)
+ (65392 . insertline)
+ (65393 . deleteline)
+ (65394 . insertchar)
+ (65395 . deletechar)
+ (65396 . backtab)
+ (65397 . kp-backtab)))
+ ;; Fixme: What about non-X11/NeWS sun server?
+ ((or (string-equal vendor "X11/NeWS - Sun Microsystems Inc.")
+ (string-equal vendor "X Consortium"))
+ '((392976 . f36)
+ (392977 . f37)
+ (393056 . req)
+ ;; These are for Sun under X11R6
+ (393072 . props)
+ (393073 . front)
+ (393074 . copy)
+ (393075 . open)
+ (393076 . paste)
+ (393077 . cut)))
+ (t
+ ;; This is used by DEC's X server.
+ '((65280 . remove)))))
+
+ ;; Latin-1
+ (let ((i 160))
+ (while (< i 256)
+ (puthash i i x-keysym-table)
+ (setq i (1+ i))))
+
+ ;; Table from Kuhn's proposed additions to the `KEYSYM Encoding'
+ ;; appendix to the X protocol definition.
+ (dolist
+ (pair
+ '(
+ ;; Latin-2
+ (#x1a1 . ?,B!(B)
+ (#x1a2 . ?,B"(B)
+ (#x1a3 . ?,B#(B)
+ (#x1a5 . ?,B%(B)
+ (#x1a6 . ?,B&(B)
+ (#x1a9 . ?,B)(B)
+ (#x1aa . ?,B*(B)
+ (#x1ab . ?,B+(B)
+ (#x1ac . ?,B,(B)
+ (#x1ae . ?,B.(B)
+ (#x1af . ?,B/(B)
+ (#x1b1 . ?,B1(B)
+ (#x1b2 . ?,B2(B)
+ (#x1b3 . ?,B3(B)
+ (#x1b5 . ?,B5(B)
+ (#x1b6 . ?,B6(B)
+ (#x1b7 . ?,B7(B)
+ (#x1b9 . ?,B9(B)
+ (#x1ba . ?,B:(B)
+ (#x1bb . ?,B;(B)
+ (#x1bc . ?,B<(B)
+ (#x1bd . ?,B=(B)
+ (#x1be . ?,B>(B)
+ (#x1bf . ?,B?(B)
+ (#x1c0 . ?,address@hidden(B)
+ (#x1c3 . ?,BC(B)
+ (#x1c5 . ?,BE(B)
+ (#x1c6 . ?,BF(B)
+ (#x1c8 . ?,BH(B)
+ (#x1ca . ?,BJ(B)
+ (#x1cc . ?,BL(B)
+ (#x1cf . ?,BO(B)
+ (#x1d0 . ?,BP(B)
+ (#x1d1 . ?,BQ(B)
+ (#x1d2 . ?,BR(B)
+ (#x1d5 . ?,BU(B)
+ (#x1d8 . ?,BX(B)
+ (#x1d9 . ?,BY(B)
+ (#x1db . ?,B[(B)
+ (#x1de . ?,B^(B)
+ (#x1e0 . ?,B`(B)
+ (#x1e3 . ?,Bc(B)
+ (#x1e5 . ?,Be(B)
+ (#x1e6 . ?,Bf(B)
+ (#x1e8 . ?,Bh(B)
+ (#x1ea . ?,Bj(B)
+ (#x1ec . ?,Bl(B)
+ (#x1ef . ?,Bo(B)
+ (#x1f0 . ?,Bp(B)
+ (#x1f1 . ?,Bq(B)
+ (#x1f2 . ?,Br(B)
+ (#x1f5 . ?,Bu(B)
+ (#x1f8 . ?,Bx(B)
+ (#x1f9 . ?,By(B)
+ (#x1fb . ?,B{(B)
+ (#x1fe . ?,B~(B)
+ (#x1ff . ?,B(B)
+ ;; Latin-3
+ (#x2a1 . ?,C!(B)
+ (#x2a6 . ?,C&(B)
+ (#x2a9 . ?,C)(B)
+ (#x2ab . ?,C+(B)
+ (#x2ac . ?,C,(B)
+ (#x2b1 . ?,C1(B)
+ (#x2b6 . ?,C6(B)
+ (#x2b9 . ?,C9(B)
+ (#x2bb . ?,C;(B)
+ (#x2bc . ?,C<(B)
+ (#x2c5 . ?,CE(B)
+ (#x2c6 . ?,CF(B)
+ (#x2d5 . ?,CU(B)
+ (#x2d8 . ?,CX(B)
+ (#x2dd . ?,C](B)
+ (#x2de . ?,C^(B)
+ (#x2e5 . ?,Ce(B)
+ (#x2e6 . ?,Cf(B)
+ (#x2f5 . ?,Cu(B)
+ (#x2f8 . ?,Cx(B)
+ (#x2fd . ?,C}(B)
+ (#x2fe . ?,C~(B)
+ ;; Latin-4
+ (#x3a2 . ?,D"(B)
+ (#x3a3 . ?,D#(B)
+ (#x3a5 . ?,D%(B)
+ (#x3a6 . ?,D&(B)
+ (#x3aa . ?,D*(B)
+ (#x3ab . ?,D+(B)
+ (#x3ac . ?,D,(B)
+ (#x3b3 . ?,D3(B)
+ (#x3b5 . ?,D5(B)
+ (#x3b6 . ?,D6(B)
+ (#x3ba . ?,D:(B)
+ (#x3bb . ?,D;(B)
+ (#x3bc . ?,D<(B)
+ (#x3bd . ?,D=(B)
+ (#x3bf . ?,D?(B)
+ (#x3c0 . ?,address@hidden(B)
+ (#x3c7 . ?,DG(B)
+ (#x3cc . ?,DL(B)
+ (#x3cf . ?,DO(B)
+ (#x3d1 . ?,DQ(B)
+ (#x3d2 . ?,DR(B)
+ (#x3d3 . ?,DS(B)
+ (#x3d9 . ?,DY(B)
+ (#x3dd . ?,D](B)
+ (#x3de . ?,D^(B)
+ (#x3e0 . ?,D`(B)
+ (#x3e7 . ?,Dg(B)
+ (#x3ec . ?,Dl(B)
+ (#x3ef . ?,Do(B)
+ (#x3f1 . ?,Dq(B)
+ (#x3f2 . ?,Dr(B)
+ (#x3f3 . ?,Ds(B)
+ (#x3f9 . ?,Dy(B)
+ (#x3fd . ?,D}(B)
+ (#x3fe . ?,D~(B)
+ ;; Kana: Fixme: needs conversion to Japanese charset -- seems
+ ;; to require jisx0213, for which the Unicode translation
+ ;; isn't clear.
+ (#x47e . ?$,1s>(B)
+ (#x4a1 . ?$,2=B(B)
+ (#x4a2 . ?\$,2=L(B)
+ (#x4a3 . ?\$,2=M(B)
+ (#x4a4 . ?$,2=A(B)
+ (#x4a5 . ?$,2?{(B)
+ (#x4a6 . ?$,2?r(B)
+ (#x4a7 . ?$,2?!(B)
+ (#x4a8 . ?$,2?#(B)
+ (#x4a9 . ?$,2?%(B)
+ (#x4aa . ?$,2?'(B)
+ (#x4ab . ?$,2?)(B)
+ (#x4ac . ?$,2?c(B)
+ (#x4ad . ?$,2?e(B)
+ (#x4ae . ?$,2?g(B)
+ (#x4af . ?$,2?C(B)
+ (#x4b0 . ?$,2?|(B)
+ (#x4b1 . ?$,2?"(B)
+ (#x4b2 . ?$,2?$(B)
+ (#x4b3 . ?$,2?&(B)
+ (#x4b4 . ?$,2?((B)
+ (#x4b5 . ?$,2?*(B)
+ (#x4b6 . ?$,2?+(B)
+ (#x4b7 . ?$,2?-(B)
+ (#x4b8 . ?$,2?/(B)
+ (#x4b9 . ?$,2?1(B)
+ (#x4ba . ?$,2?3(B)
+ (#x4bb . ?$,2?5(B)
+ (#x4bc . ?$,2?7(B)
+ (#x4bd . ?$,2?9(B)
+ (#x4be . ?$,2?;(B)
+ (#x4bf . ?$,2?=(B)
+ (#x4c0 . ?$,2??(B)
+ (#x4c1 . ?$,2?A(B)
+ (#x4c2 . ?$,2?D(B)
+ (#x4c3 . ?$,2?F(B)
+ (#x4c4 . ?$,2?H(B)
+ (#x4c5 . ?$,2?J(B)
+ (#x4c6 . ?$,2?K(B)
+ (#x4c7 . ?$,2?L(B)
+ (#x4c8 . ?$,2?M(B)
+ (#x4c9 . ?$,2?N(B)
+ (#x4ca . ?$,2?O(B)
+ (#x4cb . ?$,2?R(B)
+ (#x4cc . ?$,2?U(B)
+ (#x4cd . ?$,2?X(B)
+ (#x4ce . ?$,2?[(B)
+ (#x4cf . ?$,2?^(B)
+ (#x4d0 . ?$,2?_(B)
+ (#x4d1 . ?$,2?`(B)
+ (#x4d2 . ?$,2?a(B)
+ (#x4d3 . ?$,2?b(B)
+ (#x4d4 . ?$,2?d(B)
+ (#x4d5 . ?$,2?f(B)
+ (#x4d6 . ?$,2?h(B)
+ (#x4d7 . ?$,2?i(B)
+ (#x4d8 . ?$,2?j(B)
+ (#x4d9 . ?$,2?k(B)
+ (#x4da . ?$,2?l(B)
+ (#x4db . ?$,2?m(B)
+ (#x4dc . ?$,2?o(B)
+ (#x4dd . ?$,2?s(B)
+ (#x4de . ?$,2>{(B)
+ (#x4df . ?$,2>|(B)
+ ;; Arabic
+ (#x5ac . ?,G,(B)
+ (#x5bb . ?,G;(B)
+ (#x5bf . ?,G?(B)
+ (#x5c1 . ?,GA(B)
+ (#x5c2 . ?,GB(B)
+ (#x5c3 . ?,GC(B)
+ (#x5c4 . ?,GD(B)
+ (#x5c5 . ?,GE(B)
+ (#x5c6 . ?,GF(B)
+ (#x5c7 . ?,GG(B)
+ (#x5c8 . ?,GH(B)
+ (#x5c9 . ?,GI(B)
+ (#x5ca . ?,GJ(B)
+ (#x5cb . ?,GK(B)
+ (#x5cc . ?,GL(B)
+ (#x5cd . ?,GM(B)
+ (#x5ce . ?,GN(B)
+ (#x5cf . ?,GO(B)
+ (#x5d0 . ?,GP(B)
+ (#x5d1 . ?,GQ(B)
+ (#x5d2 . ?,GR(B)
+ (#x5d3 . ?,GS(B)
+ (#x5d4 . ?,GT(B)
+ (#x5d5 . ?,GU(B)
+ (#x5d6 . ?,GV(B)
+ (#x5d7 . ?,GW(B)
+ (#x5d8 . ?,GX(B)
+ (#x5d9 . ?,GY(B)
+ (#x5da . ?,GZ(B)
+ (#x5e0 . ?,G`(B)
+ (#x5e1 . ?,Ga(B)
+ (#x5e2 . ?,Gb(B)
+ (#x5e3 . ?,Gc(B)
+ (#x5e4 . ?,Gd(B)
+ (#x5e5 . ?,Ge(B)
+ (#x5e6 . ?,Gf(B)
+ (#x5e7 . ?,Gg(B)
+ (#x5e8 . ?,Gh(B)
+ (#x5e9 . ?,Gi(B)
+ (#x5ea . ?,Gj(B)
+ (#x5eb . ?,Gk(B)
+ (#x5ec . ?,Gl(B)
+ (#x5ed . ?,Gm(B)
+ (#x5ee . ?,Gn(B)
+ (#x5ef . ?,Go(B)
+ (#x5f0 . ?,Gp(B)
+ (#x5f1 . ?,Gq(B)
+ (#x5f2 . ?,Gr(B)
+ ;; Cyrillic
+ (#x6a1 . ?,Lr(B)
+ (#x6a2 . ?,Ls(B)
+ (#x6a3 . ?,Lq(B)
+ (#x6a4 . ?,Lt(B)
+ (#x6a5 . ?,Lu(B)
+ (#x6a6 . ?,Lv(B)
+ (#x6a7 . ?,Lw(B)
+ (#x6a8 . ?,Lx(B)
+ (#x6a9 . ?,Ly(B)
+ (#x6aa . ?,Lz(B)
+ (#x6ab . ?,L{(B)
+ (#x6ac . ?,L|(B)
+ (#x6ae . ?,L~(B)
+ (#x6af . ?,L(B)
+ (#x6b0 . ?,Lp(B)
+ (#x6b1 . ?,L"(B)
+ (#x6b2 . ?,L#(B)
+ (#x6b3 . ?,L!(B)
+ (#x6b4 . ?,L$(B)
+ (#x6b5 . ?,L%(B)
+ (#x6b6 . ?,L&(B)
+ (#x6b7 . ?,L'(B)
+ (#x6b8 . ?,L((B)
+ (#x6b9 . ?,L)(B)
+ (#x6ba . ?,L*(B)
+ (#x6bb . ?,L+(B)
+ (#x6bc . ?,L,(B)
+ (#x6be . ?,L.(B)
+ (#x6bf . ?,L/(B)
+ (#x6c0 . ?,Ln(B)
+ (#x6c1 . ?,LP(B)
+ (#x6c2 . ?,LQ(B)
+ (#x6c3 . ?,Lf(B)
+ (#x6c4 . ?,LT(B)
+ (#x6c5 . ?,LU(B)
+ (#x6c6 . ?,Ld(B)
+ (#x6c7 . ?,LS(B)
+ (#x6c8 . ?,Le(B)
+ (#x6c9 . ?,LX(B)
+ (#x6ca . ?,LY(B)
+ (#x6cb . ?,LZ(B)
+ (#x6cc . ?,L[(B)
+ (#x6cd . ?,L\(B)
+ (#x6ce . ?,L](B)
+ (#x6cf . ?,L^(B)
+ (#x6d0 . ?,L_(B)
+ (#x6d1 . ?,Lo(B)
+ (#x6d2 . ?,L`(B)
+ (#x6d3 . ?,La(B)
+ (#x6d4 . ?,Lb(B)
+ (#x6d5 . ?,Lc(B)
+ (#x6d6 . ?,LV(B)
+ (#x6d7 . ?,LR(B)
+ (#x6d8 . ?,Ll(B)
+ (#x6d9 . ?,Lk(B)
+ (#x6da . ?,LW(B)
+ (#x6db . ?,Lh(B)
+ (#x6dc . ?,Lm(B)
+ (#x6dd . ?,Li(B)
+ (#x6de . ?,Lg(B)
+ (#x6df . ?,Lj(B)
+ (#x6e0 . ?,LN(B)
+ (#x6e1 . ?,L0(B)
+ (#x6e2 . ?,L1(B)
+ (#x6e3 . ?,LF(B)
+ (#x6e4 . ?,L4(B)
+ (#x6e5 . ?,L5(B)
+ (#x6e6 . ?,LD(B)
+ (#x6e7 . ?,L3(B)
+ (#x6e8 . ?,LE(B)
+ (#x6e9 . ?,L8(B)
+ (#x6ea . ?,L9(B)
+ (#x6eb . ?,L:(B)
+ (#x6ec . ?,L;(B)
+ (#x6ed . ?,L<(B)
+ (#x6ee . ?,L=(B)
+ (#x6ef . ?,L>(B)
+ (#x6f0 . ?,L?(B)
+ (#x6f1 . ?,LO(B)
+ (#x6f2 . ?,address@hidden(B)
+ (#x6f3 . ?,LA(B)
+ (#x6f4 . ?,LB(B)
+ (#x6f5 . ?,LC(B)
+ (#x6f6 . ?,L6(B)
+ (#x6f7 . ?,L2(B)
+ (#x6f8 . ?,LL(B)
+ (#x6f9 . ?,LK(B)
+ (#x6fa . ?,L7(B)
+ (#x6fb . ?,LH(B)
+ (#x6fc . ?,LM(B)
+ (#x6fd . ?,LI(B)
+ (#x6fe . ?,LG(B)
+ (#x6ff . ?,LJ(B)
+ ;; Greek
+ (#x7a1 . ?,F6(B)
+ (#x7a2 . ?,F8(B)
+ (#x7a3 . ?,F9(B)
+ (#x7a4 . ?,F:(B)
+ (#x7a5 . ?,FZ(B)
+ (#x7a7 . ?,F<(B)
+ (#x7a8 . ?,F>(B)
+ (#x7a9 . ?,F[(B)
+ (#x7ab . ?,F?(B)
+ (#x7ae . ?,F5(B)
+ (#x7af . ?,F/(B)
+ (#x7b1 . ?,F\(B)
+ (#x7b2 . ?,F](B)
+ (#x7b3 . ?,F^(B)
+ (#x7b4 . ?,F_(B)
+ (#x7b5 . ?,Fz(B)
+ (#x7b6 . ?,address@hidden(B)
+ (#x7b7 . ?,F|(B)
+ (#x7b8 . ?,F}(B)
+ (#x7b9 . ?,F{(B)
+ (#x7ba . ?,F`(B)
+ (#x7bb . ?,F~(B)
+ (#x7c1 . ?,FA(B)
+ (#x7c2 . ?,FB(B)
+ (#x7c3 . ?,FC(B)
+ (#x7c4 . ?,FD(B)
+ (#x7c5 . ?,FE(B)
+ (#x7c6 . ?,FF(B)
+ (#x7c7 . ?,FG(B)
+ (#x7c8 . ?,FH(B)
+ (#x7c9 . ?,FI(B)
+ (#x7ca . ?,FJ(B)
+ (#x7cb . ?,FK(B)
+ (#x7cc . ?,FL(B)
+ (#x7cd . ?,FM(B)
+ (#x7ce . ?,FN(B)
+ (#x7cf . ?,FO(B)
+ (#x7d0 . ?,FP(B)
+ (#x7d1 . ?,FQ(B)
+ (#x7d2 . ?,FS(B)
+ (#x7d4 . ?,FT(B)
+ (#x7d5 . ?,FU(B)
+ (#x7d6 . ?,FV(B)
+ (#x7d7 . ?,FW(B)
+ (#x7d8 . ?,FX(B)
+ (#x7d9 . ?,FY(B)
+ (#x7e1 . ?,Fa(B)
+ (#x7e2 . ?,Fb(B)
+ (#x7e3 . ?,Fc(B)
+ (#x7e4 . ?,Fd(B)
+ (#x7e5 . ?,Fe(B)
+ (#x7e6 . ?,Ff(B)
+ (#x7e7 . ?,Fg(B)
+ (#x7e8 . ?,Fh(B)
+ (#x7e9 . ?,Fi(B)
+ (#x7ea . ?,Fj(B)
+ (#x7eb . ?,Fk(B)
+ (#x7ec . ?,Fl(B)
+ (#x7ed . ?,Fm(B)
+ (#x7ee . ?,Fn(B)
+ (#x7ef . ?,Fo(B)
+ (#x7f0 . ?,Fp(B)
+ (#x7f1 . ?,Fq(B)
+ (#x7f2 . ?,Fs(B)
+ (#x7f3 . ?,Fr(B)
+ (#x7f4 . ?,Ft(B)
+ (#x7f5 . ?,Fu(B)
+ (#x7f6 . ?,Fv(B)
+ (#x7f7 . ?,Fw(B)
+ (#x7f8 . ?,Fx(B)
+ (#x7f9 . ?,Fy(B)
+ ;; Technical
+ (#x8a1 . ?$,1|W(B)
+ (#x8a2 . ?$,2 ,(B)
+ (#x8a3 . ?$,2 (B)
+ (#x8a4 . ?$,1{ (B)
+ (#x8a5 . ?$,1{!(B)
+ (#x8a6 . ?$,2 "(B)
+ (#x8a7 . ?$,1|A(B)
+ (#x8a8 . ?$,1|C(B)
+ (#x8a9 . ?$,1|D(B)
+ (#x8aa . ?$,1|F(B)
+ (#x8ab . ?$,1|;(B)
+ (#x8ac . ?$,1|=(B)
+ (#x8ad . ?$,1|>(B)
+ (#x8ae . ?$,1|@(B)
+ (#x8af . ?$,1|H(B)
+ (#x8b0 . ?$,1|L(B)
+ (#x8bc . ?$,1y$(B)
+ (#x8bd . ?$,1y (B)
+ (#x8be . ?$,1y%(B)
+ (#x8bf . ?$,1xK(B)
+ (#x8c0 . ?$,1xT(B)
+ (#x8c1 . ?$,1x=(B)
+ (#x8c2 . ?$,1x>(B)
+ (#x8c5 . ?$,1x'(B)
+ (#x8c8 . ?$,1x\(B)
+ (#x8c9 . ?$,1xc(B)
+ (#x8cd . ?$,1wT(B)
+ (#x8ce . ?$,1wR(B)
+ (#x8cf . ?$,1y!(B)
+ (#x8d6 . ?$,1x:(B)
+ (#x8da . ?$,1yB(B)
+ (#x8db . ?$,1yC(B)
+ (#x8dc . ?$,1xI(B)
+ (#x8dd . ?$,1xJ(B)
+ (#x8de . ?$,1xG(B)
+ (#x8df . ?$,1xH(B)
+ (#x8ef . ?$,1x"(B)
+ (#x8f6 . ?$,1!R(B)
+ (#x8fb . ?$,1vp(B)
+ (#x8fc . ?$,1vq(B)
+ (#x8fd . ?$,1vr(B)
+ (#x8fe . ?$,1vs(B)
+ ;; Special
+ (#x9e0 . ?$,2"&(B)
+ (#x9e1 . ?$,2!R(B)
+ (#x9e2 . ?$,1}I(B)
+ (#x9e3 . ?$,1}L(B)
+ (#x9e4 . ?$,1}M(B)
+ (#x9e5 . ?$,1}J(B)
+ (#x9e8 . ?$,1}d(B)
+ (#x9e9 . ?$,1}K(B)
+ (#x9ea . ?$,2 8(B)
+ (#x9eb . ?$,2 0(B)
+ (#x9ec . ?$,2 ,(B)
+ (#x9ed . ?$,2 4(B)
+ (#x9ee . ?$,2 \(B)
+ (#x9ef . ?$,1|Z(B)
+ (#x9f0 . ?$,1|[(B)
+ (#x9f1 . ?$,2 (B)
+ (#x9f2 . ?$,1|\(B)
+ (#x9f3 . ?$,1|](B)
+ (#x9f4 . ?$,2 <(B)
+ (#x9f5 . ?$,2 D(B)
+ (#x9f6 . ?$,2 T(B)
+ (#x9f7 . ?$,2 L(B)
+ (#x9f8 . ?$,2 "(B)
+ ;; Publishing
+ (#xaa1 . ?$,1rc(B)
+ (#xaa2 . ?$,1rb(B)
+ (#xaa3 . ?$,1rd(B)
+ (#xaa4 . ?$,1re(B)
+ (#xaa5 . ?$,1rg(B)
+ (#xaa6 . ?$,1rh(B)
+ (#xaa7 . ?$,1ri(B)
+ (#xaa8 . ?$,1rj(B)
+ (#xaa9 . ?$,1rt(B)
+ (#xaaa . ?$,1rs(B)
+ (#xaae . ?$,1s&(B)
+ (#xaaf . ?$,1s%(B)
+ (#xab0 . ?$,1v3(B)
+ (#xab1 . ?$,1v4(B)
+ (#xab2 . ?$,1v5(B)
+ (#xab3 . ?$,1v6(B)
+ (#xab4 . ?$,1v7(B)
+ (#xab5 . ?$,1v8(B)
+ (#xab6 . ?$,1v9(B)
+ (#xab7 . ?$,1v:(B)
+ (#xab8 . ?$,1uE(B)
+ (#xabb . ?$,1rr(B)
+ (#xabc . ?$,1{)(B)
+ (#xabe . ?$,1{*(B)
+ (#xac3 . ?$,1v;(B)
+ (#xac4 . ?$,1v<(B)
+ (#xac5 . ?$,1v=(B)
+ (#xac6 . ?$,1v>(B)
+ (#xac9 . ?$,1ub(B)
+ (#xaca . ?$,2"s(B)
+ (#xacc . ?$,2"!(B)
+ (#xacd . ?$,2!w(B)
+ (#xace . ?$,2"+(B)
+ (#xacf . ?$,2!o(B)
+ (#xad0 . ?$,1rx(B)
+ (#xad1 . ?$,1ry(B)
+ (#xad2 . ?$,1r|(B)
+ (#xad3 . ?$,1r}(B)
+ (#xad4 . ?$,1u^(B)
+ (#xad6 . ?$,1s2(B)
+ (#xad7 . ?$,1s3(B)
+ (#xad9 . ?$,2%](B)
+ (#xadb . ?$,2!l(B)
+ (#xadc . ?$,2" (B)
+ (#xadd . ?$,2!v(B)
+ (#xade . ?$,2"/(B)
+ (#xadf . ?$,2!n(B)
+ (#xae0 . ?$,2"F(B)
+ (#xae1 . ?$,2!k(B)
+ (#xae2 . ?$,2!m(B)
+ (#xae3 . ?$,2!s(B)
+ (#xae4 . ?$,2!}(B)
+ (#xae5 . ?$,2"f(B)
+ (#xae6 . ?$,1s"(B)
+ (#xae7 . ?$,2!j(B)
+ (#xae8 . ?$,2!r(B)
+ (#xae9 . ?$,2!|(B)
+ (#xaea . ?$,2"|(B)
+ (#xaeb . ?$,2"~(B)
+ (#xaec . ?$,2#c(B)
+ (#xaed . ?$,2#f(B)
+ (#xaee . ?$,2#e(B)
+ (#xaf0 . ?$,2%`(B)
+ (#xaf1 . ?$,1s (B)
+ (#xaf2 . ?$,1s!(B)
+ (#xaf3 . ?$,2%S(B)
+ (#xaf4 . ?$,2%W(B)
+ (#xaf5 . ?$,2#o(B)
+ (#xaf6 . ?$,2#m(B)
+ (#xaf7 . ?$,2#B(B)
+ (#xaf8 . ?$,address@hidden(B)
+ (#xaf9 . ?$,2"n(B)
+ (#xafa . ?$,1zu(B)
+ (#xafb . ?$,1uW(B)
+ (#xafc . ?$,1s8(B)
+ (#xafd . ?$,1rz(B)
+ (#xafe . ?$,1r~(B)
+ ;; APL
+ (#xba3 . ?<)
+ (#xba6 . ?>)
+ (#xba8 . ?$,1xH(B)
+ (#xba9 . ?$,1xG(B)
+ (#xbc0 . ?,A/(B)
+ (#xbc2 . ?$,1ye(B)
+ (#xbc3 . ?$,1xI(B)
+ (#xbc4 . ?$,1zj(B)
+ (#xbc6 . ?_)
+ (#xbca . ?$,1x8(B)
+ (#xbcc . ?$,1|5(B)
+ (#xbce . ?$,1yd(B)
+ (#xbcf . ?$,2"+(B)
+ (#xbd3 . ?$,1zh(B)
+ (#xbd6 . ?$,1xJ(B)
+ (#xbd8 . ?$,1yC(B)
+ (#xbda . ?$,1yB(B)
+ (#xbdc . ?$,1yb(B)
+ (#xbfc . ?$,1yc(B)
+ ;; Hebrew
+ (#xcdf . ?,H_(B)
+ (#xce0 . ?,H`(B)
+ (#xce1 . ?,Ha(B)
+ (#xce2 . ?,Hb(B)
+ (#xce3 . ?,Hc(B)
+ (#xce4 . ?,Hd(B)
+ (#xce5 . ?,He(B)
+ (#xce6 . ?,Hf(B)
+ (#xce7 . ?,Hg(B)
+ (#xce8 . ?,Hh(B)
+ (#xce9 . ?,Hi(B)
+ (#xcea . ?,Hj(B)
+ (#xceb . ?,Hk(B)
+ (#xcec . ?,Hl(B)
+ (#xced . ?,Hm(B)
+ (#xcee . ?,Hn(B)
+ (#xcef . ?,Ho(B)
+ (#xcf0 . ?,Hp(B)
+ (#xcf1 . ?,Hq(B)
+ (#xcf2 . ?,Hr(B)
+ (#xcf3 . ?,Hs(B)
+ (#xcf4 . ?,Ht(B)
+ (#xcf5 . ?,Hu(B)
+ (#xcf6 . ?,Hv(B)
+ (#xcf7 . ?,Hw(B)
+ (#xcf8 . ?,Hx(B)
+ (#xcf9 . ?,Hy(B)
+ (#xcfa . ?,Hz(B)
+ ;; Thai
+ (#xda1 . ?,T!(B)
+ (#xda2 . ?,T"(B)
+ (#xda3 . ?,T#(B)
+ (#xda4 . ?,T$(B)
+ (#xda5 . ?,T%(B)
+ (#xda6 . ?,T&(B)
+ (#xda7 . ?,T'(B)
+ (#xda8 . ?,T((B)
+ (#xda9 . ?,T)(B)
+ (#xdaa . ?,T*(B)
+ (#xdab . ?,T+(B)
+ (#xdac . ?,T,(B)
+ (#xdad . ?,T-(B)
+ (#xdae . ?,T.(B)
+ (#xdaf . ?,T/(B)
+ (#xdb0 . ?,T0(B)
+ (#xdb1 . ?,T1(B)
+ (#xdb2 . ?,T2(B)
+ (#xdb3 . ?,T3(B)
+ (#xdb4 . ?,T4(B)
+ (#xdb5 . ?,T5(B)
+ (#xdb6 . ?,T6(B)
+ (#xdb7 . ?,T7(B)
+ (#xdb8 . ?,T8(B)
+ (#xdb9 . ?,T9(B)
+ (#xdba . ?,T:(B)
+ (#xdbb . ?,T;(B)
+ (#xdbc . ?,T<(B)
+ (#xdbd . ?,T=(B)
+ (#xdbe . ?,T>(B)
+ (#xdbf . ?,T?(B)
+ (#xdc0 . ?,address@hidden(B)
+ (#xdc1 . ?,TA(B)
+ (#xdc2 . ?,TB(B)
+ (#xdc3 . ?,TC(B)
+ (#xdc4 . ?,TD(B)
+ (#xdc5 . ?,TE(B)
+ (#xdc6 . ?,TF(B)
+ (#xdc7 . ?,TG(B)
+ (#xdc8 . ?,TH(B)
+ (#xdc9 . ?,TI(B)
+ (#xdca . ?,TJ(B)
+ (#xdcb . ?,TK(B)
+ (#xdcc . ?,TL(B)
+ (#xdcd . ?,TM(B)
+ (#xdce . ?,TN(B)
+ (#xdcf . ?,TO(B)
+ (#xdd0 . ?,TP(B)
+ (#xdd1 . ?,TQ(B)
+ (#xdd2 . ?,TR(B)
+ (#xdd3 . ?,TS(B)
+ (#xdd4 . ?,TT(B)
+ (#xdd5 . ?,TU(B)
+ (#xdd6 . ?,TV(B)
+ (#xdd7 . ?,TW(B)
+ (#xdd8 . ?,TX(B)
+ (#xdd9 . ?,TY(B)
+ (#xdda . ?,TZ(B)
+ (#xddf . ?,T_(B)
+ (#xde0 . ?,T`(B)
+ (#xde1 . ?,Ta(B)
+ (#xde2 . ?,Tb(B)
+ (#xde3 . ?,Tc(B)
+ (#xde4 . ?,Td(B)
+ (#xde5 . ?,Te(B)
+ (#xde6 . ?,Tf(B)
+ (#xde7 . ?,Tg(B)
+ (#xde8 . ?,Th(B)
+ (#xde9 . ?,Ti(B)
+ (#xdea . ?,Tj(B)
+ (#xdeb . ?,Tk(B)
+ (#xdec . ?,Tl(B)
+ (#xded . ?,Tm(B)
+ (#xdf0 . ?,Tp(B)
+ (#xdf1 . ?,Tq(B)
+ (#xdf2 . ?,Tr(B)
+ (#xdf3 . ?,Ts(B)
+ (#xdf4 . ?,Tt(B)
+ (#xdf5 . ?,Tu(B)
+ (#xdf6 . ?,Tv(B)
+ (#xdf7 . ?,Tw(B)
+ (#xdf8 . ?,Tx(B)
+ (#xdf9 . ?,Ty(B)
+ ;; Korean
+ (#xea1 . ?$(C$!(B)
+ (#xea2 . ?$(C$"(B)
+ (#xea3 . ?$(C$#(B)
+ (#xea4 . ?$(C$$(B)
+ (#xea5 . ?$(C$%(B)
+ (#xea6 . ?$(C$&(B)
+ (#xea7 . ?$(C$'(B)
+ (#xea8 . ?$(C$((B)
+ (#xea9 . ?$(C$)(B)
+ (#xeaa . ?$(C$*(B)
+ (#xeab . ?$(C$+(B)
+ (#xeac . ?$(C$,(B)
+ (#xead . ?$(C$-(B)
+ (#xeae . ?$(C$.(B)
+ (#xeaf . ?$(C$/(B)
+ (#xeb0 . ?$(C$0(B)
+ (#xeb1 . ?$(C$1(B)
+ (#xeb2 . ?$(C$2(B)
+ (#xeb3 . ?$(C$3(B)
+ (#xeb4 . ?$(C$4(B)
+ (#xeb5 . ?$(C$5(B)
+ (#xeb6 . ?$(C$6(B)
+ (#xeb7 . ?$(C$7(B)
+ (#xeb8 . ?$(C$8(B)
+ (#xeb9 . ?$(C$9(B)
+ (#xeba . ?$(C$:(B)
+ (#xebb . ?$(C$;(B)
+ (#xebc . ?$(C$<(B)
+ (#xebd . ?$(C$=(B)
+ (#xebe . ?$(C$>(B)
+ (#xebf . ?$(C$?(B)
+ (#xec0 . ?$(address@hidden(B)
+ (#xec1 . ?$(C$A(B)
+ (#xec2 . ?$(C$B(B)
+ (#xec3 . ?$(C$C(B)
+ (#xec4 . ?$(C$D(B)
+ (#xec5 . ?$(C$E(B)
+ (#xec6 . ?$(C$F(B)
+ (#xec7 . ?$(C$G(B)
+ (#xec8 . ?$(C$H(B)
+ (#xec9 . ?$(C$I(B)
+ (#xeca . ?$(C$J(B)
+ (#xecb . ?$(C$K(B)
+ (#xecc . ?$(C$L(B)
+ (#xecd . ?$(C$M(B)
+ (#xece . ?$(C$N(B)
+ (#xecf . ?$(C$O(B)
+ (#xed0 . ?$(C$P(B)
+ (#xed1 . ?$(C$Q(B)
+ (#xed2 . ?$(C$R(B)
+ (#xed3 . ?$(C$S(B)
+ (#xed4 . ?$,1LH(B)
+ (#xed5 . ?$,1LI(B)
+ (#xed6 . ?$,1LJ(B)
+ (#xed7 . ?$,1LK(B)
+ (#xed8 . ?$,1LL(B)
+ (#xed9 . ?$,1LM(B)
+ (#xeda . ?$,1LN(B)
+ (#xedb . ?$,1LO(B)
+ (#xedc . ?$,1LP(B)
+ (#xedd . ?$,1LQ(B)
+ (#xede . ?$,1LR(B)
+ (#xedf . ?$,1LS(B)
+ (#xee0 . ?$,1LT(B)
+ (#xee1 . ?$,1LU(B)
+ (#xee2 . ?$,1LV(B)
+ (#xee3 . ?$,1LW(B)
+ (#xee4 . ?$,1LX(B)
+ (#xee5 . ?$,1LY(B)
+ (#xee6 . ?$,1LZ(B)
+ (#xee7 . ?$,1L[(B)
+ (#xee8 . ?$,1L\(B)
+ (#xee9 . ?$,1L](B)
+ (#xeea . ?$,1L^(B)
+ (#xeeb . ?$,1L_(B)
+ (#xeec . ?$,1L`(B)
+ (#xeed . ?$,1La(B)
+ (#xeee . ?$,1Lb(B)
+ (#xeef . ?$(C$](B)
+ (#xef0 . ?$(C$a(B)
+ (#xef1 . ?$(C$h(B)
+ (#xef2 . ?$(C$o(B)
+ (#xef3 . ?$(C$q(B)
+ (#xef4 . ?$(C$t(B)
+ (#xef5 . ?$(C$v(B)
+ (#xef6 . ?$(C$}(B)
+ (#xef7 . ?$(C$~(B)
+ (#xef8 . ?$,1M+(B)
+ (#xef9 . ?$,1M0(B)
+ (#xefa . ?$,1M9(B)
+ (#xeff . ?$,1tI(B)
+ ;; Latin-5
+ ;; Latin-6
+ ;; Latin-7
+ ;; Latin-8
+ ;; Latin-9
+ (#x13bc . ?,b<(B)
+ (#x13bd . ?,b=(B)
+ (#x13be . ?,b>(B)
+ ;; Currency
+ (#x20a0 . ?$,address@hidden(B)
+ (#x20a1 . ?$,1tA(B)
+ (#x20a2 . ?$,1tB(B)
+ (#x20a3 . ?$,1tC(B)
+ (#x20a4 . ?$,1tD(B)
+ (#x20a5 . ?$,1tE(B)
+ (#x20a6 . ?$,1tF(B)
+ (#x20a7 . ?$,1tG(B)
+ (#x20a8 . ?$,1tH(B)
+ (#x20aa . ?$,1tJ(B)
+ (#x20ab . ?$,1tK(B)
+ (#x20ac . ?,b$(B)))
+ (puthash (car pair) (cdr pair) x-keysym-table))
+
+ ;; The following keysym codes for graphics are listed in the document
+ ;; as not having unicodes available:
+
+ ;; #x08b1 TOP LEFT SUMMATION Technical
+ ;; #x08b2 BOTTOM LEFT SUMMATION Technical
+ ;; #x08b3 TOP VERTICAL SUMMATION CONNECTOR Technical
+ ;; #x08b4 BOTTOM VERTICAL SUMMATION CONNECTOR Technical
+ ;; #x08b5 TOP RIGHT SUMMATION Technical
+ ;; #x08b6 BOTTOM RIGHT SUMMATION Technical
+ ;; #x08b7 RIGHT MIDDLE SUMMATION Technical
+ ;; #x0aac SIGNIFICANT BLANK SYMBOL Publish
+ ;; #x0abd DECIMAL POINT Publish
+ ;; #x0abf MARKER Publish
+ ;; #x0acb TRADEMARK SIGN IN CIRCLE Publish
+ ;; #x0ada HEXAGRAM Publish
+ ;; #x0aff CURSOR Publish
+ ;; #x0dde THAI MAIHANAKAT Thai
+
+
+ ;;;; Selections and cut buffers
+
+ ;;; We keep track of the last text selected here, so we can check the
+ ;;; current selection against it, and avoid passing back our own text
+ ;;; from x-cut-buffer-or-selection-value. We track all three
+ ;;; seperately in case another X application only sets one of them
+ ;;; (say the cut buffer) we aren't fooled by the PRIMARY or
+ ;;; CLIPBOARD selection staying the same.
+ (defvar x-last-selected-text-clipboard nil
+ "The value of the CLIPBOARD X selection last time we selected or
+ pasted text.")
+ (defvar x-last-selected-text-primary nil
+ "The value of the PRIMARY X selection last time we selected or
+ pasted text.")
+ (defvar x-last-selected-text-cut nil
+ "The value of the X cut buffer last time we selected or pasted text.")
+
+ ;;; It is said that overlarge strings are slow to put into the cut buffer.
+ ;;; Note this value is overridden below.
+ (defvar x-cut-buffer-max 20000
+ "Max number of characters to put in the cut buffer.")
+
+ (defcustom x-select-enable-clipboard nil
+ "Non-nil means cutting and pasting uses the clipboard.
+ This is in addition to, but in preference to, the primary selection."
+ :type 'boolean
+ :group 'killing)
+
+ ;;; Make TEXT, a string, the primary X selection.
+ ;;; Also, set the value of X cut buffer 0, for backward compatibility
+ ;;; with older X applications.
+ ;;; address@hidden says it's not desirable to put kills
+ ;;; in the clipboard.
+ (defun x-select-text (text &optional push)
+ ;; Don't send the cut buffer too much text.
+ ;; It becomes slow, and if really big it causes errors.
+ (cond ((>= (length text) x-cut-buffer-max)
+ (x-set-cut-buffer "" push)
+ (setq x-last-selected-text-cut ""))
+ ;; Don't store a multibyte string that contains
+ ;; eight-bit-control/graphic chars because they can't be
+ ;; restored correctly by x-get-cut-buffer.
+ ((and (multibyte-string-p text)
+ (let ((charsets (find-charset-string text)))
+ (or (memq 'eight-bit-control charsets)
+ (memq 'eight-bit-graphic charsets))))
+ (x-set-cut-buffer "" push)
+ (setq x-last-selected-text-cut ""))
+ (t
+ (x-set-cut-buffer text push)
+ (setq x-last-selected-text-cut text)))
+ (x-set-selection 'PRIMARY text)
+ (setq x-last-selected-text-primary text)
+ (when x-select-enable-clipboard
+ (x-set-selection 'CLIPBOARD text)
+ (setq x-last-selected-text-clipboard text))
+ )
+
+ (defvar x-select-request-type nil
+ "*Data type request for X selection.
+ The value is nil, one of the following data types, or a list of them:
+ `COMPOUND_TEXT', `UTF8_STRING', `STRING', `TEXT'
+
+ If the value is nil, try `COMPOUND_TEXT' and `UTF8_STRING', and
+ use the more appropriate result. If both fail, try `STRING', and
+ then `TEXT'.
+
+ If the value is one of the above symbols, try only the specified
+ type.
+
+ If the value is a list of them, try each of them in the specified
+ order until succeed.")
+
+ ;; Helper function for x-selection-value. Select UTF8 or CTEXT
+ ;; whichever is more appropriate. Here, we use this heurisitcs.
+ ;;
+ ;; (1) If their lengthes are different, select the longer one. This
+ ;; is because an X client may just cut off unsupported characters.
+ ;;
+ ;; (2) Otherwise, if the Nth character of CTEXT is an ASCII
+ ;; character that is different from the Nth character of UTF8,
+ ;; select UTF8. This is because an X client may replace unsupported
+ ;; characters with some ASCII character (typically ` ' or `?') in
+ ;; CTEXT.
+ ;;
+ ;; (3) Otherwise, select CTEXT. This is because legacy charsets are
+ ;; better for the current Emacs, especially when the selection owner
+ ;; is also Emacs.
+
+ (defun x-select-utf8-or-ctext (utf8 ctext)
+ (let ((len-utf8 (length utf8))
+ (len-ctext (length ctext))
+ (selected ctext)
+ (i 0)
+ char)
+ (if (/= len-utf8 len-ctext)
+ (if (> len-utf8 len-ctext) utf8 ctext)
+ (while (< i len-utf8)
+ (setq char (aref ctext i))
+ (if (and (< char 128) (/= char (aref utf8 i)))
+ (setq selected utf8
+ i len-utf8)
+ (setq i (1+ i))))
+ selected)))
+
+ (defun x-selection-value (type)
+ (let (text)
+ (cond ((null x-select-request-type)
+ (let (utf8 ctext utf8-coding)
+ ;; We try both UTF8_STRING and COMPOUND_TEXT, and choose
+ ;; the more appropriate one. If both fail, try STRING.
+
+ ;; At first try UTF8_STRING.
+ (setq utf8 (condition-case nil
+ (x-get-selection type 'UTF8_STRING)
+ (error nil))
+ utf8-coding last-coding-system-used)
+ (if utf8
+ ;; If it is a locale selection, choose it.
+ (or (get-text-property 0 'foreign-selection utf8)
+ (setq text utf8)))
+ ;; If not yet decided, try COMPOUND_TEXT.
+ (if (not text)
+ (if (setq ctext (condition-case nil
+ (x-get-selection type 'COMPOUND_TEXT)
+ (error nil)))
+ ;; If UTF8_STRING was also successful, choose the
+ ;; more appropriate one from UTF8 and CTEXT.
+ (if utf8
+ (setq text (x-select-utf8-or-ctext utf8 ctext))
+ ;; Othewise, choose CTEXT.
+ (setq text ctext))))
+ ;; If not yet decided, try STRING.
+ (or text
+ (setq text (condition-case nil
+ (x-get-selection type 'STRING)
+ (error nil))))
+ (if (eq text utf8)
+ (setq last-coding-system-used utf8-coding))))
+
+ ((consp x-select-request-type)
+ (let ((tail x-select-request-type))
+ (while (and tail (not text))
+ (condition-case nil
+ (setq text (x-get-selection type (car tail)))
+ (error nil))
+ (setq tail (cdr tail)))))
+
+ (t
+ (condition-case nil
+ (setq text (x-get-selection type x-select-request-type))
+ (error nil))))
+
+ (if text
+ (remove-text-properties 0 (length text) '(foreign-selection nil) text))
+ text))
+
+ ;;; Return the value of the current X selection.
+ ;;; Consult the selection, and the cut buffer. Treat empty strings
+ ;;; as if they were unset.
+ ;;; If this function is called twice and finds the same text,
+ ;;; it returns nil the second time. This is so that a single
+ ;;; selection won't be added to the kill ring over and over.
+ (defun x-cut-buffer-or-selection-value ()
+ (let (clip-text primary-text cut-text)
+ (when x-select-enable-clipboard
+ (setq clip-text (x-selection-value 'CLIPBOARD))
+ (if (string= clip-text "") (setq clip-text nil))
+
+ ;; Check the CLIPBOARD selection for 'newness', is it different
+ ;; from what we remebered them to be last time we did a
+ ;; cut/paste operation.
+ (setq clip-text
+ (cond;; check clipboard
+ ((or (not clip-text) (string= clip-text ""))
+ (setq x-last-selected-text-clipboard nil))
+ ((eq clip-text x-last-selected-text-clipboard) nil)
+ ((string= clip-text x-last-selected-text-clipboard)
+ ;; Record the newer string,
+ ;; so subsequent calls can use the `eq' test.
+ (setq x-last-selected-text-clipboard clip-text)
+ nil)
+ (t
+ (setq x-last-selected-text-clipboard clip-text))))
+ )
+
+ (setq primary-text (x-selection-value 'PRIMARY))
+ ;; Check the PRIMARY selection for 'newness', is it different
+ ;; from what we remebered them to be last time we did a
+ ;; cut/paste operation.
+ (setq primary-text
+ (cond;; check primary selection
+ ((or (not primary-text) (string= primary-text ""))
+ (setq x-last-selected-text-primary nil))
+ ((eq primary-text x-last-selected-text-primary) nil)
+ ((string= primary-text x-last-selected-text-primary)
+ ;; Record the newer string,
+ ;; so subsequent calls can use the `eq' test.
+ (setq x-last-selected-text-primary primary-text)
+ nil)
+ (t
+ (setq x-last-selected-text-primary primary-text))))
+
+ (setq cut-text (x-get-cut-buffer 0))
+
+ ;; Check the x cut buffer for 'newness', is it different
+ ;; from what we remebered them to be last time we did a
+ ;; cut/paste operation.
+ (setq cut-text
+ (cond;; check primary selection
+ ((or (not cut-text) (string= cut-text ""))
+ (setq x-last-selected-text-cut nil))
+ ((eq cut-text x-last-selected-text-cut) nil)
+ ((string= cut-text x-last-selected-text-cut)
+ ;; Record the newer string,
+ ;; so subsequent calls can use the `eq' test.
+ (setq x-last-selected-text-cut cut-text)
+ nil)
+ (t
+ (setq x-last-selected-text-cut cut-text))))
+
+ ;; As we have done one selection, clear this now.
+ (setq next-selection-coding-system nil)
+
+ ;; At this point we have recorded the current values for the
+ ;; selection from clipboard (if we are supposed to) primary,
+ ;; and cut buffer. So return the first one that has changed
+ ;; (which is the first non-null one).
+ ;;
+ ;; NOTE: There will be cases where more than one of these has
+ ;; changed and the new values differ. This indicates that
+ ;; something like the following has happened since the last time
+ ;; we looked at the selections: Application X set all the
+ ;; selections, then Application Y set only one or two of them (say
+ ;; just the cut-buffer). In this case since we don't have
+ ;; timestamps there is no way to know what the 'correct' value to
+ ;; return is. The nice thing to do would be to tell the user we
+ ;; saw multiple possible selections and ask the user which was the
+ ;; one they wanted.
+ ;; This code is still a big improvement because now the user can
+ ;; futz with the current selection and get emacs to pay attention
+ ;; to the cut buffer again (previously as soon as clipboard or
+ ;; primary had been set the cut buffer would essentially never be
+ ;; checked again).
+ (or clip-text primary-text cut-text)
+ ))
+
+
+ ;;; Do the actual X Windows setup here; the above code just defines
+ ;;; functions and variables that we use now.
+
+ (setq command-line-args (x-handle-args command-line-args))
+
+ ;;; Make sure we have a valid resource name.
+ (or (stringp x-resource-name)
+ (let (i)
+ (setq x-resource-name (invocation-name))
+
+ ;; Change any . or * characters in x-resource-name to hyphens,
+ ;; so as not to choke when we use it in X resource queries.
+ (while (setq i (string-match "[.*]" x-resource-name))
+ (aset x-resource-name i ?-))))
+
+ (x-open-connection (or x-display-name
+ (setq x-display-name (getenv "DISPLAY")))
+ x-command-line-resources
+ ;; Exit Emacs with fatal error if this fails.
+ t)
+
+ (setq frame-creation-function 'x-create-frame-with-faces)
+
+ (setq x-cut-buffer-max (min (- (/ (x-server-max-request-size) 2) 100)
+ x-cut-buffer-max))
+
+ ;; Setup the default fontset.
+ (setup-default-fontset)
+
+ ;; Create the standard fontset.
+ (create-fontset-from-fontset-spec standard-fontset-spec t)
+
+ ;; Create fontset specified in X resources "Fontset-N" (N is 0, 1, ...).
+ (create-fontset-from-x-resource)
+
+ ;; Sun expects the menu bar cut and paste commands to use the clipboard.
+ ;; This has ,? to match both on Sunos and on Solaris.
+ (if (string-match "Sun Microsystems,? Inc\\."
+ (x-server-vendor))
+ (menu-bar-enable-clipboard))
+
+ ;; Apply a geometry resource to the initial frame. Put it at the end
+ ;; of the alist, so that anything specified on the command line takes
+ ;; precedence.
+ (let* ((res-geometry (x-get-resource "geometry" "Geometry"))
+ parsed)
+ (if res-geometry
+ (progn
+ (setq parsed (x-parse-geometry res-geometry))
+ ;; If the resource specifies a position,
+ ;; call the position and size "user-specified".
+ (if (or (assq 'top parsed) (assq 'left parsed))
+ (setq parsed (cons '(user-position . t)
+ (cons '(user-size . t) parsed))))
+ ;; All geometry parms apply to the initial frame.
+ (setq initial-frame-alist (append initial-frame-alist parsed))
+ ;; The size parms apply to all frames.
+ (if (assq 'height parsed)
+ (setq default-frame-alist
+ (cons (cons 'height (cdr (assq 'height parsed)))
+ default-frame-alist)))
+ (if (assq 'width parsed)
+ (setq default-frame-alist
+ (cons (cons 'width (cdr (assq 'width parsed)))
+ default-frame-alist))))))
+
+ ;; Check the reverseVideo resource.
+ (let ((case-fold-search t))
+ (let ((rv (x-get-resource "reverseVideo" "ReverseVideo")))
+ (if (and rv
+ (string-match "^\\(true\\|yes\\|on\\)$" rv))
+ (setq default-frame-alist
+ (cons '(reverse . t) default-frame-alist)))))
+
+ ;; Set x-selection-timeout, measured in milliseconds.
+ (let ((res-selection-timeout
+ (x-get-resource "selectionTimeout" "SelectionTimeout")))
+ (setq x-selection-timeout 20000)
+ (if res-selection-timeout
+ (setq x-selection-timeout (string-to-number res-selection-timeout))))
+
+ (defun x-win-suspend-error ()
+ (error "Suspending an Emacs running under X makes no sense"))
+ (add-hook 'suspend-hook 'x-win-suspend-error)
+
+ ;;; Arrange for the kill and yank functions to set and check the clipboard.
+ (setq interprogram-cut-function 'x-select-text)
+ (setq interprogram-paste-function 'x-cut-buffer-or-selection-value)
+
+ ;;; Turn off window-splitting optimization; X is usually fast enough
+ ;;; that this is only annoying.
+ (setq split-window-keep-point t)
+
+ ;; Don't show the frame name; that's redundant with X.
+ (setq-default mode-line-frame-identification " ")
+
+ ;; Motif direct handling of f10 wasn't working right,
+ ;; So temporarily we've turned it off in lwlib-Xm.c
+ ;; and turned the Emacs f10 back on.
+ ;; ;; Motif normally handles f10 itself, so don't try to handle it a second
time.
+ ;; (if (featurep 'motif)
+ ;; (global-set-key [f10] 'ignore))
+
+ ;; Turn on support for mouse wheels.
+ (mouse-wheel-mode 1)
+
+ ;;; x-win.el ends here
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Emacs-diffs] Changes to emacs/lisp/term/x-win.el [emacs-unicode-2],
Kenichi Handa <=