diff options
| author | Pavel Janík | 2002-04-24 13:18:27 +0000 |
|---|---|---|
| committer | Pavel Janík | 2002-04-24 13:18:27 +0000 |
| commit | ae10d597315bc9a42ed533df5513193dfee677a9 (patch) | |
| tree | 06ea23c73a7a5b4a1a7f4a95c65f44497b0ab11e /lisp | |
| parent | f7c5994deb832886c5bf808494335a0cb29ae84b (diff) | |
| download | emacs-ae10d597315bc9a42ed533df5513193dfee677a9.tar.gz emacs-ae10d597315bc9a42ed533df5513193dfee677a9.zip | |
(x-select-text, x-cut-buffer-or-selection-value): Check if any of the
available selection sources has new content and if so it will return that
content.
Diffstat (limited to 'lisp')
| -rw-r--r-- | lisp/ChangeLog | 6 | ||||
| -rw-r--r-- | lisp/term/x-win.el | 138 |
2 files changed, 113 insertions, 31 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog index c2d67ad0e1a..f2484da6e97 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog | |||
| @@ -1,3 +1,9 @@ | |||
| 1 | 2002-04-24 Thomas DeWeese <tdeweese@rochester.rr.com> | ||
| 2 | |||
| 3 | * term/x-win.el (x-select-text, x-cut-buffer-or-selection-value): | ||
| 4 | Check if any of the available selection sources has new content | ||
| 5 | and if so it will return that content. | ||
| 6 | |||
| 1 | 2002-04-24 Miles Bader <miles@gnu.org> | 7 | 2002-04-24 Miles Bader <miles@gnu.org> |
| 2 | 8 | ||
| 3 | * menu-bar.el (buffers-menu-show-directories) | 9 | * menu-bar.el (buffers-menu-show-directories) |
diff --git a/lisp/term/x-win.el b/lisp/term/x-win.el index 2e09c327a07..4d19d33d580 100644 --- a/lisp/term/x-win.el +++ b/lisp/term/x-win.el | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | ;;; x-win.el --- parse switches controlling interface with X window system | 1 | ;;; x-win.el --- parse switches controlling interface with X window system |
| 2 | 2 | ||
| 3 | ;; Copyright (C) 1993, 1994, 2001 Free Software Foundation, Inc. | 3 | ;; Copyright (C) 1993, 1994, 2001, 2002 Free Software Foundation, Inc. |
| 4 | 4 | ||
| 5 | ;; Author: FSF | 5 | ;; Author: FSF |
| 6 | ;; Keywords: terminals | 6 | ;; Keywords: terminals |
| @@ -1266,8 +1266,19 @@ as returned by (x-server-vendor)." | |||
| 1266 | 1266 | ||
| 1267 | ;;; We keep track of the last text selected here, so we can check the | 1267 | ;;; We keep track of the last text selected here, so we can check the |
| 1268 | ;;; current selection against it, and avoid passing back our own text | 1268 | ;;; current selection against it, and avoid passing back our own text |
| 1269 | ;;; from x-cut-buffer-or-selection-value. | 1269 | ;;; from x-cut-buffer-or-selection-value. We track all three |
| 1270 | (defvar x-last-selected-text nil) | 1270 | ;;; seperately in case another X application only sets one of them |
| 1271 | ;;; (say the the cut buffer) we aren't fooled by the PRIMARY or | ||
| 1272 | ;;; CLIPBOARD selection staying the same. | ||
| 1273 | (defvar x-last-selected-text-clipboard nil | ||
| 1274 | "The value of the CLIPBOARD X selection last time we selected or | ||
| 1275 | pasted text.") | ||
| 1276 | (defvar x-last-selected-text-primary nil | ||
| 1277 | "The value of the PRIMARY X selection last time we selected or | ||
| 1278 | pasted text.") | ||
| 1279 | (defvar x-last-selected-text-cut nil | ||
| 1280 | "The vaue of the X cut buffer last time we selected or | ||
| 1281 | pasted text.") | ||
| 1271 | 1282 | ||
| 1272 | ;;; It is said that overlarge strings are slow to put into the cut buffer. | 1283 | ;;; It is said that overlarge strings are slow to put into the cut buffer. |
| 1273 | ;;; Note this value is overridden below. | 1284 | ;;; Note this value is overridden below. |
| @@ -1288,56 +1299,121 @@ This is in addition to, but in preference to, the primary selection." | |||
| 1288 | (defun x-select-text (text &optional push) | 1299 | (defun x-select-text (text &optional push) |
| 1289 | ;; Don't send the cut buffer too much text. | 1300 | ;; Don't send the cut buffer too much text. |
| 1290 | ;; It becomes slow, and if really big it causes errors. | 1301 | ;; It becomes slow, and if really big it causes errors. |
| 1291 | (if (< (length text) x-cut-buffer-max) | 1302 | (cond ((>= (length text) x-cut-buffer-max) |
| 1303 | (x-set-cut-buffer "" push) | ||
| 1304 | (setq x-last-selected-text-cut "")) | ||
| 1305 | (t | ||
| 1292 | (x-set-cut-buffer text push) | 1306 | (x-set-cut-buffer text push) |
| 1293 | (x-set-cut-buffer "" push)) | 1307 | (setq x-last-selected-text-cut text))) |
| 1294 | (x-set-selection 'PRIMARY text) | 1308 | (x-set-selection 'PRIMARY text) |
| 1295 | (if x-select-enable-clipboard | 1309 | (setq x-last-selected-text-primary text) |
| 1296 | (x-set-selection 'CLIPBOARD text)) | 1310 | (when x-select-enable-clipboard |
| 1297 | (setq x-last-selected-text text)) | 1311 | (x-set-selection 'CLIPBOARD text) |
| 1312 | (setq x-last-selected-text-clipboard text)) | ||
| 1313 | ) | ||
| 1298 | 1314 | ||
| 1299 | ;;; Return the value of the current X selection. | 1315 | ;;; Return the value of the current X selection. |
| 1300 | ;;; Consult the selection, then the cut buffer. Treat empty strings | 1316 | ;;; Consult the selection, and the cut buffer. Treat empty strings |
| 1301 | ;;; as if they were unset. | 1317 | ;;; as if they were unset. |
| 1302 | ;;; If this function is called twice and finds the same text, | 1318 | ;;; If this function is called twice and finds the same text, |
| 1303 | ;;; it returns nil the second time. This is so that a single | 1319 | ;;; it returns nil the second time. This is so that a single |
| 1304 | ;;; selection won't be added to the kill ring over and over. | 1320 | ;;; selection won't be added to the kill ring over and over. |
| 1305 | (defun x-cut-buffer-or-selection-value () | 1321 | (defun x-cut-buffer-or-selection-value () |
| 1306 | (let (text) | 1322 | (let (clip-text primary-text cut-text) |
| 1307 | (when x-select-enable-clipboard | 1323 | (when x-select-enable-clipboard |
| 1308 | (if (null text) | 1324 | ;; Don't die if x-get-selection signals an error. |
| 1325 | (if (null clip-text) | ||
| 1309 | (condition-case c | 1326 | (condition-case c |
| 1310 | (setq text (x-get-selection 'CLIPBOARD 'COMPOUND_TEXT)) | 1327 | (setq clip-text (x-get-selection 'CLIPBOARD 'COMPOUND_TEXT)) |
| 1311 | (error nil))) | 1328 | (error nil))) |
| 1312 | (if (null text) | 1329 | (if (null clip-text) |
| 1313 | (condition-case c | 1330 | (condition-case c |
| 1314 | (setq text (x-get-selection 'CLIPBOARD 'STRING)) | 1331 | (setq clip-text (x-get-selection 'CLIPBOARD 'STRING)) |
| 1315 | (error nil))) | 1332 | (error nil))) |
| 1316 | (if (string= text "") (setq text nil))) | 1333 | (if (string= clip-text "") (setq clip-text nil)) |
| 1334 | |||
| 1335 | ;; Check the CLIPBOARD selection for 'newness', is it different | ||
| 1336 | ;; from what we remebered them to be last time we did a | ||
| 1337 | ;; cut/paste operation. | ||
| 1338 | (setq clip-text | ||
| 1339 | (cond;; check clipboard | ||
| 1340 | ((or (not clip-text) (string= clip-text "")) | ||
| 1341 | (setq x-last-selected-text-clipboard nil)) | ||
| 1342 | ((eq clip-text x-last-selected-text-clipboard) nil) | ||
| 1343 | ((string= clip-text x-last-selected-text-clipboard) | ||
| 1344 | ;; Record the newer string, | ||
| 1345 | ;; so subsequent calls can use the `eq' test. | ||
| 1346 | (setq x-last-selected-text-clipboard clip-text) | ||
| 1347 | nil) | ||
| 1348 | (t | ||
| 1349 | (setq x-last-selected-text-clipboard clip-text)))) | ||
| 1350 | ) | ||
| 1317 | 1351 | ||
| 1318 | ;; Don't die if x-get-selection signals an error. | 1352 | ;; Don't die if x-get-selection signals an error. |
| 1319 | (if (null text) | 1353 | (if (null primary-text) |
| 1320 | (condition-case c | 1354 | (condition-case c |
| 1321 | (setq text (x-get-selection 'PRIMARY 'COMPOUND_TEXT)) | 1355 | (setq primary-text (x-get-selection 'PRIMARY 'COMPOUND_TEXT)) |
| 1322 | (error nil))) | 1356 | (error nil))) |
| 1323 | (if (null text) | 1357 | (if (null primary-text) |
| 1324 | (condition-case c | 1358 | (condition-case c |
| 1325 | (setq text (x-get-selection 'PRIMARY 'STRING)) | 1359 | (setq primary-text (x-get-selection 'PRIMARY 'STRING)) |
| 1326 | (error nil))) | 1360 | (error nil))) |
| 1327 | (if (string= text "") (setq text nil)) | 1361 | ;; Check the PRIMARY selection for 'newness', is it different |
| 1328 | 1362 | ;; from what we remebered them to be last time we did a | |
| 1329 | (or text (setq text (x-get-cut-buffer 0))) | 1363 | ;; cut/paste operation. |
| 1330 | (if (string= text "") (setq text nil)) | 1364 | (setq primary-text |
| 1331 | 1365 | (cond;; check primary selection | |
| 1332 | (cond | 1366 | ((or (not primary-text) (string= primary-text "")) |
| 1333 | ((not text) nil) | 1367 | (setq x-last-selected-text-primary nil)) |
| 1334 | ((eq text x-last-selected-text) nil) | 1368 | ((eq primary-text x-last-selected-text-primary) nil) |
| 1335 | ((string= text x-last-selected-text) | 1369 | ((string= primary-text x-last-selected-text-primary) |
| 1336 | ;; Record the newer string, so subsequent calls can use the `eq' test. | 1370 | ;; Record the newer string, |
| 1337 | (setq x-last-selected-text text) | 1371 | ;; so subsequent calls can use the `eq' test. |
| 1372 | (setq x-last-selected-text-primary primary-text) | ||
| 1373 | nil) | ||
| 1374 | (t | ||
| 1375 | (setq x-last-selected-text-primary primary-text)))) | ||
| 1376 | |||
| 1377 | (setq cut-text (x-get-cut-buffer 0)) | ||
| 1378 | |||
| 1379 | ;; Check the x cut buffer for 'newness', is it different | ||
| 1380 | ;; from what we remebered them to be last time we did a | ||
| 1381 | ;; cut/paste operation. | ||
| 1382 | (setq cut-text | ||
| 1383 | (cond;; check primary selection | ||
| 1384 | ((or (not cut-text) (string= cut-text "")) | ||
| 1385 | (setq x-last-selected-text-cut nil)) | ||
| 1386 | ((eq cut-text x-last-selected-text-cut) nil) | ||
| 1387 | ((string= cut-text x-last-selected-text-cut) | ||
| 1388 | ;; Record the newer string, | ||
| 1389 | ;; so subsequent calls can use the `eq' test. | ||
| 1390 | (setq x-last-selected-text-cut cut-text) | ||
| 1338 | nil) | 1391 | nil) |
| 1339 | (t | 1392 | (t |
| 1340 | (setq x-last-selected-text text))))) | 1393 | (setq x-last-selected-text-cut cut-text)))) |
| 1394 | |||
| 1395 | ;; At this point we have recorded the current values for the | ||
| 1396 | ;; selection from clipboard (if we are supposed to) primary, | ||
| 1397 | ;; and cut buffer. So return the first one that has changed | ||
| 1398 | ;; (which is the first non-null one). | ||
| 1399 | ;; | ||
| 1400 | ;; NOTE: There will be cases where more than one of these has | ||
| 1401 | ;; changed and the new values differ. This indicates that | ||
| 1402 | ;; something like the following has happened since the last time | ||
| 1403 | ;; we looked at the selections: Application X set all the | ||
| 1404 | ;; selections, then Application Y set only one or two of them (say | ||
| 1405 | ;; just the cut-buffer). In this case since we don't have | ||
| 1406 | ;; timestamps there is no way to know what the 'correct' value to | ||
| 1407 | ;; return is. The nice thing to do would be to tell the user we | ||
| 1408 | ;; saw multiple possible selections and ask the user which was the | ||
| 1409 | ;; one they wanted. | ||
| 1410 | ;; This code is still a big improvement because now the user can | ||
| 1411 | ;; futz with the current selection and get emacs to pay attention | ||
| 1412 | ;; to the cut buffer again (previously as soon as clipboard or | ||
| 1413 | ;; primary had been set the cut buffer would essentially never be | ||
| 1414 | ;; checked again). | ||
| 1415 | (or clip-text primary-text cut-text) | ||
| 1416 | )) | ||
| 1341 | 1417 | ||
| 1342 | 1418 | ||
| 1343 | ;;; Do the actual X Windows setup here; the above code just defines | 1419 | ;;; Do the actual X Windows setup here; the above code just defines |