[Top][All Lists]
[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
- moving overlay loses its priority?,
Drew Adams <=