1 ;;; mac-win.el --- parse switches controlling interface with Mac window system -*-coding: iso-2022-7bit;-*-
3 ;; Copyright (C) 1999, 2000, 2002, 2003, 2004,
4 ;; 2005, 2006 Free Software Foundation, Inc.
6 ;; Author: Andrew Choi <akochoi@mac.com>
9 ;; This file is part of GNU Emacs.
11 ;; GNU Emacs is free software; you can redistribute it and/or modify
12 ;; it under the terms of the GNU General Public License as published by
13 ;; the Free Software Foundation; either version 2, or (at your option)
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.
21 ;; You should have received a copy of the GNU General Public License
22 ;; along with GNU Emacs; see the file COPYING. If not, write to the
23 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
24 ;; Boston, MA 02110-1301, USA.
28 ;; Mac-win.el: this file is loaded from ../lisp/startup.el when it recognizes
29 ;; that Mac windows are to be used. Command line switches are parsed and those
30 ;; pertaining to Mac are processed and removed from the command line. The
31 ;; Mac display is opened and hooks are set for popping up the initial window.
33 ;; startup.el will then examine startup files, and eventually call the hooks
34 ;; which create the first window(s).
38 ;; These are the standard X switches from the Xt Initialize.c file of
41 ;; Command line Resource Manager string
44 ;; +synchronous *synchronous
45 ;; -background *background
48 ;; -bordercolor *borderColor
49 ;; -borderwidth .borderWidth
55 ;; -foreground *foreground
56 ;; -geometry .geometry
59 ;; -reverse *reverseVideo
61 ;; -selectionTimeout .selectionTimeout
62 ;; -synchronous *synchronous
65 ;; An alist of X options and the function which handles them. See
68 (if (not (eq window-system 'mac))
69 (error "%s: Loading mac-win.el but not compiled for Mac" (invocation-name)))
79 (eval-when-compile (require 'url))
81 (defvar mac-charset-info-alist)
82 (defvar mac-service-selection)
83 (defvar mac-system-script-code)
84 (defvar mac-apple-event-map)
85 (defvar mac-atsu-font-table)
86 (defvar mac-font-panel-mode)
87 (defvar mac-ts-active-input-overlay)
88 (defvar x-invocation-args)
90 (defvar x-command-line-resources nil)
92 ;; Handler for switches of the form "-switch value" or "-switch".
93 (defun x-handle-switch (switch)
94 (let ((aelt (assoc switch command-line-x-option-alist)))
96 (let ((param (nth 3 aelt))
99 (setq default-frame-alist
100 (cons (cons param value)
101 default-frame-alist))
102 (setq default-frame-alist
104 (car x-invocation-args))
106 x-invocation-args (cdr x-invocation-args)))))))
108 ;; Handler for switches of the form "-switch n"
109 (defun x-handle-numeric-switch (switch)
110 (let ((aelt (assoc switch command-line-x-option-alist)))
112 (let ((param (nth 3 aelt)))
113 (setq default-frame-alist
115 (string-to-number (car x-invocation-args)))
118 (cdr x-invocation-args))))))
120 ;; Handle options that apply to initial frame only
121 (defun x-handle-initial-switch (switch)
122 (let ((aelt (assoc switch command-line-x-option-alist)))
124 (let ((param (nth 3 aelt))
125 (value (nth 4 aelt)))
127 (setq initial-frame-alist
128 (cons (cons param value)
129 initial-frame-alist))
130 (setq initial-frame-alist
132 (car x-invocation-args))
134 x-invocation-args (cdr x-invocation-args)))))))
136 ;; Make -iconic apply only to the initial frame!
137 (defun x-handle-iconic (switch)
138 (setq initial-frame-alist
139 (cons '(visibility . icon) initial-frame-alist)))
141 ;; Handle the -xrm option.
142 (defun x-handle-xrm-switch (switch)
143 (unless (consp x-invocation-args)
144 (error "%s: missing argument to `%s' option" (invocation-name) switch))
145 (setq x-command-line-resources
146 (if (null x-command-line-resources)
147 (car x-invocation-args)
148 (concat x-command-line-resources "\n" (car x-invocation-args))))
149 (setq x-invocation-args (cdr x-invocation-args)))
151 ;; Handle the geometry option
152 (defun x-handle-geometry (switch)
153 (let* ((geo (x-parse-geometry (car x-invocation-args)))
154 (left (assq 'left geo))
155 (top (assq 'top geo))
156 (height (assq 'height geo))
157 (width (assq 'width geo)))
158 (if (or height width)
159 (setq default-frame-alist
160 (append default-frame-alist
162 (if height (list height))
163 (if width (list width)))
165 (append initial-frame-alist
167 (if height (list height))
168 (if width (list width)))))
170 (setq initial-frame-alist
171 (append initial-frame-alist
172 '((user-position . t))
173 (if left (list left))
174 (if top (list top)))))
175 (setq x-invocation-args (cdr x-invocation-args))))
177 ;; Handle the -name option. Set the variable x-resource-name
178 ;; to the option's operand; set the name of
179 ;; the initial frame, too.
180 (defun x-handle-name-switch (switch)
181 (or (consp x-invocation-args)
182 (error "%s: missing argument to `%s' option" (invocation-name) switch))
183 (setq x-resource-name (car x-invocation-args)
184 x-invocation-args (cdr x-invocation-args))
185 (setq initial-frame-alist (cons (cons 'name x-resource-name)
186 initial-frame-alist)))
188 (defvar x-display-name nil
189 "The display name specifying server and frame.")
191 (defun x-handle-display (switch)
192 (setq x-display-name (car x-invocation-args)
193 x-invocation-args (cdr x-invocation-args)))
195 (defun x-handle-args (args)
196 "Process the X-related command line options in ARGS.
197 This is done before the user's startup file is loaded. They are copied to
198 `x-invocation-args', from which the X-related things are extracted, first
199 the switch (e.g., \"-fg\") in the following code, and possible values
200 \(e.g., \"black\") in the option handler code (e.g., x-handle-switch).
201 This function returns ARGS minus the arguments that have been processed."
202 ;; We use ARGS to accumulate the args that we don't handle here, to return.
203 (setq x-invocation-args args
205 (while (and x-invocation-args
206 (not (equal (car x-invocation-args) "--")))
207 (let* ((this-switch (car x-invocation-args))
208 (orig-this-switch this-switch)
209 completion argval aelt handler)
210 (setq x-invocation-args (cdr x-invocation-args))
211 ;; Check for long options with attached arguments
212 ;; and separate out the attached option argument into argval.
213 (if (string-match "^--[^=]*=" this-switch)
214 (setq argval (substring this-switch (match-end 0))
215 this-switch (substring this-switch 0 (1- (match-end 0)))))
216 ;; Complete names of long options.
217 (if (string-match "^--" this-switch)
219 (setq completion (try-completion this-switch command-line-x-option-alist))
220 (if (eq completion t)
221 ;; Exact match for long option.
223 (if (stringp completion)
224 (let ((elt (assoc completion command-line-x-option-alist)))
225 ;; Check for abbreviated long option.
227 (error "Option `%s' is ambiguous" this-switch))
228 (setq this-switch completion))))))
229 (setq aelt (assoc this-switch command-line-x-option-alist))
230 (if aelt (setq handler (nth 2 aelt)))
233 (let ((x-invocation-args
234 (cons argval x-invocation-args)))
235 (funcall handler this-switch))
236 (funcall handler this-switch))
237 (setq args (cons orig-this-switch args)))))
238 (nconc (nreverse args) x-invocation-args))
242 ;; Standard Mac cursor shapes
245 (defconst mac-pointer-arrow 0)
246 (defconst mac-pointer-copy-arrow 1)
247 (defconst mac-pointer-alias-arrow 2)
248 (defconst mac-pointer-contextual-menu-arrow 3)
249 (defconst mac-pointer-I-beam 4)
250 (defconst mac-pointer-cross 5)
251 (defconst mac-pointer-plus 6)
252 (defconst mac-pointer-watch 7)
253 (defconst mac-pointer-closed-hand 8)
254 (defconst mac-pointer-open-hand 9)
255 (defconst mac-pointer-pointing-hand 10)
256 (defconst mac-pointer-counting-up-hand 11)
257 (defconst mac-pointer-counting-down-hand 12)
258 (defconst mac-pointer-counting-up-and-down-hand 13)
259 (defconst mac-pointer-spinning 14)
260 (defconst mac-pointer-resize-left 15)
261 (defconst mac-pointer-resize-right 16)
262 (defconst mac-pointer-resize-left-right 17)
263 ;; Mac OS X 10.2 and later
264 (defconst mac-pointer-not-allowed 18)
265 ;; Mac OS X 10.3 and later
266 (defconst mac-pointer-resize-up 19)
267 (defconst mac-pointer-resize-down 20)
268 (defconst mac-pointer-resize-up-down 21)
269 (defconst mac-pointer-poof 22)
272 ;; Standard X cursor shapes that have Mac counterparts
275 (defconst x-pointer-left-ptr mac-pointer-arrow)
276 (defconst x-pointer-xterm mac-pointer-I-beam)
277 (defconst x-pointer-crosshair mac-pointer-cross)
278 (defconst x-pointer-plus mac-pointer-plus)
279 (defconst x-pointer-watch mac-pointer-watch)
280 (defconst x-pointer-hand2 mac-pointer-pointing-hand)
281 (defconst x-pointer-left-side mac-pointer-resize-left)
282 (defconst x-pointer-right-side mac-pointer-resize-right)
283 (defconst x-pointer-sb-h-double-arrow mac-pointer-resize-left-right)
284 (defconst x-pointer-top-side mac-pointer-resize-up)
285 (defconst x-pointer-bottom-side mac-pointer-resize-down)
286 (defconst x-pointer-sb-v-double-arrow mac-pointer-resize-up-down)
293 (defvar x-colors '("LightGreen"
892 "LightGoldenrodYellow"
893 "light goldenrod yellow"
910 "medium spring green"
1045 "The list of X colors from the `rgb.txt' file.
1046 XConsortium: rgb.txt,v 10.41 94/02/20 18:39:36 rws Exp")
1048 (defun xw-defined-colors (&optional frame)
1049 "Internal function called by `defined-colors', which see."
1050 (or frame (setq frame (selected-frame)))
1051 (let ((all-colors x-colors)
1053 (defined-colors nil))
1055 (setq this-color (car all-colors)
1056 all-colors (cdr all-colors))
1057 (and (color-supported-p this-color frame t)
1058 (setq defined-colors (cons this-color defined-colors))))
1063 (substitute-key-definition 'suspend-emacs 'iconify-or-deiconify-frame
1066 ;; Map certain keypad keys into ASCII characters
1067 ;; that people usually expect.
1068 (define-key function-key-map [backspace] [?\d])
1069 (define-key function-key-map [delete] [?\d])
1070 (define-key function-key-map [tab] [?\t])
1071 (define-key function-key-map [linefeed] [?\n])
1072 (define-key function-key-map [clear] [?\C-l])
1073 (define-key function-key-map [return] [?\C-m])
1074 (define-key function-key-map [escape] [?\e])
1075 (define-key function-key-map [M-backspace] [?\M-\d])
1076 (define-key function-key-map [M-delete] [?\M-\d])
1077 (define-key function-key-map [M-tab] [?\M-\t])
1078 (define-key function-key-map [M-linefeed] [?\M-\n])
1079 (define-key function-key-map [M-clear] [?\M-\C-l])
1080 (define-key function-key-map [M-return] [?\M-\C-m])
1081 (define-key function-key-map [M-escape] [?\M-\e])
1083 ;; These tell read-char how to convert
1084 ;; these special chars to ASCII.
1085 (put 'backspace 'ascii-character ?\d)
1086 (put 'delete 'ascii-character ?\d)
1087 (put 'tab 'ascii-character ?\t)
1088 (put 'linefeed 'ascii-character ?\n)
1089 (put 'clear 'ascii-character ?\C-l)
1090 (put 'return 'ascii-character ?\C-m)
1091 (put 'escape 'ascii-character ?\e)
1093 ;; Modifier name `ctrl' is an alias of `control'.
1094 (put 'ctrl 'modifier-value (get 'control 'modifier-value))
1097 ;;;; Script codes and coding systems
1098 (defconst mac-script-code-coding-systems
1099 '((0 . mac-roman) ; smRoman
1100 (1 . japanese-shift-jis) ; smJapanese
1101 (2 . chinese-big5) ; smTradChinese
1102 (3 . korean-iso-8bit) ; smKorean
1103 (7 . mac-cyrillic) ; smCyrillic
1104 (25 . chinese-iso-8bit) ; smSimpChinese
1105 (29 . mac-centraleurroman) ; smCentralEuroRoman
1107 "Alist of Mac script codes vs Emacs coding systems.")
1109 (defun mac-add-charset-info (xlfd-charset mac-text-encoding)
1110 "Add a character set to display with Mac fonts.
1111 Create an entry in `mac-charset-info-alist'.
1112 XLFD-CHARSET is a string which will appear in the XLFD font name
1113 to identify the character set. MAC-TEXT-ENCODING is the
1114 correspoinding TextEncodingBase value."
1115 (add-to-list 'mac-charset-info-alist
1116 (list xlfd-charset mac-text-encoding
1117 (cdr (assq mac-text-encoding
1118 mac-script-code-coding-systems)))))
1120 (setq mac-charset-info-alist nil)
1121 (mac-add-charset-info "mac-roman" 0)
1122 (mac-add-charset-info "jisx0208.1983-sjis" 1)
1123 (mac-add-charset-info "jisx0201.1976-0" 1)
1124 (mac-add-charset-info "big5-0" 2)
1125 (mac-add-charset-info "ksc5601.1989-0" 3)
1126 (mac-add-charset-info "mac-cyrillic" 7)
1127 (mac-add-charset-info "gb2312.1980-0" 25)
1128 (mac-add-charset-info "mac-centraleurroman" 29)
1129 (mac-add-charset-info "mac-symbol" 33)
1130 (mac-add-charset-info "adobe-fontspecific" 33) ; for X-Symbol
1131 (mac-add-charset-info "mac-dingbats" 34)
1132 (mac-add-charset-info "iso10646-1" 126) ; for ATSUI
1134 (cp-make-coding-system
1136 [?\
\e,AD
\e(B ?\
\e$,1
\e(B ?\
\e$,1 !
\e(B ?\
\e,AI
\e(B ?\
\e$,1 $
\e(B ?\
\e,AV
\e(B ?\
\e,A\
\e(B ?\
\e,Aa
\e(B ?\
\e$,1 %
\e(B ?\
\e$,1 ,
\e(B ?\
\e,Ad
\e(B ?\
\e$,1 -
\e(B ?\
\e$,1 &
\e(B ?\
\e$,1 '
\e(B ?\
\e,Ai
\e(B ?\
\e$,1!9
\e(B
1137 ?\
\e$,1!:
\e(B ?\
\e$,1 .
\e(B ?\
\e,Am
\e(B ?\
\e$,1 /
\e(B ?\
\e$,1 2
\e(B ?\
\e$,1 3
\e(B ?\
\e$,1 6
\e(B ?\
\e,As
\e(B ?\
\e$,1 7
\e(B ?\
\e,At
\e(B ?\
\e,Av
\e(B ?\
\e,Au
\e(B ?\
\e,Az
\e(B ?\
\e$,1 :
\e(B ?\
\e$,1 ;
\e(B ?\
\e,A|
\e(B
1138 ?\
\e$,1s
\e(B ?\
\e,A0
\e(B ?\
\e$,1 8
\e(B ?\
\e,A#
\e(B ?\
\e,A'
\e(B ?\
\e$,1s"
\e(B ?\
\e,A6
\e(B ?\
\e,A_
\e(B ?\
\e,A.
\e(B ?\
\e,A)
\e(B ?\
\e$,1ub
\e(B ?\
\e$,1 9
\e(B ?\
\e,A(
\e(B ?\
\e$,1y
\e(B ?\
\e$,1 C
\e(B ?\
\e$,1 N
\e(B
1139 ?\
\e$,1 O
\e(B ?\
\e$,1 J
\e(B ?\
\e$,1y$
\e(B ?\
\e$,1y%
\e(B ?\
\e$,1 K
\e(B ?\
\e$,1 V
\e(B ?\
\e$,1x"
\e(B ?\
\e$,1x1
\e(B ?\
\e$,1 b
\e(B ?\
\e$,1 [
\e(B ?\
\e$,1 \
\e(B ?\
\e$,1 ]
\e(B ?\
\e$,1 ^
\e(B ?\
\e$,1 Y
\e(B ?\
\e$,1 Z
\e(B ?\
\e$,1 e
\e(B
1140 ?\
\e$,1 f
\e(B ?\
\e$,1 c
\e(B ?\
\e,A,
\e(B ?\
\e$,1x:
\e(B ?\
\e$,1 d
\e(B ?\
\e$,1 g
\e(B ?\
\e$,1x&
\e(B ?\
\e,A+
\e(B ?\
\e,A;
\e(B ?\
\e$,1s&
\e(B ?\
\e,A
\e(B ?\
\e$,1 h
\e(B ?\
\e$,1 p
\e(B ?\
\e,AU
\e(B ?\
\e$,1 q
\e(B ?\
\e$,1 l
\e(B
1141 ?\
\e$,1rs
\e(B ?\
\e$,1rt
\e(B ?\
\e$,1r|
\e(B ?\
\e$,1r}
\e(B ?\
\e$,1rx
\e(B ?\
\e$,1ry
\e(B ?\
\e,Aw
\e(B ?\
\e$,2"*
\e(B ?\
\e$,1 m
\e(B ?\
\e$,1 t
\e(B ?\
\e$,1 u
\e(B ?\
\e$,1 x
\e(B ?\
\e$,1s9
\e(B ?\
\e$,1s:
\e(B ?\
\e$,1 y
\e(B ?\
\e$,1 v
\e(B
1142 ?\
\e$,1 w
\e(B ?\
\e$,1!
\e(B ?\
\e$,1rz
\e(B ?\
\e$,1r~
\e(B ?\
\e$,1!!
\e(B ?\
\e$,1 z
\e(B ?\
\e$,1 {
\e(B ?\
\e,AA
\e(B ?\
\e$,1!$
\e(B ?\
\e$,1!%
\e(B ?\
\e,AM
\e(B ?\
\e$,1!=
\e(B ?\
\e$,1!>
\e(B ?\
\e$,1!*
\e(B ?\
\e,AS
\e(B ?\
\e,AT
\e(B
1143 ?\
\e$,1!+
\e(B ?\
\e$,1!.
\e(B ?\
\e,AZ
\e(B ?\
\e$,1!/
\e(B ?\
\e$,1!0
\e(B ?\
\e$,1!1
\e(B ?\
\e$,1!2
\e(B ?\
\e$,1!3
\e(B ?\
\e,A]
\e(B ?\
\e,A}
\e(B ?\
\e$,1 W
\e(B ?\
\e$,1!;
\e(B ?\
\e$,1 a
\e(B ?\
\e$,1!<
\e(B ?\
\e$,1 B
\e(B ?\
\e$,1$g
\e(B]
1144 "Mac Central European Roman Encoding (MIME:x-mac-centraleurroman).")
1145 (coding-system-put 'mac-centraleurroman 'mime-charset 'x-mac-centraleurroman)
1147 (cp-make-coding-system
1149 [?\
\e$,1(0
\e(B ?\
\e$,1(1
\e(B ?\
\e$,1(2
\e(B ?\
\e$,1(3
\e(B ?\
\e$,1(4
\e(B ?\
\e$,1(5
\e(B ?\
\e$,1(6
\e(B ?\
\e$,1(7
\e(B ?\
\e$,1(8
\e(B ?\
\e$,1(9
\e(B ?\
\e$,1(:
\e(B ?\
\e$,1(;
\e(B ?\
\e$,1(<
\e(B ?\
\e$,1(=
\e(B ?\
\e$,1(>
\e(B ?\
\e$,1(?
\e(B
1150 ?\
\e$,1(@
\e(B ?\
\e$,1(A
\e(B ?\
\e$,1(B
\e(B ?\
\e$,1(C
\e(B ?\
\e$,1(D
\e(B ?\
\e$,1(E
\e(B ?\
\e$,1(F
\e(B ?\
\e$,1(G
\e(B ?\
\e$,1(H
\e(B ?\
\e$,1(I
\e(B ?\
\e$,1(J
\e(B ?\
\e$,1(K
\e(B ?\
\e$,1(L
\e(B ?\
\e$,1(M
\e(B ?\
\e$,1(N
\e(B ?\
\e$,1(O
\e(B
1151 ?\
\e$,1s
\e(B ?\
\e,A0
\e(B ?\
\e$,1)P
\e(B ?\
\e,A#
\e(B ?\
\e,A'
\e(B ?\
\e$,1s"
\e(B ?\
\e,A6
\e(B ?\
\e$,1(&
\e(B ?\
\e,A.
\e(B ?\
\e,A)
\e(B ?\
\e$,1ub
\e(B ?\
\e$,1("
\e(B ?\
\e$,1(r
\e(B ?\
\e$,1y
\e(B ?\
\e$,1(#
\e(B ?\
\e$,1(s
\e(B
1152 ?\
\e$,1x>
\e(B ?\
\e,A1
\e(B ?\
\e$,1y$
\e(B ?\
\e$,1y%
\e(B ?\
\e$,1(v
\e(B ?\
\e,A5
\e(B ?\
\e$,1)Q
\e(B ?\
\e$,1((
\e(B ?\
\e$,1($
\e(B ?\
\e$,1(t
\e(B ?\
\e$,1('
\e(B ?\
\e$,1(w
\e(B ?\
\e$,1()
\e(B ?\
\e$,1(y
\e(B ?\
\e$,1(*
\e(B ?\
\e$,1(z
\e(B
1153 ?\
\e$,1(x
\e(B ?\
\e$,1(%
\e(B ?\
\e,A,
\e(B ?\
\e$,1x:
\e(B ?\
\e$,1!R
\e(B ?\
\e$,1xh
\e(B ?\
\e$,1x&
\e(B ?\
\e,A+
\e(B ?\
\e,A;
\e(B ?\
\e$,1s&
\e(B ?\
\e,A
\e(B ?\
\e$,1(+
\e(B ?\
\e$,1({
\e(B ?\
\e$,1(,
\e(B ?\
\e$,1(|
\e(B ?\
\e$,1(u
\e(B
1154 ?\
\e$,1rs
\e(B ?\
\e$,1rt
\e(B ?\
\e$,1r|
\e(B ?\
\e$,1r}
\e(B ?\
\e$,1rx
\e(B ?\
\e$,1ry
\e(B ?\
\e,Aw
\e(B ?\
\e$,1r~
\e(B ?\
\e$,1(.
\e(B ?\
\e$,1(~
\e(B ?\
\e$,1(/
\e(B ?\
\e$,1(
\7f\e(B ?\
\e$,1uV
\e(B ?\
\e$,1(!
\e(B ?\
\e$,1(q
\e(B ?\
\e$,1(o
\e(B
1155 ?\
\e$,1(P
\e(B ?\
\e$,1(Q
\e(B ?\
\e$,1(R
\e(B ?\
\e$,1(S
\e(B ?\
\e$,1(T
\e(B ?\
\e$,1(U
\e(B ?\
\e$,1(V
\e(B ?\
\e$,1(W
\e(B ?\
\e$,1(X
\e(B ?\
\e$,1(Y
\e(B ?\
\e$,1(Z
\e(B ?\
\e$,1([
\e(B ?\
\e$,1(\
\e(B ?\
\e$,1(]
\e(B ?\
\e$,1(^
\e(B ?\
\e$,1(_
\e(B
1156 ?\
\e$,1(`
\e(B ?\
\e$,1(a
\e(B ?\
\e$,1(b
\e(B ?\
\e$,1(c
\e(B ?\
\e$,1(d
\e(B ?\
\e$,1(e
\e(B ?\
\e$,1(f
\e(B ?\
\e$,1(g
\e(B ?\
\e$,1(h
\e(B ?\
\e$,1(i
\e(B ?\
\e$,1(j
\e(B ?\
\e$,1(k
\e(B ?\
\e$,1(l
\e(B ?\
\e$,1(m
\e(B ?\
\e$,1(n
\e(B ?\
\e$,1tL
\e(B]
1157 "Mac Cyrillic Encoding (MIME:x-mac-cyrillic).")
1158 (coding-system-put 'mac-cyrillic 'mime-charset 'x-mac-cyrillic)
1163 (make-vector 32 nil)
1164 ;; mac-symbol (32..126) -> emacs-mule mapping
1165 [?\ ?\! ?\
\e$,1x
\e(B ?\# ?\
\e$,1x#
\e(B ?\% ?\& ?\
\e$,1x-
\e(B ?\( ?\) ?\
\e$,1x7
\e(B ?\+ ?\, ?\
\e$,1x2
\e(B ?\. ?\/
1166 ?\0 ?\1 ?\2 ?\3 ?\4 ?\5 ?\6 ?\7 ?\8 ?\9 ?\: ?\; ?\< ?\= ?\> ?\?
1167 ?\
\e$,1xe
\e(B ?\
\e$,1&q
\e(B ?\
\e$,1&r
\e(B ?\
\e$,1''
\e(B ?\
\e$,1&t
\e(B ?\
\e$,1&u
\e(B ?\
\e$,1'&
\e(B ?\
\e$,1&s
\e(B ?\
\e$,1&w
\e(B ?\
\e$,1&y
\e(B ?\
\e$,1'Q
\e(B ?\
\e$,1&z
\e(B ?\
\e$,1&{
\e(B ?\
\e$,1&|
\e(B ?\
\e$,1&}
\e(B ?\
\e$,1&
\7f\e(B
1168 ?\
\e$,1'
\e(B ?\
\e$,1&x
\e(B ?\
\e$,1'!
\e(B ?\
\e$,1'#
\e(B ?\
\e$,1'$
\e(B ?\
\e$,1'%
\e(B ?\
\e$,1'B
\e(B ?\
\e$,1')
\e(B ?\
\e$,1&~
\e(B ?\
\e$,1'(
\e(B ?\
\e$,1&v
\e(B ?\[ ?\
\e$,1xT
\e(B ?\] ?\
\e$,1ye
\e(B ?\_
1169 ?\
\e$,3bE
\e(B ?\
\e$,1'1
\e(B ?\
\e$,1'2
\e(B ?\
\e$,1'G
\e(B ?\
\e$,1'4
\e(B ?\
\e$,1'5
\e(B ?\
\e$,1'F
\e(B ?\
\e$,1'3
\e(B ?\
\e$,1'7
\e(B ?\
\e$,1'9
\e(B ?\
\e$,1'U
\e(B ?\
\e$,1':
\e(B ?\
\e$,1';
\e(B ?\
\e$,1'<
\e(B ?\
\e$,1'=
\e(B ?\
\e$,1'?
\e(B
1170 ?\
\e$,1'@
\e(B ?\
\e$,1'8
\e(B ?\
\e$,1'A
\e(B ?\
\e$,1'C
\e(B ?\
\e$,1'D
\e(B ?\
\e$,1'E
\e(B ?\
\e$,1'V
\e(B ?\
\e$,1'I
\e(B ?\
\e$,1'>
\e(B ?\
\e$,1'H
\e(B ?\
\e$,1'6
\e(B ?\{ ?\| ?\} ?\
\e$,1x\
\e(B]
1171 (make-vector (- 160 127) nil)
1172 ;; mac-symbol (160..254) -> emacs-mule mapping
1173 ;; Mapping of the following characters are changed from the
1175 ;; 0xE2 0x00AE+0xF87F -> 0x00AE # REGISTERED SIGN, alternate: sans serif
1176 ;; 0xE3 0x00A9+0xF87F -> 0x00A9 # COPYRIGHT SIGN, alternate: sans serif
1177 ;; 0xE4 0x2122+0xF87F -> 0x2122 # TRADE MARK SIGN, alternate: sans serif
1178 [?\
\e$,1tL
\e(B ?\
\e$,1'R
\e(B ?\
\e$,1s2
\e(B ?\
\e$,1y$
\e(B ?\
\e$,1sD
\e(B ?\
\e$,1x>
\e(B ?\
\e$,1!R
\e(B ?\
\e$,2#c
\e(B ?\
\e$,2#f
\e(B ?\
\e$,2#e
\e(B ?\
\e$,2#`
\e(B ?\
\e$,1vt
\e(B ?\
\e$,1vp
\e(B ?\
\e$,1vq
\e(B ?\
\e$,1vr
\e(B ?\
\e$,1vs
\e(B
1179 ?\
\e,A0
\e(B ?\
\e,A1
\e(B ?\
\e$,1s3
\e(B ?\
\e$,1y%
\e(B ?\
\e,AW
\e(B ?\
\e$,1x=
\e(B ?\
\e$,1x"
\e(B ?\
\e$,1s"
\e(B ?\
\e,Aw
\e(B ?\
\e$,1y
\e(B ?\
\e$,1y!
\e(B ?\
\e$,1xh
\e(B ?\
\e$,1s&
\e(B ?\
\e$,1|p
\e(B ?\
\e$,1|O
\e(B ?\
\e$,1w5
\e(B
1180 ?\
\e$,1uu
\e(B ?\
\e$,1uQ
\e(B ?\
\e$,1u\
\e(B ?\
\e$,1uX
\e(B ?\
\e$,1yW
\e(B ?\
\e$,1yU
\e(B ?\
\e$,1x%
\e(B ?\
\e$,1xI
\e(B ?\
\e$,1xJ
\e(B ?\
\e$,1yC
\e(B ?\
\e$,1yG
\e(B ?\
\e$,1yD
\e(B ?\
\e$,1yB
\e(B ?\
\e$,1yF
\e(B ?\
\e$,1x(
\e(B ?\
\e$,1x)
\e(B
1181 ?\
\e$,1x@
\e(B ?\
\e$,1x'
\e(B ?\
\e,A.
\e(B ?\
\e,A)
\e(B ?\
\e$,1ub
\e(B ?\
\e$,1x/
\e(B ?\
\e$,1x:
\e(B ?\
\e$,1z%
\e(B ?\
\e,A,
\e(B ?\
\e$,1xG
\e(B ?\
\e$,1xH
\e(B ?\
\e$,1wT
\e(B ?\
\e$,1wP
\e(B ?\
\e$,1wQ
\e(B ?\
\e$,1wR
\e(B ?\
\e$,1wS
\e(B
1182 ?\
\e$,2"*
\e(B ?\
\e$,2=H
\e(B ?\
\e,A.
\e(B ?\
\e,A)
\e(B ?\
\e$,1ub
\e(B ?\
\e$,1x1
\e(B ?\
\e$,1|;
\e(B ?\
\e$,1|<
\e(B ?\
\e$,1|=
\e(B ?\
\e$,1|A
\e(B ?\
\e$,1|B
\e(B ?\
\e$,1|C
\e(B ?\
\e$,1|G
\e(B ?\
\e$,1|H
\e(B ?\
\e$,1|I
\e(B ?\
\e$,1|J
\e(B
1183 ?\
\e$,3b_
\e(B ?\
\e$,2=I
\e(B ?\
\e$,1xK
\e(B ?\
\e$,1{
\e(B ?\
\e$,1|N
\e(B ?\
\e$,1{!
\e(B ?\
\e$,1|>
\e(B ?\
\e$,1|?
\e(B ?\
\e$,1|@
\e(B ?\
\e$,1|D
\e(B ?\
\e$,1|E
\e(B ?\
\e$,1|F
\e(B ?\
\e$,1|K
\e(B ?\
\e$,1|L
\e(B ?\
\e$,1|M
\e(B
1186 (setq translation-table
1187 (make-translation-table-from-vector encoding-vector))
1188 ;; (define-translation-table 'mac-symbol-decoder translation-table)
1189 (define-translation-table 'mac-symbol-encoder
1190 (char-table-extra-slot translation-table 0)))
1195 (make-vector 32 nil)
1196 ;; mac-dingbats (32..126) -> emacs-mule mapping
1197 [?\ ?\
\e$,2%A
\e(B ?\
\e$,2%B
\e(B ?\
\e$,2%C
\e(B ?\
\e$,2%D
\e(B ?\
\e$,2"n
\e(B ?\
\e$,2%F
\e(B ?\
\e$,2%G
\e(B ?\
\e$,2%H
\e(B ?\
\e$,2%I
\e(B ?\
\e$,2"{
\e(B ?\
\e$,2"~
\e(B ?\
\e$,2%L
\e(B ?\
\e$,2%M
\e(B ?\
\e$,2%N
\e(B ?\
\e$,2%O
\e(B
1198 ?\
\e$,2%P
\e(B ?\
\e$,2%Q
\e(B ?\
\e$,2%R
\e(B ?\
\e$,2%S
\e(B ?\
\e$,2%T
\e(B ?\
\e$,2%U
\e(B ?\
\e$,2%V
\e(B ?\
\e$,2%W
\e(B ?\
\e$,2%X
\e(B ?\
\e$,2%Y
\e(B ?\
\e$,2%Z
\e(B ?\
\e$,2%[
\e(B ?\
\e$,2%\
\e(B ?\
\e$,2%]
\e(B ?\
\e$,2%^
\e(B ?\
\e$,2%_
\e(B
1199 ?\
\e$,2%`
\e(B ?\
\e$,2%a
\e(B ?\
\e$,2%b
\e(B ?\
\e$,2%c
\e(B ?\
\e$,2%d
\e(B ?\
\e$,2%e
\e(B ?\
\e$,2%f
\e(B ?\
\e$,2%g
\e(B ?\
\e$,2"e
\e(B ?\
\e$,2%i
\e(B ?\
\e$,2%j
\e(B ?\
\e$,2%k
\e(B ?\
\e$,2%l
\e(B ?\
\e$,2%m
\e(B ?\
\e$,2%n
\e(B ?\
\e$,2%o
\e(B
1200 ?\
\e$,2%p
\e(B ?\
\e$,2%q
\e(B ?\
\e$,2%r
\e(B ?\
\e$,2%s
\e(B ?\
\e$,2%t
\e(B ?\
\e$,2%u
\e(B ?\
\e$,2%v
\e(B ?\
\e$,2%w
\e(B ?\
\e$,2%x
\e(B ?\
\e$,2%y
\e(B ?\
\e$,2%z
\e(B ?\
\e$,2%{
\e(B ?\
\e$,2%|
\e(B ?\
\e$,2%}
\e(B ?\
\e$,2%~
\e(B ?\
\e$,2%
\7f\e(B
1201 ?\
\e$,2&
\e(B ?\
\e$,2&!
\e(B ?\
\e$,2&"
\e(B ?\
\e$,2&#
\e(B ?\
\e$,2&$
\e(B ?\
\e$,2&%
\e(B ?\
\e$,2&&
\e(B ?\
\e$,2&'
\e(B ?\
\e$,2&(
\e(B ?\
\e$,2&)
\e(B ?\
\e$,2&*
\e(B ?\
\e$,2&+
\e(B ?\
\e$,2"/
\e(B ?\
\e$,2&-
\e(B ?\
\e$,2!`
\e(B ?\
\e$,2&/
\e(B
1202 ?\
\e$,2&0
\e(B ?\
\e$,2&1
\e(B ?\
\e$,2&2
\e(B ?\
\e$,2!r
\e(B ?\
\e$,2!|
\e(B ?\
\e$,2"&
\e(B ?\
\e$,2&6
\e(B ?\
\e$,2"7
\e(B ?\
\e$,2&8
\e(B ?\
\e$,2&9
\e(B ?\
\e$,2&:
\e(B ?\
\e$,2&;
\e(B ?\
\e$,2&<
\e(B ?\
\e$,2&=
\e(B ?\
\e$,2&>
\e(B
1204 ;; mac-dingbats (128..141) -> emacs-mule mapping
1205 ?\
\e$,2&H
\e(B ?\
\e$,2&I
\e(B ?\
\e$,2&J
\e(B ?\
\e$,2&K
\e(B ?\
\e$,2&L
\e(B ?\
\e$,2&M
\e(B ?\
\e$,2&N
\e(B ?\
\e$,2&O
\e(B ?\
\e$,2&P
\e(B ?\
\e$,2&Q
\e(B ?\
\e$,2&R
\e(B ?\
\e$,2&S
\e(B ?\
\e$,2&T
\e(B ?\
\e$,2&U
\e(B]
1206 (make-vector (- 161 142) nil)
1207 ;; mac-dingbats (161..239) -> emacs-mule mapping
1208 [?\
\e$,2&A
\e(B ?\
\e$,2&B
\e(B ?\
\e$,2&C
\e(B ?\
\e$,2&D
\e(B ?\
\e$,2&E
\e(B ?\
\e$,2&F
\e(B ?\
\e$,2&G
\e(B ?\
\e$,2#c
\e(B ?\
\e$,2#f
\e(B ?\
\e$,2#e
\e(B ?\
\e$,2#`
\e(B ?\
\e$,1~@
\e(B ?\
\e$,1~A
\e(B ?\
\e$,1~B
\e(B ?\
\e$,1~C
\e(B
1209 ?\
\e$,1~D
\e(B ?\
\e$,1~E
\e(B ?\
\e$,1~F
\e(B ?\
\e$,1~G
\e(B ?\
\e$,1~H
\e(B ?\
\e$,1~I
\e(B ?\
\e$,2&V
\e(B ?\
\e$,2&W
\e(B ?\
\e$,2&X
\e(B ?\
\e$,2&Y
\e(B ?\
\e$,2&Z
\e(B ?\
\e$,2&[
\e(B ?\
\e$,2&\
\e(B ?\
\e$,2&]
\e(B ?\
\e$,2&^
\e(B ?\
\e$,2&_
\e(B
1210 ?\
\e$,2&`
\e(B ?\
\e$,2&a
\e(B ?\
\e$,2&b
\e(B ?\
\e$,2&c
\e(B ?\
\e$,2&d
\e(B ?\
\e$,2&e
\e(B ?\
\e$,2&f
\e(B ?\
\e$,2&g
\e(B ?\
\e$,2&h
\e(B ?\
\e$,2&i
\e(B ?\
\e$,2&j
\e(B ?\
\e$,2&k
\e(B ?\
\e$,2&l
\e(B ?\
\e$,2&m
\e(B ?\
\e$,2&n
\e(B ?\
\e$,2&o
\e(B
1211 ?\
\e$,2&p
\e(B ?\
\e$,2&q
\e(B ?\
\e$,2&r
\e(B ?\
\e$,2&s
\e(B ?\
\e$,2&t
\e(B ?\
\e$,1vr
\e(B ?\
\e$,1vt
\e(B ?\
\e$,1vu
\e(B ?\
\e$,2&x
\e(B ?\
\e$,2&y
\e(B ?\
\e$,2&z
\e(B ?\
\e$,2&{
\e(B ?\
\e$,2&|
\e(B ?\
\e$,2&}
\e(B ?\
\e$,2&~
\e(B ?\
\e$,2&
\7f\e(B
1212 ?\
\e$,2'
\e(B ?\
\e$,2'!
\e(B ?\
\e$,2'"
\e(B ?\
\e$,2'#
\e(B ?\
\e$,2'$
\e(B ?\
\e$,2'%
\e(B ?\
\e$,2'&
\e(B ?\
\e$,2''
\e(B ?\
\e$,2'(
\e(B ?\
\e$,2')
\e(B ?\
\e$,2'*
\e(B ?\
\e$,2'+
\e(B ?\
\e$,2',
\e(B ?\
\e$,2'-
\e(B ?\
\e$,2'.
\e(B ?\
\e$,2'/
\e(B
1214 ;; mac-dingbats (241..254) -> emacs-mule mapping
1215 ?\
\e$,2'1
\e(B ?\
\e$,2'2
\e(B ?\
\e$,2'3
\e(B ?\
\e$,2'4
\e(B ?\
\e$,2'5
\e(B ?\
\e$,2'6
\e(B ?\
\e$,2'7
\e(B ?\
\e$,2'8
\e(B ?\
\e$,2'9
\e(B ?\
\e$,2':
\e(B ?\
\e$,2';
\e(B ?\
\e$,2'<
\e(B ?\
\e$,2'=
\e(B ?\
\e$,2'>
\e(B
1218 (setq translation-table
1219 (make-translation-table-from-vector encoding-vector))
1220 ;; (define-translation-table 'mac-dingbats-decoder translation-table)
1221 (define-translation-table 'mac-dingbats-encoder
1222 (char-table-extra-slot translation-table 0)))
1224 (defconst mac-system-coding-system
1225 (let ((base (or (cdr (assq mac-system-script-code
1226 mac-script-code-coding-systems))
1228 (if (eq system-type 'darwin)
1230 (coding-system-change-eol-conversion base 'mac)))
1231 "Coding system derived from the system script code.")
1233 (set-selection-coding-system mac-system-coding-system)
1236 ;;;; Keyboard layout/language change events
1237 (defun mac-handle-language-change (event)
1238 "Set keyboard coding system to what is specified in EVENT."
1240 (let ((coding-system
1241 (cdr (assq (car (cadr event)) mac-script-code-coding-systems))))
1242 (set-keyboard-coding-system (or coding-system 'mac-roman))
1243 ;; MacJapanese maps reverse solidus to ?\x80.
1244 (if (eq coding-system 'japanese-shift-jis)
1245 (define-key key-translation-map [?\x80] "\\"))))
1247 (define-key special-event-map [language-change] 'mac-handle-language-change)
1250 ;;;; Conversion between common flavors and Lisp string.
1252 (defconst mac-text-encoding-ascii #x600
1253 "ASCII text encoding.")
1255 (defconst mac-text-encoding-mac-japanese-basic-variant #x20001
1256 "MacJapanese text encoding without Apple double-byte extensions.")
1258 (defun mac-utxt-to-string (data &optional coding-system)
1259 (or coding-system (setq coding-system mac-system-coding-system))
1261 (and (eq system-type 'darwin)
1262 (eq (coding-system-base coding-system) 'japanese-shift-jis)
1263 mac-text-encoding-mac-japanese-basic-variant))
1264 (str (and (fboundp 'mac-code-convert-string)
1265 (mac-code-convert-string data nil
1266 (or encoding coding-system)))))
1268 (setq str (decode-coding-string str coding-system))
1269 (if (eq encoding mac-text-encoding-mac-japanese-basic-variant)
1270 ;; Does it contain Apple one-byte extensions other than
1272 (if (string-match "[\xa0\xfd-\xff]" str)
1275 (unless (mac-code-convert-string data nil mac-text-encoding-ascii)
1276 (subst-char-in-string ?\x5c ?\
\e(J\
\e(B str t)
1277 (subst-char-in-string ?\x80 ?\\ str t)))))
1279 (decode-coding-string data
1280 (if (eq (byteorder) ?B) 'utf-16be 'utf-16le)))))
1282 (defun mac-string-to-utxt (string &optional coding-system)
1283 (or coding-system (setq coding-system mac-system-coding-system))
1284 (let (data encoding)
1285 (when (and (fboundp 'mac-code-convert-string)
1286 (memq (coding-system-base coding-system)
1287 (find-coding-systems-string string)))
1289 (coding-system-change-eol-conversion coding-system 'mac))
1290 (when (and (eq system-type 'darwin)
1291 (eq coding-system 'japanese-shift-jis-mac))
1292 (setq encoding mac-text-encoding-mac-japanese-basic-variant)
1293 (setq string (subst-char-in-string ?\\ ?\x80 string))
1294 (subst-char-in-string ?\
\e(J\
\e(B ?\x5c string t))
1295 (setq data (mac-code-convert-string
1296 (encode-coding-string string coding-system)
1297 (or encoding coding-system) nil)))
1298 (or data (encode-coding-string string (if (eq (byteorder) ?B)
1302 (defun mac-TEXT-to-string (data &optional coding-system)
1303 (or coding-system (setq coding-system mac-system-coding-system))
1304 (prog1 (setq data (decode-coding-string data coding-system))
1305 (when (eq (coding-system-base coding-system) 'japanese-shift-jis)
1306 ;; (subst-char-in-string ?\x5c ?\
\e(J\
\e(B data t)
1307 (subst-char-in-string ?\x80 ?\\ data t))))
1309 (defun mac-string-to-TEXT (string &optional coding-system)
1310 (or coding-system (setq coding-system mac-system-coding-system))
1311 (let ((encodables (find-coding-systems-string string))
1312 (rest mac-script-code-coding-systems))
1313 (unless (memq (coding-system-base coding-system) encodables)
1314 (while (and rest (not (memq (cdar rest) encodables)))
1315 (setq rest (cdr rest)))
1317 (setq coding-system (cdar rest)))))
1319 (coding-system-change-eol-conversion coding-system 'mac))
1320 (when (eq coding-system 'japanese-shift-jis-mac)
1321 ;; (setq string (subst-char-in-string ?\\ ?\x80 string))
1322 (setq string (subst-char-in-string ?\
\e(J\
\e(B ?\x5c string)))
1323 (encode-coding-string string coding-system))
1325 (defun mac-furl-to-string (data)
1326 ;; Remove a trailing nul character.
1327 (let ((len (length data)))
1328 (if (and (> len 0) (= (aref data (1- len)) ?\0))
1329 (substring data 0 (1- len))
1332 (defun mac-TIFF-to-string (data &optional text)
1333 (prog1 (or text (setq text (copy-sequence " ")))
1334 (put-text-property 0 (length text) 'display (create-image data 'tiff t)
1339 ;;; We keep track of the last text selected here, so we can check the
1340 ;;; current selection against it, and avoid passing back our own text
1341 ;;; from x-get-selection-value.
1342 (defvar x-last-selected-text-clipboard nil
1343 "The value of the CLIPBOARD selection last time we selected or
1345 (defvar x-last-selected-text-primary nil
1346 "The value of the PRIMARY X selection last time we selected or
1349 (defcustom x-select-enable-clipboard t
1350 "*Non-nil means cutting and pasting uses the clipboard.
1351 This is in addition to the primary selection."
1355 ;;; Make TEXT, a string, the primary X selection.
1356 (defun x-select-text (text &optional push)
1357 (x-set-selection 'PRIMARY text)
1358 (setq x-last-selected-text-primary text)
1359 (if (not x-select-enable-clipboard)
1360 (setq x-last-selected-text-clipboard nil)
1361 (x-set-selection 'CLIPBOARD text)
1362 (setq x-last-selected-text-clipboard text))
1365 (defun x-get-selection (&optional type data-type)
1366 "Return the value of a selection.
1367 The argument TYPE (default `PRIMARY') says which selection,
1368 and the argument DATA-TYPE (default `STRING') says
1369 how to convert the data.
1371 TYPE may be any symbol \(but nil stands for `PRIMARY'). However,
1372 only a few symbols are commonly used. They conventionally have
1373 all upper-case names. The most often used ones, in addition to
1374 `PRIMARY', are `SECONDARY' and `CLIPBOARD'.
1376 DATA-TYPE is usually `STRING', but can also be one of the symbols
1377 in `selection-converter-alist', which see."
1378 (let ((data (x-get-selection-internal (or type 'PRIMARY)
1379 (or data-type 'STRING)))
1380 (coding (or next-selection-coding-system
1381 selection-coding-system)))
1382 (when (and (stringp data)
1383 (setq data-type (get-text-property 0 'foreign-selection data)))
1384 (cond ((eq data-type 'public.utf16-plain-text)
1385 (setq data (mac-utxt-to-string data coding)))
1386 ((eq data-type 'com.apple.traditional-mac-plain-text)
1387 (setq data (mac-TEXT-to-string data coding)))
1388 ((eq data-type 'public.file-url)
1389 (setq data (mac-furl-to-string data))))
1390 (put-text-property 0 (length data) 'foreign-selection data-type data))
1393 (defun x-selection-value (type)
1394 (let ((data-types '(public.utf16-plain-text
1395 com.apple.traditional-mac-plain-text
1398 (while (and (null text) data-types)
1399 (setq text (condition-case nil
1400 (x-get-selection type (car data-types))
1402 (setq data-types (cdr data-types)))
1404 (remove-text-properties 0 (length text) '(foreign-selection nil) text))
1405 (setq tiff-image (condition-case nil
1406 (x-get-selection type 'public.tiff)
1409 (remove-text-properties 0 (length tiff-image)
1410 '(foreign-selection nil) tiff-image)
1411 (setq text (mac-TIFF-to-string tiff-image text)))
1414 ;;; Return the value of the current selection.
1415 ;;; Treat empty strings as if they were unset.
1416 ;;; If this function is called twice and finds the same text,
1417 ;;; it returns nil the second time. This is so that a single
1418 ;;; selection won't be added to the kill ring over and over.
1419 (defun x-get-selection-value ()
1420 (let (clip-text primary-text)
1421 (if (not x-select-enable-clipboard)
1422 (setq x-last-selected-text-clipboard nil)
1423 (setq clip-text (x-selection-value 'CLIPBOARD))
1424 (if (string= clip-text "") (setq clip-text nil))
1426 ;; Check the CLIPBOARD selection for 'newness', is it different
1427 ;; from what we remebered them to be last time we did a
1428 ;; cut/paste operation.
1430 (cond;; check clipboard
1431 ((or (not clip-text) (string= clip-text ""))
1432 (setq x-last-selected-text-clipboard nil))
1433 ((eq clip-text x-last-selected-text-clipboard) nil)
1434 ((string= clip-text x-last-selected-text-clipboard)
1435 ;; Record the newer string,
1436 ;; so subsequent calls can use the `eq' test.
1437 (setq x-last-selected-text-clipboard clip-text)
1440 (setq x-last-selected-text-clipboard clip-text))))
1443 (setq primary-text (x-selection-value 'PRIMARY))
1444 ;; Check the PRIMARY selection for 'newness', is it different
1445 ;; from what we remebered them to be last time we did a
1446 ;; cut/paste operation.
1448 (cond;; check primary selection
1449 ((or (not primary-text) (string= primary-text ""))
1450 (setq x-last-selected-text-primary nil))
1451 ((eq primary-text x-last-selected-text-primary) nil)
1452 ((string= primary-text x-last-selected-text-primary)
1453 ;; Record the newer string,
1454 ;; so subsequent calls can use the `eq' test.
1455 (setq x-last-selected-text-primary primary-text)
1458 (setq x-last-selected-text-primary primary-text))))
1460 ;; As we have done one selection, clear this now.
1461 (setq next-selection-coding-system nil)
1463 ;; At this point we have recorded the current values for the
1464 ;; selection from clipboard (if we are supposed to) and primary,
1465 ;; So return the first one that has changed (which is the first
1467 (or clip-text primary-text)
1470 (put 'CLIPBOARD 'mac-scrap-name "com.apple.scrap.clipboard")
1471 (when (eq system-type 'darwin)
1472 (put 'FIND 'mac-scrap-name "com.apple.scrap.find")
1473 (put 'PRIMARY 'mac-scrap-name
1474 (format "org.gnu.Emacs.%d.selection.PRIMARY" (emacs-pid))))
1475 (put 'com.apple.traditional-mac-plain-text 'mac-ostype "TEXT")
1476 (put 'public.utf16-plain-text 'mac-ostype "utxt")
1477 (put 'public.tiff 'mac-ostype "TIFF")
1478 (put 'public.file-url 'mac-ostype "furl")
1480 (defun mac-select-convert-to-string (selection type value)
1481 (let ((str (cdr (xselect-convert-to-string selection nil value)))
1482 (coding (or next-selection-coding-system selection-coding-system)))
1484 ;; If TYPE is nil, this is a local request, thus return STR as
1485 ;; is. Otherwise, encode STR.
1488 (let ((inhibit-read-only t))
1489 (remove-text-properties 0 (length str) '(composition nil) str)
1491 ((eq type 'public.utf16-plain-text)
1492 (setq str (mac-string-to-utxt str coding)))
1493 ((eq type 'com.apple.traditional-mac-plain-text)
1494 (setq str (mac-string-to-TEXT str coding)))
1496 (error "Unknown selection type: %S" type))
1499 (setq next-selection-coding-system nil)
1502 (defun mac-select-convert-to-file-url (selection type value)
1503 (let ((filename (xselect-convert-to-filename selection type value))
1504 (coding (or file-name-coding-system default-file-name-coding-system)))
1505 (if (and filename coding)
1506 (setq filename (encode-coding-string filename coding)))
1508 (concat "file://localhost"
1509 (mapconcat 'url-hexify-string
1510 (split-string filename "/") "/")))))
1512 (setq selection-converter-alist
1514 '((public.utf16-plain-text . mac-select-convert-to-string)
1515 (com.apple.traditional-mac-plain-text . mac-select-convert-to-string)
1516 ;; This is not enabled by default because the `Import Image'
1517 ;; menu makes Emacs crash or hang for unknown reasons.
1518 ;; (public.tiff . nil)
1519 (public.file-url . mac-select-convert-to-file-url)
1521 selection-converter-alist))
1523 ;;;; Apple events, HICommand events, and Services menu
1526 (put 'core-event 'mac-apple-event-class "aevt") ; kCoreEventClass
1527 (put 'internet-event 'mac-apple-event-class "GURL") ; kAEInternetEventClass
1531 (put 'open-application 'mac-apple-event-id "oapp") ; kAEOpenApplication
1532 (put 'reopen-application 'mac-apple-event-id "rapp") ; kAEReopenApplication
1533 (put 'open-documents 'mac-apple-event-id "odoc") ; kAEOpenDocuments
1534 (put 'print-documents 'mac-apple-event-id "pdoc") ; kAEPrintDocuments
1535 (put 'open-contents 'mac-apple-event-id "ocon") ; kAEOpenContents
1536 (put 'quit-application 'mac-apple-event-id "quit") ; kAEQuitApplication
1537 (put 'application-died 'mac-apple-event-id "obit") ; kAEApplicationDied
1538 (put 'show-preferences 'mac-apple-event-id "pref") ; kAEShowPreferences
1539 (put 'autosave-now 'mac-apple-event-id "asav") ; kAEAutosaveNow
1540 ;; kAEInternetEventClass
1541 (put 'get-url 'mac-apple-event-id "GURL") ; kAEGetURL
1542 ;; Converted HICommand events
1543 (put 'about 'mac-apple-event-id "abou") ; kHICommandAbout
1545 (defmacro mac-event-spec (event)
1548 (defmacro mac-event-ae (event)
1551 (defun mac-ae-parameter (ae &optional keyword type)
1552 (or keyword (setq keyword "----")) ;; Direct object.
1553 (if (not (and (consp ae) (equal (car ae) "aevt")))
1554 (error "Not an Apple event: %S" ae)
1555 (let ((type-data (cdr (assoc keyword (cdr ae))))
1557 (when (and type type-data (not (equal type (car type-data))))
1558 (setq data (mac-coerce-ae-data (car type-data) (cdr type-data) type))
1559 (setq type-data (if data (cons type data) nil)))
1562 (defun mac-ae-list (ae &optional keyword type)
1563 (or keyword (setq keyword "----")) ;; Direct object.
1564 (let ((desc (mac-ae-parameter ae keyword "list")))
1567 ((not (equal (car desc) "list"))
1568 (error "Parameter for \"%s\" is not a list" keyword))
1574 (mac-coerce-ae-data (car type-data) (cdr type-data) type))
1577 (defun mac-ae-number (ae keyword)
1578 (let ((type-data (mac-ae-parameter ae keyword))
1581 (setq str (mac-coerce-ae-data (car type-data)
1582 (cdr type-data) "TEXT")))
1583 (string-to-number str)
1586 (defun mac-bytes-to-integer (bytes &optional from to)
1587 (or from (setq from 0))
1588 (or to (setq to (length bytes)))
1589 (let* ((len (- to from))
1590 (extended-sign-len (- (1+ (ceiling (log most-positive-fixnum 2)))
1594 (setq result (logior (lsh result 8)
1595 (aref bytes (+ from (if (eq (byteorder) ?B) i
1597 (if (> extended-sign-len 0)
1598 (ash (lsh result extended-sign-len) (- extended-sign-len))
1601 (defun mac-ae-selection-range (ae)
1602 ;; #pragma options align=mac68k
1603 ;; typedef struct SelectionRange {
1604 ;; short unused1; // 0 (not used)
1605 ;; short lineNum; // line to select (<0 to specify range)
1606 ;; long startRange; // start of selection range (if line < 0)
1607 ;; long endRange; // end of selection range (if line < 0)
1608 ;; long unused2; // 0 (not used)
1609 ;; long theDate; // modification date/time
1610 ;; } SelectionRange;
1611 ;; #pragma options align=reset
1612 (let ((range-bytes (cdr (mac-ae-parameter ae "kpos" "TEXT"))))
1614 (list (mac-bytes-to-integer range-bytes 2 4)
1615 (mac-bytes-to-integer range-bytes 4 8)
1616 (mac-bytes-to-integer range-bytes 8 12)
1617 (mac-bytes-to-integer range-bytes 16 20)))))
1619 ;; On Mac OS X 10.4 and later, the `open-document' event contains an
1620 ;; optional parameter keyAESearchText from the Spotlight search.
1621 (defun mac-ae-text-for-search (ae)
1622 (let ((utf8-text (cdr (mac-ae-parameter ae "stxt" "utf8"))))
1624 (decode-coding-string utf8-text 'utf-8))))
1626 (defun mac-ae-text (ae)
1627 (or (cdr (mac-ae-parameter ae nil "TEXT"))
1628 (error "No text in Apple event.")))
1630 (defun mac-ae-frame (ae &optional keyword type)
1631 (let ((bytes (cdr (mac-ae-parameter ae keyword type))))
1632 (if (or (null bytes) (/= (length bytes) 4))
1633 (error "No window reference in Apple event.")
1634 (let ((window-id (mac-coerce-ae-data "long" bytes "TEXT"))
1637 (while (and (null frame) rest)
1638 (if (string= (frame-parameter (car rest) 'window-id) window-id)
1639 (setq frame (car rest)))
1640 (setq rest (cdr rest)))
1643 (defun mac-ae-script-language (ae keyword)
1644 ;; struct WritingCode {
1645 ;; ScriptCode theScriptCode;
1646 ;; LangCode theLangCode;
1648 (let ((bytes (cdr (mac-ae-parameter ae keyword "intl"))))
1650 (cons (mac-bytes-to-integer bytes 0 2)
1651 (mac-bytes-to-integer bytes 2 4)))))
1653 (defun mac-bytes-to-text-range (bytes &optional from to)
1654 ;; struct TextRange {
1657 ;; short fHiliteStyle;
1659 (or from (setq from 0))
1660 (or to (setq to (length bytes)))
1661 (and (= (- to from) (+ 4 4 2))
1662 (list (mac-bytes-to-integer bytes from (+ from 4))
1663 (mac-bytes-to-integer bytes (+ from 4) (+ from 8))
1664 (mac-bytes-to-integer bytes (+ from 8) to))))
1666 (defun mac-ae-text-range-array (ae keyword)
1667 ;; struct TextRangeArray {
1668 ;; short fNumOfRanges;
1669 ;; TextRange fRange[1];
1671 (let* ((bytes (cdr (mac-ae-parameter ae keyword "tray")))
1672 (len (length bytes))
1674 (when (and bytes (>= len 2)
1676 (setq nranges (mac-bytes-to-integer bytes 0 2))
1677 (= len (+ 2 (* nranges 10)))))
1678 (setq result (make-vector nranges nil))
1679 (dotimes (i nranges)
1681 (mac-bytes-to-text-range bytes (+ (* i 10) 2)
1685 (defun mac-ae-open-documents (event)
1686 "Open the documents specified by the Apple event EVENT."
1688 (let ((ae (mac-event-ae event)))
1689 (dolist (file-name (mac-ae-list ae nil 'undecoded-file-name))
1691 (dnd-open-local-file
1693 (mapconcat 'url-hexify-string
1694 (split-string file-name "/") "/")) nil)))
1695 (let ((selection-range (mac-ae-selection-range ae))
1696 (search-text (mac-ae-text-for-search ae)))
1697 (cond (selection-range
1698 (let ((line (car selection-range))
1699 (start (cadr selection-range))
1700 (end (nth 2 selection-range)))
1703 (if (and (> start 0) (> end 0))
1704 (progn (set-mark start)
1705 (goto-char end))))))
1706 ((stringp search-text)
1708 (mapconcat 'regexp-quote (split-string search-text) "\\|")
1710 (select-frame-set-input-focus (selected-frame)))
1712 (defun mac-ae-get-url (event)
1713 "Open the URL specified by the Apple event EVENT.
1714 Currently the `mailto' scheme is supported."
1716 (let* ((ae (mac-event-ae event))
1717 (parsed-url (url-generic-parse-url (mac-ae-text ae))))
1718 (if (string= (url-type parsed-url) "mailto")
1719 (url-mailto parsed-url)
1720 (mac-resume-apple-event ae t))))
1722 (setq mac-apple-event-map (make-sparse-keymap))
1724 ;; Received when Emacs is launched without associated documents.
1725 ;; Accept it as an Apple event, but no Emacs event is generated so as
1726 ;; not to erase the splash screen.
1727 (define-key mac-apple-event-map [core-event open-application] 0)
1729 ;; Received when a dock or application icon is clicked and Emacs is
1730 ;; already running. Simply ignored. Another idea is to make a new
1731 ;; frame if all frames are invisible.
1732 (define-key mac-apple-event-map [core-event reopen-application] 'ignore)
1734 (define-key mac-apple-event-map [core-event open-documents]
1735 'mac-ae-open-documents)
1736 (define-key mac-apple-event-map [core-event show-preferences] 'customize)
1737 (define-key mac-apple-event-map [core-event quit-application]
1738 'save-buffers-kill-emacs)
1740 (define-key mac-apple-event-map [internet-event get-url] 'mac-ae-get-url)
1742 (define-key mac-apple-event-map [hicommand about] 'display-splash-screen)
1744 ;;; Converted Carbon Events
1745 (defun mac-handle-toolbar-switch-mode (event)
1746 "Toggle visibility of tool-bars in response to EVENT.
1747 With no keyboard modifiers, it toggles the visibility of the
1748 frame where the tool-bar toggle button was pressed. With some
1749 modifiers, it changes global tool-bar visibility setting."
1751 (let* ((ae (mac-event-ae event))
1752 (modifiers (cdr (mac-ae-parameter ae "kmod"))))
1753 (if (and modifiers (not (string= modifiers "\000\000\000\000")))
1754 ;; Globally toggle tool-bar-mode if some modifier key is pressed.
1756 (let ((frame (mac-ae-frame ae)))
1757 (set-frame-parameter frame 'tool-bar-lines
1758 (if (= (frame-parameter frame 'tool-bar-lines) 0)
1761 ;; kEventClassWindow/kEventWindowToolbarSwitchMode
1762 (define-key mac-apple-event-map [window toolbar-switch-mode]
1763 'mac-handle-toolbar-switch-mode)
1766 (when (fboundp 'mac-set-font-panel-visibility)
1768 (define-minor-mode mac-font-panel-mode
1769 "Toggle use of the font panel.
1770 With numeric ARG, display the font panel if and only if ARG is positive."
1774 (mac-set-font-panel-visibility mac-font-panel-mode))
1776 (defun mac-handle-font-panel-closed (event)
1777 "Update internal status in response to font panel closed EVENT."
1779 ;; Synchronize with the minor mode variable.
1780 (mac-font-panel-mode 0))
1782 (defun mac-handle-font-selection (event)
1783 "Change default face attributes according to font selection EVENT."
1785 (let* ((ae (mac-event-ae event))
1786 (fm-font-size (mac-ae-number ae "fmsz"))
1787 (atsu-font-id (cdr (mac-ae-parameter ae "auid")))
1788 (attribute-values (gethash atsu-font-id mac-atsu-font-table)))
1790 (setq attribute-values
1791 `(:height ,(* 10 fm-font-size) ,@attribute-values)))
1792 (apply 'set-face-attribute 'default (selected-frame) attribute-values)))
1794 ;; kEventClassFont/kEventFontPanelClosed
1795 (define-key mac-apple-event-map [font panel-closed]
1796 'mac-handle-font-panel-closed)
1797 ;; kEventClassFont/kEventFontSelection
1798 (define-key mac-apple-event-map [font selection] 'mac-handle-font-selection)
1800 (define-key-after menu-bar-showhide-menu [mac-font-panel-mode]
1801 (menu-bar-make-mm-toggle mac-font-panel-mode
1803 "Show the font panel as a floating dialog")
1806 ) ;; (fboundp 'mac-set-font-panel-visibility)
1809 (defvar mac-ts-active-input-buf ""
1810 "Byte sequence of the current Mac TSM active input area.")
1811 (defvar mac-ts-update-active-input-area-seqno 0
1812 "Number of processed update-active-input-area events.")
1813 (setq mac-ts-active-input-overlay (make-overlay 0 0))
1815 (defface mac-ts-caret-position
1816 '((t :inverse-video t))
1817 "Face for caret position in Mac TSM active input area.
1818 This is used only when the active input area is displayed in the
1822 (defface mac-ts-raw-text
1824 "Face for raw text in Mac TSM active input area."
1827 (defface mac-ts-selected-raw-text
1829 "Face for selected raw text in Mac TSM active input area."
1832 (defface mac-ts-converted-text
1833 '((((background dark)) :underline "gray20")
1834 (t :underline "gray80"))
1835 "Face for converted text in Mac TSM active input area."
1838 (defface mac-ts-selected-converted-text
1840 "Face for selected converted text in Mac TSM active input area."
1843 (defface mac-ts-block-fill-text
1845 "Face for block fill text in Mac TSM active input area."
1848 (defface mac-ts-outline-text
1850 "Face for outline text in Mac TSM active input area."
1853 (defface mac-ts-selected-text
1855 "Face for selected text in Mac TSM active input area."
1858 (defface mac-ts-no-hilite
1859 '((t :inherit default))
1860 "Face for no hilite in Mac TSM active input area."
1863 (defconst mac-ts-hilite-style-faces
1864 '((2 . mac-ts-raw-text) ; kTSMHiliteRawText
1865 (3 . mac-ts-selected-raw-text) ; kTSMHiliteSelectedRawText
1866 (4 . mac-ts-converted-text) ; kTSMHiliteConvertedText
1867 (5 . mac-ts-selected-converted-text) ; kTSMHiliteSelectedConvertedText
1868 (6 . mac-ts-block-fill-text) ; kTSMHiliteBlockFillText
1869 (7 . mac-ts-outline-text) ; kTSMHiliteOutlineText
1870 (8 . mac-ts-selected-text) ; kTSMHiliteSelectedText
1871 (9 . mac-ts-no-hilite)) ; kTSMHiliteNoHilite
1872 "Alist of Mac TSM hilite style vs Emacs face.")
1874 (defun mac-ts-update-active-input-buf (text fix-len hilite-rng update-rng)
1875 (let ((buf-len (length mac-ts-active-input-buf))
1877 (if (or (null update-rng)
1878 (/= (% (length update-rng) 2) 0))
1879 ;; The parameter is missing (or in a bad format). The
1880 ;; existing inline input session is completely replaced with
1882 (setq mac-ts-active-input-buf text)
1883 ;; Otherwise, the current subtext specified by the (2*j)-th
1884 ;; range is replaced with the new subtext specified by the
1885 ;; (2*j+1)-th range.
1886 (let ((tail buf-len)
1887 (i (length update-rng))
1891 (setq rng (aref update-rng i))
1892 (if (and (<= 0 (cadr rng)) (< (cadr rng) tail)
1895 (cons (substring mac-ts-active-input-buf (cadr rng) tail)
1897 (setq tail (car rng))
1898 (setq rng (aref update-rng (1+ i)))
1899 (if (and (<= 0 (car rng)) (< (car rng) (cadr rng))
1900 (<= (cadr rng) (length text)))
1902 (cons (substring text (car rng) (cadr rng))
1904 (if (and (< 0 tail) (<= tail buf-len))
1906 (cons (substring mac-ts-active-input-buf 0 tail)
1908 (setq mac-ts-active-input-buf (apply 'concat segments))))
1909 (setq buf-len (length mac-ts-active-input-buf))
1910 ;; Confirm (a part of) inline input session.
1911 (cond ((< fix-len 0)
1912 ;; Entire inline session is being confirmed.
1913 (setq confirmed mac-ts-active-input-buf)
1914 (setq mac-ts-active-input-buf ""))
1916 ;; None of the text is being confirmed (yet).
1917 (setq confirmed ""))
1919 (if (> fix-len buf-len)
1920 (setq fix-len buf-len))
1921 (setq confirmed (substring mac-ts-active-input-buf 0 fix-len))
1922 (setq mac-ts-active-input-buf
1923 (substring mac-ts-active-input-buf fix-len))))
1924 (setq buf-len (length mac-ts-active-input-buf))
1925 ;; Update highlighting and the caret position in the new inline
1927 (remove-text-properties 0 buf-len '(cursor nil) mac-ts-active-input-buf)
1929 (cond ((and (= (nth 2 rng) 1) ; kTSMHiliteCaretPosition
1930 (<= 0 (car rng)) (< (car rng) buf-len))
1931 (put-text-property (car rng) buf-len
1932 'cursor t mac-ts-active-input-buf))
1933 ((and (<= 0 (car rng)) (< (car rng) (cadr rng))
1934 (<= (cadr rng) buf-len))
1935 (put-text-property (car rng) (cadr rng) 'face
1936 (cdr (assq (nth 2 rng)
1937 mac-ts-hilite-style-faces))
1938 mac-ts-active-input-buf))))
1942 (defun mac-split-string-by-property-change (string)
1943 (let ((tail (length string))
1946 (while (setq head (previous-property-change tail string)
1947 result (cons (substring string (or head 0) tail) result)
1951 (defun mac-replace-untranslated-utf-8-chars (string &optional to-string)
1952 (or to-string (setq to-string "
\e$,3u=
\e(B"))
1955 (if (get-text-property 0 'untranslated-utf-8 str) to-string str))
1956 (mac-split-string-by-property-change string)
1959 (defun mac-ts-update-active-input-area (event)
1960 "Update Mac TSM active input area according to EVENT.
1961 The confirmed text is converted to Emacs input events and pushed
1962 into `unread-command-events'. The unconfirmed text is displayed
1963 either in the current buffer or in the echo area."
1965 (let* ((ae (mac-event-ae event))
1966 (text (or (cdr (mac-ae-parameter ae "tstx" "utxt")) ""))
1967 (script-language (mac-ae-script-language ae "tssl"))
1968 (coding (or (cdr (assq (car script-language)
1969 mac-script-code-coding-systems))
1971 (fix-len (mac-ae-number ae "tsfx"))
1972 ;; Optional parameters
1973 (hilite-rng (mac-ae-text-range-array ae "tshi"))
1974 (update-rng (mac-ae-text-range-array ae "tsup"))
1975 ;;(pin-rng (mac-bytes-to-text-range (cdr (mac-ae-parameter ae "tspn" "txrn"))))
1976 ;;(clause-offsets (cdr (mac-ae-parameter ae "tscl" "ofay")))
1977 (seqno (mac-ae-number ae "tsSn"))
1979 (unless (= seqno mac-ts-update-active-input-area-seqno)
1980 ;; Reset internal states if sequence number is out of sync.
1981 (setq mac-ts-active-input-buf ""))
1983 (mac-ts-update-active-input-buf text fix-len hilite-rng update-rng))
1984 (let ((use-echo-area
1986 (and cursor-in-echo-area (current-message))
1987 ;; Overlay strings are not shown in some cases.
1988 (get-char-property (point) 'display)
1989 (get-char-property (point) 'invisible)
1990 (get-char-property (point) 'composition)))
1991 active-input-string caret-seen)
1992 ;; Decode the active input area text with inheriting faces and
1993 ;; the caret position.
1994 (setq active-input-string
1997 (let ((decoded (mac-utxt-to-string str coding)))
1998 (put-text-property 0 (length decoded) 'face
1999 (get-text-property 0 'face str) decoded)
2000 (when (and (not caret-seen)
2001 (get-text-property 0 'cursor str))
2004 (put-text-property 0 1 'face 'mac-ts-caret-position
2006 (put-text-property 0 1 'cursor t decoded)))
2008 (mac-split-string-by-property-change mac-ts-active-input-buf)
2010 (put-text-property 0 (length active-input-string)
2011 'mac-ts-active-input-string t active-input-string)
2013 (let ((msg (current-message))
2016 ;; Don't get confused by previously displayed
2017 ;; `active-input-string'.
2018 (null (get-text-property 0 'mac-ts-active-input-string
2020 (setq msg (propertize msg 'display
2021 (concat msg active-input-string)))
2022 (setq msg active-input-string))
2024 (overlay-put mac-ts-active-input-overlay 'before-string nil))
2025 (move-overlay mac-ts-active-input-overlay
2026 (point) (point) (current-buffer))
2027 (overlay-put mac-ts-active-input-overlay 'before-string
2028 active-input-string))
2029 ;; Unread confirmed characters and insert them in a keyboard
2030 ;; macro being defined.
2031 (apply 'isearch-unread
2032 (append (mac-replace-untranslated-utf-8-chars
2033 (mac-utxt-to-string confirmed coding)) '())))
2034 ;; The event is successfully processed. Sync the sequence number.
2035 (setq mac-ts-update-active-input-area-seqno (1+ seqno))))
2037 (defun mac-ts-unicode-for-key-event (event)
2038 "Convert Unicode key EVENT to Emacs key events and unread them."
2040 (let* ((ae (mac-event-ae event))
2041 (text (cdr (mac-ae-parameter ae "tstx" "utxt")))
2042 (script-language (mac-ae-script-language ae "tssl"))
2043 (coding (or (cdr (assq (car script-language)
2044 mac-script-code-coding-systems))
2046 ;; Unread characters and insert them in a keyboard macro being
2048 (apply 'isearch-unread
2049 (append (mac-replace-untranslated-utf-8-chars
2050 (mac-utxt-to-string text coding)) '()))))
2052 ;; kEventClassTextInput/kEventTextInputUpdateActiveInputArea
2053 (define-key mac-apple-event-map [text-input update-active-input-area]
2054 'mac-ts-update-active-input-area)
2055 ;; kEventClassTextInput/kEventTextInputUnicodeForKeyEvent
2056 (define-key mac-apple-event-map [text-input unicode-for-key-event]
2057 'mac-ts-unicode-for-key-event)
2060 (defun mac-service-open-file ()
2061 "Open the file specified by the selection value for Services."
2063 (find-file-existing (x-selection-value mac-service-selection)))
2065 (defun mac-service-open-selection ()
2066 "Create a new buffer containing the selection value for Services."
2068 (switch-to-buffer (generate-new-buffer "*untitled*"))
2069 (insert (x-selection-value mac-service-selection))
2071 (save-buffer) ; It pops up the save dialog.
2074 (defun mac-service-mail-selection ()
2075 "Prepare a mail buffer containing the selection value for Services."
2080 (insert (x-selection-value mac-service-selection) "\n"))
2082 (defun mac-service-mail-to ()
2083 "Prepare a mail buffer to be sent to the selection value for Services."
2085 (compose-mail (x-selection-value mac-service-selection)))
2087 (defun mac-service-insert-text ()
2088 "Insert the selection value for Services."
2090 (let ((text (x-selection-value mac-service-selection)))
2091 (if (not buffer-read-only)
2095 (substitute-command-keys
2096 "The text from the Services menu can be accessed with \\[yank]")))))
2098 ;; kEventClassService/kEventServicePaste
2099 (define-key mac-apple-event-map [service paste] 'mac-service-insert-text)
2100 ;; kEventClassService/kEventServicePerform
2101 (define-key mac-apple-event-map [service perform open-file]
2102 'mac-service-open-file)
2103 (define-key mac-apple-event-map [service perform open-selection]
2104 'mac-service-open-selection)
2105 (define-key mac-apple-event-map [service perform mail-selection]
2106 'mac-service-mail-selection)
2107 (define-key mac-apple-event-map [service perform mail-to]
2108 'mac-service-mail-to)
2110 (defun mac-dispatch-apple-event (event)
2111 "Dispatch EVENT according to the keymap `mac-apple-event-map'."
2113 (let* ((binding (lookup-key mac-apple-event-map (mac-event-spec event)))
2114 (ae (mac-event-ae event))
2115 (service-message (and (keymapp binding)
2116 (cdr (mac-ae-parameter ae "svmg")))))
2117 (when service-message
2118 (setq service-message
2119 (intern (decode-coding-string service-message 'utf-8)))
2120 (setq binding (lookup-key binding (vector service-message))))
2121 ;; Replace (cadr event) with a dummy position so that event-start
2123 (setcar (cdr event) (list (selected-window) (point) '(0 . 0) 0))
2124 (if (null (mac-ae-parameter ae 'emacs-suspension-id))
2125 (command-execute binding nil (vector event) t)
2128 (command-execute binding nil (vector event) t)
2129 (mac-resume-apple-event ae))
2131 (mac-ae-set-reply-parameter ae "errs"
2132 (cons "TEXT" (error-message-string err)))
2133 (mac-resume-apple-event ae -10000)))))) ; errAEEventFailed
2135 (define-key special-event-map [mac-apple-event] 'mac-dispatch-apple-event)
2137 ;; Processing of Apple events are deferred at the startup time. For
2138 ;; example, files dropped onto the Emacs application icon can only be
2139 ;; processed when the initial frame has been created: this is where
2140 ;; the files should be opened.
2141 (add-hook 'after-init-hook 'mac-process-deferred-apple-events)
2143 (run-with-idle-timer 5 t 'mac-cleanup-expired-apple-events)
2148 (defcustom mac-dnd-types-alist
2149 '(("furl" . mac-dnd-handle-furl)
2150 ("hfs " . mac-dnd-handle-hfs)
2151 ("utxt" . mac-dnd-insert-utxt)
2152 ("TEXT" . mac-dnd-insert-TEXT)
2153 ("TIFF" . mac-dnd-insert-TIFF))
2154 "Which function to call to handle a drop of that type.
2155 The function takes three arguments, WINDOW, ACTION and DATA.
2156 WINDOW is where the drop occured, ACTION is always `private' on
2157 Mac. DATA is the drop data. Unlike the x-dnd counterpart, the
2158 return value of the function is not significant.
2160 See also `mac-dnd-known-types'."
2165 (defun mac-dnd-handle-furl (window action data)
2166 (dnd-handle-one-url window action (mac-furl-to-string data)))
2168 (defun mac-dnd-handle-hfs (window action data)
2169 ;; struct HFSFlavor {
2171 ;; OSType fileCreator;
2175 (let* ((file-name (mac-coerce-ae-data "fss " (substring data 10)
2176 'undecoded-file-name))
2177 (url (concat "file://"
2178 (mapconcat 'url-hexify-string
2179 (split-string file-name "/") "/"))))
2180 (dnd-handle-one-url window action url)))
2182 (defun mac-dnd-insert-utxt (window action data)
2183 (dnd-insert-text window action (mac-utxt-to-string data)))
2185 (defun mac-dnd-insert-TEXT (window action data)
2186 (dnd-insert-text window action (mac-TEXT-to-string data)))
2188 (defun mac-dnd-insert-TIFF (window action data)
2189 (dnd-insert-text window action (mac-TIFF-to-string data)))
2191 (defun mac-dnd-drop-data (event frame window data type)
2192 (let* ((type-info (assoc type mac-dnd-types-alist))
2193 (handler (cdr type-info))
2195 (w (posn-window (event-start event))))
2197 (if (and (windowp w) (window-live-p w)
2198 (not (window-minibuffer-p w))
2199 (not (window-dedicated-p w)))
2200 ;; If dropping in an ordinary window which we could use,
2201 ;; let dnd-open-file-other-window specify what to do.
2203 (goto-char (posn-point (event-start event)))
2204 (funcall handler window action data))
2205 ;; If we can't display the file here,
2206 ;; make a new window for it.
2207 (let ((dnd-open-file-other-window t))
2208 (select-frame frame)
2209 (funcall handler window action data))))))
2211 (defun mac-dnd-handle-drag-n-drop-event (event)
2212 "Receive drag and drop events."
2214 (let ((window (posn-window (event-start event))))
2215 (when (windowp window) (select-window window))
2216 (dolist (item (mac-ae-list (mac-event-ae event)))
2217 (if (not (equal (car item) "null"))
2218 (mac-dnd-drop-data event (selected-frame) window
2219 (cdr item) (car item)))))
2220 (select-frame-set-input-focus (selected-frame)))
2222 ;;; Do the actual Windows setup here; the above code just defines
2223 ;;; functions and variables that we use now.
2225 (setq command-line-args (x-handle-args command-line-args))
2227 ;;; Make sure we have a valid resource name.
2228 (or (stringp x-resource-name)
2230 (setq x-resource-name (invocation-name))
2232 ;; Change any . or * characters in x-resource-name to hyphens,
2233 ;; so as not to choke when we use it in X resource queries.
2234 (while (setq i (string-match "[.*]" x-resource-name))
2235 (aset x-resource-name i ?-))))
2237 (if (x-display-list)
2238 ;; On Mac OS 8/9, Most coding systems used in code conversion for
2239 ;; font names are not ready at the time when the terminal frame is
2240 ;; created. So we reconstruct font name table for the initial
2242 (mac-clear-font-name-table)
2243 (x-open-connection "Mac"
2244 x-command-line-resources
2245 ;; Exit Emacs with fatal error if this fails.
2248 (setq frame-creation-function 'x-create-frame-with-faces)
2250 (defvar mac-font-encoder-list
2251 '(("mac-roman" mac-roman-encoder
2252 ccl-encode-mac-roman-font "%s")
2253 ("mac-centraleurroman" encode-mac-centraleurroman
2254 ccl-encode-mac-centraleurroman-font "%s ce")
2255 ("mac-cyrillic" encode-mac-cyrillic
2256 ccl-encode-mac-cyrillic-font "%s cy")
2257 ("mac-symbol" mac-symbol-encoder
2258 ccl-encode-mac-symbol-font "symbol")
2259 ("mac-dingbats" mac-dingbats-encoder
2260 ccl-encode-mac-dingbats-font "zapf dingbats")))
2263 (mapcar (lambda (lst) (nth 1 lst)) mac-font-encoder-list))
2266 latin-iso8859-3 latin-iso8859-4
2267 cyrillic-iso8859-5 greek-iso8859-7 hebrew-iso8859-8
2268 latin-iso8859-9 latin-iso8859-14 latin-iso8859-15)))
2269 (dolist (encoder encoder-list)
2270 (let ((table (get encoder 'translation-table)))
2271 (dolist (charset charset-list)
2273 (let* ((c (make-char charset (+ i 32)))
2274 (mu (aref ucs-mule-to-mule-unicode c))
2275 (mac-encoded (and mu (aref table mu))))
2277 (aset table c mac-encoded))))))))
2279 ;; We assume none of official dim2 charsets (0x90..0x99) are encoded
2282 (define-ccl-program ccl-encode-mac-roman-font
2285 (translate-character mac-roman-encoder r0 r1)
2288 (translate-character mac-roman-encoder r0 r1))))
2289 "CCL program for Mac Roman font")
2291 (define-ccl-program ccl-encode-mac-centraleurroman-font
2294 (translate-character encode-mac-centraleurroman r0 r1)
2297 (translate-character encode-mac-centraleurroman r0 r1))))
2298 "CCL program for Mac Central European Roman font")
2300 (define-ccl-program ccl-encode-mac-cyrillic-font
2303 (translate-character encode-mac-cyrillic r0 r1)
2306 (translate-character encode-mac-cyrillic r0 r1))))
2307 "CCL program for Mac Cyrillic font")
2309 (define-ccl-program ccl-encode-mac-symbol-font
2312 (translate-character mac-symbol-encoder r0 r1)
2315 (translate-character mac-symbol-encoder r0 r1))))
2316 "CCL program for Mac Symbol font")
2318 (define-ccl-program ccl-encode-mac-dingbats-font
2321 (translate-character mac-dingbats-encoder r0 r1)
2324 (translate-character mac-dingbats-encoder r0 r1))))
2325 "CCL program for Mac Dingbats font")
2328 (setq font-ccl-encoder-alist
2330 (mapcar (lambda (lst) (cons (nth 0 lst) (nth 2 lst)))
2331 mac-font-encoder-list)
2332 font-ccl-encoder-alist))
2334 (defconst mac-char-fontspec-list
2335 ;; Directly operate on a char-table instead of a fontset so that it
2336 ;; may not create a dummy fontset.
2337 (let ((template (make-char-table 'fontset)))
2341 (mapcar (lambda (lst)
2342 (cons (cons (nth 3 lst) (nth 0 lst)) (nth 1 lst)))
2343 mac-font-encoder-list)))
2344 (let ((font (car font-encoder))
2345 (encoder (cdr font-encoder)))
2349 (generic-char-p key)
2350 (memq (char-charset key)
2351 '(ascii eight-bit-control eight-bit-graphic))
2352 (aset template key font)))
2353 (get encoder 'translation-table))))
2355 ;; Like fontset-info, but extend a range only if its "to" part is
2356 ;; the predecessor of the current char.
2357 (let* ((last '((0 nil)))
2359 last-char-or-range last-char last-elt)
2363 (setq last-char-or-range (car (car last))
2364 last-char (if (consp last-char-or-range)
2365 (cdr last-char-or-range)
2367 last-elt (cdr (car last)))
2368 (if (and (eq elt last-elt)
2369 (= char (1+ last-char))
2370 (eq (char-charset char) (char-charset last-char)))
2371 (if (consp last-char-or-range)
2372 (setcdr last-char-or-range char)
2373 (setcar (car last) (cons last-char char)))
2374 (setcdr last (list (cons char elt)))
2375 (setq last (cdr last)))))
2377 (cdr accumulator))))
2379 (defun fontset-add-mac-fonts (fontset &optional base-family)
2380 "Add font-specs for Mac fonts to FONTSET.
2381 The added font-specs are determined by BASE-FAMILY and the value
2382 of `mac-char-fontspec-list', which is a list
2383 of (CHARACTER-OR-RANGE . (FAMILY-FORMAT . REGISTRY)). If
2384 BASE-FAMILY is nil, the font family in the added font-specs is
2385 also nil. If BASE-FAMILY is a string, `%s' in FAMILY-FORMAT is
2386 replaced with the string. Otherwise, `%s' in FAMILY-FORMAT is
2387 replaced with the ASCII font family name in FONTSET."
2389 (if (stringp base-family)
2390 (setq base-family (downcase base-family))
2391 (let ((ascii-font (fontset-font fontset (charset-id 'ascii))))
2394 (aref (x-decompose-font-name
2395 (downcase (x-resolve-font-name ascii-font)))
2396 xlfd-regexp-family-subnum))))))
2397 (let (fontspec-cache fontspec)
2398 (dolist (char-fontspec mac-char-fontspec-list)
2399 (setq fontspec (cdr (assq (cdr char-fontspec) fontspec-cache)))
2400 (when (null fontspec)
2402 (cons (and base-family
2403 (format (car (cdr char-fontspec)) base-family))
2404 (cdr (cdr char-fontspec))))
2405 (setq fontspec-cache (cons (cons (cdr char-fontspec) fontspec)
2407 (set-fontset-font fontset (car char-fontspec) fontspec))))
2409 (defun create-fontset-from-mac-roman-font (font &optional resolved-font
2411 "Create a fontset from a Mac roman font FONT.
2413 Optional 1st arg RESOLVED-FONT is a resolved name of FONT. If
2414 omitted, `x-resolve-font-name' is called to get the resolved name. At
2415 this time, if FONT is not available, error is signaled.
2417 Optional 2nd arg FONTSET-NAME is a string to be used in
2418 `<CHARSET_ENCODING>' fields of a new fontset name. If it is omitted,
2419 an appropriate name is generated automatically.
2421 It returns a name of the created fontset."
2423 (create-fontset-from-ascii-font font resolved-font fontset-name)))
2424 (fontset-add-mac-fonts fontset t)
2427 ;; Adjust Courier font specifications in x-fixed-font-alist.
2428 (let ((courier-fonts (assoc "Courier" x-fixed-font-alist)))
2430 (dolist (label-fonts (cdr courier-fonts))
2434 (if (string-match "\\`-adobe-courier-\\([^-]*\\)-\\(.\\)-\\(.*\\)-iso8859-1\\'" font)
2436 (if (string= (match-string 2 font) "o")
2437 "-*-courier-\\1-i-\\3-*-*"
2438 "-*-courier-\\1-\\2-\\3-*-*")
2441 (cdr label-fonts))))))
2443 ;; Setup the default fontset.
2444 (setup-default-fontset)
2445 (cond ((x-list-fonts "*-iso10646-1")
2446 ;; Use ATSUI (if available) for the following charsets.
2448 (charset '(latin-iso8859-1
2449 latin-iso8859-2 latin-iso8859-3 latin-iso8859-4
2450 thai-tis620 greek-iso8859-7 arabic-iso8859-6
2451 hebrew-iso8859-8 cyrillic-iso8859-5
2452 latin-iso8859-9 latin-iso8859-15 latin-iso8859-14
2453 japanese-jisx0212 chinese-sisheng ipa
2454 vietnamese-viscii-lower vietnamese-viscii-upper
2455 lao ethiopic tibetan))
2456 (set-fontset-font nil charset '(nil . "iso10646-1"))))
2457 ((null (x-list-fonts "*-iso8859-1"))
2458 ;; Add Mac-encoding fonts unless ETL fonts are installed.
2459 (fontset-add-mac-fonts "fontset-default")))
2461 ;; Create a fontset that uses mac-roman font. With this fontset,
2462 ;; characters decoded from mac-roman encoding (ascii, latin-iso8859-1,
2463 ;; and mule-unicode-xxxx-yyyy) are displayed by a mac-roman font.
2464 (create-fontset-from-fontset-spec
2465 "-etl-fixed-medium-r-normal-*-16-*-*-*-*-*-fontset-standard,
2466 ascii:-*-Monaco-*-*-*-*-12-*-*-*-*-*-mac-roman")
2467 (fontset-add-mac-fonts "fontset-standard" t)
2469 ;; Create fontset specified in X resources "Fontset-N" (N is 0, 1, ...).
2470 (create-fontset-from-x-resource)
2472 ;; Try to create a fontset from a font specification which comes
2473 ;; from initial-frame-alist, default-frame-alist, or X resource.
2474 ;; A font specification in command line argument (i.e. -fn XXXX)
2475 ;; should be already in default-frame-alist as a `font'
2476 ;; parameter. However, any font specifications in site-start
2477 ;; library, user's init file (.emacs), and default.el are not
2478 ;; yet handled here.
2480 (let ((font (or (cdr (assq 'font initial-frame-alist))
2481 (cdr (assq 'font default-frame-alist))
2482 (x-get-resource "font" "Font")))
2483 xlfd-fields resolved-name)
2485 (not (query-fontset font))
2486 (setq resolved-name (x-resolve-font-name font))
2487 (setq xlfd-fields (x-decompose-font-name font)))
2488 (if (string= "fontset" (aref xlfd-fields xlfd-regexp-registry-subnum))
2489 (new-fontset font (x-complement-fontset-spec xlfd-fields nil))
2490 ;; Create a fontset from FONT. The fontset name is
2491 ;; generated from FONT.
2492 (if (and (string= "mac" (aref xlfd-fields xlfd-regexp-registry-subnum))
2493 (string= "roman" (aref xlfd-fields xlfd-regexp-encoding-subnum)))
2494 (create-fontset-from-mac-roman-font font resolved-name "startup")
2495 (create-fontset-from-ascii-font font resolved-name "startup")))))
2497 ;; Apply a geometry resource to the initial frame. Put it at the end
2498 ;; of the alist, so that anything specified on the command line takes
2500 (let* ((res-geometry (x-get-resource "geometry" "Geometry"))
2504 (setq parsed (x-parse-geometry res-geometry))
2505 ;; If the resource specifies a position,
2506 ;; call the position and size "user-specified".
2507 (if (or (assq 'top parsed) (assq 'left parsed))
2508 (setq parsed (cons '(user-position . t)
2509 (cons '(user-size . t) parsed))))
2510 ;; All geometry parms apply to the initial frame.
2511 (setq initial-frame-alist (append initial-frame-alist parsed))
2512 ;; The size parms apply to all frames.
2513 (if (assq 'height parsed)
2514 (setq default-frame-alist
2515 (cons (cons 'height (cdr (assq 'height parsed)))
2516 default-frame-alist)))
2517 (if (assq 'width parsed)
2518 (setq default-frame-alist
2519 (cons (cons 'width (cdr (assq 'width parsed)))
2520 default-frame-alist))))))
2522 ;; Check the reverseVideo resource.
2523 (let ((case-fold-search t))
2524 (let ((rv (x-get-resource "reverseVideo" "ReverseVideo")))
2526 (string-match "^\\(true\\|yes\\|on\\)$" rv))
2527 (setq default-frame-alist
2528 (cons '(reverse . t) default-frame-alist)))))
2530 (defun x-win-suspend-error ()
2531 (error "Suspending an Emacs running under Mac makes no sense"))
2532 (add-hook 'suspend-hook 'x-win-suspend-error)
2534 ;;; Arrange for the kill and yank functions to set and check the clipboard.
2535 (setq interprogram-cut-function 'x-select-text)
2536 (setq interprogram-paste-function 'x-get-selection-value)
2538 (defalias 'x-cut-buffer-or-selection-value 'x-get-selection-value)
2540 ;;; Turn off window-splitting optimization; Mac is usually fast enough
2541 ;;; that this is only annoying.
2542 (setq split-window-keep-point t)
2544 ;; Don't show the frame name; that's redundant.
2545 (setq-default mode-line-frame-identification " ")
2547 ;; Turn on support for mouse wheels.
2548 (mouse-wheel-mode 1)
2551 ;; Enable CLIPBOARD copy/paste through menu bar commands.
2552 (menu-bar-enable-clipboard)
2554 ;; Initiate drag and drop
2556 (global-set-key [drag-n-drop] 'mac-dnd-handle-drag-n-drop-event)
2557 (global-set-key [M-drag-n-drop] 'mac-dnd-handle-drag-n-drop-event)
2560 ;;;; Non-toolkit Scroll bars
2562 (unless x-toolkit-scroll-bars
2565 ;; (defun mac-handle-scroll-bar-event (event) (interactive "e") (princ event))
2567 ;;(global-set-key [vertical-scroll-bar mouse-1] 'mac-handle-scroll-bar-event)
2570 [vertical-scroll-bar down-mouse-1]
2571 'mac-handle-scroll-bar-event)
2573 (global-unset-key [vertical-scroll-bar drag-mouse-1])
2574 (global-unset-key [vertical-scroll-bar mouse-1])
2576 (defun mac-handle-scroll-bar-event (event)
2577 "Handle scroll bar EVENT to emulate Mac Toolbox style scrolling."
2579 (let* ((position (event-start event))
2580 (window (nth 0 position))
2581 (bar-part (nth 4 position)))
2582 (select-window window)
2585 (goto-char (window-start window))
2586 (mac-scroll-down-line))
2587 ((eq bar-part 'above-handle)
2589 ((eq bar-part 'handle)
2590 (scroll-bar-drag event))
2591 ((eq bar-part 'below-handle)
2593 ((eq bar-part 'down)
2594 (goto-char (window-start window))
2595 (mac-scroll-up-line)))))
2597 (defun mac-scroll-ignore-events ()
2598 ;; Ignore confusing non-mouse events
2599 (while (not (memq (car-safe (read-event))
2600 '(mouse-1 double-mouse-1 triple-mouse-1))) nil))
2602 (defun mac-scroll-down ()
2604 (mac-scroll-ignore-events)
2607 (defun mac-scroll-down-line ()
2609 (mac-scroll-ignore-events)
2612 (defun mac-scroll-up ()
2614 (mac-scroll-ignore-events)
2617 (defun mac-scroll-up-line ()
2619 (mac-scroll-ignore-events)
2627 (unless (eq system-type 'darwin)
2628 ;; This variable specifies the Unix program to call (as a process) to
2629 ;; determine the amount of free space on a file system (defaults to
2630 ;; df). If it is not set to nil, ls-lisp will not work correctly
2631 ;; unless an external application df is implemented on the Mac.
2632 (setq directory-free-space-program nil)
2634 ;; Set this so that Emacs calls subprocesses with "sh" as shell to
2635 ;; expand filenames Note no subprocess for the shell is actually
2636 ;; started (see run_mac_command in sysdep.c).
2637 (setq shell-file-name "sh")
2639 ;; Some system variables are encoded with the system script code.
2640 (dolist (v '(system-name
2641 emacs-build-system ; Mac OS 9 version cannot dump
2642 user-login-name user-real-login-name user-full-name))
2643 (set v (decode-coding-string (symbol-value v) mac-system-coding-system))))
2645 ;; Now the default directory is changed to the user's home directory
2646 ;; in emacs.c if invoked from the WindowServer (with -psn_* option).
2647 ;; (if (string= default-directory "/")
2650 ;; Darwin 6- pty breakage is now controlled from the C code so that
2651 ;; it applies to all builds on darwin. See s/darwin.h PTY_ITERATION.
2652 ;; (setq process-connection-type t)
2654 ;; Assume that fonts are always scalable on the Mac. This sometimes
2655 ;; results in characters with jagged edges. However, without it,
2656 ;; fonts with both truetype and bitmap representations but no italic
2657 ;; or bold bitmap versions will not display these variants correctly.
2658 (setq scalable-fonts-allowed t)
2660 ;; arch-tag: 71dfcd14-cde8-4d66-b05c-85ec94fb23a6
2661 ;;; mac-win.el ends here