[Ttssh2-commit] [3743] Alternate Screen Bufferに対応。

Back to archive index

svnno****@sourc***** svnno****@sourc*****
2010年 1月 28日 (木) 07:20:42 JST


Revision: 3743
          http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=3743
Author:   doda
Date:     2010-01-28 07:20:42 +0900 (Thu, 28 Jan 2010)

Log Message:
-----------
Alternate Screen Bufferに対応。

Modified Paths:
--------------
    trunk/teraterm/common/tttypes.h
    trunk/teraterm/teraterm/buffer.c
    trunk/teraterm/teraterm/buffer.h
    trunk/teraterm/teraterm/vtterm.c
    trunk/teraterm/ttpset/ttset.c


-------------- next part --------------
Modified: trunk/teraterm/common/tttypes.h
===================================================================
--- trunk/teraterm/common/tttypes.h	2010-01-27 13:38:58 UTC (rev 3742)
+++ trunk/teraterm/common/tttypes.h	2010-01-27 22:20:42 UTC (rev 3743)
@@ -182,6 +182,7 @@
 #define TF_ENABLESLINE        64
 #define TF_BACKWRAP           128
 #define TF_CLEARONRESIZE      256
+#define TF_ALTSCR             512
 
 // ANSI/Attribute color flags (used in ts.ColorFlag)
 #define CF_PCBOLD16     1

Modified: trunk/teraterm/teraterm/buffer.c
===================================================================
--- trunk/teraterm/teraterm/buffer.c	2010-01-27 13:38:58 UTC (rev 3742)
+++ trunk/teraterm/teraterm/buffer.c	2010-01-27 22:20:42 UTC (rev 3743)
@@ -68,6 +68,10 @@
 
 static TCharAttr CurCharAttr;
 
+HANDLE SaveBuff = NULL;
+int SaveBuffX;
+int SaveBuffY;
+
 LONG GetLinePtr(int Line)
 {
 	LONG Ptr;
@@ -3176,3 +3180,88 @@
 	CurCharAttr = Attr;
 	DispSetCurCharAttr(Attr);
 }
+
+void BuffSaveScreen()
+{
+	PCHAR CodeDest, AttrDest, AttrDest2, AttrDestFG, AttrDestBG;
+	LONG ScrSize;
+	LONG SrcPtr, DestPtr;
+	int i;
+
+	if (SaveBuff == NULL) {
+		ScrSize = NumOfColumns * NumOfLines;
+		if ((SaveBuff=GlobalAlloc(GMEM_MOVEABLE, ScrSize * 5)) != NULL) {
+			if ((CodeDest=GlobalLock(SaveBuff)) != NULL) {
+				AttrDest = CodeDest + ScrSize;
+				AttrDest2 = AttrDest + ScrSize;
+				AttrDestFG = AttrDest2 + ScrSize;
+				AttrDestBG = AttrDestFG + ScrSize;
+
+				SaveBuffX = NumOfColumns;
+				SaveBuffY = NumOfLines;
+
+				SrcPtr = GetLinePtr(PageStart);
+				DestPtr = 0;
+
+				for (i=0; i<NumOfLines; i++) {
+					memcpy(&CodeDest[DestPtr], &CodeBuff[SrcPtr], NumOfColumns);
+					memcpy(&AttrDest[DestPtr], &AttrBuff[SrcPtr], NumOfColumns);
+					memcpy(&AttrDest2[DestPtr], &AttrBuff2[SrcPtr], NumOfColumns);
+					memcpy(&AttrDestFG[DestPtr], &AttrBuffFG[SrcPtr], NumOfColumns);
+					memcpy(&AttrDestBG[DestPtr], &AttrBuffBG[SrcPtr], NumOfColumns);
+					SrcPtr = NextLinePtr(SrcPtr);
+					DestPtr += NumOfColumns;
+				}
+			}
+			else {
+				GlobalFree(SaveBuff);
+				SaveBuff = NULL;
+			}
+		}
+	}
+	return;
+}
+
+void BuffRestoreScreen()
+{
+	PCHAR CodeSrc, AttrSrc, AttrSrc2, AttrSrcFG, AttrSrcBG;
+	LONG ScrSize;
+	LONG SrcPtr, DestPtr;
+	int i;
+
+	if (SaveBuff != NULL) {
+		if ((CodeSrc=GlobalLock(SaveBuff)) != NULL) {
+			ScrSize = SaveBuffX * SaveBuffY;
+
+			AttrSrc = CodeSrc + ScrSize;
+			AttrSrc2 = AttrSrc + ScrSize;
+			AttrSrcFG = AttrSrc2 + ScrSize;
+			AttrSrcBG = AttrSrcFG + ScrSize;
+
+			if (SaveBuffX > NumOfColumns) {
+				SaveBuffX = NumOfColumns;
+			}
+			if (SaveBuffY > NumOfLines) {
+				SaveBuffY = NumOfLines;
+			}
+
+			SrcPtr = 0;
+			DestPtr = GetLinePtr(PageStart);
+
+			for (i=0; i<SaveBuffY; i++) {
+				memcpy(&CodeBuff[DestPtr], &CodeSrc[SrcPtr], SaveBuffX);
+				memcpy(&AttrBuff[DestPtr], &AttrSrc[SrcPtr], SaveBuffX);
+				memcpy(&AttrBuff2[DestPtr], &AttrSrc2[SrcPtr], SaveBuffX);
+				memcpy(&AttrBuffFG[DestPtr], &AttrSrcFG[SrcPtr], SaveBuffX);
+				memcpy(&AttrBuffBG[DestPtr], &AttrSrcBG[SrcPtr], SaveBuffX);
+				SrcPtr += SaveBuffX;
+				DestPtr = NextLinePtr(DestPtr);
+			}
+			BuffUpdateRect(WinOrgX,WinOrgY,WinOrgX+WinWidth-1,WinOrgY+WinHeight-1);
+		}
+
+		GlobalFree(SaveBuff);
+		SaveBuff = NULL;
+	}
+	return;
+}

