diff options
| author | Chong Yidong | 2010-07-02 23:07:48 -0400 |
|---|---|---|
| committer | Chong Yidong | 2010-07-02 23:07:48 -0400 |
| commit | 5592c08fbf5a0ca9f3f7803d2d214a6f6a7097ba (patch) | |
| tree | 75ec04f05724aa16096d9a31a202ff1ddd775377 | |
| parent | 873fbd0b84997863af25e3ddae23b6c078a3e6f5 (diff) | |
| download | emacs-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/ChangeLog | 13 | ||||
| -rw-r--r-- | lisp/mouse-sel.el | 8 | ||||
| -rw-r--r-- | lisp/mouse.el | 357 |
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 @@ | |||
| 1 | 2010-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 | |||
| 1 | 2010-07-02 Juri Linkov <juri@jurta.org> | 14 | 2010-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. |
| 299 | Each element is of the form: | 293 | Each 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. |
| 926 | The region will be defined with mark and point, and the overlay | 904 | The region will be defined with mark and point. |
| 927 | will be deleted after return. DO-MOUSE-DRAG-REGION-POST-PROCESS | 905 | DO-MOUSE-DRAG-REGION-POST-PROCESS should only be used by |
| 928 | should 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. |
| 1317 | Display cursor at that position for a second. | 1207 | Display 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))))))) |