svnno****@sourc*****
svnno****@sourc*****
2011年 9月 20日 (火) 13:00:32 JST
Revision: 4644 http://sourceforge.jp/projects/ttssh2/svn/view?view=rev&revision=4644 Author: doda Date: 2011-09-20 13:00:32 +0900 (Tue, 20 Sep 2011) Log Message: ----------- OSC 10, 11, 15, 16 に対応。 Modified Paths: -------------- trunk/teraterm/common/tttypes.h trunk/teraterm/teraterm/vtdisp.c trunk/teraterm/teraterm/vtdisp.h trunk/teraterm/teraterm/vtterm.c -------------- next part -------------- Modified: trunk/teraterm/common/tttypes.h =================================================================== --- trunk/teraterm/common/tttypes.h 2011-09-20 00:49:48 UTC (rev 4643) +++ trunk/teraterm/common/tttypes.h 2011-09-20 04:00:32 UTC (rev 4644) @@ -78,6 +78,21 @@ #define IdCyan 6 #define IdFore 7 + /* for DispSetColor / DispGetColor */ +// ANSIColor -- 0-255 +#define CS_VT_NORMALFG 256 +#define CS_VT_NORMALBG 257 +#define CS_VT_BOLDFG 258 +#define CS_VT_BOLDBG 259 +#define CS_VT_BLINKFG 260 +#define CS_VT_BLINKBG 261 +#define CS_VT_REVERSEFG 262 +#define CS_VT_REVERSEBG 263 +#define CS_VT_URLFG 264 +#define CS_VT_URLBG 265 +#define CS_TEK_FG 266 +#define CS_TEK_BG 267 + /* Kermit function id */ #define IdKmtReceive 1 #define IdKmtGet 2 Modified: trunk/teraterm/teraterm/vtdisp.c =================================================================== --- trunk/teraterm/teraterm/vtdisp.c 2011-09-20 00:49:48 UTC (rev 4643) +++ trunk/teraterm/teraterm/vtdisp.c 2011-09-20 04:00:32 UTC (rev 4644) @@ -3646,23 +3646,92 @@ } } -void DispSetANSIColor(int num, COLORREF color) +void DispSetColor(int num, COLORREF color) { - if (num < 0 || num > 255) - return; + HDC TmpDC; - ANSIColor[num] = color; - DispSetNearestColors(num, num, NULL); - InvalidateRect(HVTWin,NULL,FALSE); -// ChangeWin(); + TmpDC = GetDC(NULL); + color = GetNearestColor(TmpDC, color); + ReleaseDC(NULL, TmpDC); + + switch (num) { + case CS_VT_NORMALFG: + ts.VTColor[0] = color; + if ((ts.ColorFlag & CF_USETEXTCOLOR)!=0) { + ANSIColor[IdFore ] = ts.VTColor[0]; // use text color for "white" + } + break; + case CS_VT_NORMALBG: + ts.VTColor[1] = color; + if ((ts.ColorFlag & CF_USETEXTCOLOR)!=0) { + ANSIColor[IdBack ] = ts.VTColor[1]; // use background color for "Black" + } + if (ts.UseNormalBGColor) { + ts.VTBoldColor[1] =color; + ts.VTBlinkColor[1] =color; + ts.URLColor[1] = color; + } + break; + case CS_VT_BOLDFG: ts.VTBoldColor[0] = color; break; + case CS_VT_BOLDBG: ts.VTBoldColor[1] = color; break; + case CS_VT_BLINKFG: ts.VTBlinkColor[0] = color; break; + case CS_VT_BLINKBG: ts.VTBlinkColor[1] = color; break; + case CS_VT_REVERSEFG: ts.VTReverseColor[0] = color; break; + case CS_VT_REVERSEBG: ts.VTReverseColor[1] = color; break; + case CS_VT_URLFG: ts.URLColor[0] = color; break; + case CS_VT_URLBG: ts.URLColor[1] = color; break; + case CS_TEK_FG: ts.TEKColor[0] = color; break; + case CS_TEK_BG: ts.TEKColor[1] = color; break; + default: + if (num >= 0 && num <= 255) { + ANSIColor[num] = color; + } + else { + return; + } + break; + } + +#ifdef ALPHABLEND_TYPE2 + BGInitialize(); +#endif + if (num == CS_TEK_FG || num == CS_TEK_BG) { + if (HTEKWin) + InvalidateRect(HTEKWin, NULL, FALSE); + } + else { + InvalidateRect(HVTWin,NULL,FALSE); + } } -COLORREF DispGetANSIColor(int num) +COLORREF DispGetColor(int num) { - if (num < 0 || num > 255) - return ANSIColor[0]; + COLORREF color; - return ANSIColor[num]; + switch (num) { + case CS_VT_NORMALFG: color = ts.VTColor[0]; break; + case CS_VT_NORMALBG: color = ts.VTColor[1]; break; + case CS_VT_BOLDFG: color = ts.VTBoldColor[0]; break; + case CS_VT_BOLDBG: color = ts.VTBoldColor[1]; break; + case CS_VT_BLINKFG: color = ts.VTBlinkColor[0]; break; + case CS_VT_BLINKBG: color = ts.VTBlinkColor[1]; break; + case CS_VT_REVERSEFG: color = ts.VTReverseColor[0]; break; + case CS_VT_REVERSEBG: color = ts.VTReverseColor[1]; break; + case CS_VT_URLFG: color = ts.URLColor[0]; break; + case CS_VT_URLBG: color = ts.URLColor[1]; break; + case CS_TEK_FG: color = ts.TEKColor[0]; break; + case CS_TEK_BG: color = ts.TEKColor[1]; break; + default: + if (num >= 0 && num <= 255) { + color = ANSIColor[num]; + } + else { + color = ANSIColor[0]; + } + break; + } + + return color; } void DispSetCurCharAttr(TCharAttr Attr) { Modified: trunk/teraterm/teraterm/vtdisp.h =================================================================== --- trunk/teraterm/teraterm/vtdisp.h 2011-09-20 00:49:48 UTC (rev 4643) +++ trunk/teraterm/teraterm/vtdisp.h 2011-09-20 04:00:32 UTC (rev 4644) @@ -78,8 +78,8 @@ void DispApplyANSIColor(); void DispSetNearestColors(int start, int end, HDC DispCtx); int TCharAttrCmp(TCharAttr a, TCharAttr b); -void DispSetANSIColor(int num, COLORREF color); -COLORREF DispGetANSIColor(int num); +void DispSetColor(int num, COLORREF color); +COLORREF DispGetColor(int num); void DispSetCurCharAttr(TCharAttr Attr); void DispMoveWindow(int x, int y); void DispShowWindow(int mode); Modified: trunk/teraterm/teraterm/vtterm.c =================================================================== --- trunk/teraterm/teraterm/vtterm.c 2011-09-20 00:49:48 UTC (rev 4643) +++ trunk/teraterm/teraterm/vtterm.c 2011-09-20 04:00:32 UTC (rev 4644) @@ -3386,6 +3386,59 @@ return TRUE; } +void XsProcColor(int mode, unsigned int ColorNumber, char *ColorSpec) { + COLORREF color; + char StrBuff[256]; + int len; + + switch (mode) { + case 10: + ColorNumber = CS_VT_NORMALFG; + break; + case 11: + ColorNumber = CS_VT_NORMALBG; + break; + case 15: + ColorNumber = CS_TEK_FG; + break; + case 16: + ColorNumber = CS_TEK_BG; + break; + } + + switch (mode) { + case 4: + if ((ts.ColorFlag & CF_XTERM256) && ColorNumber <= 255) { + if (strcmp(ColorSpec, "?") == 0) { + color = DispGetColor(ColorNumber); + len =_snprintf_s_l(StrBuff, sizeof(StrBuff), _TRUNCATE, + "4;%d;rgb:%02x/%02x/%02x", CLocale, ColorNumber, + GetRValue(color), GetGValue(color), GetBValue(color)); + SendOSCstr(StrBuff, len); + } + else if (XsParseColor(ColorSpec, &color)) { + DispSetColor(ColorNumber, color); + } + } + break; + case 10: + case 11: + case 15: + case 16: + if (strcmp(ColorSpec, "?") == 0) { + color = DispGetColor(ColorNumber); + len =_snprintf_s_l(StrBuff, sizeof(StrBuff), _TRUNCATE, + "%d;rgb:%02x/%02x/%02x", CLocale, mode, + GetRValue(color), GetGValue(color), GetBValue(color)); + SendOSCstr(StrBuff, len); + } + else if (XsParseColor(ColorSpec, &color)) { + DispSetColor(ColorNumber, color); + } + break; + } +} + #define ModeXsFirst 1 #define ModeXsString 2 #define ModeXsColorNum 3 @@ -3396,8 +3449,6 @@ static BYTE XsParseMode = ModeXsFirst, PrevMode; static char StrBuff[sizeof(ts.Title)]; static unsigned int ColorNumber, StrLen; - int len; - COLORREF color; switch (XsParseMode) { case ModeXsFirst: @@ -3407,11 +3458,21 @@ else if (b == ';') { StrBuff[0] = '\0'; StrLen = 0; - if (Param[1] == 4) { + switch (Param[1]) { + case 4: ColorNumber = 0; XsParseMode = ModeXsColorNum; - } - else { + break; + case 10: + case 11: + case 15: + case 16: + XsParseMode = ModeXsColorSpec; + ColorNumber = 0; + StrBuff[0] = '\0'; + StrLen = 0; + break; + default: XsParseMode = ModeXsString; } } @@ -3474,18 +3535,7 @@ case ModeXsColorSpec: if ((b==ST && Accept8BitCtrl && !(ts.Language==IdJapanese && ts.KanjiCode==IdSJIS)) || b==BEL) { /* String Terminator */ StrBuff[StrLen] = '\0'; - if ((ts.ColorFlag & CF_XTERM256) && ColorNumber <= 255) { - if (strcmp(StrBuff, "?") == 0) { - color = DispGetANSIColor(ColorNumber); - len =_snprintf_s_l(StrBuff, sizeof(StrBuff), _TRUNCATE, - "4;%d;rgb:%02x/%02x/%02x", CLocale, ColorNumber, - GetRValue(color), GetGValue(color), GetBValue(color)); - SendOSCstr(StrBuff, len); - } - else if (XsParseColor(StrBuff, &color)) { - DispSetANSIColor(ColorNumber, color); - } - } + XsProcColor(Param[1], ColorNumber, StrBuff); ParseMode = ModeFirst; XsParseMode = ModeXsFirst; } @@ -3499,22 +3549,32 @@ } else if (b == ';') { StrBuff[StrLen] = '\0'; - if ((ts.ColorFlag & CF_XTERM256) && ColorNumber <= 255) { - if (strcmp(StrBuff, "?") == 0) { - color = DispGetANSIColor(ColorNumber); - len =_snprintf_s_l(StrBuff, sizeof(StrBuff), _TRUNCATE, - "4;%d;rgb:%02x/%02x/%02x", CLocale, ColorNumber, - GetRValue(color), GetGValue(color), GetBValue(color)); - SendOSCstr(StrBuff, len); - } - else if (XsParseColor(StrBuff, &color)) { - DispSetANSIColor(ColorNumber, color); - } - } + XsProcColor(Param[1], ColorNumber, StrBuff); + ColorNumber = 0; StrBuff[0] = '\0'; StrLen = 0; - XsParseMode = ModeXsColorNum; + + switch (Param[1]) { + case 4: + XsParseMode = ModeXsColorNum; + break; + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + XsParseMode = ModeXsColorSpec; + Param[1]++; + break; + default: + XsParseMode = ModeXsString; + Param[1] = 0xFFFFFFFF; + break; + } } else if (StrLen < sizeof(StrBuff) - 1) { StrBuff[StrLen++] = b;