GNU bug report logs - #6256
24.0.50; read-event in `repeat' command

Previous Next

Package: emacs;

Reported by: "Drew Adams" <drew.adams <at> oracle.com>

Date: Mon, 24 May 2010 15:13:02 UTC

Severity: normal

Found in version 24.0.50

Done: Stefan Monnier <monnier <at> iro.umontreal.ca>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: "Drew Adams" <drew.adams <at> oracle.com>
To: "'Stefan Monnier'" <monnier <at> IRO.UMontreal.CA>
Cc: 6256 <at> debbugs.gnu.org
Subject: bug#6256: 24.0.50; read-event in `repeat' command
Date: Tue, 19 Oct 2010 15:17:45 -0700
> > 3. Your current read-key fix for `repeat' does not work in Emacs 23,
> > whereas my fix using read-event does work.
> 
> I did not understand that from your answer and I'm very 
> surprised, since
> AFAIK this part of Emacs hasn't changed significantly.  In 
> any case I've
> only tested it under Emacs-23 (yup, that's a 3 there).
> 
> > But maybe I will be if I understand its advantages.  What was your
> > objection to the solution I provided using `read-event'?  You never
> > stated it, IIRC.
> 
> Your characterization of what works and what doesn't makes no sense to
> me (based on my understand of what the code does, and based on my
> tests), so I used the code that I know to work and I understand why.
> 
> Since you say it doesn't work for you, please follow my advice:
> 
>    Please confirm whether or not it fixes it
>    for you, and if it doesn't, please show me the values of
>    `repeat-repeat-char' and `evt' in the above test.
> 
> because without that info from your tests, I can't help you 
> much further.

I tried debugging it that way.  I added this just after the (let ((evt
(read-key))), that is BEFORE the `and' test of the `while':
(message "EVT: %S, R-R-CHAR: %S" evt repeat-repeat-char)

In my own Emacs setup (which has lots of stuff in it) `C-x p wheel-down' moves
correctly to the first bookmark, but then subsequent wheel-downs just start
scrolling the window.  IOW, `repeat' is exited immediately - there is no
repetition at all.

And because it exits immediately _no_ debug message appears in *Messages*.  That
tells me that it exited during `read-key', not because the event/key tested did
not match (`while' test = nil).  Apparently `read-key' itself exits out to the
`unwind-protect' protection code in this scenario.

I tried fiddling with `read-key-delay' but that didn't help. I used 3 bookmarks,
all in the same buffer, so there should be no switch-frame events interfering
anywhere.  I do use a standalone minibuffer in my setup, and that sometimes
causes `handle-switch-frame' events to happen in places one might not expect.
But I don't think that is happening here (we are not even using the minibuffer,
and everything should be taking place in the same frame).  Dunno what is causing
the problem.


In emacs -Q, however, with just the Bookmark+ files loaded, I do not see the
problem.  That is presumably what you are seeing.

The only way I see a problem then (without my setup) is if I rotate the wheel
more rapidly.  That is no doubt because it gets a `double-wheel-down' or
`triple-wheel-down' event instead of a `wheel-down' event.  I haven't bound
those events specifically to the bookmark-cycling command, but I could do so to
get around that (assuming that's the cause).  For the same reason, I can see
that same rapid-rotation problem with the fix I sent.  This rapid-rotation
behavior is not an issue, for me.

The issue is the behavior I see when I use my own setup, and I cannot begin to
pare things down from that setup to determine just what else might be involved.

Presumably the bad behavior has something to do with how `read-key' works -
something is apparently causing it to barf, but how `read-key' works is unclear
to me.  I hope that you (who wrote it) can figure out or guess what's happening
here.

I would have guessed that if there were a problem it would have occurred because
`read-key' did not return an event/key that matched - like the problem with the
original code and with the `read-char-exclusive' attempt I made first to fix it.
But no, it never even got to the `and' test of the `while': it seems to have
exited during `read-key'.

Perhaps you can suggest something I can do to determine what is happening that
causes it (presumably) to exit the `while' during the `read-key', jumping out to
the `unwind-protect'.  Is there some debug message I can put at the beginning of
the the `unwind-protect' protection code to see what happened?  Can I put some
debug stuff into `read-key'?

Coming back to my question -

I see no problems at all when I instead use the solution I sent, which uses
read-event instead of read-key.  It just works.

You still have not said anything about what's wrong with that solution.  If your
read-key solution worked I would not hesitate to say fine, let's go with it -
believe me.  But it doesn't.  If we can figure it out and fix it, I'm OK with
that.

I'm willing to try to help determine what's going wrong with the `read-key'
approach, if we can do that by just debugging the `repeat' code (as opposed to
my trying to narrow down my setup).

Again (coming back to my question), this is what I suggested:

(while (let ((evt  (read-event)))
         (and (equal (event-basic-type evt)
                     (event-basic-type repeat-repeat-char))
              (equal (event-modifiers evt)
                     (event-modifiers repeat-repeat-char))))
  (repeat repeat-arg))

It's pretty simple.  It also seems logical, and it says just what we want to be
done: if the event's components are all the same as before then repeat.  Dunno
why you have a problem with this.  What problems do you see with this approach?





This bug report was last modified 14 years and 271 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.