From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id wP/1JpGda1+IZAAAWB0awg (envelope-from ) for ; Wed, 23 Sep 2020 15:10:09 -0400 Received: by simark.ca (Postfix, from userid 112) id 9C7E01EE05; Wed, 23 Sep 2020 15:10:09 -0400 (EDT) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-1.0 required=5.0 tests=MAILING_LIST_MULTI, URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id C97A41E990 for ; Wed, 23 Sep 2020 15:10:08 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 6E2C03951805; Wed, 23 Sep 2020 19:10:08 +0000 (GMT) Received: from simark.ca (simark.ca [158.69.221.121]) by sourceware.org (Postfix) with ESMTPS id BD9F03950C21 for ; Wed, 23 Sep 2020 19:10:05 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org BD9F03950C21 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=simark.ca Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=simark@simark.ca Received: from [172.16.0.95] (192-222-181-218.qc.cable.ebox.net [192.222.181.218]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id 2766A1E990; Wed, 23 Sep 2020 15:10:05 -0400 (EDT) Subject: Re: [PATCH] Don't let TUI focus on locator To: Tom Tromey , gdb-patches@sourceware.org References: <20200923185921.1006372-1-tromey@adacore.com> From: Simon Marchi Message-ID: <1b3329ea-97c0-c379-d343-e891a337244b@simark.ca> Date: Wed, 23 Sep 2020 15:10:04 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 In-Reply-To: <20200923185921.1006372-1-tromey@adacore.com> Content-Type: text/plain; charset=utf-8 Content-Language: tl Content-Transfer-Encoding: 7bit X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" On 2020-09-23 2:59 p.m., Tom Tromey wrote: > PR tui/26638 notes that the C-x o binding can put the focus on the > locator window. However, this is not useful and did not happen > historically. This patch changes the TUI to skip this window when > switching focus. > > gdb/ChangeLog > 2020-09-23 Tom Tromey > > PR tui/26638: > * tui/tui-data.c (tui_next_win): Exclude the locator. > (tui_prev_win): Rewrite. > --- > gdb/ChangeLog | 6 ++++++ > gdb/tui/tui-data.c | 35 +++++++++++++++++++++++++++-------- > 2 files changed, 33 insertions(+), 8 deletions(-) > > diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c > index 8f7d257e945..0d2b2219439 100644 > --- a/gdb/tui/tui-data.c > +++ b/gdb/tui/tui-data.c > @@ -23,6 +23,7 @@ > #include "symtab.h" > #include "tui/tui.h" > #include "tui/tui-data.h" > +#include "tui/tui-stack.h" > #include "tui/tui-win.h" > #include "tui/tui-wingeneral.h" > #include "tui/tui-winsource.h" > @@ -113,9 +114,18 @@ tui_next_win (struct tui_win_info *cur_win) > auto iter = std::find (tui_windows.begin (), tui_windows.end (), cur_win); > gdb_assert (iter != tui_windows.end ()); > > - ++iter; > - if (iter == tui_windows.end ()) > - return tui_windows[0]; > + gdb_assert (cur_win != tui_locator_win_info_ptr ()); > + /* This won't loop forever since we can't have just a locator > + window. */ > + while (true) > + { > + ++iter; > + if (iter == tui_windows.end ()) > + iter = tui_windows.begin (); > + if (*iter != tui_locator_win_info_ptr ()) > + break; > + } > + > return *iter; > } > > @@ -125,12 +135,21 @@ tui_next_win (struct tui_win_info *cur_win) > struct tui_win_info * > tui_prev_win (struct tui_win_info *cur_win) > { > - auto iter = std::find (tui_windows.begin (), tui_windows.end (), cur_win); > - gdb_assert (iter != tui_windows.end ()); > + auto iter = std::find (tui_windows.rbegin (), tui_windows.rend (), cur_win); > + gdb_assert (iter != tui_windows.rend ()); > + > + gdb_assert (cur_win != tui_locator_win_info_ptr ()); > + /* This won't loop forever since we can't have just a locator > + window. */ > + while (true) > + { > + ++iter; > + if (iter == tui_windows.rend ()) > + iter = tui_windows.rbegin (); > + if (*iter != tui_locator_win_info_ptr ()) > + break; > + } > > - if (iter == tui_windows.begin ()) > - return tui_windows.back (); > - --iter; > return *iter; > } Instead of hard-coding here which windows can receive focus, how about having a tui_win_info virtual method "is_focusable", where the default implementation returns true, and tui_locator_window's implementation returns false? The code in tui_next_win / tui_prev_win would return the next / prev focusable window. Simon