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 */