unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: "Chong Yidong" <cyd@stupidchicken.com>
Subject: Mouse Sel mode and mouse-1-click-follows-link
Date: Sun, 8 May 2005 11:09:53 -0400 (EDT)	[thread overview]
Message-ID: <1446.220.255.40.146.1115564993.squirrel@220.255.40.146> (raw)

I've been working on the "Adapt mouse-sel-mode to
mouse-1-click-follows-link" item in FOR-RELEASE.  I have gotten it to work
for clicking on buttons in *Help* and *Info* buffers.  (Double-clicking is
currently not implemented, and seems difficult to implement given how
Mouse Sel mode works.)

The trouble is, I can't get it to work with *Customize* buffers.  This is
probably due to some widget magic that I'm ignorant of.  Can someone help
me figure it out?  (How does the normal mouse.el stuff deal with
Customize?)  The current patch is below.


*** emacs/lisp/mouse-sel.el~	Tue Apr 26 12:37:38 2005
--- emacs/lisp/mouse-sel.el	Sun May  8 22:52:13 2005
***************
*** 465,474 ****

  This should be bound to a down-mouse event."
    (interactive "@e")
!   (let (direction)
      (unwind-protect
! 	(setq direction (mouse-select-internal 'PRIMARY event))
!       (mouse-sel-primary-to-region direction))))

  (defun mouse-select-secondary (event)
    "Set secondary selection using the mouse.
--- 465,476 ----

  This should be bound to a down-mouse event."
    (interactive "@e")
!   (let (select)
      (unwind-protect
!     	(setq select (mouse-select-internal 'PRIMARY event))
!       (if (and select (listp select))
! 	  (push (cons 'mouse-2 (cdr event)) unread-command-events)
! 	(mouse-sel-primary-to-region select)))))

  (defun mouse-select-secondary (event)
    "Set secondary selection using the mouse.
***************
*** 487,493 ****
    (mouse-select-internal 'SECONDARY event))

  (defun mouse-select-internal (selection event)
!   "Set SELECTION using the mouse."
    (mouse-sel-eval-at-event-end event
      (let ((thing-symbol (mouse-sel-selection-thing selection))
  	  (overlay (mouse-sel-selection-overlay selection)))
--- 489,502 ----
    (mouse-select-internal 'SECONDARY event))

  (defun mouse-select-internal (selection event)
!   "Set SELECTION using the mouse, with EVENT as the initial down-event.
! Normally, this returns the direction in which the selection was
! made: a value of 1 indicates that the mouse was dragged
! left-to-right, otherwise it was dragged right-to-left.
!
! However, if `mouse-1-click-follows-link' is non-nil and the
! subsequent mouse events specify following a link, this returns
! the final mouse-event.  In that case, the selection is not set."
    (mouse-sel-eval-at-event-end event
      (let ((thing-symbol (mouse-sel-selection-thing selection))
  	  (overlay (mouse-sel-selection-overlay selection)))
***************
*** 501,507 ****
  			    (car object-bounds) (cdr object-bounds)
  			    (current-buffer)))
  	  (move-overlay overlay (point) (point) (current-buffer)))))
!     (mouse-extend-internal selection)))

  ;;=== Extend ==============================================================

--- 510,517 ----
  			    (car object-bounds) (cdr object-bounds)
  			    (current-buffer)))
  	  (move-overlay overlay (point) (point) (current-buffer)))))
!     (catch 'follow-link
!       (mouse-extend-internal selection event t))))

  ;;=== Extend ==============================================================

***************
*** 523,533 ****
    (save-window-excursion
      (mouse-extend-internal 'SECONDARY event)))

! (defun mouse-extend-internal (selection &optional initial-event)
    "Extend specified SELECTION using the mouse.
  Track mouse-motion events, adjusting the SELECTION appropriately.
! Optional argument INITIAL-EVENT specifies an initial down-mouse event to
! process.

  See documentation for mouse-select-internal for more details."
    (mouse-sel-eval-at-event-end initial-event
--- 533,544 ----
    (save-window-excursion
      (mouse-extend-internal 'SECONDARY event)))

! (defun mouse-extend-internal (selection &optional initial-event no-process)
    "Extend specified SELECTION using the mouse.
  Track mouse-motion events, adjusting the SELECTION appropriately.
! Optional argument INITIAL-EVENT specifies an initial down-mouse event.
! Optional argument NO-PROCESS means not to process the initial
! event.

  See documentation for mouse-select-internal for more details."
    (mouse-sel-eval-at-event-end initial-event
***************
*** 564,570 ****
  	    ;; Handle dragging
  	    (track-mouse

! 	      (while (if initial-event	; Use initial event
  			 (prog1
  			     (setq event initial-event)
  			   (setq initial-event nil))
--- 575,582 ----
  	    ;; Handle dragging
  	    (track-mouse

! 	      (while (if (and initial-event (not no-process))
! 			 ;; Use initial event
  			 (prog1
  			     (setq event initial-event)
  			   (setq initial-event nil))
***************
*** 643,648 ****
--- 655,664 ----

  		  )))			; end track-mouse

+ 	    ;; Detect follow-link events
+ 	    (when (mouse-follow-link-p initial-event event)
+ 	      (throw 'follow-link event))
+
  	    ;; Finish up after dragging
  	    (let ((overlay-start (overlay-start overlay))
  		  (overlay-end (overlay-end overlay)))
***************
*** 678,683 ****
--- 694,718 ----
  	     (selected-frame) (list (cons 'cursor-type orig-cursor-type))))

  	))))
+
+ (defun mouse-follow-link-p (initial final)
+   "Return t if we should follow a link, given INITIAL and FINAL mouse
events.
+ See `mouse-1-click-follows-link' for details.  Currently, Mouse
+ Sel mode does not support using a `double' value to follow links
+ using double-clicks."
+   (and initial final mouse-1-click-follows-link
+        (eq (car initial) 'down-mouse-1)
+        (mouse-on-link-p	(posn-point (event-start initial)))
+        (= (posn-point (event-start initial))
+ 	  (posn-point (event-end final)))
+        (= (event-click-count initial) 1)
+        (or (not (integerp mouse-1-click-follows-link))
+ 	   (let ((t0 (posn-timestamp (event-start initial)))
+ 		 (t1 (posn-timestamp (event-end final))))
+ 	     (and (integerp t0) (integerp t1)
+ 		  (if (> mouse-1-click-follows-link 0)
+ 		      (<= (- t1 t0) mouse-1-click-follows-link)
+ 		    (< (- t0 t1) mouse-1-click-follows-link)))))))

  ;;=== Paste ===============================================================

             reply	other threads:[~2005-05-08 15:09 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-05-08 15:09 Chong Yidong [this message]
2005-05-08 16:55 ` Mouse Sel mode and mouse-1-click-follows-link Luc Teirlinck
2005-05-10 15:43   ` Chong Yidong
2005-05-11 12:40     ` Kim F. Storm
2005-05-11 16:27     ` Richard Stallman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1446.220.255.40.146.1115564993.squirrel@220.255.40.146 \
    --to=cyd@stupidchicken.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).