emacs-pretest-bug
[Top][All Lists]
Advanced

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

moving overlay loses its priority?


From: Drew Adams
Subject: moving overlay loses its priority?
Date: Sat, 12 Aug 2006 17:34:13 -0700

I'm not sure this is a bug. It might be user ignorance.

I have an overlay that has priority 1000000. It has both a face and a
mouse-face property. When I place it over a face, it shows up. When I
place it over a mouse-face (e.g. a link in Info), it shows up also
(takes precedence over the link mouse-face), but I notice two things,
which I don't understand:

1. If applied to just part of some text that has a mouse-face text
   property, it takes precedence over the entire string of text with
   that property, not just over the part that has the overlay.

2. If I move the overlay slightly, then it no longer has precedence -
   the text's mouse-face shows again.

Recipe:

1. emacs -Q
2. Load the code below.
3. C-h i, and enter some Info manual.

4. Press and hold mouse-2 on some text in the buffer. You'll see that
   as long as mouse-2 remains pressed, the red overlay is shown over
   the yank-position character. Even if you move the mouse, as long as
   mouse-2 remains pressed, the overlay moves with the mouse position.

5. Press and hold mouse-2 over an Info link. You should see the same
   behavior as with text, because the overlay has identical face and
   mouse-face properties.

What you in fact see is this:

1. The overlay shows on the yank-position character when you first
   press mouse-2, but the entire link mouse-face highlighting
   disappears. That is, there is no highlighting on the link, except
   for the red mouse-2 highlighting of the yank position. I don't
   understand why this happens.

2. If you move the mouse within the link, keeping mouse-2 pressed, the
   text's mouse-face comes back over the entire link - there is no
   tracking of the yank position with the red mouse-face overlay.

The code for mouse-flash-position and mouse-flash-posn-track was
inspired from mouse-drag-region and mouse-drag-track, respectively. I
don't think there is anything in their code that would cause this
behavior, but I'm not 100% sure.

Is this a bug? If not, can you perhaps point out my misunderstanding?
Thx.

-------------8<--------------------------

