From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Alan Mackenzie Newsgroups: gmane.emacs.devel Subject: Re: Stop frames stealing eachothers' minibuffers! Date: Sat, 21 Nov 2020 10:27:51 +0000 Message-ID: <20201121102751.GA11643@ACM> References: <20201119104035.GB6259@ACM> <9aacff47-8ac2-93a2-5112-6153ee986b57@gmx.at> <20201120210005.GA1034@ACM> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="40485"; mail-complaints-to="usenet@ciao.gmane.io" Cc: enometh@meer.net, emacs-devel@gnu.org, Eli Zaretskii , Andrii Kolomoiets , Stefan Monnier To: martin rudalics Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Sat Nov 21 11:28:44 2020 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1kgQ8J-000APX-9x for ged-emacs-devel@m.gmane-mx.org; Sat, 21 Nov 2020 11:28:43 +0100 Original-Received: from localhost ([::1]:60336 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kgQ8I-000426-CM for ged-emacs-devel@m.gmane-mx.org; Sat, 21 Nov 2020 05:28:42 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:55772) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kgQ7Z-0003QK-8g for emacs-devel@gnu.org; Sat, 21 Nov 2020 05:27:57 -0500 Original-Received: from colin.muc.de ([193.149.48.1]:53873 helo=mail.muc.de) by eggs.gnu.org with smtp (Exim 4.90_1) (envelope-from ) id 1kgQ7W-00036A-3D for emacs-devel@gnu.org; Sat, 21 Nov 2020 05:27:56 -0500 Original-Received: (qmail 74947 invoked by uid 3782); 21 Nov 2020 10:27:52 -0000 Original-Received: from acm.muc.de (p4fe15360.dip0.t-ipconnect.de [79.225.83.96]) by localhost.muc.de (tmda-ofmipd) with ESMTP; Sat, 21 Nov 2020 11:27:51 +0100 Original-Received: (qmail 11938 invoked by uid 1000); 21 Nov 2020 10:27:51 -0000 Content-Disposition: inline In-Reply-To: X-Delivery-Agent: TMDA/1.1.12 (Macallan) X-Primary-Address: acm@muc.de Received-SPF: pass client-ip=193.149.48.1; envelope-from=acm@muc.de; helo=mail.muc.de X-Spam_score_int: -18 X-Spam_score: -1.9 X-Spam_bar: - X-Spam_report: (-1.9 / 5.0 requ) BAYES_00=-1.9, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=unavailable autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.io gmane.emacs.devel:259521 Archived-At: Hello, Martin. On Sat, Nov 21, 2020 at 10:02:15 +0100, martin rudalics wrote: > >> (setq default-frame-alist '((minibuffer . nil))) > >> (defun foo () > >> (interactive) > >> (read-from-minibuffer "...?") > >> (insert (format "%s" (selected-frame)))) > >> insert (foo) into *scratch* and type C-x C-e. After answering the > >> prompt this gets me #. Do the same with > >> Emacs 27 and it will get you the *scratch* frame. > > Yes, I see this (except for the Emacs 27 bit which I haven't tried, > > yet). > > However, if I type (frame-list) into *scratch* and do C-x C-e I get only > > one frame in the list, and it has the same address in the # > > output as the " *Minibuf-1* 0xxxx" output. > You have to _load_ the > (setq default-frame-alist '((minibuffer . nil))) > part, it won't work after your default initial frame has been already > set up. Run Emacs via something like > emacs -Q --load ~/foo.el > to see the effect .... OK, I've got it now. [ .... ] > But indeed, with Emacs -Q executing 'foo' defined as > (defun foo () > (interactive) > (read-from-minibuffer "...?") > (insert (format "window: %s .. frame: %s" (selected-window) (selected-frame)))) > reveals another aspect broken by your change. The values reported by > 'selected-window' and 'select-frame' do not match up any more (unless > our masochistic way of printing frame names hides an important detail). I'll look at that later. I'll look at the other things below [snipped] later, too. I'm a bit short of time today. [ .... ] Here's a quick and dirty patch to minibuf.c which appears to fix the bug, but I haven't given it much testing yet: diff --git a/src/minibuf.c b/src/minibuf.c index 464e3018f7..5312dc9805 100644 --- a/src/minibuf.c +++ b/src/minibuf.c @@ -508,7 +508,14 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt, mini_frame = WINDOW_FRAME (XWINDOW (minibuf_window)); if (!EQ (mini_frame, selected_frame)) record_unwind_protect (restore_window_configuration, - Fcons (Qt, + Fcons ( + /* If we're at top minibuffer level in a + minibuffer-only frame, arrange for the + frame later to be switched back. */ + (FRAME_MINIBUF_ONLY_P (XFRAME (mini_frame)) + && minibuf_level <= 1) + ? Qnil + : Qt, Fcurrent_window_configuration (mini_frame))); /* If the minibuffer is on an iconified or invisible frame, > martin -- Alan Mackenzie (Nuremberg, Germany).