Skip to content

Commit

Permalink
Fix [026e2bb685]: text tag sets bad relief, gets error, but bad relie…
Browse files Browse the repository at this point in the history
…f is saved anyway
  • Loading branch information
jan.nijtmans committed Jan 17, 2024
2 parents a1b1d6d + 2ccfe27 commit 5b4bd50
Show file tree
Hide file tree
Showing 5 changed files with 89 additions and 122 deletions.
16 changes: 9 additions & 7 deletions generic/tkText.c
Original file line number Diff line number Diff line change
Expand Up @@ -618,6 +618,8 @@ CreateWidget(

textPtr->selTagPtr = TkTextCreateTag(textPtr, "sel", NULL);
Tk_GetRelief(interp, DEF_TEXT_SELECT_RELIEF, &textPtr->selTagPtr->relief);
textPtr->selTagPtr->reliefObj = Tcl_NewStringObj(DEF_TEXT_SELECT_RELIEF, -1);
Tcl_IncrRefCount(textPtr->selTagPtr->reliefObj);
textPtr->currentMarkPtr = TkTextSetMark(textPtr, "current", &startIndex);
textPtr->insertMarkPtr = TkTextSetMark(textPtr, "insert", &startIndex);

Expand Down Expand Up @@ -2259,13 +2261,13 @@ ConfigureText(
if ((textPtr->selTagPtr->elide >= 0)
|| (textPtr->selTagPtr->tkfont != NULL)
|| (textPtr->selTagPtr->justify != TK_JUSTIFY_NULL)
|| (textPtr->selTagPtr->lMargin1String != NULL)
|| (textPtr->selTagPtr->lMargin2String != NULL)
|| (textPtr->selTagPtr->offsetString != NULL)
|| (textPtr->selTagPtr->rMarginString != NULL)
|| (textPtr->selTagPtr->spacing1String != NULL)
|| (textPtr->selTagPtr->spacing2String != NULL)
|| (textPtr->selTagPtr->spacing3String != NULL)
|| (textPtr->selTagPtr->lMargin1 != INT_MIN)
|| (textPtr->selTagPtr->lMargin2 != INT_MIN)
|| (textPtr->selTagPtr->offset != INT_MIN)
|| (textPtr->selTagPtr->rMargin != INT_MIN)
|| (textPtr->selTagPtr->spacing1 != INT_MIN)
|| (textPtr->selTagPtr->spacing2 != INT_MIN)
|| (textPtr->selTagPtr->spacing3 != INT_MIN)
|| (textPtr->selTagPtr->tabStringPtr != NULL)
|| (textPtr->selTagPtr->tabStyle == TK_TEXT_TABSTYLE_TABULAR)
|| (textPtr->selTagPtr->tabStyle == TK_TEXT_TABSTYLE_WORDPROCESSOR)
Expand Down
41 changes: 18 additions & 23 deletions generic/tkText.h
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,7 @@ typedef struct TkTextTag {
* value specified here. */
int borderWidth; /* Width of 3-D border for background. */
Tcl_Obj *borderWidthPtr; /* Width of 3-D border for background. */
Tcl_Obj *reliefObj;
int relief; /* 3-D relief for background. */
Pixmap bgStipple; /* Stipple bitmap for background. None means
* no value specified here. */
Expand All @@ -332,58 +333,52 @@ typedef struct TkTextTag {
Pixmap fgStipple; /* Stipple bitmap for text and other
* foreground stuff. None means no value
* specified here.*/
Tcl_Obj *justifyObj;
Tk_Justify justify; /* How to justify text: TK_JUSTIFY_LEFT,
* TK_JUSTIFY_RIGHT, TK_JUSTIFY_CENTER, or TK_JUSTIFY_NULL. */
char *lMargin1String; /* -lmargin1 option string (malloc-ed). NULL
Tcl_Obj *lMargin1Obj; /* -lmargin1 option object. NULL
* means option not specified. */
int lMargin1; /* Left margin for first display line of each
* text line, in pixels. Only valid if
* lMargin1String is non-NULL. */
char *lMargin2String; /* -lmargin2 option string (malloc-ed). NULL
* text line, in pixels. INT_MIN means option not specified. */
Tcl_Obj *lMargin2Obj; /* -lmargin2 option object. NULL
* means option not specified. */
int lMargin2; /* Left margin for second and later display
* lines of each text line, in pixels. Only
* valid if lMargin2String is non-NULL. */
int lMargin2; /* Left margin for second and later display lines
* of each text line, in pixels. */
Tk_3DBorder lMarginColor; /* Used for drawing background in left margins.
* This is used for both lmargin1 and lmargin2.
* NULL means no value specified here. */
char *offsetString; /* -offset option string (malloc-ed). NULL
Tcl_Obj *offsetObj; /* -offset option object. NULL
* means option not specified. */
int offset; /* Vertical offset of text's baseline from
* baseline of line. Used for superscripts and
* subscripts. Only valid if offsetString is
* non-NULL. */
* subscripts. INT_MIN means option not specified. */
Tcl_Obj *overstrikePtr; /* -overstrike option. NULL
* means option not specified. */
int overstrike; /* > 0 means draw horizontal line through
* middle of text. -1 means not specified. */
XColor *overstrikeColor; /* Color for the overstrike. NULL means same
* color as foreground. */
char *rMarginString; /* -rmargin option string (malloc-ed). NULL
Tcl_Obj *rMarginObj; /* -rmargin option object. NULL
* means option not specified. */
int rMargin; /* Right margin for text, in pixels. Only
* valid if rMarginString is non-NULL. */
int rMargin; /* Right margin for text, in pixels. INT_MIN means option not specified. */
Tk_3DBorder rMarginColor; /* Used for drawing background in right margin.
* NULL means no value specified here. */
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
Tcl_Obj *spacing1Obj; /* -spacing1 option object. NULL
* means option not specified. */
int spacing1; /* Extra spacing above first display line for
* text line. Only valid if spacing1String is
* non-NULL. */
char *spacing2String; /* -spacing2 option string (malloc-ed). NULL
* text line. INT_MIN means option not specified. */
Tcl_Obj *spacing2Obj; /* -spacing2 option object. NULL
* means option not specified. */
int spacing2; /* Extra spacing between display lines for the
* same text line. Only valid if
* spacing2String is non-NULL. */
char *spacing3String; /* -spacing2 option string (malloc-ed). NULL
* same text line. INT_MIN means option not specified. */
Tcl_Obj *spacing3Obj; /* -spacing3 option object. NULL
* means option not specified. */
int spacing3; /* Extra spacing below last display line for
* text line. Only valid if spacing3String is
* non-NULL. */
* text line. INT_MIN means option not specified. */
Tcl_Obj *tabStringPtr; /* -tabs option string. NULL means option not
* specified. */
struct TkTextTabArray *tabArrayPtr;
Expand All @@ -402,7 +397,7 @@ typedef struct TkTextTag {
* TEXT_WRAPMODE_NONE, TEXT_WRAPMODE_WORD, or
* TEXT_WRAPMODE_NULL to use wrapmode for
* whole widget. */
Tcl_Obj *elidePtr; /* -elide option. NULL
Tcl_Obj *elideObj; /* -elide option. NULL
* means option not specified. */
int elide; /* > 0 means that data under this tag
* should not be displayed. -1 means not specified. */
Expand Down
14 changes: 7 additions & 7 deletions generic/tkTextDisp.c
Original file line number Diff line number Diff line change
Expand Up @@ -903,12 +903,12 @@ GetStyle(
styleValues.justify = tagPtr->justify;
justifyPrio = tagPtr->priority;
}
if ((tagPtr->lMargin1String != NULL)
if ((tagPtr->lMargin1 != INT_MIN)
&& (tagPtr->priority > lMargin1Prio)) {
styleValues.lMargin1 = tagPtr->lMargin1;
lMargin1Prio = tagPtr->priority;
}
if ((tagPtr->lMargin2String != NULL)
if ((tagPtr->lMargin2 != INT_MIN)
&& (tagPtr->priority > lMargin2Prio)) {
styleValues.lMargin2 = tagPtr->lMargin2;
lMargin2Prio = tagPtr->priority;
Expand All @@ -918,7 +918,7 @@ GetStyle(
styleValues.lMarginColor = tagPtr->lMarginColor;
lMarginColorPrio = tagPtr->priority;
}
if ((tagPtr->offsetString != NULL)
if ((tagPtr->offset != INT_MIN)
&& (tagPtr->priority > offsetPrio)) {
styleValues.offset = tagPtr->offset;
offsetPrio = tagPtr->priority;
Expand All @@ -933,7 +933,7 @@ GetStyle(
styleValues.overstrikeColor = fgColor;
}
}
if ((tagPtr->rMarginString != NULL)
if ((tagPtr->rMargin != INT_MIN)
&& (tagPtr->priority > rMarginPrio)) {
styleValues.rMargin = tagPtr->rMargin;
rMarginPrio = tagPtr->priority;
Expand All @@ -943,17 +943,17 @@ GetStyle(
styleValues.rMarginColor = tagPtr->rMarginColor;
rMarginColorPrio = tagPtr->priority;
}
if ((tagPtr->spacing1String != NULL)
if ((tagPtr->spacing1 != INT_MIN)
&& (tagPtr->priority > spacing1Prio)) {
styleValues.spacing1 = tagPtr->spacing1;
spacing1Prio = tagPtr->priority;
}
if ((tagPtr->spacing2String != NULL)
if ((tagPtr->spacing2 != INT_MIN)
&& (tagPtr->priority > spacing2Prio)) {
styleValues.spacing2 = tagPtr->spacing2;
spacing2Prio = tagPtr->priority;
}
if ((tagPtr->spacing3String != NULL)
if ((tagPtr->spacing3 != INT_MIN)
&& (tagPtr->priority > spacing3Prio)) {
styleValues.spacing3 = tagPtr->spacing3;
spacing3Prio = tagPtr->priority;
Expand Down
122 changes: 44 additions & 78 deletions generic/tkTextTag.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ static const Tk_OptionSpec tagOptionSpecs[] = {
NULL, offsetof(TkTextTag, borderWidthPtr), offsetof(TkTextTag, borderWidth),
TK_OPTION_NULL_OK, 0, 0},
{TK_OPTION_BOOLEAN, "-elide", NULL, NULL,
NULL, offsetof(TkTextTag, elidePtr), offsetof(TkTextTag, elide),
NULL, offsetof(TkTextTag, elideObj), offsetof(TkTextTag, elide),
TK_OPTION_NULL_OK, 0, 0},
{TK_OPTION_BITMAP, "-fgstipple", NULL, NULL,
NULL, TCL_INDEX_NONE, offsetof(TkTextTag, fgStipple), TK_OPTION_NULL_OK, 0, 0},
Expand All @@ -34,37 +34,37 @@ static const Tk_OptionSpec tagOptionSpecs[] = {
{TK_OPTION_COLOR, "-foreground", NULL, NULL,
NULL, TCL_INDEX_NONE, offsetof(TkTextTag, fgColor), TK_OPTION_NULL_OK, 0, 0},
{TK_OPTION_JUSTIFY, "-justify", NULL, NULL,
NULL, TCL_INDEX_NONE, offsetof(TkTextTag, justify), TK_OPTION_NULL_OK, 0,0},
{TK_OPTION_STRING, "-lmargin1", NULL, NULL,
NULL, TCL_INDEX_NONE, offsetof(TkTextTag, lMargin1String), TK_OPTION_NULL_OK,0,0},
{TK_OPTION_STRING, "-lmargin2", NULL, NULL,
NULL, TCL_INDEX_NONE, offsetof(TkTextTag, lMargin2String), TK_OPTION_NULL_OK,0,0},
NULL, offsetof(TkTextTag, justifyObj), offsetof(TkTextTag, justify), TK_OPTION_NULL_OK, 0,0},
{TK_OPTION_PIXELS, "-lmargin1", NULL, NULL,
NULL, offsetof(TkTextTag, lMargin1Obj), offsetof(TkTextTag, lMargin1), TK_OPTION_NULL_OK,0,0},
{TK_OPTION_PIXELS, "-lmargin2", NULL, NULL,
NULL, offsetof(TkTextTag, lMargin2Obj), offsetof(TkTextTag, lMargin2), TK_OPTION_NULL_OK,0,0},
{TK_OPTION_BORDER, "-lmargincolor", NULL, NULL,
NULL, TCL_INDEX_NONE, offsetof(TkTextTag, lMarginColor), TK_OPTION_NULL_OK, 0, 0},
{TK_OPTION_STRING, "-offset", NULL, NULL,
NULL, TCL_INDEX_NONE, offsetof(TkTextTag, offsetString), TK_OPTION_NULL_OK, 0, 0},
{TK_OPTION_PIXELS, "-offset", NULL, NULL,
NULL, offsetof(TkTextTag, offsetObj), offsetof(TkTextTag, offset), TK_OPTION_NULL_OK, 0, 0},
{TK_OPTION_BOOLEAN, "-overstrike", NULL, NULL,
NULL, offsetof(TkTextTag, overstrikePtr), offsetof(TkTextTag, overstrike),
TK_OPTION_NULL_OK, 0, 0},
{TK_OPTION_COLOR, "-overstrikefg", NULL, NULL,
NULL, TCL_INDEX_NONE, offsetof(TkTextTag, overstrikeColor),
TK_OPTION_NULL_OK, 0, 0},
{TK_OPTION_RELIEF, "-relief", NULL, NULL,
NULL, TCL_INDEX_NONE, offsetof(TkTextTag, relief), TK_OPTION_NULL_OK, 0, 0},
{TK_OPTION_STRING, "-rmargin", NULL, NULL,
NULL, TCL_INDEX_NONE, offsetof(TkTextTag, rMarginString), TK_OPTION_NULL_OK, 0,0},
NULL, offsetof(TkTextTag, reliefObj), offsetof(TkTextTag, relief), TK_OPTION_NULL_OK, 0, 0},
{TK_OPTION_PIXELS, "-rmargin", NULL, NULL,
NULL, offsetof(TkTextTag, rMarginObj), offsetof(TkTextTag, rMargin), TK_OPTION_NULL_OK, 0,0},
{TK_OPTION_BORDER, "-rmargincolor", NULL, NULL,
NULL, TCL_INDEX_NONE, offsetof(TkTextTag, rMarginColor), TK_OPTION_NULL_OK, 0, 0},
{TK_OPTION_BORDER, "-selectbackground", NULL, NULL,
NULL, TCL_INDEX_NONE, offsetof(TkTextTag, selBorder), TK_OPTION_NULL_OK, 0, 0},
{TK_OPTION_COLOR, "-selectforeground", NULL, NULL,
NULL, TCL_INDEX_NONE, offsetof(TkTextTag, selFgColor), TK_OPTION_NULL_OK, 0, 0},
{TK_OPTION_STRING, "-spacing1", NULL, NULL,
NULL, TCL_INDEX_NONE, offsetof(TkTextTag, spacing1String), TK_OPTION_NULL_OK,0,0},
{TK_OPTION_STRING, "-spacing2", NULL, NULL,
NULL, TCL_INDEX_NONE, offsetof(TkTextTag, spacing2String), TK_OPTION_NULL_OK,0,0},
{TK_OPTION_STRING, "-spacing3", NULL, NULL,
NULL, TCL_INDEX_NONE, offsetof(TkTextTag, spacing3String), TK_OPTION_NULL_OK,0,0},
{TK_OPTION_PIXELS, "-spacing1", NULL, NULL,
NULL, offsetof(TkTextTag, spacing1Obj), offsetof(TkTextTag, spacing1), TK_OPTION_NULL_OK,0,0},
{TK_OPTION_PIXELS, "-spacing2", NULL, NULL,
NULL, offsetof(TkTextTag, spacing2Obj), offsetof(TkTextTag, spacing2), TK_OPTION_NULL_OK,0,0},
{TK_OPTION_PIXELS, "-spacing3", NULL, NULL,
NULL, offsetof(TkTextTag, spacing3Obj), offsetof(TkTextTag, spacing3), TK_OPTION_NULL_OK,0,0},
{TK_OPTION_STRING, "-tabs", NULL, NULL,
NULL, offsetof(TkTextTag, tabStringPtr), TCL_INDEX_NONE, TK_OPTION_NULL_OK, 0, 0},
{TK_OPTION_STRING_TABLE, "-tabstyle", NULL, NULL,
Expand Down Expand Up @@ -368,53 +368,17 @@ TkTextTagCmd(
if (tagPtr->borderWidth < 0) {
tagPtr->borderWidth = 0;
}
if (tagPtr->lMargin1String != NULL) {
if (Tk_GetPixels(interp, textPtr->tkwin,
tagPtr->lMargin1String, &tagPtr->lMargin1) != TCL_OK) {
return TCL_ERROR;
}
}
if (tagPtr->lMargin2String != NULL) {
if (Tk_GetPixels(interp, textPtr->tkwin,
tagPtr->lMargin2String, &tagPtr->lMargin2) != TCL_OK) {
return TCL_ERROR;
}
}
if (tagPtr->offsetString != NULL) {
if (Tk_GetPixels(interp, textPtr->tkwin, tagPtr->offsetString,
&tagPtr->offset) != TCL_OK) {
return TCL_ERROR;
}
}
if (tagPtr->rMarginString != NULL) {
if (Tk_GetPixels(interp, textPtr->tkwin,
tagPtr->rMarginString, &tagPtr->rMargin) != TCL_OK) {
return TCL_ERROR;
}
}
if (tagPtr->spacing1String != NULL) {
if (Tk_GetPixels(interp, textPtr->tkwin,
tagPtr->spacing1String, &tagPtr->spacing1) != TCL_OK) {
return TCL_ERROR;
}
if (tagPtr->spacing1 != INT_MIN) {
if (tagPtr->spacing1 < 0) {
tagPtr->spacing1 = 0;
}
}
if (tagPtr->spacing2String != NULL) {
if (Tk_GetPixels(interp, textPtr->tkwin,
tagPtr->spacing2String, &tagPtr->spacing2) != TCL_OK) {
return TCL_ERROR;
}
if (tagPtr->spacing2 != INT_MIN) {
if (tagPtr->spacing2 < 0) {
tagPtr->spacing2 = 0;
}
}
if (tagPtr->spacing3String != NULL) {
if (Tk_GetPixels(interp, textPtr->tkwin,
tagPtr->spacing3String, &tagPtr->spacing3) != TCL_OK) {
return TCL_ERROR;
}
if (tagPtr->spacing3 != INT_MIN) {
if (tagPtr->spacing3 < 0) {
tagPtr->spacing3 = 0;
}
Expand Down Expand Up @@ -468,13 +432,13 @@ TkTextTagCmd(
if ((tagPtr->elide >= 0)
|| (tagPtr->tkfont != NULL)
|| (tagPtr->justify != TK_JUSTIFY_NULL)
|| (tagPtr->lMargin1String != NULL)
|| (tagPtr->lMargin2String != NULL)
|| (tagPtr->offsetString != NULL)
|| (tagPtr->rMarginString != NULL)
|| (tagPtr->spacing1String != NULL)
|| (tagPtr->spacing2String != NULL)
|| (tagPtr->spacing3String != NULL)
|| (tagPtr->lMargin1 != INT_MIN)
|| (tagPtr->lMargin2 != INT_MIN)
|| (tagPtr->offset != INT_MIN)
|| (tagPtr->rMargin != INT_MIN)
|| (tagPtr->spacing1 != INT_MIN)
|| (tagPtr->spacing2 != INT_MIN)
|| (tagPtr->spacing3 != INT_MIN)
|| (tagPtr->tabStringPtr != NULL)
|| (tagPtr->tabStyle == TK_TEXT_TABSTYLE_TABULAR)
|| (tagPtr->tabStyle == TK_TEXT_TABSTYLE_WORDPROCESSOR)
Expand Down Expand Up @@ -981,40 +945,42 @@ TkTextCreateTag(
tagPtr->border = NULL;
tagPtr->borderWidth = 0;
tagPtr->borderWidthPtr = NULL;
tagPtr->reliefObj = NULL;
tagPtr->relief = TK_RELIEF_NULL;
tagPtr->bgStipple = None;
tagPtr->fgColor = NULL;
tagPtr->tkfont = NULL;
tagPtr->fgStipple = None;
tagPtr->justifyObj = NULL;
tagPtr->justify = TK_JUSTIFY_NULL;
tagPtr->lMargin1String = NULL;
tagPtr->lMargin1 = 0;
tagPtr->lMargin2String = NULL;
tagPtr->lMargin2 = 0;
tagPtr->lMargin1Obj = NULL;
tagPtr->lMargin1 = INT_MIN;
tagPtr->lMargin2Obj = NULL;
tagPtr->lMargin2 = INT_MIN;
tagPtr->lMarginColor = NULL;
tagPtr->offsetString = NULL;
tagPtr->offset = 0;
tagPtr->offsetObj = NULL;
tagPtr->offset = INT_MIN;
tagPtr->overstrikePtr = NULL;
tagPtr->overstrike = -1;
tagPtr->overstrikeColor = NULL;
tagPtr->rMarginString = NULL;
tagPtr->rMargin = 0;
tagPtr->rMarginObj = NULL;
tagPtr->rMargin = INT_MIN;
tagPtr->rMarginColor = NULL;
tagPtr->selBorder = NULL;
tagPtr->selFgColor = NULL;
tagPtr->spacing1String = NULL;
tagPtr->spacing1 = 0;
tagPtr->spacing2String = NULL;
tagPtr->spacing2 = 0;
tagPtr->spacing3String = NULL;
tagPtr->spacing3 = 0;
tagPtr->spacing1Obj = NULL;
tagPtr->spacing1 = INT_MIN;
tagPtr->spacing2Obj = NULL;
tagPtr->spacing2 = INT_MIN;
tagPtr->spacing3Obj = NULL;
tagPtr->spacing3 = INT_MIN;
tagPtr->tabStringPtr = NULL;
tagPtr->tabArrayPtr = NULL;
tagPtr->tabStyle = TK_TEXT_TABSTYLE_NULL;
tagPtr->underlinePtr = NULL;
tagPtr->underline = -1;
tagPtr->underlineColor = NULL;
tagPtr->elidePtr = NULL;
tagPtr->elideObj = NULL;
tagPtr->elide = -1;
tagPtr->wrapMode = TEXT_WRAPMODE_NULL;
tagPtr->affectsDisplay = 0;
Expand Down
Loading

0 comments on commit 5b4bd50

Please sign in to comment.