unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* About the 'minibuffer' frame parameter
@ 2016-07-31 18:12 martin rudalics
  2016-08-05 13:33 ` Eli Zaretskii
  0 siblings, 1 reply; 43+ messages in thread
From: martin rudalics @ 2016-07-31 18:12 UTC (permalink / raw)
  To: emacs-devel

With emacs -Q evaluate:

(progn
   (setq minibuffer-less-frame (make-frame '((minibuffer . nil))))
   (setq minibuffer-only-frame (make-frame '((minibuffer . only))))

   (set-frame-parameter
    minibuffer-less-frame 'minibuffer (frame-root-window minibuffer-only-frame))
   (frame-parameter minibuffer-less-frame 'minibuffer))

This reveals a number of problems with how we currently handle the
'minibuffer' frame parameter and how it's documented.  In section
28.4.3.5 we say about this parameter:

`minibuffer'
      Whether this frame has its own minibuffer.  The value `t' means
      yes, `nil' means no, `only' means this frame is just a minibuffer.
      If the value is a minibuffer window (in some other frame), the
      frame uses that minibuffer.

      This frame parameter takes effect when the frame is created, and
      can not be changed afterwards.

The sentence "If the value is a minibuffer window (in some other frame),
the frame uses that minibuffer." is misleading.  A minibuffer window is
reported iff that window is on the _same_ frame and that frame is not a
minibuffer-only frame.  A minibuffer window in some other frame is never
reported.

But if the frame is minibuffer-less and uses the minibuffer window of
some other frame, we return as value nil although the real, internal
frame parameter's value (not the one produced by the

   store_in_alist (&alist, Qminibuffer,
		  (! FRAME_HAS_MINIBUF_P (f) ? Qnil
		   : FRAME_MINIBUF_ONLY_P (f) ? Qonly
		   : FRAME_MINIBUF_WINDOW (f)));

construct) is actually that window.  Otherwise, evaluating the
‘set-frame-parameter’ above would have produced an error.  Which means
that the sentence "This frame parameter takes effect when the frame is
created, and can not be changed afterwards." is misleading as well.  In
fact, setting the 'minibuffer' frame parameter is the only way to change
the minibuffer window for a specific frame.

Note in this context that ‘minibuffer-window’ returns the correct
minibuffer window for its FRAME argument while ‘set-minibuffer-window’
does not allow to set the minibuffer window for a specific frame.

I'm not sure how to deal with this situation.  Personally, I'd prefer to
report the real, internal 'minibuffer' parameter but am afraid that
might break existing code.  In any case, the documentation should be
fixed.  Somehow.

martin




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

* Re: About the 'minibuffer' frame parameter
  2016-07-31 18:12 About the 'minibuffer' frame parameter martin rudalics
@ 2016-08-05 13:33 ` Eli Zaretskii
  2016-08-05 16:37   ` martin rudalics
  0 siblings, 1 reply; 43+ messages in thread
From: Eli Zaretskii @ 2016-08-05 13:33 UTC (permalink / raw)
  To: martin rudalics; +Cc: emacs-devel

> Date: Sun, 31 Jul 2016 20:12:46 +0200
> From: martin rudalics <rudalics@gmx.at>
> 
> I'm not sure how to deal with this situation.  Personally, I'd prefer to
> report the real, internal 'minibuffer' parameter but am afraid that
> might break existing code.

You mean, you think there's some code out there that expects to
receive nil in that case?  Do we have any code in our tree that might
expect that?

> In any case, the documentation should be fixed.  Somehow.

Before fixing the docs we should decide what the code should do.

Thanks.



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

* Re: About the 'minibuffer' frame parameter
  2016-08-05 13:33 ` Eli Zaretskii
@ 2016-08-05 16:37   ` martin rudalics
  2016-08-05 17:18     ` Drew Adams
  2016-08-05 19:25     ` Eli Zaretskii
  0 siblings, 2 replies; 43+ messages in thread
From: martin rudalics @ 2016-08-05 16:37 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

 >> I'm not sure how to deal with this situation.  Personally, I'd prefer to
 >> report the real, internal 'minibuffer' parameter but am afraid that
 >> might break existing code.
 >
 > You mean, you think there's some code out there that expects to
 > receive nil in that case?  Do we have any code in our tree that might
 > expect that?

I'm afraid so, yes.  Otherwise this rigmarole would hardly make sense.

But I haven't checked all places because I rather soonish stumbled upon
things like

