emacs-diffs
[Top][All Lists]
Advanced

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

[Emacs-diffs] master edd0938: Don't block changes in mouse pointer insid


From: Eli Zaretskii
Subject: [Emacs-diffs] master edd0938: Don't block changes in mouse pointer inside 'track-mouse'
Date: Tue, 30 Jun 2015 15:59:53 +0000

branch: master
commit edd09381c618125d8aa23c9414034fbeee176305
Author: Eli Zaretskii <address@hidden>
Commit: Eli Zaretskii <address@hidden>

    Don't block changes in mouse pointer inside 'track-mouse'
    
    * etc/NEWS:
    * doc/lispref/frames.texi (Mouse Tracking): Document the special
    effect of setting 'track-mouse' to 'dragging'.
    
    * lisp/textmodes/artist.el (artist-mouse-draw-continously):
    * lisp/ruler-mode.el (ruler-mode-mouse-drag-any-column-iteration):
    * lisp/mouse-drag.el (mouse-drag-throw):
    * lisp/mouse.el (mouse-drag-line): Set 'track-mouse' to 'dragging'
    to avoid changes in the shape of the mouse pointer.
    
    * src/xdisp.c (define_frame_cursor1): Don't change the mouse
    pointer shape when do_mouse_tracking has the value of 'dragging',
    not just any non-nil value.  (Bug#20934)
    (syms_of_xdisp): DEFSYM 'dragging'.
---
 doc/lispref/frames.texi  |   13 +++++++++++++
 etc/NEWS                 |    9 +++++++++
 lisp/mouse-drag.el       |    2 ++
 lisp/mouse.el            |    6 ++++--
 lisp/ruler-mode.el       |    2 ++
 lisp/textmodes/artist.el |    3 +++
 src/xdisp.c              |    4 +++-
 7 files changed, 36 insertions(+), 3 deletions(-)

diff --git a/doc/lispref/frames.texi b/doc/lispref/frames.texi
index ddf81f3..79b5172 100644
--- a/doc/lispref/frames.texi
+++ b/doc/lispref/frames.texi
@@ -2018,6 +2018,19 @@ The value of @code{track-mouse} is that of the last form 
in @var{body}.
 You should design @var{body} to return when it sees the up-event that
 indicates the release of the button, or whatever kind of event means
 it is time to stop tracking.
+
+The @code{track-mouse} form causes Emacs to generate mouse motion
+events by binding the variable @code{mouse-tracking} to a
address@hidden value.  If that variable has the special value
address@hidden, it additionally instructs the display engine to
+refrain from changing the shape of the mouse pointer.  This is
+desirable in Lisp programs that require mouse dragging across large
+portions of Emacs display, which might otherwise cause the mouse
+pointer to change its shape according to the display portion it hovers
+on (@pxref{Pointer Shape}).  Therefore, Lisp programs that need the
+mouse pointer to retain its original shape during dragging should bind
address@hidden to the value @code{dragging} at the beginning of
+their @var{body}.
 @end defspec
 
 The usual purpose of tracking mouse motion is to indicate on the screen
diff --git a/etc/NEWS b/etc/NEWS
index 1f8cbbc..389de16 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -815,6 +815,15 @@ This means that you can't use `make-local-variable' and 
expect them to
 
 ** `inhibit-point-motion-hooks' now defaults to t and is obsolete.
 
++++
+** `track-mouse' no longer freezes the shape of the mouse pointer.
+The `track-mouse' form no longer refrains from changing the shape of
+the mouse pointer for the entire time the body of that form is
+executed.  Lisp programs that use `track-mouse' for dragging across
+large portions of the Emacs display, and want to avoid changes in the
+pointer shape during dragging, should bind the variable `track-mouse'
+to the special value `dragging' in the body of the form.
+
 ** The optional `predicate' argument of `lisp-complete-symbol' no longer
 has any effect.  (This change was made in Emacs 24.4 but was not
 advertised at the time.)
diff --git a/lisp/mouse-drag.el b/lisp/mouse-drag.el
index 88838ed..945c305 100644
--- a/lisp/mouse-drag.el
+++ b/lisp/mouse-drag.el
@@ -222,6 +222,8 @@ To test this function, evaluate:
         (col-scrolling-p (mouse-drag-should-do-col-scrolling)))
     (select-window start-window)
     (track-mouse
+      ;; Don't change the mouse pointer shape while we drag.
+      (setq track-mouse 'dragging)
       (while (progn
               (setq event (read-event)
                     end (event-end event)
diff --git a/lisp/mouse.el b/lisp/mouse.el
index 7854d32..9bb00cb 100644
--- a/lisp/mouse.el
+++ b/lisp/mouse.el
@@ -468,8 +468,10 @@ must be one of the symbols `header', `mode', or 
`vertical'."
                  (setq dragged t)
                  (adjust-window-trailing-edge window growth nil t))
                (setq last-position position))))))
-      ;; Start tracking.
-      (setq track-mouse t)
+      ;; Start tracking.  The special value 'dragging' signals the
+      ;; display engine to freeze the mouse pointer shape for as long
+      ;; as we drag.
+      (setq track-mouse 'dragging)
       ;; Loop reading events and sampling the position of the mouse.
       (setq exitfun
            (set-transient-map
diff --git a/lisp/ruler-mode.el b/lisp/ruler-mode.el
index f0b012e..4f68909 100644
--- a/lisp/ruler-mode.el
+++ b/lisp/ruler-mode.el
@@ -437,6 +437,8 @@ the mouse has been clicked."
   (let ((drags 0)
         event)
     (track-mouse
+      ;; Signal the display engine to freeze the mouse pointer shape.
+      (setq track-mouse 'dragging)
       (while (mouse-movement-p (setq event (read-event)))
         (setq drags (1+ drags))
         (when (eq window (posn-window (event-end event)))
diff --git a/lisp/textmodes/artist.el b/lisp/textmodes/artist.el
index 14cf402..a29418e 100644
--- a/lisp/textmodes/artist.el
+++ b/lisp/textmodes/artist.el
@@ -4965,6 +4965,9 @@ The event, EV, is the mouse event."
        (artist-no-rb-set-point1 x1 y1))
     (unwind-protect
         (track-mouse
+          ;; We don't want flickering of mouse pointer shape while we
+          ;; drag the mouse.
+          (setq track-mouse 'dragging)
           (while (or (mouse-movement-p ev)
                      (member 'down (event-modifiers ev)))
             (setq ev-start-pos (artist-coord-win-to-buf
diff --git a/src/xdisp.c b/src/xdisp.c
index 25eed01..5bef44c 100644
--- a/src/xdisp.c
+++ b/src/xdisp.c
@@ -29105,7 +29105,7 @@ static void
 define_frame_cursor1 (struct frame *f, Cursor cursor, Lisp_Object pointer)
 {
   /* Do not change cursor shape while dragging mouse.  */
-  if (!NILP (do_mouse_tracking))
+  if (EQ (do_mouse_tracking, Qdragging))
     return;
 
   if (!NILP (pointer))
@@ -30727,6 +30727,8 @@ They are still logged to the *Messages* buffer.  */);
   DEFSYM (Qarrow, "arrow");
   /* also Qtext */
 
+  DEFSYM (Qdragging, "dragging");
+
   DEFSYM (Qinhibit_free_realized_faces, "inhibit-free-realized-faces");
 
   list_of_error = list1 (list2 (Qerror, Qvoid_variable));



reply via email to

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