From patchwork Thu Aug 10 01:27:02 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sam Mendoza-Jonas X-Patchwork-Id: 800061 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3xSVqV4WBmz9sRg for ; Thu, 10 Aug 2017 11:27:18 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=mendozajonas.com header.i=@mendozajonas.com header.b="s0qE5P1S"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=messagingengine.com header.i=@messagingengine.com header.b="dzWtwCSb"; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3xSVqV3CWRzDqtV for ; Thu, 10 Aug 2017 11:27:18 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=mendozajonas.com header.i=@mendozajonas.com header.b="s0qE5P1S"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=messagingengine.com header.i=@messagingengine.com header.b="dzWtwCSb"; dkim-atps=neutral X-Original-To: petitboot@lists.ozlabs.org Delivered-To: petitboot@lists.ozlabs.org Received: from new2-smtp.messagingengine.com (new2-smtp.messagingengine.com [66.111.4.224]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3xSVqL4ZytzDqrP for ; Thu, 10 Aug 2017 11:27:10 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=mendozajonas.com header.i=@mendozajonas.com header.b="s0qE5P1S"; dkim=pass (2048-bit key; unprotected) header.d=messagingengine.com header.i=@messagingengine.com header.b="dzWtwCSb"; dkim-atps=neutral Received: from compute2.internal (compute2.nyi.internal [10.202.2.42]) by mailnew.nyi.internal (Postfix) with ESMTP id 717A121AE; Wed, 9 Aug 2017 21:27:08 -0400 (EDT) Received: from frontend2 ([10.202.2.161]) by compute2.internal (MEProxy); Wed, 09 Aug 2017 21:27:08 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= mendozajonas.com; h=cc:date:from:message-id:subject:to :x-me-sender:x-me-sender:x-sasl-enc:x-sasl-enc; s=fm1; bh=PJ8nQ8 q1d6dog1rKfouoYiUB34OEQhSwHtaiXzTXwb0=; b=s0qE5P1SZsWi9OwzFGUJzP DmGwh5acw/r+z/c1MIGfP+jYk5VxgHvkl2cR7+kixXDRSGtSfZUoND7aXZt7vGif dFCVPL3RvX1v97WFPL6K3spGIoxAtVrBvKnvPJDhJIJ74Q5rPs6SjntbnXXq5D8T Bg2u8j4GoPMf3PNWb3n8Q+8OnHylhMYnb0A240cONR/Yx1POxPjaAyL1tPiXdDeF B4dFPLot3O4XOhyFvI9Dkc8wXWQKf7TKv+IUvRcHVat5dSAMi3JLlzId8I5q2Qqq XI9BdeYj88a5nKON4as3SzM/3iNhJSLsRrjXegxRCzefeBCZNXgcFi89MsWhjTSw == DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:date:from:message-id:subject:to :x-me-sender:x-me-sender:x-sasl-enc:x-sasl-enc; s=fm1; bh=PJ8nQ8 q1d6dog1rKfouoYiUB34OEQhSwHtaiXzTXwb0=; b=dzWtwCSbjIOYQFZHX06zmR MlTV0tJAOKl/bdyYSEW7W7jmWSnPENyhKRxb2xpKlelqGrpIchrevnzibFOyMnVR /+P0jS0AlXcBoa3Zz/4kwi41BzQOOBgTLQno+E1VUQrCXInpQ40RIS4ulYRGyg2+ GYZwu2eOoH2JJYw4qZDZ1bbu/eKZy2JmxAgg9Ejfay/aV8epKRqYRS8jIdPH/Soc Ky81+s7xA4sthw5gXbsDj7D9uzqdpwaicLyab9+jsQdUePuONHCxefXVbsjj2J2u 9reKhp/17xVUEZk3wnm6ACHt9ICzF0AMFa4tal0v1R7pM3BGWfpyyJYzpVgz7X+w == X-ME-Sender: X-Sasl-enc: suC8nYrk8xg7drudWWckHZX/WwRmw0AVGczqRdkR4ywp 1502328427 Received: from v4.ozlabs.ibm.com (unknown [122.99.82.10]) by mail.messagingengine.com (Postfix) with ESMTPA id BA68C2418B; Wed, 9 Aug 2017 21:27:06 -0400 (EDT) From: Samuel Mendoza-Jonas To: petitboot@lists.ozlabs.org Subject: [PATCH] ui/ncurses: Create pad for nc-add-url screen Date: Thu, 10 Aug 2017 11:27:02 +1000 Message-Id: <20170810012702.30504-1-sam@mendozajonas.com> X-Mailer: git-send-email 2.14.0 X-BeenThere: petitboot@lists.ozlabs.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Petitboot bootloader development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Samuel Mendoza-Jonas MIME-Version: 1.0 Errors-To: petitboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Petitboot" Bring setup for the add-url screen into line with other screens. This fixes an issue with a proper redraw not occurring on help screen init or screen exit, and facilitates other work on simplifying screen init. Signed-off-by: Samuel Mendoza-Jonas --- ui/ncurses/nc-add-url.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/ui/ncurses/nc-add-url.c b/ui/ncurses/nc-add-url.c index 451b050..4abca38 100644 --- a/ui/ncurses/nc-add-url.c +++ b/ui/ncurses/nc-add-url.c @@ -40,12 +40,15 @@ struct add_url_screen { struct nc_scr scr; struct cui *cui; struct nc_widgetset *widgetset; + WINDOW *pad; bool exit; bool show_help; bool need_redraw; void (*on_exit)(struct cui *); + int scroll_y; + int label_x; int field_x; @@ -70,6 +73,16 @@ static struct add_url_screen *add_url_screen_from_scr(struct nc_scr *scr) return add_url_screen; } +static void pad_refresh(struct add_url_screen *screen) +{ + int y, x, rows, cols; + + getmaxyx(screen->scr.sub_ncw, rows, cols); + getbegyx(screen->scr.sub_ncw, y, x); + + prefresh(screen->pad, screen->scroll_y, 0, y, x, rows, cols); +} + static void add_url_screen_process_key(struct nc_scr *scr, int key) { struct add_url_screen *screen = add_url_screen_from_scr(scr); @@ -99,7 +112,7 @@ static void add_url_screen_process_key(struct nc_scr *scr, int key) &add_url_help_text); } else if (handled) { - wrefresh(screen->scr.main_ncw); + pad_refresh(screen); } } @@ -113,6 +126,7 @@ static int add_url_screen_post(struct nc_scr *scr) screen->need_redraw = false; } wrefresh(screen->scr.main_ncw); + pad_refresh(screen); return 0; } @@ -199,6 +213,30 @@ static void add_url_screen_layout_widgets(struct add_url_screen *screen) y, screen->field_x + 28); } +static void add_url_screen_widget_focus(struct nc_widget *widget, void *arg) +{ + struct add_url_screen *screen = arg; + int w_y, w_height, w_focus, s_max, adjust; + + w_height = widget_height(widget); + w_focus = widget_focus_y(widget); + w_y = widget_y(widget) + w_focus; + s_max = getmaxy(screen->scr.sub_ncw) - 1; + + if (w_y < screen->scroll_y) + screen->scroll_y = w_y; + + else if (w_y + screen->scroll_y + 1 > s_max) { + /* Fit as much of the widget into the screen as possible */ + adjust = min(s_max - 1, w_height - w_focus); + if (w_y + adjust >= screen->scroll_y + s_max) + screen->scroll_y = max(0, 1 + w_y + adjust - s_max); + } else + return; + + pad_refresh(screen); +} + static void add_url_screen_setup_widgets(struct add_url_screen *screen) { struct nc_widgetset *set = screen->widgetset; @@ -218,12 +256,21 @@ static void add_url_screen_setup_widgets(struct add_url_screen *screen) cancel_click, screen); } +static int add_url_screen_destroy(void *arg) +{ + struct add_url_screen *screen = arg; + if (screen->pad) + delwin(screen->pad); + return 0; +} + struct add_url_screen *add_url_screen_init(struct cui *cui, void (*on_exit)(struct cui *)) { struct add_url_screen *screen; screen = talloc_zero(cui, struct add_url_screen); + talloc_set_destructor(screen, add_url_screen_destroy); screen->cui = cui; screen->on_exit = on_exit; @@ -243,8 +290,11 @@ struct add_url_screen *add_url_screen_init(struct cui *cui, _("tab=next, shift+tab=previous, x=exit, h=help")); nc_scr_frame_draw(&screen->scr); + screen->pad = newpad(LINES, COLS); screen->widgetset = widgetset_create(screen, screen->scr.main_ncw, - NULL); + screen->pad); + widgetset_set_widget_focus(screen->widgetset, + add_url_screen_widget_focus, screen); add_url_screen_setup_widgets(screen); add_url_screen_layout_widgets(screen);