(eq (cdr (or (assq 'minibuffer initial-frame-alist)
	     (assq 'minibuffer window-system-frame-alist)
	     (assq 'minibuffer default-frame-alist)
	     '(minibuffer . t)))
     t)

in ‘frame-notice-user-settings’.  And one revealing comment is in
‘set-frame-configuration’:

                ;; Since we can't set a frame's minibuffer status,
                ;; we might as well omit the parameter altogether.

 >> In any case, the documentation should be fixed.  Somehow.
 >
 > Before fixing the docs we should decide what the code should do.

That's what I tried to initiate.  Is there anyone out there who has an
idea how the 'minibuffer' parameter should be set and used?  Maybe
nobody uses them any more.

martin




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

* RE: About the 'minibuffer' frame parameter
  2016-08-05 16:37   ` martin rudalics
@ 2016-08-05 17:18     ` Drew Adams
  2016-08-05 17:35       ` martin rudalics
  2016-08-05 19:25     ` Eli Zaretskii
  1 sibling, 1 reply; 43+ messages in thread
From: Drew Adams @ 2016-08-05 17:18 UTC (permalink / raw)
  To: martin rudalics, Eli Zaretskii; +Cc: emacs-devel

> Is there anyone out there who has an idea how the 'minibuffer'
> parameter should be set and used?  Maybe nobody uses them any more.

If by "them" you mean frame parameter `minibuffer' then yes, I use it.

I create a standalone minibuffer frame, so my `minibuffer-frame-alist'
has (minibuffer . only), using (setq minibuffer-frame-alist ...).

And my `default-frame-alist' has (minibuffer), aka (minibuffer . nil).
I do that similarly: (setq default-frame-alist...).

But I think you probably knew all that, so it is perhaps not really
what you are asking.



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

* Re: About the 'minibuffer' frame parameter
  2016-08-05 17:18     ` Drew Adams
@ 2016-08-05 17:35       ` martin rudalics
  2016-08-05 17:52         ` Drew Adams
  0 siblings, 1 reply; 43+ messages in thread
From: martin rudalics @ 2016-08-05 17:35 UTC (permalink / raw)
  To: Drew Adams, Eli Zaretskii; +Cc: emacs-devel


 >> Is there anyone out there who has an idea how the 'minibuffer'
 >> parameter should be set and used?  Maybe nobody uses them any more.
 >
 > If by "them" you mean frame parameter `minibuffer' then yes, I use it.
 >
 > I create a standalone minibuffer frame, so my `minibuffer-frame-alist'
 > has (minibuffer . only), using (setq minibuffer-frame-alist ...).
 >
 > And my `default-frame-alist' has (minibuffer), aka (minibuffer . nil).
 > I do that similarly: (setq default-frame-alist...).
 >
 > But I think you probably knew all that, so it is perhaps not really
 > what you are asking.

I know that you use stand-alone minibuffers and that you have to _set_
the 'minibuffer' frame parameter for that.  I wanted to know how people
_use_ that parameter after, for example, doing

(frame-parameter nil 'minibuffer)

If nobody _uses_ it then we don't have to care about it.

martin




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

* RE: About the 'minibuffer' frame parameter
  2016-08-05 17:35       ` martin rudalics
@ 2016-08-05 17:52         ` Drew Adams
  2016-08-05 18:19           ` martin rudalics
  0 siblings, 1 reply; 43+ messages in thread
From: Drew Adams @ 2016-08-05 17:52 UTC (permalink / raw)
  To: martin rudalics, Eli Zaretskii; +Cc: emacs-devel

>  >> Is there anyone out there who has an idea how the 'minibuffer'
>  >> parameter should be set and used?  Maybe nobody uses them any more.
>  >
>  > If by "them" you mean frame parameter `minibuffer' then yes, I use it.
>  > I create a standalone minibuffer frame, so my `minibuffer-frame-alist'
>  > has (minibuffer . only), using (setq minibuffer-frame-alist ...).
>  > And my `default-frame-alist' has (minibuffer), aka (minibuffer . nil).
>  > I do that similarly: (setq default-frame-alist...).
> 
> I know that you use stand-alone minibuffers and that you have to _set_
> the 'minibuffer' frame parameter for that.  I wanted to know how people
> _use_ that parameter after, for example, doing
> 
> (frame-parameter nil 'minibuffer)
> 
> If nobody _uses_ it then we don't have to care about it.

Dunno what you mean by "care about it".  Just what are you proposing
to change, so as to no longer "care about it"?

I have code that does things to frames, and checks whether a given
frame is a standalone minibuffer frame.  My code typically checks
whether it is just MY standalone minibuffer frame, by checking variable
`1on1-minibuffer-frame'.  But more generally such code would check
the `minibuffer' frame parameter.  I don't see why we would eliminate
that possibility.

And I believe that Juanma's frameset code carefully distinguishes
standalone minibuffer frames from others, by checking that parameter.

I think that Emacs users should continue to be able to test, as well
as set the `minibuffer' frame parameter.  Why shouldn't they?



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

* Re: About the 'minibuffer' frame parameter
  2016-08-05 17:52         ` Drew Adams
@ 2016-08-05 18:19           ` martin rudalics
  2016-08-05 18:37             ` Drew Adams
  0 siblings, 1 reply; 43+ messages in thread
From: martin rudalics @ 2016-08-05 18:19 UTC (permalink / raw)
  To: Drew Adams, Eli Zaretskii; +Cc: emacs-devel

 > Dunno what you mean by "care about it".

Care about the issue(s) that started this thread.

 > Just what are you proposing
 > to change, so as to no longer "care about it"?

Nothing.  As long as nobody cares about these issues.

 > I have code that does things to frames, and checks whether a given
 > frame is a standalone minibuffer frame.  My code typically checks
 > whether it is just MY standalone minibuffer frame, by checking variable
 > `1on1-minibuffer-frame'.  But more generally such code would check
 > the `minibuffer' frame parameter.  I don't see why we would eliminate
 > that possibility.

I don't want to eliminate anything.

 > And I believe that Juanma's frameset code carefully distinguishes
 > standalone minibuffer frames from others, by checking that parameter.
 >
 > I think that Emacs users should continue to be able to test, as well
 > as set the `minibuffer' frame parameter.  Why shouldn't they?

Because IIUC they do not care much about "testing" it.  Otherwise they
would have complained already.

martin



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

* RE: About the 'minibuffer' frame parameter
  2016-08-05 18:19           ` martin rudalics
@ 2016-08-05 18:37             ` Drew Adams
  2016-08-06  9:32               ` martin rudalics
  0 siblings, 1 reply; 43+ messages in thread
From: Drew Adams @ 2016-08-05 18:37 UTC (permalink / raw)
  To: martin rudalics, Eli Zaretskii; +Cc: emacs-devel

>  > Dunno what you mean by "care about it".
> 
> Care about the issue(s) that started this thread.

They are not clear to me, even on re-reading.

>  > Just what are you proposing
>  > to change, so as to no longer "care about it"?
> 
> Nothing.  As long as nobody cares about these issues.

I don't know what the issues are.  But I definitely care about
frame parameter `minibuffer'.  But if you are proposing doing
"Nothing" then I guess I have nothing to worry about. ;-)

> I don't want to eliminate anything.

Good.

>  > And I believe that Juanma's frameset code carefully distinguishes
>  > standalone minibuffer frames from others, by checking that parameter.
>  >
>  > I think that Emacs users should continue to be able to test, as well
>  > as set the `minibuffer' frame parameter.  Why shouldn't they?
> 
> Because IIUC they do not care much about "testing" it.  Otherwise they
> would have complained already.

What is the problem with testing it?

frameset.el tests it.  And I test it.  I `redirect-frame-focus' of a
minibuffer-less frame for *Completions* to my standalone minibuffer
frame, for example:

(let ((redirect  (if (active-minibuffer-window)
                     1on1-minibuffer-frame
                   (and completion-reference-buffer
                        (get-buffer-window completion-reference-buffer
                                           'visible)
                        (not (eq (get-buffer "*Completions*")
                                 completion-reference-buffer))
                        (window-frame
                          (get-buffer-window
                             completion-reference-buffer t))))))
  (when redirect (redirect-frame-focus (selected-frame) redirect)))

Okay, I don't actually test the frame parameter here explicitly, but
the code depends on it being and acting as it does, I think.



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

* Re: About the 'minibuffer' frame parameter
  2016-08-05 16:37   ` martin rudalics
  2016-08-05 17:18     ` Drew Adams
@ 2016-08-05 19:25     ` Eli Zaretskii
  2016-08-06  9:33       ` martin rudalics
  1 sibling, 1 reply; 43+ messages in thread
From: Eli Zaretskii @ 2016-08-05 19:25 UTC (permalink / raw)
  To: martin rudalics; +Cc: emacs-devel

> Date: Fri, 05 Aug 2016 18:37:50 +0200
> From: martin rudalics <rudalics@gmx.at>
> CC: emacs-devel@gnu.org
> 
>  > You mean, you think there's some code out there that expects to
>  > receive nil in that case?  Do we have any code in our tree that might
>  > expect that?
> 
> I'm afraid so, yes.  Otherwise this rigmarole would hardly make sense.
> 
> But I haven't checked all places because I rather soonish stumbled upon
> things like
> 
> (eq (cdr (or (assq 'minibuffer initial-frame-alist)
> 	     (assq 'minibuffer window-system-frame-alist)
> 	     (assq 'minibuffer default-frame-alist)
> 	     '(minibuffer . t)))
>      t)
> 
> in ‘frame-notice-user-settings’.  And one revealing comment is in
> ‘set-frame-configuration’:
> 
>                 ;; Since we can't set a frame's minibuffer status,
>                 ;; we might as well omit the parameter altogether.

We could simply change the above code to follow suit.



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

* Re: About the 'minibuffer' frame parameter
  2016-08-05 18:37             ` Drew Adams
@ 2016-08-06  9:32               ` martin rudalics
  2016-08-06 16:46                 ` Drew Adams
  0 siblings, 1 reply; 43+ messages in thread
From: martin rudalics @ 2016-08-06  9:32 UTC (permalink / raw)
  To: Drew Adams, Eli Zaretskii; +Cc: emacs-devel

 > They are not clear to me, even on re-reading.

Sorry for being unclear.  Let me try once more: With emacs -Q, yank the
following forms into *scratch*

(defvar initial-frame (selected-frame))
(defvar minibuffer-less-frame (make-frame '((minibuffer . nil))))
(defvar minibuffer-only-frame (make-frame '((minibuffer . only))))

and evaluate them.  You should see three frames - the "normal" initial
one, a minibuffer-less frame, and a minibuffer-only one.  Correct?

Now in the minibuffer-less frame evaluate

(frame-parameter minibuffer-less-frame 'minibuffer)

and Emacs will print nil in the minibuffer window of the initial frame.
Next evaluate

(set-frame-parameter
  minibuffer-less-frame 'minibuffer (frame-root-window minibuffer-only-frame))

and you will see nil in the minibuffer window of the minibuffer-only
frame.  Now evaluate

(set-frame-parameter
  minibuffer-less-frame 'minibuffer (minibuffer-window initial-frame))

and you will see nil in the minibuffer window of the initial frame
again.

 From this we can conclude the following:

(1) Emacs does redirect output to the minibuffer window of the frame
     specified via ‘set-frame-parameter’.  This follows from the
     experiment above because you see the value reported by
     ‘frame-parameter’ appear in different minibuffer windows.

(2) Any such redirection is not reflected in the 'minibuffer' value
     reported by ‘frame-parameter’: That value remains nil invariably.

Do you agree so far?  Then I see the following problems.

 From (2) the 'minibuffer' value assigned by ‘set-frame-parameter’ is not
reflected in the 'minibuffer' value returned by ‘frame-parameter’.  This
is not critical per se (a similar thing may happen to geometry
parameters) but it's misleading because, as we can conclude from (1),
something has changed.

Moreover in section 28.4.3.5 Buffer Parameters of the Elisp manual we
say:

`minibuffer'
      Whether this frame has its own minibuffer.  The value `t' means
      yes, `nil' means no, `only' means this frame is just a minibuffer.
      If the value is a minibuffer window (in some other frame), the
      frame uses that minibuffer.

      This frame parameter takes effect when the frame is created, and
      can not be changed afterwards.

But apparently it is possible to change the 'minibuffer' frame parameter
after a frame was created since otherwise we were not able to redirect
output as mentioned in (1).

Regardless of whatever ‘frame-parameter’ reports, the value of the frame
parameter stored by Emacs internally is the window specified by
(frame-root-window minibuffer-only-frame).  The routine constructing the
‘frame-parameters’ alist replaces the real internal value by the value
nil.

Finally evaluate the form

(frame-parameter initial-frame 'minibuffer)

You will see something like

#<window 4 on  *Minibuf-0*>

appear in the minibuffer window.  This is a window on the initial frame.
‘frame-parameter’ returns a minibuffer window if and only if that
minibuffer window is on the _same_ frame as the one whose minibuffer
value I try to retrieve.  You can't convince ‘frame-parameter’ to report
a minibuffer window "in some other frame" as the manual suggests.

Am I still unclear?

 >> Because IIUC they do not care much about "testing" it.  Otherwise they
 >> would have complained already.
 >
 > What is the problem with testing it?

That the "reported" value does not reflect the "set" value as described
above.

 > frameset.el tests it.  And I test it.  I `redirect-frame-focus' of a
 > minibuffer-less frame for *Completions* to my standalone minibuffer
 > frame, for example:
[...]
 > Okay, I don't actually test the frame parameter here explicitly, but
 > the code depends on it being and acting as it does, I think.

I don't think so.  You just use the return value of ‘make-frame’ invoked
with a (minibuffer . only) parameter.  Alternatively, you might use

(window-frame (minibuffer-window my-minibuffer-less-frame))

In general, ‘frame-parameter’ is useless for finding the minibuffer frame.

As long as nobody works with the return value of ‘frame-parameter’ there
are no problems.  On the C-level code works with the "real" value of the
parameter as set by ‘set-frame-parameter’ and does not have the problems
I mentioned here.  Actually, C-code never even consults that value - it
only sets it.

martin




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

* Re: About the 'minibuffer' frame parameter
  2016-08-05 19:25     ` Eli Zaretskii
@ 2016-08-06  9:33       ` martin rudalics
  2016-08-07 13:54         ` Eli Zaretskii
  0 siblings, 1 reply; 43+ messages in thread
From: martin rudalics @ 2016-08-06  9:33 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

 > We could simply change the above code to follow suit.

Change what?  Initially I only wanted to simplify code like

(FRAME_HAS_MINIBUF_P (f) && !FRAME_MINIBUF_ONLY_P (f))

because once f has been created, FRAME_HAS_MINIBUF_P (f) and
!FRAME_MINIBUF_ONLY_P (f) invariantly hold for the entire lifetime of f.
A bit field telling whether a frame owns a minibuffer or is
minibuffer-only/-less seems more practical instead of these macros.  The
value stored in that bit field would have to reflect the value stored in
the 'minibuffer' frame parameter.  But for a minibuffer-less frame we
OT1H store the minibuffer window in that parameter and OTOH we report
the value nil for that parameter in ‘frame-parameters’.

We could either modify that code in store_frame_param

   if (EQ (prop, Qminibuffer) && WINDOWP (val))
     {
       if (! MINI_WINDOW_P (XWINDOW (val)))
	error ("Surrogate minibuffer windows must be minibuffer windows");

       if ((FRAME_HAS_MINIBUF_P (f) || FRAME_MINIBUF_ONLY_P (f))
	  && !EQ (val, f->minibuffer_window))
	error ("Can't change the surrogate minibuffer of a frame with its own minibuffer");

       /* Install the chosen minibuffer window, with proper buffer.  */
       fset_minibuffer_window (f, val);
     }

to store Qnil instead of the minibuffer window or do away with the
special treatment of the 'minibuffer' parameter in ‘frame-parameters’ as
I mentioned earlier.

The former should be sane because so far C-code always goes for the
value of FRAME_MINIBUF_WINDOW to find the minibuffer window of a frame.
However, we'd still have to explain that ‘set-frame-parameter’ can
change a frame's minibuffer window without reflecting the change in the
return value of ‘frame-parameters’.

As mentioned before, removing the special treatment of the 'minibuffer'
parameter in ‘frame-parameters’ would imply that Elisp code relying on
the values we report currently might be broken in the future.  The doc
change required for this solution would be marginal.

Things would be much clearer if we had provided some orthogonality of
‘minibuffer-window’ and ‘set-minibuffer-window’.

martin




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

* RE: About the 'minibuffer' frame parameter
  2016-08-06  9:32               ` martin rudalics
@ 2016-08-06 16:46                 ` Drew Adams
  2016-08-07  8:46                   ` martin rudalics
  0 siblings, 1 reply; 43+ messages in thread
From: Drew Adams @ 2016-08-06 16:46 UTC (permalink / raw)
  To: martin rudalics, Eli Zaretskii; +Cc: emacs-devel

> With emacs -Q, yank the following forms into *scratch*
> (defvar initial-frame (selected-frame))
> (defvar minibuffer-less-frame (make-frame '((minibuffer . nil))))
> (defvar minibuffer-only-frame (make-frame '((minibuffer . only))))
> and evaluate them.  You should see three frames - the "normal" initial
> one, a minibuffer-less frame, and a minibuffer-only one.  Correct?

Yes.

> Now in the minibuffer-less frame evaluate
> (frame-parameter minibuffer-less-frame 'minibuffer)
> and Emacs will print nil in the minibuffer window of the initial frame.

Yes.

> Next evaluate
> (set-frame-parameter minibuffer-less-frame 'minibuffer
>                      (frame-root-window minibuffer-only-frame))
> and you will see nil in the minibuffer window of the
> minibuffer-only frame.

Yes.

> Now evaluate
> (set-frame-parameter minibuffer-less-frame 'minibuffer
>                      (minibuffer-window initial-frame))
> and you will see nil in the minibuffer window of the initial
> frame again.

Yes.

>  From this we can conclude the following:
> 
> (1) Emacs does redirect output to the minibuffer window of the frame
>     specified via ‘set-frame-parameter’.  This follows from the
>     experiment above because you see the value reported by
>     ‘frame-parameter’ appear in different minibuffer windows.

Yes.

> (2) Any such redirection is not reflected in the 'minibuffer' value
>     reported by ‘frame-parameter’: That value remains nil invariably.
> 
> Do you agree so far?

Yes...  Or maybe not.  Doesn't that conclusion depend on
supposing that `set-frame-parameter' returns the new parameter
value?  I don't see the return value of that function mentioned
in its doc string or in the manual.  (Maybe it should be?)

But anyway, if you're sure that the value of `frame-parameter'
is nil (I assume you checked this in the C code), then OK.

> Then I see the following problems.
> 
> From (2) the 'minibuffer' value assigned by ‘set-frame-parameter’ is not
> reflected in the 'minibuffer' value returned by ‘frame-parameter’.  This
> is not critical per se (a similar thing may happen to geometry
> parameters) but it's misleading because, as we can conclude from (1),
> something has changed.

Yes, it is misleading.  But why is it not critical (a problem)?
And why does it happen also for geometry parameters?  (And why
does it happen for `frame-parameter'?)

> Moreover in section 28.4.3.5 Buffer Parameters of the Elisp
> manual we say:
> 
> `minibuffer'
>    Whether this frame has its own minibuffer.  The value `t' means
>    yes, `nil' means no, `only' means this frame is just a minibuffer.
>    If the value is a minibuffer window (in some other frame), the
>    frame uses that minibuffer.
> 
>    This frame parameter takes effect when the frame is created, and
>    can not be changed afterwards.
     ^^^^^^^
     cannot (typo)
 
> But apparently it is possible to change the 'minibuffer' frame parameter
> after a frame was created since otherwise we were not able to redirect
> output as mentioned in (1).

Yes.  And why not be able to do that?  And if there is a good
reason not to, then maybe Emacs should be fixed to not do it (?).

> Regardless of whatever ‘frame-parameter’ reports, the value of the frame
> parameter stored by Emacs internally is the window specified by
> (frame-root-window minibuffer-only-frame).  The routine constructing the
> ‘frame-parameters’ alist replaces the real internal value by the value
> nil.

Hm.

> Finally evaluate the form
> (frame-parameter initial-frame 'minibuffer)
> You will see something like #<window 4 on  *Minibuf-0*>

Yes.

> appear in the minibuffer window.  This is a window on the initial frame.
> ‘frame-parameter’ returns a minibuffer window if and only if that
> minibuffer window is on the _same_ frame as the one whose minibuffer
> value I try to retrieve.  You can't convince ‘frame-parameter’ to report
> a minibuffer window "in some other frame" as the manual suggests.
> 
> Am I still unclear?

No.

>  >> Because IIUC they do not care much about "testing" it.
>  >> Otherwise they would have complained already.
>  > What is the problem with testing it?
> 
> That the "reported" value does not reflect the "set" value as
> described above.
> 
>  > frameset.el tests it.
>  > And I test it.  I `redirect-frame-focus' of a minibuffer-less
>  > frame for *Completions* to my standalone minibuffer frame,
>  > for example:
> [...]
>  > Okay, I don't actually test the frame parameter here explicitly,
>  > but the code depends on it being and acting as it does, I think.
> 
> I don't think so.  You just use the return value of ‘make-frame’
> invoked with a (minibuffer . only) parameter.  Alternatively,
> you might use (window-frame (minibuffer-window
>                               my-minibuffer-less-frame))

Yes.  I don't test it with `frame-parameter'.  And I understand
that what you are saying is that it is only the value of
`frame-parameter' that is useless.

But `frameset.el' does test it, AFAICT.  Take a look at
`frameset--record-minibuffer-relationships', for example.
Perhaps there is a bug lurking there (?).

> In general, ‘frame-parameter’ is useless for finding the 
> minibuffer frame.

If that is the correct behavior then it should be doc'd.
Is it the correct behavior?

> As long as nobody works with the return value of ‘frame-parameter’ there
> are no problems.  On the C-level code works with the "real" value of the
> parameter as set by ‘set-frame-parameter’ and does not have the problems
> I mentioned here.  Actually, C-code never even consults that value - it
> only sets it.

It seems that Lisp code generally does likewise: set it but
not test it.  The `frameset.el' code does seem to test it,
however.

Thanks for explaining.



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

* Re: About the 'minibuffer' frame parameter
  2016-08-06 16:46                 ` Drew Adams
@ 2016-08-07  8:46                   ` martin rudalics
  2017-01-14  0:59                     ` Juanma Barranquero
  0 siblings, 1 reply; 43+ messages in thread
From: martin rudalics @ 2016-08-07  8:46 UTC (permalink / raw)
  To: Drew Adams, Eli Zaretskii; +Cc: emacs-devel

 > Yes...  Or maybe not.  Doesn't that conclusion depend on
 > supposing that `set-frame-parameter' returns the new parameter
 > value?  I don't see the return value of that function mentioned
 > in its doc string or in the manual.  (Maybe it should be?)

It's irrelevant - the return value is that of ‘modify-frame-parameters’
and that's always nil.  Here I only care about _where_ nil gets printed,
that is, in which minibuffer window.

 > But anyway, if you're sure that the value of `frame-parameter'
 > is nil (I assume you checked this in the C code), then OK.

   (set-frame-parameter
    minibuffer-less-frame 'minibuffer (frame-root-window minibuffer-only-frame))

sets the internal value of the 'minibuffer' frame parameter to the
specified minibuffer window.  Only the value reported afterwards by
‘frame-parameter’ is nil.

 > Yes, it is misleading.  But why is it not critical (a problem)?

Because internally Emacs ignores the frame parameter's value and relies
on the value returned by ‘minibuffer-window’ instead.  The corresponding
macro is FRAME_MINIBUF_WINDOW.  C code hardly ever consults frame
parameter alists, probably for two reasons: (1) Their values are either
inaccurate or don't exist, and (2) it might be too costly to do so.

 > And why does it happen also for geometry parameters?  (And why
 > does it happen for `frame-parameter'?)

Because the frame geometry changes for a number of reasons, for example,
when you maximize a frame or use the mouse to resize it.  In this case
Emacs has to tediously approximate the values of the 'height' or 'width'
parameters from the real ones, the ones the user sees on the screen.

The values of many parameters reported by ‘frame-parameters’ are
constructed ad-hoc from internal values (see Fframe_parameters for some
general parameters and x_report_frame_params for the X Window related
ones).

What annoys me about the 'minibuffer' parameter is that it OT1H does not
depend on any extraneous issue like a toolkit that is only able to draw
things in certain sizes (like scroll bars on GTK) and that OTOH someone
decided that in some cases it should specify a window which is not its
task.

 >>     This frame parameter takes effect when the frame is created, and
 >>     can not be changed afterwards.
 >       ^^^^^^^
 >       cannot (typo)

A Freudian one, perhaps.

 >> But apparently it is possible to change the 'minibuffer' frame parameter
 >> after a frame was created since otherwise we were not able to redirect
 >> output as mentioned in (1).
 >
 > Yes.  And why not be able to do that?  And if there is a good
 > reason not to, then maybe Emacs should be fixed to not do it (?).

Conceptually, it's a bad idea to set the value of that frame parameter:
When, for a minibuffer-less frame, you want to use another minibuffer
window, you do not (and cannot) change the frame's minibuffer-less
status.  So the frame parameter's value should stay unaltered indeed,
ideally.

But how else change the minibuffer window of a minibuffer-less frame?

 > Yes.  I don't test it with `frame-parameter'.  And I understand
 > that what you are saying is that it is only the value of
 > `frame-parameter' that is useless.
 >
 > But `frameset.el' does test it, AFAICT.  Take a look at
 > `frameset--record-minibuffer-relationships', for example.
 > Perhaps there is a bug lurking there (?).

IIUC ‘frameset--record-minibuffer-relationships’ is an attempt to fix
what gets reported via ‘frame-parameters’.  It must have been a hair
raising experience for Juanma to code that.  Given a doc-string like


default-minibuffer-frame is a variable defined in ‘frame.c’.
Its value is #<frame frameset.el 02204f48>
It is a terminal-local variable; global value is the same.

Documentation:
Minibufferless frames use this frame’s minibuffer.
Emacs cannot create minibufferless frames unless this is set to an
appropriate surrogate.

Emacs consults this variable only when creating minibufferless
frames; once the frame is created, it sticks with its assigned
minibuffer, no matter what this variable is set to.  This means that
this variable doesn’t necessarily say anything meaningful about the
current set of frames, or where the minibuffer is currently being
displayed.

This variable is local to the current terminal and cannot be buffer-local.


which is wrong (because a frame does not necessarily "stick" with its
assigned minibuffer) and not useful either (what should I make of
information like "this variable doesn’t necessarily say anything
meaningful about the current set of frames, or where the minibuffer is
currently being displayed").

Also, ‘frameset-filter-minibuffer’ seems to do the right thing.  It's
doc-string says

   When saving, convert (minibuffer . #<window>) to (minibuffer . t).

which fixes the mind-boggling sillyness that ‘frame-parameter’ reports a
frame's own minibuffer window when it has one.

I slowly begin to understand why Juanma gave up coding for Emacs :-(

martin




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

* Re: About the 'minibuffer' frame parameter
  2016-08-06  9:33       ` martin rudalics
@ 2016-08-07 13:54         ` Eli Zaretskii
  2016-08-08  8:27           ` martin rudalics
  0 siblings, 1 reply; 43+ messages in thread
From: Eli Zaretskii @ 2016-08-07 13:54 UTC (permalink / raw)
  To: martin rudalics; +Cc: emacs-devel

> Date: Sat, 06 Aug 2016 11:33:55 +0200
> From: martin rudalics <rudalics@gmx.at>
> Cc: emacs-devel@gnu.org

I must admit I'm a bit confused about the issues you raise.  So let me
make a step or two back, before we continue.

You started by saying:

> (progn
>   (setq minibuffer-less-frame (make-frame '((minibuffer . nil))))
>   (setq minibuffer-only-frame (make-frame '((minibuffer . only))))
> 
>   (set-frame-parameter
>    minibuffer-less-frame 'minibuffer (frame-root-window minibuffer-only-frame))
>   (frame-parameter minibuffer-less-frame 'minibuffer))
> [...]
> But if the frame is minibuffer-less and uses the minibuffer window of
> some other frame, we return as value nil although the real, internal
> frame parameter's value (not the one produced by the
> 
>   store_in_alist (&alist, Qminibuffer,
>                   (! FRAME_HAS_MINIBUF_P (f) ? Qnil
>                    : FRAME_MINIBUF_ONLY_P (f) ? Qonly
>                    : FRAME_MINIBUF_WINDOW (f)));
> 
> construct) is actually that window.  Otherwise, evaluating the
> ‘set-frame-parameter’ above would have produced an error.

I don't understand the last sentence: it starts with "otherwise",
which seems to imply that if frame-parameter did not produce nil for a
minibuffer-less frame, the call to set-frame-parameter would somehow
signal an error.  However, I don't see any relation between what
(frame-parameter FRAME 'minibuffer) returns and any calls to
set-frame-parameter for the same frame.  So what error were you
talking about?

Next, the documentation issue:

  `minibuffer'
       Whether this frame has its own minibuffer.  The value `t' means
       yes, `nil' means no, `only' means this frame is just a minibuffer.
       If the value is a minibuffer window (in some other frame), the
       frame uses that minibuffer.

       This frame parameter takes effect when the frame is created, and
       can not be changed afterwards.

  The sentence "If the value is a minibuffer window (in some other frame),
  the frame uses that minibuffer." is misleading.  A minibuffer window is
  reported iff that window is on the _same_ frame and that frame is not a
  minibuffer-only frame.  A minibuffer window in some other frame is never
  reported.

So when do we report t?  It sounds like the answer is "never", right?
IOW, the documentation seems to describe some situation that existed
in the past, and is now OBE due to code changes.  Correct?

> Note in this context that ‘minibuffer-window’ returns the correct
> minibuffer window for its FRAME argument while ‘set-minibuffer-window’
> does not allow to set the minibuffer window for a specific frame.

IMO, this is a separate, albeit probably related, issue.  Are there
any problems to let set-minibuffer-window allow setting the minibuffer
window of a frame?

> I'm not sure how to deal with this situation.  Personally, I'd prefer to
> report the real, internal 'minibuffer' parameter

And I implicitly agreed with that.

> but am afraid that might break existing code.

And for that, I proposed:

> > But I haven't checked all places because I rather soonish stumbled upon
> > things like
> > 
> > (eq (cdr (or (assq 'minibuffer initial-frame-alist)
> >            (assq 'minibuffer window-system-frame-alist)
> >            (assq 'minibuffer default-frame-alist)
> >            '(minibuffer . t)))
> >      t)
> > 
> > in ‘frame-notice-user-settings’.  And one revealing comment is in
> > ‘set-frame-configuration’:
> > 
> >                 ;; Since we can't set a frame's minibuffer status,
> >                 ;; we might as well omit the parameter altogether.
> 
> We could simply change the above code to follow suit.

To which you replied:

> Change what?

Obviously, change the Lisp snippet shown above, which expects to see a
nil minibuffer parameter for minibuffer-less frames.  Change it not to
expect that, and instead test the minibuffer window for whether it is
on the same frame or not.

> Initially I only wanted to simplify code like
> 
> (FRAME_HAS_MINIBUF_P (f) && !FRAME_MINIBUF_ONLY_P (f))
> 
> because once f has been created, FRAME_HAS_MINIBUF_P (f) and
> !FRAME_MINIBUF_ONLY_P (f) invariantly hold for the entire lifetime of f.
> A bit field telling whether a frame owns a minibuffer or is
> minibuffer-only/-less seems more practical instead of these macros.  The
> value stored in that bit field would have to reflect the value stored in
> the 'minibuffer' frame parameter.  But for a minibuffer-less frame we
> OT1H store the minibuffer window in that parameter and OTOH we report
> the value nil for that parameter in ‘frame-parameters’.

I think we should report the window, i.e. the actual value stored in
that parameter.

> We could either modify that code in store_frame_param
> 
>   if (EQ (prop, Qminibuffer) && WINDOWP (val))
>     {
>       if (! MINI_WINDOW_P (XWINDOW (val)))
>         error ("Surrogate minibuffer windows must be minibuffer windows");

>       if ((FRAME_HAS_MINIBUF_P (f) || FRAME_MINIBUF_ONLY_P (f))
>           && !EQ (val, f->minibuffer_window))
>         error ("Can't change the surrogate minibuffer of a frame with its own 
> minibuffer");
> 
>       /* Install the chosen minibuffer window, with proper buffer.  */
>       fset_minibuffer_window (f, val);
>     }
> 
> to store Qnil instead of the minibuffer window or do away with the
> special treatment of the 'minibuffer' parameter in ‘frame-parameters’ as
> I mentioned earlier.

I like the latter possibility much better.  In general, I prefer to
report the actual values whenever possible, especially when we have no
reason to hide the value from Lisp applications.

> As mentioned before, removing the special treatment of the 'minibuffer'
> parameter in ‘frame-parameters’ would imply that Elisp code relying on
> the values we report currently might be broken in the future.

And my suggestion to that was to fix that code, wherever we find it.

> Things would be much clearer if we had provided some orthogonality of
> ‘minibuffer-window’ and ‘set-minibuffer-window’.

Not sure what you mean by "orthogonality" here.



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

* Re: About the 'minibuffer' frame parameter
  2016-08-07 13:54         ` Eli Zaretskii
@ 2016-08-08  8:27           ` martin rudalics
  2016-08-08 15:34             ` Eli Zaretskii
  0 siblings, 1 reply; 43+ messages in thread
From: martin rudalics @ 2016-08-08  8:27 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

 > You started by saying:
 >
 >> (progn
 >>    (setq minibuffer-less-frame (make-frame '((minibuffer . nil))))
 >>    (setq minibuffer-only-frame (make-frame '((minibuffer . only))))
 >>
 >>    (set-frame-parameter
 >>     minibuffer-less-frame 'minibuffer (frame-root-window minibuffer-only-frame))
 >>    (frame-parameter minibuffer-less-frame 'minibuffer))
 >> [...]
 >> But if the frame is minibuffer-less and uses the minibuffer window of
 >> some other frame, we return as value nil although the real, internal
 >> frame parameter's value (not the one produced by the
 >>
 >>    store_in_alist (&alist, Qminibuffer,
 >>                    (! FRAME_HAS_MINIBUF_P (f) ? Qnil
 >>                     : FRAME_MINIBUF_ONLY_P (f) ? Qonly
 >>                     : FRAME_MINIBUF_WINDOW (f)));
 >>
 >> construct) is actually that window.  Otherwise, evaluating the
 >> ‘set-frame-parameter’ above would have produced an error.
 >
 > I don't understand the last sentence: it starts with "otherwise",
 > which seems to imply that if frame-parameter did not produce nil for a
 > minibuffer-less frame, the call to set-frame-parameter would somehow
 > signal an error.

If with emacs -Q I do

(let ((minibuffer-only-frame (make-frame '((minibuffer . only)))))
   (set-frame-parameter
    nil 'minibuffer (frame-root-window minibuffer-only-frame)))

I get an error like "Can’t change the surrogate minibuffer of a frame
with its own minibuffer".  Now, an application that wants to assign a
new minibuffer window for an arbitrary frame has two ways to avoid that
error: Either it uses

(not (eq (window-frame (minibuffer-window frame))) frame)

or

(not (frame-parameter frame 'minibuffer))

The former is pretty contrived.  For example, the coder would have to
know that the frame of a minibuffer-only frame's minibuffer window is
that frame.  So I expect that most applications would prefer the latter.
But in order to make that feasible, ‘frame-parameter’ has to report nil
for the 'minibuffer' parameter of a minibuffer-less frame.

However, the judgment whether to raise an error is based on evaluating
FRAME_HAS_MINIBUF_P and _not_ on checking the frame parameter.  So when
you look at the implementation of ‘set-frame-parameter’, my sentence is
indeed misleading.

 > However, I don't see any relation between what
 > (frame-parameter FRAME 'minibuffer) returns and any calls to
 > set-frame-parameter for the same frame.  So what error were you
 > talking about?

I'm not talking about an error here but about the fact that setting a
frame's minibuffer window via ‘set-frame-parameter’ is not reflected in
the value returned by ‘frame-parameter’ for that frame's 'minibuffer'
parameter.  You have to call ‘minibuffer-window’ for that frame to see
whether something has effectively changed.

 > Next, the documentation issue:
 >
 >    `minibuffer'
 >         Whether this frame has its own minibuffer.  The value `t' means
 >         yes, `nil' means no, `only' means this frame is just a minibuffer.
 >         If the value is a minibuffer window (in some other frame), the
 >         frame uses that minibuffer.
 >
 >         This frame parameter takes effect when the frame is created, and
 >         can not be changed afterwards.
 >
 >    The sentence "If the value is a minibuffer window (in some other frame),
 >    the frame uses that minibuffer." is misleading.  A minibuffer window is
 >    reported iff that window is on the _same_ frame and that frame is not a
 >    minibuffer-only frame.  A minibuffer window in some other frame is never
 >    reported.
 >
 > So when do we report t?  It sounds like the answer is "never", right?

Yes.

 > IOW, the documentation seems to describe some situation that existed
 > in the past, and is now OBE due to code changes.  Correct?

Not really.  While t never gets reported, it can be used either in alist
specifications or in the 'minibuffer' frame parameter of ‘make-frame’.
It is redundant in both but allowed AFAICT.  You can even get away with
nonsense like

(let ((minibuffer-only-frame (make-frame '((minibuffer . only)))))
   (set-frame-parameter minibuffer-only-frame 'minibuffer t)
   (frame-parameter minibuffer-only-frame 'minibuffer))

No error gets reported and the parameter of the minibuffer-only frame
appears unchanged.  It simply does not matter that it has been set to t
internally.

 >> Note in this context that ‘minibuffer-window’ returns the correct
 >> minibuffer window for its FRAME argument while ‘set-minibuffer-window’
 >> does not allow to set the minibuffer window for a specific frame.
 >
 > IMO, this is a separate, albeit probably related, issue.  Are there
 > any problems to let set-minibuffer-window allow setting the minibuffer
 > window of a frame?

Certainly not - if checked and documented orderly.  But when you already
have a minibuffer window at hand and want to make a new minibuffer-less
frame use that window, you currently can write

(let ((window (minibuffer-window)))
   (make-frame `((minibuffer . ,window))))

BTW ‘set-minibuffer-window’ is a very obscure function.  It's nowhere
used and I wouldn't know why and how to use it.

 > And for that, I proposed:
 >
 >>> But I haven't checked all places because I rather soonish stumbled upon
 >>> things like
 >>>
 >>> (eq (cdr (or (assq 'minibuffer initial-frame-alist)
 >>>             (assq 'minibuffer window-system-frame-alist)
 >>>             (assq 'minibuffer default-frame-alist)
 >>>             '(minibuffer . t)))
 >>>       t)
 >>>
 >>> in ‘frame-notice-user-settings’.  And one revealing comment is in
 >>> ‘set-frame-configuration’:
 >>>
 >>>                  ;; Since we can't set a frame's minibuffer status,
 >>>                  ;; we might as well omit the parameter altogether.
 >>
 >> We could simply change the above code to follow suit.
 >
 > To which you replied:
 >
 >> Change what?
 >
 > Obviously, change the Lisp snippet shown above, which expects to see a
 > nil minibuffer parameter for minibuffer-less frames.  Change it not to
 > expect that, and instead test the minibuffer window for whether it is
 > on the same frame or not.

If you mean the snippet

(eq (cdr (or (assq 'minibuffer initial-frame-alist) ... t)

then I suppose that it is correct: The value t _is_ meaningful for the
alist variables.  It just never gets reported for an actual frame.  In
frameset.el Juanma wrote about the 'minibuffer' frame parameter:

;; - `minibuffer': It can contain a reference to a live window, which cannot
;;   be serialized.  Because of Emacs' idiosyncratic treatment of this
;;   parameter, frames created with (minibuffer . t) have a parameter
;;   (minibuffer . #<window...>), while frames created with
;;   (minibuffer . #<window...>) have (minibuffer . nil), which is madness
;;   but helps to differentiate between minibufferless and "normal" frames.

Here I think that Juanma's wrong BTW.  It does not help IMHO.

;;   So, changing (minibuffer . #<window...>) to (minibuffer . t) allows
;;   Emacs to set up the new frame correctly.  Nice, uh?

But for the rest I fully agree with him.  And his (local) fix explains
why t would be a good value.  So I still do not know what you propose to
change.

 >> But for a minibuffer-less frame we
 >> OT1H store the minibuffer window in that parameter and OTOH we report
 >> the value nil for that parameter in ‘frame-parameters’.
 >
 > I think we should report the window, i.e. the actual value stored in
 > that parameter.
[...]
 > In general, I prefer to
 > report the actual values whenever possible, especially when we have no
 > reason to hide the value from Lisp applications.

Modulo the fact that, as I mentioned above, some application might want
to use (not (frame-parameter frame 'minibuffer)) to check whether it is
allowed to change the minibuffer window of an arbitrary frame.

 >> As mentioned before, removing the special treatment of the 'minibuffer'
 >> parameter in ‘frame-parameters’ would imply that Elisp code relying on
 >> the values we report currently might be broken in the future.
 >
 > And my suggestion to that was to fix that code, wherever we find it.

frameset.el already fixes the code internally so we would have to revert
those fixes.  That's hairy.  And I don't know how many times anyone else
already has invented a workaround for all these idiosyncrasies.

 >> Things would be much clearer if we had provided some orthogonality of
 >> ‘minibuffer-window’ and ‘set-minibuffer-window’.
 >
 > Not sure what you mean by "orthogonality" here.

I meant "duality".  In the sense that both should take a FRAME argument.

martin




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

* Re: About the 'minibuffer' frame parameter
  2016-08-08  8:27           ` martin rudalics
@ 2016-08-08 15:34             ` Eli Zaretskii
  2016-08-09  8:27               ` martin rudalics
  0 siblings, 1 reply; 43+ messages in thread
From: Eli Zaretskii @ 2016-08-08 15:34 UTC (permalink / raw)
  To: martin rudalics; +Cc: emacs-devel

> Date: Mon, 08 Aug 2016 10:27:02 +0200
> From: martin rudalics <rudalics@gmx.at>
> CC: emacs-devel@gnu.org
> 
>  > In general, I prefer to
>  > report the actual values whenever possible, especially when we have no
>  > reason to hide the value from Lisp applications.
> 
> Modulo the fact that, as I mentioned above, some application might want
> to use (not (frame-parameter frame 'minibuffer)) to check whether it is
> allowed to change the minibuffer window of an arbitrary frame.
> 
>  >> As mentioned before, removing the special treatment of the 'minibuffer'
>  >> parameter in ‘frame-parameters’ would imply that Elisp code relying on
>  >> the values we report currently might be broken in the future.
>  >
>  > And my suggestion to that was to fix that code, wherever we find it.
> 
> frameset.el already fixes the code internally so we would have to revert
> those fixes.  That's hairy.  And I don't know how many times anyone else
> already has invented a workaround for all these idiosyncrasies.

So what is your suggestion for the course of actions?



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

* Re: About the 'minibuffer' frame parameter
  2016-08-08 15:34             ` Eli Zaretskii
@ 2016-08-09  8:27               ` martin rudalics
  2016-08-09 14:51                 ` Eli Zaretskii
  0 siblings, 1 reply; 43+ messages in thread
From: martin rudalics @ 2016-08-09  8:27 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

 > So what is your suggestion for the course of actions?

(1) Make sure that store_frame_param doesn't store invalid parameter
     values.

(2) Never store a minibuffer window as frame parameter.

(3) Have ‘frame-parameter’ return the 'minibuffer' parameter as stored
     internally.  If no stored value is available, return t.

(4) Wait for regression reports.

(5) Fix the documentation.

(6) Fix/remove related comments.

Together (1) and (2) mean that the parameter becomes immutable as
occasionally already claimed.  (3) will require changes to frameset.el.
FWIW, the only code in frameset.el that seems to depend on the old
behavior is:

			    (let ((w (frame-parameter f 'minibuffer)))
			      (and (window-live-p w)
				   (window-minibuffer-p w)
				   (eq (window-frame w) f))))

This would be probably replaced by:

			    (let ((w (minibuffer-window f)))
			      (and (window-live-p w)
				   (eq (window-frame w) f))))

If anyone knows about code that does similar things in this or any other
package please tell us.

One open question is how to handle the minibuffer window in frame
configurations.  For example, the valid form

(let ((minibuffer-less-frame (make-frame '((minibuffer . nil))))
       (configuration (current-frame-configuration))
       (minibuffer-only-frame (make-frame '((minibuffer . only)))))
   (set-frame-parameter
    minibuffer-less-frame 'minibuffer (frame-root-window minibuffer-only-frame))
   (set-frame-configuration configuration))

currently throws an error while

(let ((initial-frame (selected-frame))
       (minibuffer-less-frame (make-frame '((minibuffer . nil))))
       (configuration (current-frame-configuration))
       (minibuffer-only-frame (make-frame '((minibuffer . only)))))
   (set-frame-parameter
    minibuffer-less-frame 'minibuffer (frame-root-window minibuffer-only-frame))
   (delete-frame initial-frame)
   (set-frame-configuration configuration))

in addition leaves me with a minibuffer-less frame I can't neither make
visible nor deiconify.

martin




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

* Re: About the 'minibuffer' frame parameter
  2016-08-09  8:27               ` martin rudalics
@ 2016-08-09 14:51                 ` Eli Zaretskii
  2016-08-09 16:07                   ` martin rudalics
  0 siblings, 1 reply; 43+ messages in thread
From: Eli Zaretskii @ 2016-08-09 14:51 UTC (permalink / raw)
  To: martin rudalics; +Cc: emacs-devel

> Date: Tue, 09 Aug 2016 10:27:55 +0200
> From: martin rudalics <rudalics@gmx.at>
> CC: emacs-devel@gnu.org
> 
>  > So what is your suggestion for the course of actions?
> 
> (1) Make sure that store_frame_param doesn't store invalid parameter
>      values.
> 
> (2) Never store a minibuffer window as frame parameter.
> 
> (3) Have ‘frame-parameter’ return the 'minibuffer' parameter as stored
>      internally.  If no stored value is available, return t.
> 
> (4) Wait for regression reports.
> 
> (5) Fix the documentation.
> 
> (6) Fix/remove related comments.

I'm okay with that, but I'm surprised by (2): won't storing the
minibuffer window there allow us to report the correct value in (3)?
What am I missing?



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

* Re: About the 'minibuffer' frame parameter
  2016-08-09 14:51                 ` Eli Zaretskii
@ 2016-08-09 16:07                   ` martin rudalics
  2016-08-09 16:21                     ` Eli Zaretskii
  0 siblings, 1 reply; 43+ messages in thread
From: martin rudalics @ 2016-08-09 16:07 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

 >> (1) Make sure that store_frame_param doesn't store invalid parameter
 >>       values.
 >>
 >> (2) Never store a minibuffer window as frame parameter.
 >>
 >> (3) Have ‘frame-parameter’ return the 'minibuffer' parameter as stored
 >>       internally.  If no stored value is available, return t.
 >>
 >> (4) Wait for regression reports.
 >>
 >> (5) Fix the documentation.
 >>
 >> (6) Fix/remove related comments.
 >
 > I'm okay with that, but I'm surprised by (2): won't storing the
 > minibuffer window there allow us to report the correct value in (3)?
 > What am I missing?

If we did that we would invert the values returned by ‘frame-parameter’
for the "normal" frame and minibuffer-less frame cases.  Currently, we
return the minibuffer window for a normal frame and nil for a
minibuffer-less frame.  You would return the minibuffer window for a
minibuffer-less frame and t for a normal frame.  Correct?

This would have the benefit that after

   (set-frame-parameter minibuffer-less-frame 'minibuffer some-minibuffer-window)

the value returned by ‘frame-parameter’ would be consistent with the
requested value.  However, most minibuffer-less frames are created via

   (make-frame '((minibuffer . nil)))

and whatever we do here we would introduce another inconsistency: Either
the stored value is the minibuffer window chosen by Emacs and the value
returned by ‘frame-parameter’ would not be the value from the PARAMETERS
argument of ‘make-frame’.  Or we would sometimes return nil and
sometimes a window as value of the 'minibuffer' frame parameter of a
minibuffer-less frame.

Given the fact that changing the frame parameter of a minibuffer-less
frame is a pretty rare operation, I would prefer the solution sketched
in (2).  WDYT?

martin




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

* Re: About the 'minibuffer' frame parameter
  2016-08-09 16:07                   ` martin rudalics
@ 2016-08-09 16:21                     ` Eli Zaretskii
  2016-08-09 17:34                       ` martin rudalics
  0 siblings, 1 reply; 43+ messages in thread
From: Eli Zaretskii @ 2016-08-09 16:21 UTC (permalink / raw)
  To: martin rudalics; +Cc: emacs-devel

> Date: Tue, 09 Aug 2016 18:07:58 +0200
> From: martin rudalics <rudalics@gmx.at>
> CC: emacs-devel@gnu.org
> 
>  >> (1) Make sure that store_frame_param doesn't store invalid parameter
>  >>       values.
>  >>
>  >> (2) Never store a minibuffer window as frame parameter.
>  >>
>  >> (3) Have ‘frame-parameter’ return the 'minibuffer' parameter as stored
>  >>       internally.  If no stored value is available, return t.
>  >>
>  >> (4) Wait for regression reports.
>  >>
>  >> (5) Fix the documentation.
>  >>
>  >> (6) Fix/remove related comments.
>  >
>  > I'm okay with that, but I'm surprised by (2): won't storing the
>  > minibuffer window there allow us to report the correct value in (3)?
>  > What am I missing?
> 
> If we did that we would invert the values returned by ‘frame-parameter’
> for the "normal" frame and minibuffer-less frame cases.  Currently, we
> return the minibuffer window for a normal frame and nil for a
> minibuffer-less frame.  You would return the minibuffer window for a
> minibuffer-less frame and t for a normal frame.  Correct?

Maybe.  Another alternative would be to return a window in both cases.

> This would have the benefit that after
> 
>    (set-frame-parameter minibuffer-less-frame 'minibuffer some-minibuffer-window)
> 
> the value returned by ‘frame-parameter’ would be consistent with the
> requested value.  However, most minibuffer-less frames are created via
> 
>    (make-frame '((minibuffer . nil)))
> 
> and whatever we do here we would introduce another inconsistency: Either
> the stored value is the minibuffer window chosen by Emacs and the value
> returned by ‘frame-parameter’ would not be the value from the PARAMETERS
> argument of ‘make-frame’.  Or we would sometimes return nil and
> sometimes a window as value of the 'minibuffer' frame parameter of a
> minibuffer-less frame.

We have already a few cases where frame-parameter returns a value
different from the one specified when make-frame was called.  There's
nothing wrong about that, if it's Emacs that chooses the actual value.

> Given the fact that changing the frame parameter of a minibuffer-less
> frame is a pretty rare operation, I would prefer the solution sketched
> in (2).  WDYT?

Do you still prefer (2)?  I prefer storing a window because then we
could naturally return it, like we do with frame colors.



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

* Re: About the 'minibuffer' frame parameter
  2016-08-09 16:21                     ` Eli Zaretskii
@ 2016-08-09 17:34                       ` martin rudalics
  2016-08-09 17:51                         ` Eli Zaretskii
  0 siblings, 1 reply; 43+ messages in thread
From: martin rudalics @ 2016-08-09 17:34 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

 > Another alternative would be to return a window in both cases.

But then we can't discriminate minibuffer-less from normal frames by
looking at the parameter value only.

 > We have already a few cases where frame-parameter returns a value
 > different from the one specified when make-frame was called.  There's
 > nothing wrong about that, if it's Emacs that chooses the actual value.

This goes both ways.  With (2) Emacs would choose nil when
‘set-frame-position’ explicitly asks for a window.  And with no
'minibuffer' specified we'd have to return t or a window in any case.

 > Do you still prefer (2)?  I prefer storing a window because then we
 > could naturally return it, like we do with frame colors.

C code never consults the frame parameter.  Elisp code currently
consults the parameter in four places only, three of them to find out
whether the frame is minibuffer-only.  If Elisp code wants the window,
it uses ‘minibuffer-window’ which handles all types of frames.  And with
(2) the values t, nil and 'only' would immediately tell the type of any
frame.

martin




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

* Re: About the 'minibuffer' frame parameter
  2016-08-09 17:34                       ` martin rudalics
@ 2016-08-09 17:51                         ` Eli Zaretskii
  2016-08-10 12:15                           ` martin rudalics
  0 siblings, 1 reply; 43+ messages in thread
From: Eli Zaretskii @ 2016-08-09 17:51 UTC (permalink / raw)
  To: martin rudalics; +Cc: emacs-devel

> Date: Tue, 09 Aug 2016 19:34:20 +0200
> From: martin rudalics <rudalics@gmx.at>
> CC: emacs-devel@gnu.org
> 
>  > Another alternative would be to return a window in both cases.
> 
> But then we can't discriminate minibuffer-less from normal frames by
> looking at the parameter value only.

We can look at what window-frame returns for that window, can't we?

>  > We have already a few cases where frame-parameter returns a value
>  > different from the one specified when make-frame was called.  There's
>  > nothing wrong about that, if it's Emacs that chooses the actual value.
> 
> This goes both ways.  With (2) Emacs would choose nil when
> ‘set-frame-position’ explicitly asks for a window.  And with no
> 'minibuffer' specified we'd have to return t or a window in any case.

Yes, but IMO nil is not a meaningful value.  If we know better, we
should return a more concrete value.

>  > Do you still prefer (2)?  I prefer storing a window because then we
>  > could naturally return it, like we do with frame colors.
> 
> C code never consults the frame parameter.  Elisp code currently
> consults the parameter in four places only, three of them to find out
> whether the frame is minibuffer-only.  If Elisp code wants the window,
> it uses ‘minibuffer-window’ which handles all types of frames.  And with
> (2) the values t, nil and 'only' would immediately tell the type of any
> frame.

Yes, of course, the current situation is not impossible.  We are
talking about improving it.



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

* Re: About the 'minibuffer' frame parameter
  2016-08-09 17:51                         ` Eli Zaretskii
@ 2016-08-10 12:15                           ` martin rudalics
  2016-08-10 14:23                             ` Stefan Monnier
  2016-08-10 14:49                             ` Eli Zaretskii
  0 siblings, 2 replies; 43+ messages in thread
From: martin rudalics @ 2016-08-10 12:15 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 766 bytes --]

 >> But then we can't discriminate minibuffer-less from normal frames by
 >> looking at the parameter value only.
 >
 > We can look at what window-frame returns for that window, can't we?

Tediously so, yes.

 >> This goes both ways.  With (2) Emacs would choose nil when
 >> ‘set-frame-position’ explicitly asks for a window.  And with no
 >> 'minibuffer' specified we'd have to return t or a window in any case.
 >
 > Yes, but IMO nil is not a meaningful value.  If we know better, we
 > should return a more concrete value.

Sounds convincing.

 > Yes, of course, the current situation is not impossible.  We are
 > talking about improving it.

I attached a preliminary version of the code changes.  Please have a
look.

Thanks, martin

[-- Attachment #2: minibuffer-frame-parameter.diff --]
[-- Type: text/plain, Size: 4532 bytes --]

diff --git a/lisp/frameset.el b/lisp/frameset.el
index 2453f57..aa16647 100644
--- a/lisp/frameset.el
+++ b/lisp/frameset.el
@@ -908,10 +908,7 @@ frameset--reuse-frame
 	   (unless (or frame (eq (cdr (assq 'minibuffer parameters)) 'only))
 	     (setq frame (frameset--find-frame-if
 			  (lambda (f)
-			    (let ((w (frame-parameter f 'minibuffer)))
-			      (and (window-live-p w)
-				   (window-minibuffer-p w)
-				   (eq (window-frame w) f))))
+			    (eq (frame-parameter f 'minibuffer) t))
 			  display))))
 	  (mini
 	   ;; For minibufferless frames, check whether they already exist,
@@ -1028,7 +1025,7 @@ frameset-keep-original-display-p

 (defun frameset-minibufferless-first-p (frame1 _frame2)
   "Predicate to sort minibufferless frames before other frames."
-  (not (frame-parameter frame1 'minibuffer)))
+  (windowp (frame-parameter frame1 'minibuffer)))

 ;;;###autoload
 (cl-defun frameset-restore (frameset
diff --git a/src/frame.c b/src/frame.c
index 899c315..e550e51 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -658,6 +658,7 @@ struct frame *
       mw->mini = 1;
       wset_frame (mw, frame);
       fset_minibuffer_window (f, mini_window);
+      store_frame_param (f, Qminibuffer, Qt);
     }
   else
     {
@@ -770,6 +771,7 @@ struct frame *
     }

   fset_minibuffer_window (f, mini_window);
+  store_frame_param (f, Qminibuffer, mini_window);

   /* Make the chosen minibuffer window display the proper minibuffer,
      unless it is already showing a minibuffer.  */
@@ -807,6 +809,7 @@ struct frame *

   mini_window = f->root_window;
   fset_minibuffer_window (f, mini_window);
+  store_frame_param (f, Qminibuffer, Qonly);
   XWINDOW (mini_window)->mini = 1;
   wset_next (XWINDOW (mini_window), Qnil);
   wset_prev (XWINDOW (mini_window), Qnil);
@@ -2404,6 +2407,46 @@ of them (the selected terminal frame) is actually displayed.
 {
   register Lisp_Object old_alist_elt;

+  if (EQ (prop, Qminibuffer))
+    {
+      if (WINDOWP (val))
+	{
+	  if (!MINI_WINDOW_P (XWINDOW (val)))
+	    error ("The 'minibuffer' parameter does not specify a valid minibuffer window");
+	  else if (FRAME_HAS_MINIBUF_P (f))
+	    {
+	      if (EQ (val, FRAME_MINIBUF_WINDOW (f)))
+		val = Qt;
+	      else
+		error ("Can't change the minibuffer window of a frame with its own minibuffer");
+	    }
+	  else if (FRAME_MINIBUF_ONLY_P (f))
+	    {
+	      if (EQ (val, FRAME_MINIBUF_WINDOW (f)))
+		val = Qonly;
+	      else
+		error ("Can't change the minibuffer window of a minibuffer-only frame");
+	    }
+	  else
+	    /* Store the chosen minibuffer window.  */
+	    fset_minibuffer_window (f, val);
+	}
+      else
+	{
+	  Lisp_Object old_val = Fcdr (Fassq (Qminibuffer, f->param_alist));
+
+	  if (!NILP (old_val))
+	    {
+	      if (WINDOWP (old_val) && NILP (val))
+		/* Don't change the value for a minibuffer-less frame if
+		   only nil was specified as new value.  */
+		val = old_val;
+	      else if (!EQ (old_val, val))
+		error ("Can't change the 'minibuffer' parameter of this frame");
+	    }
+	}
+    }
+
   /* The buffer-list parameters are stored in a special place and not
      in the alist.  All buffers must be live.  */
   if (EQ (prop, Qbuffer_list))
@@ -2475,19 +2518,6 @@ of them (the selected terminal frame) is actually displayed.
       else if (EQ (prop, Qname))
 	set_term_frame_name (f, val);
     }
-
-  if (EQ (prop, Qminibuffer) && WINDOWP (val))
-    {
-      if (! MINI_WINDOW_P (XWINDOW (val)))
-	error ("Surrogate minibuffer windows must be minibuffer windows");
-
-      if ((FRAME_HAS_MINIBUF_P (f) || FRAME_MINIBUF_ONLY_P (f))
-	  && !EQ (val, f->minibuffer_window))
-	error ("Can't change the surrogate minibuffer of a frame with its own minibuffer");
-
-      /* Install the chosen minibuffer window, with proper buffer.  */
-      fset_minibuffer_window (f, val);
-    }
 }

 /* Return color matches UNSPEC on frame F or nil if UNSPEC
@@ -2565,10 +2595,6 @@ It is a list of elements of the form (PARM . VALUE), where PARM is a symbol.
 	   : FRAME_COLS (f));
   store_in_alist (&alist, Qwidth, make_number (width));
   store_in_alist (&alist, Qmodeline, (FRAME_WANTS_MODELINE_P (f) ? Qt : Qnil));
-  store_in_alist (&alist, Qminibuffer,
-		  (! FRAME_HAS_MINIBUF_P (f) ? Qnil
-		   : FRAME_MINIBUF_ONLY_P (f) ? Qonly
-		   : FRAME_MINIBUF_WINDOW (f)));
   store_in_alist (&alist, Qunsplittable, (FRAME_NO_SPLIT_P (f) ? Qt : Qnil));
   store_in_alist (&alist, Qbuffer_list, f->buffer_list);
   store_in_alist (&alist, Qburied_buffer_list, f->buried_buffer_list);


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

* Re: About the 'minibuffer' frame parameter
  2016-08-10 12:15                           ` martin rudalics
@ 2016-08-10 14:23                             ` Stefan Monnier
  2016-08-10 14:54                               ` Eli Zaretskii
  2016-08-10 14:49                             ` Eli Zaretskii
  1 sibling, 1 reply; 43+ messages in thread
From: Stefan Monnier @ 2016-08-10 14:23 UTC (permalink / raw)
  To: emacs-devel

>>> But then we can't discriminate minibuffer-less from normal frames by
>>> looking at the parameter value only.
>> We can look at what window-frame returns for that window, can't we?
> Tediously so, yes.

For minibuffer-free frames, we could return the *frame* whose minibuffer
we use.


        Stefan




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

* Re: About the 'minibuffer' frame parameter
  2016-08-10 12:15                           ` martin rudalics
  2016-08-10 14:23                             ` Stefan Monnier
@ 2016-08-10 14:49                             ` Eli Zaretskii
  2016-08-21  9:41                               ` martin rudalics
  1 sibling, 1 reply; 43+ messages in thread
From: Eli Zaretskii @ 2016-08-10 14:49 UTC (permalink / raw)
  To: martin rudalics; +Cc: emacs-devel

> Date: Wed, 10 Aug 2016 14:15:45 +0200
> From: martin rudalics <rudalics@gmx.at>
> CC: emacs-devel@gnu.org
> 
>  >> This goes both ways.  With (2) Emacs would choose nil when
>  >> ‘set-frame-position’ explicitly asks for a window.  And with no
>  >> 'minibuffer' specified we'd have to return t or a window in any case.
>  >
>  > Yes, but IMO nil is not a meaningful value.  If we know better, we
>  > should return a more concrete value.
> 
> Sounds convincing.
> 
>  > Yes, of course, the current situation is not impossible.  We are
>  > talking about improving it.
> 
> I attached a preliminary version of the code changes.  Please have a
> look.

I took a cursory look, and it looks OK to me.

Thanks.



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

* Re: About the 'minibuffer' frame parameter
  2016-08-10 14:23                             ` Stefan Monnier
@ 2016-08-10 14:54                               ` Eli Zaretskii
  0 siblings, 0 replies; 43+ messages in thread
From: Eli Zaretskii @ 2016-08-10 14:54 UTC (permalink / raw)
  To: Stefan Monnier; +Cc: emacs-devel

> From: Stefan Monnier <monnier@iro.umontreal.ca>
> Date: Wed, 10 Aug 2016 10:23:55 -0400
> 
> >>> But then we can't discriminate minibuffer-less from normal frames by
> >>> looking at the parameter value only.
> >> We can look at what window-frame returns for that window, can't we?
> > Tediously so, yes.
> 
> For minibuffer-free frames, we could return the *frame* whose minibuffer
> we use.

Why?  The frame parameter's value is a window, so the most natural
value would be the window used for the minibuffer.  Given the window,
accessing its frame, if it's needed, is trivial.



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

* Re: About the 'minibuffer' frame parameter
  2016-08-10 14:49                             ` Eli Zaretskii
@ 2016-08-21  9:41                               ` martin rudalics
  2016-08-21 20:51                                 ` Kaushal Modi
  0 siblings, 1 reply; 43+ messages in thread
From: martin rudalics @ 2016-08-21  9:41 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: emacs-devel

 > I took a cursory look, and it looks OK to me.

I installed a slightly modified version on master/trunk.  Doc and
comments will be changed later.  If people notice any problems with
desktop-saving please complain immediately.

Thanks, martin



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

* Re: About the 'minibuffer' frame parameter
  2016-08-21  9:41                               ` martin rudalics
@ 2016-08-21 20:51                                 ` Kaushal Modi
  2016-08-22 12:49                                   ` Kaushal Modi
  0 siblings, 1 reply; 43+ messages in thread
From: Kaushal Modi @ 2016-08-21 20:51 UTC (permalink / raw)
  To: martin rudalics, Eli Zaretskii; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 459 bytes --]

On Sun, Aug 21, 2016 at 5:41 AM martin rudalics <rudalics@gmx.at> wrote:

> I installed a slightly modified version on master/trunk.  Doc and
> comments will be changed later.



> If people notice any problems with
> desktop-saving please complain immediately.
>

This is not a complaint. Just emailing to say that everything works as
before. I use desktop-mode with frame/window restore (default) using
emacsclient and it works as before.
-- 

Kaushal Modi

[-- Attachment #2: Type: text/html, Size: 998 bytes --]

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

* Re: About the 'minibuffer' frame parameter
  2016-08-21 20:51                                 ` Kaushal Modi
@ 2016-08-22 12:49                                   ` Kaushal Modi
  2016-08-22 13:03                                     ` Kaushal Modi
  0 siblings, 1 reply; 43+ messages in thread
From: Kaushal Modi @ 2016-08-22 12:49 UTC (permalink / raw)
  To: martin rudalics, Eli Zaretskii; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 1185 bytes --]

Actually I noticed some pretty strange minibuffer behavior today. I don't
know what caused that to happen so I cannot explain how to recreate that.

I am on the aed22ca build of master.

Here's my best attempt to explain this:

- The minibuffer height increased to 2 characters (so I saw 2 rows instead
of 1)
- And I got 2 cursors in there.. one cursor had the default cursor face,
and other looked like the cursor face in inactive window.

That probably doesn't give you any hint.. but I thought of at least
mentioning it. I hope to get a recipe for that so that you can recreate the
issue consistently.

On Sun, Aug 21, 2016 at 4:51 PM Kaushal Modi <kaushal.modi@gmail.com> wrote:

> On Sun, Aug 21, 2016 at 5:41 AM martin rudalics <rudalics@gmx.at> wrote:
>
>> I installed a slightly modified version on master/trunk.  Doc and
>> comments will be changed later.
>
>
>
>> If people notice any problems with
>> desktop-saving please complain immediately.
>>
>
> This is not a complaint. Just emailing to say that everything works as
> before. I use desktop-mode with frame/window restore (default) using
> emacsclient and it works as before.
> --
>
> Kaushal Modi
>
-- 

Kaushal Modi

[-- Attachment #2: Type: text/html, Size: 2375 bytes --]

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

* Re: About the 'minibuffer' frame parameter
  2016-08-22 12:49                                   ` Kaushal Modi
@ 2016-08-22 13:03                                     ` Kaushal Modi
  2016-08-22 15:51                                       ` Kaushal Modi
  2016-08-22 16:01                                       ` martin rudalics
  0 siblings, 2 replies; 43+ messages in thread
From: Kaushal Modi @ 2016-08-22 13:03 UTC (permalink / raw)
  To: martin rudalics, Eli Zaretskii; +Cc: emacs-devel


[-- Attachment #1.1: Type: text/plain, Size: 1968 bytes --]

Actually, it seems like one of the existing windows gets cloned and that is
put on top of the minibuffer without modeline.

It looks something like this.

So the minibuffer looks completely fused with Win 2 of Buf x (that somehow
got created automatically when I enabled debug-on-error).
After some window switching, the mode line for Win 2 appears automatically.

==============================================
| Win 1 - Buf x                              |
----------------------------------------------
| Mode-line for Win 1                        |
==============================================
| Win 2 - Buf x                              |
----------------------------------------------
| Minibuffer                                 |
==============================================

(I put to white box there to mask my work stuff. If I close that window,
the missing modeline for the bottom "Win 2 - Buf x" is created
automatically. Note that the same "-Searchd" string is shown in the actual
window on the top right and the bottom window auto-created exactly above
the minibuffer (so I thought earlier that the minibuffer had 2 rows; it was
in fact an inactive window and thus that inactive window cursor face).

[image: pasted1]

On Mon, Aug 22, 2016 at 8:49 AM Kaushal Modi <kaushal.modi@gmail.com> wrote:

> Actually I noticed some pretty strange minibuffer behavior today. I don't
> know what caused that to happen so I cannot explain how to recreate that.
>
> I am on the aed22ca build of master.
>
> Here's my best attempt to explain this:
>
> - The minibuffer height increased to 2 characters (so I saw 2 rows instead
> of 1)
> - And I got 2 cursors in there.. one cursor had the default cursor face,
> and other looked like the cursor face in inactive window.
>
> That probably doesn't give you any hint.. but I thought of at least
> mentioning it. I hope to get a recipe for that so that you can recreate the
> issue consistently.
>
-- 

Kaushal Modi

[-- Attachment #1.2: Type: text/html, Size: 3476 bytes --]

[-- Attachment #2: pasted1 --]
[-- Type: image/png, Size: 29108 bytes --]

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

* Re: About the 'minibuffer' frame parameter
  2016-08-22 13:03                                     ` Kaushal Modi
@ 2016-08-22 15:51                                       ` Kaushal Modi
  2016-08-22 16:01                                       ` martin rudalics
  1 sibling, 0 replies; 43+ messages in thread
From: Kaushal Modi @ 2016-08-22 15:51 UTC (permalink / raw)
  To: martin rudalics, Eli Zaretskii; +Cc: emacs-devel


[-- Attachment #1.1: Type: text/plain, Size: 1309 bytes --]

Please ignore that.. that bug is there but has nothing to do with your
recent commit.
I see it on emacs 25.1 RC2 too when I end up causing a timer error in
pdf-tools package:

=====
Interleave enabled
doc-view-goto-page: Wrong type argument: stringp, nil
Error running timer ‘pdf-cache--prefetch-start’: (error "epdfinfo: No such
page 0")
=====



On Mon, Aug 22, 2016 at 9:03 AM Kaushal Modi <kaushal.modi@gmail.com> wrote:

> Actually, it seems like one of the existing windows gets cloned and that
> is put on top of the minibuffer without modeline.
>
> It looks something like this.
>
> So the minibuffer looks completely fused with Win 2 of Buf x (that somehow
> got created automatically when I enabled debug-on-error).
> After some window switching, the mode line for Win 2 appears automatically.
>
> ==============================================
> | Win 1 - Buf x                              |
> ----------------------------------------------
> | Mode-line for Win 1                        |
> ==============================================
> | Win 2 - Buf x                              |
> ----------------------------------------------
> | Minibuffer                                 |
> ==============================================
>
-- 

Kaushal Modi

[-- Attachment #1.2: Type: text/html, Size: 2551 bytes --]

[-- Attachment #2: pasted1 --]
[-- Type: image/png, Size: 29108 bytes --]

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

* Re: About the 'minibuffer' frame parameter
  2016-08-22 13:03                                     ` Kaushal Modi
  2016-08-22 15:51                                       ` Kaushal Modi
@ 2016-08-22 16:01                                       ` martin rudalics
  2016-08-22 16:27                                         ` Kaushal Modi
  1 sibling, 1 reply; 43+ messages in thread
From: martin rudalics @ 2016-08-22 16:01 UTC (permalink / raw)
  To: Kaushal Modi, Eli Zaretskii; +Cc: emacs-devel

 > Actually, it seems like one of the existing windows gets cloned and that is
 > put on top of the minibuffer without modeline.
 >
 > It looks something like this.
 >
 > So the minibuffer looks completely fused with Win 2 of Buf x (that somehow
 > got created automatically when I enabled debug-on-error).
 > After some window switching, the mode line for Win 2 appears automatically.
 >
 > ==============================================
 > | Win 1 - Buf x                              |
 > ----------------------------------------------
 > | Mode-line for Win 1                        |
 > ==============================================
 > | Win 2 - Buf x                              |
 > ----------------------------------------------
 > | Minibuffer                                 |
 > ==============================================
 >
 > (I put to white box there to mask my work stuff. If I close that window,

You mean "If I delete Win 1"?

 > the missing modeline for the bottom "Win 2 - Buf x" is created
 > automatically.

And what else do you see now in Win 2 besides the "- Searchd" string?

 > Note that the same "-Searchd" string is shown in the actual
 > window on the top right and the bottom window auto-created exactly above
 > the minibuffer (so I thought earlier that the minibuffer had 2 rows; it was
 > in fact an inactive window and thus that inactive window cursor face).

In any case please do (window--dump-frame) for that frame - the result
of that dump is in a buffer called *window-frame-dump* and post the
result here.  I think that the appearance of that one line window is
more or less intentional but I have no idea who's responsible for it.
At least that someone seems to do very tricky things to your window
layout ;-)

 > Please ignore that.. that bug is there but has nothing to do with your
 > recent commit.
 > I see it on emacs 25.1 RC2 too when I end up causing a timer error in
 > pdf-tools package:

I'd still want to see the output of ‘window--dump-frame’ for this frame
(no fear - it doesn't reveal any buffer contents).

martin




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

* Re: About the 'minibuffer' frame parameter
  2016-08-22 16:01                                       ` martin rudalics
@ 2016-08-22 16:27                                         ` Kaushal Modi
  2016-08-23  8:19                                           ` martin rudalics
  0 siblings, 1 reply; 43+ messages in thread
From: Kaushal Modi @ 2016-08-22 16:27 UTC (permalink / raw)
  To: martin rudalics, Eli Zaretskii, Oleh Krehel; +Cc: emacs-devel

[-- Attachment #1: Type: text/plain, Size: 5198 bytes --]

On Mon, Aug 22, 2016 at 12:01 PM martin rudalics <rudalics@gmx.at> wrote:

>  > ==============================================
>  > | Win 1 - Buf x                              |
>  > ----------------------------------------------
>  > | Mode-line for Win 1                        |
>  > ==============================================
>  > | Win 2 - Buf x                              |
>  > ----------------------------------------------
>  > | Minibuffer                                 |
>  > ==============================================
>  >
>  > (I put to white box there to mask my work stuff. If I close that window,
>
> You mean "If I delete Win 1"?
>

Correct (C-x 0).


>  > the missing modeline for the bottom "Win 2 - Buf x" is created
>  > automatically.
>
> And what else do you see now in Win 2 besides the "- Searchd" string?
>

I see just one line and I can scroll that window up/down (but now I know
exactly what's causing there.. copying Oleh to throw some light here too;
more detail below).


>  > Note that the same "-Searchd" string is shown in the actual
>  > window on the top right and the bottom window auto-created exactly above
>  > the minibuffer (so I thought earlier that the minibuffer had 2 rows; it
> was
>  > in fact an inactive window and thus that inactive window cursor face).
>
> In any case please do (window--dump-frame) for that frame - the result
> of that dump is in a buffer called *window-frame-dump* and post the
> result here.


frame pixel: 1910 x 1096   cols/lines: 212 x 57   units: 9 x 19
frame text pixel: 1894 x 1096   cols/lines: 210 x 57
tool: 0  scroll: 0/0  fringe: 16  border: 0  right: 0  bottom: 0

#<window 9>   parent: nil
pixel left: 0   top: 0   size: 1910 x 1077   new: 906
char left: 0   top: 0   size: 212 x 56   new: 48
normal: 1.0 x 1.0   new: nil

#<window 7>   parent: #<window 9>
pixel left: 0   top: 0   size: 1910 x 1001   new: 830
char left: 0   top: 0   size: 212 x 52   new: 44
normal: 1.0 x 0.9294336118848654   new: nil

#<window 6 on Quick_Start_for_RTL_Users_9June16.pdf>   parent: #<window 7>
pixel left: 0   top: 0   size: 956 x 1001   new: 830
char left: 0   top: 0   size: 106 x 52   new: 44
normal: 0.5 x 1.0   new: nil
body pixel: 940 x 981   char: 104 x 51
width left fringe: 8  left margin: 0  right margin: 0
width right fringe: 8  scroll-bar: 0  divider: 0
height header-line: 0  mode-line: 20  divider: 0

#<window 8 on Quick_Start_for_RTL_Users_9June16.org>   parent: #<window 7>
pixel left: 956   top: 0   size: 954 x 1001   new: 830
char left: 106   top: 0   size: 106 x 52   new: 44
normal: 0.5 x 1.0   new: nil
body pixel: 938 x 981   char: 104 x 51
width left fringe: 8  left margin: 0  right margin: 0
width right fringe: 8  scroll-bar: 0  divider: 0
height header-line: 0  mode-line: 20  divider: 0

#<window 10 on Quick_Start_for_RTL_Users_9June16.pdf>   parent: #<window 9>
pixel left: 0   top: 1001   size: 1910 x 76   new: 76
char left: 0   top: 52   size: 212 x 4   new: 4
normal: 1.0 x 0.07056638811513463   new: nil
body pixel: 1894 x 56   char: 210 x 2
width left fringe: 8  left margin: 0  right margin: 0
width right fringe: 8  scroll-bar: 0  divider: 0
height header-line: 0  mode-line: 20  divider: 0

#<window 4 on  *Minibuf-0*>   parent: nil
pixel left: 0   top: 1077   size: 1910 x 19   new: 190
char left: 0   top: 56   size: 212 x 1   new: 10
normal: 1.0 x 1.0   new: 0
body pixel: 1894 x 19   char: 210 x 1
width left fringe: 8  left margin: 0  right margin: 0
width right fringe: 8  scroll-bar: 0  divider: 0
height header-line: 0  mode-line: 0  divider: 0


> I think that the appearance of that one line window is
> more or less intentional but I have no idea who's responsible for it.
> At least that someone seems to do very tricky things to your window
> layout ;-)
>

I strongly believe it's this:
http://git.savannah.gnu.org/cgit/emacs/elpa.git/tree/packages/hydra/lv.el

The mode-line-less window is exactly what lv.el does for creating hydras.
What seems to happen is that the pdf-tools timer error does not allow a
hydra to finish doing its job.

=====
Error running timer ‘pdf-cache--prefetch-start’: (error "epdfinfo: No such
page 0")
=====

.. and I had bound toggling debug-on-error to a hydra head (hydra package
jargon).
I was able to recreate the same issue when calling any hydra.


>  > Please ignore that.. that bug is there but has nothing to do with your
>  > recent commit.
>  > I see it on emacs 25.1 RC2 too when I end up causing a timer error in
>  > pdf-tools package:
>
> I'd still want to see the output of ‘window--dump-frame’ for this frame
> (no fear - it doesn't reveal any buffer contents).
>

Thanks for the retained interest in fixing this :)

There are 2 things here:
- I need to figure out why the pdf-tools timer issue is caused. Once that
is fixed, with window issue should not happen as the hydras I launch will
be allowed to do all the needed window layout cleanup.
- Hopefully Oleh gets a chance to investigate the hydra/lv behavior under
the timer error circumstances.
-- 

Kaushal Modi

[-- Attachment #2: Type: text/html, Size: 7227 bytes --]

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

* Re: About the 'minibuffer' frame parameter
  2016-08-22 16:27                                         ` Kaushal Modi
@ 2016-08-23  8:19                                           ` martin rudalics
  0 siblings, 0 replies; 43+ messages in thread
From: martin rudalics @ 2016-08-23  8:19 UTC (permalink / raw)
  To: Kaushal Modi, Eli Zaretskii, Oleh Krehel; +Cc: emacs-devel

 > #<window 10 on Quick_Start_for_RTL_Users_9June16.pdf>   parent: #<window 9>
 > pixel left: 0   top: 1001   size: 1910 x 76   new: 76
 > char left: 0   top: 52   size: 212 x 4   new: 4
 > normal: 1.0 x 0.07056638811513463   new: nil
 > body pixel: 1894 x 56   char: 210 x 2
 > width left fringe: 8  left margin: 0  right margin: 0
 > width right fringe: 8  scroll-bar: 0  divider: 0
 > height header-line: 0  mode-line: 20  divider: 0
 >
 > #<window 4 on  *Minibuf-0*>   parent: nil
 > pixel left: 0   top: 1077   size: 1910 x 19   new: 190
 > char left: 0   top: 56   size: 212 x 1   new: 10
 > normal: 1.0 x 1.0   new: 0
 > body pixel: 1894 x 19   char: 210 x 1
 > width left fringe: 8  left margin: 0  right margin: 0
 > width right fringe: 8  scroll-bar: 0  divider: 0
 > height header-line: 0  mode-line: 0  divider: 0

That's not what I see in the image you posted earlier.  In the dump,
Window 9 is 76 pixels high (4 lines) while the minibuffer window is 19
pixels high (one line).  In the image, the window corresponding to
window 9 is only one line high as the minibuffer window.  Also, I doubt
that deleting the other windows via C-x 1 will automatically give Window
9 its modeline back.

 > I strongly believe it's this:
 > http://git.savannah.gnu.org/cgit/emacs/elpa.git/tree/packages/hydra/lv.el
 >
 > The mode-line-less window is exactly what lv.el does for creating hydras.
 > What seems to happen is that the pdf-tools timer error does not allow a
 > hydra to finish doing its job.

lv should give that window a different background so it can be
distinguished as such.  As a rule, if people use neither dividers nor
scrollbars/modelines, they should find some other way to distinguish
windows.  Otherwise, it's too easy to mix up their contents.

martin



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

* Re: About the 'minibuffer' frame parameter
  2016-08-07  8:46                   ` martin rudalics
@ 2017-01-14  0:59                     ` Juanma Barranquero
  2017-01-14  7:47                       ` Eli Zaretskii
  0 siblings, 1 reply; 43+ messages in thread
From: Juanma Barranquero @ 2017-01-14  0:59 UTC (permalink / raw)
  To: martin rudalics; +Cc: Eli Zaretskii, Drew Adams, Emacs developers

[Answering to something from a few months ago...]

> IIUC ‘frameset--record-minibuffer-relationships’ is an attempt to fix
> what gets reported via ‘frame-parameters’.  It must have been a hair
> raising experience for Juanma to code that.

It had its moments (so the long comment/rant section), but it was also fun.

> I slowly begin to understand why Juanma gave up coding for Emacs :-(

I didn't gave up, life just dealt me a really weird couple of years.

    Juanma



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

* Re: About the 'minibuffer' frame parameter
  2017-01-14  0:59                     ` Juanma Barranquero
@ 2017-01-14  7:47                       ` Eli Zaretskii
  2017-01-14  9:18                         ` Juanma Barranquero
  0 siblings, 1 reply; 43+ messages in thread
From: Eli Zaretskii @ 2017-01-14  7:47 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: rudalics, drew.adams, emacs-devel

> From: Juanma Barranquero <lekktu@gmail.com>
> Date: Sat, 14 Jan 2017 01:59:59 +0100
> Cc: Drew Adams <drew.adams@oracle.com>, Eli Zaretskii <eliz@gnu.org>, 
> 	Emacs developers <emacs-devel@gnu.org>
> 
> > I slowly begin to understand why Juanma gave up coding for Emacs :-(
> 
> I didn't gave up, life just dealt me a really weird couple of years.

Are we lucky to have you back?



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

* Re: About the 'minibuffer' frame parameter
  2017-01-14  7:47                       ` Eli Zaretskii
@ 2017-01-14  9:18                         ` Juanma Barranquero
  2017-01-14 10:42                           ` Eli Zaretskii
                                             ` (2 more replies)
  0 siblings, 3 replies; 43+ messages in thread
From: Juanma Barranquero @ 2017-01-14  9:18 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: martin rudalics, Drew Adams, Emacs developers

On Sat, Jan 14, 2017 at 8:47 AM, Eli Zaretskii <eliz@gnu.org> wrote:

> Are we lucky to have you back?

I think so. But first I'll have to spend a little time setting my
building environment.

     Juanma



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

* Re: About the 'minibuffer' frame parameter
  2017-01-14  9:18                         ` Juanma Barranquero
@ 2017-01-14 10:42                           ` Eli Zaretskii
  2017-01-14 11:05                           ` martin rudalics
  2017-01-15  3:01                           ` Richard Stallman
  2 siblings, 0 replies; 43+ messages in thread
From: Eli Zaretskii @ 2017-01-14 10:42 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: rudalics, drew.adams, emacs-devel

> From: Juanma Barranquero <lekktu@gmail.com>
> Date: Sat, 14 Jan 2017 10:18:36 +0100
> Cc: martin rudalics <rudalics@gmx.at>, Drew Adams <drew.adams@oracle.com>, 
> 	Emacs developers <emacs-devel@gnu.org>
> 
> On Sat, Jan 14, 2017 at 8:47 AM, Eli Zaretskii <eliz@gnu.org> wrote:
> 
> > Are we lucky to have you back?
> 
> I think so. But first I'll have to spend a little time setting my
> building environment.

Great, thanks.



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

* Re: About the 'minibuffer' frame parameter
  2017-01-14  9:18                         ` Juanma Barranquero
  2017-01-14 10:42                           ` Eli Zaretskii
@ 2017-01-14 11:05                           ` martin rudalics
  2017-01-14 14:01                             ` Juanma Barranquero
  2017-01-14 15:56                             ` Drew Adams
  2017-01-15  3:01                           ` Richard Stallman
  2 siblings, 2 replies; 43+ messages in thread
From: martin rudalics @ 2017-01-14 11:05 UTC (permalink / raw)
  To: Juanma Barranquero, Eli Zaretskii; +Cc: Drew Adams, Emacs developers

> I think so. But first I'll have to spend a little time setting my
> building environment.

We've been missing you.

martin





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

* Re: About the 'minibuffer' frame parameter
  2017-01-14 11:05                           ` martin rudalics
@ 2017-01-14 14:01                             ` Juanma Barranquero
  2017-01-19  3:54                               ` John Wiegley
  2017-01-14 15:56                             ` Drew Adams
  1 sibling, 1 reply; 43+ messages in thread
From: Juanma Barranquero @ 2017-01-14 14:01 UTC (permalink / raw)
  To: martin rudalics; +Cc: Eli Zaretskii, Drew Adams, Emacs developers

On Sat, Jan 14, 2017 at 12:05 PM, martin rudalics <rudalics@gmx.at> wrote:

> We've been missing you.

Thanks, I've been missing Emacs and its motley crew.



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

* RE: About the 'minibuffer' frame parameter
  2017-01-14 11:05                           ` martin rudalics
  2017-01-14 14:01                             ` Juanma Barranquero
@ 2017-01-14 15:56                             ` Drew Adams
  1 sibling, 0 replies; 43+ messages in thread
From: Drew Adams @ 2017-01-14 15:56 UTC (permalink / raw)
  To: martin rudalics, Juanma Barranquero, Eli Zaretskii; +Cc: Emacs developers

> > I think so. But first I'll have to spend a little time setting my
> > building environment.
> 
> We've been missing you.

+1



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

* Re: About the 'minibuffer' frame parameter
  2017-01-14  9:18                         ` Juanma Barranquero
  2017-01-14 10:42                           ` Eli Zaretskii
  2017-01-14 11:05                           ` martin rudalics
@ 2017-01-15  3:01                           ` Richard Stallman
  2 siblings, 0 replies; 43+ messages in thread
From: Richard Stallman @ 2017-01-15  3:01 UTC (permalink / raw)
  To: Juanma Barranquero; +Cc: rudalics, eliz, drew.adams, emacs-devel

[[[ To any NSA and FBI agents reading my email: please consider    ]]]
[[[ whether defending the US Constitution against all enemies,     ]]]
[[[ foreign or domestic, requires you to follow Snowden's example. ]]]

Thank you for rejoining us.

-- 
Dr Richard Stallman
President, Free Software Foundation (gnu.org, fsf.org)
Internet Hall-of-Famer (internethalloffame.org)
Skype: No way! See stallman.org/skype.html.




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

* Re: About the 'minibuffer' frame parameter
  2017-01-14 14:01                             ` Juanma Barranquero
@ 2017-01-19  3:54                               ` John Wiegley
  0 siblings, 0 replies; 43+ messages in thread
From: John Wiegley @ 2017-01-19  3:54 UTC (permalink / raw)
  To: Juanma Barranquero
  Cc: martin rudalics, Eli Zaretskii, Drew Adams, Emacs developers

>>>>> "JB" == Juanma Barranquero <lekktu@gmail.com> writes:

JB> Thanks, I've been missing Emacs and its motley crew.

Welcome back, Juanma!

-- 
John Wiegley                  GPG fingerprint = 4710 CF98 AF9B 327B B80F
http://newartisans.com                          60E1 46C4 BD1A 7AC1 4BA2



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

end of thread, other threads:[~2017-01-19  3:54 UTC | newest]

Thread overview: 43+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-07-31 18:12 About the 'minibuffer' frame parameter martin rudalics
2016-08-05 13:33 ` Eli Zaretskii
2016-08-05 16:37   ` martin rudalics
2016-08-05 17:18     ` Drew Adams
2016-08-05 17:35       ` martin rudalics
2016-08-05 17:52         ` Drew Adams
2016-08-05 18:19           ` martin rudalics
2016-08-05 18:37             ` Drew Adams
2016-08-06  9:32               ` martin rudalics
2016-08-06 16:46                 ` Drew Adams
2016-08-07  8:46                   ` martin rudalics
2017-01-14  0:59                     ` Juanma Barranquero
2017-01-14  7:47                       ` Eli Zaretskii
2017-01-14  9:18                         ` Juanma Barranquero
2017-01-14 10:42                           ` Eli Zaretskii
2017-01-14 11:05                           ` martin rudalics
2017-01-14 14:01                             ` Juanma Barranquero
2017-01-19  3:54                               ` John Wiegley
2017-01-14 15:56                             ` Drew Adams
2017-01-15  3:01                           ` Richard Stallman
2016-08-05 19:25     ` Eli Zaretskii
2016-08-06  9:33       ` martin rudalics
2016-08-07 13:54         ` Eli Zaretskii
2016-08-08  8:27           ` martin rudalics
2016-08-08 15:34             ` Eli Zaretskii
2016-08-09  8:27               ` martin rudalics
2016-08-09 14:51                 ` Eli Zaretskii
2016-08-09 16:07                   ` martin rudalics
2016-08-09 16:21                     ` Eli Zaretskii
2016-08-09 17:34                       ` martin rudalics
2016-08-09 17:51                         ` Eli Zaretskii
2016-08-10 12:15                           ` martin rudalics
2016-08-10 14:23                             ` Stefan Monnier
2016-08-10 14:54                               ` Eli Zaretskii
2016-08-10 14:49                             ` Eli Zaretskii
2016-08-21  9:41                               ` martin rudalics
2016-08-21 20:51                                 ` Kaushal Modi
2016-08-22 12:49                                   ` Kaushal Modi
2016-08-22 13:03                                     ` Kaushal Modi
2016-08-22 15:51                                       ` Kaushal Modi
2016-08-22 16:01                                       ` martin rudalics
2016-08-22 16:27                                         ` Kaushal Modi
2016-08-23  8:19                                           ` 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).