From 93debbd188ba3a89fb77331eda47f9a1989d0b7b Mon Sep 17 00:00:00 2001
From: deuce <>
Date: Fri, 17 Sep 2004 04:34:45 +0000
Subject: [PATCH] Alt-S scancode actives backscroll (if available) Copy current
 screen to end of scrollback. Reactive scrollback feature.

---
 src/syncterm/menu.c | 35 ++++++++++++++++++++++++-----------
 src/syncterm/term.c |  8 +++-----
 src/syncterm/term.h |  1 +
 3 files changed, 28 insertions(+), 16 deletions(-)

diff --git a/src/syncterm/menu.c b/src/syncterm/menu.c
index a67fbdede6..f7be015bbf 100644
--- a/src/syncterm/menu.c
+++ b/src/syncterm/menu.c
@@ -2,30 +2,35 @@
 #include <ciolib.h>
 #include <keys.h>
 
+#include "cterm.h"
 #include "term.h"
 #include "uifcinit.h"
 
 void viewscroll(void)
 {
-#if 0
 	int	top;
 	int key;
 	int i;
-	char	*buf;
+	char	*scrollback;
 	struct	text_info txtinfo;
+	int	x,y;
 
+	x=wherex();
+	y=wherey();
 	uifcbail();
     gettextinfo(&txtinfo);
-	buf=(char *)malloc(txtinfo.screenheight*txtinfo.screenwidth*2);
-	gettext(1,1,txtinfo.screenwidth,txtinfo.screenheight,buf);
+	scrollback=(char *)malloc((term.width*2*backlines)+(txtinfo.screenheight*txtinfo.screenwidth*2));
+	memcpy(scrollback,cterm.scrollback,term.width*2*backlines);
+	gettext(1,1,txtinfo.screenwidth,txtinfo.screenheight,scrollback+(cterm.backpos)*cterm.width*2);
 	drawwin();
-	top=term.backpos-term.height;
+	top=cterm.backpos;
+	gotoxy(1,1);
 	for(i=0;!i;) {
 		if(top<1)
 			top=1;
-		if(top>term.backpos-term.height)
-			top=term.backpos-term.height;
-		puttext(term.x+1,term.y+1,term.x+term.width,term.y+term.height,term.scrollback+(term.width*2*top));
+		if(top>cterm.backpos)
+			top=cterm.backpos;
+		puttext(term.x-1,term.y-1,term.x+term.width-2,term.y+term.height-2,scrollback+(term.width*2*top));
 		key=getch();
 		switch(key) {
 			case 0:
@@ -57,21 +62,29 @@ void viewscroll(void)
 				break;
 			case 'j':
 			case 'J':
+				top--;
+				break;
 			case 'k':
 			case 'K':
+				top++;
+				break;
 			case 'h':
 			case 'H':
+				top-=term.height;
+				break;
 			case 'l':
 			case 'L':
+				top+=term.height;
+				break;
 			case ESC:
 				i=1;
 				break;
 		}
 	}
-	puttext(1,1,txtinfo.screenwidth,txtinfo.screenheight,buf);
-	free(buf);
+	puttext(1,1,txtinfo.screenwidth,txtinfo.screenheight,scrollback+(cterm.backpos)*cterm.width*2);
+	free(scrollback);
+	gotoxy(x,y);
 	return;
-#endif
 }
 
 int syncmenu(void)
diff --git a/src/syncterm/term.c b/src/syncterm/term.c
index 832ad227ce..0d166200b3 100644
--- a/src/syncterm/term.c
+++ b/src/syncterm/term.c
@@ -54,7 +54,8 @@ void doterm(void)
 			switch(key) {
 				case 0xff:
 				case 0:
-					switch(key|(getch()<<8)) {
+					key|=getch()<<8;
+					switch(key) {
 						case CIO_KEY_MOUSE:
 							getmouse(&mevent);
 							break;
@@ -92,12 +93,9 @@ void doterm(void)
 						case CIO_KEY_F(4):
 							rlogin_send("\033Ox",3,100);
 							break;
-#ifdef __unix__
-						case 128|'S':	/* Under curses, ALT sets the high bit of the char */
-						case 128|'s':	/* Under curses, ALT sets the high bit of the char */
+						case 0x1f00:	/* ALT-S */
 							viewscroll();
 							break;
-#endif
 					}
 					break;
 				case 17:	/* CTRL-Q */
diff --git a/src/syncterm/term.h b/src/syncterm/term.h
index b8d5e9eeff..ce607467c5 100644
--- a/src/syncterm/term.h
+++ b/src/syncterm/term.h
@@ -9,6 +9,7 @@ struct terminal {
 };
 
 extern struct terminal term;
+extern int backlines;
 
 void doterm(void);
 
-- 
GitLab