From c491dd7037811c143fd453722c48f81c4fece58a Mon Sep 17 00:00:00 2001 From: Glenn Morris Date: Wed, 30 Jan 2013 09:14:24 -0800 Subject: [PATCH] mouse-drag-line changes for mouse-1 in header-line * lisp/mouse.el (mouse-drag-line): Avoid pushing same event onto unread-command-events twice in some cases. This tries to implement the 2012-07-26 changes in a different way. Fixes: debbugs:13560 --- lisp/ChangeLog | 6 ++++++ lisp/mouse.el | 59 +++++++++++++++++++++++++++------------------------------- 2 files changed, 33 insertions(+), 32 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index bd8f5c08274..356fe37fb70 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,9 @@ +2013-01-30 Glenn Morris + + * mouse.el (mouse-drag-line): Avoid pushing same event onto + unread-command-events twice in some cases. This tries to implement + the 2012-07-26 changes in a different way. (Bug#13560) + 2013-01-30 Fabián Ezequiel Gallina * progmodes/python.el diff --git a/lisp/mouse.el b/lisp/mouse.el index 538e6a500bb..9c7bf6f9c36 100644 --- a/lisp/mouse.el +++ b/lisp/mouse.el @@ -425,7 +425,7 @@ must be one of the symbols `header', `mode', or `vertical'." (frame-parameters frame))) 'right))) (draggable t) - finished event position growth dragged) + event position growth dragged) (cond ((eq line 'header) ;; Check whether header-line can be dragged at all. @@ -456,39 +456,33 @@ must be one of the symbols `header', `mode', or `vertical'." ;; Start tracking. (track-mouse - ;; Loop reading events and sampling the position of the mouse. - (while (not finished) - (setq event (read-event)) + ;; Loop reading events and sampling the position of the mouse, + ;; until there is a non-mouse-movement event. Also, + ;; scroll-bar-movement events are the same as mouse movement for + ;; our purposes. (Why? -- cyd) + ;; If you change this, check that all of the following still work: + ;; Resizing windows by dragging mode-lines and header lines, + ;; and vertical lines (in windows without scroll bars). + ;; Doing this should not select another window, even if + ;; mouse-autoselect-window is non-nil. + ;; Mouse-1 clicks in Info header lines should advance position + ;; by one node at a time if mouse-1-click-follows-link is non-nil, + ;; otherwise they should just select the window. + (while (progn + (setq event (read-event)) + (memq (car-safe event) + '(mouse-movement scroll-bar-movement + switch-frame select-window))) (setq position (mouse-position)) ;; Do nothing if ;; - there is a switch-frame event. ;; - the mouse isn't in the frame that we started in ;; - the mouse isn't in any Emacs frame - ;; Drag if - ;; - there is a mouse-movement event - ;; - there is a scroll-bar-movement event (Why? -- cyd) - ;; (same as mouse movement for our purposes) - ;; Quit if - ;; - there is a keyboard event or some other unknown event. (cond - ((not (consp event)) - (setq finished t)) ((memq (car event) '(switch-frame select-window)) nil) - ((not (memq (car event) '(mouse-movement scroll-bar-movement))) - (when (consp event) - ;; Do not unread a drag-mouse-1 event to avoid selecting - ;; some other window. For vertical line dragging do not - ;; unread mouse-1 events either (but only if we dragged at - ;; least once to allow mouse-1 clicks get through). - (unless (and dragged - (if (eq line 'vertical) - (memq (car event) '(drag-mouse-1 mouse-1)) - (eq (car event) 'drag-mouse-1))) - (push event unread-command-events))) - (setq finished t)) - ((not (and (eq (car position) frame) - (cadr position))) + ((not (and (eq (car position) frame) + (cadr position))) nil) ((eq line 'vertical) ;; Drag vertical divider. @@ -512,12 +506,13 @@ must be one of the symbols `header', `mode', or `vertical'." growth (- growth))))))) ;; Process the terminating event. - (when (and (mouse-event-p event) on-link (not dragged) - (mouse--remap-link-click-p start-event event)) - ;; If mouse-2 has never been done by the user, it doesn't have - ;; the necessary property to be interpreted correctly. - (put 'mouse-2 'event-kind 'mouse-click) - (setcar event 'mouse-2) + (unless dragged + (when (and (mouse-event-p event) on-link + (mouse--remap-link-click-p start-event event)) + ;; If mouse-2 has never been done by the user, it doesn't have + ;; the necessary property to be interpreted correctly. + (put 'mouse-2 'event-kind 'mouse-click) + (setcar event 'mouse-2)) (push event unread-command-events)))) (defun mouse-drag-mode-line (start-event) -- 2.11.4.GIT