aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChong Yidong2010-07-02 23:07:48 -0400
committerChong Yidong2010-07-02 23:07:48 -0400
commit5592c08fbf5a0ca9f3f7803d2d214a6f6a7097ba (patch)
tree75ec04f05724aa16096d9a31a202ff1ddd775377
parent873fbd0b84997863af25e3ddae23b6c078a3e6f5 (diff)
downloademacs-5592c08fbf5a0ca9f3f7803d2d214a6f6a7097ba.tar.gz
emacs-5592c08fbf5a0ca9f3f7803d2d214a6f6a7097ba.zip
Simplify mouse-dragging implementation.
Now that DEL deletes active regions, we can handle it by using the ordinary region instead of a separate overlay. * mouse.el (mouse-drag-overlay): Variable deleted. (mouse-move-drag-overlay, mouse-show-mark): Functions deleted. (mouse--remap-link-click-p): New function. (mouse-drag-track): Handle dragging by using temporary Transient Mark mode, instead of a special overlay. (mouse-kill-ring-save, mouse-save-then-kill): Don't call mouse-show-mark. * mouse-sel.el (mouse-sel-selection-alist): mouse-drag-overlay deleted.
-rw-r--r--lisp/ChangeLog13
-rw-r--r--lisp/mouse-sel.el8
-rw-r--r--lisp/mouse.el357
3 files changed, 136 insertions, 242 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 98ea609aa82..b087fbb5b8e 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,16 @@
12010-07-03 Chong Yidong <cyd@stupidchicken.com>
2
3 * mouse.el (mouse-drag-overlay): Variable deleted.
4 (mouse-move-drag-overlay, mouse-show-mark): Functions deleted.
5 (mouse--remap-link-click-p): New function.
6 (mouse-drag-track): Handle dragging by using temporary Transient
7 Mark mode, instead of a special overlay.
8 (mouse-kill-ring-save, mouse-save-then-kill): Don't call
9 mouse-show-mark.
10
11 * mouse-sel.el (mouse-sel-selection-alist): mouse-drag-overlay
12 deleted.
13
12010-07-02 Juri Linkov <juri@jurta.org> 142010-07-02 Juri Linkov <juri@jurta.org>
2 15
3 * autoinsert.el (auto-insert-alist): Fix readability 16 * autoinsert.el (auto-insert-alist): Fix readability
diff --git a/lisp/mouse-sel.el b/lisp/mouse-sel.el
index d7f4c9bd222..bd3054a5b94 100644
--- a/lisp/mouse-sel.el
+++ b/lisp/mouse-sel.el
@@ -129,11 +129,6 @@
129;; that the X primary selection is used. Under other windowing systems, 129;; that the X primary selection is used. Under other windowing systems,
130;; alternate functions are used, which simply store the selection value 130;; alternate functions are used, which simply store the selection value
131;; in a variable. 131;; in a variable.
132;;
133;; * You can change the selection highlight face by altering the properties
134;; of mouse-drag-overlay, eg.
135;;
136;; (overlay-put mouse-drag-overlay 'face 'bold)
137 132
138;;; Code: 133;;; Code:
139 134
@@ -293,8 +288,7 @@ primary selection and region."
293 (overlay-put mouse-secondary-overlay 'face 'secondary-selection)) 288 (overlay-put mouse-secondary-overlay 'face 'secondary-selection))
294 289
295(defconst mouse-sel-selection-alist 290(defconst mouse-sel-selection-alist
296 '((PRIMARY mouse-drag-overlay mouse-sel-primary-thing) 291 '((SECONDARY mouse-secondary-overlay mouse-sel-secondary-thing))
297 (SECONDARY mouse-secondary-overlay mouse-sel-secondary-thing))
298 "Alist associating selections with variables. 292 "Alist associating selections with variables.
299Each element is of the form: 293Each element is of the form:
300 294
diff --git a/lisp/mouse.el b/lisp/mouse.el
index f6ff37794a5..f41e7c79b1f 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -772,13 +772,6 @@ Upon exit, point is at the far edge of the newly visible text."
772 (or (eq window (selected-window)) 772 (or (eq window (selected-window))
773 (goto-char opoint)))) 773 (goto-char opoint))))
774 774
775;; Create an overlay and immediately delete it, to get "overlay in no buffer".
776(defconst mouse-drag-overlay
777 (let ((ol (make-overlay (point-min) (point-min))))
778 (delete-overlay ol)
779 (overlay-put ol 'face 'region)
780 ol))
781
782(defvar mouse-selection-click-count 0) 775(defvar mouse-selection-click-count 0)
783 776
784(defvar mouse-selection-click-count-buffer nil) 777(defvar mouse-selection-click-count-buffer nil)
@@ -905,27 +898,12 @@ at the same position."
905 "mouse-1" (substring msg 7))))))) 898 "mouse-1" (substring msg 7)))))))
906 msg) 899 msg)
907 900
908(defun mouse-move-drag-overlay (ol start end mode)
909 (unless (= start end)
910 ;; Go to START first, so that when we move to END, if it's in the middle
911 ;; of intangible text, point jumps in the direction away from START.
912 ;; Don't do it if START=END otherwise a single click risks selecting
913 ;; a region if it's on intangible text. This exception was originally
914 ;; only applied on entry to mouse-drag-region, which had the problem
915 ;; that a tiny move during a single-click would cause the intangible
916 ;; text to be selected.
917 (goto-char start)
918 (goto-char end)
919 (setq end (point)))
920 (let ((range (mouse-start-end start end mode)))
921 (move-overlay ol (car range) (nth 1 range))))
922
923(defun mouse-drag-track (start-event &optional 901(defun mouse-drag-track (start-event &optional
924 do-mouse-drag-region-post-process) 902 do-mouse-drag-region-post-process)
925 "Track mouse drags by highlighting area between point and cursor. 903 "Track mouse drags by highlighting area between point and cursor.
926The region will be defined with mark and point, and the overlay 904The region will be defined with mark and point.
927will be deleted after return. DO-MOUSE-DRAG-REGION-POST-PROCESS 905DO-MOUSE-DRAG-REGION-POST-PROCESS should only be used by
928should only be used by mouse-drag-region." 906`mouse-drag-region'."
929 (mouse-minibuffer-check start-event) 907 (mouse-minibuffer-check start-event)
930 (setq mouse-selection-click-count-buffer (current-buffer)) 908 (setq mouse-selection-click-count-buffer (current-buffer))
931 ;; We must call deactivate-mark before repositioning point. 909 ;; We must call deactivate-mark before repositioning point.
@@ -958,172 +936,133 @@ should only be used by mouse-drag-region."
958 ;; treatment, in case we click on a link inside an 936 ;; treatment, in case we click on a link inside an
959 ;; intangible text. 937 ;; intangible text.
960 (mouse-on-link-p start-posn))) 938 (mouse-on-link-p start-posn)))
961 (click-count (1- (event-click-count start-event)))
962 (remap-double-click (and on-link
963 (eq mouse-1-click-follows-link 'double)
964 (= click-count 1)))
965 ;; Suppress automatic hscrolling, because that is a nuisance 939 ;; Suppress automatic hscrolling, because that is a nuisance
966 ;; when setting point near the right fringe (but see below). 940 ;; when setting point near the right fringe (but see below).
967 (automatic-hscrolling-saved automatic-hscrolling) 941 (automatic-hscrolling-saved automatic-hscrolling)
968 (automatic-hscrolling nil)) 942 (automatic-hscrolling nil)
969 (setq mouse-selection-click-count click-count) 943 event end end-point)
944
945 (setq mouse-selection-click-count (1- (event-click-count start-event)))
970 ;; In case the down click is in the middle of some intangible text, 946 ;; In case the down click is in the middle of some intangible text,
971 ;; use the end of that text, and put it in START-POINT. 947 ;; use the end of that text, and put it in START-POINT.
972 (if (< (point) start-point) 948 (if (< (point) start-point)
973 (goto-char start-point)) 949 (goto-char start-point))
974 (setq start-point (point)) 950 (setq start-point (point))
975 (if remap-double-click ;; Don't expand mouse overlay in links 951
976 (setq click-count 0)) 952 ;; Activate the mark.
977 (mouse-move-drag-overlay mouse-drag-overlay start-point start-point 953 (setq transient-mark-mode
978 click-count) 954 (if (eq transient-mark-mode 'lambda)
979 (overlay-put mouse-drag-overlay 'window start-window) 955 '(only)
980 (let (event end end-point last-end-point) 956 (cons 'only transient-mark-mode)))
981 (track-mouse 957 (push-mark nil nil t)
982 (while (progn 958
983 (setq event (read-event)) 959 ;; Track the mouse until we get a non-movement event.
984 (or (mouse-movement-p event) 960 (track-mouse
985 (memq (car-safe event) '(switch-frame select-window)))) 961 (while (progn
986 (if (memq (car-safe event) '(switch-frame select-window)) 962 (setq event (read-event))
987 nil 963 (or (mouse-movement-p event)
988 ;; Automatic hscrolling did not occur during the call to 964 (memq (car-safe event) '(switch-frame select-window))))
989 ;; `read-event'; but if the user subsequently drags the 965 (unless (memq (car-safe event) '(switch-frame select-window))
990 ;; mouse, go ahead and hscroll. 966 ;; Automatic hscrolling did not occur during the call to
991 (let ((automatic-hscrolling automatic-hscrolling-saved)) 967 ;; `read-event'; but if the user subsequently drags the
992 (redisplay)) 968 ;; mouse, go ahead and hscroll.
993 (setq end (event-end event) 969 (let ((automatic-hscrolling automatic-hscrolling-saved))
994 end-point (posn-point end)) 970 (redisplay))
995 (if (numberp end-point) 971 (setq end (event-end event)
996 (setq last-end-point end-point)) 972 end-point (posn-point end))
997 973 (if (and (eq (posn-window end) start-window)
998 (cond
999 ;; Are we moving within the original window?
1000 ((and (eq (posn-window end) start-window)
1001 (integer-or-marker-p end-point)) 974 (integer-or-marker-p end-point))
1002 (mouse-move-drag-overlay mouse-drag-overlay start-point end-point click-count)) 975 ;; If moving in the original window, move point by going
1003 976 ;; to start first, so that if end is in intangible text,
1004 (t 977 ;; point jumps away from start. Don't do it if
1005 (let ((mouse-row (cdr (cdr (mouse-position))))) 978 ;; start=end, or a single click would select a region if
1006 (cond 979 ;; it's on intangible text.
1007 ((null mouse-row)) 980 (unless (= start-point end-point)
1008 ((< mouse-row top) 981 (goto-char start-point)
1009 (mouse-scroll-subr start-window (- mouse-row top) 982 (goto-char end-point))
1010 mouse-drag-overlay start-point)) 983 (let ((mouse-row (cdr (cdr (mouse-position)))))
1011 ((>= mouse-row bottom) 984 (cond
1012 (mouse-scroll-subr start-window (1+ (- mouse-row bottom)) 985 ((null mouse-row))
1013 mouse-drag-overlay start-point))))))))) 986 ((< mouse-row top)
1014 987 (mouse-scroll-subr start-window (- mouse-row top)
1015 ;; In case we did not get a mouse-motion event 988 nil start-point))
1016 ;; for the final move of the mouse before a drag event 989 ((>= mouse-row bottom)
1017 ;; pretend that we did get one. 990 (mouse-scroll-subr start-window (1+ (- mouse-row bottom))
1018 (when (and (memq 'drag (event-modifiers (car-safe event))) 991 nil start-point))))))))
1019 (setq end (event-end event) 992
1020 end-point (posn-point end)) 993 ;; Handle the terminating event if possible.
994 (when (consp event)
995 ;; Ensure that point is on the end of the last event.
996 (when (and (setq end-point (posn-point (event-end event)))
1021 (eq (posn-window end) start-window) 997 (eq (posn-window end) start-window)
1022 (integer-or-marker-p end-point)) 998 (integer-or-marker-p end-point)
1023 (mouse-move-drag-overlay mouse-drag-overlay start-point end-point click-count)) 999 (/= start-point end-point))
1024 1000 (goto-char start-point)
1025 ;; Handle the terminating event 1001 (goto-char end-point))
1026 (if (consp event) 1002 ;; Find its binding.
1027 (let* ((fun (key-binding (vector (car event)))) 1003 (let* ((fun (key-binding (vector (car event))))
1028 (do-multi-click (and (> (event-click-count event) 0) 1004 (do-multi-click (and (> (event-click-count event) 0)
1029 (functionp fun) 1005 (functionp fun)
1030 (not (memq fun 1006 (not (memq fun '(mouse-set-point
1031 '(mouse-set-point 1007 mouse-set-region))))))
1032 mouse-set-region)))))) 1008 (if (and (/= (mark) (point))
1033 ;; Run the binding of the terminating up-event, if possible. 1009 (not do-multi-click))
1034 (if (and (not (= (overlay-start mouse-drag-overlay) 1010 ;; If point has moved, finish the drag.
1035 (overlay-end mouse-drag-overlay))) 1011 (let* (last-command this-command)
1036 (not do-multi-click)) 1012 ;; Copy the region so that `select-active-regions' can
1037 (let* ((stop-point 1013 ;; override `copy-region-as-kill'.
1038 (if (numberp (posn-point (event-end event))) 1014 (and mouse-drag-copy-region
1039 (posn-point (event-end event)) 1015 do-mouse-drag-region-post-process
1040 last-end-point)) 1016 (let (deactivate-mark)
1041 ;; The end that comes from where we ended the drag. 1017 (copy-region-as-kill (mark) (point)))))
1042 ;; Point goes here. 1018 ;; If point hasn't moved, run the binding of the
1043 (region-termination 1019 ;; terminating up-event.
1044 (if (and stop-point (< stop-point start-point)) 1020 (if do-multi-click (goto-char start-point))
1045 (overlay-start mouse-drag-overlay) 1021 (deactivate-mark)
1046 (overlay-end mouse-drag-overlay))) 1022 (when (and (functionp fun)
1047 ;; The end that comes from where we started the drag. 1023 (= start-hscroll (window-hscroll start-window))
1048 ;; Mark goes there. 1024 ;; Don't run the up-event handler if the window
1049 (region-commencement 1025 ;; start changed in a redisplay after the
1050 (- (+ (overlay-end mouse-drag-overlay) 1026 ;; mouse-set-point for the down-mouse event at
1051 (overlay-start mouse-drag-overlay)) 1027 ;; the beginning of this function. When the
1052 region-termination)) 1028 ;; window start has changed, the up-mouse event
1053 last-command this-command) 1029 ;; contains a different position due to the new
1054 ;; We copy the region before setting the mark so 1030 ;; window contents, and point is set again.
1055 ;; that `select-active-regions' can override 1031 (or end-point
1056 ;; `copy-region-as-kill'. 1032 (= (window-start start-window)
1057 (and mouse-drag-copy-region 1033 start-window-start)))
1058 do-mouse-drag-region-post-process 1034 (when (and on-link
1059 (let (deactivate-mark) 1035 (= start-point (point))
1060 (copy-region-as-kill region-commencement 1036 (mouse--remap-link-click-p start-event event))
1061 region-termination))) 1037 ;; If we rebind to mouse-2, reselect previous selected
1062 (push-mark region-commencement t t) 1038 ;; window, so that the mouse-2 event runs in the same
1063 (goto-char region-termination) 1039 ;; situation as if user had clicked it directly. Fixes
1064 (if (not do-mouse-drag-region-post-process) 1040 ;; the bug reported by juri@jurta.org on 2005-12-27.
1065 ;; Skip all post-event handling, return immediately. 1041 (if (or (vectorp on-link) (stringp on-link))
1066 (delete-overlay mouse-drag-overlay) 1042 (setq event (aref on-link 0))
1067 (let ((buffer (current-buffer))) 1043 (select-window original-window)
1068 (mouse-show-mark) 1044 (setcar event 'mouse-2)
1069 ;; mouse-show-mark can call read-event, 1045 ;; If this mouse click has never been done by the
1070 ;; and that means the Emacs server could switch buffers 1046 ;; user, it doesn't have the necessary property to be
1071 ;; under us. If that happened, 1047 ;; interpreted correctly.
1072 ;; avoid trying to use the region. 1048 (put 'mouse-2 'event-kind 'mouse-click)))
1073 (and (mark t) mark-active 1049 (push event unread-command-events)))))))
1074 (eq buffer (current-buffer)) 1050
1075 (mouse-set-region-1))))) 1051(defun mouse--remap-link-click-p (start-event end-event)
1076 ;; Run the binding of the terminating up-event. 1052 (or (and (eq mouse-1-click-follows-link 'double)
1077 ;; If a multiple click is not bound to mouse-set-point, 1053 (= (event-click-count start-event) 2))
1078 ;; cancel the effects of mouse-move-drag-overlay to 1054 (and
1079 ;; avoid producing wrong results. 1055 (not (eq mouse-1-click-follows-link 'double))
1080 (if do-multi-click (goto-char start-point)) 1056 (= (event-click-count start-event) 1)
1081 (delete-overlay mouse-drag-overlay) 1057 (= (event-click-count end-event) 1)
1082 (when (and (functionp fun) 1058 (or (not (integerp mouse-1-click-follows-link))
1083 (= start-hscroll (window-hscroll start-window)) 1059 (let ((t0 (posn-timestamp (event-start start-event)))
1084 ;; Don't run the up-event handler if the 1060 (t1 (posn-timestamp (event-end end-event))))
1085 ;; window start changed in a redisplay after 1061 (and (integerp t0) (integerp t1)
1086 ;; the mouse-set-point for the down-mouse 1062 (if (> mouse-1-click-follows-link 0)
1087 ;; event at the beginning of this function. 1063 (<= (- t1 t0) mouse-1-click-follows-link)
1088 ;; When the window start has changed, the 1064 (< (- t0 t1) mouse-1-click-follows-link))))))))
1089 ;; up-mouse event will contain a different 1065
1090 ;; position due to the new window contents,
1091 ;; and point is set again.
1092 (or end-point
1093 (= (window-start start-window)
1094 start-window-start)))
1095 (when (and on-link
1096 (or (not end-point) (= end-point start-point))
1097 (consp event)
1098 (or remap-double-click
1099 (and
1100 (not (eq mouse-1-click-follows-link 'double))
1101 (= click-count 0)
1102 (= (event-click-count event) 1)
1103 (or (not (integerp mouse-1-click-follows-link))
1104 (let ((t0 (posn-timestamp (event-start start-event)))
1105 (t1 (posn-timestamp (event-end event))))
1106 (and (integerp t0) (integerp t1)
1107 (if (> mouse-1-click-follows-link 0)
1108 (<= (- t1 t0) mouse-1-click-follows-link)
1109 (< (- t0 t1) mouse-1-click-follows-link))))))))
1110 ;; If we rebind to mouse-2, reselect previous selected window,
1111 ;; so that the mouse-2 event runs in the same
1112 ;; situation as if user had clicked it directly.
1113 ;; Fixes the bug reported by juri@jurta.org on 2005-12-27.
1114 (if (or (vectorp on-link) (stringp on-link))
1115 (setq event (aref on-link 0))
1116 (select-window original-window)
1117 (setcar event 'mouse-2)
1118 ;; If this mouse click has never been done by
1119 ;; the user, it doesn't have the necessary
1120 ;; property to be interpreted correctly.
1121 (put 'mouse-2 'event-kind 'mouse-click)))
1122 (push event unread-command-events))))
1123
1124 ;; Case where the end-event is not a cons cell (it's just a boring
1125 ;; char-key-press).
1126 (delete-overlay mouse-drag-overlay)))))
1127 1066
1128;; Commands to handle xterm-style multiple clicks. 1067;; Commands to handle xterm-style multiple clicks.
1129(defun mouse-skip-word (dir) 1068(defun mouse-skip-word (dir)
@@ -1263,55 +1202,6 @@ If MODE is 2 then do the same for lines."
1263 1202
1264;; Momentarily show where the mark is, if highlighting doesn't show it. 1203;; Momentarily show where the mark is, if highlighting doesn't show it.
1265 1204
1266(defun mouse-show-mark ()
1267 (let ((inhibit-quit t)
1268 (echo-keystrokes 0)
1269 event events key ignore
1270 (x-lost-selection-functions
1271 (when (boundp 'x-lost-selection-functions)
1272 (copy-sequence x-lost-selection-functions))))
1273 (add-hook 'x-lost-selection-functions
1274 (lambda (seltype)
1275 (when (eq seltype 'PRIMARY)
1276 (setq ignore t)
1277 (throw 'mouse-show-mark t))))
1278 (if transient-mark-mode
1279 (delete-overlay mouse-drag-overlay)
1280 (move-overlay mouse-drag-overlay (point) (mark t)))
1281 (catch 'mouse-show-mark
1282 ;; In this loop, execute scroll bar and switch-frame events.
1283 ;; Should we similarly handle `select-window' events? --Stef
1284 ;; Also ignore down-events that are undefined.
1285 (while (progn (setq event (read-event))
1286 (setq events (append events (list event)))
1287 (setq key (apply 'vector events))
1288 (or (and (consp event)
1289 (eq (car event) 'switch-frame))
1290 (and (consp event)
1291 (eq (posn-point (event-end event))
1292 'vertical-scroll-bar))
1293 (and (memq 'down (event-modifiers event))
1294 (not (key-binding key))
1295 (not (mouse-undouble-last-event events)))))
1296 (and (consp event)
1297 (or (eq (car event) 'switch-frame)
1298 (eq (posn-point (event-end event))
1299 'vertical-scroll-bar))
1300 (let ((keys (vector 'vertical-scroll-bar event)))
1301 (and (key-binding keys)
1302 (progn
1303 (call-interactively (key-binding keys)
1304 nil keys)
1305 (setq events nil)))))))
1306 ;; If we lost the selection, just turn off the highlighting.
1307 (unless ignore
1308 ;; Unread the key so it gets executed normally.
1309 (setq unread-command-events
1310 (nconc events unread-command-events)))
1311 (setq quit-flag nil)
1312 (unless transient-mark-mode
1313 (delete-overlay mouse-drag-overlay))))
1314
1315(defun mouse-set-mark (click) 1205(defun mouse-set-mark (click)
1316 "Set mark at the position clicked on with the mouse. 1206 "Set mark at the position clicked on with the mouse.
1317Display cursor at that position for a second. 1207Display cursor at that position for a second.
@@ -1385,8 +1275,7 @@ This does not delete the region; it acts like \\[kill-ring-save]."
1385 (interactive "e") 1275 (interactive "e")
1386 (mouse-set-mark-fast click) 1276 (mouse-set-mark-fast click)
1387 (let (this-command last-command) 1277 (let (this-command last-command)
1388 (kill-ring-save (point) (mark t))) 1278 (kill-ring-save (point) (mark t))))
1389 (mouse-show-mark))
1390 1279
1391;; This function used to delete the text between point and the mouse 1280;; This function used to delete the text between point and the mouse
1392;; whenever it was equal to the front of the kill ring, but some 1281;; whenever it was equal to the front of the kill ring, but some
@@ -1476,8 +1365,7 @@ If you do this twice in the same position, the selection is killed."
1476 (mouse-set-region-1) 1365 (mouse-set-region-1)
1477 ;; Arrange for a repeated mouse-3 to kill this region. 1366 ;; Arrange for a repeated mouse-3 to kill this region.
1478 (setq mouse-save-then-kill-posn 1367 (setq mouse-save-then-kill-posn
1479 (list (car kill-ring) (point) click-posn)) 1368 (list (car kill-ring) (point) click-posn)))
1480 (mouse-show-mark))
1481 ;; If we click this button again without moving it, 1369 ;; If we click this button again without moving it,
1482 ;; that time kill. 1370 ;; that time kill.
1483 (mouse-save-then-kill-delete-region (mark) (point)) 1371 (mouse-save-then-kill-delete-region (mark) (point))
@@ -1521,7 +1409,6 @@ If you do this twice in the same position, the selection is killed."
1521 (goto-char before-scroll)) 1409 (goto-char before-scroll))
1522 (exchange-point-and-mark) ;Why??? --Stef 1410 (exchange-point-and-mark) ;Why??? --Stef
1523 (kill-new (buffer-substring (point) (mark t)))) 1411 (kill-new (buffer-substring (point) (mark t))))
1524 (mouse-show-mark)
1525 (mouse-set-region-1) 1412 (mouse-set-region-1)
1526 (setq mouse-save-then-kill-posn 1413 (setq mouse-save-then-kill-posn
1527 (list (car kill-ring) (point) click-posn))))))) 1414 (list (car kill-ring) (point) click-posn)))))))