From patchwork Mon Jun 22 03:30:00 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Palka X-Patchwork-Id: 7283 Received: (qmail 22594 invoked by alias); 22 Jun 2015 03:30:41 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 22577 invoked by uid 89); 22 Jun 2015 03:30:40 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.0 required=5.0 tests=AWL, BAYES_05, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_LOW autolearn=no version=3.3.2 X-HELO: mail-qg0-f47.google.com Received: from mail-qg0-f47.google.com (HELO mail-qg0-f47.google.com) (209.85.192.47) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Mon, 22 Jun 2015 03:30:39 +0000 Received: by qged89 with SMTP id d89so49178065qge.0 for ; Sun, 21 Jun 2015 20:30:37 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=S4WyRvt8g4KJSW0p0fkvt9Hyl1ixLad5qxce4LnBRaA=; b=KWmdfGaS/dIxnTykM/FOWVoQ3Ztid75I6c7FcXbSkjHWbAcpuZ4eCQ04VY+ltJNu/6 gBD7IRS/IISXsq4YKdhFdqpQzb6h/lmAhbvw3UtNwnc4PKLeXBga6xzOwEBm7yzckJnr migv+3uxn6LfHXnx8KaKhcaVIIQIhGa322ZRpM9T3vfwS2S+/UpTtId5G4fi06V5LDha /1tGMv3kpokxd83GiMo/AMwwLDmFpsSf5SrDs+N/NYDsxt06QwGkLiDg8tzwAKY72vQL BR+AcbMEmfr/+TGiRHoW6uYkTgvdTv1HTJAdrBWiPhnoFJhezoL+yKXiWRTg8O2FPudd 8HCA== X-Gm-Message-State: ALoCoQmbuNbMIKAV4CDTIGPk0yt22Zg2iF4ynvfIMVdC2oYUzx4E9+4jzhnwNLiMZl51YyZetMGQ X-Received: by 10.55.41.70 with SMTP id p67mr28476997qkh.25.1434943837241; Sun, 21 Jun 2015 20:30:37 -0700 (PDT) Received: from localhost.localdomain (ool-4353acd8.dyn.optonline.net. [67.83.172.216]) by mx.google.com with ESMTPSA id 35sm5366013qkq.41.2015.06.21.20.30.35 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 21 Jun 2015 20:30:36 -0700 (PDT) From: Patrick Palka To: gdb-patches@sourceware.org Cc: Patrick Palka Subject: [PATCH] Add tab completion for TUI's "focus" command Date: Sun, 21 Jun 2015 23:30:00 -0400 Message-Id: <1434943800-9274-1-git-send-email-patrick@parcs.ath.cx> The implementation is pretty straightforward, though there's the question of what the completion list should show when the TUI has not yet been initalized. At that point no TUI window is considered visible thus the completion list will be composed of only the "next" and "prev" keywords (which are always added to the completion list). But technically the commands "focus cmd" and "focus src" will work even when the TUI is not yet initialized because the initialization done in the meantime will make these windows visible by default. So should the entries "cmd" and "src" be added to the completion list as special cases when the TUI is not yet initialized? gdb/ChangeLog: * tui/tui-win.c (focus_completer): New static function. (_initialize_tui_win): Set the completion function of the "focus" command to focus_completer. gdb/testsuite/ChangeLog: * gdb.base/completion.exp: Test the completion of the "focus" command. --- gdb/testsuite/gdb.base/completion.exp | 18 +++++++++++ gdb/tui/tui-win.c | 59 ++++++++++++++++++++++++++++++++++- 2 files changed, 76 insertions(+), 1 deletion(-) diff --git a/gdb/testsuite/gdb.base/completion.exp b/gdb/testsuite/gdb.base/completion.exp index 4c31bfc..5c20f26 100644 --- a/gdb/testsuite/gdb.base/completion.exp +++ b/gdb/testsuite/gdb.base/completion.exp @@ -878,3 +878,21 @@ if {![skip_tui_tests]} { } } } +if {![skip_tui_tests]} { + with_test_prefix "focus command" { + set test "test completion" + send_gdb "focus\t\t\t" + gdb_test_multiple "" "$test" { + -re "next *prev *\r\n$gdb_prompt focus $" { + pass "$test" + } + } + send_gdb "\003" + set test "quit command input after testing completion" + gdb_test_multiple "" "$test" { + -re "$gdb_prompt $" { + pass "$test" + } + } + } +} diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c index 8c0685b..8860ca7 100644 --- a/gdb/tui/tui-win.c +++ b/gdb/tui/tui-win.c @@ -354,6 +354,61 @@ tui_set_var_cmd (char *null_args, int from_tty, struct cmd_list_element *c) tui_rehighlight_all (); } +/* Complete possible window names to focus on. TEXT is the complete text + entered so far, WORD is the word currently being completed. */ + +static VEC (char_ptr) * +focus_completer (struct cmd_list_element *ignore, + const char *text, const char *word) +{ + VEC (const_char_ptr) *completion_name_vec = NULL; + VEC (char_ptr) *matches_vec; + int win_type; + + for (win_type = SRC_WIN; win_type < MAX_MAJOR_WINDOWS; win_type++) + { + const char *completion_name = NULL; + + /* We can't focus on an invisible window. */ + if (tui_win_list[win_type] == NULL + || !tui_win_list[win_type]->generic.is_visible) + continue; + + switch (win_type) + { + case SRC_WIN: + completion_name = "src"; + break; + case DISASSEM_WIN: + completion_name = "asm"; + break; + case DATA_WIN: + completion_name = "regs"; + break; + case CMD_WIN: + completion_name = "cmd"; + break; + default: + break; + } + + if (completion_name != NULL) + VEC_safe_push (const_char_ptr, completion_name_vec, completion_name); + } + + VEC_safe_push (const_char_ptr, completion_name_vec, "next"); + VEC_safe_push (const_char_ptr, completion_name_vec, "prev"); + VEC_safe_push (const_char_ptr, completion_name_vec, NULL); + + matches_vec + = complete_on_enum (VEC_address (const_char_ptr, completion_name_vec), + text, word); + + VEC_free (const_char_ptr, completion_name_vec); + + return matches_vec; +} + /* Function to initialize gdb commands, for tui window manipulation. */ @@ -365,6 +420,7 @@ _initialize_tui_win (void) { static struct cmd_list_element *tui_setlist; static struct cmd_list_element *tui_showlist; + struct cmd_list_element *focus_cmd; /* Define the classes of commands. They will appear in the help list in the reverse of this order. */ @@ -393,7 +449,7 @@ regs : the register display\n")); add_com_alias ("wh", "winheight", class_tui, 0); add_info ("win", tui_all_windows_info, _("List of all displayed windows.\n")); - add_com ("focus", class_tui, tui_set_focus_command, _("\ + focus_cmd = add_com ("focus", class_tui, tui_set_focus_command, _("\ Set focus to named window or next/prev window.\n\ Usage: focus { | next | prev}\n\ Valid Window names are:\n\ @@ -402,6 +458,7 @@ asm : the disassembly window\n\ regs : the register display\n\ cmd : the command window\n")); add_com_alias ("fs", "focus", class_tui, 0); + set_cmd_completer (focus_cmd, focus_completer); add_com ("+", class_tui, tui_scroll_forward_command, _("\ Scroll window forward.\n\ Usage: + [win] [n]\n"));