* Strange behavior of C-u in the presence of sit-for in p-c-h
@ 2006-10-14 16:44 Stefan Monnier
2006-10-16 13:50 ` Richard Stallman
0 siblings, 1 reply; 25+ messages in thread
From: Stefan Monnier @ 2006-10-14 16:44 UTC (permalink / raw)
Try the following:
emacs -Q --eval "(add-hook 'post-command-hook (lambda () (sit-for 0.5)))"
you'll notice that all works apparently well, except that if you hit the
universal prefix C-u, then any key pressed before the 0.5s delay will
be ignored, and after the 0.5s delay you end up with "C-u-" in the
echo area.
Stefan
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-14 16:44 Strange behavior of C-u in the presence of sit-for in p-c-h Stefan Monnier
@ 2006-10-16 13:50 ` Richard Stallman
2006-10-16 16:04 ` Stefan Monnier
0 siblings, 1 reply; 25+ messages in thread
From: Richard Stallman @ 2006-10-16 13:50 UTC (permalink / raw)
Cc: emacs-devel
Can you debug this?
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-16 13:50 ` Richard Stallman
@ 2006-10-16 16:04 ` Stefan Monnier
2006-10-17 6:54 ` Richard Stallman
0 siblings, 1 reply; 25+ messages in thread
From: Stefan Monnier @ 2006-10-16 16:04 UTC (permalink / raw)
Cc: emacs-devel
> Can you debug this?
I don't have time right now. I looked at it briefly and decided it wasn't
obvious enough. I must say I haven't followed the fit-for development close
enough to have a good feel for what the problem may be.
Stefan
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-16 16:04 ` Stefan Monnier
@ 2006-10-17 6:54 ` Richard Stallman
2006-10-17 14:50 ` Chong Yidong
0 siblings, 1 reply; 25+ messages in thread
From: Richard Stallman @ 2006-10-17 6:54 UTC (permalink / raw)
Cc: emacs-devel
Can someone else please debug this?
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-17 6:54 ` Richard Stallman
@ 2006-10-17 14:50 ` Chong Yidong
2006-10-17 21:11 ` Chong Yidong
` (2 more replies)
0 siblings, 3 replies; 25+ messages in thread
From: Chong Yidong @ 2006-10-17 14:50 UTC (permalink / raw)
Cc: Stefan Monnier, emacs-devel
Here is an easy way to reproduce the underlying bug:
(defun foo ()
(interactive)
(universal-argument)
(push ?a unread-command-events))
M-x foo RET
The expected result is aaaa, but in fact nothing is printed.
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-17 14:50 ` Chong Yidong
@ 2006-10-17 21:11 ` Chong Yidong
2006-10-17 22:12 ` Stefan Monnier
2006-10-18 1:57 ` Stefan Monnier
2006-10-19 21:09 ` Kim F. Storm
2006-10-19 21:09 ` Kim F. Storm
2 siblings, 2 replies; 25+ messages in thread
From: Chong Yidong @ 2006-10-17 21:11 UTC (permalink / raw)
Cc: Stefan Monnier, emacs-devel
Chong Yidong <cyd@stupidchicken.com> writes:
> Here is an easy way to reproduce the underlying bug:
>
> (defun foo ()
> (interactive)
> (universal-argument)
> (push ?a unread-command-events))
>
> M-x foo RET
>
> The expected result is aaaa, but in fact nothing is printed.
The problem here is that C-u works through the command
`universal-argument-other-key', which sets prefix-arg and then adds
(this-command-keys) to unread-command-events so that it is executed
with that prefix argument.
This normally works ok. However, suppose the call to
read_key_sequence in the command loop takes its input from
unread-command-events. (This happens if the input came during a
sit-for in post-command-hook, as in Stefan's original example, or
directly as in the example above.) This kind of "reread input" is
explicitly *not* added to this_command_keys. The rationale for this
is not clear to me, but there may be a good reason since the code
explicitly checks for this; see keyboard.c:789. Then
`universal-argument-other-key' can't see that input.
OTOH, I don't see a safe way of fixing this. Any suggestions?
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-17 21:11 ` Chong Yidong
@ 2006-10-17 22:12 ` Stefan Monnier
2006-10-17 22:18 ` Chong Yidong
2006-10-18 1:57 ` Stefan Monnier
1 sibling, 1 reply; 25+ messages in thread
From: Stefan Monnier @ 2006-10-17 22:12 UTC (permalink / raw)
Cc: rms, emacs-devel
> This normally works ok. However, suppose the call to
> read_key_sequence in the command loop takes its input from
> unread-command-events. (This happens if the input came during a
> sit-for in post-command-hook, as in Stefan's original example, or
> directly as in the example above.) This kind of "reread input" is
> explicitly *not* added to this_command_keys. The rationale for this
> is not clear to me, but there may be a good reason since the code
> explicitly checks for this; see keyboard.c:789. Then
> `universal-argument-other-key' can't see that input.
I think I understand, but I can't find the code in keyboard.c.
Do you really mean "line 789"? Of which revision?
Stefan
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-17 22:12 ` Stefan Monnier
@ 2006-10-17 22:18 ` Chong Yidong
0 siblings, 0 replies; 25+ messages in thread
From: Chong Yidong @ 2006-10-17 22:18 UTC (permalink / raw)
Cc: rms, emacs-devel
Stefan Monnier <monnier@iro.umontreal.ca> writes:
>> This normally works ok. However, suppose the call to
>> read_key_sequence in the command loop takes its input from
>> unread-command-events. (This happens if the input came during a
>> sit-for in post-command-hook, as in Stefan's original example, or
>> directly as in the example above.) This kind of "reread input" is
>> explicitly *not* added to this_command_keys. The rationale for this
>> is not clear to me, but there may be a good reason since the code
>> explicitly checks for this; see keyboard.c:789. Then
>> `universal-argument-other-key' can't see that input.
>
> I think I understand, but I can't find the code in keyboard.c.
> Do you really mean "line 789"? Of which revision?
Sorry; by 789, I mean 3262 :-P
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-17 21:11 ` Chong Yidong
2006-10-17 22:12 ` Stefan Monnier
@ 2006-10-18 1:57 ` Stefan Monnier
2006-10-18 2:19 ` Chong Yidong
2006-10-18 17:54 ` Richard Stallman
1 sibling, 2 replies; 25+ messages in thread
From: Stefan Monnier @ 2006-10-18 1:57 UTC (permalink / raw)
Cc: rms, emacs-devel
> This normally works ok. However, suppose the call to
> read_key_sequence in the command loop takes its input from
> unread-command-events. (This happens if the input came during a
> sit-for in post-command-hook, as in Stefan's original example, or
> directly as in the example above.) This kind of "reread input" is
> explicitly *not* added to this_command_keys. The rationale for this
> is not clear to me, but there may be a good reason since the code
> explicitly checks for this; see keyboard.c:789. Then
> `universal-argument-other-key' can't see that input.
> OTOH, I don't see a safe way of fixing this. Any suggestions?
The check on line 3262 seems odd. If we trace it back it was introduced in
revision 1.489 in the following form:
if (this_command_key_count == 0 || ! reread)
the log comment doesn't say much useful:
(read_char): Call the input method if appropriate.
Change logic for distinguishing rereads from new events;
use local var `reread'. Take events from
Vunread_input_method_events and Vunread_post_input_method_events.
I'm not sure exactly what this was trying to avoid, but the test looks odd.
Maybe the "!reread" could make some sense, but the
"this_command_key_count==0" looks positively odd since it may end up
recording the first (and only the first) of a sequence of keys.
Maybe the problem is that `this-command-keys' has several potential uses and
they are incompatible: in one case one wants this-command-keys to list the
keys the user has typed (independently from whether or not some of those
keys were later read&unread&reread&reunread&rereread), whereas in the other
one wants the exact key-sequence which triggered this command, so we can
push it back on unread-command-events to force re-interpretation of
those keys.
Stefan
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-18 1:57 ` Stefan Monnier
@ 2006-10-18 2:19 ` Chong Yidong
2006-10-18 5:57 ` Stefan Monnier
2006-10-18 17:54 ` Richard Stallman
1 sibling, 1 reply; 25+ messages in thread
From: Chong Yidong @ 2006-10-18 2:19 UTC (permalink / raw)
Cc: rms, emacs-devel
Stefan Monnier <monnier@iro.umontreal.ca> writes:
> Maybe the problem is that `this-command-keys' has several potential uses and
> they are incompatible: in one case one wants this-command-keys to list the
> keys the user has typed (independently from whether or not some of those
> keys were later read&unread&reread&reunread&rereread), whereas in the other
> one wants the exact key-sequence which triggered this command, so we can
> push it back on unread-command-events to force re-interpretation of
> those keys.
Given that the code has been around for 8 years, changing it at this
point in the release process might be a disaster. It's not even clear
to me what TRT is in this case. I suggest leaving the current
behavior as it is for Emacs 22; any user-level Lisp code that bumps
into this can quite easily work around it by checking if this-command
is eq to universal-argument.
Then maybe we can revisit this issue after the release. WDYT?
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-18 2:19 ` Chong Yidong
@ 2006-10-18 5:57 ` Stefan Monnier
2006-10-18 14:28 ` Chong Yidong
0 siblings, 1 reply; 25+ messages in thread
From: Stefan Monnier @ 2006-10-18 5:57 UTC (permalink / raw)
Cc: rms, emacs-devel
> Given that the code has been around for 8 years, changing it at this
> point in the release process might be a disaster. It's not even clear
> to me what TRT is in this case. I suggest leaving the current
> behavior as it is for Emacs 22; any user-level Lisp code that bumps
> into this can quite easily work around it by checking if this-command
> is eq to universal-argument.
Huh? The problem came up because of a minor mode who uses post-command-hook
with a sit-for inside. How do you suggest to work around this problem?
Stefan
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-18 5:57 ` Stefan Monnier
@ 2006-10-18 14:28 ` Chong Yidong
2006-10-18 15:23 ` Stefan Monnier
` (2 more replies)
0 siblings, 3 replies; 25+ messages in thread
From: Chong Yidong @ 2006-10-18 14:28 UTC (permalink / raw)
Cc: rms, emacs-devel
Stefan Monnier <monnier@iro.umontreal.ca> writes:
>> Given that the code has been around for 8 years, changing it at
>> this point in the release process might be a disaster. It's not
>> even clear to me what TRT is in this case. I suggest leaving the
>> current behavior as it is for Emacs 22; any user-level Lisp code
>> that bumps into this can quite easily work around it by checking if
>> this-command is eq to universal-argument.
>
> Huh? The problem came up because of a minor mode who uses
> post-command-hook with a sit-for inside. How do you suggest to work
> around this problem?
Which minor mode is that? It could avoid performing the sit-for
during universal-argument:
(unless (eq this-command 'universal-argument)
(sit-for 0.5))
Or can you think of a safe way to change the keyboard.c code?
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-18 14:28 ` Chong Yidong
@ 2006-10-18 15:23 ` Stefan Monnier
2006-10-19 6:41 ` Richard Stallman
2006-10-19 6:41 ` Richard Stallman
2006-10-19 14:51 ` Johan Bockgård
2 siblings, 1 reply; 25+ messages in thread
From: Stefan Monnier @ 2006-10-18 15:23 UTC (permalink / raw)
Cc: rms, emacs-devel
> Which minor mode is that?
haskell-doc-mode
> It could avoid performing the sit-for during universal-argument:
> (unless (eq this-command 'universal-argument)
> (sit-for 0.5))
Oh, I see. Well, in the case of haskell-doc-mode, the better fix is to use
an idle-timer rather than a post-command-hook. But it's still a weird bug
introduced in Emacs-22 (it was there before, but the sit-for changes made
it appear in more cases).
> Or can you think of a safe way to change the keyboard.c code?
Add a parameter to this-command-keys which, if non-nil causes it to return
all keys, even those that were `reread'.
Then use this new parameter in universal-argument.
Stefan
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-18 1:57 ` Stefan Monnier
2006-10-18 2:19 ` Chong Yidong
@ 2006-10-18 17:54 ` Richard Stallman
2006-10-18 23:57 ` Chong Yidong
1 sibling, 1 reply; 25+ messages in thread
From: Richard Stallman @ 2006-10-18 17:54 UTC (permalink / raw)
Cc: cyd, emacs-devel
I'm not sure exactly what this was trying to avoid, but the test looks odd.
Maybe the "!reread" could make some sense, but the
"this_command_key_count==0" looks positively odd since it may end up
recording the first (and only the first) of a sequence of keys.
I designed that test to do the right thing in the cases that were
encountered, and both conditions proved to be necessary.
!reread is the usual case of reading a new character.
this_command_key_count==0 is the case you get when a command reads
input with read-event and then unreads it. This usually IS the first
event of a key sequence; it is supposed to be.
To really do the right thing, we would need to associate each unread
key with a flag indicating whether it was previously added to
this-command-keys. That would be a very painful incompatibility, so I
never wanted to do it, and I don't want to do it now.
Maybe the problem is that `this-command-keys' has several potential uses and
they are incompatible: in one case one wants this-command-keys to list the
keys the user has typed (independently from whether or not some of those
keys were later read&unread&reread&reunread&rereread), whereas in the other
one wants the exact key-sequence which triggered this command, so we can
push it back on unread-command-events to force re-interpretation of
those keys.
I think that is true.
I suggest that we add a new primitive that does precisely what
`universal-argument-other-key' needs, and use it there. That will be
safe, in that the change can't break anything else.
Does anyone disagree? Would someone like to do this?
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-18 17:54 ` Richard Stallman
@ 2006-10-18 23:57 ` Chong Yidong
2006-10-19 9:01 ` Kim F. Storm
0 siblings, 1 reply; 25+ messages in thread
From: Chong Yidong @ 2006-10-18 23:57 UTC (permalink / raw)
Cc: Stefan Monnier, emacs-devel
Richard Stallman <rms@gnu.org> writes:
> To really do the right thing, we would need to associate each unread
> key with a flag indicating whether it was previously added to
> this-command-keys. That would be a very painful incompatibility, so I
> never wanted to do it, and I don't want to do it now.
>
> Maybe the problem is that `this-command-keys' has several potential uses and
> they are incompatible: in one case one wants this-command-keys to list the
> keys the user has typed (independently from whether or not some of those
> keys were later read&unread&reread&reunread&rereread), whereas in the other
> one wants the exact key-sequence which triggered this command, so we can
> push it back on unread-command-events to force re-interpretation of
> those keys.
>
> I think that is true.
>
> I suggest that we add a new primitive that does precisely what
> `universal-argument-other-key' needs, and use it there. That will be
> safe, in that the change can't break anything else.
>
> Does anyone disagree?
This would involve lugging around an extra set of variables, exactly
like `this_command_keys' and `this_command_key_count' except reread
events get updated there too. Sounds ugly.
How about a variable that tells the command loop to re-insert reread
commands into `this-command-keys' until the next command? The command
loop could automagically reset this at the start of the loop, in case
of a quit. Then universal-argument could toggle this variable.
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-18 14:28 ` Chong Yidong
2006-10-18 15:23 ` Stefan Monnier
@ 2006-10-19 6:41 ` Richard Stallman
2006-10-19 14:31 ` Chong Yidong
2006-10-19 14:51 ` Johan Bockgård
2 siblings, 1 reply; 25+ messages in thread
From: Richard Stallman @ 2006-10-19 6:41 UTC (permalink / raw)
Cc: monnier, emacs-devel
Which minor mode is that? It could avoid performing the sit-for
during universal-argument:
(unless (eq this-command 'universal-argument)
(sit-for 0.5))
If that works, I'd rather do that
than make any change at a lower level.
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-18 15:23 ` Stefan Monnier
@ 2006-10-19 6:41 ` Richard Stallman
0 siblings, 0 replies; 25+ messages in thread
From: Richard Stallman @ 2006-10-19 6:41 UTC (permalink / raw)
Cc: cyd, emacs-devel
Add a parameter to this-command-keys which, if non-nil causes it to return
all keys, even those that were `reread'.
That would be hard to do, since there's only one data structure
and the keys that you don't get are not in the data structure.
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-18 23:57 ` Chong Yidong
@ 2006-10-19 9:01 ` Kim F. Storm
0 siblings, 0 replies; 25+ messages in thread
From: Kim F. Storm @ 2006-10-19 9:01 UTC (permalink / raw)
Cc: emacs-devel, rms, Stefan Monnier
Chong Yidong <cyd@stupidchicken.com> writes:
> How about a variable that tells the command loop to re-insert reread
> commands into `this-command-keys' until the next command? The command
> loop could automagically reset this at the start of the loop, in case
> of a quit. Then universal-argument could toggle this variable.
Sounds like a good way to DTRT at this stage...
--
Kim F. Storm <storm@cua.dk> http://www.cua.dk
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-19 6:41 ` Richard Stallman
@ 2006-10-19 14:31 ` Chong Yidong
0 siblings, 0 replies; 25+ messages in thread
From: Chong Yidong @ 2006-10-19 14:31 UTC (permalink / raw)
Cc: monnier, emacs-devel
Richard Stallman <rms@gnu.org> writes:
> Which minor mode is that? It could avoid performing the sit-for
> during universal-argument:
>
> (unless (eq this-command 'universal-argument)
> (sit-for 0.5))
>
> If that works, I'd rather do that
> than make any change at a lower level.
The minor mode that reported contains the code, haskell-doc-mode, is
not distributed with Emacs; and as Stefan noted it's more correct for
it to use an idle-timer.
I suggest not making a change to Emacs at this stage. I could add a
TODO item about "implementing a new primitive that is like
this-command-keys only it accepts reread events", and look into it
after the release.
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-18 14:28 ` Chong Yidong
2006-10-18 15:23 ` Stefan Monnier
2006-10-19 6:41 ` Richard Stallman
@ 2006-10-19 14:51 ` Johan Bockgård
2 siblings, 0 replies; 25+ messages in thread
From: Johan Bockgård @ 2006-10-19 14:51 UTC (permalink / raw)
Chong Yidong <cyd@stupidchicken.com> writes:
> It could avoid performing the sit-for during universal-argument:
>
> (unless (eq this-command 'universal-argument)
> (sit-for 0.5))
Ditto for universal-argument-more, negative-argument, digit-argument,
etc...
--
Johan Bockgård
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-17 14:50 ` Chong Yidong
2006-10-17 21:11 ` Chong Yidong
@ 2006-10-19 21:09 ` Kim F. Storm
2006-10-19 21:25 ` Chong Yidong
2006-10-19 21:09 ` Kim F. Storm
2 siblings, 1 reply; 25+ messages in thread
From: Kim F. Storm @ 2006-10-19 21:09 UTC (permalink / raw)
Cc: emacs-devel, rms, Stefan Monnier
Chong Yidong <cyd@stupidchicken.com> writes:
> Here is an easy way to reproduce the underlying bug:
>
> (defun foo ()
> (interactive)
> (universal-argument)
> (push ?a unread-command-events))
>
> M-x foo RET
>
> The expected result is aaaa, but in fact nothing is printed.
Here is a simple patch which fixes the problem AFAICS.
It uses a special event code (t . EVENT) in unread-command-events
to specify that EVENT is _not_ reread. Of course, this should be
documented in unread-command-events if people think this fix is ok.
*** keyboard.c 10 Oct 2006 10:33:25 +0200 1.878
--- keyboard.c 19 Oct 2006 23:00:23 +0200
***************
*** 2537,2542 ****
--- 2537,2554 ----
c = XCAR (Vunread_command_events);
Vunread_command_events = XCDR (Vunread_command_events);
+ reread = 1;
+
+ /* Undo what sit-for did when it unread additional keys
+ inside universal-argument. */
+
+ if (CONSP (c)
+ && EQ (XCAR (c), Qt))
+ {
+ reread = 0;
+ c = XCDR (c);
+ }
+
/* Undo what read_char_x_menu_prompt did when it unread
additional keys returned by Fx_popup_menu. */
if (CONSP (c)
***************
*** 2550,2556 ****
&& (EQ (c, Qtool_bar) || EQ (c, Qmenu_bar)))
*used_mouse_menu = 1;
- reread = 1;
goto reread_for_input_method;
}
--- 2562,2567 ----
Index: subr.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/subr.el,v
retrieving revision 1.530
diff -c -r1.530 subr.el
*** subr.el 18 Oct 2006 10:56:46 -0000 1.530
--- subr.el 19 Oct 2006 21:08:24 -0000
***************
*** 1752,1759 ****
(or nodisp (redisplay))
(let ((read (read-event nil nil seconds)))
(or (null read)
! (progn (push read unread-command-events)
! nil))))))
\f
;;; Atomic change groups.
--- 1758,1768 ----
(or nodisp (redisplay))
(let ((read (read-event nil nil seconds)))
(or (null read)
! (progn
! (if (eq overriding-terminal-local-map universal-argument-map)
! (setq read (cons t read)))
! (push read unread-command-events)
! nil))))))
\f
;;; Atomic change groups.
--
Kim F. Storm <storm@cua.dk> http://www.cua.dk
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-17 14:50 ` Chong Yidong
2006-10-17 21:11 ` Chong Yidong
2006-10-19 21:09 ` Kim F. Storm
@ 2006-10-19 21:09 ` Kim F. Storm
2006-10-21 2:03 ` Richard Stallman
2 siblings, 1 reply; 25+ messages in thread
From: Kim F. Storm @ 2006-10-19 21:09 UTC (permalink / raw)
Cc: emacs-devel, rms, Stefan Monnier
Chong Yidong <cyd@stupidchicken.com> writes:
> Here is an easy way to reproduce the underlying bug:
>
> (defun foo ()
> (interactive)
> (universal-argument)
> (push ?a unread-command-events))
>
> M-x foo RET
>
> The expected result is aaaa, but in fact nothing is printed.
Here is a simple patch which fixes the problem AFAICS.
It uses a special event code (t . EVENT) in unread-command-events
to specify that EVENT is _not_ reread. Of course, this should be
documented in unread-command-events if people think this fix is ok.
*** keyboard.c 10 Oct 2006 10:33:25 +0200 1.878
--- keyboard.c 19 Oct 2006 23:00:23 +0200
***************
*** 2537,2542 ****
--- 2537,2554 ----
c = XCAR (Vunread_command_events);
Vunread_command_events = XCDR (Vunread_command_events);
+ reread = 1;
+
+ /* Undo what sit-for did when it unread additional keys
+ inside universal-argument. */
+
+ if (CONSP (c)
+ && EQ (XCAR (c), Qt))
+ {
+ reread = 0;
+ c = XCDR (c);
+ }
+
/* Undo what read_char_x_menu_prompt did when it unread
additional keys returned by Fx_popup_menu. */
if (CONSP (c)
***************
*** 2550,2556 ****
&& (EQ (c, Qtool_bar) || EQ (c, Qmenu_bar)))
*used_mouse_menu = 1;
- reread = 1;
goto reread_for_input_method;
}
--- 2562,2567 ----
Index: subr.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/subr.el,v
retrieving revision 1.530
diff -c -r1.530 subr.el
*** subr.el 18 Oct 2006 10:56:46 -0000 1.530
--- subr.el 19 Oct 2006 21:08:24 -0000
***************
*** 1752,1759 ****
(or nodisp (redisplay))
(let ((read (read-event nil nil seconds)))
(or (null read)
! (progn (push read unread-command-events)
! nil))))))
\f
;;; Atomic change groups.
--- 1758,1768 ----
(or nodisp (redisplay))
(let ((read (read-event nil nil seconds)))
(or (null read)
! (progn
! (if (eq overriding-terminal-local-map universal-argument-map)
! (setq read (cons t read)))
! (push read unread-command-events)
! nil))))))
\f
;;; Atomic change groups.
--
Kim F. Storm <storm@cua.dk> http://www.cua.dk
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-19 21:09 ` Kim F. Storm
@ 2006-10-19 21:25 ` Chong Yidong
0 siblings, 0 replies; 25+ messages in thread
From: Chong Yidong @ 2006-10-19 21:25 UTC (permalink / raw)
Cc: emacs-devel, rms, Stefan Monnier
storm@cua.dk (Kim F. Storm) writes:
> Here is a simple patch which fixes the problem AFAICS.
>
> It uses a special event code (t . EVENT) in unread-command-events
> to specify that EVENT is _not_ reread. Of course, this should be
> documented in unread-command-events if people think this fix is ok.
I think it's an excellent idea.
> *** keyboard.c 10 Oct 2006 10:33:25 +0200 1.878
> --- keyboard.c 19 Oct 2006 23:00:23 +0200
> ***************
> *** 2537,2542 ****
> --- 2537,2554 ----
> c = XCAR (Vunread_command_events);
> Vunread_command_events = XCDR (Vunread_command_events);
>
> + reread = 1;
> +
> + /* Undo what sit-for did when it unread additional keys
> + inside universal-argument. */
> +
> + if (CONSP (c)
> + && EQ (XCAR (c), Qt))
> + {
> + reread = 0;
> + c = XCDR (c);
> + }
> +
> /* Undo what read_char_x_menu_prompt did when it unread
> additional keys returned by Fx_popup_menu. */
> if (CONSP (c)
> ***************
> *** 2550,2556 ****
> && (EQ (c, Qtool_bar) || EQ (c, Qmenu_bar)))
> *used_mouse_menu = 1;
>
> - reread = 1;
> goto reread_for_input_method;
> }
>
> --- 2562,2567 ----
>
>
> Index: subr.el
> ===================================================================
> RCS file: /cvsroot/emacs/emacs/lisp/subr.el,v
> retrieving revision 1.530
> diff -c -r1.530 subr.el
> *** subr.el 18 Oct 2006 10:56:46 -0000 1.530
> --- subr.el 19 Oct 2006 21:08:24 -0000
> ***************
> *** 1752,1759 ****
> (or nodisp (redisplay))
> (let ((read (read-event nil nil seconds)))
> (or (null read)
> ! (progn (push read unread-command-events)
> ! nil))))))
> \f
> ;;; Atomic change groups.
>
> --- 1758,1768 ----
> (or nodisp (redisplay))
> (let ((read (read-event nil nil seconds)))
> (or (null read)
> ! (progn
> ! (if (eq overriding-terminal-local-map universal-argument-map)
> ! (setq read (cons t read)))
> ! (push read unread-command-events)
> ! nil))))))
> \f
> ;;; Atomic change groups.
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-19 21:09 ` Kim F. Storm
@ 2006-10-21 2:03 ` Richard Stallman
2006-10-22 22:54 ` Kim F. Storm
0 siblings, 1 reply; 25+ messages in thread
From: Richard Stallman @ 2006-10-21 2:03 UTC (permalink / raw)
Cc: cyd, monnier, emacs-devel
Your approach is very good-- what I thought would be unacceptably
incompatible, you've made acceptable. Please install your patch
and document it.
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: Strange behavior of C-u in the presence of sit-for in p-c-h
2006-10-21 2:03 ` Richard Stallman
@ 2006-10-22 22:54 ` Kim F. Storm
0 siblings, 0 replies; 25+ messages in thread
From: Kim F. Storm @ 2006-10-22 22:54 UTC (permalink / raw)
Cc: cyd, monnier, emacs-devel
Richard Stallman <rms@gnu.org> writes:
> Your approach is very good-- what I thought would be unacceptably
> incompatible, you've made acceptable. Please install your patch
> and document it.
Done.
--
Kim F. Storm <storm@cua.dk> http://www.cua.dk
^ permalink raw reply [flat|nested] 25+ messages in thread
end of thread, other threads:[~2006-10-22 22:54 UTC | newest]
Thread overview: 25+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-10-14 16:44 Strange behavior of C-u in the presence of sit-for in p-c-h Stefan Monnier
2006-10-16 13:50 ` Richard Stallman
2006-10-16 16:04 ` Stefan Monnier
2006-10-17 6:54 ` Richard Stallman
2006-10-17 14:50 ` Chong Yidong
2006-10-17 21:11 ` Chong Yidong
2006-10-17 22:12 ` Stefan Monnier
2006-10-17 22:18 ` Chong Yidong
2006-10-18 1:57 ` Stefan Monnier
2006-10-18 2:19 ` Chong Yidong
2006-10-18 5:57 ` Stefan Monnier
2006-10-18 14:28 ` Chong Yidong
2006-10-18 15:23 ` Stefan Monnier
2006-10-19 6:41 ` Richard Stallman
2006-10-19 6:41 ` Richard Stallman
2006-10-19 14:31 ` Chong Yidong
2006-10-19 14:51 ` Johan Bockgård
2006-10-18 17:54 ` Richard Stallman
2006-10-18 23:57 ` Chong Yidong
2006-10-19 9:01 ` Kim F. Storm
2006-10-19 21:09 ` Kim F. Storm
2006-10-19 21:25 ` Chong Yidong
2006-10-19 21:09 ` Kim F. Storm
2006-10-21 2:03 ` Richard Stallman
2006-10-22 22:54 ` Kim F. Storm
Code repositories for project(s) associated with this public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).