From patchwork Mon Sep 22 18:00:49 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 389 Return-Path: X-Original-To: u-boot-concept@u-boot.org Delivered-To: u-boot-concept@u-boot.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1758564111; bh=3KxZGRrUbQMdnJVVJRfZgZVSU5Ujb/mbI9rGVOfeeSk=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=PH9ZQ81bNqG0FObiBOpX/erIlX63woQtDLVfnRWmNLaaGp8KkTazUMVVTpijiq48M AjRC+rY/Q1IzdwLTDzW9bTE7gZWfA9M1+Hswxz9fjRSSJ7BLmtht2fMh1S9S6Z8PVw d+EcTj/7rj84v0H0XDX773T2spkYDzSz1oWXx+zKeSDfTCfiqugChja1cQhaUSn9qE 1vS1BDDQI7VEdSP0ALtKZ47sMq0FQicRqfTGn4hUTGHk0Ho492ByncyhSFjx58BBqJ PLjCdXSNhsqV5LPRsyTeDRhYTLovYuF+Bh1WofkHq2egLanSn030cFKTpRJ86606BI l7ynEnmGFBI4A== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id C3AA167C65 for ; Mon, 22 Sep 2025 12:01:51 -0600 (MDT) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10024) with ESMTP id pxU-jaWncyXn for ; Mon, 22 Sep 2025 12:01:51 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1758564111; bh=3KxZGRrUbQMdnJVVJRfZgZVSU5Ujb/mbI9rGVOfeeSk=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=PH9ZQ81bNqG0FObiBOpX/erIlX63woQtDLVfnRWmNLaaGp8KkTazUMVVTpijiq48M AjRC+rY/Q1IzdwLTDzW9bTE7gZWfA9M1+Hswxz9fjRSSJ7BLmtht2fMh1S9S6Z8PVw d+EcTj/7rj84v0H0XDX773T2spkYDzSz1oWXx+zKeSDfTCfiqugChja1cQhaUSn9qE 1vS1BDDQI7VEdSP0ALtKZ47sMq0FQicRqfTGn4hUTGHk0Ho492ByncyhSFjx58BBqJ PLjCdXSNhsqV5LPRsyTeDRhYTLovYuF+Bh1WofkHq2egLanSn030cFKTpRJ86606BI l7ynEnmGFBI4A== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id B005467BCF for ; Mon, 22 Sep 2025 12:01:51 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1758564110; bh=0nFlgCGLY0kTc1knTMfuv0/e6WXN3katJgqUMCHsq5w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=V+rt9kaJfBHOJDTLg7X36+N/J7TNdyMtm5ZeIFJjiujyQK2UtfKIuN+dKEMtJ1PNX +ephGva8HSRqpn5/UwiMx6To0x8IfRrCRU7xaT2NFzTOo8MNi3vREkPI76H+CARg+z XxnLO6DVW4wafELZO3F2SKIYVETVOJiNPQ+cRt2zFbbmJq3K9ZUcDMRylh4jaHdxDr L7hEBRsk4bSPMwrhk+nxOCKRg6aRhtRJJK3PrAtD0fBLFq13v0xMMoNcrtD+oQRtSM 1PV2c87oGLyiufAION4Ip2r9q1Xg5cbT12CoXX8XVvsRZ03jww/dGa5LkIlBDReP3/ c0IiQOuNDlc0Q== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id A1FCF67C55; Mon, 22 Sep 2025 12:01:50 -0600 (MDT) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10026) with ESMTP id AgfUZcaMInk0; Mon, 22 Sep 2025 12:01:50 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1758564105; bh=KM22mTpgO8IXfxDK8jSTM/KNRcAKmm7kfByGkq6keoE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=NZmb7H7eJuRDh2oRKAo/ogBXJRlIfi1x0vGp6UMkDCLXw8KwDRc1DkTE9NYjteFAx cKemBrMdmQiISwqppWM0IMzWFf5UoA5rfS86DaQFaXCDh8vXJaciwBuYQxjTvsOoLT iZ9wTY9nglHurt9Ngx3vxPTlspzCpUh5A70K1rtFGfK1bteZZj9aML90nR29BQ4/NW 7dgRU84ZjA50z38TV+v6W+DiqRNyPAq4lZcHp2dRs6TMFzGTr+BPxot5XnkwyQkTHn +JvrJ/WOnEyCpLcVW9cgPluTs7lMV2jaI/Bn/yPhTv1czCOl7ilazRHFBefBCYi4Yg CxWCppdMRu2gQ== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id 26F135FE1A; Mon, 22 Sep 2025 12:01:45 -0600 (MDT) From: Simon Glass To: U-Boot Concept Date: Mon, 22 Sep 2025 12:00:49 -0600 Message-ID: <20250922180116.3088502-6-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250922180116.3088502-1-sjg@u-boot.org> References: <20250922180116.3088502-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: DRQD7HK5FJOVHMAV6MBN2HTMGFXS2GX3 X-Message-ID-Hash: DRQD7HK5FJOVHMAV6MBN2HTMGFXS2GX3 X-MailFrom: sjg@u-boot.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Heinrich Schuchardt , Simon Glass , Claude X-Mailman-Version: 3.3.10 Precedence: list Subject: [Concept] [PATCH 05/24] console: Add bypass keypress to disable paging List-Id: Discussion and patches related to U-Boot Concept Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Simon Glass Add support for pressing 'Q' to put the pager into bypass mode,disabling further paging for the current session. Co-developed-by: Claude Signed-off-by: Simon Glass --- common/pager.c | 36 +++++++++++++++++++++++++----------- doc/usage/console.rst | 3 +++ include/pager.h | 4 ++++ test/common/pager.c | 39 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 71 insertions(+), 11 deletions(-) diff --git a/common/pager.c b/common/pager.c index a16937768b6..c0a55b738b9 100644 --- a/common/pager.c +++ b/common/pager.c @@ -71,6 +71,10 @@ const char *pager_next(struct pager *pag, bool use_pager, int key) pag->state = PAGERST_WAIT_USER; return PAGER_PROMPT; case PAGERST_WAIT_USER: + if (key == 'Q') { + pag->state = PAGERST_BYPASS; + return PAGER_BLANK; + } if (key != ' ') return PAGER_WAITING; pag->state = PAGERST_CLEAR_PROMPT; @@ -79,7 +83,7 @@ const char *pager_next(struct pager *pag, bool use_pager, int key) pag->state = PAGERST_OK; break; case PAGERST_BYPASS: - return NULL; + break; } ret = membuf_getraw(&pag->mb, pag->buf.size - 1, false, &str); @@ -93,17 +97,26 @@ const char *pager_next(struct pager *pag, bool use_pager, int key) return NULL; } - /* return lines until we reach the limit */ - for (p = str, end = str + ret; p < end; p++) { - if (*p == '\n' && ++pag->line_count == pag->page_len - 1) { - /* remember to display the pager message next time */ - pag->state = PAGERST_AT_LIMIT; - pag->line_count = 0; - - /* skip the newline, since our prompt has one */ - p++; - break; + end = str + ret; + if (pag->state != PAGERST_BYPASS) { + /* return lines until we reach the limit */ + for (p = str; p < end; p++) { + if (*p == '\n' && + ++pag->line_count == pag->page_len - 1) { + /* + * remember to display the pager message next + * time + */ + pag->state = PAGERST_AT_LIMIT; + pag->line_count = 0; + + /* skip the newline, since our prompt has one */ + p++; + break; + } } + } else { + p = end; } /* remove the used bytes from the membuf */ @@ -178,6 +191,7 @@ static int on_pager(const char *name, const char *value, enum env_op op, if (value) { new_page_len = simple_strtoul(value, NULL, 16); pager_set_page_len(pag, new_page_len); + pager_set_bypass(pag, false); } break; case env_op_delete: diff --git a/doc/usage/console.rst b/doc/usage/console.rst index 4a28ea95906..880a5b7b605 100644 --- a/doc/usage/console.rst +++ b/doc/usage/console.rst @@ -72,6 +72,9 @@ When activated, the pager pauses at the end of each 'page' (screenful) of output, shows a prompt ": Press SPACE to continue" and lets the user read the output. To continue to the next page, press the SPACE key. +The pager can be bypassed by pressing 'Q' at the prompt. This disables the pager +until the 'pager' environment variable is given a new value. + Page Size Configuration ~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/include/pager.h b/include/pager.h index b43b332a83c..887f5d1f639 100644 --- a/include/pager.h +++ b/include/pager.h @@ -110,6 +110,10 @@ const char *pager_post(struct pager *pag, bool use_pager, const char *s); * busy-wait for a keypress, if desired, since pager_next() will only ever * return PAGER_WAITING until @ch is non-zero. * + * When the pager prompts for user input, pressing SPACE continues to the next + * page, while pressing capital 'Q' puts the pager into bypass mode and + * disables further paging. + * * @pag: Pager to use * @use_pager: Whether or not to use the pager functionality * @ch: Key that the user has pressed, or 0 if none diff --git a/test/common/pager.c b/test/common/pager.c index 53902ab29a3..636069d5b37 100644 --- a/test/common/pager.c +++ b/test/common/pager.c @@ -579,3 +579,42 @@ static int pager_test_console(struct unit_test_state *uts) return 0; } COMMON_TEST(pager_test_console, UTF_CONSOLE); + +/* Test bypass keypress ('Q') functionality */ +static int pager_test_bypass_keypress(struct unit_test_state *uts) +{ + struct pager *pag; + const char *out; + int ret; + + ret = pager_init(&pag, 3, SZ_1K); + ut_assertok(ret); + + /* Post text that will trigger paging */ + out = pager_post(pag, true, "line1\nline2\nline3\nline4\n"); + ut_assertnonnull(out); + ut_asserteq_str("line1\nline2", out); + + /* Should be waiting for user input */ + out = pager_next(pag, true, 0); + ut_asserteq_str(PAGER_PROMPT, out); + + /* Press 'Q' to bypass */ + out = pager_next(pag, true, 'Q'); + ut_asserteq_str(PAGER_BLANK, out); + + /* Verify pager is now in bypass mode */ + ut_asserteq(PAGERST_BYPASS, pag->state); + + /* Next call should return the remaining text without paging */ + out = pager_next(pag, true, 0); + ut_asserteq_str("line3\nline4\n", out); + + /* No more text should be available */ + out = pager_next(pag, true, 0); + ut_asserteq_ptr(NULL, out); + + pager_uninit(pag); + return 0; +} +COMMON_TEST(pager_test_bypass_keypress, 0);