emacs-devel
[Top][All Lists]
Advanced

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

Re: supporting mouse-entered, mouse-left


From: Stephen J. Turnbull
Subject: Re: supporting mouse-entered, mouse-left
Date: Sat, 01 Aug 2009 13:07:00 +0900

Steve Yegge writes:

 > The mode decorates the source with various text properties to
 > facilitate navigation, outlining, folding, etc.  My goal is to link
 > together all the references to each local variable,

Are you being imprecise here?  Surely you have already done this
"linking" for other reasons?

 > so they light up when you mouse over any of them.

Ie, the only problem you are asking about here is to get the motion
event, and run a hook on that?

 > I can't use track-mouse,

*sigh*

 > or at least I don't think I can, since this feature needs to
 > trigger automatically as you move the mouse (from the idle loop).

Well, even if track-mouse doesn't do exactly what you want, it's not
clear to me that it's unusable.  I can think of two interfaces that
might serve:

(1) a minor mode where a click toggles the highlighting corresponding
    to the js2-mode text properties at the point of the click (no
    motion tracking needed), and

(2) a minor mode which is activated by a click (or popup menu
    selection), after which you can explicitly use track-mouse until
    the next non-motion event or something like that.  I don't think
    this kind of mouse-tracking would require huge amounts of code for
    what you've described, although there are few enough mouse clicks
    that you may already be using them all.

I think you do want some kind of activation, otherwise if any mouse
motion enables the effect we'd have to coin a term "apoplectic fruit
salad".

If you want to test the "any motion" interface now, XEmacs has
`mode-motion-hook' which handles all mouse motion events.  Eg,

(defvar sjt/counter 0)
(add-hook 'mode-motion-hook
          (lambda (ignored)
            (message "got one! (%d)")
            (incf sjt/counter)))

immediately starts counting of motion events.  Unfortunately, your
mode may not work in XEmacs without a fair amount of extra work due to
a lot of divergence in the last couple of years, but you could hack up
a test buffer with appropriate extents and stuff and see whether the
flashing is attractive or distractive.

`mode-motion-hook' is a variable declared in Lisp.
  -- loaded from "/playpen/src/XEmacs/xemacs/+optimized/lisp/mode-motion.elc"

Value: nil

Setting it would make its value buffer-local.

Documentation:
Function or functions which are called whenever the mouse moves.
Each function must take a single argument of the motion event.
You should normally use this rather than `mouse-motion-handler', which 
does some additional window-system-dependent things.  This hook is local
to every buffer, and should normally be set up by major-modes which want
to use special highlighting.  Every time the mouse moves over a window,
the mode-motion-hook of the buffer of that window is run.

 > I'll take a look at implementing it when I get some time.  I just
 > wanted to vet the idea with the list to make sure I wouldn't be
 > wasting my time.

It's been used in Lucid Emacs and XEmacs for over ten and probably
more than 15 years with success.  I see no reason why it shouldn't
be adopted in Emacs as well.





reply via email to

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