summaryrefslogtreecommitdiff
path: root/lisp/mouse.el
diff options
context:
space:
mode:
authorRichard M. Stallman <rms@gnu.org>1993-06-17 18:17:32 +0000
committerRichard M. Stallman <rms@gnu.org>1993-06-17 18:17:32 +0000
commit728f722e6417705e8532c53644906b40329c7434 (patch)
tree3f4ae348300dd0abcca1036c72c5c98af2a9f0f9 /lisp/mouse.el
parent5b790f05bfae77c6daaf78ad447d37808d9aa989 (diff)
downloademacs-728f722e6417705e8532c53644906b40329c7434.tar.gz
(mouse-start-secondary): New function.
(mouse-set-secondary, mouse-drag-secondary): New functions. (mouse-kill-secondary, mouse-secondary-save-then-kill): New functions.
Diffstat (limited to 'lisp/mouse.el')
-rw-r--r--lisp/mouse.el104
1 files changed, 103 insertions, 1 deletions
diff --git a/lisp/mouse.el b/lisp/mouse.el
index 0bf5ae0c230..51f05e31b5d 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -161,7 +161,7 @@ This must be bound to a button-down mouse event."
(push-mark newmark t t)
;; Turn off the old mark when we set up an empty region.
(setq deactivate-mark t))))
-
+
;; Subroutine: set the mark where CLICK happened,
;; but don't do anything else.
(defun mouse-set-mark-fast (click)
@@ -252,7 +252,109 @@ which prepares for a second click to delete the text."
(mouse-show-mark)
(setq mouse-save-then-kill-posn
(list (car kill-ring) (point) click-posn)))))
+
+(global-set-key [M-mouse-1] 'mouse-start-secondary)
+(global-set-key [M-drag-mouse-1] 'mouse-set-secondary)
+(global-set-key [M-down-mouse-1] 'mouse-drag-secondary)
+(global-set-key [M-mouse-3] 'mouse-secondary-save-then-kill)
+(global-set-key [M-mouse-2] 'mouse-kill-secondary)
+
+;; An overlay which records the current secondary selection
+;; or else is deleted when there is no secondary selection.
+;; May be nil.
+(defvar mouse-secondary-overlay nil)
+
+;; A marker which records the specified first end for a secondary selection.
+;; May be nil.
+(defvar mouse-secondary-start nil)
+
+(defun mouse-start-secondary (click)
+ "Set one end of the secondary selection to the position clicked on.
+Use \\[mouse-secondary-save-then-kill] to set the other end
+and complete the secondary selection."
+ (interactive "e")
+ (let ((posn (event-start click)))
+ (select-window (posn-window posn))
+ ;; Cancel any preexisting secondary selection.
+ (if mouse-secondary-overlay
+ (delete-overlay mouse-secondary-overlay))
+ (if (numberp (posn-point posn))
+ (progn
+ (or mouse-secondary-start
+ (setq mouse-secondary-start (make-marker)))
+ (move-marker mouse-secondary-start (posn-point posn))))))
+
+(defun mouse-set-secondary (click)
+ "Set the secondary selection to the text that the mouse is dragged over.
+This must be bound to a mouse drag event."
+ (interactive "e")
+ (let ((posn (event-start click))
+ beg
+ (end (event-end click)))
+ (select-window (posn-window posn))
+ (if (numberp (posn-point posn))
+ (setq beg (posn-point posn)))
+ (if mouse-secondary-overlay
+ (move-overlay mouse-secondary-overlay beg (posn-point end))
+ (setq mouse-secondary-overlay (make-overlay beg (posn-point end))))
+ (overlay-put mouse-secondary-overlay 'face 'secondary-selection)))
+
+(defun mouse-drag-secondary (click)
+ "Set the secondary selection to the text that the mouse is dragged over.
+This must be bound to a button-down mouse event."
+ (interactive "e")
+ (let ((posn (event-start click)))
+ (select-window (posn-window posn))
+ ;; Set point temporarily, so user sees where it is.
+ (if (numberp (posn-point posn))
+ (goto-char (posn-point posn)))))
+(defun mouse-kill-secondary ()
+ "Kill the text in the secondary selection."
+ (interactive "*")
+ (kill-region (overlay-start mouse-secondary-overlay)
+ (overlay-end mouse-secondary-overlay))
+ (delete-overlay mouse-secondary-overlay)
+ (setq mouse-secondary-overlay nil))
+
+(defun mouse-secondary-save-then-kill (click)
+ "Save text to secondary start point in kill ring; if twice, kill it.
+If the text between secondary start point and the mouse is the same as what's
+at the front of the kill ring, this deletes the text.
+Otherwise, it adds the text to the kill ring, like \\[kill-ring-save],
+which prepares for a second click to delete the text."
+ (interactive "e")
+ (let ((click-posn (posn-point (event-start click)))
+ (start (+ 0 mouse-secondary-start))
+ ;; Don't let a subsequent kill command append to this one:
+ ;; prevent setting this-command to kill-region.
+ (this-command this-command))
+ (if (and (eq last-command 'mouse-secondary-save-then-kill)
+ mouse-save-then-kill-posn
+ (eq (car mouse-save-then-kill-posn) (car kill-ring))
+ (equal (cdr mouse-save-then-kill-posn)
+ (list start click-posn)))
+ ;; If this is the second time we've called
+ ;; mouse-save-then-kill, delete the text from the buffer.
+ (progn
+ (let ((buffer-undo-list t))
+ (delete-overlay mouse-secondary-overlay)
+ (delete-region start click-posn))
+ ;; Make the undo list by hand so it is shared.
+ (if (not (eq buffer-undo-list t))
+ (setq buffer-undo-list
+ (cons (cons (car kill-ring) start)
+ buffer-undo-list))))
+ ;; Otherwise, save this region.
+ (select-window (posn-window (event-start click)))
+ (kill-ring-save start click-posn)
+ (if mouse-secondary-overlay
+ (move-overlay mouse-secondary-overlay start click-posn)
+ (setq mouse-secondary-overlay (make-overlay start click-posn)))
+ (overlay-put mouse-secondary-overlay 'face 'secondary-selection)
+ (setq mouse-save-then-kill-posn
+ (list (car kill-ring) start click-posn)))))
+
(defun mouse-buffer-menu (event)
"Pop up a menu of buffers for selection with the mouse.
This switches buffers in the window that you clicked on,