unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#49057: 28.0.50; windmove-display-in-direction ignores windmove-display-no-select
       [not found] <20210616064248.mqqzlt7qyxwqrcfy.ref@Ergus>
@ 2021-06-16  6:42 ` Ergus via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2021-06-16  7:59   ` Juri Linkov
  0 siblings, 1 reply; 9+ messages in thread
From: Ergus via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2021-06-16  6:42 UTC (permalink / raw)
  To: 49057

Hi I just try to use the user option windmove-display-no-select and I
found that the new window is always selected and ignores
windmove-display-no-select.

To reproduce:

emacs -Q
M-: (setq windmove-display-no-select t)
M-x windmove-display-right
C-x b *scratch*

The new window will be selected independently of the value of
windmove-display-no-select.

Sometimes the new buffer is displayed in the current buffer ignoring
windmove-display-right (when *scratch* is already on the right for
example).






^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#49057: 28.0.50; windmove-display-in-direction ignores windmove-display-no-select
  2021-06-16  6:42 ` bug#49057: 28.0.50; windmove-display-in-direction ignores windmove-display-no-select Ergus via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2021-06-16  7:59   ` Juri Linkov
  2021-06-16 12:16     ` Ergus via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 9+ messages in thread
From: Juri Linkov @ 2021-06-16  7:59 UTC (permalink / raw)
  To: 49057; +Cc: Ergus

> M-: (setq windmove-display-no-select t)
> M-x windmove-display-right
> C-x b *scratch*
>
> The new window will be selected independently of the value of
> windmove-display-no-select.
>
> Sometimes the new buffer is displayed in the current buffer ignoring
> windmove-display-right (when *scratch* is already on the right for
> example).

Please also do:

  M-: (setq switch-to-buffer-obey-display-actions t)

What we could do to improve this:

1. enable switch-to-buffer-obey-display-actions by default;

2. mention switch-to-buffer-obey-display-actions in more docstrings.

Currently the docstring of windmove-display-in-direction has this text:

  "When `switch-to-buffer-obey-display-actions' is non-nil,
  `switch-to-buffer' commands are also supported."

Maybe the same text should be copied to all commands that use
windmove-display-in-direction, i.e. to windmove-display-right,
etc.





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#49057: 28.0.50; windmove-display-in-direction ignores windmove-display-no-select
  2021-06-16  7:59   ` Juri Linkov
@ 2021-06-16 12:16     ` Ergus via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2021-06-16 23:08       ` Juri Linkov
  0 siblings, 1 reply; 9+ messages in thread
From: Ergus via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2021-06-16 12:16 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 49057

On Wed, Jun 16, 2021 at 10:59:50AM +0300, Juri Linkov wrote:
>> M-: (setq windmove-display-no-select t)
>> M-x windmove-display-right
>> C-x b *scratch*
>>
>> The new window will be selected independently of the value of
>> windmove-display-no-select.
>>
>> Sometimes the new buffer is displayed in the current buffer ignoring
>> windmove-display-right (when *scratch* is already on the right for
>> example).
>
>Please also do:
>
>  M-: (setq switch-to-buffer-obey-display-actions t)
>
>What we could do to improve this:
>
>1. enable switch-to-buffer-obey-display-actions by default;
>
>2. mention switch-to-buffer-obey-display-actions in more docstrings.
>
>Currently the docstring of windmove-display-in-direction has this text:
>
>  "When `switch-to-buffer-obey-display-actions' is non-nil,
>  `switch-to-buffer' commands are also supported."
>
>Maybe the same text should be copied to all commands that use
>windmove-display-in-direction, i.e. to windmove-display-right,
>etc.

Sorry, I forgot to mention that line but it is enabled but I already
have that in my config. Even with that it is not working fine.





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#49057: 28.0.50; windmove-display-in-direction ignores windmove-display-no-select
  2021-06-16 12:16     ` Ergus via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2021-06-16 23:08       ` Juri Linkov
  2021-06-17  8:33         ` martin rudalics
  0 siblings, 1 reply; 9+ messages in thread
From: Juri Linkov @ 2021-06-16 23:08 UTC (permalink / raw)
  To: Ergus; +Cc: 49057

> Sorry, I forgot to mention that line but it is enabled but I already
> have that in my config. Even with that it is not working fine.

Thanks for clarification, then we have a problem because
pop-to-buffer insists on always selecting the new window
that was displayed:

          ;; Make sure the window is selected (Bug#8615), (Bug#6954)
          (select-window window norecord))

Here is the workflow:

1. switch-to-buffer calls pop-to-buffer-same-window
2. pop-to-buffer-same-window calls pop-to-buffer
3. pop-to-buffer calls display-buffer
4. display-buffer calls display-buffer-override-next-command
   that calls post-function from windmove-display-in-direction
   that selects the old window

