emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Mouse Sel mode and mouse-1-click-follows-link


From: Chong Yidong
Subject: Mouse Sel mode and mouse-1-click-follows-link
Date: Sun, 8 May 2005 11:09:53 -0400 (EDT)
User-agent: SquirrelMail/1.4.3a

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 via email to

[Prev in Thread] Current Thread [Next in Thread]