GNU bug report logs - #11939
24.1; `save-buffers-kill-emacs' loses minibuffer focus when it calls `list-processes'

Previous Next

Package: emacs;

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

Date: Fri, 13 Jul 2012 18:07:01 UTC

Severity: normal

Found in version 24.1

Done: martin rudalics <rudalics <at> gmx.at>

Bug is archived. No further changes may be made.

Full log


View this message in rfc822 format

From: martin rudalics <rudalics <at> gmx.at>
To: Drew Adams <drew.adams <at> oracle.com>
Cc: 11939 <at> debbugs.gnu.org
Subject: bug#11939: 24.1; `save-buffers-kill-emacs' loses minibuffer focuswhenit calls	`list-processes'
Date: Mon, 06 Aug 2012 17:29:35 +0200
>>  > Something like this:
>>  > (with-unfocused-buffer-displayed BUFFER &body BODY)
>>  >
>>  > where BUFFER is displayed for information only, and where
>>  > BODY would include the call(s) that read from the minibuffer.
>>  >
>>  > The current buffer would remain what it was beforehand,
>>  > and _if_ BUFFER gets displayed in its own frame and _if_
>>  > there is a standalone minibuffer frame, _then_ the focus
>>  > for BUFFER's frame gets automatically redirected to the
>>  > minibuffer frame.
>>
>> In my experience, this requirement is met if the construct requests
>> input with BUFFER's window temporarily selected and BUFFER
>> temporarily current.  Or am I missing something?
>
> Sorry, I don't know what that means.  Perhaps give an example of what you mean
> by temporarily selected and current?

Temporarily selected means selected via `with-selected-window' and
temporarily current means `with-current-buffer'.

>>  > handling needed - the construct can essentially be a no-op
>>  > in that case (AFAICT).
>>  >
>>  > How something like this would be implemented I'm not sure.
>>  > When the redirection would need to take place, to DTRT,
>>  > I'm not sure.  Perhaps it would need to be done more than once.
>>  >
>>  > But an important further requirement is that nothing
>>  > should prevent Emacs code in BODY or called from within
>>  > BODY from switching the input focus to BUFFER's frame.
>>
>> I don't understand what BODY should contain.  Would this macro be
>> responsible for displaying BUFFER?
>
> No, not as I was conceiving it.  I suppose that would be a possibility, but I
> expect it is better to keep buffer display out of it.  That's why I said things
> like "_if_ BUFFER gets displayed in its own frame".
>
> What I had in mind was that the macro would be responsible only for making sure
> that minibuffer input gets (re-)directed to the minibuffer frame.  And that goes
> for any code in BODY, including code that might pop up BUFFER.
>
> IOW, display of BUFFER would come (if it came) from BODY.
>
> But again, I'm just thinking out loud.  And it's probable that you see things
> that I do not.

No.  Just that I don't have the slightest idea how to write a macro that
modifies the behavior of a `yes-or-no-p' dialog it calls.  read_minibuf
and the code for handling keyboard events do the redirecting.

>>  > Likewise, nothing should prevent the user from explicitly
>>  > switching the focus to BUFFER's frame.
>>
>> This is part of the `yes-or-no-p' dialog, nothing within the scope
>> of the construct you propose.
>
> Can you elaborate?  I don't follow.

IIUC you want to modify the behavior of `yes-or-no-p' to redirect frame
focus in your sense.

> No.  Again, during reading from the minibuffer it is quite possible for a user
> to interact with other buffers and their frames.  I gave the example of
> *Completions*.  The user can hit a key or use the mouse to change the input
> focus temporarily to another frame - any frame.
>
> When the user does that s?he is executing code within BODY.  It is code that
> reads from the minibuffer, but also code that implements any commands bound to
> keys or mouse actions that the user uses during that minibuffer dialog.  That's
> all I meant.

I'm afraid this gets too complicated for me.  You have to find someone
who understands such scenarios better than me.

>>  > I do not expect that the problematic use case we've been
>>  > discussing can be detected and dealt with correctly in an
>>  > automatic way.  If the programmer intention
>>
>> Who is the programmer here?
>
> The person who writes the code that reads from the minibuffer, code that might
> or might not be wrapped in the new macro, i.e., that might or might not want to
> stipulate that BUFFER is not to receive the input focus.

The person who writes that code expects `yes-or-no-p' DTRT.

>> I refer to the case where a minibuffer-equipped frame is popped up.
>
> I'd rather you didn't.  Let's not bring in new things.

Users with non-nil `pop-up-frames' who don't use minibuffer-only frames
do get a minibuffer-equipped frame popped up.  You can ignore them, I
can't.  And a user who excludes BUFFER from the list of specially
displayed buffers does a perfectly valid thing and can expect Emacs to
handle it as it currently does.

> I don't know.  The only problems I am aware of for `w-t-b-w.el' are these:
>
> 1. Loss of special-displayness (a separate problem, but important if we're
> talking about `w-t-b-w.el' as it stands now).
>
> 2. The fact that it limits itself to display of temporary buffers, whereas the
> actual problem has to do with the temporary display of buffers.

Because I can safely kill a temporary buffer and remove its frame when
I'm done with the dialog.

> And as far as you know, is the fact that the minibuffer frame is still used (as
> it should be) due only to the fact that `yes-or-no-p' is used, or can I expect
> that the minibuffer frame will be used in general?

Due to the fact that `yes-or-no-p' is called in a special way - with the
new window selected.

>>  >> `with-temp-buffer-window' avoids that by asking the
>>  >> `yes-or-no-p' question in the new frame.
>
> Dunno why I (or was it you?) said that.  I see the question in the minibuffer
> frame, not the new frame.  Which is TRT.

To "see the question in the minibuffer frame" I ask it in the new frame.

> Yes, it is more restrictive than the actual problem encountered.  As I said, it
> might suffice in practice, but there is nothing in the problem description that
> requires that the buffer itself be temporary.

I have to kill the buffer to remove the frame.  And I have to remove the
frame because you complained that `save-window-excursion' cannot remove
a popped up frame.  And I can't kill a non-temporary buffer.

>> The invoking code does not care.  It expects `display-buffer' and
>> `yes-or-no-p' to take care of this.
>
> In the general case it is not `yes-or-no-p'.

It can do anything that reads from the minibuffer.

> The informational frame?  I'd vote for `delete-frame', at least for my own use.
> We might want to provide ways for the caller and/or the user to control both
> what to do with the frame/window and what to do with the buffer.  But maybe
> `frame-auto-hide-function' would make sense here?

If we use `frame-auto-hide-function', the caller does not have to kill
the buffer and there's no need to make this construct work for temporary
buffers only.

> Anyway, let's talk about this later.

It's your choice.

martin





This bug report was last modified 12 years and 288 days ago.

Previous Next


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