Subject: -selectforeground tag configuration option: implementation

From: fvogel <[email-masked]>
Date: Tue, 9 Feb 2016 21:29:22 +0000

---
 generic/tkText.c     |  7 ++++++-
 generic/tkText.h     |  2 ++
 generic/tkTextDisp.c | 10 ++++++++--
 generic/tkTextTag.c  | 10 +++++++++-
 4 files changed, 25 insertions(+), 4 deletions(-)

diff --git a/generic/tkText.c b/generic/tkText.c
index 1b420d6..464d4d9 100644
--- a/generic/tkText.c
+++ b/generic/tkText.c
@@ -2262,7 +2262,11 @@ ConfigureText(
 	textPtr->selTagPtr->borderWidthPtr = textPtr->selBorderWidthPtr;
 	textPtr->selTagPtr->borderWidth = textPtr->selBorderWidth;
     }
-    textPtr->selTagPtr->fgColor = textPtr->selFgColorPtr;
+    if (textPtr->selTagPtr->selFgColor == NULL) {
+        textPtr->selTagPtr->fgColor = textPtr->selFgColorPtr;
+    } else {
+        textPtr->selTagPtr->selFgColor = textPtr->selFgColorPtr;
+    }
     textPtr->selTagPtr->affectsDisplay = 0;
     textPtr->selTagPtr->affectsDisplayGeometry = 0;
     if ((textPtr->selTagPtr->elideString != NULL)
@@ -2285,6 +2289,7 @@ ConfigureText(
 	    || (textPtr->selTagPtr->reliefString != NULL)
 	    || (textPtr->selTagPtr->bgStipple != None)
 	    || (textPtr->selTagPtr->fgColor != NULL)
+	    || (textPtr->selTagPtr->selFgColor != NULL)
 	    || (textPtr->selTagPtr->fgStipple != None)
 	    || (textPtr->selTagPtr->overstrikeString != NULL)
 	    || (textPtr->selTagPtr->underlineString != NULL)) {
diff --git a/generic/tkText.h b/generic/tkText.h
index 5cd009f..3056ab8 100644
--- a/generic/tkText.h
+++ b/generic/tkText.h
@@ -364,6 +364,8 @@ typedef struct TkTextTag {
 				 * valid if rMarginString is non-NULL. */
     Tk_3DBorder selBorder;	/* Used for drawing background for selected text.
 				 * NULL means no value specified here. */
+    XColor *selFgColor;		/* Foreground color for selected text. NULL means
+				 * no value specified here. */
     char *spacing1String;	/* -spacing1 option string (malloc-ed). NULL
 				 * means option not specified. */
     int spacing1;		/* Extra spacing above first display line for
diff --git a/generic/tkTextDisp.c b/generic/tkTextDisp.c
index 1bd5905..e8f8d79 100644
--- a/generic/tkTextDisp.c
+++ b/generic/tkTextDisp.c
@@ -798,9 +798,11 @@ GetStyle(
 
     for (i = 0 ; i < numTags; i++) {
 	Tk_3DBorder border;
+        XColor *fgColor;
 
 	tagPtr = tagPtrs[i];
 	border = tagPtr->border;
+        fgColor = tagPtr->fgColor;
 
 	/*
 	 * If this is the selection tag, and inactiveSelBorder is NULL (the
@@ -824,6 +826,10 @@ GetStyle(
             border = tagPtr->selBorder;
         }
 
+        if ((tagPtr->selFgColor != None) && (isSelected)) {
+            fgColor = tagPtr->selFgColor;
+        }
+
 	if ((border != NULL) && (tagPtr->priority > borderPrio)) {
 	    styleValues.border = border;
 	    borderPrio = tagPtr->priority;
@@ -847,8 +853,8 @@ GetStyle(
 	    styleValues.bgStipple = tagPtr->bgStipple;
 	    bgStipplePrio = tagPtr->priority;
 	}
-	if ((tagPtr->fgColor != None) && (tagPtr->priority > fgPrio)) {
-	    styleValues.fgColor = tagPtr->fgColor;
+	if ((fgColor != None) && (tagPtr->priority > fgPrio)) {
+	    styleValues.fgColor = fgColor;
 	    fgPrio = tagPtr->priority;
 	}
 	if ((tagPtr->tkfont != None) && (tagPtr->priority > fontPrio)) {
diff --git a/generic/tkTextTag.c b/generic/tkTextTag.c
index a857cf9..97356ed 100644
--- a/generic/tkTextTag.c
+++ b/generic/tkTextTag.c
@@ -72,6 +72,8 @@ static const Tk_OptionSpec tagOptionSpecs[] = {
 	NULL, -1, Tk_Offset(TkTextTag, rMarginString), TK_OPTION_NULL_OK, 0,0},
     {TK_OPTION_BORDER, "-selectbackground", NULL, NULL,
 	NULL, -1, Tk_Offset(TkTextTag, selBorder), TK_OPTION_NULL_OK, 0, 0},
+    {TK_OPTION_COLOR, "-selectforeground", NULL, NULL,
+	NULL, -1, Tk_Offset(TkTextTag, selFgColor), TK_OPTION_NULL_OK, 0, 0},
     {TK_OPTION_STRING, "-spacing1", NULL, NULL,
 	NULL, -1, Tk_Offset(TkTextTag, spacing1String), TK_OPTION_NULL_OK,0,0},
     {TK_OPTION_STRING, "-spacing2", NULL, NULL,
@@ -493,7 +495,11 @@ TkTextTagCmd(
                 }
 		textPtr->selBorderWidth = tagPtr->borderWidth;
 		textPtr->selBorderWidthPtr = tagPtr->borderWidthPtr;
-		textPtr->selFgColorPtr = tagPtr->fgColor;
+                if (tagPtr->selFgColor == NULL) {
+                    textPtr->selFgColorPtr = tagPtr->fgColor;
+                } else {
+                    textPtr->selFgColorPtr = tagPtr->selFgColor;
+                }
 	    }
 
 	    tagPtr->affectsDisplay = 0;
@@ -519,6 +525,7 @@ TkTextTagCmd(
 		    || (tagPtr->reliefString != NULL)
 		    || (tagPtr->bgStipple != None)
 		    || (tagPtr->fgColor != NULL)
+		    || (tagPtr->selFgColor != NULL)
 		    || (tagPtr->fgStipple != None)
 		    || (tagPtr->overstrikeString != NULL)
 		    || (tagPtr->underlineString != NULL)) {
@@ -1025,6 +1032,7 @@ TkTextCreateTag(
     tagPtr->rMarginString = NULL;
     tagPtr->rMargin = 0;
     tagPtr->selBorder = NULL;
+    tagPtr->selFgColor = NULL;
     tagPtr->spacing1String = NULL;
     tagPtr->spacing1 = 0;
     tagPtr->spacing2String = NULL;
-- 
cgit v0.12