Received: by 2002:ac0:adb4:0:0:0:0:0 with SMTP id o49-v6csp6512imb; Tue, 17 Jul 2018 19:11:55 -0700 (PDT) X-Google-Smtp-Source: AAOMgpeXOwVtnwAmnIBqJfBwvm1a5rl5+qFpkCKuEq/gfKDX7N6xnBQN42zf/9iTDNZ/LmFH3QZU X-Received: by 2002:a17:902:aa07:: with SMTP id be7-v6mr3901375plb.109.1531879915212; Tue, 17 Jul 2018 19:11:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1531879915; cv=none; d=google.com; s=arc-20160816; b=Of3Wf1bsNkQjVi2Aprdlf7kGlx3KBMMUtwUeYfUjXQv+WSSo2a+HWZMuxPTPt0Laop cz/gtOxfFKTU+f/P6cfxo5rkqz4yh1qEod2LiSXF23/NQXYvfyuE0JYtnRI6K9chi2/V fWHoCX02I5MtZpGjNuiapopfbVEhu/TbwHy+nwwhf9YiL4rxElkrMhmGInTEvU8E9JC0 JuhH9QowS+GC5wgcj89ysMSAwPouga/n8fz3DdPti6OtTlseRodl1QTHbhCwIciqWofA KcINw88g6kH2y0SwggOoz9+bKVJD+VusN/AZWVKe9DmRwTpH2yxZFh/8T4GF5hQ+P5KI VICA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:subject:references:in-reply-to:message-id :date:cc:to:from:arc-authentication-results; bh=yW7A3IWnREjpIESdxfeIEBk7NaFfpMqKhgyczT91otA=; b=tsJGfTu2NfEtkJX8XxtXsHiC+51/nCXhQKzF5hjCsicrFd8HfwzN21xcL3B/bvb/UJ T6z6eb6HTOV15G3oIiqMh5nlc74V7ssKXecJfs2MLnCTE6DGI32lrMxsjkZHLXKwstbT 11d156R/iaBd6oQJkXQE7GdXSo2WPeunhJEeXHZyIQUAEup4b3KDsL0M+ZDc4qmNPhtZ TllR+SumavNxYrs0ytPs8LCStbf3OXleIOPxE9SQx96hDlFjQ2hGiycBpBkjsYS34a/7 uivDavHpHrGcYBnFajzK/ZVpIEFWiBG07AhA51bWpqxqKGO1OIERqGt99Otgt/hGEZI9 7+5A== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id ca2-v6si2522065plb.305.2018.07.17.19.11.38; Tue, 17 Jul 2018 19:11:55 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731635AbeGRCqa (ORCPT + 99 others); Tue, 17 Jul 2018 22:46:30 -0400 Received: from tartarus.angband.pl ([89.206.35.136]:34252 "EHLO tartarus.angband.pl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1731193AbeGRCq2 (ORCPT ); Tue, 17 Jul 2018 22:46:28 -0400 Received: from 89-71-158-145.dynamic.chello.pl ([89.71.158.145] helo=umbar.angband.pl) by tartarus.angband.pl with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1ffbvW-0007ME-7t; Wed, 18 Jul 2018 04:10:54 +0200 Received: from kilobyte by umbar.angband.pl with local (Exim 4.91) (envelope-from ) id 1ffbvV-0008Uz-T8; Wed, 18 Jul 2018 04:10:49 +0200 From: Adam Borowski To: Greg Kroah-Hartman , Jiri Slaby , Nicolas Pitre , linux-kernel@vger.kernel.org, linux-console@vger.kernel.org Cc: Adam Borowski Date: Wed, 18 Jul 2018 04:10:44 +0200 Message-Id: <20180718021044.32611-3-kilobyte@angband.pl> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20180718021044.32611-1-kilobyte@angband.pl> References: <20180718020604.3u25omf5fxqvsy3q@angband.pl> <20180718021044.32611-1-kilobyte@angband.pl> X-SA-Exim-Connect-IP: 89.71.158.145 X-SA-Exim-Mail-From: kilobyte@angband.pl X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on tartarus X-Spam-Level: X-Spam-Status: No, score=-2.9 required=8.0 tests=ALL_TRUSTED=-1,BAYES_00=-1.9, TVD_RCVD_IP=0.001 autolearn=ham autolearn_force=no languages=en Subject: [PATCH 3/3] vt: selection: take screen contents from uniscr if available X-SA-Exim-Version: 4.2.1 (built Tue, 02 Aug 2016 21:08:31 +0000) X-SA-Exim-Scanned: Yes (on tartarus.angband.pl) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This preserves whatever was written even if we can't currently display the given glyph. Mouse paste won't corrupt any character of wcwidth() == 1 anymore. Note that for now uniscr doesn't get allocated until something reads /dev/vcsuN for that console, making this code dormant for most users. Signed-off-by: Adam Borowski --- drivers/tty/vt/selection.c | 11 +++++++---- drivers/tty/vt/vt.c | 10 ++++++++++ include/linux/selection.h | 1 + 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/drivers/tty/vt/selection.c b/drivers/tty/vt/selection.c index 69ca337d3220..07496c711d7d 100644 --- a/drivers/tty/vt/selection.c +++ b/drivers/tty/vt/selection.c @@ -57,11 +57,13 @@ static inline void highlight_pointer(const int where) complement_pos(sel_cons, where); } -static u16 +static u32 sel_pos(int n) { + if (use_unicode) + return screen_glyph_unicode(sel_cons, n / 2); return inverse_translate(sel_cons, screen_glyph(sel_cons, n), - use_unicode); + 0); } /** @@ -90,7 +92,8 @@ static u32 inwordLut[]={ 0x07FFFFFE, /* lowercase */ }; -static inline int inword(const u16 c) { +static inline int inword(const u32 c) +{ return c > 0x7f || (( inwordLut[c>>5] >> (c & 0x1F) ) & 1); } @@ -167,7 +170,7 @@ int set_selection(const struct tiocl_selection __user *sel, struct tty_struct *t struct tiocl_selection v; char *bp, *obp; int i, ps, pe, multiplier; - u16 c; + u32 c; int mode; poke_blanked_console(); diff --git a/drivers/tty/vt/vt.c b/drivers/tty/vt/vt.c index 7fcb0ff2dccf..19da4c0b4b8e 100644 --- a/drivers/tty/vt/vt.c +++ b/drivers/tty/vt/vt.c @@ -4545,6 +4545,16 @@ u16 screen_glyph(struct vc_data *vc, int offset) } EXPORT_SYMBOL_GPL(screen_glyph); +u32 screen_glyph_unicode(struct vc_data *vc, int n) +{ + struct uni_screen *uniscr = get_vc_uniscr(vc); + + if (uniscr) + return uniscr->lines[n / vc->vc_cols][n % vc->vc_cols]; + return inverse_translate(vc, screen_glyph(vc, n * 2), 1); +} +EXPORT_SYMBOL_GPL(screen_glyph_unicode); + /* used by vcs - note the word offset */ unsigned short *screen_pos(struct vc_data *vc, int w_offset, int viewed) { diff --git a/include/linux/selection.h b/include/linux/selection.h index 067d2e99c79f..a8f5b97b216f 100644 --- a/include/linux/selection.h +++ b/include/linux/selection.h @@ -32,6 +32,7 @@ extern unsigned char default_blu[]; extern unsigned short *screen_pos(struct vc_data *vc, int w_offset, int viewed); extern u16 screen_glyph(struct vc_data *vc, int offset); +extern u32 screen_glyph_unicode(struct vc_data *vc, int offset); extern void complement_pos(struct vc_data *vc, int offset); extern void invert_screen(struct vc_data *vc, int offset, int count, int shift); -- 2.18.0