;;; x-win.el --- parse relevant switches and set up for X -*-coding: iso-2022-7bit;-*-
-;; Copyright (C) 1993, 1994, 2001, 2002, 2003, 2004,
-;; 2005, 2006, 2007 Free Software Foundation, Inc.
+;; Copyright (C) 1993-1994, 2001-2011 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
+;; 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 3, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, 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
;; 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., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; system and process X-specific command line parameters before
;; creating the first X frame.
-;; Note that contrary to previous Emacs versions, the act of loading
-;; this file should not have the side effect of initializing the
-;; window system or processing command line arguments (this file is
-;; now loaded in loadup.el). See the variables
-;; `handle-args-function-alist' and
+;; Beginning in Emacs 23, the act of loading this file should not have
+;; the side effect of initializing the window system or processing
+;; command line arguments (this file is now loaded in loadup.el). See
+;; the variables `handle-args-function-alist' and
;; `window-system-initialization-alist' for more details.
;; startup.el will then examine startup files, and eventually call the hooks
(defvar x-session-id)
(defvar x-session-previous-id)
-(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-number (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)))))))
-
(defun x-handle-no-bitmap-icon (switch)
(setq default-frame-alist (cons '(icon-type) default-frame-alist)))
-;; 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)
+;; Handle the --parent-id option.
+(defun x-handle-parent-id (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 name of the X display on which Emacs was started.
-
-For the X display name of individual frames, see the `display'
-frame parameter.")
-
-(defun x-handle-display (switch)
- "Handle -display DISPLAY option."
- (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))
+ (setq initial-frame-alist (cons
+ (cons 'parent-id
+ (string-to-number (car x-invocation-args)))
+ initial-frame-alist)
+ x-invocation-args (cdr 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.
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.
+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
(defconst x-pointer-ur-angle 148)
(defconst x-pointer-watch 150)
(defconst x-pointer-xterm 152)
-\f
-;;
-;; 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))
-\f
-;;;; Function keys
-
-(defun x-setup-function-keys (frame)
- "Set up `function-key-map' on FRAME for the X window system."
- ;; Don't do this twice on the same display, or it would break
- ;; normal-erase-is-backspace-mode.
- (unless (terminal-parameter frame 'x-setup-function-keys)
- ;; Map certain keypad keys into ASCII characters that people usually expect.
- (with-selected-frame frame
- (define-key local-function-key-map [backspace] [127])
- (define-key local-function-key-map [delete] [127])
- (define-key local-function-key-map [tab] [?\t])
- (define-key local-function-key-map [linefeed] [?\n])
- (define-key local-function-key-map [clear] [?\C-l])
- (define-key local-function-key-map [return] [?\C-m])
- (define-key local-function-key-map [escape] [?\e])
- (define-key local-function-key-map [M-backspace] [?\M-\d])
- (define-key local-function-key-map [M-delete] [?\M-\d])
- (define-key local-function-key-map [M-tab] [?\M-\t])
- (define-key local-function-key-map [M-linefeed] [?\M-\n])
- (define-key local-function-key-map [M-clear] [?\M-\C-l])
- (define-key local-function-key-map [M-return] [?\M-\C-m])
- (define-key local-function-key-map [M-escape] [?\M-\e])
- (define-key local-function-key-map [iso-lefttab] [backtab])
- (define-key local-function-key-map [S-iso-lefttab] [backtab]))
- (set-terminal-parameter frame 'x-setup-function-keys t)))
-
-;; 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)
+(defconst x-pointer-invisible 255)
\f
;;;; Keysyms
"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")
+ (cond ((or (string-equal vendor "Hewlett-Packard Incorporated")
(string-equal vendor "Hewlett-Packard Company"))
'(( 168 . mute-acute)
( 169 . mute-grave)
;; This is used by DEC's X server.
'((65280 . remove)))))
+;; Latin-1
(let ((i 160))
(while (< i 256)
- (puthash i (make-char 'latin-iso8859-1 i) x-keysym-table)
+ (puthash i i x-keysym-table)
(setq i (1+ i))))
;; Table from Kuhn's proposed additions to the `KEYSYM Encoding'
;; Kana: Fixme: needs conversion to Japanese charset -- seems
;; to require jisx0213, for which the Unicode translation
;; isn't clear.
- (#x47e . ?\e$,1s>\e(B)
- (#x4a1 . ?\e$,2=B\e(B)
- (#x4a2 . ?\\e$,2=L\e(B)
- (#x4a3 . ?\\e$,2=M\e(B)
- (#x4a4 . ?\e$,2=A\e(B)
- (#x4a5 . ?\e$,2?{\e(B)
- (#x4a6 . ?\e$,2?r\e(B)
- (#x4a7 . ?\e$,2?!\e(B)
- (#x4a8 . ?\e$,2?#\e(B)
- (#x4a9 . ?\e$,2?%\e(B)
- (#x4aa . ?\e$,2?'\e(B)
- (#x4ab . ?\e$,2?)\e(B)
- (#x4ac . ?\e$,2?c\e(B)
- (#x4ad . ?\e$,2?e\e(B)
- (#x4ae . ?\e$,2?g\e(B)
- (#x4af . ?\e$,2?C\e(B)
- (#x4b0 . ?\e$,2?|\e(B)
- (#x4b1 . ?\e$,2?"\e(B)
- (#x4b2 . ?\e$,2?$\e(B)
- (#x4b3 . ?\e$,2?&\e(B)
- (#x4b4 . ?\e$,2?(\e(B)
- (#x4b5 . ?\e$,2?*\e(B)
- (#x4b6 . ?\e$,2?+\e(B)
- (#x4b7 . ?\e$,2?-\e(B)
- (#x4b8 . ?\e$,2?/\e(B)
- (#x4b9 . ?\e$,2?1\e(B)
- (#x4ba . ?\e$,2?3\e(B)
- (#x4bb . ?\e$,2?5\e(B)
- (#x4bc . ?\e$,2?7\e(B)
- (#x4bd . ?\e$,2?9\e(B)
- (#x4be . ?\e$,2?;\e(B)
- (#x4bf . ?\e$,2?=\e(B)
- (#x4c0 . ?\e$,2??\e(B)
- (#x4c1 . ?\e$,2?A\e(B)
- (#x4c2 . ?\e$,2?D\e(B)
- (#x4c3 . ?\e$,2?F\e(B)
- (#x4c4 . ?\e$,2?H\e(B)
- (#x4c5 . ?\e$,2?J\e(B)
- (#x4c6 . ?\e$,2?K\e(B)
- (#x4c7 . ?\e$,2?L\e(B)
- (#x4c8 . ?\e$,2?M\e(B)
- (#x4c9 . ?\e$,2?N\e(B)
- (#x4ca . ?\e$,2?O\e(B)
- (#x4cb . ?\e$,2?R\e(B)
- (#x4cc . ?\e$,2?U\e(B)
- (#x4cd . ?\e$,2?X\e(B)
- (#x4ce . ?\e$,2?[\e(B)
- (#x4cf . ?\e$,2?^\e(B)
- (#x4d0 . ?\e$,2?_\e(B)
- (#x4d1 . ?\e$,2?`\e(B)
- (#x4d2 . ?\e$,2?a\e(B)
- (#x4d3 . ?\e$,2?b\e(B)
- (#x4d4 . ?\e$,2?d\e(B)
- (#x4d5 . ?\e$,2?f\e(B)
- (#x4d6 . ?\e$,2?h\e(B)
- (#x4d7 . ?\e$,2?i\e(B)
- (#x4d8 . ?\e$,2?j\e(B)
- (#x4d9 . ?\e$,2?k\e(B)
- (#x4da . ?\e$,2?l\e(B)
- (#x4db . ?\e$,2?m\e(B)
- (#x4dc . ?\e$,2?o\e(B)
- (#x4dd . ?\e$,2?s\e(B)
- (#x4de . ?\e$,2>{\e(B)
- (#x4df . ?\e$,2>|\e(B)
+ (#x47e . ?\e(J~\e(B)
+ (#x4a1 . ?\e$A!#\e(B)
+ (#x4a2 . ?\\e$A!8\e(B)
+ (#x4a3 . ?\\e$A!9\e(B)
+ (#x4a4 . ?\e$A!"\e(B)
+ (#x4a5 . ?\e$A!$\e(B)
+ (#x4a6 . ?\e$A%r\e(B)
+ (#x4a7 . ?\e$A%!\e(B)
+ (#x4a8 . ?\e$A%#\e(B)
+ (#x4a9 . ?\e$A%%\e(B)
+ (#x4aa . ?\e$A%'\e(B)
+ (#x4ab . ?\e$A%)\e(B)
+ (#x4ac . ?\e$A%c\e(B)
+ (#x4ad . ?\e$A%e\e(B)
+ (#x4ae . ?\e$A%g\e(B)
+ (#x4af . ?\e$A%C\e(B)
+ (#x4b0 . ?\e$B!<\e(B)
+ (#x4b1 . ?\e$A%"\e(B)
+ (#x4b2 . ?\e$A%$\e(B)
+ (#x4b3 . ?\e$A%&\e(B)
+ (#x4b4 . ?\e$A%(\e(B)
+ (#x4b5 . ?\e$A%*\e(B)
+ (#x4b6 . ?\e$A%+\e(B)
+ (#x4b7 . ?\e$A%-\e(B)
+ (#x4b8 . ?\e$A%/\e(B)
+ (#x4b9 . ?\e$A%1\e(B)
+ (#x4ba . ?\e$A%3\e(B)
+ (#x4bb . ?\e$A%5\e(B)
+ (#x4bc . ?\e$A%7\e(B)
+ (#x4bd . ?\e$A%9\e(B)
+ (#x4be . ?\e$A%;\e(B)
+ (#x4bf . ?\e$A%=\e(B)
+ (#x4c0 . ?\e$A%?\e(B)
+ (#x4c1 . ?\e$A%A\e(B)
+ (#x4c2 . ?\e$A%D\e(B)
+ (#x4c3 . ?\e$A%F\e(B)
+ (#x4c4 . ?\e$A%H\e(B)
+ (#x4c5 . ?\e$A%J\e(B)
+ (#x4c6 . ?\e$A%K\e(B)
+ (#x4c7 . ?\e$A%L\e(B)
+ (#x4c8 . ?\e$A%M\e(B)
+ (#x4c9 . ?\e$A%N\e(B)
+ (#x4ca . ?\e$A%O\e(B)
+ (#x4cb . ?\e$A%R\e(B)
+ (#x4cc . ?\e$A%U\e(B)
+ (#x4cd . ?\e$A%X\e(B)
+ (#x4ce . ?\e$A%[\e(B)
+ (#x4cf . ?\e$A%^\e(B)
+ (#x4d0 . ?\e$A%_\e(B)
+ (#x4d1 . ?\e$A%`\e(B)
+ (#x4d2 . ?\e$A%a\e(B)
+ (#x4d3 . ?\e$A%b\e(B)
+ (#x4d4 . ?\e$A%d\e(B)
+ (#x4d5 . ?\e$A%f\e(B)
+ (#x4d6 . ?\e$A%h\e(B)
+ (#x4d7 . ?\e$A%i\e(B)
+ (#x4d8 . ?\e$A%j\e(B)
+ (#x4d9 . ?\e$A%k\e(B)
+ (#x4da . ?\e$A%l\e(B)
+ (#x4db . ?\e$A%m\e(B)
+ (#x4dc . ?\e$A%o\e(B)
+ (#x4dd . ?\e$A%s\e(B)
+ (#x4de . ?\e$B!+\e(B)
+ (#x4df . ?\e$B!,\e(B)
;; Arabic
(#x5ac . ?\e,G,\e(B)
(#x5bb . ?\e,G;\e(B)
(#x7f9 . ?\e,Fy\e(B)
;; Technical
(#x8a1 . ?\e$,1|W\e(B)
- (#x8a2 . ?\e$,2 ,\e(B)
- (#x8a3 . ?\e$,2 \e(B)
+ (#x8a2 . ?\e$A)0\e(B)
+ (#x8a3 . ?\e$A)$\e(B)
(#x8a4 . ?\e$,1{ \e(B)
(#x8a5 . ?\e$,1{!\e(B)
- (#x8a6 . ?\e$,2 "\e(B)
+ (#x8a6 . ?\e$A)&\e(B)
(#x8a7 . ?\e$,1|A\e(B)
(#x8a8 . ?\e$,1|C\e(B)
(#x8a9 . ?\e$,1|D\e(B)
(#x8ae . ?\e$,1|@\e(B)
(#x8af . ?\e$,1|H\e(B)
(#x8b0 . ?\e$,1|L\e(B)
- (#x8bc . ?\e$,1y$\e(B)
- (#x8bd . ?\e$,1y \e(B)
- (#x8be . ?\e$,1y%\e(B)
- (#x8bf . ?\e$,1xK\e(B)
- (#x8c0 . ?\e$,1xT\e(B)
- (#x8c1 . ?\e$,1x=\e(B)
- (#x8c2 . ?\e$,1x>\e(B)
- (#x8c5 . ?\e$,1x'\e(B)
- (#x8c8 . ?\e$,1x\\e(B)
- (#x8c9 . ?\e$,1xc\e(B)
- (#x8cd . ?\e$,1wT\e(B)
- (#x8ce . ?\e$,1wR\e(B)
- (#x8cf . ?\e$,1y!\e(B)
- (#x8d6 . ?\e$,1x:\e(B)
- (#x8da . ?\e$,1yB\e(B)
- (#x8db . ?\e$,1yC\e(B)
- (#x8dc . ?\e$,1xI\e(B)
- (#x8dd . ?\e$,1xJ\e(B)
- (#x8de . ?\e$,1xG\e(B)
- (#x8df . ?\e$,1xH\e(B)
- (#x8ef . ?\e$,1x"\e(B)
+ (#x8bc . ?\e$A!\\e(B)
+ (#x8bd . ?\e$A!Y\e(B)
+ (#x8be . ?\e$A!]\e(B)
+ (#x8bf . ?\e$A!R\e(B)
+ (#x8c0 . ?\e$A!`\e(B)
+ (#x8c1 . ?\e$A!X\e(B)
+ (#x8c2 . ?\e$A!^\e(B)
+ (#x8c5 . ?\e$B"`\e(B)
+ (#x8c8 . ?\e$(G"D\e(B)
+ (#x8c9 . ?\e$(O"l\e(B)
+ (#x8cd . ?\e$B"N\e(B)
+ (#x8ce . ?\e$B"M\e(B)
+ (#x8cf . ?\e$A!T\e(B)
+ (#x8d6 . ?\e$A!L\e(B)
+ (#x8da . ?\e$B">\e(B)
+ (#x8db . ?\e$B"?\e(B)
+ (#x8dc . ?\e$A!I\e(B)
+ (#x8dd . ?\e$A!H\e(B)
+ (#x8de . ?\e$A!D\e(B)
+ (#x8df . ?\e$A!E\e(B)
+ (#x8ef . ?\e$B"_\e(B)
(#x8f6 . ?\e$,1!R\e(B)
- (#x8fb . ?\e$,1vp\e(B)
- (#x8fc . ?\e$,1vq\e(B)
- (#x8fd . ?\e$,1vr\e(B)
- (#x8fe . ?\e$,1vs\e(B)
+ (#x8fb . ?\e$A!{\e(B)
+ (#x8fc . ?\e$A!|\e(B)
+ (#x8fd . ?\e$A!z\e(B)
+ (#x8fe . ?\e$A!}\e(B)
;; Special
- (#x9e0 . ?\e$,2"&\e(B)
- (#x9e1 . ?\e$,2!R\e(B)
- (#x9e2 . ?\e$,1}I\e(B)
- (#x9e3 . ?\e$,1}L\e(B)
- (#x9e4 . ?\e$,1}M\e(B)
- (#x9e5 . ?\e$,1}J\e(B)
+ (#x9e0 . ?\e$A!t\e(B)
+ (#x9e1 . ?\e$(C"F\e(B)
+ (#x9e2 . ?\e$(GB*\e(B)
+ (#x9e3 . ?\e$(GB-\e(B)
+ (#x9e4 . ?\e$(GB.\e(B)
+ (#x9e5 . ?\e$(GB+\e(B)
(#x9e8 . ?\e$,1}d\e(B)
- (#x9e9 . ?\e$,1}K\e(B)
- (#x9ea . ?\e$,2 8\e(B)
- (#x9eb . ?\e$,2 0\e(B)
- (#x9ec . ?\e$,2 ,\e(B)
- (#x9ed . ?\e$,2 4\e(B)
- (#x9ee . ?\e$,2 \\e(B)
+ (#x9e9 . ?\e$(GB,\e(B)
+ (#x9ea . ?\e$A)<\e(B)
+ (#x9eb . ?\e$A)4\e(B)
+ (#x9ec . ?\e$A)0\e(B)
+ (#x9ed . ?\e$A)8\e(B)
+ (#x9ee . ?\e$A)`\e(B)
(#x9ef . ?\e$,1|Z\e(B)
(#x9f0 . ?\e$,1|[\e(B)
- (#x9f1 . ?\e$,2 \e(B)
+ (#x9f1 . ?\e$A)$\e(B)
(#x9f2 . ?\e$,1|\\e(B)
(#x9f3 . ?\e$,1|]\e(B)
- (#x9f4 . ?\e$,2 <\e(B)
- (#x9f5 . ?\e$,2 D\e(B)
- (#x9f6 . ?\e$,2 T\e(B)
- (#x9f7 . ?\e$,2 L\e(B)
- (#x9f8 . ?\e$,2 "\e(B)
+ (#x9f4 . ?\e$A)@\e(B)
+ (#x9f5 . ?\e$A)H\e(B)
+ (#x9f6 . ?\e$A)X\e(B)
+ (#x9f7 . ?\e$A)P\e(B)
+ (#x9f8 . ?\e$A)&\e(B)
;; Publishing
(#xaa1 . ?\e$,1rc\e(B)
(#xaa2 . ?\e$,1rb\e(B)
(#xaa6 . ?\e$,1rh\e(B)
(#xaa7 . ?\e$,1ri\e(B)
(#xaa8 . ?\e$,1rj\e(B)
- (#xaa9 . ?\e$,1rt\e(B)
- (#xaaa . ?\e$,1rs\e(B)
- (#xaae . ?\e$,1s&\e(B)
- (#xaaf . ?\e$,1s%\e(B)
- (#xab0 . ?\e$,1v3\e(B)
- (#xab1 . ?\e$,1v4\e(B)
- (#xab2 . ?\e$,1v5\e(B)
+ (#xaa9 . ?\e$(G!7\e(B)
+ (#xaaa . ?\e$(G!9\e(B)
+ (#xaae . ?\e$A!-\e(B)
+ (#xaaf . ?\e$(G!-\e(B)
+ (#xab0 . ?\e$(O'x\e(B)
+ (#xab1 . ?\e$(O'y\e(B)
+ (#xab2 . ?\e$(O'z\e(B)
(#xab3 . ?\e$,1v6\e(B)
(#xab4 . ?\e$,1v7\e(B)
(#xab5 . ?\e$,1v8\e(B)
(#xab6 . ?\e$,1v9\e(B)
(#xab7 . ?\e$,1v:\e(B)
- (#xab8 . ?\e$,1uE\e(B)
+ (#xab8 . ?\e$(G""\e(B)
(#xabb . ?\e$,1rr\e(B)
(#xabc . ?\e$,1{)\e(B)
(#xabe . ?\e$,1{*\e(B)
- (#xac3 . ?\e$,1v;\e(B)
- (#xac4 . ?\e$,1v<\e(B)
- (#xac5 . ?\e$,1v=\e(B)
- (#xac6 . ?\e$,1v>\e(B)
- (#xac9 . ?\e$,1ub\e(B)
+ (#xac3 . ?\e$(C({\e(B)
+ (#xac4 . ?\e$(C(|\e(B)
+ (#xac5 . ?\e$(C(}\e(B)
+ (#xac6 . ?\e$(C(~\e(B)
+ (#xac9 . ?\e$(D"o\e(B)
(#xaca . ?\e$,2"s\e(B)
- (#xacc . ?\e$,2"!\e(B)
- (#xacd . ?\e$,2!w\e(B)
- (#xace . ?\e$,2"+\e(B)
+ (#xacc . ?\e$(O##\e(B)
+ (#xacd . ?\e$(O#!\e(B)
+ (#xace . ?\e$A!p\e(B)
(#xacf . ?\e$,2!o\e(B)
- (#xad0 . ?\e$,1rx\e(B)
- (#xad1 . ?\e$,1ry\e(B)
- (#xad2 . ?\e$,1r|\e(B)
- (#xad3 . ?\e$,1r}\e(B)
+ (#xad0 . ?\e,F!\e(B)
+ (#xad1 . ?\e,F"\e(B)
+ (#xad2 . ?\e,Y4\e(B)
+ (#xad3 . ?\e,Y!\e(B)
(#xad4 . ?\e$,1u^\e(B)
- (#xad6 . ?\e$,1s2\e(B)
- (#xad7 . ?\e$,1s3\e(B)
+ (#xad6 . ?\e$A!d\e(B)
+ (#xad7 . ?\e$A!e\e(B)
(#xad9 . ?\e$,2%]\e(B)
(#xadb . ?\e$,2!l\e(B)
- (#xadc . ?\e$,2" \e(B)
- (#xadd . ?\e$,2!v\e(B)
- (#xade . ?\e$,2"/\e(B)
+ (#xadc . ?\e$(O#$\e(B)
+ (#xadd . ?\e$(O#"\e(B)
+ (#xade . ?\e$A!q\e(B)
(#xadf . ?\e$,2!n\e(B)
- (#xae0 . ?\e$,2"F\e(B)
+ (#xae0 . ?\e$(O#?\e(B)
(#xae1 . ?\e$,2!k\e(B)
(#xae2 . ?\e$,2!m\e(B)
- (#xae3 . ?\e$,2!s\e(B)
- (#xae4 . ?\e$,2!}\e(B)
- (#xae5 . ?\e$,2"f\e(B)
- (#xae6 . ?\e$,1s"\e(B)
+ (#xae3 . ?\e$A!w\e(B)
+ (#xae4 . ?\e$(G!}\e(B)
+ (#xae5 . ?\e$A!n\e(B)
+ (#xae6 . ?\e$(O#@\e(B)
(#xae7 . ?\e$,2!j\e(B)
- (#xae8 . ?\e$,2!r\e(B)
- (#xae9 . ?\e$,2!|\e(B)
- (#xaea . ?\e$,2"|\e(B)
- (#xaeb . ?\e$,2"~\e(B)
- (#xaec . ?\e$,2#c\e(B)
- (#xaed . ?\e$,2#f\e(B)
- (#xaee . ?\e$,2#e\e(B)
+ (#xae8 . ?\e$A!x\e(B)
+ (#xae9 . ?\e$(G!~\e(B)
+ (#xaea . ?\e$(C"P\e(B)
+ (#xaeb . ?\e$(O-~\e(B)
+ (#xaec . ?\e$(O&@\e(B)
+ (#xaed . ?\e$(O&<\e(B)
+ (#xaee . ?\e$(O&>\e(B)
(#xaf0 . ?\e$,2%`\e(B)
- (#xaf1 . ?\e$,1s \e(B)
- (#xaf2 . ?\e$,1s!\e(B)
- (#xaf3 . ?\e$,2%S\e(B)
+ (#xaf1 . ?\e$B"w\e(B)
+ (#xaf2 . ?\e$B"x\e(B)
+ (#xaf3 . ?\e$(O'{\e(B)
(#xaf4 . ?\e$,2%W\e(B)
- (#xaf5 . ?\e$,2#o\e(B)
- (#xaf6 . ?\e$,2#m\e(B)
- (#xaf7 . ?\e$,2#B\e(B)
- (#xaf8 . ?\e$,2#@\e(B)
- (#xaf9 . ?\e$,2"n\e(B)
+ (#xaf5 . ?\e$B"t\e(B)
+ (#xaf6 . ?\e$B"u\e(B)
+ (#xaf7 . ?\e$A!a\e(B)
+ (#xaf8 . ?\e$A!b\e(B)
+ (#xaf9 . ?\e$(O&g\e(B)
(#xafa . ?\e$,1zu\e(B)
(#xafb . ?\e$,1uW\e(B)
(#xafc . ?\e$,1s8\e(B)
(#xafd . ?\e$,1rz\e(B)
- (#xafe . ?\e$,1r~\e(B)
+ (#xafe . ?\e,Y%\e(B)
;; APL
(#xba3 . ?<)
(#xba6 . ?>)
- (#xba8 . ?\e$,1xH\e(B)
- (#xba9 . ?\e$,1xG\e(B)
+ (#xba8 . ?\e$A!E\e(B)
+ (#xba9 . ?\e$A!D\e(B)
(#xbc0 . ?\e,A/\e(B)
- (#xbc2 . ?\e$,1ye\e(B)
- (#xbc3 . ?\e$,1xI\e(B)
+ (#xbc2 . ?\e$A!M\e(B)
+ (#xbc3 . ?\e$A!I\e(B)
(#xbc4 . ?\e$,1zj\e(B)
(#xbc6 . ?_)
(#xbca . ?\e$,1x8\e(B)
(#xbcc . ?\e$,1|5\e(B)
(#xbce . ?\e$,1yd\e(B)
- (#xbcf . ?\e$,2"+\e(B)
+ (#xbcf . ?\e$A!p\e(B)
(#xbd3 . ?\e$,1zh\e(B)
- (#xbd6 . ?\e$,1xJ\e(B)
- (#xbd8 . ?\e$,1yC\e(B)
- (#xbda . ?\e$,1yB\e(B)
+ (#xbd6 . ?\e$A!H\e(B)
+ (#xbd8 . ?\e$B"?\e(B)
+ (#xbda . ?\e$B">\e(B)
(#xbdc . ?\e$,1yb\e(B)
(#xbfc . ?\e$,1yc\e(B)
;; Hebrew
;; Latin-9
(#x13bc . ?\e,b<\e(B)
(#x13bd . ?\e,b=\e(B)
- (#x13be . ?\e,b>\e(B)
+ (#x13be . ?\e,_/\e(B)
;; Currency
(#x20a0 . ?\e$,1t@\e(B)
(#x20a1 . ?\e$,1tA\e(B)
;; #x0dde THAI MAIHANAKAT Thai
\f
-;;;; Selections and cut buffers
+;;;; Selections
;; 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.
+;; from x-selection-value. We track both
+;; separately in case another X application only sets one of them
+;; 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.
-The actual text stored in the X cut buffer is what encoded from this value.")
-(defvar x-last-selected-text-cut-encoded nil
- "The value of the X cut buffer last time we selected or pasted text.
-This is the actual text stored in the X cut buffer.")
-(defvar x-last-cut-buffer-coding 'iso-latin-1
- "The coding we last used to encode/decode the text from the X cut buffer")
-
-(defvar x-cut-buffer-max 20000 ; Note this value is overridden below.
- "Max number of characters to put in the cut buffer.
-It is said that overlarge strings are slow to put into 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."
+
+(defcustom x-select-enable-primary nil
+ "Non-nil means cutting and pasting uses the primary selection."
:type 'boolean
- :group 'killing)
-
-(defun x-select-text (text &optional push)
- "Make TEXT, a string, the primary X selection.
-Also, set the value of X cut buffer 0, for backward compatibility
-with older X applications.
-gildea@stop.mail-abuse.org says it's not desirable to put kills
-in the clipboard."
- ;; 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 ""
- x-last-selected-text-cut-encoded ""))
- (t
- (setq x-last-selected-text-cut text
- x-last-cut-buffer-coding 'iso-latin-1
- x-last-selected-text-cut-encoded
- ;; ICCCM says cut buffer always contain ISO-Latin-1
- (encode-coding-string text 'iso-latin-1))
- (x-set-cut-buffer x-last-selected-text-cut-encoded push)))
- (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))
- )
+ :group 'killing
+ :version "24.1")
(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:
+The value is one of the following data types, a list of them, or nil:
`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.")
+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 they are different at Nth character, and that
-;; of UTF8 is a Latin character and that of CTEXT belongs to a CJK
-;; character set, select UTF8. Also select UTF8 if the Nth
-;; character of UTF8 is non-ASCII where as that of CTEXT is ASCII.
-;; 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)
- (let ((result (compare-strings utf8 0 len-utf8 ctext 0 len-ctext)))
- (if (eq result t)
- ctext
- (let ((utf8-char (aref utf8 (1- (abs result))))
- (ctext-char (aref ctext (1- (abs result)))))
- (if (or (and (aref (char-category-set utf8-char) ?l)
- (aref (char-category-set ctext-char) ?C))
- (and (>= utf8-char 128)
- (< ctext-char 128)))
- utf8
- ctext)))))))
+The value nil is the same as this list:
+ \(UTF8_STRING COMPOUND_TEXT STRING)
+")
;; Get a selection value of type TYPE by calling x-get-selection with
-;; an appropiate DATA-TYPE argument decidd by `x-select-request-type'.
+;; an appropriate DATA-TYPE argument decided by `x-select-request-type'.
;; The return value is already decoded. If x-get-selection causes an
;; error, this function return nil.
-(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 local selection, or it contains only
- ;; ASCII characers, choose it.
- (if (or (not (get-text-property 0 'foreign-selection utf8))
- (= (length utf8) (string-bytes 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))
- (setq text utf8)))
- ;; 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))))
-
+(defun x-selection-value-internal (type)
+ (let ((request-type (or x-select-request-type
+ '(UTF8_STRING COMPOUND_TEXT STRING)))
+ text)
+ (if (consp request-type)
+ (while (and request-type (not text))
+ (condition-case nil
+ (setq text (x-get-selection type (car request-type)))
+ (error nil))
+ (setq request-type (cdr request-type)))
+ (condition-case nil
+ (setq text (x-get-selection type 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.
+;; Consult the selection. 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
- (let ((next-coding (or next-selection-coding-system 'iso-latin-1)))
- (cond;; check cut buffer
- ((or (not cut-text) (string= cut-text ""))
- (setq x-last-selected-text-cut nil))
- ;; This short cut doesn't work because x-get-cut-buffer
- ;; always returns a newly created string.
- ;; ((eq cut-text x-last-selected-text-cut) nil)
- ((and (string= cut-text x-last-selected-text-cut-encoded)
- (eq x-last-cut-buffer-coding next-coding))
- ;; See the comment above. No need of this recording.
- ;; 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-encoded cut-text
- x-last-cut-buffer-coding next-coding
- x-last-selected-text-cut
- ;; ICCCM says cut buffer always contain ISO-Latin-1, but
- ;; use next-selection-coding-system if not nil.
- (decode-coding-string
- cut-text next-coding))))))
-
- ;; 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)
- ))
+(defun x-selection-value ()
+ ;; With multi-tty, this function may be called from a tty frame.
+ (when (eq (framep (selected-frame)) 'x)
+ (let (clip-text primary-text)
+ (when x-select-enable-clipboard
+ (setq clip-text (x-selection-value-internal '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)))))
+
+ (when x-select-enable-primary
+ (setq primary-text (x-selection-value-internal '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)))))
+
+ ;; 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) and primary.
+ ;; 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 of them.
+ ;; 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.
+ (or clip-text primary-text)
+ )))
+
+(define-obsolete-function-alias 'x-cut-buffer-or-selection-value
+ 'x-selection-value "24.1")
+
+;; 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-selection-value)
+
+;; Make paste from other applications use the decoding in x-select-request-type
+;; and not just STRING.
+(defun x-get-selection-value ()
+ "Get the current value of the PRIMARY selection.
+Request data types in the order specified by `x-select-request-type'."
+ (x-selection-value-internal 'PRIMARY))
(defun x-clipboard-yank ()
"Insert the clipboard contents, or the last stretch of killed text."
(interactive "*")
- (let ((clipboard-text (x-selection-value 'CLIPBOARD))
+ (let ((clipboard-text (x-selection-value-internal 'CLIPBOARD))
(x-select-enable-clipboard t))
(if (and clipboard-text (> (length clipboard-text) 0))
(kill-new clipboard-text))
(yank)))
+(declare-function accelerate-menu "xmenu.c" (&optional frame) t)
+
(defun x-menu-bar-open (&optional frame)
- "Open the menu bar if `menu-bar-mode' is on. otherwise call `tmm-menubar'."
+ "Open the menu bar if `menu-bar-mode' is on, otherwise call `tmm-menubar'."
(interactive "i")
- (if menu-bar-mode (accelerate-menu frame)
+ (if (and menu-bar-mode
+ (fboundp 'accelerate-menu))
+ (accelerate-menu frame)
(tmm-menubar)))
\f
;;; Window system initialization.
(defun x-win-suspend-error ()
- (error "Suspending an Emacs running under X makes no sense"))
+ ;; Don't allow suspending if any of the frames are X frames.
+ (if (memq 'x (mapcar 'window-system (frame-list)))
+ (error "Cannot suspend Emacs while running under X")))
(defvar x-initialized nil
"Non-nil if the X window system has been initialized.")
+(declare-function x-open-connection "xfns.c"
+ (display &optional xrm-string must-succeed))
+(declare-function x-server-max-request-size "xfns.c" (&optional terminal))
+(declare-function x-get-resource "frame.c"
+ (attribute class &optional component subclass))
+(declare-function x-parse-geometry "frame.c" (string))
+(defvar x-resource-name)
+(defvar x-display-name)
+(defvar x-command-line-resources)
+
(defun x-initialize-window-system ()
"Initialize Emacs for X frames and open the first connection to an X server."
;; Make sure we have a valid resource name.
;; are the initial display.
(eq initial-window-system 'x))
- (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 default fontset.
+ (create-default-fontset)
;; Create the standard fontset.
- (create-fontset-from-fontset-spec standard-fontset-spec t)
+ (condition-case err
+ (create-fontset-from-fontset-spec standard-fontset-spec t)
+ (error (display-warning
+ 'initialization
+ (format "Creation of the standard fontset failed: %s" err)
+ :error)))
;; Create fontset specified in X resources "Fontset-N" (N is 0, 1, ...).
(create-fontset-from-x-resource)
- ;; Try to create a fontset from a font specification which comes
- ;; from initial-frame-alist, default-frame-alist, or X resource.
- ;; A font specification in command line argument (i.e. -fn XXXX)
- ;; should be already in default-frame-alist as a `font'
- ;; parameter. However, any font specifications in site-start
- ;; library, user's init file (.emacs), and default.el are not
- ;; yet handled here.
-
- (let ((font (or (cdr (assq 'font initial-frame-alist))
- (cdr (assq 'font default-frame-alist))
- (x-get-resource "font" "Font")))
- xlfd-fields resolved-name)
- (if (and font
- (not (query-fontset font))
- (setq resolved-name (x-resolve-font-name font))
- (setq xlfd-fields (x-decompose-font-name font)))
- (if (string= "fontset" (aref xlfd-fields xlfd-regexp-registry-subnum))
- (new-fontset font (x-complement-fontset-spec xlfd-fields nil))
- ;; Create a fontset from FONT. The fontset name is
- ;; generated from FONT.
- (create-fontset-from-ascii-font font resolved-name "startup"))))
-
;; Set scroll bar mode to right if set by X resources. Default is left.
(if (equal (x-get-resource "verticalScrollBars" "ScrollBars") "right")
(customize-set-variable 'scroll-bar-mode 'right))
(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. Don't set it if there are
+ ;; The size parms apply to all frames. Don't set it if there are
;; sizes there already (from command line).
(if (and (assq 'height parsed)
(not (assq 'height default-frame-alist)))
;; Don't let Emacs suspend under X.
(add-hook 'suspend-hook 'x-win-suspend-error)
+ ;; During initialization, we defer sending size hints to the window
+ ;; manager, because that can induce a race condition:
+ ;; http://lists.gnu.org/archive/html/emacs-devel/2008-10/msg00033.html
+ ;; Send the size hints once initialization is done.
+ (add-hook 'after-init-hook 'x-wm-set-size-hint)
+
;; Turn off window-splitting optimization; X is usually fast enough
;; that this is only annoying.
(setq split-window-keep-point t)
;; (if (featurep 'motif)
;; (global-set-key [f10] 'ignore))
- ;; Turn on support for mouse wheels.
- (mouse-wheel-mode 1)
-
;; Enable CLIPBOARD copy/paste through menu bar commands.
(menu-bar-enable-clipboard)
- ;; Override Paste so it looks at CLIPBOARD first.
- (define-key menu-bar-edit-menu [paste]
- (append '(menu-item "Paste" x-clipboard-yank
- :enable (not buffer-read-only)
- :help "Paste (yank) text most recently cut/copied")
- nil))
+ ;; ;; Override Paste so it looks at CLIPBOARD first.
+ ;; (define-key menu-bar-edit-menu [paste]
+ ;; (append '(menu-item "Paste" x-clipboard-yank
+ ;; :enable (not buffer-read-only)
+ ;; :help "Paste (yank) text most recently cut/copied")
+ ;; nil))
(setq x-initialized t))
(add-to-list 'frame-creation-function-alist '(x . x-create-frame-with-faces))
(add-to-list 'window-system-initialization-alist '(x . x-initialize-window-system))
-(provide 'x-win)
-
;; Initiate drag and drop
(add-hook 'after-make-frame-functions 'x-dnd-init-frame)
(define-key special-event-map [drag-n-drop] 'x-dnd-handle-drag-n-drop-event)
-;; arch-tag: f1501302-db8b-4d95-88e3-116697d89f78
+(defcustom x-gtk-stock-map
+ (mapcar (lambda (arg)
+ (cons (purecopy (car arg)) (purecopy (cdr arg))))
+ '(
+ ("etc/images/new" . "gtk-new")
+ ("etc/images/open" . "gtk-open")
+ ("etc/images/diropen" . "n:system-file-manager")
+ ("etc/images/close" . "gtk-close")
+ ("etc/images/save" . "gtk-save")
+ ("etc/images/saveas" . "gtk-save-as")
+ ("etc/images/undo" . "gtk-undo")
+ ("etc/images/cut" . "gtk-cut")
+ ("etc/images/copy" . "gtk-copy")
+ ("etc/images/paste" . "gtk-paste")
+ ("etc/images/search" . "gtk-find")
+ ("etc/images/print" . "gtk-print")
+ ("etc/images/preferences" . "gtk-preferences")
+ ("etc/images/help" . "gtk-help")
+ ("etc/images/left-arrow" . "gtk-go-back")
+ ("etc/images/right-arrow" . "gtk-go-forward")
+ ("etc/images/home" . "gtk-home")
+ ("etc/images/jump-to" . "gtk-jump-to")
+ ("etc/images/index" . "gtk-index")
+ ("etc/images/search" . "gtk-find")
+ ("etc/images/exit" . "gtk-quit")
+ ("etc/images/cancel" . "gtk-cancel")
+ ("etc/images/info" . "gtk-info")
+ ("etc/images/bookmark_add" . "n:bookmark_add")
+ ;; Used in Gnus and/or MH-E:
+ ("etc/images/attach" . "gtk-attach")
+ ("etc/images/connect" . "gtk-connect")
+ ("etc/images/contact" . "gtk-contact")
+ ("etc/images/delete" . "gtk-delete")
+ ("etc/images/describe" . "gtk-properties")
+ ("etc/images/disconnect" . "gtk-disconnect")
+ ;; ("etc/images/exit" . "gtk-exit")
+ ("etc/images/lock-broken" . "gtk-lock_broken")
+ ("etc/images/lock-ok" . "gtk-lock_ok")
+ ("etc/images/lock" . "gtk-lock")
+ ("etc/images/next-page" . "gtk-next-page")
+ ("etc/images/refresh" . "gtk-refresh")
+ ("etc/images/sort-ascending" . "gtk-sort-ascending")
+ ("etc/images/sort-column-ascending" . "gtk-sort-column-ascending")
+ ("etc/images/sort-criteria" . "gtk-sort-criteria")
+ ("etc/images/sort-descending" . "gtk-sort-descending")
+ ("etc/images/sort-row-ascending" . "gtk-sort-row-ascending")
+ ("images/gnus/toggle-subscription" . "gtk-task-recurring")
+ ("images/mail/compose" . "gtk-mail-compose")
+ ("images/mail/copy" . "gtk-mail-copy")
+ ("images/mail/forward" . "gtk-mail-forward")
+ ("images/mail/inbox" . "gtk-inbox")
+ ("images/mail/move" . "gtk-mail-move")
+ ("images/mail/not-spam" . "gtk-not-spam")
+ ("images/mail/outbox" . "gtk-outbox")
+ ("images/mail/reply-all" . "gtk-mail-reply-to-all")
+ ("images/mail/reply" . "gtk-mail-reply")
+ ("images/mail/save-draft" . "gtk-mail-handling")
+ ("images/mail/send" . "gtk-mail-send")
+ ("images/mail/spam" . "gtk-spam")
+ ;; Used for GDB Graphical Interface
+ ("images/gud/break" . "gtk-no")
+ ("images/gud/recstart" . "gtk-media-record")
+ ("images/gud/recstop" . "gtk-media-stop")
+ ;; No themed versions available:
+ ;; mail/preview (combining stock_mail and stock_zoom)
+ ;; mail/save (combining stock_mail, stock_save and stock_convert)
+ ))
+ "How icons for tool bars are mapped to Gtk+ stock items.
+Emacs must be compiled with the Gtk+ toolkit for this to have any effect.
+A value that begins with n: denotes a named icon instead of a stock icon."
+ :version "22.2"
+ :type '(choice (repeat (choice symbol
+ (cons (string :tag "Emacs icon")
+ (string :tag "Stock/named")))))
+ :group 'x)
+
+(defcustom icon-map-list '(x-gtk-stock-map)
+ "A list of alists that map icon file names to stock/named icons.
+The alists are searched in the order they appear. The first match is used.
+The keys in the alists are file names without extension and with two directory
+components. For example, to map /usr/share/emacs/22.1.1/etc/images/open.xpm
+to stock item gtk-open, use:
+
+ (\"etc/images/open\" . \"gtk-open\")
+
+Themes also have named icons. To map to one of those, use n: before the name:
+
+ (\"etc/images/diropen\" . \"n:system-file-manager\")
+
+The list elements are either the symbol name for the alist or the
+alist itself.
+
+If you don't want stock icons, set the variable to nil."
+ :version "22.2"
+ :type '(choice (const :tag "Don't use stock icons" nil)
+ (repeat (choice symbol
+ (cons (string :tag "Emacs icon")
+ (string :tag "Stock/named")))))
+ :group 'x)
+
+(defconst x-gtk-stock-cache (make-hash-table :weakness t :test 'equal))
+
+(defun x-gtk-map-stock (file)
+ "Map icon with file name FILE to a Gtk+ stock name.
+This uses `icon-map-list' to map icon file names to stock icon names."
+ (when (stringp file)
+ (or (gethash file x-gtk-stock-cache)
+ (puthash
+ file
+ (save-match-data
+ (let* ((file-sans (file-name-sans-extension file))
+ (key (and (string-match "/\\([^/]+/[^/]+/[^/]+$\\)"
+ file-sans)
+ (match-string 1 file-sans)))
+ (icon-map icon-map-list)
+ elem value)
+ (while (and (null value) icon-map)
+ (setq elem (car icon-map)
+ value (assoc-string (or key file-sans)
+ (if (symbolp elem)
+ (symbol-value elem)
+ elem))
+ icon-map (cdr icon-map)))
+ (and value (cdr value))))
+ x-gtk-stock-cache))))
+
+(provide 'x-win)
+
;;; x-win.el ends here