Commit | Line | Data |
---|---|---|
cf07d2bd | 1 | ;;; x-win.el --- parse relevant switches and set up for X -*-coding: iso-2022-7bit;-*- |
2fe590dc | 2 | |
aa360da1 | 3 | ;; Copyright (C) 1993, 1994, 2001, 2002, 2003, 2004, 2005, 2006, 2007, |
5df4f04c | 4 | ;; 2008, 2009, 2010, 2011 Free Software Foundation, Inc. |
5cdb3f1e ER |
5 | |
6 | ;; Author: FSF | |
cf07d2bd | 7 | ;; Keywords: terminals, i18n |
5cdb3f1e | 8 | |
2fe590dc EN |
9 | ;; This file is part of GNU Emacs. |
10 | ||
1fecc8fe | 11 | ;; GNU Emacs is free software: you can redistribute it and/or modify |
2fe590dc | 12 | ;; it under the terms of the GNU General Public License as published by |
1fecc8fe GM |
13 | ;; the Free Software Foundation, either version 3 of the License, or |
14 | ;; (at your option) any later version. | |
2fe590dc EN |
15 | |
16 | ;; GNU Emacs is distributed in the hope that it will be useful, | |
17 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 | ;; GNU General Public License for more details. | |
20 | ||
21 | ;; You should have received a copy of the GNU General Public License | |
1fecc8fe | 22 | ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. |
63f77899 | 23 | |
5cdb3f1e | 24 | ;;; Commentary: |
63f77899 | 25 | |
e9cda827 KL |
26 | ;; X-win.el: this file defines functions to initialize the X window |
27 | ;; system and process X-specific command line parameters before | |
28 | ;; creating the first X frame. | |
29 | ||
2e34dc8b CY |
30 | ;; Beginning in Emacs 23, the act of loading this file should not have |
31 | ;; the side effect of initializing the window system or processing | |
32 | ;; command line arguments (this file is now loaded in loadup.el). See | |
33 | ;; the variables `handle-args-function-alist' and | |
e9cda827 | 34 | ;; `window-system-initialization-alist' for more details. |
63f77899 JB |
35 | |
36 | ;; startup.el will then examine startup files, and eventually call the hooks | |
cf07d2bd | 37 | ;; which create the first window(s). |
5cdb3f1e ER |
38 | |
39 | ;;; Code: | |
63f77899 JB |
40 | \f |
41 | ;; These are the standard X switches from the Xt Initialize.c file of | |
42 | ;; Release 4. | |
43 | ||
44 | ;; Command line Resource Manager string | |
45 | ||
46 | ;; +rv *reverseVideo | |
47 | ;; +synchronous *synchronous | |
48 | ;; -background *background | |
49 | ;; -bd *borderColor | |
50 | ;; -bg *background | |
51 | ;; -bordercolor *borderColor | |
52 | ;; -borderwidth .borderWidth | |
53 | ;; -bw .borderWidth | |
54 | ;; -display .display | |
55 | ;; -fg *foreground | |
56 | ;; -fn *font | |
57 | ;; -font *font | |
58 | ;; -foreground *foreground | |
59 | ;; -geometry .geometry | |
60 | ;; -iconic .iconic | |
61 | ;; -name .name | |
62 | ;; -reverse *reverseVideo | |
63 | ;; -rv *reverseVideo | |
64 | ;; -selectionTimeout .selectionTimeout | |
65 | ;; -synchronous *synchronous | |
63f77899 JB |
66 | ;; -xrm |
67 | ||
63f77899 JB |
68 | ;; An alist of X options and the function which handles them. See |
69 | ;; ../startup.el. | |
70 | ||
2246281f | 71 | (if (not (fboundp 'x-create-frame)) |
800642d2 | 72 | (error "%s: Loading x-win.el but not compiled for X" (invocation-name))) |
db95369b | 73 | |
0cc89026 | 74 | (require 'frame) |
3eb43f71 | 75 | (require 'mouse) |
b16795eb | 76 | (require 'scroll-bar) |
ffe1dd7a JB |
77 | (require 'faces) |
78 | (require 'select) | |
290cb602 | 79 | (require 'menu-bar) |
6acdd93e | 80 | (require 'fontset) |
6b61353c | 81 | (require 'x-dnd) |
63c86e17 | 82 | |
19b08de9 | 83 | (defvar x-invocation-args) |
cc5e32c5 JB |
84 | (defvar x-keysym-table) |
85 | (defvar x-selection-timeout) | |
86 | (defvar x-session-id) | |
87 | (defvar x-session-previous-id) | |
19b08de9 | 88 | |
0389072b JD |
89 | (defun x-handle-no-bitmap-icon (switch) |
90 | (setq default-frame-alist (cons '(icon-type) default-frame-alist))) | |
91 | ||
350c1745 JD |
92 | ;; Handle the --parent-id option. |
93 | (defun x-handle-parent-id (switch) | |
94 | (or (consp x-invocation-args) | |
95 | (error "%s: missing argument to `%s' option" (invocation-name) switch)) | |
f9c7b08c GM |
96 | (setq initial-frame-alist (cons |
97 | (cons 'parent-id | |
98 | (string-to-number (car x-invocation-args))) | |
99 | initial-frame-alist) | |
100 | x-invocation-args (cdr x-invocation-args))) | |
350c1745 | 101 | |
941a391a JD |
102 | ;; Handle the --smid switch. This is used by the session manager |
103 | ;; to give us back our session id we had on the previous run. | |
104 | (defun x-handle-smid (switch) | |
105 | (or (consp x-invocation-args) | |
106 | (error "%s: missing argument to `%s' option" (invocation-name) switch)) | |
107 | (setq x-session-previous-id (car x-invocation-args) | |
108 | x-invocation-args (cdr x-invocation-args))) | |
109 | ||
110 | (defvar emacs-save-session-functions nil | |
c3ef5084 SM |
111 | "Special hook run when a save-session event occurs. |
112 | The functions do not get any argument. | |
941a391a JD |
113 | Functions can return non-nil to inform the session manager that the |
114 | window system shutdown should be aborted. | |
115 | ||
116 | See also `emacs-session-save'.") | |
117 | ||
118 | (defun emacs-session-filename (session-id) | |
119 | "Construct a filename to save the session in based on SESSION-ID. | |
120 | If the directory ~/.emacs.d exists, we make a filename in there, otherwise | |
121 | a file in the home directory." | |
122 | (let ((basename (concat "session." session-id)) | |
c093939c | 123 | (emacs-dir user-emacs-directory)) |
941a391a JD |
124 | (expand-file-name (if (file-directory-p emacs-dir) |
125 | (concat emacs-dir basename) | |
126 | (concat "~/.emacs-" basename))))) | |
db95369b | 127 | |
941a391a JD |
128 | (defun emacs-session-save () |
129 | "This function is called when the window system is shutting down. | |
130 | If this function returns non-nil, the window system shutdown is cancelled. | |
131 | ||
132 | When a session manager tells Emacs that the window system is shutting | |
133 | down, this function is called. It calls the functions in the hook | |
134 | `emacs-save-session-functions'. Functions are called with the current | |
135 | buffer set to a temporary buffer. Functions should use `insert' to insert | |
db9e401b JB |
136 | lisp code to save the session state. The buffer is saved in a file in the |
137 | home directory of the user running Emacs. The file is evaluated when | |
138 | Emacs is restarted by the session manager. | |
941a391a JD |
139 | |
140 | If any of the functions returns non-nil, no more functions are called | |
141 | and this function returns non-nil. This will inform the session manager | |
142 | that it should abort the window system shutdown." | |
143 | (let ((filename (emacs-session-filename x-session-id)) | |
144 | (buf (get-buffer-create (concat " *SES " x-session-id)))) | |
145 | (when (file-exists-p filename) | |
146 | (delete-file filename)) | |
147 | (with-current-buffer buf | |
148 | (let ((cancel-shutdown (condition-case nil | |
3842fde1 | 149 | ;; A return of t means cancel the shutdown. |
db95369b | 150 | (run-hook-with-args-until-success |
941a391a JD |
151 | 'emacs-save-session-functions) |
152 | (error t)))) | |
153 | (unless cancel-shutdown | |
154 | (write-file filename)) | |
155 | (kill-buffer buf) | |
156 | cancel-shutdown)))) | |
157 | ||
1e4f6cec | 158 | (defun emacs-session-restore (previous-session-id) |
941a391a JD |
159 | "Restore the Emacs session if started by a session manager. |
160 | The file saved by `emacs-session-save' is evaluated and deleted if it | |
161 | exists." | |
1e4f6cec | 162 | (let ((filename (emacs-session-filename previous-session-id))) |
941a391a JD |
163 | (when (file-exists-p filename) |
164 | (load-file filename) | |
165 | (delete-file filename) | |
166 | (message "Restored session data")))) | |
167 | ||
db95369b JB |
168 | |
169 | ||
63f77899 JB |
170 | \f |
171 | ;; | |
172 | ;; Standard X cursor shapes, courtesy of Mr. Fox, who wanted ALL of them. | |
173 | ;; | |
174 | ||
175 | (defconst x-pointer-X-cursor 0) | |
176 | (defconst x-pointer-arrow 2) | |
177 | (defconst x-pointer-based-arrow-down 4) | |
178 | (defconst x-pointer-based-arrow-up 6) | |
179 | (defconst x-pointer-boat 8) | |
180 | (defconst x-pointer-bogosity 10) | |
181 | (defconst x-pointer-bottom-left-corner 12) | |
182 | (defconst x-pointer-bottom-right-corner 14) | |
183 | (defconst x-pointer-bottom-side 16) | |
184 | (defconst x-pointer-bottom-tee 18) | |
185 | (defconst x-pointer-box-spiral 20) | |
186 | (defconst x-pointer-center-ptr 22) | |
187 | (defconst x-pointer-circle 24) | |
188 | (defconst x-pointer-clock 26) | |
189 | (defconst x-pointer-coffee-mug 28) | |
190 | (defconst x-pointer-cross 30) | |
191 | (defconst x-pointer-cross-reverse 32) | |
192 | (defconst x-pointer-crosshair 34) | |
193 | (defconst x-pointer-diamond-cross 36) | |
194 | (defconst x-pointer-dot 38) | |
195 | (defconst x-pointer-dotbox 40) | |
196 | (defconst x-pointer-double-arrow 42) | |
197 | (defconst x-pointer-draft-large 44) | |
198 | (defconst x-pointer-draft-small 46) | |
199 | (defconst x-pointer-draped-box 48) | |
200 | (defconst x-pointer-exchange 50) | |
201 | (defconst x-pointer-fleur 52) | |
202 | (defconst x-pointer-gobbler 54) | |
203 | (defconst x-pointer-gumby 56) | |
204 | (defconst x-pointer-hand1 58) | |
205 | (defconst x-pointer-hand2 60) | |
206 | (defconst x-pointer-heart 62) | |
207 | (defconst x-pointer-icon 64) | |
208 | (defconst x-pointer-iron-cross 66) | |
209 | (defconst x-pointer-left-ptr 68) | |
210 | (defconst x-pointer-left-side 70) | |
211 | (defconst x-pointer-left-tee 72) | |
212 | (defconst x-pointer-leftbutton 74) | |
213 | (defconst x-pointer-ll-angle 76) | |
214 | (defconst x-pointer-lr-angle 78) | |
215 | (defconst x-pointer-man 80) | |
216 | (defconst x-pointer-middlebutton 82) | |
217 | (defconst x-pointer-mouse 84) | |
218 | (defconst x-pointer-pencil 86) | |
219 | (defconst x-pointer-pirate 88) | |
220 | (defconst x-pointer-plus 90) | |
221 | (defconst x-pointer-question-arrow 92) | |
222 | (defconst x-pointer-right-ptr 94) | |
223 | (defconst x-pointer-right-side 96) | |
224 | (defconst x-pointer-right-tee 98) | |
225 | (defconst x-pointer-rightbutton 100) | |
226 | (defconst x-pointer-rtl-logo 102) | |
227 | (defconst x-pointer-sailboat 104) | |
228 | (defconst x-pointer-sb-down-arrow 106) | |
229 | (defconst x-pointer-sb-h-double-arrow 108) | |
230 | (defconst x-pointer-sb-left-arrow 110) | |
231 | (defconst x-pointer-sb-right-arrow 112) | |
232 | (defconst x-pointer-sb-up-arrow 114) | |
233 | (defconst x-pointer-sb-v-double-arrow 116) | |
234 | (defconst x-pointer-shuttle 118) | |
235 | (defconst x-pointer-sizing 120) | |
236 | (defconst x-pointer-spider 122) | |
237 | (defconst x-pointer-spraycan 124) | |
238 | (defconst x-pointer-star 126) | |
239 | (defconst x-pointer-target 128) | |
240 | (defconst x-pointer-tcross 130) | |
241 | (defconst x-pointer-top-left-arrow 132) | |
242 | (defconst x-pointer-top-left-corner 134) | |
243 | (defconst x-pointer-top-right-corner 136) | |
244 | (defconst x-pointer-top-side 138) | |
245 | (defconst x-pointer-top-tee 140) | |
246 | (defconst x-pointer-trek 142) | |
247 | (defconst x-pointer-ul-angle 144) | |
248 | (defconst x-pointer-umbrella 146) | |
249 | (defconst x-pointer-ur-angle 148) | |
250 | (defconst x-pointer-watch 150) | |
251 | (defconst x-pointer-xterm 152) | |
5cb94d12 | 252 | (defconst x-pointer-invisible 255) |
63f77899 | 253 | |
d5e4dda5 | 254 | \f |
f2d9c15f GM |
255 | (defvar x-colors) |
256 | ||
f795f633 | 257 | (defun xw-defined-colors (&optional frame) |
3077d1f6 | 258 | "Internal function called by `defined-colors'." |
891eb3fe | 259 | (or frame (setq frame (selected-frame))) |
63f77899 JB |
260 | (let ((all-colors x-colors) |
261 | (this-color nil) | |
262 | (defined-colors nil)) | |
263 | (while all-colors | |
264 | (setq this-color (car all-colors) | |
265 | all-colors (cdr all-colors)) | |
79b24da3 | 266 | (and (color-supported-p this-color frame t) |
63f77899 JB |
267 | (setq defined-colors (cons this-color defined-colors)))) |
268 | defined-colors)) | |
63f77899 | 269 | \f |
98bf0c8d JB |
270 | ;;;; Function keys |
271 | ||
bbd2296c SM |
272 | (defvar x-alternatives-map |
273 | (let ((map (make-sparse-keymap))) | |
274 | ;; Map certain keypad keys into ASCII characters that people usually expect. | |
bbd2296c SM |
275 | (define-key map [M-backspace] [?\M-\d]) |
276 | (define-key map [M-delete] [?\M-\d]) | |
277 | (define-key map [M-tab] [?\M-\t]) | |
278 | (define-key map [M-linefeed] [?\M-\n]) | |
279 | (define-key map [M-clear] [?\M-\C-l]) | |
280 | (define-key map [M-return] [?\M-\C-m]) | |
281 | (define-key map [M-escape] [?\M-\e]) | |
282 | (define-key map [iso-lefttab] [backtab]) | |
f6959eb4 | 283 | (define-key map [S-iso-lefttab] [backtab]) |
bbd2296c SM |
284 | map) |
285 | "Keymap of possible alternative meanings for some keys.") | |
286 | ||
2bb819d5 | 287 | (defun x-setup-function-keys (frame) |
3077d1f6 | 288 | "Set up `function-key-map' on the graphical frame FRAME." |
b97a79c4 KL |
289 | ;; Don't do this twice on the same display, or it would break |
290 | ;; normal-erase-is-backspace-mode. | |
291 | (unless (terminal-parameter frame 'x-setup-function-keys) | |
292 | ;; Map certain keypad keys into ASCII characters that people usually expect. | |
293 | (with-selected-frame frame | |
bbd2296c SM |
294 | (let ((map (copy-keymap x-alternatives-map))) |
295 | (set-keymap-parent map (keymap-parent local-function-key-map)) | |
296 | (set-keymap-parent local-function-key-map map))) | |
b97a79c4 | 297 | (set-terminal-parameter frame 'x-setup-function-keys t))) |
cf07d2bd DL |
298 | \f |
299 | ;;;; Keysyms | |
300 | ||
9b4234ae | 301 | (defun vendor-specific-keysyms (vendor) |
089bc712 | 302 | "Return the appropriate value of `system-key-alist' for VENDOR. |
9b4234ae | 303 | VENDOR is a string containing the name of the X Server's vendor, |
089bc712 | 304 | as returned by `x-server-vendor'." |
f3041af1 | 305 | (cond ((or (string-equal vendor "Hewlett-Packard Incorporated") |
3f18a142 | 306 | (string-equal vendor "Hewlett-Packard Company")) |
9b4234ae RS |
307 | '(( 168 . mute-acute) |
308 | ( 169 . mute-grave) | |
309 | ( 170 . mute-asciicircum) | |
310 | ( 171 . mute-diaeresis) | |
311 | ( 172 . mute-asciitilde) | |
312 | ( 175 . lira) | |
313 | ( 190 . guilder) | |
314 | ( 252 . block) | |
315 | ( 256 . longminus) | |
316 | (65388 . reset) | |
317 | (65389 . system) | |
318 | (65390 . user) | |
319 | (65391 . clearline) | |
320 | (65392 . insertline) | |
321 | (65393 . deleteline) | |
322 | (65394 . insertchar) | |
323 | (65395 . deletechar) | |
324 | (65396 . backtab) | |
325 | (65397 . kp-backtab))) | |
cf07d2bd | 326 | ;; Fixme: What about non-X11/NeWS sun server? |
04486a2d KH |
327 | ((or (string-equal vendor "X11/NeWS - Sun Microsystems Inc.") |
328 | (string-equal vendor "X Consortium")) | |
51a8e1cc KH |
329 | '((392976 . f36) |
330 | (392977 . f37) | |
9b4234ae RS |
331 | (393056 . req) |
332 | ;; These are for Sun under X11R6 | |
333 | (393072 . props) | |
334 | (393073 . front) | |
335 | (393074 . copy) | |
336 | (393075 . open) | |
337 | (393076 . paste) | |
338 | (393077 . cut))) | |
339 | (t | |
340 | ;; This is used by DEC's X server. | |
341 | '((65280 . remove))))) | |
342 | ||
58fa26d4 | 343 | ;; Latin-1 |
cf07d2bd DL |
344 | (let ((i 160)) |
345 | (while (< i 256) | |
1d912b36 | 346 | (puthash i i x-keysym-table) |
cf07d2bd DL |
347 | (setq i (1+ i)))) |
348 | ||
349 | ;; Table from Kuhn's proposed additions to the `KEYSYM Encoding' | |
350 | ;; appendix to the X protocol definition. | |
351 | (dolist | |
352 | (pair | |
353 | '( | |
354 | ;; Latin-2 | |
355 | (#x1a1 . ?\e,B!\e(B) | |
356 | (#x1a2 . ?\e,B"\e(B) | |
357 | (#x1a3 . ?\e,B#\e(B) | |
358 | (#x1a5 . ?\e,B%\e(B) | |
359 | (#x1a6 . ?\e,B&\e(B) | |
360 | (#x1a9 . ?\e,B)\e(B) | |
361 | (#x1aa . ?\e,B*\e(B) | |
362 | (#x1ab . ?\e,B+\e(B) | |
363 | (#x1ac . ?\e,B,\e(B) | |
364 | (#x1ae . ?\e,B.\e(B) | |
365 | (#x1af . ?\e,B/\e(B) | |
366 | (#x1b1 . ?\e,B1\e(B) | |
367 | (#x1b2 . ?\e,B2\e(B) | |
368 | (#x1b3 . ?\e,B3\e(B) | |
369 | (#x1b5 . ?\e,B5\e(B) | |
370 | (#x1b6 . ?\e,B6\e(B) | |
371 | (#x1b7 . ?\e,B7\e(B) | |
372 | (#x1b9 . ?\e,B9\e(B) | |
373 | (#x1ba . ?\e,B:\e(B) | |
374 | (#x1bb . ?\e,B;\e(B) | |
375 | (#x1bc . ?\e,B<\e(B) | |
376 | (#x1bd . ?\e,B=\e(B) | |
377 | (#x1be . ?\e,B>\e(B) | |
378 | (#x1bf . ?\e,B?\e(B) | |
379 | (#x1c0 . ?\e,B@\e(B) | |
380 | (#x1c3 . ?\e,BC\e(B) | |
381 | (#x1c5 . ?\e,BE\e(B) | |
382 | (#x1c6 . ?\e,BF\e(B) | |
383 | (#x1c8 . ?\e,BH\e(B) | |
384 | (#x1ca . ?\e,BJ\e(B) | |
385 | (#x1cc . ?\e,BL\e(B) | |
386 | (#x1cf . ?\e,BO\e(B) | |
387 | (#x1d0 . ?\e,BP\e(B) | |
388 | (#x1d1 . ?\e,BQ\e(B) | |
389 | (#x1d2 . ?\e,BR\e(B) | |
390 | (#x1d5 . ?\e,BU\e(B) | |
391 | (#x1d8 . ?\e,BX\e(B) | |
392 | (#x1d9 . ?\e,BY\e(B) | |
393 | (#x1db . ?\e,B[\e(B) | |
394 | (#x1de . ?\e,B^\e(B) | |
395 | (#x1e0 . ?\e,B`\e(B) | |
396 | (#x1e3 . ?\e,Bc\e(B) | |
397 | (#x1e5 . ?\e,Be\e(B) | |
398 | (#x1e6 . ?\e,Bf\e(B) | |
399 | (#x1e8 . ?\e,Bh\e(B) | |
400 | (#x1ea . ?\e,Bj\e(B) | |
401 | (#x1ec . ?\e,Bl\e(B) | |
402 | (#x1ef . ?\e,Bo\e(B) | |
403 | (#x1f0 . ?\e,Bp\e(B) | |
404 | (#x1f1 . ?\e,Bq\e(B) | |
405 | (#x1f2 . ?\e,Br\e(B) | |
406 | (#x1f5 . ?\e,Bu\e(B) | |
407 | (#x1f8 . ?\e,Bx\e(B) | |
408 | (#x1f9 . ?\e,By\e(B) | |
409 | (#x1fb . ?\e,B{\e(B) | |
410 | (#x1fe . ?\e,B~\e(B) | |
411 | (#x1ff . ?\e,B\7f\e(B) | |
412 | ;; Latin-3 | |
413 | (#x2a1 . ?\e,C!\e(B) | |
414 | (#x2a6 . ?\e,C&\e(B) | |
415 | (#x2a9 . ?\e,C)\e(B) | |
416 | (#x2ab . ?\e,C+\e(B) | |
417 | (#x2ac . ?\e,C,\e(B) | |
418 | (#x2b1 . ?\e,C1\e(B) | |
419 | (#x2b6 . ?\e,C6\e(B) | |
420 | (#x2b9 . ?\e,C9\e(B) | |
421 | (#x2bb . ?\e,C;\e(B) | |
422 | (#x2bc . ?\e,C<\e(B) | |
423 | (#x2c5 . ?\e,CE\e(B) | |
424 | (#x2c6 . ?\e,CF\e(B) | |
425 | (#x2d5 . ?\e,CU\e(B) | |
426 | (#x2d8 . ?\e,CX\e(B) | |
427 | (#x2dd . ?\e,C]\e(B) | |
428 | (#x2de . ?\e,C^\e(B) | |
429 | (#x2e5 . ?\e,Ce\e(B) | |
430 | (#x2e6 . ?\e,Cf\e(B) | |
431 | (#x2f5 . ?\e,Cu\e(B) | |
432 | (#x2f8 . ?\e,Cx\e(B) | |
433 | (#x2fd . ?\e,C}\e(B) | |
434 | (#x2fe . ?\e,C~\e(B) | |
435 | ;; Latin-4 | |
436 | (#x3a2 . ?\e,D"\e(B) | |
437 | (#x3a3 . ?\e,D#\e(B) | |
438 | (#x3a5 . ?\e,D%\e(B) | |
439 | (#x3a6 . ?\e,D&\e(B) | |
440 | (#x3aa . ?\e,D*\e(B) | |
441 | (#x3ab . ?\e,D+\e(B) | |
442 | (#x3ac . ?\e,D,\e(B) | |
443 | (#x3b3 . ?\e,D3\e(B) | |
444 | (#x3b5 . ?\e,D5\e(B) | |
445 | (#x3b6 . ?\e,D6\e(B) | |
446 | (#x3ba . ?\e,D:\e(B) | |
447 | (#x3bb . ?\e,D;\e(B) | |
448 | (#x3bc . ?\e,D<\e(B) | |
449 | (#x3bd . ?\e,D=\e(B) | |
450 | (#x3bf . ?\e,D?\e(B) | |
451 | (#x3c0 . ?\e,D@\e(B) | |
452 | (#x3c7 . ?\e,DG\e(B) | |
453 | (#x3cc . ?\e,DL\e(B) | |
454 | (#x3cf . ?\e,DO\e(B) | |
455 | (#x3d1 . ?\e,DQ\e(B) | |
456 | (#x3d2 . ?\e,DR\e(B) | |
457 | (#x3d3 . ?\e,DS\e(B) | |
458 | (#x3d9 . ?\e,DY\e(B) | |
459 | (#x3dd . ?\e,D]\e(B) | |
460 | (#x3de . ?\e,D^\e(B) | |
461 | (#x3e0 . ?\e,D`\e(B) | |
462 | (#x3e7 . ?\e,Dg\e(B) | |
463 | (#x3ec . ?\e,Dl\e(B) | |
464 | (#x3ef . ?\e,Do\e(B) | |
465 | (#x3f1 . ?\e,Dq\e(B) | |
466 | (#x3f2 . ?\e,Dr\e(B) | |
467 | (#x3f3 . ?\e,Ds\e(B) | |
468 | (#x3f9 . ?\e,Dy\e(B) | |
469 | (#x3fd . ?\e,D}\e(B) | |
470 | (#x3fe . ?\e,D~\e(B) | |
471 | ;; Kana: Fixme: needs conversion to Japanese charset -- seems | |
472 | ;; to require jisx0213, for which the Unicode translation | |
473 | ;; isn't clear. | |
6b61353c KH |
474 | (#x47e . ?\e(J~\e(B) |
475 | (#x4a1 . ?\e$A!#\e(B) | |
476 | (#x4a2 . ?\\e$A!8\e(B) | |
477 | (#x4a3 . ?\\e$A!9\e(B) | |
478 | (#x4a4 . ?\e$A!"\e(B) | |
479 | (#x4a5 . ?\e$A!$\e(B) | |
480 | (#x4a6 . ?\e$A%r\e(B) | |
481 | (#x4a7 . ?\e$A%!\e(B) | |
482 | (#x4a8 . ?\e$A%#\e(B) | |
483 | (#x4a9 . ?\e$A%%\e(B) | |
484 | (#x4aa . ?\e$A%'\e(B) | |
485 | (#x4ab . ?\e$A%)\e(B) | |
486 | (#x4ac . ?\e$A%c\e(B) | |
487 | (#x4ad . ?\e$A%e\e(B) | |
488 | (#x4ae . ?\e$A%g\e(B) | |
489 | (#x4af . ?\e$A%C\e(B) | |
490 | (#x4b0 . ?\e$B!<\e(B) | |
491 | (#x4b1 . ?\e$A%"\e(B) | |
492 | (#x4b2 . ?\e$A%$\e(B) | |
493 | (#x4b3 . ?\e$A%&\e(B) | |
494 | (#x4b4 . ?\e$A%(\e(B) | |
495 | (#x4b5 . ?\e$A%*\e(B) | |
496 | (#x4b6 . ?\e$A%+\e(B) | |
497 | (#x4b7 . ?\e$A%-\e(B) | |
498 | (#x4b8 . ?\e$A%/\e(B) | |
499 | (#x4b9 . ?\e$A%1\e(B) | |
500 | (#x4ba . ?\e$A%3\e(B) | |
501 | (#x4bb . ?\e$A%5\e(B) | |
502 | (#x4bc . ?\e$A%7\e(B) | |
503 | (#x4bd . ?\e$A%9\e(B) | |
504 | (#x4be . ?\e$A%;\e(B) | |
505 | (#x4bf . ?\e$A%=\e(B) | |
506 | (#x4c0 . ?\e$A%?\e(B) | |
507 | (#x4c1 . ?\e$A%A\e(B) | |
508 | (#x4c2 . ?\e$A%D\e(B) | |
509 | (#x4c3 . ?\e$A%F\e(B) | |
510 | (#x4c4 . ?\e$A%H\e(B) | |
511 | (#x4c5 . ?\e$A%J\e(B) | |
512 | (#x4c6 . ?\e$A%K\e(B) | |
513 | (#x4c7 . ?\e$A%L\e(B) | |
514 | (#x4c8 . ?\e$A%M\e(B) | |
515 | (#x4c9 . ?\e$A%N\e(B) | |
516 | (#x4ca . ?\e$A%O\e(B) | |
517 | (#x4cb . ?\e$A%R\e(B) | |
518 | (#x4cc . ?\e$A%U\e(B) | |
519 | (#x4cd . ?\e$A%X\e(B) | |
520 | (#x4ce . ?\e$A%[\e(B) | |
521 | (#x4cf . ?\e$A%^\e(B) | |
522 | (#x4d0 . ?\e$A%_\e(B) | |
523 | (#x4d1 . ?\e$A%`\e(B) | |
524 | (#x4d2 . ?\e$A%a\e(B) | |
525 | (#x4d3 . ?\e$A%b\e(B) | |
526 | (#x4d4 . ?\e$A%d\e(B) | |
527 | (#x4d5 . ?\e$A%f\e(B) | |
528 | (#x4d6 . ?\e$A%h\e(B) | |
529 | (#x4d7 . ?\e$A%i\e(B) | |
530 | (#x4d8 . ?\e$A%j\e(B) | |
531 | (#x4d9 . ?\e$A%k\e(B) | |
532 | (#x4da . ?\e$A%l\e(B) | |
533 | (#x4db . ?\e$A%m\e(B) | |
534 | (#x4dc . ?\e$A%o\e(B) | |
535 | (#x4dd . ?\e$A%s\e(B) | |
536 | (#x4de . ?\e$B!+\e(B) | |
537 | (#x4df . ?\e$B!,\e(B) | |
cf07d2bd DL |
538 | ;; Arabic |
539 | (#x5ac . ?\e,G,\e(B) | |
540 | (#x5bb . ?\e,G;\e(B) | |
541 | (#x5bf . ?\e,G?\e(B) | |
542 | (#x5c1 . ?\e,GA\e(B) | |
543 | (#x5c2 . ?\e,GB\e(B) | |
544 | (#x5c3 . ?\e,GC\e(B) | |
545 | (#x5c4 . ?\e,GD\e(B) | |
546 | (#x5c5 . ?\e,GE\e(B) | |
547 | (#x5c6 . ?\e,GF\e(B) | |
548 | (#x5c7 . ?\e,GG\e(B) | |
549 | (#x5c8 . ?\e,GH\e(B) | |
550 | (#x5c9 . ?\e,GI\e(B) | |
551 | (#x5ca . ?\e,GJ\e(B) | |
552 | (#x5cb . ?\e,GK\e(B) | |
553 | (#x5cc . ?\e,GL\e(B) | |
554 | (#x5cd . ?\e,GM\e(B) | |
555 | (#x5ce . ?\e,GN\e(B) | |
556 | (#x5cf . ?\e,GO\e(B) | |
557 | (#x5d0 . ?\e,GP\e(B) | |
558 | (#x5d1 . ?\e,GQ\e(B) | |
559 | (#x5d2 . ?\e,GR\e(B) | |
560 | (#x5d3 . ?\e,GS\e(B) | |
561 | (#x5d4 . ?\e,GT\e(B) | |
562 | (#x5d5 . ?\e,GU\e(B) | |
563 | (#x5d6 . ?\e,GV\e(B) | |
564 | (#x5d7 . ?\e,GW\e(B) | |
565 | (#x5d8 . ?\e,GX\e(B) | |
566 | (#x5d9 . ?\e,GY\e(B) | |
567 | (#x5da . ?\e,GZ\e(B) | |
568 | (#x5e0 . ?\e,G`\e(B) | |
569 | (#x5e1 . ?\e,Ga\e(B) | |
570 | (#x5e2 . ?\e,Gb\e(B) | |
571 | (#x5e3 . ?\e,Gc\e(B) | |
572 | (#x5e4 . ?\e,Gd\e(B) | |
573 | (#x5e5 . ?\e,Ge\e(B) | |
574 | (#x5e6 . ?\e,Gf\e(B) | |
575 | (#x5e7 . ?\e,Gg\e(B) | |
576 | (#x5e8 . ?\e,Gh\e(B) | |
577 | (#x5e9 . ?\e,Gi\e(B) | |
578 | (#x5ea . ?\e,Gj\e(B) | |
579 | (#x5eb . ?\e,Gk\e(B) | |
580 | (#x5ec . ?\e,Gl\e(B) | |
581 | (#x5ed . ?\e,Gm\e(B) | |
582 | (#x5ee . ?\e,Gn\e(B) | |
583 | (#x5ef . ?\e,Go\e(B) | |
584 | (#x5f0 . ?\e,Gp\e(B) | |
585 | (#x5f1 . ?\e,Gq\e(B) | |
586 | (#x5f2 . ?\e,Gr\e(B) | |
587 | ;; Cyrillic | |
1cbe1e4b KH |
588 | (#x680 . ?\e$,1)R\e(B) |
589 | (#x681 . ?\e$,1)V\e(B) | |
590 | (#x682 . ?\e$,1)Z\e(B) | |
591 | (#x683 . ?\e$,1)\\e(B) | |
592 | (#x684 . ?\e$,1)b\e(B) | |
593 | (#x685 . ?\e$,1)n\e(B) | |
594 | (#x686 . ?\e$,1)p\e(B) | |
595 | (#x687 . ?\e$,1)r\e(B) | |
596 | (#x688 . ?\e$,1)v\e(B) | |
597 | (#x689 . ?\e$,1)x\e(B) | |
598 | (#x68a . ?\e$,1)z\e(B) | |
599 | (#x68c . ?\e$,1*8\e(B) | |
600 | (#x68d . ?\e$,1*B\e(B) | |
601 | (#x68e . ?\e$,1*H\e(B) | |
602 | (#x68f . ?\e$,1*N\e(B) | |
603 | (#x690 . ?\e$,1)S\e(B) | |
604 | (#x691 . ?\e$,1)W\e(B) | |
605 | (#x692 . ?\e$,1)[\e(B) | |
606 | (#x693 . ?\e$,1)]\e(B) | |
607 | (#x694 . ?\e$,1)c\e(B) | |
608 | (#x695 . ?\e$,1)o\e(B) | |
609 | (#x696 . ?\e$,1)q\e(B) | |
610 | (#x697 . ?\e$,1)s\e(B) | |
611 | (#x698 . ?\e$,1)w\e(B) | |
612 | (#x699 . ?\e$,1)y\e(B) | |
613 | (#x69a . ?\e$,1){\e(B) | |
614 | (#x69c . ?\e$,1*9\e(B) | |
615 | (#x69d . ?\e$,1*C\e(B) | |
616 | (#x69e . ?\e$,1*I\e(B) | |
617 | (#x69f . ?\e$,1*O\e(B) | |
cf07d2bd DL |
618 | (#x6a1 . ?\e,Lr\e(B) |
619 | (#x6a2 . ?\e,Ls\e(B) | |
620 | (#x6a3 . ?\e,Lq\e(B) | |
621 | (#x6a4 . ?\e,Lt\e(B) | |
622 | (#x6a5 . ?\e,Lu\e(B) | |
623 | (#x6a6 . ?\e,Lv\e(B) | |
624 | (#x6a7 . ?\e,Lw\e(B) | |
625 | (#x6a8 . ?\e,Lx\e(B) | |
626 | (#x6a9 . ?\e,Ly\e(B) | |
627 | (#x6aa . ?\e,Lz\e(B) | |
628 | (#x6ab . ?\e,L{\e(B) | |
629 | (#x6ac . ?\e,L|\e(B) | |
630 | (#x6ae . ?\e,L~\e(B) | |
631 | (#x6af . ?\e,L\7f\e(B) | |
632 | (#x6b0 . ?\e,Lp\e(B) | |
633 | (#x6b1 . ?\e,L"\e(B) | |
634 | (#x6b2 . ?\e,L#\e(B) | |
635 | (#x6b3 . ?\e,L!\e(B) | |
636 | (#x6b4 . ?\e,L$\e(B) | |
637 | (#x6b5 . ?\e,L%\e(B) | |
638 | (#x6b6 . ?\e,L&\e(B) | |
639 | (#x6b7 . ?\e,L'\e(B) | |
640 | (#x6b8 . ?\e,L(\e(B) | |
641 | (#x6b9 . ?\e,L)\e(B) | |
642 | (#x6ba . ?\e,L*\e(B) | |
643 | (#x6bb . ?\e,L+\e(B) | |
644 | (#x6bc . ?\e,L,\e(B) | |
645 | (#x6be . ?\e,L.\e(B) | |
646 | (#x6bf . ?\e,L/\e(B) | |
647 | (#x6c0 . ?\e,Ln\e(B) | |
648 | (#x6c1 . ?\e,LP\e(B) | |
649 | (#x6c2 . ?\e,LQ\e(B) | |
650 | (#x6c3 . ?\e,Lf\e(B) | |
651 | (#x6c4 . ?\e,LT\e(B) | |
652 | (#x6c5 . ?\e,LU\e(B) | |
653 | (#x6c6 . ?\e,Ld\e(B) | |
654 | (#x6c7 . ?\e,LS\e(B) | |
655 | (#x6c8 . ?\e,Le\e(B) | |
656 | (#x6c9 . ?\e,LX\e(B) | |
657 | (#x6ca . ?\e,LY\e(B) | |
658 | (#x6cb . ?\e,LZ\e(B) | |
659 | (#x6cc . ?\e,L[\e(B) | |
660 | (#x6cd . ?\e,L\\e(B) | |
661 | (#x6ce . ?\e,L]\e(B) | |
662 | (#x6cf . ?\e,L^\e(B) | |
663 | (#x6d0 . ?\e,L_\e(B) | |
664 | (#x6d1 . ?\e,Lo\e(B) | |
665 | (#x6d2 . ?\e,L`\e(B) | |
666 | (#x6d3 . ?\e,La\e(B) | |
667 | (#x6d4 . ?\e,Lb\e(B) | |
668 | (#x6d5 . ?\e,Lc\e(B) | |
669 | (#x6d6 . ?\e,LV\e(B) | |
670 | (#x6d7 . ?\e,LR\e(B) | |
671 | (#x6d8 . ?\e,Ll\e(B) | |
672 | (#x6d9 . ?\e,Lk\e(B) | |
673 | (#x6da . ?\e,LW\e(B) | |
674 | (#x6db . ?\e,Lh\e(B) | |
675 | (#x6dc . ?\e,Lm\e(B) | |
676 | (#x6dd . ?\e,Li\e(B) | |
677 | (#x6de . ?\e,Lg\e(B) | |
678 | (#x6df . ?\e,Lj\e(B) | |
679 | (#x6e0 . ?\e,LN\e(B) | |
680 | (#x6e1 . ?\e,L0\e(B) | |
681 | (#x6e2 . ?\e,L1\e(B) | |
682 | (#x6e3 . ?\e,LF\e(B) | |
683 | (#x6e4 . ?\e,L4\e(B) | |
684 | (#x6e5 . ?\e,L5\e(B) | |
685 | (#x6e6 . ?\e,LD\e(B) | |
686 | (#x6e7 . ?\e,L3\e(B) | |
687 | (#x6e8 . ?\e,LE\e(B) | |
688 | (#x6e9 . ?\e,L8\e(B) | |
689 | (#x6ea . ?\e,L9\e(B) | |
690 | (#x6eb . ?\e,L:\e(B) | |
691 | (#x6ec . ?\e,L;\e(B) | |
692 | (#x6ed . ?\e,L<\e(B) | |
693 | (#x6ee . ?\e,L=\e(B) | |
694 | (#x6ef . ?\e,L>\e(B) | |
695 | (#x6f0 . ?\e,L?\e(B) | |
696 | (#x6f1 . ?\e,LO\e(B) | |
697 | (#x6f2 . ?\e,L@\e(B) | |
698 | (#x6f3 . ?\e,LA\e(B) | |
699 | (#x6f4 . ?\e,LB\e(B) | |
700 | (#x6f5 . ?\e,LC\e(B) | |
701 | (#x6f6 . ?\e,L6\e(B) | |
702 | (#x6f7 . ?\e,L2\e(B) | |
703 | (#x6f8 . ?\e,LL\e(B) | |
704 | (#x6f9 . ?\e,LK\e(B) | |
705 | (#x6fa . ?\e,L7\e(B) | |
706 | (#x6fb . ?\e,LH\e(B) | |
707 | (#x6fc . ?\e,LM\e(B) | |
708 | (#x6fd . ?\e,LI\e(B) | |
709 | (#x6fe . ?\e,LG\e(B) | |
710 | (#x6ff . ?\e,LJ\e(B) | |
711 | ;; Greek | |
712 | (#x7a1 . ?\e,F6\e(B) | |
713 | (#x7a2 . ?\e,F8\e(B) | |
714 | (#x7a3 . ?\e,F9\e(B) | |
715 | (#x7a4 . ?\e,F:\e(B) | |
716 | (#x7a5 . ?\e,FZ\e(B) | |
717 | (#x7a7 . ?\e,F<\e(B) | |
718 | (#x7a8 . ?\e,F>\e(B) | |
719 | (#x7a9 . ?\e,F[\e(B) | |
720 | (#x7ab . ?\e,F?\e(B) | |
721 | (#x7ae . ?\e,F5\e(B) | |
722 | (#x7af . ?\e,F/\e(B) | |
723 | (#x7b1 . ?\e,F\\e(B) | |
724 | (#x7b2 . ?\e,F]\e(B) | |
725 | (#x7b3 . ?\e,F^\e(B) | |
726 | (#x7b4 . ?\e,F_\e(B) | |
727 | (#x7b5 . ?\e,Fz\e(B) | |
728 | (#x7b6 . ?\e,F@\e(B) | |
729 | (#x7b7 . ?\e,F|\e(B) | |
730 | (#x7b8 . ?\e,F}\e(B) | |
731 | (#x7b9 . ?\e,F{\e(B) | |
732 | (#x7ba . ?\e,F`\e(B) | |
733 | (#x7bb . ?\e,F~\e(B) | |
734 | (#x7c1 . ?\e,FA\e(B) | |
735 | (#x7c2 . ?\e,FB\e(B) | |
736 | (#x7c3 . ?\e,FC\e(B) | |
737 | (#x7c4 . ?\e,FD\e(B) | |
738 | (#x7c5 . ?\e,FE\e(B) | |
739 | (#x7c6 . ?\e,FF\e(B) | |
740 | (#x7c7 . ?\e,FG\e(B) | |
741 | (#x7c8 . ?\e,FH\e(B) | |
742 | (#x7c9 . ?\e,FI\e(B) | |
743 | (#x7ca . ?\e,FJ\e(B) | |
744 | (#x7cb . ?\e,FK\e(B) | |
745 | (#x7cc . ?\e,FL\e(B) | |
746 | (#x7cd . ?\e,FM\e(B) | |
747 | (#x7ce . ?\e,FN\e(B) | |
748 | (#x7cf . ?\e,FO\e(B) | |
749 | (#x7d0 . ?\e,FP\e(B) | |
750 | (#x7d1 . ?\e,FQ\e(B) | |
751 | (#x7d2 . ?\e,FS\e(B) | |
752 | (#x7d4 . ?\e,FT\e(B) | |
753 | (#x7d5 . ?\e,FU\e(B) | |
754 | (#x7d6 . ?\e,FV\e(B) | |
755 | (#x7d7 . ?\e,FW\e(B) | |
756 | (#x7d8 . ?\e,FX\e(B) | |
757 | (#x7d9 . ?\e,FY\e(B) | |
758 | (#x7e1 . ?\e,Fa\e(B) | |
759 | (#x7e2 . ?\e,Fb\e(B) | |
760 | (#x7e3 . ?\e,Fc\e(B) | |
761 | (#x7e4 . ?\e,Fd\e(B) | |
762 | (#x7e5 . ?\e,Fe\e(B) | |
763 | (#x7e6 . ?\e,Ff\e(B) | |
764 | (#x7e7 . ?\e,Fg\e(B) | |
765 | (#x7e8 . ?\e,Fh\e(B) | |
766 | (#x7e9 . ?\e,Fi\e(B) | |
767 | (#x7ea . ?\e,Fj\e(B) | |
768 | (#x7eb . ?\e,Fk\e(B) | |
769 | (#x7ec . ?\e,Fl\e(B) | |
770 | (#x7ed . ?\e,Fm\e(B) | |
771 | (#x7ee . ?\e,Fn\e(B) | |
772 | (#x7ef . ?\e,Fo\e(B) | |
773 | (#x7f0 . ?\e,Fp\e(B) | |
774 | (#x7f1 . ?\e,Fq\e(B) | |
775 | (#x7f2 . ?\e,Fs\e(B) | |
776 | (#x7f3 . ?\e,Fr\e(B) | |
777 | (#x7f4 . ?\e,Ft\e(B) | |
778 | (#x7f5 . ?\e,Fu\e(B) | |
779 | (#x7f6 . ?\e,Fv\e(B) | |
780 | (#x7f7 . ?\e,Fw\e(B) | |
781 | (#x7f8 . ?\e,Fx\e(B) | |
782 | (#x7f9 . ?\e,Fy\e(B) | |
783 | ;; Technical | |
784 | (#x8a1 . ?\e$,1|W\e(B) | |
6b61353c KH |
785 | (#x8a2 . ?\e$A)0\e(B) |
786 | (#x8a3 . ?\e$A)$\e(B) | |
cf07d2bd DL |
787 | (#x8a4 . ?\e$,1{ \e(B) |
788 | (#x8a5 . ?\e$,1{!\e(B) | |
6b61353c | 789 | (#x8a6 . ?\e$A)&\e(B) |
cf07d2bd DL |
790 | (#x8a7 . ?\e$,1|A\e(B) |
791 | (#x8a8 . ?\e$,1|C\e(B) | |
792 | (#x8a9 . ?\e$,1|D\e(B) | |
793 | (#x8aa . ?\e$,1|F\e(B) | |
794 | (#x8ab . ?\e$,1|;\e(B) | |
795 | (#x8ac . ?\e$,1|=\e(B) | |
796 | (#x8ad . ?\e$,1|>\e(B) | |
797 | (#x8ae . ?\e$,1|@\e(B) | |
798 | (#x8af . ?\e$,1|H\e(B) | |
799 | (#x8b0 . ?\e$,1|L\e(B) | |
6b61353c KH |
800 | (#x8bc . ?\e$A!\\e(B) |
801 | (#x8bd . ?\e$A!Y\e(B) | |
802 | (#x8be . ?\e$A!]\e(B) | |
803 | (#x8bf . ?\e$A!R\e(B) | |
804 | (#x8c0 . ?\e$A!`\e(B) | |
805 | (#x8c1 . ?\e$A!X\e(B) | |
806 | (#x8c2 . ?\e$A!^\e(B) | |
807 | (#x8c5 . ?\e$B"`\e(B) | |
808 | (#x8c8 . ?\e$(G"D\e(B) | |
809 | (#x8c9 . ?\e$(O"l\e(B) | |
810 | (#x8cd . ?\e$B"N\e(B) | |
811 | (#x8ce . ?\e$B"M\e(B) | |
812 | (#x8cf . ?\e$A!T\e(B) | |
813 | (#x8d6 . ?\e$A!L\e(B) | |
814 | (#x8da . ?\e$B">\e(B) | |
815 | (#x8db . ?\e$B"?\e(B) | |
816 | (#x8dc . ?\e$A!I\e(B) | |
817 | (#x8dd . ?\e$A!H\e(B) | |
818 | (#x8de . ?\e$A!D\e(B) | |
819 | (#x8df . ?\e$A!E\e(B) | |
820 | (#x8ef . ?\e$B"_\e(B) | |
cf07d2bd | 821 | (#x8f6 . ?\e$,1!R\e(B) |
6b61353c KH |
822 | (#x8fb . ?\e$A!{\e(B) |
823 | (#x8fc . ?\e$A!|\e(B) | |
824 | (#x8fd . ?\e$A!z\e(B) | |
825 | (#x8fe . ?\e$A!}\e(B) | |
cf07d2bd | 826 | ;; Special |
6b61353c KH |
827 | (#x9e0 . ?\e$A!t\e(B) |
828 | (#x9e1 . ?\e$(C"F\e(B) | |
829 | (#x9e2 . ?\e$(GB*\e(B) | |
830 | (#x9e3 . ?\e$(GB-\e(B) | |
831 | (#x9e4 . ?\e$(GB.\e(B) | |
832 | (#x9e5 . ?\e$(GB+\e(B) | |
cf07d2bd | 833 | (#x9e8 . ?\e$,1}d\e(B) |
6b61353c KH |
834 | (#x9e9 . ?\e$(GB,\e(B) |
835 | (#x9ea . ?\e$A)<\e(B) | |
836 | (#x9eb . ?\e$A)4\e(B) | |
837 | (#x9ec . ?\e$A)0\e(B) | |
838 | (#x9ed . ?\e$A)8\e(B) | |
839 | (#x9ee . ?\e$A)`\e(B) | |
cf07d2bd DL |
840 | (#x9ef . ?\e$,1|Z\e(B) |
841 | (#x9f0 . ?\e$,1|[\e(B) | |
6b61353c | 842 | (#x9f1 . ?\e$A)$\e(B) |
cf07d2bd DL |
843 | (#x9f2 . ?\e$,1|\\e(B) |
844 | (#x9f3 . ?\e$,1|]\e(B) | |
6b61353c KH |
845 | (#x9f4 . ?\e$A)@\e(B) |
846 | (#x9f5 . ?\e$A)H\e(B) | |
847 | (#x9f6 . ?\e$A)X\e(B) | |
848 | (#x9f7 . ?\e$A)P\e(B) | |
849 | (#x9f8 . ?\e$A)&\e(B) | |
cf07d2bd DL |
850 | ;; Publishing |
851 | (#xaa1 . ?\e$,1rc\e(B) | |
852 | (#xaa2 . ?\e$,1rb\e(B) | |
853 | (#xaa3 . ?\e$,1rd\e(B) | |
854 | (#xaa4 . ?\e$,1re\e(B) | |
855 | (#xaa5 . ?\e$,1rg\e(B) | |
856 | (#xaa6 . ?\e$,1rh\e(B) | |
857 | (#xaa7 . ?\e$,1ri\e(B) | |
858 | (#xaa8 . ?\e$,1rj\e(B) | |
6b61353c KH |
859 | (#xaa9 . ?\e$(G!7\e(B) |
860 | (#xaaa . ?\e$(G!9\e(B) | |
861 | (#xaae . ?\e$A!-\e(B) | |
862 | (#xaaf . ?\e$(G!-\e(B) | |
863 | (#xab0 . ?\e$(O'x\e(B) | |
864 | (#xab1 . ?\e$(O'y\e(B) | |
865 | (#xab2 . ?\e$(O'z\e(B) | |
cf07d2bd DL |
866 | (#xab3 . ?\e$,1v6\e(B) |
867 | (#xab4 . ?\e$,1v7\e(B) | |
868 | (#xab5 . ?\e$,1v8\e(B) | |
869 | (#xab6 . ?\e$,1v9\e(B) | |
870 | (#xab7 . ?\e$,1v:\e(B) | |
6b61353c | 871 | (#xab8 . ?\e$(G""\e(B) |
cf07d2bd DL |
872 | (#xabb . ?\e$,1rr\e(B) |
873 | (#xabc . ?\e$,1{)\e(B) | |
874 | (#xabe . ?\e$,1{*\e(B) | |
6b61353c KH |
875 | (#xac3 . ?\e$(C({\e(B) |
876 | (#xac4 . ?\e$(C(|\e(B) | |
877 | (#xac5 . ?\e$(C(}\e(B) | |
878 | (#xac6 . ?\e$(C(~\e(B) | |
879 | (#xac9 . ?\e$(D"o\e(B) | |
cf07d2bd | 880 | (#xaca . ?\e$,2"s\e(B) |
6b61353c KH |
881 | (#xacc . ?\e$(O##\e(B) |
882 | (#xacd . ?\e$(O#!\e(B) | |
883 | (#xace . ?\e$A!p\e(B) | |
cf07d2bd | 884 | (#xacf . ?\e$,2!o\e(B) |
6b61353c KH |
885 | (#xad0 . ?\e,F!\e(B) |
886 | (#xad1 . ?\e,F"\e(B) | |
887 | (#xad2 . ?\e,Y4\e(B) | |
888 | (#xad3 . ?\e,Y!\e(B) | |
cf07d2bd | 889 | (#xad4 . ?\e$,1u^\e(B) |
6b61353c KH |
890 | (#xad6 . ?\e$A!d\e(B) |
891 | (#xad7 . ?\e$A!e\e(B) | |
cf07d2bd DL |
892 | (#xad9 . ?\e$,2%]\e(B) |
893 | (#xadb . ?\e$,2!l\e(B) | |
6b61353c KH |
894 | (#xadc . ?\e$(O#$\e(B) |
895 | (#xadd . ?\e$(O#"\e(B) | |
896 | (#xade . ?\e$A!q\e(B) | |
cf07d2bd | 897 | (#xadf . ?\e$,2!n\e(B) |
6b61353c | 898 | (#xae0 . ?\e$(O#?\e(B) |
cf07d2bd DL |
899 | (#xae1 . ?\e$,2!k\e(B) |
900 | (#xae2 . ?\e$,2!m\e(B) | |
6b61353c KH |
901 | (#xae3 . ?\e$A!w\e(B) |
902 | (#xae4 . ?\e$(G!}\e(B) | |
903 | (#xae5 . ?\e$A!n\e(B) | |
904 | (#xae6 . ?\e$(O#@\e(B) | |
cf07d2bd | 905 | (#xae7 . ?\e$,2!j\e(B) |
6b61353c KH |
906 | (#xae8 . ?\e$A!x\e(B) |
907 | (#xae9 . ?\e$(G!~\e(B) | |
908 | (#xaea . ?\e$(C"P\e(B) | |
909 | (#xaeb . ?\e$(O-~\e(B) | |
910 | (#xaec . ?\e$(O&@\e(B) | |
911 | (#xaed . ?\e$(O&<\e(B) | |
912 | (#xaee . ?\e$(O&>\e(B) | |
cf07d2bd | 913 | (#xaf0 . ?\e$,2%`\e(B) |
6b61353c KH |
914 | (#xaf1 . ?\e$B"w\e(B) |
915 | (#xaf2 . ?\e$B"x\e(B) | |
916 | (#xaf3 . ?\e$(O'{\e(B) | |
cf07d2bd | 917 | (#xaf4 . ?\e$,2%W\e(B) |
6b61353c KH |
918 | (#xaf5 . ?\e$B"t\e(B) |
919 | (#xaf6 . ?\e$B"u\e(B) | |
920 | (#xaf7 . ?\e$A!a\e(B) | |
921 | (#xaf8 . ?\e$A!b\e(B) | |
922 | (#xaf9 . ?\e$(O&g\e(B) | |
cf07d2bd DL |
923 | (#xafa . ?\e$,1zu\e(B) |
924 | (#xafb . ?\e$,1uW\e(B) | |
925 | (#xafc . ?\e$,1s8\e(B) | |
926 | (#xafd . ?\e$,1rz\e(B) | |
6b61353c | 927 | (#xafe . ?\e,Y%\e(B) |
cf07d2bd DL |
928 | ;; APL |
929 | (#xba3 . ?<) | |
930 | (#xba6 . ?>) | |
6b61353c KH |
931 | (#xba8 . ?\e$A!E\e(B) |
932 | (#xba9 . ?\e$A!D\e(B) | |
cf07d2bd | 933 | (#xbc0 . ?\e,A/\e(B) |
6b61353c KH |
934 | (#xbc2 . ?\e$A!M\e(B) |
935 | (#xbc3 . ?\e$A!I\e(B) | |
cf07d2bd DL |
936 | (#xbc4 . ?\e$,1zj\e(B) |
937 | (#xbc6 . ?_) | |
938 | (#xbca . ?\e$,1x8\e(B) | |
939 | (#xbcc . ?\e$,1|5\e(B) | |
940 | (#xbce . ?\e$,1yd\e(B) | |
6b61353c | 941 | (#xbcf . ?\e$A!p\e(B) |
cf07d2bd | 942 | (#xbd3 . ?\e$,1zh\e(B) |
6b61353c KH |
943 | (#xbd6 . ?\e$A!H\e(B) |
944 | (#xbd8 . ?\e$B"?\e(B) | |
945 | (#xbda . ?\e$B">\e(B) | |
cf07d2bd DL |
946 | (#xbdc . ?\e$,1yb\e(B) |
947 | (#xbfc . ?\e$,1yc\e(B) | |
948 | ;; Hebrew | |
949 | (#xcdf . ?\e,H_\e(B) | |
950 | (#xce0 . ?\e,H`\e(B) | |
951 | (#xce1 . ?\e,Ha\e(B) | |
952 | (#xce2 . ?\e,Hb\e(B) | |
953 | (#xce3 . ?\e,Hc\e(B) | |
954 | (#xce4 . ?\e,Hd\e(B) | |
955 | (#xce5 . ?\e,He\e(B) | |
956 | (#xce6 . ?\e,Hf\e(B) | |
957 | (#xce7 . ?\e,Hg\e(B) | |
958 | (#xce8 . ?\e,Hh\e(B) | |
959 | (#xce9 . ?\e,Hi\e(B) | |
960 | (#xcea . ?\e,Hj\e(B) | |
961 | (#xceb . ?\e,Hk\e(B) | |
962 | (#xcec . ?\e,Hl\e(B) | |
963 | (#xced . ?\e,Hm\e(B) | |
964 | (#xcee . ?\e,Hn\e(B) | |
965 | (#xcef . ?\e,Ho\e(B) | |
966 | (#xcf0 . ?\e,Hp\e(B) | |
967 | (#xcf1 . ?\e,Hq\e(B) | |
968 | (#xcf2 . ?\e,Hr\e(B) | |
969 | (#xcf3 . ?\e,Hs\e(B) | |
970 | (#xcf4 . ?\e,Ht\e(B) | |
971 | (#xcf5 . ?\e,Hu\e(B) | |
972 | (#xcf6 . ?\e,Hv\e(B) | |
973 | (#xcf7 . ?\e,Hw\e(B) | |
974 | (#xcf8 . ?\e,Hx\e(B) | |
975 | (#xcf9 . ?\e,Hy\e(B) | |
976 | (#xcfa . ?\e,Hz\e(B) | |
977 | ;; Thai | |
978 | (#xda1 . ?\e,T!\e(B) | |
979 | (#xda2 . ?\e,T"\e(B) | |
980 | (#xda3 . ?\e,T#\e(B) | |
981 | (#xda4 . ?\e,T$\e(B) | |
982 | (#xda5 . ?\e,T%\e(B) | |
983 | (#xda6 . ?\e,T&\e(B) | |
984 | (#xda7 . ?\e,T'\e(B) | |
985 | (#xda8 . ?\e,T(\e(B) | |
986 | (#xda9 . ?\e,T)\e(B) | |
987 | (#xdaa . ?\e,T*\e(B) | |
988 | (#xdab . ?\e,T+\e(B) | |
989 | (#xdac . ?\e,T,\e(B) | |
990 | (#xdad . ?\e,T-\e(B) | |
991 | (#xdae . ?\e,T.\e(B) | |
992 | (#xdaf . ?\e,T/\e(B) | |
993 | (#xdb0 . ?\e,T0\e(B) | |
994 | (#xdb1 . ?\e,T1\e(B) | |
995 | (#xdb2 . ?\e,T2\e(B) | |
996 | (#xdb3 . ?\e,T3\e(B) | |
997 | (#xdb4 . ?\e,T4\e(B) | |
998 | (#xdb5 . ?\e,T5\e(B) | |
999 | (#xdb6 . ?\e,T6\e(B) | |
1000 | (#xdb7 . ?\e,T7\e(B) | |
1001 | (#xdb8 . ?\e,T8\e(B) | |
1002 | (#xdb9 . ?\e,T9\e(B) | |
1003 | (#xdba . ?\e,T:\e(B) | |
1004 | (#xdbb . ?\e,T;\e(B) | |
1005 | (#xdbc . ?\e,T<\e(B) | |
1006 | (#xdbd . ?\e,T=\e(B) | |
1007 | (#xdbe . ?\e,T>\e(B) | |
1008 | (#xdbf . ?\e,T?\e(B) | |
1009 | (#xdc0 . ?\e,T@\e(B) | |
1010 | (#xdc1 . ?\e,TA\e(B) | |
1011 | (#xdc2 . ?\e,TB\e(B) | |
1012 | (#xdc3 . ?\e,TC\e(B) | |
1013 | (#xdc4 . ?\e,TD\e(B) | |
1014 | (#xdc5 . ?\e,TE\e(B) | |
1015 | (#xdc6 . ?\e,TF\e(B) | |
1016 | (#xdc7 . ?\e,TG\e(B) | |
1017 | (#xdc8 . ?\e,TH\e(B) | |
1018 | (#xdc9 . ?\e,TI\e(B) | |
1019 | (#xdca . ?\e,TJ\e(B) | |
1020 | (#xdcb . ?\e,TK\e(B) | |
1021 | (#xdcc . ?\e,TL\e(B) | |
1022 | (#xdcd . ?\e,TM\e(B) | |
1023 | (#xdce . ?\e,TN\e(B) | |
1024 | (#xdcf . ?\e,TO\e(B) | |
1025 | (#xdd0 . ?\e,TP\e(B) | |
1026 | (#xdd1 . ?\e,TQ\e(B) | |
1027 | (#xdd2 . ?\e,TR\e(B) | |
1028 | (#xdd3 . ?\e,TS\e(B) | |
1029 | (#xdd4 . ?\e,TT\e(B) | |
1030 | (#xdd5 . ?\e,TU\e(B) | |
1031 | (#xdd6 . ?\e,TV\e(B) | |
1032 | (#xdd7 . ?\e,TW\e(B) | |
1033 | (#xdd8 . ?\e,TX\e(B) | |
1034 | (#xdd9 . ?\e,TY\e(B) | |
1035 | (#xdda . ?\e,TZ\e(B) | |
1036 | (#xddf . ?\e,T_\e(B) | |
1037 | (#xde0 . ?\e,T`\e(B) | |
1038 | (#xde1 . ?\e,Ta\e(B) | |
1039 | (#xde2 . ?\e,Tb\e(B) | |
1040 | (#xde3 . ?\e,Tc\e(B) | |
1041 | (#xde4 . ?\e,Td\e(B) | |
1042 | (#xde5 . ?\e,Te\e(B) | |
1043 | (#xde6 . ?\e,Tf\e(B) | |
1044 | (#xde7 . ?\e,Tg\e(B) | |
1045 | (#xde8 . ?\e,Th\e(B) | |
1046 | (#xde9 . ?\e,Ti\e(B) | |
1047 | (#xdea . ?\e,Tj\e(B) | |
1048 | (#xdeb . ?\e,Tk\e(B) | |
1049 | (#xdec . ?\e,Tl\e(B) | |
1050 | (#xded . ?\e,Tm\e(B) | |
1051 | (#xdf0 . ?\e,Tp\e(B) | |
1052 | (#xdf1 . ?\e,Tq\e(B) | |
1053 | (#xdf2 . ?\e,Tr\e(B) | |
1054 | (#xdf3 . ?\e,Ts\e(B) | |
1055 | (#xdf4 . ?\e,Tt\e(B) | |
1056 | (#xdf5 . ?\e,Tu\e(B) | |
1057 | (#xdf6 . ?\e,Tv\e(B) | |
1058 | (#xdf7 . ?\e,Tw\e(B) | |
1059 | (#xdf8 . ?\e,Tx\e(B) | |
1060 | (#xdf9 . ?\e,Ty\e(B) | |
1061 | ;; Korean | |
1062 | (#xea1 . ?\e$(C$!\e(B) | |
1063 | (#xea2 . ?\e$(C$"\e(B) | |
1064 | (#xea3 . ?\e$(C$#\e(B) | |
1065 | (#xea4 . ?\e$(C$$\e(B) | |
1066 | (#xea5 . ?\e$(C$%\e(B) | |
1067 | (#xea6 . ?\e$(C$&\e(B) | |
1068 | (#xea7 . ?\e$(C$'\e(B) | |
1069 | (#xea8 . ?\e$(C$(\e(B) | |
1070 | (#xea9 . ?\e$(C$)\e(B) | |
1071 | (#xeaa . ?\e$(C$*\e(B) | |
1072 | (#xeab . ?\e$(C$+\e(B) | |
1073 | (#xeac . ?\e$(C$,\e(B) | |
1074 | (#xead . ?\e$(C$-\e(B) | |
1075 | (#xeae . ?\e$(C$.\e(B) | |
1076 | (#xeaf . ?\e$(C$/\e(B) | |
1077 | (#xeb0 . ?\e$(C$0\e(B) | |
1078 | (#xeb1 . ?\e$(C$1\e(B) | |
1079 | (#xeb2 . ?\e$(C$2\e(B) | |
1080 | (#xeb3 . ?\e$(C$3\e(B) | |
1081 | (#xeb4 . ?\e$(C$4\e(B) | |
1082 | (#xeb5 . ?\e$(C$5\e(B) | |
1083 | (#xeb6 . ?\e$(C$6\e(B) | |
1084 | (#xeb7 . ?\e$(C$7\e(B) | |
1085 | (#xeb8 . ?\e$(C$8\e(B) | |
1086 | (#xeb9 . ?\e$(C$9\e(B) | |
1087 | (#xeba . ?\e$(C$:\e(B) | |
1088 | (#xebb . ?\e$(C$;\e(B) | |
1089 | (#xebc . ?\e$(C$<\e(B) | |
1090 | (#xebd . ?\e$(C$=\e(B) | |
1091 | (#xebe . ?\e$(C$>\e(B) | |
1092 | (#xebf . ?\e$(C$?\e(B) | |
1093 | (#xec0 . ?\e$(C$@\e(B) | |
1094 | (#xec1 . ?\e$(C$A\e(B) | |
1095 | (#xec2 . ?\e$(C$B\e(B) | |
1096 | (#xec3 . ?\e$(C$C\e(B) | |
1097 | (#xec4 . ?\e$(C$D\e(B) | |
1098 | (#xec5 . ?\e$(C$E\e(B) | |
1099 | (#xec6 . ?\e$(C$F\e(B) | |
1100 | (#xec7 . ?\e$(C$G\e(B) | |
1101 | (#xec8 . ?\e$(C$H\e(B) | |
1102 | (#xec9 . ?\e$(C$I\e(B) | |
1103 | (#xeca . ?\e$(C$J\e(B) | |
1104 | (#xecb . ?\e$(C$K\e(B) | |
1105 | (#xecc . ?\e$(C$L\e(B) | |
1106 | (#xecd . ?\e$(C$M\e(B) | |
1107 | (#xece . ?\e$(C$N\e(B) | |
1108 | (#xecf . ?\e$(C$O\e(B) | |
1109 | (#xed0 . ?\e$(C$P\e(B) | |
1110 | (#xed1 . ?\e$(C$Q\e(B) | |
1111 | (#xed2 . ?\e$(C$R\e(B) | |
1112 | (#xed3 . ?\e$(C$S\e(B) | |
1113 | (#xed4 . ?\e$,1LH\e(B) | |
1114 | (#xed5 . ?\e$,1LI\e(B) | |
1115 | (#xed6 . ?\e$,1LJ\e(B) | |
1116 | (#xed7 . ?\e$,1LK\e(B) | |
1117 | (#xed8 . ?\e$,1LL\e(B) | |
1118 | (#xed9 . ?\e$,1LM\e(B) | |
1119 | (#xeda . ?\e$,1LN\e(B) | |
1120 | (#xedb . ?\e$,1LO\e(B) | |
1121 | (#xedc . ?\e$,1LP\e(B) | |
1122 | (#xedd . ?\e$,1LQ\e(B) | |
1123 | (#xede . ?\e$,1LR\e(B) | |
1124 | (#xedf . ?\e$,1LS\e(B) | |
1125 | (#xee0 . ?\e$,1LT\e(B) | |
1126 | (#xee1 . ?\e$,1LU\e(B) | |
1127 | (#xee2 . ?\e$,1LV\e(B) | |
1128 | (#xee3 . ?\e$,1LW\e(B) | |
1129 | (#xee4 . ?\e$,1LX\e(B) | |
1130 | (#xee5 . ?\e$,1LY\e(B) | |
1131 | (#xee6 . ?\e$,1LZ\e(B) | |
1132 | (#xee7 . ?\e$,1L[\e(B) | |
1133 | (#xee8 . ?\e$,1L\\e(B) | |
1134 | (#xee9 . ?\e$,1L]\e(B) | |
1135 | (#xeea . ?\e$,1L^\e(B) | |
1136 | (#xeeb . ?\e$,1L_\e(B) | |
1137 | (#xeec . ?\e$,1L`\e(B) | |
1138 | (#xeed . ?\e$,1La\e(B) | |
1139 | (#xeee . ?\e$,1Lb\e(B) | |
1140 | (#xeef . ?\e$(C$]\e(B) | |
1141 | (#xef0 . ?\e$(C$a\e(B) | |
1142 | (#xef1 . ?\e$(C$h\e(B) | |
1143 | (#xef2 . ?\e$(C$o\e(B) | |
1144 | (#xef3 . ?\e$(C$q\e(B) | |
1145 | (#xef4 . ?\e$(C$t\e(B) | |
1146 | (#xef5 . ?\e$(C$v\e(B) | |
1147 | (#xef6 . ?\e$(C$}\e(B) | |
1148 | (#xef7 . ?\e$(C$~\e(B) | |
1149 | (#xef8 . ?\e$,1M+\e(B) | |
1150 | (#xef9 . ?\e$,1M0\e(B) | |
1151 | (#xefa . ?\e$,1M9\e(B) | |
1152 | (#xeff . ?\e$,1tI\e(B) | |
1153 | ;; Latin-5 | |
1154 | ;; Latin-6 | |
1155 | ;; Latin-7 | |
1156 | ;; Latin-8 | |
1157 | ;; Latin-9 | |
1158 | (#x13bc . ?\e,b<\e(B) | |
1159 | (#x13bd . ?\e,b=\e(B) | |
6b61353c | 1160 | (#x13be . ?\e,_/\e(B) |
cf07d2bd DL |
1161 | ;; Currency |
1162 | (#x20a0 . ?\e$,1t@\e(B) | |
1163 | (#x20a1 . ?\e$,1tA\e(B) | |
1164 | (#x20a2 . ?\e$,1tB\e(B) | |
1165 | (#x20a3 . ?\e$,1tC\e(B) | |
1166 | (#x20a4 . ?\e$,1tD\e(B) | |
1167 | (#x20a5 . ?\e$,1tE\e(B) | |
1168 | (#x20a6 . ?\e$,1tF\e(B) | |
1169 | (#x20a7 . ?\e$,1tG\e(B) | |
1170 | (#x20a8 . ?\e$,1tH\e(B) | |
1171 | (#x20aa . ?\e$,1tJ\e(B) | |
1172 | (#x20ab . ?\e$,1tK\e(B) | |
1173 | (#x20ac . ?\e,b$\e(B))) | |
1174 | (puthash (car pair) (cdr pair) x-keysym-table)) | |
1175 | ||
1176 | ;; The following keysym codes for graphics are listed in the document | |
1177 | ;; as not having unicodes available: | |
1178 | ||
1179 | ;; #x08b1 TOP LEFT SUMMATION Technical | |
1180 | ;; #x08b2 BOTTOM LEFT SUMMATION Technical | |
1181 | ;; #x08b3 TOP VERTICAL SUMMATION CONNECTOR Technical | |
1182 | ;; #x08b4 BOTTOM VERTICAL SUMMATION CONNECTOR Technical | |
1183 | ;; #x08b5 TOP RIGHT SUMMATION Technical | |
1184 | ;; #x08b6 BOTTOM RIGHT SUMMATION Technical | |
1185 | ;; #x08b7 RIGHT MIDDLE SUMMATION Technical | |
1186 | ;; #x0aac SIGNIFICANT BLANK SYMBOL Publish | |
1187 | ;; #x0abd DECIMAL POINT Publish | |
1188 | ;; #x0abf MARKER Publish | |
1189 | ;; #x0acb TRADEMARK SIGN IN CIRCLE Publish | |
1190 | ;; #x0ada HEXAGRAM Publish | |
1191 | ;; #x0aff CURSOR Publish | |
1192 | ;; #x0dde THAI MAIHANAKAT Thai | |
1193 | ||
2fb263f6 JB |
1194 | \f |
1195 | ;;;; Selections and cut buffers | |
67c86cfc | 1196 | |
1c7c774b SM |
1197 | ;; We keep track of the last text selected here, so we can check the |
1198 | ;; current selection against it, and avoid passing back our own text | |
1199 | ;; from x-cut-buffer-or-selection-value. We track all three | |
5a89f0a7 | 1200 | ;; separately in case another X application only sets one of them |
1c7c774b SM |
1201 | ;; (say the cut buffer) we aren't fooled by the PRIMARY or |
1202 | ;; CLIPBOARD selection staying the same. | |
ae10d597 PJ |
1203 | (defvar x-last-selected-text-clipboard nil |
1204 | "The value of the CLIPBOARD X selection last time we selected or | |
1205 | pasted text.") | |
089bc712 | 1206 | (defvar x-last-selected-text-primary nil |
ae10d597 PJ |
1207 | "The value of the PRIMARY X selection last time we selected or |
1208 | pasted text.") | |
089bc712 | 1209 | (defvar x-last-selected-text-cut nil |
eb5ad242 KH |
1210 | "The value of the X cut buffer last time we selected or pasted text. |
1211 | The actual text stored in the X cut buffer is what encoded from this value.") | |
1212 | (defvar x-last-selected-text-cut-encoded nil | |
1213 | "The value of the X cut buffer last time we selected or pasted text. | |
1214 | This is the actual text stored in the X cut buffer.") | |
8eee8101 JD |
1215 | (defvar x-last-cut-buffer-coding 'iso-latin-1 |
1216 | "The coding we last used to encode/decode the text from the X cut buffer") | |
daa37602 | 1217 | |
1c7c774b SM |
1218 | (defvar x-cut-buffer-max 20000 ; Note this value is overridden below. |
1219 | "Max number of characters to put in the cut buffer. | |
1220 | It is said that overlarge strings are slow to put into the cut buffer.") | |
2666a6a5 | 1221 | |
d14518d8 | 1222 | (defcustom x-select-enable-clipboard nil |
dc20df95 | 1223 | "Non-nil means cutting and pasting uses the clipboard. |
3077d1f6 EZ |
1224 | This is in addition to, but in preference to, the primary selection. |
1225 | ||
1226 | On MS-Windows, this is non-nil by default, since Windows does not | |
1227 | support other types of selections. \(The primary selection that is | |
1228 | set by Emacs is not accessible to other programs on Windows.\)" | |
d14518d8 DL |
1229 | :type 'boolean |
1230 | :group 'killing) | |
dc20df95 | 1231 | |
73fe9da0 RS |
1232 | (defcustom x-select-enable-primary t |
1233 | "Non-nil means cutting and pasting uses the primary selection." | |
1234 | :type 'boolean | |
1235 | :group 'killing) | |
1236 | ||
0e2f4e59 | 1237 | (defun x-select-text (text &optional push) |
3077d1f6 EZ |
1238 | "Select TEXT, a string, according to the window system. |
1239 | ||
1240 | On X, put TEXT in the primary X selection. For backward | |
1241 | compatibility with older X applications, set the value of X cut | |
1242 | buffer 0 as well, and if the optional argument PUSH is non-nil, | |
1243 | rotate the cut buffers. If `x-select-enable-clipboard' is | |
1244 | non-nil, copy the text to the X clipboard as well. | |
1245 | ||
1246 | On Windows, make TEXT the current selection. If | |
1247 | `x-select-enable-clipboard' is non-nil, copy the text to the | |
1248 | clipboard as well. The argument PUSH is ignored. | |
1249 | ||
1250 | On Nextstep, put TEXT in the pasteboard; PUSH is ignored." | |
c7e36bd9 SM |
1251 | ;; With multi-tty, this function may be called from a tty frame. |
1252 | (when (eq (framep (selected-frame)) 'x) | |
1253 | ;; Don't send the cut buffer too much text. | |
1254 | ;; It becomes slow, and if really big it causes errors. | |
1255 | (cond ((>= (length text) x-cut-buffer-max) | |
1256 | (x-set-cut-buffer "" push) | |
1257 | (setq x-last-selected-text-cut "" | |
1258 | x-last-selected-text-cut-encoded "")) | |
1259 | (t | |
1260 | (setq x-last-selected-text-cut text | |
1261 | x-last-cut-buffer-coding 'iso-latin-1 | |
1262 | x-last-selected-text-cut-encoded | |
1263 | ;; ICCCM says cut buffer always contain ISO-Latin-1 | |
1264 | (encode-coding-string text 'iso-latin-1)) | |
1265 | (x-set-cut-buffer x-last-selected-text-cut-encoded push))) | |
73fe9da0 RS |
1266 | (when x-select-enable-primary |
1267 | (x-set-selection 'PRIMARY text) | |
1268 | (setq x-last-selected-text-primary text)) | |
c7e36bd9 SM |
1269 | (when x-select-enable-clipboard |
1270 | (x-set-selection 'CLIPBOARD text) | |
1271 | (setq x-last-selected-text-clipboard text)))) | |
492878e4 | 1272 | |
c7d9df18 KH |
1273 | (defvar x-select-request-type nil |
1274 | "*Data type request for X selection. | |
0c861f59 | 1275 | The value is one of the following data types, a list of them, or nil: |
c7d9df18 KH |
1276 | `COMPOUND_TEXT', `UTF8_STRING', `STRING', `TEXT' |
1277 | ||
c7d9df18 KH |
1278 | If the value is one of the above symbols, try only the specified |
1279 | type. | |
1280 | ||
1281 | If the value is a list of them, try each of them in the specified | |
0c861f59 | 1282 | order until succeed. |
c7d9df18 | 1283 | |
0c861f59 KH |
1284 | The value nil is the same as this list: |
1285 | \(UTF8_STRING COMPOUND_TEXT STRING) | |
1286 | ") | |
c7d9df18 | 1287 | |
d8338794 | 1288 | ;; Get a selection value of type TYPE by calling x-get-selection with |
db9e401b | 1289 | ;; an appropriate DATA-TYPE argument decided by `x-select-request-type'. |
d8338794 KH |
1290 | ;; The return value is already decoded. If x-get-selection causes an |
1291 | ;; error, this function return nil. | |
1292 | ||
c7d9df18 | 1293 | (defun x-selection-value (type) |
0c861f59 KH |
1294 | (let ((request-type (or x-select-request-type |
1295 | '(UTF8_STRING COMPOUND_TEXT STRING))) | |
a03c851c KH |
1296 | text) |
1297 | (if (consp request-type) | |
1298 | (while (and request-type (not text)) | |
1299 | (condition-case nil | |
1300 | (setq text (x-get-selection type (car request-type))) | |
1301 | (error nil)) | |
1302 | (setq request-type (cdr request-type))) | |
1303 | (condition-case nil | |
1304 | (setq text (x-get-selection type request-type)) | |
1305 | (error nil))) | |
c7d9df18 KH |
1306 | (if text |
1307 | (remove-text-properties 0 (length text) '(foreign-selection nil) text)) | |
1308 | text)) | |
5fd6d89f | 1309 | |
1c7c774b SM |
1310 | ;; Return the value of the current X selection. |
1311 | ;; Consult the selection, and the cut buffer. Treat empty strings | |
1312 | ;; as if they were unset. | |
1313 | ;; If this function is called twice and finds the same text, | |
1314 | ;; it returns nil the second time. This is so that a single | |
1315 | ;; selection won't be added to the kill ring over and over. | |
492878e4 | 1316 | (defun x-cut-buffer-or-selection-value () |
c7e36bd9 SM |
1317 | ;; With multi-tty, this function may be called from a tty frame. |
1318 | (when (eq (framep (selected-frame)) 'x) | |
1319 | (let (clip-text primary-text cut-text) | |
1320 | (when x-select-enable-clipboard | |
1321 | (setq clip-text (x-selection-value 'CLIPBOARD)) | |
1322 | (if (string= clip-text "") (setq clip-text nil)) | |
1323 | ||
1324 | ;; Check the CLIPBOARD selection for 'newness', is it different | |
1325 | ;; from what we remebered them to be last time we did a | |
1326 | ;; cut/paste operation. | |
1327 | (setq clip-text | |
1328 | (cond ;; check clipboard | |
1329 | ((or (not clip-text) (string= clip-text "")) | |
1330 | (setq x-last-selected-text-clipboard nil)) | |
1331 | ((eq clip-text x-last-selected-text-clipboard) nil) | |
1332 | ((string= clip-text x-last-selected-text-clipboard) | |
1333 | ;; Record the newer string, | |
1334 | ;; so subsequent calls can use the `eq' test. | |
1335 | (setq x-last-selected-text-clipboard clip-text) | |
1336 | nil) | |
1337 | (t (setq x-last-selected-text-clipboard clip-text))))) | |
1338 | ||
73fe9da0 RS |
1339 | (when x-select-enable-primary |
1340 | (setq primary-text (x-selection-value 'PRIMARY)) | |
1341 | ;; Check the PRIMARY selection for 'newness', is it different | |
1342 | ;; from what we remebered them to be last time we did a | |
1343 | ;; cut/paste operation. | |
1344 | (setq primary-text | |
1345 | (cond ;; check primary selection | |
1346 | ((or (not primary-text) (string= primary-text "")) | |
1347 | (setq x-last-selected-text-primary nil)) | |
1348 | ((eq primary-text x-last-selected-text-primary) nil) | |
1349 | ((string= primary-text x-last-selected-text-primary) | |
1350 | ;; Record the newer string, | |
1351 | ;; so subsequent calls can use the `eq' test. | |
1352 | (setq x-last-selected-text-primary primary-text) | |
1353 | nil) | |
1354 | (t | |
1355 | (setq x-last-selected-text-primary primary-text))))) | |
c7e36bd9 SM |
1356 | |
1357 | (setq cut-text (x-get-cut-buffer 0)) | |
1358 | ||
1359 | ;; Check the x cut buffer for 'newness', is it different | |
ae10d597 PJ |
1360 | ;; from what we remebered them to be last time we did a |
1361 | ;; cut/paste operation. | |
c7e36bd9 SM |
1362 | (setq cut-text |
1363 | (let ((next-coding (or next-selection-coding-system 'iso-latin-1))) | |
1364 | (cond ;; check cut buffer | |
1365 | ((or (not cut-text) (string= cut-text "")) | |
1366 | (setq x-last-selected-text-cut nil)) | |
1367 | ;; This short cut doesn't work because x-get-cut-buffer | |
1368 | ;; always returns a newly created string. | |
1369 | ;; ((eq cut-text x-last-selected-text-cut) nil) | |
1370 | ((and (string= cut-text x-last-selected-text-cut-encoded) | |
1371 | (eq x-last-cut-buffer-coding next-coding)) | |
1372 | ;; See the comment above. No need of this recording. | |
1373 | ;; Record the newer string, | |
1374 | ;; so subsequent calls can use the `eq' test. | |
1375 | ;; (setq x-last-selected-text-cut cut-text) | |
1376 | nil) | |
1377 | (t | |
1378 | (setq x-last-selected-text-cut-encoded cut-text | |
1379 | x-last-cut-buffer-coding next-coding | |
1380 | x-last-selected-text-cut | |
1381 | ;; ICCCM says cut buffer always contain ISO-Latin-1, but | |
1382 | ;; use next-selection-coding-system if not nil. | |
1383 | (decode-coding-string | |
1384 | cut-text next-coding)))))) | |
1385 | ||
1386 | ;; As we have done one selection, clear this now. | |
1387 | (setq next-selection-coding-system nil) | |
1388 | ||
1389 | ;; At this point we have recorded the current values for the | |
1390 | ;; selection from clipboard (if we are supposed to) primary, | |
1391 | ;; and cut buffer. So return the first one that has changed | |
1392 | ;; (which is the first non-null one). | |
1393 | ;; | |
1394 | ;; NOTE: There will be cases where more than one of these has | |
1395 | ;; changed and the new values differ. This indicates that | |
1396 | ;; something like the following has happened since the last time | |
1397 | ;; we looked at the selections: Application X set all the | |
1398 | ;; selections, then Application Y set only one or two of them (say | |
1399 | ;; just the cut-buffer). In this case since we don't have | |
1400 | ;; timestamps there is no way to know what the 'correct' value to | |
1401 | ;; return is. The nice thing to do would be to tell the user we | |
1402 | ;; saw multiple possible selections and ask the user which was the | |
1403 | ;; one they wanted. | |
1404 | ;; This code is still a big improvement because now the user can | |
1405 | ;; futz with the current selection and get emacs to pay attention | |
1406 | ;; to the cut buffer again (previously as soon as clipboard or | |
1407 | ;; primary had been set the cut buffer would essentially never be | |
1408 | ;; checked again). | |
1409 | (or clip-text primary-text cut-text) | |
1410 | ))) | |
1411 | ||
1412 | ;; Arrange for the kill and yank functions to set and check the clipboard. | |
1413 | (setq interprogram-cut-function 'x-select-text) | |
1414 | (setq interprogram-paste-function 'x-cut-buffer-or-selection-value) | |
492878e4 | 1415 | |
2a36494c KL |
1416 | (defun x-clipboard-yank () |
1417 | "Insert the clipboard contents, or the last stretch of killed text." | |
3f87f67e | 1418 | (interactive "*") |
ef85512e | 1419 | (let ((clipboard-text (x-selection-value 'CLIPBOARD)) |
2a36494c KL |
1420 | (x-select-enable-clipboard t)) |
1421 | (if (and clipboard-text (> (length clipboard-text) 0)) | |
1422 | (kill-new clipboard-text)) | |
1423 | (yank))) | |
88046be2 | 1424 | |
aa360da1 GM |
1425 | (declare-function accelerate-menu "xmenu.c" (&optional frame) t) |
1426 | ||
12b6af5c | 1427 | (defun x-menu-bar-open (&optional frame) |
db9e401b | 1428 | "Open the menu bar if `menu-bar-mode' is on, otherwise call `tmm-menubar'." |
12b6af5c | 1429 | (interactive "i") |
e17ed9ad CY |
1430 | (if (and menu-bar-mode |
1431 | (fboundp 'accelerate-menu)) | |
1432 | (accelerate-menu frame) | |
12b6af5c | 1433 | (tmm-menubar))) |
553624bf | 1434 | |
2fb263f6 | 1435 | \f |
e9cda827 | 1436 | ;;; Window system initialization. |
84f1b454 | 1437 | |
3d80ef3f | 1438 | (defun x-win-suspend-error () |
54da3bdf CY |
1439 | ;; Don't allow suspending if any of the frames are X frames. |
1440 | (if (memq 'x (mapcar 'window-system (frame-list))) | |
1441 | (error "Cannot suspend Emacs while running under X"))) | |
c8c72d6b | 1442 | |
e9cda827 KL |
1443 | (defvar x-initialized nil |
1444 | "Non-nil if the X window system has been initialized.") | |
1445 | ||
aa360da1 GM |
1446 | (declare-function x-open-connection "xfns.c" |
1447 | (display &optional xrm-string must-succeed)) | |
1448 | (declare-function x-server-max-request-size "xfns.c" (&optional terminal)) | |
1449 | (declare-function x-get-resource "frame.c" | |
1450 | (attribute class &optional component subclass)) | |
f2d9c15f GM |
1451 | (declare-function x-parse-geometry "frame.c" (string)) |
1452 | (defvar x-resource-name) | |
1453 | (defvar x-display-name) | |
1454 | (defvar x-command-line-resources) | |
aa360da1 | 1455 | |
e9cda827 KL |
1456 | (defun x-initialize-window-system () |
1457 | "Initialize Emacs for X frames and open the first connection to an X server." | |
1458 | ;; Make sure we have a valid resource name. | |
1459 | (or (stringp x-resource-name) | |
1460 | (let (i) | |
1461 | (setq x-resource-name (invocation-name)) | |
1462 | ||
1463 | ;; Change any . or * characters in x-resource-name to hyphens, | |
1464 | ;; so as not to choke when we use it in X resource queries. | |
1465 | (while (setq i (string-match "[.*]" x-resource-name)) | |
1466 | (aset x-resource-name i ?-)))) | |
1467 | ||
1468 | (x-open-connection (or x-display-name | |
36ab8612 | 1469 | (setq x-display-name (or (getenv "DISPLAY" (selected-frame)) |
f105f403 | 1470 | (getenv "DISPLAY")))) |
e9cda827 KL |
1471 | x-command-line-resources |
1472 | ;; Exit Emacs with fatal error if this fails and we | |
1473 | ;; are the initial display. | |
1474 | (eq initial-window-system 'x)) | |
1475 | ||
1476 | (setq x-cut-buffer-max (min (- (/ (x-server-max-request-size) 2) 100) | |
1477 | x-cut-buffer-max)) | |
1478 | ||
2d4e20ec KH |
1479 | ;; Create the default fontset. |
1480 | (create-default-fontset) | |
e9cda827 KL |
1481 | |
1482 | ;; Create the standard fontset. | |
2d4e20ec KH |
1483 | (condition-case err |
1484 | (create-fontset-from-fontset-spec standard-fontset-spec t) | |
db9e401b | 1485 | (error (display-warning |
2d4e20ec KH |
1486 | 'initialization |
1487 | (format "Creation of the standard fontset failed: %s" err) | |
1488 | :error))) | |
e9cda827 KL |
1489 | |
1490 | ;; Create fontset specified in X resources "Fontset-N" (N is 0, 1, ...). | |
1491 | (create-fontset-from-x-resource) | |
1492 | ||
65e86587 KL |
1493 | ;; Set scroll bar mode to right if set by X resources. Default is left. |
1494 | (if (equal (x-get-resource "verticalScrollBars" "ScrollBars") "right") | |
1495 | (customize-set-variable 'scroll-bar-mode 'right)) | |
1496 | ||
e9cda827 KL |
1497 | ;; Apply a geometry resource to the initial frame. Put it at the end |
1498 | ;; of the alist, so that anything specified on the command line takes | |
1499 | ;; precedence. | |
1500 | (let* ((res-geometry (x-get-resource "geometry" "Geometry")) | |
1501 | parsed) | |
1502 | (if res-geometry | |
1503 | (progn | |
1504 | (setq parsed (x-parse-geometry res-geometry)) | |
1505 | ;; If the resource specifies a position, | |
1506 | ;; call the position and size "user-specified". | |
1507 | (if (or (assq 'top parsed) (assq 'left parsed)) | |
1508 | (setq parsed (cons '(user-position . t) | |
1509 | (cons '(user-size . t) parsed)))) | |
1510 | ;; All geometry parms apply to the initial frame. | |
1511 | (setq initial-frame-alist (append initial-frame-alist parsed)) | |
f6959eb4 | 1512 | ;; The size parms apply to all frames. Don't set it if there are |
14bcc1e0 KL |
1513 | ;; sizes there already (from command line). |
1514 | (if (and (assq 'height parsed) | |
1515 | (not (assq 'height default-frame-alist))) | |
e9cda827 KL |
1516 | (setq default-frame-alist |
1517 | (cons (cons 'height (cdr (assq 'height parsed))) | |
1518 | default-frame-alist))) | |
14bcc1e0 KL |
1519 | (if (and (assq 'width parsed) |
1520 | (not (assq 'width default-frame-alist))) | |
e9cda827 KL |
1521 | (setq default-frame-alist |
1522 | (cons (cons 'width (cdr (assq 'width parsed))) | |
1523 | default-frame-alist)))))) | |
1524 | ||
1525 | ;; Check the reverseVideo resource. | |
1526 | (let ((case-fold-search t)) | |
1527 | (let ((rv (x-get-resource "reverseVideo" "ReverseVideo"))) | |
1528 | (if (and rv | |
1529 | (string-match "^\\(true\\|yes\\|on\\)$" rv)) | |
1530 | (setq default-frame-alist | |
1531 | (cons '(reverse . t) default-frame-alist))))) | |
63c86e17 | 1532 | |
e9cda827 KL |
1533 | ;; Set x-selection-timeout, measured in milliseconds. |
1534 | (let ((res-selection-timeout | |
1535 | (x-get-resource "selectionTimeout" "SelectionTimeout"))) | |
1536 | (setq x-selection-timeout 20000) | |
1537 | (if res-selection-timeout | |
1538 | (setq x-selection-timeout (string-to-number res-selection-timeout)))) | |
5cdb3f1e | 1539 | |
0b0d3e0b | 1540 | ;; Don't let Emacs suspend under X. |
e9cda827 | 1541 | (add-hook 'suspend-hook 'x-win-suspend-error) |
53631723 | 1542 | |
b04f3e61 CY |
1543 | ;; During initialization, we defer sending size hints to the window |
1544 | ;; manager, because that can induce a race condition: | |
1545 | ;; http://lists.gnu.org/archive/html/emacs-devel/2008-10/msg00033.html | |
1546 | ;; Send the size hints once initialization is done. | |
1547 | (add-hook 'after-init-hook 'x-wm-set-size-hint) | |
1548 | ||
e9cda827 KL |
1549 | ;; Turn off window-splitting optimization; X is usually fast enough |
1550 | ;; that this is only annoying. | |
1551 | (setq split-window-keep-point t) | |
c3ef5084 | 1552 | |
e9cda827 KL |
1553 | ;; Motif direct handling of f10 wasn't working right, |
1554 | ;; So temporarily we've turned it off in lwlib-Xm.c | |
1555 | ;; and turned the Emacs f10 back on. | |
1556 | ;; ;; Motif normally handles f10 itself, so don't try to handle it a second time. | |
1557 | ;; (if (featurep 'motif) | |
1558 | ;; (global-set-key [f10] 'ignore)) | |
9541a441 | 1559 | |
2a36494c KL |
1560 | ;; Enable CLIPBOARD copy/paste through menu bar commands. |
1561 | (menu-bar-enable-clipboard) | |
6b61353c | 1562 | |
2a36494c KL |
1563 | ;; Override Paste so it looks at CLIPBOARD first. |
1564 | (define-key menu-bar-edit-menu [paste] | |
5665a02f KL |
1565 | (append '(menu-item "Paste" x-clipboard-yank |
1566 | :enable (not buffer-read-only) | |
1567 | :help "Paste (yank) text most recently cut/copied") | |
1568 | nil)) | |
6b61353c | 1569 | |
e9cda827 | 1570 | (setq x-initialized t)) |
c3ef5084 | 1571 | |
e9cda827 KL |
1572 | (add-to-list 'handle-args-function-alist '(x . x-handle-args)) |
1573 | (add-to-list 'frame-creation-function-alist '(x . x-create-frame-with-faces)) | |
1574 | (add-to-list 'window-system-initialization-alist '(x . x-initialize-window-system)) | |
6b61353c KH |
1575 | |
1576 | ;; Initiate drag and drop | |
1577 | (add-hook 'after-make-frame-functions 'x-dnd-init-frame) | |
c0acb3ee | 1578 | (define-key special-event-map [drag-n-drop] 'x-dnd-handle-drag-n-drop-event) |
6b61353c | 1579 | |
dd314751 | 1580 | (defcustom x-gtk-stock-map |
6bdad9ae DN |
1581 | (mapcar (lambda (arg) |
1582 | (cons (purecopy (car arg)) (purecopy (cdr arg)))) | |
dd314751 | 1583 | '( |
5cb94d12 JD |
1584 | ("etc/images/new" . "gtk-new") |
1585 | ("etc/images/open" . "gtk-open") | |
5db55b9e | 1586 | ("etc/images/diropen" . "n:system-file-manager") |
5cb94d12 JD |
1587 | ("etc/images/close" . "gtk-close") |
1588 | ("etc/images/save" . "gtk-save") | |
1589 | ("etc/images/saveas" . "gtk-save-as") | |
1590 | ("etc/images/undo" . "gtk-undo") | |
1591 | ("etc/images/cut" . "gtk-cut") | |
1592 | ("etc/images/copy" . "gtk-copy") | |
1593 | ("etc/images/paste" . "gtk-paste") | |
1594 | ("etc/images/search" . "gtk-find") | |
1595 | ("etc/images/print" . "gtk-print") | |
1596 | ("etc/images/preferences" . "gtk-preferences") | |
1597 | ("etc/images/help" . "gtk-help") | |
1598 | ("etc/images/left-arrow" . "gtk-go-back") | |
1599 | ("etc/images/right-arrow" . "gtk-go-forward") | |
1600 | ("etc/images/home" . "gtk-home") | |
1601 | ("etc/images/jump-to" . "gtk-jump-to") | |
1602 | ("etc/images/index" . "gtk-index") | |
1603 | ("etc/images/search" . "gtk-find") | |
2e55c986 | 1604 | ("etc/images/exit" . "gtk-quit") |
c96a0d64 | 1605 | ("etc/images/cancel" . "gtk-cancel") |
418fddf5 | 1606 | ("etc/images/info" . "gtk-info") |
bdc398a9 | 1607 | ("etc/images/bookmark_add" . "n:bookmark_add") |
2e55c986 | 1608 | ;; Used in Gnus and/or MH-E: |
c96a0d64 JD |
1609 | ("etc/images/attach" . "gtk-attach") |
1610 | ("etc/images/connect" . "gtk-connect") | |
1611 | ("etc/images/contact" . "gtk-contact") | |
1612 | ("etc/images/delete" . "gtk-delete") | |
1613 | ("etc/images/describe" . "gtk-properties") | |
1614 | ("etc/images/disconnect" . "gtk-disconnect") | |
1615 | ;; ("etc/images/exit" . "gtk-exit") | |
1616 | ("etc/images/lock-broken" . "gtk-lock_broken") | |
1617 | ("etc/images/lock-ok" . "gtk-lock_ok") | |
1618 | ("etc/images/lock" . "gtk-lock") | |
1619 | ("etc/images/next-page" . "gtk-next-page") | |
1620 | ("etc/images/refresh" . "gtk-refresh") | |
1621 | ("etc/images/sort-ascending" . "gtk-sort-ascending") | |
1622 | ("etc/images/sort-column-ascending" . "gtk-sort-column-ascending") | |
1623 | ("etc/images/sort-criteria" . "gtk-sort-criteria") | |
1624 | ("etc/images/sort-descending" . "gtk-sort-descending") | |
1625 | ("etc/images/sort-row-ascending" . "gtk-sort-row-ascending") | |
1626 | ("images/gnus/toggle-subscription" . "gtk-task-recurring") | |
1627 | ("images/mail/compose" . "gtk-mail-compose") | |
1628 | ("images/mail/copy" . "gtk-mail-copy") | |
1629 | ("images/mail/forward" . "gtk-mail-forward") | |
1630 | ("images/mail/inbox" . "gtk-inbox") | |
1631 | ("images/mail/move" . "gtk-mail-move") | |
1632 | ("images/mail/not-spam" . "gtk-not-spam") | |
1633 | ("images/mail/outbox" . "gtk-outbox") | |
1634 | ("images/mail/reply-all" . "gtk-mail-reply-to-all") | |
1635 | ("images/mail/reply" . "gtk-mail-reply") | |
1636 | ("images/mail/save-draft" . "gtk-mail-handling") | |
1637 | ("images/mail/send" . "gtk-mail-send") | |
1638 | ("images/mail/spam" . "gtk-spam") | |
7ee6c59b NR |
1639 | ;; Used for GDB Graphical Interface |
1640 | ("images/gud/break" . "gtk-no") | |
1641 | ("images/gud/recstart" . "gtk-media-record") | |
1642 | ("images/gud/recstop" . "gtk-media-stop") | |
2e55c986 | 1643 | ;; No themed versions available: |
c96a0d64 JD |
1644 | ;; mail/preview (combining stock_mail and stock_zoom) |
1645 | ;; mail/save (combining stock_mail, stock_save and stock_convert) | |
6bdad9ae | 1646 | )) |
dd314751 | 1647 | "How icons for tool bars are mapped to Gtk+ stock items. |
5db55b9e JD |
1648 | Emacs must be compiled with the Gtk+ toolkit for this to have any effect. |
1649 | A value that begins with n: denotes a named icon instead of a stock icon." | |
7fbe8079 | 1650 | :version "22.2" |
2e55c986 RS |
1651 | :type '(choice (repeat (choice symbol |
1652 | (cons (string :tag "Emacs icon") | |
1653 | (string :tag "Stock/named"))))) | |
dd314751 JD |
1654 | :group 'x) |
1655 | ||
2e55c986 | 1656 | (defcustom icon-map-list '(x-gtk-stock-map) |
db9e401b | 1657 | "A list of alists that map icon file names to stock/named icons. |
5db55b9e JD |
1658 | The alists are searched in the order they appear. The first match is used. |
1659 | The keys in the alists are file names without extension and with two directory | |
1660 | components. For example, to map /usr/share/emacs/22.1.1/etc/images/open.xpm | |
1661 | to stock item gtk-open, use: | |
1662 | ||
1663 | (\"etc/images/open\" . \"gtk-open\") | |
1664 | ||
1665 | Themes also have named icons. To map to one of those, use n: before the name: | |
1666 | ||
1667 | (\"etc/images/diropen\" . \"n:system-file-manager\") | |
1668 | ||
2e55c986 RS |
1669 | The list elements are either the symbol name for the alist or the |
1670 | alist itself. | |
1671 | ||
1672 | If you don't want stock icons, set the variable to nil." | |
1673 | :version "22.2" | |
1674 | :type '(choice (const :tag "Don't use stock icons" nil) | |
1675 | (repeat (choice symbol | |
1676 | (cons (string :tag "Emacs icon") | |
1677 | (string :tag "Stock/named"))))) | |
1678 | :group 'x) | |
5db55b9e | 1679 | |
2543eb39 CY |
1680 | (defconst x-gtk-stock-cache (make-hash-table :weakness t :test 'equal)) |
1681 | ||
dd314751 | 1682 | (defun x-gtk-map-stock (file) |
2543eb39 CY |
1683 | "Map icon with file name FILE to a Gtk+ stock name. |
1684 | This uses `icon-map-list' to map icon file names to stock icon names." | |
1685 | (when (stringp file) | |
1686 | (or (gethash file x-gtk-stock-cache) | |
1687 | (puthash | |
1688 | file | |
1689 | (save-match-data | |
1690 | (let* ((file-sans (file-name-sans-extension file)) | |
1691 | (key (and (string-match "/\\([^/]+/[^/]+/[^/]+$\\)" | |
1692 | file-sans) | |
1693 | (match-string 1 file-sans))) | |
1694 | (icon-map icon-map-list) | |
1695 | elem value) | |
1696 | (while (and (null value) icon-map) | |
1697 | (setq elem (car icon-map) | |
1698 | value (assoc-string (or key file-sans) | |
1699 | (if (symbolp elem) | |
1700 | (symbol-value elem) | |
1701 | elem)) | |
1702 | icon-map (cdr icon-map))) | |
1703 | (and value (cdr value)))) | |
1704 | x-gtk-stock-cache)))) | |
dd314751 | 1705 | |
7c1bfecc | 1706 | (provide 'x-win) |
e380957e | 1707 | |
1c7c774b | 1708 | ;; arch-tag: f1501302-db8b-4d95-88e3-116697d89f78 |
5cdb3f1e | 1709 | ;;; x-win.el ends here |