(undigestify-rmail-message): Better error messages.
[bpt/emacs.git] / lisp / select.el
index f82dc31..0a60b99 100644 (file)
@@ -2,7 +2,7 @@
 
 ;; Keywords: internal
 
-;; Copyright (c) 1993 Free Software Foundation, Inc.
+;; Copyright (c) 1993, 1994 Free Software Foundation, Inc.
 ;; Based partially on earlier release by Lucid.
 
 ;; This file is part of GNU Emacs.
@@ -39,16 +39,20 @@ and the argument DATA-TYPE (default `STRING') says how to convert the data."
   "Make an X Windows selection of type TYPE and value DATA.
 The argument TYPE (default `PRIMARY') says which selection, 
 and DATA specifies the contents.  DATA may be a string,
-a symbol, an integer (or a cons of two integers or list of two integers),
-or a cons of two markers pointing to the same buffer.
-In the last case, the selection is considered to be the text 
-between the markers.
-The data may also be a vector of valid non-vector selection values."
+a symbol, an integer (or a cons of two integers or list of two integers).
+
+The selection may also be a cons of two markers pointing to the same buffer,
+or an overlay.  In these cases, the selection is considered to be the text 
+between the markers *at whatever time the selection is examined*.
+Thus, editing done in the buffer after you specify the selection
+can alter the effective value of the selection.
+
+The data may also be a vector of valid non-vector selection values.
+
+Interactively, the text of the region is used as the selection value."
   (interactive (if (not current-prefix-arg)
-                  (list (read-string "Store text for pasting: "))
-                (list (cons ;; these need not be ordered.
-                       (copy-marker (point-marker))
-                       (copy-marker (mark-marker))))))
+                  (list 'PRIMARY (read-string "Set text for pasting: "))
+                (list 'PRIMARY (substring (region-beginning) (region-end)))))
   ;; This is for temporary compatibility with pre-release Emacs 19.
   (if (stringp type)
       (setq type (intern type)))
@@ -77,8 +81,7 @@ The data may also be a vector of valid non-vector selection values."
           (or (integerp (cdr data))
               (and (consp (cdr data))
                    (integerp (car (cdr data))))))
-;;;   (and (fboundp 'extentp)
-;;;       (extentp data))
+      (overlayp data)
       (and (consp data)
           (markerp (car data))
           (markerp (cdr data))
@@ -102,14 +105,16 @@ Cut buffers are considered obsolete; you should use selections instead."
             which-one)
      'CUT_BUFFER0)))
 
-(defun x-set-cut-buffer (string)
+(defun x-set-cut-buffer (string &optional push)
   "Store STRING into the X server's primary cut buffer.
-The previous value of the primary cut buffer is rotated to the secondary
+If PUSH is non-nil, also rotate the cut buffers:
+this means the previous value of the primary cut buffer moves the second
 cut buffer, and the second to the third, and so on (there are 8 buffers.)
 Cut buffers are considered obsolete; you should use selections instead."
   ;; Check the data type of STRING.
   (substring string 0 0)
-  (x-rotate-cut-buffers-internal 1)
+  (if push
+      (x-rotate-cut-buffers-internal 1))
   (x-store-cut-buffer-internal 'CUT_BUFFER0 string))
 
 \f
@@ -120,11 +125,13 @@ Cut buffers are considered obsolete; you should use selections instead."
 (defun xselect-convert-to-string (selection type value)
   (cond ((stringp value)
         value)
-;;;    ((extentp value)
-;;;     (save-excursion
-;;;       (set-buffer (extent-buffer value))
-;;;       (buffer-substring (extent-start-position value)
-;;;                         (extent-end-position value))))
+       ((overlayp value)
+        (save-excursion
+          (or (buffer-name (overlay-buffer value))
+              (error "selection is in a killed buffer"))
+          (set-buffer (overlay-buffer value))
+          (buffer-substring (overlay-start value)
+                            (overlay-end value))))
        ((and (consp value)
              (markerp (car value))
              (markerp (cdr value)))
@@ -142,8 +149,8 @@ Cut buffers are considered obsolete; you should use selections instead."
   (let ((value
         (cond ((stringp value)
                (length value))
-;;;           ((extentp value)
-;;;            (extent-length value))
+              ((overlayp value)
+               (abs (- (overlay-end value) (overlay-start value))))
               ((and (consp value)
                     (markerp (car value))
                     (markerp (cdr value)))
@@ -178,10 +185,9 @@ Cut buffers are considered obsolete; you should use selections instead."
   'NULL)
 
 (defun xselect-convert-to-filename (selection type value)
-  (cond 
-;;;    ((extentp value)
-;;;     (buffer-file-name (or (extent-buffer value)
-;;;                           (error "selection is in a killed buffer"))))
+  (cond ((overlayp value)
+        (buffer-file-name (or (overlay-buffer value)
+                              (error "selection is in a killed buffer"))))
        ((and (consp value)
              (markerp (car value))
              (markerp (cdr value)))
@@ -191,10 +197,9 @@ Cut buffers are considered obsolete; you should use selections instead."
 
 (defun xselect-convert-to-charpos (selection type value)
   (let (a b tmp)
-    (cond ((cond 
-;;;             ((extentp value)
-;;;              (setq a (extent-start-position value)
-;;;                    b (extent-end-position value)))
+    (cond ((cond ((overlayp value)
+                 (setq a (overlay-start value)
+                       b (overlay-end value)))
                 ((and (consp value)
                       (markerp (car value))
                       (markerp (cdr value)))
@@ -214,10 +219,10 @@ Cut buffers are considered obsolete; you should use selections instead."
                  (setq a (marker-position (car value))
                        b (marker-position (cdr value))
                        buf (marker-buffer (car value))))
-;;;             ((extentp value)
-;;;              (setq buf (extent-buffer value)
-;;;                    a (extent-start-position value)
-;;;                    b (extent-end-position value)))
+                ((overlayp value)
+                 (setq buf (overlay-buffer value)
+                       a (overlay-start value)
+                       b (overlay-end value)))
                 )
           (save-excursion
             (set-buffer buf)
@@ -236,10 +241,10 @@ Cut buffers are considered obsolete; you should use selections instead."
                  (setq a (car value)
                        b (cdr value)
                        buf (marker-buffer a)))
-;;;             ((extentp value)
-;;;              (setq buf (extent-buffer value)
-;;;                    a (extent-start-position value)
-;;;                    b (extent-end-position value)))
+                ((overlayp value)
+                 (setq buf (overlay-buffer value)
+                       a (overlay-start value)
+                       b (overlay-end value)))
                 )
           (save-excursion
             (set-buffer buf)
@@ -262,7 +267,7 @@ Cut buffers are considered obsolete; you should use selections instead."
   (user-full-name))
 
 (defun xselect-convert-to-class (selection type size)
-  x-emacs-application-class)
+  "Emacs")
 
 ;; We do not try to determine the name Emacs was invoked with,
 ;; because it is not clean for a program's behavior to depend on that.