From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: David De La Harpe Golden Newsgroups: gmane.emacs.bugs Subject: bug#902: select-active-regions only half-working Date: Sat, 06 Sep 2008 06:53:28 +0100 Message-ID: <48C21AD8.1060505@harpegolden.net> Reply-To: David De La Harpe Golden , 902@emacsbugs.donarmstrong.com NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------060103000303040901090207" X-Trace: ger.gmane.org 1220681268 26151 80.91.229.12 (6 Sep 2008 06:07:48 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sat, 6 Sep 2008 06:07:48 +0000 (UTC) To: submit@emacsbugs.donarmstrong.com Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Sat Sep 06 08:08:43 2008 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1KbqyQ-0005ZP-Uu for geb-bug-gnu-emacs@m.gmane.org; Sat, 06 Sep 2008 08:08:43 +0200 Original-Received: from localhost ([127.0.0.1]:41223 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KbqxR-00068F-4a for geb-bug-gnu-emacs@m.gmane.org; Sat, 06 Sep 2008 02:07:41 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KbqxN-00065c-0O for bug-gnu-emacs@gnu.org; Sat, 06 Sep 2008 02:07:37 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KbqxK-00064j-14 for bug-gnu-emacs@gnu.org; Sat, 06 Sep 2008 02:07:36 -0400 Original-Received: from [199.232.76.173] (port=56032 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KbqxJ-00064g-Tq for bug-gnu-emacs@gnu.org; Sat, 06 Sep 2008 02:07:33 -0400 Original-Received: from rzlab.ucr.edu ([138.23.92.77]:36165) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KbqxJ-0007DN-Ga for bug-gnu-emacs@gnu.org; Sat, 06 Sep 2008 02:07:33 -0400 Original-Received: from rzlab.ucr.edu (rzlab.ucr.edu [127.0.0.1]) by rzlab.ucr.edu (8.13.8/8.13.8/Debian-3) with ESMTP id m8667V8v031556; Fri, 5 Sep 2008 23:07:31 -0700 Original-Received: (from debbugs@localhost) by rzlab.ucr.edu (8.13.8/8.13.8/Submit) id m866034F027816; Fri, 5 Sep 2008 23:00:03 -0700 X-Loop: don@donarmstrong.com Resent-From: David De La Harpe Golden Resent-To: bug-submit-list@donarmstrong.com Resent-CC: Emacs Bugs Resent-Date: Sat, 06 Sep 2008 06:00:02 +0000 Resent-Message-ID: Resent-Sender: don@donarmstrong.com X-Emacs-PR-Message: report 902 X-Emacs-PR-Package: emacs X-Emacs-PR-Keywords: patch Original-Received: via spool by submit@emacsbugs.donarmstrong.com id=B.122068042025981 (code B ref -1); Sat, 06 Sep 2008 06:00:02 +0000 Original-Received: (at submit) by emacsbugs.donarmstrong.com; 6 Sep 2008 05:53:40 +0000 Original-Received: from harpegolden.net (harpegolden.net [65.99.215.13]) by rzlab.ucr.edu (8.13.8/8.13.8/Debian-3) with ESMTP id m865rbGu025975 for ; Fri, 5 Sep 2008 22:53:38 -0700 Original-Received: from golden1.harpegolden.net (unknown [86.45.10.133]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "David De La Harpe Golden", Issuer "David De La Harpe Golden Personal CA rev 3" (verified OK)) by harpegolden.net (Postfix) with ESMTP id 1A01F81DE for ; Sat, 6 Sep 2008 06:53:35 +0100 (IST) User-Agent: Mozilla-Thunderbird 2.0.0.16 (X11/20080724) X-Enigmail-Version: 0.95.0 X-detected-kernel: by monty-python.gnu.org: Linux 2.6 (newer, 3) Resent-Date: Sat, 06 Sep 2008 02:07:36 -0400 X-BeenThere: bug-gnu-emacs@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:20225 Archived-At: This is a multi-part message in MIME format. --------------060103000303040901090207 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Package: emacs Version: 23.0.60 Severity: normal Tags: patch The select-active-regions in-tree does not work in all cases - it works when the region is changed by moving the mark but not when it is changed by certain other means e.g. moving the point with the keyboard. (Workaround: C-x C-x C-x C-x ...). There were a couple of approaches tried a while back (see emacs-devel "Improved X Selections" thread). The idle timer seemed to work best in practice, despite (or because of) "coarse graining" i.e. a bunch of small region changes in a row don't reupdate the selection for each change, only kicks in when emacs has idled. Attached patch is a simple idle-timer based implementation. Concerns here may also apply to the activate-mark-hook (which states in its documentation that it is rerun when region changes). Having that work similarly with the same method would probably mean that active region timer would have to be enabled whenever the mark is active, not just when select-active-regions is on. --------------060103000303040901090207 Content-Type: text/x-patch; name="select-active-regions-by-idle-timer.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="select-active-regions-by-idle-timer.diff" Index: lisp/simple.el =================================================================== RCS file: /sources/emacs/emacs/lisp/simple.el,v retrieving revision 1.945 diff -U 8 -r1.945 simple.el --- lisp/simple.el 15 Aug 2008 00:30:44 -0000 1.945 +++ lisp/simple.el 6 Sep 2008 05:41:14 -0000 @@ -3439,18 +3439,46 @@ (defun activate-mark () "Activate the mark." (when (mark t) (setq mark-active t) (unless transient-mark-mode (setq transient-mark-mode 'lambda)))) +(defvar select-active-regions-timer nil) + +(defvar select-active-regions-last-region-hash nil) + +(defun select-active-regions-maybe-set-selection () + "Implements `select-active-regions', called from idle timer +`select-active-regions-timer'" + (and select-active-regions + (region-active-p) + (> (region-end) (region-beginning)) + (if (or (not select-active-regions-last-region-hash) + (x-selection-owner-p nil)) + (let ((region-hash + (md5 (current-buffer) (region-beginning) + (region-end) nil t))) + (unless (string-equal region-hash + select-active-regions-last-region-hash) + (x-set-selection + nil (buffer-substring (region-beginning) (region-end))) + (setq select-active-regions-last-region-hash + region-hash))) + (setq select-active-regions-last-region-hash nil)))) + (defcustom select-active-regions nil - "If non-nil, an active region automatically becomes the window selection." + "If non-nil, an active region automatically becomes the window selection. + +In conjunction with this, you might want to: +rebind mouse-2 to `mouse-yank-primary', set `x-select-enable-primary' to nil, +set `x-select-enable-clipboard' to non-nil, set `mouse-drag-copy-region' +to nil, and turn on `transient-mark-mode'." :type 'boolean :group 'killing :version "23.1") (defun set-mark (pos) "Set this buffer's mark to POS. Don't use this function! That is to say, don't use this function unless you want the user to see that the mark has moved, and you want the previous @@ -3466,19 +3494,26 @@ store it in a Lisp variable. Example: (let ((beg (point))) (forward-line 1) (delete-region beg (point)))." (if pos (progn (setq mark-active t) (run-hooks 'activate-mark-hook) - (and select-active-regions - (x-set-selection - nil (buffer-substring (region-beginning) (region-end)))) + (if select-active-regions + (progn + (unless select-active-regions-timer + (setq select-active-regions-timer + (run-with-idle-timer + 0.1 t 'select-active-regions-maybe-set-selection))) + (select-active-regions-maybe-set-selection)) + (when select-active-regions-timer + (cancel-timer select-active-regions-timer) + (setq select-active-regions-timer nil))) (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 clear mark-active in any mode. (setq mark-active nil) (run-hooks 'deactivate-mark-hook) (set-marker (mark-marker) nil))) --------------060103000303040901090207 Content-Type: text/plain; name="ChangeLog.select-active-regions-by-idle-timer" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="ChangeLog.select-active-regions-by-idle-timer" 2008-09-06 David De La Harpe Golden * simple.el: idle-timer implementation of select-active-regions --------------060103000303040901090207--