From patchwork Tue Oct 10 04:59:53 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: 823701 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 3yB4g33mG8z9tYM for ; Tue, 10 Oct 2017 16:00:15 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=mendozajonas.com header.i=@mendozajonas.com header.b="vcNf6erf"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=messagingengine.com header.i=@messagingengine.com header.b="amhiCqiZ"; 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 3yB4g32YqLzDr5x for ; Tue, 10 Oct 2017 16:00:15 +1100 (AEDT) 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="vcNf6erf"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=messagingengine.com header.i=@messagingengine.com header.b="amhiCqiZ"; dkim-atps=neutral X-Original-To: petitboot@lists.ozlabs.org Delivered-To: petitboot@lists.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=mendozajonas.com (client-ip=66.111.4.25; helo=out1-smtp.messagingengine.com; envelope-from=sam@mendozajonas.com; receiver=) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=mendozajonas.com header.i=@mendozajonas.com header.b="vcNf6erf"; dkim=pass (2048-bit key; unprotected) header.d=messagingengine.com header.i=@messagingengine.com header.b="amhiCqiZ"; dkim-atps=neutral Received: from out1-smtp.messagingengine.com (out1-smtp.messagingengine.com [66.111.4.25]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3yB4fw2kRKzDr4x for ; Tue, 10 Oct 2017 16:00:07 +1100 (AEDT) Received: from compute2.internal (compute2.nyi.internal [10.202.2.42]) by mailout.nyi.internal (Postfix) with ESMTP id 9DABD21288; Tue, 10 Oct 2017 01:00:05 -0400 (EDT) Received: from frontend2 ([10.202.2.161]) by compute2.internal (MEProxy); Tue, 10 Oct 2017 01:00:05 -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=G2Ecrg GCYkel7yYzvyZPen50ZBQIB2RYpQ6kjoq6JqE=; b=vcNf6erfA51tNKU9s7X0z3 O8Q9DVzXc4dJgHUAGuqmQq0ae7vb6BqrSpQjt0A4Iz2Eb3RrFtbkPmgrWc1W0Igx vdmLl6DTGOkfAPhcszSQTuC1U14M2pVIP36+W8v7GGjueHpCGXKHeQYqzbyzMpxF eMNTLzjFQJyP0IjpBUpREwd05fB1HmejTagT9pjMMqQBxzamaLp2F5rkZR7C431p Mn3Q9fRQ3C3BL8OjpUT67l1JMPIAgbyjsNjAonNY58Bm+hL+lSdByZYgjn+SmbAs pV1pOIpoSI7hQuJVRG357nmblfpXIUooE2DCTe6PeoOFAP34P35IA07iwdxFCjDA == 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=G2Ecrg GCYkel7yYzvyZPen50ZBQIB2RYpQ6kjoq6JqE=; b=amhiCqiZAzWPJB1evXluVK LoS09nE/NZ9yiPzIq4s1CRIL2iW+0w6lqnC3jv6rFnk5kIBd5pxZReOuoj6nlc1J Yhub/+Z7Bq97crLrye6x4cG8k/wk+7yP/Z5i1z8qYrVBbapK2Rl3Fav1H+vGVTWO b+8hiiydSkT/ir5URTGClt0zeVcYI1wnADCkLpRvCMsEcCGuZf0VN8UiBOWnawwK t7zEuVMyFB2Qho7YhiuCro0NuiFWOUllkWxzboitkZOEyF12RMy7r5NEjiXV1OHF z/IEAZtH2a8q+Q9TKzv5xEMbdBbh5mz7SpaXOZfg3pSXyT4vqJ/0JflUV/IFVS7Q == X-ME-Sender: X-Sasl-enc: Dfys/lfiOFJmNMmUrxYxhMjMdXbh//EURIkjxgCAKTjS 1507611604 Received: from v4.ozlabs.ibm.com (unknown [122.99.82.10]) by mail.messagingengine.com (Postfix) with ESMTPA id 705B7249C6; Tue, 10 Oct 2017 01:00:04 -0400 (EDT) From: Samuel Mendoza-Jonas To: petitboot@lists.ozlabs.org Subject: [PATCH] ui/ncurses: Display multibyte strings correctly in textscreens Date: Tue, 10 Oct 2017 15:59:53 +1100 Message-Id: <20171010045953.20368-1-sam@mendozajonas.com> X-Mailer: git-send-email 2.14.2 X-BeenThere: petitboot@lists.ozlabs.org X-Mailman-Version: 2.1.24 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" In nc-textscreen each line of text is capped at a certain length to avoid running off the side of the viewable screen. However it appears the ncurses function mvwaddnstr() counts by byte instead of actual character, causing strings which contain multibyte characters to be cut short. To avoid this check the displayed length of each string against the screen width, and if under instruct mvwaddnstr() to print the whole string. Signed-off-by: Samuel Mendoza-Jonas --- ui/ncurses/nc-textscreen.c | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/ui/ncurses/nc-textscreen.c b/ui/ncurses/nc-textscreen.c index a460188..0be2016 100644 --- a/ui/ncurses/nc-textscreen.c +++ b/ui/ncurses/nc-textscreen.c @@ -41,15 +41,17 @@ struct text_screen *text_screen_from_scr(struct nc_scr *scr) void text_screen_draw(struct text_screen *screen) { - int max_y, max_x, i; + int max_y, max_x, i, len; max_y = getmaxy(screen->scr.sub_ncw); max_x = getmaxx(screen->scr.sub_ncw) - 1; max_y = min(max_y, screen->scroll_y + screen->n_lines); - for (i = screen->scroll_y; i < max_y; i++) - mvwaddnstr(screen->scr.sub_ncw, i, 1, screen->lines[i], max_x); + for (i = screen->scroll_y; i < max_y; i++) { + len = strncols(screen->lines[i]) > max_x ? max_x : -1; + mvwaddnstr(screen->scr.sub_ncw, i, 1, screen->lines[i], len); + } wrefresh(screen->scr.sub_ncw); } @@ -58,7 +60,7 @@ static void text_screen_scroll(struct text_screen *screen, int key) { int win_lines = getmaxy(screen->scr.sub_ncw); int win_cols = getmaxx(screen->scr.sub_ncw) - 1; - int delta; + int delta, len, i; if (key == KEY_UP) delta = -1; @@ -75,13 +77,16 @@ static void text_screen_scroll(struct text_screen *screen, int key) screen->scroll_y += delta; wscrl(screen->scr.sub_ncw, delta); + if (delta > 0) { + i = screen->scroll_y + win_lines - 1; + len = strncols(screen->lines[i]) > win_cols ? win_cols : -1; mvwaddnstr(screen->scr.sub_ncw, win_lines - 1, 1, - screen->lines[screen->scroll_y+win_lines-1], - win_cols); + screen->lines[i], len); } else if (delta < 0) { - mvwaddnstr(screen->scr.sub_ncw, 0, 1, - screen->lines[screen->scroll_y], win_cols); + i = screen->scroll_y; + len = strncols(screen->lines[i]) > win_cols ? win_cols : -1; + mvwaddnstr(screen->scr.sub_ncw, 0, 1, screen->lines[i], len); } wrefresh(screen->scr.sub_ncw);