5. but later pop-to-buffer selects the new window,
   thus overriding the specified selection of the old window.





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#49057: 28.0.50; windmove-display-in-direction ignores windmove-display-no-select
  2021-06-16 23:08       ` Juri Linkov
@ 2021-06-17  8:33         ` martin rudalics
  2021-06-17 19:54           ` Juri Linkov
  0 siblings, 1 reply; 9+ messages in thread
From: martin rudalics @ 2021-06-17  8:33 UTC (permalink / raw)
  To: Juri Linkov, Ergus; +Cc: 49057

 > 1. switch-to-buffer calls pop-to-buffer-same-window
 > 2. pop-to-buffer-same-window calls pop-to-buffer
 > 3. pop-to-buffer calls display-buffer
 > 4. display-buffer calls display-buffer-override-next-command
 >     that calls post-function from windmove-display-in-direction
 >     that selects the old window
 >
 > 5. but later pop-to-buffer selects the new window,
 >     thus overriding the specified selection of the old window.

Conceptually, `pop-to-buffer' has to

   Display buffer specified by BUFFER-OR-NAME and select its window.

so I cannot see anything wrong here.  Step 5 must be allowed to override
any selection made in step 4 and any expectation derived from having set
`windmove-display-no-select' to t is moot here.

[BTW, `windmove-display-in-direction' is not a command but its doc-string
talks about

   If ‘windmove-display-no-select’ is non-nil, this command doesn’t
   select the window with a displayed buffer, and the meaning of
   the prefix argument is reversed.

This should be fixed.]

Now we all know that `display-buffer' may or may not select the chosen
window.  We cannot disallow it when the window shall appear on a new
frame because most WMs will "select" the new frame.  Even trying to
disallow it in such case might be a bad idea because this instance of
`display-buffer' might have been triggered by a `pop-to-buffer' like
function and we will confuse the hell out of the WM - do not select the
new frame as `display-buffer' says, do select it as `pop-to-buffer' or
`switch-to-buffer' say ...

So maybe we should relax that basic statement of `display-buffer'

      This command makes BUFFER-OR-NAME appear in some window, without
      selecting the window or making the buffer current.

because it is wrong anyway.  Then we could add an additional action
alist entry, say 'select' with values like

- t (try to select)

- nil (avoid to select)

and maybe `never' or 'on-new-frame-only' to emphasize whether
`display-buffer' is allowed to select the window and make its buffer
current.  This has the advantage of freeing `display-buffer' from the
responsibility to decide whether it may select the chosen window.

Then we could also try to use frame parameters like 'no-focus-on-map'
and 'no-accept-focus' right away and users do not have to specify them
explicitly via `pop-up-frame-parameters'.

martin






^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#49057: 28.0.50; windmove-display-in-direction ignores windmove-display-no-select
  2021-06-17  8:33         ` martin rudalics
@ 2021-06-17 19:54           ` Juri Linkov
  2021-06-18  7:33             ` martin rudalics
  0 siblings, 1 reply; 9+ messages in thread
From: Juri Linkov @ 2021-06-17 19:54 UTC (permalink / raw)
  To: martin rudalics; +Cc: 49057, Ergus

tags 49057 fixed
thanks

> Conceptually, `pop-to-buffer' has to
>
>   Display buffer specified by BUFFER-OR-NAME and select its window.
>
> so I cannot see anything wrong here.  Step 5 must be allowed to override
> any selection made in step 4 and any expectation derived from having set
> `windmove-display-no-select' to t is moot here.

I completely agree.  All code that calls `pop-to-buffer' expects that
`pop-to-buffer' will select the displayed window, so code could continue
working on the selected window after its call.

So the only safe solution is to select the needed window in post-command-hook,
when the current command is already finished.  This is how this bug is fixed now.

> [BTW, `windmove-display-in-direction' is not a command but its doc-string
> talks about
>
>   If ‘windmove-display-no-select’ is non-nil, this command doesn’t
>   select the window with a displayed buffer, and the meaning of
>   the prefix argument is reversed.
>
> This should be fixed.]

Now fixed as well.

> Now we all know that `display-buffer' may or may not select the chosen
> window.  We cannot disallow it when the window shall appear on a new
> frame because most WMs will "select" the new frame.  Even trying to
> disallow it in such case might be a bad idea because this instance of
> `display-buffer' might have been triggered by a `pop-to-buffer' like
> function and we will confuse the hell out of the WM - do not select the
> new frame as `display-buffer' says, do select it as `pop-to-buffer' or
> `switch-to-buffer' say ...
>
> So maybe we should relax that basic statement of `display-buffer'
>
>      This command makes BUFFER-OR-NAME appear in some window, without
>      selecting the window or making the buffer current.
>
> because it is wrong anyway.  Then we could add an additional action
> alist entry, say 'select' with values like
>
> - t (try to select)
>
> - nil (avoid to select)
>
> and maybe `never' or 'on-new-frame-only' to emphasize whether
> `display-buffer' is allowed to select the window and make its buffer
> current.  This has the advantage of freeing `display-buffer' from the
> responsibility to decide whether it may select the chosen window.
>
> Then we could also try to use frame parameters like 'no-focus-on-map'
> and 'no-accept-focus' right away and users do not have to specify them
> explicitly via `pop-up-frame-parameters'.

