public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Joe Peterson <joe@skyrush.com>
To: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Andrew Morton <akpm@linux-foundation.org>,
	Linux Kernel <linux-kernel@vger.kernel.org>,
	hpa@zytor.com
Subject: Re: [PATCH] Fix backspace on wrapped lines in console (virtual terminal)
Date: Tue, 23 Sep 2008 14:39:48 -0600	[thread overview]
Message-ID: <48D95414.7020505@skyrush.com> (raw)
In-Reply-To: <48D672DE.3010509@skyrush.com>

[-- Attachment #1: Type: text/plain, Size: 1285 bytes --]

Joe Peterson wrote:
> I have worked up a new patch (attached) for review.

After discussing this with Thomas Dickey (maintainer of xterm), and
running vttest on both xterm and vt, I have generated an even newer
patch for review.  This replaces previous patches in this thread.

xterm only "fixes" the backspace behavior if both reverse wrap and
autowrap modes are enabled.  Although the "fix" is required for accurate
erasure of characters on wrapped lines (and therefore is really nice
when using Linux), the vttest results are not what it expects test 1
(cursor movement).  I do not have a VTxxx to test, but I assume vttest
is true to the hardware.

It makes sense, therefore, to retain the older behavior in vt unless
reverse wrap (which did not exist in the hardware) is enabled.  This
makes the patch true to vttest (and presumably the hardware) as well the
same as xterm in this respect.

							Thanks, Joe

P.S.  If anyone has a VTxxx, it would be interesting to know what
happens with autowrap mode on when backspace is hit after a character is
typed in the rightmost column.  If the cursor moves back, and the 2nd to
last character is then erased, this means the VTxxx behavior will match
the patched vt and xterm (when reverse wrap is not on - i.e. using
standard modes).


[-- Attachment #2: vt-add-reverse-wrap-mode.patch --]
[-- Type: text/plain, Size: 2582 bytes --]

head vt-add-reverse-wrap-mode.patch.old
Add option for backspace to work when wrapped to next line by adding
a new private mode 45 to enable reverse wrap (default: off).
This matches xterm's behavior, which already supports private
mode 45.  In addition, when this new mode is active, fix backspace
behavior when the most recently typed character is in the rightmost
column (i.e. in need_wrap state).  This enables correct erasure in
wrapped lines and also matches xterm behavior.

Signed-off-by: Joe Peterson <joe@skyrush.com>
---

diff -Nurp a/drivers/char/vt.c b/drivers/char/vt.c
--- a/drivers/char/vt.c	2008-09-21 09:27:43.186681676 -0600
+++ b/drivers/char/vt.c	2008-09-23 13:52:44.000000000 -0600
@@ -1130,12 +1130,26 @@ static inline void cr(struct vc_data *vc
 
 static inline void bs(struct vc_data *vc)
 {
-	if (vc->vc_x) {
-		vc->vc_pos -= 2;
-		vc->vc_x--;
-		vc->vc_need_wrap = 0;
-		notify_write(vc, '\b');
+	if (!vc->vc_need_wrap || !vc->vc_reverse_wrap || !vc->vc_decawm) {
+		if (vc->vc_x == 0) {
+			if (vc->vc_reverse_wrap && vc->vc_decawm) {
+				vc->vc_x = vc->vc_cols - 1;
+				if (vc->vc_y == vc->vc_top) {
+					scrdown(vc,
+						vc->vc_top, vc->vc_bottom, 1);
+					vc->vc_pos += vc->vc_size_row - 2;
+				} else if (vc->vc_y > 0) {
+					vc->vc_y--;
+					vc->vc_pos -= 2;
+				}
+			}
+		} else {
+			vc->vc_x--;
+			vc->vc_pos -= 2;
+		}
 	}
+	vc->vc_need_wrap = 0;
+	notify_write(vc, '\b');
 }
 
 static inline void del(struct vc_data *vc)
@@ -1437,6 +1451,9 @@ static void set_mode(struct vc_data *vc,
 			case 25:		/* Cursor on/off */
 				vc->vc_deccm = on_off;
 				break;
+			case 45:		/* Reverse wrap on/off */
+				vc->vc_reverse_wrap = on_off;
+				break;
 			case 1000:
 				vc->vc_report_mouse = on_off ? 2 : 0;
 				break;
@@ -1621,6 +1638,7 @@ static void reset_terminal(struct vc_dat
 	vc->vc_decscnm		= 0;
 	vc->vc_decom		= 0;
 	vc->vc_decawm		= 1;
+	vc->vc_reverse_wrap	= 0;
 	vc->vc_deccm		= 1;
 	vc->vc_decim		= 0;
 
diff -Nurp a/include/linux/console_struct.h b/include/linux/console_struct.h
--- a/include/linux/console_struct.h	2008-09-21 09:15:16.136681289 -0600
+++ b/include/linux/console_struct.h	2008-09-23 10:23:56.000000000 -0600
@@ -71,6 +71,7 @@ struct vc_data {
 	unsigned int	vc_decscnm	: 1;	/* Screen Mode */
 	unsigned int	vc_decom	: 1;	/* Origin Mode */
 	unsigned int	vc_decawm	: 1;	/* Autowrap Mode */
+	unsigned int	vc_reverse_wrap	: 1;	/* Reverse wrap Mode */
 	unsigned int	vc_deccm	: 1;	/* Cursor Visible */
 	unsigned int	vc_decim	: 1;	/* Insert Mode */
 	unsigned int	vc_deccolm	: 1;	/* 80/132 Column Mode */

      reply	other threads:[~2008-09-23 20:40 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-09-20 16:25 [PATCH] Fix backspace on wrapped lines in console (virtual terminal) Joe Peterson
2008-09-20 16:38 ` Alan Cox
2008-09-20 16:48   ` Joe Peterson
2008-09-20 23:51   ` Joe Peterson
2008-09-21 16:14     ` Joe Peterson
2008-09-23 20:39       ` Joe Peterson [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=48D95414.7020505@skyrush.com \
    --to=joe@skyrush.com \
    --cc=akpm@linux-foundation.org \
    --cc=alan@lxorguk.ukuu.org.uk \
    --cc=hpa@zytor.com \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox