diff options
| author | YAMAMOTO Mitsuharu | 2005-04-24 05:59:52 +0000 |
|---|---|---|
| committer | YAMAMOTO Mitsuharu | 2005-04-24 05:59:52 +0000 |
| commit | 853065b67fa3f52924252eae8beebb224c710de6 (patch) | |
| tree | e14f719da1ce3994eea29acd2ace97baa26b821a | |
| parent | 944cda7903256c077bd928de330706951611b63d (diff) | |
| download | emacs-853065b67fa3f52924252eae8beebb224c710de6.tar.gz emacs-853065b67fa3f52924252eae8beebb224c710de6.zip | |
Require select. Set selection-coding-system to
mac-system-coding-system. Call menu-bar-enable-clipboard.
(x-last-selected-text-clipboard, x-last-selected-text-primary)
(x-select-enable-clipboard): New variables.
(x-select-text, x-get-selection, x-selection-value)
(x-get-selection-value, mac-select-convert-to-string)
(mac-services-open-file, mac-services-open-selection)
(mac-services-insert-text): New functions.
(CLIPBOARD, FIND): Put mac-scrap-name property.
(com.apple.traditional-mac-plain-text, public.utf16-plain-text)
(public.tiff): Put mac-ostype property.
(selection-converter-alist): Add entries for them.
(mac-application-menu-map): New keymap.
(interprogram-cut-function, interprogram-paste-function): Set to
x-select-text and x-get-selection-value, respectively.
(split-window-keep-point): Set to t.
| -rw-r--r-- | lisp/term/mac-win.el | 260 |
1 files changed, 241 insertions, 19 deletions
diff --git a/lisp/term/mac-win.el b/lisp/term/mac-win.el index 7cdaa2b7257..9519dadeed5 100644 --- a/lisp/term/mac-win.el +++ b/lisp/term/mac-win.el | |||
| @@ -74,7 +74,7 @@ | |||
| 74 | (require 'mouse) | 74 | (require 'mouse) |
| 75 | (require 'scroll-bar) | 75 | (require 'scroll-bar) |
| 76 | (require 'faces) | 76 | (require 'faces) |
| 77 | ;;(require 'select) | 77 | (require 'select) |
| 78 | (require 'menu-bar) | 78 | (require 'menu-bar) |
| 79 | (require 'fontset) | 79 | (require 'fontset) |
| 80 | (require 'dnd) | 80 | (require 'dnd) |
| @@ -1143,23 +1143,232 @@ correspoinding TextEncodingBase value." | |||
| 1143 | 1143 | ||
| 1144 | (define-key special-event-map [language-change] 'mac-handle-language-change) | 1144 | (define-key special-event-map [language-change] 'mac-handle-language-change) |
| 1145 | 1145 | ||
| 1146 | ;;;; Selections and cut buffers | 1146 | ;;;; Selections and Services menu |
| 1147 | 1147 | ||
| 1148 | ;; Setup to use the Mac clipboard. The functions mac-cut-function and | 1148 | ;; Setup to use the Mac clipboard. |
| 1149 | ;; mac-paste-function are defined in mac.c. | 1149 | (set-selection-coding-system mac-system-coding-system) |
| 1150 | (set-selection-coding-system 'compound-text-mac) | 1150 | |
| 1151 | 1151 | ;;; We keep track of the last text selected here, so we can check the | |
| 1152 | (setq interprogram-cut-function | 1152 | ;;; current selection against it, and avoid passing back our own text |
| 1153 | '(lambda (str push) | 1153 | ;;; from x-get-selection-value. |
| 1154 | (mac-cut-function | 1154 | (defvar x-last-selected-text-clipboard nil |
| 1155 | (encode-coding-string str selection-coding-system t) push))) | 1155 | "The value of the CLIPBOARD selection last time we selected or |
| 1156 | 1156 | pasted text.") | |
| 1157 | (setq interprogram-paste-function | 1157 | (defvar x-last-selected-text-primary nil |
| 1158 | '(lambda () | 1158 | "The value of the PRIMARY X selection last time we selected or |
| 1159 | (let ((clipboard (mac-paste-function))) | 1159 | pasted text.") |
| 1160 | (if clipboard | 1160 | |
| 1161 | (decode-coding-string clipboard selection-coding-system t))))) | 1161 | (defcustom x-select-enable-clipboard t |
| 1162 | 1162 | "*Non-nil means cutting and pasting uses the clipboard. | |
| 1163 | This is in addition to the primary selection." | ||
| 1164 | :type 'boolean | ||
| 1165 | :group 'killing) | ||
| 1166 | |||
| 1167 | ;;; Make TEXT, a string, the primary X selection. | ||
| 1168 | (defun x-select-text (text &optional push) | ||
| 1169 | (x-set-selection 'PRIMARY text) | ||
| 1170 | (setq x-last-selected-text-primary text) | ||
| 1171 | (when x-select-enable-clipboard | ||
| 1172 | (x-set-selection 'CLIPBOARD text) | ||
| 1173 | (setq x-last-selected-text-clipboard text)) | ||
| 1174 | ) | ||
| 1175 | |||
| 1176 | (defun x-get-selection (&optional type data-type) | ||
| 1177 | "Return the value of a selection. | ||
| 1178 | The argument TYPE (default `PRIMARY') says which selection, | ||
| 1179 | and the argument DATA-TYPE (default `STRING') says | ||
| 1180 | how to convert the data. | ||
| 1181 | |||
| 1182 | TYPE may be any symbol \(but nil stands for `PRIMARY'). However, | ||
| 1183 | only a few symbols are commonly used. They conventionally have | ||
| 1184 | all upper-case names. The most often used ones, in addition to | ||
| 1185 | `PRIMARY', are `SECONDARY' and `CLIPBOARD'. | ||
| 1186 | |||
| 1187 | DATA-TYPE is usually `STRING', but can also be one of the symbols | ||
| 1188 | in `selection-converter-alist', which see." | ||
| 1189 | (let ((data (x-get-selection-internal (or type 'PRIMARY) | ||
| 1190 | (or data-type 'STRING))) | ||
| 1191 | (coding (or next-selection-coding-system | ||
| 1192 | selection-coding-system))) | ||
| 1193 | (when (and (stringp data) | ||
| 1194 | (setq data-type (get-text-property 0 'foreign-selection data))) | ||
| 1195 | (cond ((eq data-type 'public.utf16-plain-text) | ||
| 1196 | (let ((encoded (and (fboundp 'mac-code-convert-string) | ||
| 1197 | (mac-code-convert-string data | ||
| 1198 | 'utf-16 coding)))) | ||
| 1199 | (if encoded | ||
| 1200 | (let ((coding-save last-coding-system-used)) | ||
| 1201 | (setq data (decode-coding-string encoded coding)) | ||
| 1202 | (setq last-coding-system-used coding-save)) | ||
| 1203 | (setq data | ||
| 1204 | (decode-coding-string data 'utf-16))))) | ||
| 1205 | ((eq data-type 'com.apple.traditional-mac-plain-text) | ||
| 1206 | (setq data (decode-coding-string data coding)))) | ||
| 1207 | (put-text-property 0 (length data) 'foreign-selection data-type data)) | ||
| 1208 | data)) | ||
| 1209 | |||
| 1210 | (defun x-selection-value (type) | ||
| 1211 | (let (text tiff-image) | ||
| 1212 | (setq text (condition-case nil | ||
| 1213 | (x-get-selection type 'public.utf16-plain-text) | ||
| 1214 | (error nil))) | ||
| 1215 | (if (not text) | ||
| 1216 | (setq text (condition-case nil | ||
| 1217 | (x-get-selection type | ||
| 1218 | 'com.apple.traditional-mac-plain-text) | ||
| 1219 | (error nil)))) | ||
| 1220 | (if text | ||
| 1221 | (remove-text-properties 0 (length text) '(foreign-selection nil) text)) | ||
| 1222 | (setq tiff-image (condition-case nil | ||
| 1223 | (x-get-selection type 'public.tiff) | ||
| 1224 | (error nil))) | ||
| 1225 | (when tiff-image | ||
| 1226 | (remove-text-properties 0 (length tiff-image) | ||
| 1227 | '(foreign-selection nil) tiff-image) | ||
| 1228 | (setq tiff-image (create-image tiff-image 'tiff t)) | ||
| 1229 | (or text (setq text " ")) | ||
| 1230 | (put-text-property 0 (length text) 'display tiff-image text)) | ||
| 1231 | text)) | ||
| 1232 | |||
| 1233 | ;;; Return the value of the current selection. | ||
| 1234 | ;;; Treat empty strings as if they were unset. | ||
| 1235 | ;;; If this function is called twice and finds the same text, | ||
| 1236 | ;;; it returns nil the second time. This is so that a single | ||
| 1237 | ;;; selection won't be added to the kill ring over and over. | ||
| 1238 | (defun x-get-selection-value () | ||
| 1239 | (let (clip-text primary-text) | ||
| 1240 | (when x-select-enable-clipboard | ||
| 1241 | (setq clip-text (x-selection-value 'CLIPBOARD)) | ||
| 1242 | (if (string= clip-text "") (setq clip-text nil)) | ||
| 1243 | |||
| 1244 | ;; Check the CLIPBOARD selection for 'newness', is it different | ||
| 1245 | ;; from what we remebered them to be last time we did a | ||
| 1246 | ;; cut/paste operation. | ||
| 1247 | (setq clip-text | ||
| 1248 | (cond;; check clipboard | ||
| 1249 | ((or (not clip-text) (string= clip-text "")) | ||
| 1250 | (setq x-last-selected-text-clipboard nil)) | ||
| 1251 | ((eq clip-text x-last-selected-text-clipboard) nil) | ||
| 1252 | ((string= clip-text x-last-selected-text-clipboard) | ||
| 1253 | ;; Record the newer string, | ||
| 1254 | ;; so subsequent calls can use the `eq' test. | ||
| 1255 | (setq x-last-selected-text-clipboard clip-text) | ||
| 1256 | nil) | ||
| 1257 | (t | ||
| 1258 | (setq x-last-selected-text-clipboard clip-text)))) | ||
| 1259 | ) | ||
| 1260 | |||
| 1261 | (setq primary-text (x-selection-value 'PRIMARY)) | ||
| 1262 | ;; Check the PRIMARY selection for 'newness', is it different | ||
| 1263 | ;; from what we remebered them to be last time we did a | ||
| 1264 | ;; cut/paste operation. | ||
| 1265 | (setq primary-text | ||
| 1266 | (cond;; check primary selection | ||
| 1267 | ((or (not primary-text) (string= primary-text "")) | ||
| 1268 | (setq x-last-selected-text-primary nil)) | ||
| 1269 | ((eq primary-text x-last-selected-text-primary) nil) | ||
| 1270 | ((string= primary-text x-last-selected-text-primary) | ||
| 1271 | ;; Record the newer string, | ||
| 1272 | ;; so subsequent calls can use the `eq' test. | ||
| 1273 | (setq x-last-selected-text-primary primary-text) | ||
| 1274 | nil) | ||
| 1275 | (t | ||
| 1276 | (setq x-last-selected-text-primary primary-text)))) | ||
| 1277 | |||
| 1278 | ;; As we have done one selection, clear this now. | ||
| 1279 | (setq next-selection-coding-system nil) | ||
| 1280 | |||
| 1281 | ;; At this point we have recorded the current values for the | ||
| 1282 | ;; selection from clipboard (if we are supposed to) and primary, | ||
| 1283 | ;; So return the first one that has changed (which is the first | ||
| 1284 | ;; non-null one). | ||
| 1285 | (or clip-text primary-text) | ||
| 1286 | )) | ||
| 1287 | |||
| 1288 | (put 'CLIPBOARD 'mac-scrap-name "com.apple.scrap.clipboard") | ||
| 1289 | (if (eq system-type 'darwin) | ||
| 1290 | (put 'FIND 'mac-scrap-name "com.apple.scrap.find")) | ||
| 1291 | (put 'com.apple.traditional-mac-plain-text 'mac-ostype "TEXT") | ||
| 1292 | (put 'public.utf16-plain-text 'mac-ostype "utxt") | ||
| 1293 | (put 'public.tiff 'mac-ostype "TIFF") | ||
| 1294 | |||
| 1295 | (defun mac-select-convert-to-string (selection type value) | ||
| 1296 | (let ((str (cdr (xselect-convert-to-string selection nil value))) | ||
| 1297 | coding) | ||
| 1298 | (setq coding (or next-selection-coding-system selection-coding-system)) | ||
| 1299 | (if coding | ||
| 1300 | (setq coding (coding-system-base coding)) | ||
| 1301 | (setq coding 'raw-text)) | ||
| 1302 | (when str | ||
| 1303 | ;; If TYPE is nil, this is a local request, thus return STR as | ||
| 1304 | ;; is. Otherwise, encode STR. | ||
| 1305 | (if (not type) | ||
| 1306 | str | ||
| 1307 | (let ((inhibit-read-only t)) | ||
| 1308 | (remove-text-properties 0 (length str) '(composition nil) str) | ||
| 1309 | (cond | ||
| 1310 | ((eq type 'public.utf16-plain-text) | ||
| 1311 | (let (s) | ||
| 1312 | (when (and (fboundp 'mac-code-convert-string) | ||
| 1313 | (memq coding (find-coding-systems-string str))) | ||
| 1314 | (setq coding (coding-system-change-eol-conversion coding 'mac)) | ||
| 1315 | (setq s (mac-code-convert-string | ||
| 1316 | (encode-coding-string str coding) | ||
| 1317 | coding 'utf-16))) | ||
| 1318 | (setq str (or s (encode-coding-string str 'utf-16-mac))))) | ||
| 1319 | ((eq type 'com.apple.traditional-mac-plain-text) | ||
| 1320 | (setq coding (coding-system-change-eol-conversion coding 'mac)) | ||
| 1321 | (setq str (encode-coding-string str coding))) | ||
| 1322 | (t | ||
| 1323 | (error "Unknown selection type: %S" type)) | ||
| 1324 | ))) | ||
| 1325 | |||
| 1326 | (setq next-selection-coding-system nil) | ||
| 1327 | (cons type str)))) | ||
| 1328 | |||
| 1329 | (setq selection-converter-alist | ||
| 1330 | (nconc | ||
| 1331 | '((public.utf16-plain-text . mac-select-convert-to-string) | ||
| 1332 | (com.apple.traditional-mac-plain-text . mac-select-convert-to-string) | ||
| 1333 | ;; This is not enabled by default because the `Import Image' | ||
| 1334 | ;; menu makes Emacs crash or hang for unknown reasons. | ||
| 1335 | ;; (public.tiff . nil) | ||
| 1336 | ) | ||
| 1337 | selection-converter-alist)) | ||
| 1338 | |||
| 1339 | (defun mac-services-open-file () | ||
| 1340 | (interactive) | ||
| 1341 | (find-file-existing (x-selection-value mac-services-selection))) | ||
| 1342 | |||
| 1343 | (defun mac-services-open-selection () | ||
| 1344 | (interactive) | ||
| 1345 | (switch-to-buffer (generate-new-buffer "*untitled*")) | ||
| 1346 | (insert (x-selection-value mac-services-selection)) | ||
| 1347 | (sit-for 0) | ||
| 1348 | (save-buffer) ; It pops up the save dialog. | ||
| 1349 | ) | ||
| 1350 | |||
| 1351 | (defun mac-services-insert-text () | ||
| 1352 | (interactive) | ||
| 1353 | (let ((text (x-selection-value mac-services-selection))) | ||
| 1354 | (if (not buffer-read-only) | ||
| 1355 | (insert text) | ||
| 1356 | (kill-new text) | ||
| 1357 | (message | ||
| 1358 | (substitute-command-keys | ||
| 1359 | "The text from the Services menu can be accessed with \\[yank]"))))) | ||
| 1360 | |||
| 1361 | (defvar mac-application-menu-map (make-sparse-keymap)) | ||
| 1362 | (define-key mac-application-menu-map [quit] 'save-buffers-kill-emacs) | ||
| 1363 | (define-key mac-application-menu-map [services perform open-file] | ||
| 1364 | 'mac-services-open-file) | ||
| 1365 | (define-key mac-application-menu-map [services perform open-selection] | ||
| 1366 | 'mac-services-open-selection) | ||
| 1367 | (define-key mac-application-menu-map [services paste] | ||
| 1368 | 'mac-services-insert-text) | ||
| 1369 | (define-key mac-application-menu-map [preferences] 'customize) | ||
| 1370 | (define-key mac-application-menu-map [about] 'display-splash-screen) | ||
| 1371 | (global-set-key [menu-bar application] mac-application-menu-map) | ||
| 1163 | 1372 | ||
| 1164 | ;;; Do the actual Windows setup here; the above code just defines | 1373 | ;;; Do the actual Windows setup here; the above code just defines |
| 1165 | ;;; functions and variables that we use now. | 1374 | ;;; functions and variables that we use now. |
| @@ -1394,7 +1603,7 @@ correspoinding TextEncodingBase value." | |||
| 1394 | '(ascii eight-bit-control eight-bit-graphic)) | 1603 | '(ascii eight-bit-control eight-bit-graphic)) |
| 1395 | (set-fontset-font fontset key font))) | 1604 | (set-fontset-font fontset key font))) |
| 1396 | (get encoder 'translation-table))))) | 1605 | (get encoder 'translation-table))))) |
| 1397 | 1606 | ||
| 1398 | (defun create-fontset-from-mac-roman-font (font &optional resolved-font | 1607 | (defun create-fontset-from-mac-roman-font (font &optional resolved-font |
| 1399 | fontset-name) | 1608 | fontset-name) |
| 1400 | "Create a fontset from a Mac roman font FONT. | 1609 | "Create a fontset from a Mac roman font FONT. |
| @@ -1489,12 +1698,25 @@ ascii:-*-Monaco-*-*-*-*-12-*-*-*-*-*-mac-roman") | |||
| 1489 | (error "Suspending an Emacs running under Mac makes no sense")) | 1698 | (error "Suspending an Emacs running under Mac makes no sense")) |
| 1490 | (add-hook 'suspend-hook 'x-win-suspend-error) | 1699 | (add-hook 'suspend-hook 'x-win-suspend-error) |
| 1491 | 1700 | ||
| 1701 | ;;; Arrange for the kill and yank functions to set and check the clipboard. | ||
| 1702 | (setq interprogram-cut-function 'x-select-text) | ||
| 1703 | (setq interprogram-paste-function 'x-get-selection-value) | ||
| 1704 | |||
| 1705 | |||
| 1706 | ;;; Turn off window-splitting optimization; Mac is usually fast enough | ||
| 1707 | ;;; that this is only annoying. | ||
| 1708 | (setq split-window-keep-point t) | ||
| 1709 | |||
| 1492 | ;; Don't show the frame name; that's redundant. | 1710 | ;; Don't show the frame name; that's redundant. |
| 1493 | (setq-default mode-line-frame-identification " ") | 1711 | (setq-default mode-line-frame-identification " ") |
| 1494 | 1712 | ||
| 1495 | ;; Turn on support for mouse wheels. | 1713 | ;; Turn on support for mouse wheels. |
| 1496 | (mouse-wheel-mode 1) | 1714 | (mouse-wheel-mode 1) |
| 1497 | 1715 | ||
| 1716 | |||
| 1717 | ;; Enable CLIPBOARD copy/paste through menu bar commands. | ||
| 1718 | (menu-bar-enable-clipboard) | ||
| 1719 | |||
| 1498 | (defun mac-drag-n-drop (event) | 1720 | (defun mac-drag-n-drop (event) |
| 1499 | "Edit the files listed in the drag-n-drop EVENT. | 1721 | "Edit the files listed in the drag-n-drop EVENT. |
| 1500 | Switch to a buffer editing the last file dropped." | 1722 | Switch to a buffer editing the last file dropped." |