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"