(global-set-key [down-mouse-2] 'mouse-flash-position)

(defface mouse-flash-position '((t (:background "Red")))
  "*Face used to highlight mouse position temporarily."
  :group 'mouse)

(defconst mouse-flash-posn-overlay
    ;; Create and immediately delete, to get "overlay in no buffer".
  (let ((ol (make-overlay (point-min) (point-min))))
    (delete-overlay ol)
    (overlay-put ol 'face 'mouse-flash-position)
    (overlay-put ol 'mouse-face 'mouse-flash-position)
    (overlay-put ol 'priority 1000000)
    ol)
  "Overlay to highlight current mouse position.")

(defun mouse-move-flash-posn-overlay (ol start end)
  "Move `mouse-flash-posn-overlay' to position END.
START is the position of the start of the current drag operation."
  (unless (= start end)
    ;; Go to START first, so that when we move to END, if it's in the middle
    ;; of intangible text, point jumps in the direction away from START.
    ;; Don't do it if START=END, otherwise a single click risks selecting
    ;; a region if it's on intangible text.  This exception was originally
    ;; only applied on entry to mouse-drag-region, which had the problem
    ;; that a tiny move during a single-click would cause the intangible
    ;; text to be selected.
    (goto-char start)
    (goto-char end)
    (setq end (point)))
  (move-overlay ol end (min (point-max) (1+ end))))

;; Inspired from `mouse-drag-region'.
;;;###autoload
(defun mouse-flash-position (start-event)
  "Highlight the mouse position as you drag the mouse.
This must be bound to a button-down mouse event.  If you bind this to
`down-mouse-2', and `mouse-2' is bound to `mouse-yank-at-click' (the
default), then the yank occurs just before the highlighted character.

If you want to prevent the `mouse-2' up-button yank from taking place,
perhaps because you changed your mind, you can press and hold `C-g'
while releasing the mouse button (press `mouse-2'; drag; press `C-g';
release `mouse-2'; release `C-g')."
  (interactive "e")
  (run-hooks 'mouse-leave-buffer-hook)  ; Let temporary modes such as
isearch turn off.
  (mouse-flash-posn-track start-event))

(defun mouse-flash-posn-track (start-event)
  "Track mouse drags by highlighting the mouse position"
  (mouse-minibuffer-check start-event)
  (let* ((original-window (selected-window))
         (echo-keystrokes 0)
         (start-posn (event-start start-event))
         (start-point (posn-point start-posn))
         (start-window (posn-window start-posn))
         (start-window-start (window-start start-window))
         (start-hscroll (window-hscroll start-window))
         (bounds (window-edges start-window))
         (make-cursor-line-fully-visible nil)
         (top (nth 1 bounds))
         (bottom (if (window-minibuffer-p start-window)
                     (nth 3 bounds)
                   (1- (nth 3 bounds))))) ; 1-: Don't count the mode line.
    (mouse-move-flash-posn-overlay mouse-flash-posn-overlay start-point
start-point)
    (overlay-put mouse-flash-posn-overlay 'window start-window)
    (deactivate-mark)
    (unwind-protect
         (let (event end end-point last-end-point)
           (track-mouse
             (while (progn (setq event (read-event))
                           (or (mouse-movement-p event)
                               (memq (car-safe event) '(switch-frame
select-window))))
               (unless (memq (car-safe event) '(switch-frame select-window))
                 (setq end (event-end event)
                       end-point (posn-point end))
                 (when (numberp end-point) (setq last-end-point end-point))
                 (cond
                   ((and (eq (posn-window end) start-window) ; Moving within
original window.
                         (integer-or-marker-p end-point))
                    (mouse-move-flash-posn-overlay mouse-flash-posn-overlay
                                                   start-point end-point))
                   (t
                    (let ((mouse-row (cddr (mouse-position))))
                      (cond
                        ((null mouse-row))
                        ((< mouse-row top)
                         (mouse-scroll-subr start-window (- mouse-row top)
                                            mouse-flash-posn-overlay
start-point))
                        ((>= mouse-row bottom)
                         (mouse-scroll-subr start-window (1+ (- mouse-row
bottom))
                                            mouse-flash-posn-overlay
start-point)))))))))
           ;; In case we did not get a mouse-motion event for the final move
of
           ;; the mouse before a drag event, pretend that we did get one.
           (when (and (memq 'drag (event-modifiers (car-safe event)))
                      (setq end (event-end event)  end-point (posn-point
end))
                      (eq (posn-window end) start-window)
                      (integer-or-marker-p end-point))
             (mouse-move-flash-posn-overlay mouse-flash-posn-overlay
start-point end-point))
           (when (consp event)          ; Handle the terminating event.
             (let ((fun (key-binding (vector (car event)))))
               ;; Run the binding of the terminating up-event, if possible.
               (let* ((stop-point (if (numberp (posn-point (event-end
event)))
                                      (posn-point (event-end event))
                                    last-end-point))
                      (drag-end (if (and stop-point (< stop-point
start-point))
                                    (overlay-start mouse-flash-posn-overlay)
                                  (overlay-end mouse-flash-posn-overlay)))
                      (drag-start (- (+ (overlay-end
mouse-flash-posn-overlay)
                                        (overlay-start
mouse-flash-posn-overlay))
                                     drag-end))
                      last-command this-command)
                 (delete-overlay mouse-flash-posn-overlay)
                 (when (and (= start-hscroll (window-hscroll start-window))
                            (or end-point
                                (= (window-start start-window)
start-window-start)))
                   (push event unread-command-events))))))
      (delete-overlay mouse-flash-posn-overlay))))

-------------8<--------------------------





In GNU Emacs 22.0.50.1 (i386-msvc-nt5.1.2600)
 of 2006-07-19 on BOS-CTHEWLAP2
X server distributor `Microsoft Corp.', version 5.1.2600
configured using `configure --with-msvc (12.00)'

Important settings:
  value of $LC_ALL: nil
  value of $LC_COLLATE: nil
  value of $LC_CTYPE: nil
  value of $LC_MESSAGES: nil
  value of $LC_MONETARY: nil
  value of $LC_NUMERIC: nil
  value of $LC_TIME: nil
  value of $LANG: ENU
  locale-coding-system: cp1252
  default-enable-multibyte-characters: t

Major mode: Info

Minor modes in effect:
  encoded-kbd-mode: t
  tooltip-mode: t
  tool-bar-mode: t
  mouse-wheel-mode: t
  menu-bar-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  unify-8859-on-encoding-mode: t
  utf-translate-cjk-mode: t
  auto-compression-mode: t
  line-number-mode: t

Recent input:
<mouse-1> <mouse-1> <mouse-1> <mouse-1> <mouse-1> <mouse-1>
<mouse-1> <mouse-1> <mouse-1> <down-mouse-1> <mouse-1>
<help-echo> <down-mouse-1> <down-mouse-1> <mouse-1>
C-x 1 u <help-echo> <down-mouse-1> <mouse-1> C-x b
<return> M-x r e v e r t - b u <return> y e s <return>
C-M-x C-h i <help-echo> <down-mouse-2> <help-echo>
<help-echo> <help-echo> <help-echo> <help-echo> C-g
C-g <C-drag-mouse-2> C-g C-g C-g C-g C-g C-g C-g C-g
C-g C-g C-g C-g <help-echo> <help-echo> <help-echo>
<down-mouse-2> <help-echo> C-g <C-drag-mouse-2> C-g
C-g C-g C-g <help-echo> C-g <help-echo> C-g <help-echo>
C-g C-g C-g C-g C-g C-g C-g C-g C-g C-g C-g <help-echo>
<help-echo> <help-echo> <help-echo> <help-echo> <help-echo>
<menu-bar> <help-menu> <report-emacs-bug>

Recent messages:
Resetting customization items...done
Creating customization setup...done
Loading info...done
Composing main Info directory...done
Mark set
mouse-flash-position
Quit [32 times]
mouse-flash-posn-overlay
Quit [32 times]
Loading emacsbug...done





reply via email to

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