[Ttssh2-commit] [4644] OSC 10, 11, 15, 16 に対応。

Back to archive index

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;



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