Modified: trunk/teraterm/teraterm/buffer.h
===================================================================
--- trunk/teraterm/teraterm/buffer.h	2010-01-27 13:38:58 UTC (rev 3742)
+++ trunk/teraterm/teraterm/buffer.h	2010-01-27 22:20:42 UTC (rev 3743)
@@ -68,6 +68,8 @@
 void BuffRegionScrollUpNLines(int n);
 void BuffRegionScrollDownNLines(int n);
 void BuffSetCurCharAttr(TCharAttr Attr);
+void BuffSaveScreen();
+void BuffRestoreScreen();
 
 extern int StatusLine;
 extern int CursorTop, CursorBottom;

Modified: trunk/teraterm/teraterm/vtterm.c
===================================================================
--- trunk/teraterm/teraterm/vtterm.c	2010-01-27 13:38:58 UTC (rev 3742)
+++ trunk/teraterm/teraterm/vtterm.c	2010-01-27 22:20:42 UTC (rev 3743)
@@ -53,6 +53,7 @@
 static BOOL LFMode;
 static BOOL AutoWrapMode;
 static BOOL FocusReportMode;
+static BOOL AltScr;
 int MouseReportMode;
 
 // save/restore cursor
@@ -2078,6 +2079,12 @@
 	    if (ts.AutoWinSwitch>0)
 	      ChangeEmu = IdTEK; /* Enter TEK Mode */
 	    break;
+	  case 47: // Alternate Screen Buffer
+	    if ((ts.TermFlag & TF_ALTSCR) && !AltScr) {
+	      BuffSaveScreen();
+	      AltScr = TRUE;
+	    }
+	    break;
 	  case 59:
 	    if (ts.Language==IdJapanese)
 	    { /* kanji terminal */
@@ -2180,6 +2187,12 @@
 	    break;
 	  case 19: PrintEX = FALSE; break;		// DECPEX
 	  case 25: DispEnableCaret(FALSE); break;	// cursor off (DECTCEM)
+	  case 47: // Alternate Screen Buffer
+	    if ((ts.TermFlag & TF_ALTSCR) && AltScr) {
+	      BuffRestoreScreen();
+	      AltScr = FALSE;
+	    }
+	    break;
 	  case 59:
 	    if (ts.Language==IdJapanese)
 	    { /* katakana terminal */

Modified: trunk/teraterm/ttpset/ttset.c
===================================================================
--- trunk/teraterm/ttpset/ttset.c	2010-01-27 13:38:58 UTC (rev 3742)
+++ trunk/teraterm/ttpset/ttset.c	2010-01-27 22:20:42 UTC (rev 3743)
@@ -1333,6 +1333,10 @@
 	// Clear window on resize
 	if (GetOnOff(Section, "ClearOnResize", FName, TRUE))
 		ts->TermFlag |= TF_CLEARONRESIZE;
+
+	// Alternate Screen Buffer
+	if (GetOnOff(Section, "AlternateScreenBuffer", FName, TRUE))
+		ts->TermFlag |= TF_ALTSCR;
 }
 
 void FAR PASCAL WriteIniFile(PCHAR FName, PTTSet ts)
@@ -2319,6 +2323,10 @@
 	// Clear window on resize
 	WriteOnOff(Section, "ClearOnResize", FName,
 		ts->TermFlag & TF_CLEARONRESIZE);
+
+	// Alternate Screen Buffer
+	WriteOnOff(Section, "AlternateScreenBuffer", FName,
+		ts->TermFlag & TF_ALTSCR);
 }
 
 #define VTEditor "VT editor keypad"



Ttssh2-commit メーリングリストの案内
Back to archive index