From: Chong Yidong Date: Fri, 17 Jul 2009 15:45:08 +0000 (+0000) Subject: * w32-fns.el (x-selection-owner-p): New function. X-Git-Tag: emacs-pretest-23.1.90~2133 X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=3f5c9cad1790b08f123b2bf81aa090b23e416f25;p=emacs.git * w32-fns.el (x-selection-owner-p): New function. * mouse.el (mouse-drag-track): Call deactivate-mark earlier. (mouse-yank-at-click): If select-active-regions is non-nil, deactivate the mark before insertion. * simple.el (deactivate-mark, set-mark): Only save selection if we own it. --- diff --git a/lisp/ChangeLog b/lisp/ChangeLog index b17cac00cd6..e3a342032a2 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,14 @@ +2009-07-17 David De La Harpe Golden + + * w32-fns.el (x-selection-owner-p): New function. + + * mouse.el (mouse-drag-track): Call deactivate-mark earlier. + (mouse-yank-at-click): If select-active-regions is non-nil, + deactivate the mark before insertion. + + * simple.el (deactivate-mark, set-mark): Only save selection if we + own it. + 2009-07-17 Kenichi Handa * case-table.el (describe-buffer-case-table): Fix for the case diff --git a/lisp/mouse.el b/lisp/mouse.el index 03f73ba8d9c..7b7f6927deb 100644 --- a/lisp/mouse.el +++ b/lisp/mouse.el @@ -927,6 +927,11 @@ will be deleted after return. DO-MOUSE-DRAG-REGION-POST-PROCESS should only be used by mouse-drag-region." (mouse-minibuffer-check start-event) (setq mouse-selection-click-count-buffer (current-buffer)) + ;; We must call deactivate-mark before repositioning point. + ;; Otherwise, for select-active-regions non-nil, we get the wrong + ;; selection if the user drags a region, clicks elsewhere to + ;; reposition point, then middle-clicks to paste the selection. + (deactivate-mark) (let* ((original-window (selected-window)) ;; We've recorded what we needed from the current buffer and ;; window, now let's jump to the place of the event, where things @@ -971,7 +976,6 @@ should only be used by mouse-drag-region." (mouse-move-drag-overlay mouse-drag-overlay start-point start-point click-count) (overlay-put mouse-drag-overlay 'window start-window) - (deactivate-mark) (let (event end end-point last-end-point) (track-mouse (while (progn @@ -1360,10 +1364,16 @@ Also move point to one end of the text thus inserted (normally the end), and set mark at the beginning. Prefix arguments are interpreted as with \\[yank]. If `mouse-yank-at-point' is non-nil, insert at point -regardless of where you click." +regardless of where you click. +If `select-active-regions' is non-nil, the mark is deactivated +before inserting the text." (interactive "e\nP") ;; Give temporary modes such as isearch a chance to turn off. (run-hooks 'mouse-leave-buffer-hook) + (when select-active-regions + ;; Without this, confusing things happen upon e.g. inserting into + ;; the middle of an active region. + (deactivate-mark t)) (or mouse-yank-at-point (mouse-set-point click)) (setq this-command 'yank) (setq mouse-selection-click-count 0) diff --git a/lisp/simple.el b/lisp/simple.el index 959076b11cb..1e0f83152cf 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -3489,6 +3489,7 @@ This function also runs `deactivate-mark-hook'." ;; Copy the latest region into the primary selection, if desired. (and select-active-regions mark-active + (x-selection-owner-p 'PRIMARY) (x-set-selection 'PRIMARY (buffer-substring-no-properties (region-beginning) (region-end)))) (if (and (null force) @@ -3533,8 +3534,12 @@ store it in a Lisp variable. Example: (progn (setq mark-active t) (run-hooks 'activate-mark-hook) - (when select-active-regions - (x-set-selection 'PRIMARY (current-buffer))) + (and select-active-regions + ;; Only set the selection if we already own PRIMARY. The + ;; initial selection grab happens in `activate-mark', but + ;; it is necessary to update it here. + (x-selection-owner-p 'PRIMARY) + (x-set-selection 'PRIMARY (current-buffer))) (set-marker (mark-marker) pos (current-buffer))) ;; Normally we never clear mark-active except in Transient Mark mode. ;; But when we actually clear out the mark value too, we must diff --git a/lisp/w32-fns.el b/lisp/w32-fns.el index 379dd63eb17..c0aab365070 100644 --- a/lisp/w32-fns.el +++ b/lisp/w32-fns.el @@ -294,12 +294,15 @@ shell requires it (see `w32-shell-dos-semantics')." ;;; Fix interface to (X-specific) mouse.el (defun x-set-selection (type data) - (or type (setq type 'PRIMARY)) - (put 'x-selections type data)) + (put 'x-selections (or type 'PRIMARY) data)) (defun x-get-selection (&optional type data-type) - (or type (setq type 'PRIMARY)) - (get 'x-selections type)) + (get 'x-selections (or type 'PRIMARY))) + +;; x-selection-owner-p is used in simple.el +(defun x-selection-owner-p (&optional type) + (and (memq type '(nil PRIMARY SECONDARY)) + (get 'x-selections (or type 'PRIMARY)))) (defun set-w32-system-coding-system (coding-system) "Set the coding system used by the Windows system to CODING-SYSTEM.