From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.ciao.gmane.io!not-for-mail From: martin rudalics Newsgroups: gmane.emacs.bugs Subject: bug#39977: 28.0.50; Unhelpful stack trace Date: Fri, 3 Apr 2020 18:32:18 +0200 Message-ID: References: <01305dbc-c69b-baf9-f0bf-1e5b8c04d970@gmx.at> <83y2s2bswl.fsf@gnu.org> <3ac189d0-5d05-fdf9-0922-0c464b1b17c3@gmx.at> <83k13lbgux.fsf@gnu.org> <83d09cb9gz.fsf@gnu.org> <69a74f9e-079b-a771-0213-f60ed0bf5720@gmx.at> <83y2rzf08m.fsf@gnu.org> <7a0b9999-6778-6235-fbc9-2a24b4e3bc53@gmx.at> <83tv2mg9j0.fsf@gnu.org> <9684641c-a59a-4ed6-a6b4-d3238f789050@gmx.at> <83sgi6g461.fsf@gnu.org> <90ac4084-4fbb-b5d7-6a7c-597d8f08e88a@gmx.at> <83imj1g1eu.fsf@gnu.org> <835zf1fobf.fsf@gnu.org> <4472dbf8-eec0-72eb-a4ad-c6b382d27f1f@gmx.at> <83zhcce7n2.fsf@gnu.org> <9a3df43d-4a83-bed0-9ad1-b59cf11b4c9c@gmx.at> <838sjtetmp.fsf@gnu.org> <88e06868-cfc2-7109-b5ea-71fea3aa897e@gmx.at> <83mu87b004.fsf@gnu.org> <83y2rk7uri.fsf@gnu.org> <8f21c5ce-49a1-1865-6ea3-fe5120c1cfc5@gmx.at> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------EF28C2BD5131A0D062AA6EE6" Injection-Info: ciao.gmane.io; posting-host="ciao.gmane.io:159.69.161.202"; logging-data="93974"; mail-complaints-to="usenet@ciao.gmane.io" Cc: enometh@meer.net, 39977@debbugs.gnu.org To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Fri Apr 03 18:33:56 2020 Return-path: Envelope-to: geb-bug-gnu-emacs@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 1jKPGV-000OKj-Pa for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 03 Apr 2020 18:33:55 +0200 Original-Received: from localhost ([::1]:58166 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jKPGU-00038S-LH for geb-bug-gnu-emacs@m.gmane-mx.org; Fri, 03 Apr 2020 12:33:54 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:38454) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jKPFi-000387-Qu for bug-gnu-emacs@gnu.org; Fri, 03 Apr 2020 12:33:08 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jKPFg-0005F3-UA for bug-gnu-emacs@gnu.org; Fri, 03 Apr 2020 12:33:06 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:59794) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1jKPFd-0005AF-Sq for bug-gnu-emacs@gnu.org; Fri, 03 Apr 2020 12:33:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1jKPFd-0000P0-Pg for bug-gnu-emacs@gnu.org; Fri, 03 Apr 2020 12:33:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: martin rudalics Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Fri, 03 Apr 2020 16:33:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 39977 X-GNU-PR-Package: emacs Original-Received: via spool by 39977-submit@debbugs.gnu.org id=B39977.15859315521435 (code B ref 39977); Fri, 03 Apr 2020 16:33:01 +0000 Original-Received: (at 39977) by debbugs.gnu.org; 3 Apr 2020 16:32:32 +0000 Original-Received: from localhost ([127.0.0.1]:43107 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jKPFA-0000N4-2T for submit@debbugs.gnu.org; Fri, 03 Apr 2020 12:32:32 -0400 Original-Received: from mout.gmx.net ([212.227.15.15]:41005) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jKPF8-0000MR-5o for 39977@debbugs.gnu.org; Fri, 03 Apr 2020 12:32:30 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1585931539; bh=rTsQMI05xK6N8pa+x3dWfBRIKIkcG9Az0f1ynfFz2qU=; h=X-UI-Sender-Class:Subject:From:To:Cc:References:Date:In-Reply-To; b=RlmBfWcPvIuDclD0r8YVZf5L972Zr+L9H5FYY7Z523iT5ehRf+5WP9M7Sqm8s6/18 049eDsK0A9ZZHsBzzcIXeYgwfOWDZ6dJf9e4ozyN7JWQlB1rsNtAyBUAndNmVCp4Or JXsRmlYs4b4wYXLBTipukHQUT2SmiqMwXdEGR4MU= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Original-Received: from [192.168.1.101] ([46.125.249.56]) by mail.gmx.com (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1Mw9UE-1j1lxf2lnw-00s7F5; Fri, 03 Apr 2020 18:32:19 +0200 In-Reply-To: <8f21c5ce-49a1-1865-6ea3-fe5120c1cfc5@gmx.at> Content-Language: en-US X-Provags-ID: V03:K1:MQwxRoj98/YkM3GO0ddXHHpFX2Pk6qhMOGQKvNvBAlHE5hlfLfc DMDBSIuLCzW6GrftLdXY77yUpZnsRjV34J88g7w80Rm7ls6IyzzXI0NiVGSpjQ/RXgmDiIw 4oDsBZcROuPuIAn5H6zziDYSg92PJZSIYqYUYPQvRkCdxo2hw7qFNof5J25wsZc2WJlG7uR MyRqDKqlU4BhpaW7zOFdQ== X-UI-Out-Filterresults: notjunk:1;V03:K0:Uh3TwFceIDU=:cQfHR5o/oo2vlrCBu14EPE wVK/uzjYL5mBWP8hi1cPf986sH3kOBIfoSQ467mCX7OaUx/kZ8M2QpFLT2xhsFP5BjhSZ1dnw iEzh1eIAWWsE4a4aBwndJgSvkC/cTffeLovlPJxvDMe3+GAVryW+4jbYpx/KAw1DKPuE5jwce BqgT3bSZ6lOzGb9OETasvswVsLCkAaRHJO/hpEkrT2uPJ3QUyNFp9w2+CxaAf57cIBHALpeQE 5jRVD7uDaNhM7clZ/LP+FR4t4uMusrlU6XkxO2PZtcJ/gWZ3OXx9Vbz+R5GCveA4k10o1kz2E X+t544B5cSbz8SbmsL58O8OMOQYYRSfTkK0PaiaTP1GsNSTyLs4jyqPjbtEOCF22BRNbZzKjw RLygFO+zphgvBc3CI4BIEwMGp5+Hc9ukW3rMue4BxeE1rmZl5LkBOz2HZwY1e0j7eN6cGwOCb qlc5PTXR8zxK6OYSPpLaPCi+EQg/o28w2imVT+eHeplhN9ltCw9hyLFhe16coU22jW1T9Koqu EOkBC0hzZXdwMDmooG11o6/QGdkHB3Msy5phN45HxP4qe9rN8wpSvbopXOX2pRq1iQqRY+wtT Mtzn/4eHdNdtIL6/RUwwSYSOI+1EaWnCnegbWo3C8MANNAD9FY9eU+9uOfxXXGDP7r1jbi2+c EGxA+RzRh1Wy9mhi6dJYgRwJKGvD3RYOaN1jnQqBVZu46gq6GvHerwXp9iZ+zghRqwGEqBiEr aSGJw5TJ6FLTe1mPb9Sbs/5gTNRx3SitSyd+qytlPPcEOe0X0M9vzvln+SkAABiD6yeQri+H X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.51.188.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:177996 Archived-At: This is a multi-part message in MIME format. --------------EF28C2BD5131A0D062AA6EE6 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit > Attached find a patch which should solve the more grave problems caused > by a function deleting the previously selected frame or window. Fixing a few more things as attached. martin --------------EF28C2BD5131A0D062AA6EE6 Content-Type: text/x-patch; name="restore_selected_window.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="restore_selected_window.diff" diff --git a/src/xdisp.c b/src/xdisp.c index a4de2698ca..82556ca280 100644 --- a/src/xdisp.c +++ b/src/xdisp.c @@ -12149,12 +12149,12 @@ unwind_format_mode_line (Lisp_Object vector) mode_line_string_face_prop = AREF (vector, 5); /* Select window before buffer, since it may change the buffer. */ - if (!NILP (old_window)) + if (WINDOW_LIVE_P (old_window)) { /* If the operation that we are unwinding had selected a window on a different frame, reset its frame-selected-window. For a text terminal, reset its top-frame if necessary. */ - if (!NILP (target_frame_window)) + if (WINDOW_LIVE_P (target_frame_window)) { Lisp_Object frame = WINDOW_FRAME (XWINDOW (target_frame_window)); @@ -12171,7 +12171,7 @@ unwind_format_mode_line (Lisp_Object vector) /* Restore point of target_frame_window's buffer (Bug#32777). But do this only after old_window has been reselected to avoid that the window point of target_frame_window moves. */ - if (!NILP (target_frame_window)) + if (WINDOW_LIVE_P (target_frame_window)) { Lisp_Object buffer = AREF (vector, 10); @@ -12592,23 +12591,68 @@ update_menu_bar (struct frame *f, bool save_match_data, bool hooks_run) Tab-bars ***********************************************************************/ -#ifdef HAVE_WINDOW_SYSTEM - -/* Select `frame' temporarily without running all the code in - do_switch_frame. - FIXME: Maybe do_switch_frame should be trimmed down similarly - when `norecord' is set. */ +/* Restore WINDOW as the selected window and its frame as the selected + frame. If WINDOW is dead but the selected frame is live, make the + latter's selected window the selected window. If both, WINDOW and + the selected frame, are dead, assign selected frame and window from + some arbitrary live frame. Abort if no such frame can be found. */ static void -fast_set_selected_frame (Lisp_Object frame) +restore_selected_window (Lisp_Object window) { - if (!EQ (selected_frame, frame)) + if (WINDOW_LIVE_P (window)) + /* If WINDOW is live, make it the selected window and its frame's + selected window and set the selected frame to its frame. */ + { + selected_window = window; + selected_frame = XWINDOW (window)->frame; + FRAME_SELECTED_WINDOW (XFRAME (selected_frame)) = window; + } + else if (FRAMEP (selected_frame) && FRAME_LIVE_P (XFRAME (selected_frame))) + /* If WINDOW is dead but the selected frame is still live, make the + latter's selected window the selected one. */ + selected_window = FRAME_SELECTED_WINDOW (XFRAME (selected_frame)); + else + /* If WINDOW and the selected frame are dead, choose some live, + non-child and non-tooltip frame as the new selected frame and + make its selected window the selected window. */ { - selected_frame = frame; - selected_window = XFRAME (frame)->selected_window; + Lisp_Object tail; + Lisp_Object frame UNINIT; + + FOR_EACH_FRAME (tail, frame) + { + struct frame *f = XFRAME (frame); + + if (!FRAME_PARENT_FRAME (f) && !FRAME_TOOLTIP_P (f)) + { + selected_frame = frame; + selected_window = FRAME_SELECTED_WINDOW (f); + + return; + } + } + + /* Abort if we cannot find a live frame. */ + emacs_abort (); } } -#endif /* HAVE_WINDOW_SYSTEM */ +/* Restore WINDOW, if live, as its frame's selected window. */ +static void +restore_frame_selected_window (Lisp_Object window) +{ + if (WINDOW_LIVE_P (window)) + /* If WINDOW is live, make it its frame's selected window. If that + frame is the selected frame, make WINDOW the selected window as + well. */ + { + Lisp_Object frame = XWINDOW (window)->frame; + + FRAME_SELECTED_WINDOW (XFRAME (frame)) = window; + if (EQ (frame, selected_frame)) + selected_window = window; + } +} /* Update the tab-bar item list for frame F. This has to be done before we start to fill in any display lines. Called from @@ -12681,9 +12725,10 @@ update_tab_bar (struct frame *f, bool save_match_data) XFRAME (selected_frame)->selected_window)); #ifdef HAVE_WINDOW_SYSTEM Lisp_Object frame; - record_unwind_protect (fast_set_selected_frame, selected_frame); + record_unwind_protect (restore_selected_window, selected_window); XSETFRAME (frame, f); - fast_set_selected_frame (frame); + selected_frame = frame; + selected_window = FRAME_SELECTED_WINDOW (f); #endif /* Build desired tab-bar items from keymaps. */ @@ -13625,9 +13670,10 @@ update_tool_bar (struct frame *f, bool save_match_data) /* Since we only explicitly preserve selected_frame, check that selected_window would be redundant. */ XFRAME (selected_frame)->selected_window)); - record_unwind_protect (fast_set_selected_frame, selected_frame); + record_unwind_protect (restore_selected_window, selected_window); XSETFRAME (frame, f); - fast_set_selected_frame (frame); + selected_frame = frame; + selected_window = FRAME_SELECTED_WINDOW (f); /* Build desired tool-bar items from keymaps. */ new_tool_bar @@ -24939,11 +24985,14 @@ redisplay_mode_lines (Lisp_Object window, bool force) display_mode_lines (struct window *w) { Lisp_Object old_selected_window = selected_window; - Lisp_Object old_selected_frame = selected_frame; Lisp_Object new_frame = w->frame; - Lisp_Object old_frame_selected_window = XFRAME (new_frame)->selected_window; + ptrdiff_t count = SPECPDL_INDEX (); int n = 0; + record_unwind_protect (restore_selected_window, selected_window); + record_unwind_protect + (restore_frame_selected_window, XFRAME (new_frame)->selected_window); + if (window_wants_mode_line (w)) { Lisp_Object window; @@ -25009,9 +25058,8 @@ display_mode_lines (struct window *w) ++n; } - XFRAME (new_frame)->selected_window = old_frame_selected_window; - selected_frame = old_selected_frame; - selected_window = old_selected_window; + unbind_to (count, Qnil); + if (n > 0) w->must_be_updated_p = true; return n; --------------EF28C2BD5131A0D062AA6EE6--