But wouldn't this be too confusing for users, when users will call
`pop-to-buffer' with the new alist entry 'select', and it still will select
the unintended window as `pop-to-buffer' currently does?





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#49057: 28.0.50; windmove-display-in-direction ignores windmove-display-no-select
  2021-06-17 19:54           ` Juri Linkov
@ 2021-06-18  7:33             ` martin rudalics
  2021-06-18 19:10               ` Juri Linkov
  0 siblings, 1 reply; 9+ messages in thread
From: martin rudalics @ 2021-06-18  7:33 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 49057, Ergus

 > But wouldn't this be too confusing for users, when users will call
 > `pop-to-buffer' with the new alist entry 'select', and it still will select
 > the unintended window as `pop-to-buffer' currently does?

`pop-to-buffer' has to select the window chosen by `display-buffer'
regardless of whether `display-buffer' selected it or not.  Do we
violate this principle anywhere?  The basic difference I'd propose is to
have `pop-to-buffer' bind

  (display-buffer-overriding-action '(nil ((select . t))))

around the `display-buffer' call and so `display-buffer' will select the
chosen window regardless of any user customizations.

martin





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#49057: 28.0.50; windmove-display-in-direction ignores windmove-display-no-select
  2021-06-18  7:33             ` martin rudalics
@ 2021-06-18 19:10               ` Juri Linkov
  2021-06-20  9:21                 ` martin rudalics
  0 siblings, 1 reply; 9+ messages in thread
From: Juri Linkov @ 2021-06-18 19:10 UTC (permalink / raw)
  To: martin rudalics; +Cc: 49057, Ergus

>> But wouldn't this be too confusing for users, when users will call
>> `pop-to-buffer' with the new alist entry 'select', and it still will select
>> the unintended window as `pop-to-buffer' currently does?
>
> `pop-to-buffer' has to select the window chosen by `display-buffer'
> regardless of whether `display-buffer' selected it or not.  Do we
> violate this principle anywhere?  The basic difference I'd propose is to
> have `pop-to-buffer' bind
>
>  (display-buffer-overriding-action '(nil ((select . t))))
>
> around the `display-buffer' call and so `display-buffer' will select the
> chosen window regardless of any user customizations.

Then other commands should take care to not override
display-buffer-overriding-action.

Do you intend to rewrite commands that currently use
switch-to-buffer-other-window (such as Buffer-menu-other-window
and dired-find-file-other-window) to use `display-buffer'
with '(nil ((select . t)))?  Probably not because
switch-to-buffer-other-window already uses pop-to-buffer.

Then maybe you want to rewrite commands that currently use
`display-buffer' with ACTION=t (such as
Buffer-menu-switch-other-window and dired-display-file)
to use `display-buffer' with '(nil ((select . nil))) instead?





^ permalink raw reply	[flat|nested] 9+ messages in thread

* bug#49057: 28.0.50; windmove-display-in-direction ignores windmove-display-no-select
  2021-06-18 19:10               ` Juri Linkov
@ 2021-06-20  9:21                 ` martin rudalics
  0 siblings, 0 replies; 9+ messages in thread
From: martin rudalics @ 2021-06-20  9:21 UTC (permalink / raw)
  To: Juri Linkov; +Cc: 49057, Ergus

 > Do you intend to rewrite commands that currently use
 > switch-to-buffer-other-window (such as Buffer-menu-other-window
 > and dired-find-file-other-window) to use `display-buffer'
 > with '(nil ((select . t)))?  Probably not because
 > switch-to-buffer-other-window already uses pop-to-buffer.
 >
 > Then maybe you want to rewrite commands that currently use
 > `display-buffer' with ACTION=t (such as
 > Buffer-menu-switch-other-window and dired-display-file)
 > to use `display-buffer' with '(nil ((select . nil))) instead?

These do not use `pop-to-buffer' so I'd leave them alone.  Note that the
only value for 'select' I'd really care about is 'never' because it
means that `display-buffer' should try to refrain from focusing another
frame - provided the WM allows it.  But I doubt that people really care.

martin





^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2021-06-20  9:21 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20210616064248.mqqzlt7qyxwqrcfy.ref@Ergus>
2021-06-16  6:42 ` bug#49057: 28.0.50; windmove-display-in-direction ignores windmove-display-no-select Ergus via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-06-16  7:59   ` Juri Linkov
2021-06-16 12:16     ` Ergus via Bug reports for GNU Emacs, the Swiss army knife of text editors
2021-06-16 23:08       ` Juri Linkov
2021-06-17  8:33         ` martin rudalics
2021-06-17 19:54           ` Juri Linkov
2021-06-18  7:33             ` martin rudalics
2021-06-18 19:10               ` Juri Linkov
2021-06-20  9:21                 ` martin rudalics

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).