diff options
author | gcramer <remarcg@gmx.net> | 2017-04-10 09:27:41 (GMT) |
---|---|---|
committer | gcramer <remarcg@gmx.net> | 2017-04-10 09:27:41 (GMT) |
commit | 0014b14ae7dec2285afce5b6cb46e192c040bb7d (patch) | |
tree | 9e64f7d82223f8ed38a4d0433dedf88094504c34 /generic/tkTextWind.c | |
parent | 4e1e8b9830719255ed940438bab104503bc5e03c (diff) | |
download | tk-0014b14ae7dec2285afce5b6cb46e192c040bb7d.zip tk-0014b14ae7dec2285afce5b6cb46e192c040bb7d.tar.gz tk-0014b14ae7dec2285afce5b6cb46e192c040bb7d.tar.bz2 |
(1) For symmetry reasons option -tags has also been added to embedded window support.
(2) Refactorization of functionality for the supprt of -tags.
(3) Option -tags has been added to the documentation.
Diffstat (limited to 'generic/tkTextWind.c')
-rw-r--r-- | generic/tkTextWind.c | 57 |
1 files changed, 52 insertions, 5 deletions
diff --git a/generic/tkTextWind.c b/generic/tkTextWind.c index a053e6a..3e1ea10 100644 --- a/generic/tkTextWind.c +++ b/generic/tkTextWind.c @@ -177,6 +177,8 @@ static const Tk_OptionSpec optionSpecs[] = { "0", -1, Tk_Offset(TkTextEmbWindow, padY), 0, 0, 0}, {TK_OPTION_BOOLEAN, "-stretch", NULL, NULL, "0", -1, Tk_Offset(TkTextEmbWindow, stretch), 0, 0, 0}, + {TK_OPTION_STRING, "-tags", NULL, NULL, + NULL, -1, -1, TK_OPTION_NULL_OK, 0, 0}, {TK_OPTION_WINDOW, "-window", NULL, NULL, NULL, -1, Tk_Offset(TkTextEmbWindow, tkwin), TK_OPTION_NULL_OK, 0, 0}, {TK_OPTION_END, NULL, NULL, NULL, NULL, 0, 0, 0, 0, 0} @@ -372,6 +374,23 @@ RedoLinkSegmentGetRange( *-------------------------------------------------------------- */ +static bool +MatchTagsOption( + const char *opt) +{ + static const char *pattern = "-tags"; + const char *p = pattern; + const char *start = opt; + + for ( ; *opt; ++p, ++opt) { + if (*p != *opt) { + return opt > start && *p == '\0'; + } + } + + return true; +} + int TkTextWindowCmd( TkText *textPtr, /* Information about text widget. */ @@ -433,12 +452,16 @@ TkTextWindowCmd( ewPtr->body.ew.tkwin = NULL; } - objPtr = Tk_GetOptionValue(interp, (char *) &ewPtr->body.ew, - ewPtr->body.ew.optionTable, objv[4], textPtr->tkwin); - if (!objPtr) { - return TCL_ERROR; + if (MatchTagsOption(Tcl_GetString(objv[4]))) { + TkTextFindTags(interp, textPtr, ewPtr, true); + } else { + objPtr = Tk_GetOptionValue(interp, (char *) &ewPtr->body.ew, + ewPtr->body.ew.optionTable, objv[4], textPtr->tkwin); + if (!objPtr) { + return TCL_ERROR; + } + Tcl_SetObjResult(interp, objPtr); } - Tcl_SetObjResult(interp, objPtr); return TCL_OK; } case WIND_CONFIGURE: { @@ -462,6 +485,8 @@ TkTextWindowCmd( if (objc <= 5) { TkTextEmbWindowClient *client; Tcl_Obj *objPtr; + Tcl_Obj **objs; + int objn = 0, i; /* * Copy over client specific value before querying. @@ -482,6 +507,21 @@ TkTextWindowCmd( if (!objPtr) { return TCL_ERROR; } + Tcl_ListObjGetElements(NULL, objPtr, &objn, &objs); + for (i = 0; i < objn; ++i) { + Tcl_Obj **objv; + int objc = 0; + + Tcl_ListObjGetElements(NULL, objs[i], &objc, &objv); + if (objc == 5 && strcmp(Tcl_GetString(objv[0]), "-tags") == 0) { + Tcl_Obj *valuePtr; + + /* { argvName, dbName, dbClass, defValue, current value } */ + TkTextFindTags(interp, textPtr, ewPtr, true); + valuePtr = Tcl_GetObjResult(interp); + Tcl_ListObjReplace(NULL, objs[i], 4, 1, 1, &valuePtr); + } + } Tcl_SetObjResult(interp, objPtr); return TCL_OK; } else { @@ -714,6 +754,7 @@ EmbWinConfigure( { Tk_Window oldWindow; TkTextEmbWindowClient *client; + int i; assert(textPtr); @@ -730,6 +771,12 @@ EmbWinConfigure( return TCL_ERROR; } + for (i = 0; i + 1 < objc; i += 2) { + if (MatchTagsOption(Tcl_GetString(objv[i]))) { + TkTextReplaceTags(textPtr, ewPtr, objv[i + 1]); + } + } + if (oldWindow != ewPtr->body.ew.tkwin && (!oldWindow || !IsPreservedWindow(client))) { if (oldWindow) { Tcl_HashEntry *hPtr; |