summaryrefslogtreecommitdiff
path: root/tk/generic/tkTextTag.c
diff options
context:
space:
mode:
Diffstat (limited to 'tk/generic/tkTextTag.c')
-rw-r--r--tk/generic/tkTextTag.c58
1 files changed, 46 insertions, 12 deletions
diff --git a/tk/generic/tkTextTag.c b/tk/generic/tkTextTag.c
index f623b93026e..b35390c393c 100644
--- a/tk/generic/tkTextTag.c
+++ b/tk/generic/tkTextTag.c
@@ -76,7 +76,7 @@ static Tk_ConfigSpec tagConfigSpecs[] = {
static void ChangeTagPriority _ANSI_ARGS_((TkText *textPtr,
TkTextTag *tagPtr, int prio));
static TkTextTag * FindTag _ANSI_ARGS_((Tcl_Interp *interp,
- TkText *textPtr, char *tagName));
+ TkText *textPtr, CONST char *tagName));
static void SortTags _ANSI_ARGS_((int numTags,
TkTextTag **tagArrayPtr));
static int TagSortProc _ANSI_ARGS_((CONST VOID *first,
@@ -105,7 +105,7 @@ TkTextTagCmd(textPtr, interp, argc, argv)
register TkText *textPtr; /* Information about text widget. */
Tcl_Interp *interp; /* Current interpreter. */
int argc; /* Number of arguments. */
- char **argv; /* Argument strings. Someone else has already
+ CONST char **argv; /* Argument strings. Someone else has already
* parsed this command enough to know that
* argv[1] is "tag". */
{
@@ -151,7 +151,7 @@ TkTextTagCmd(textPtr, interp, argc, argv)
index2 = index1;
TkTextIndexForwChars(&index2, 1, &index2);
}
-
+
if (tagPtr->affectsDisplay) {
TkTextRedrawTag(textPtr, &index1, &index2, tagPtr, !addTag);
} else {
@@ -159,18 +159,34 @@ TkTextTagCmd(textPtr, interp, argc, argv)
* Still need to trigger enter/leave events on tags that
* have changed.
*/
-
+
TkTextEventuallyRepick(textPtr);
}
TkBTreeTag(&index1, &index2, tagPtr, addTag);
-
+
/*
* If the tag is "sel" then grab the selection if we're supposed
* to export it and don't already have it. Also, invalidate
* partially-completed selection retrievals.
*/
-
+
if (tagPtr == textPtr->selTagPtr) {
+ XEvent event;
+ /*
+ * Send an event that the selection changed.
+ * This is equivalent to
+ * "event generate $textWidget <<Selection>>"
+ */
+
+ memset((VOID *) &event, 0, sizeof(event));
+ event.xany.type = VirtualEvent;
+ event.xany.serial = NextRequest(Tk_Display(textPtr->tkwin));
+ event.xany.send_event = False;
+ event.xany.window = Tk_WindowId(textPtr->tkwin);
+ event.xany.display = Tk_Display(textPtr->tkwin);
+ ((XVirtualEvent *) &event)->name = Tk_GetUid("Selection");
+ Tk_HandleEvent(&event);
+
if (addTag && textPtr->exportSelection
&& !(textPtr->flags & GOT_SELECTION)) {
Tk_OwnSelection(textPtr->tkwin, XA_PRIMARY,
@@ -229,12 +245,12 @@ TkTextTagCmd(textPtr, interp, argc, argv)
return TCL_ERROR;
}
} else if (argc == 5) {
- char *command;
+ CONST char *command;
command = Tk_GetBinding(interp, textPtr->bindingTable,
(ClientData) tagPtr, argv[4]);
if (command == NULL) {
- char *string = Tcl_GetStringResult(interp);
+ CONST char *string = Tcl_GetStringResult(interp);
/*
* Ignore missing binding errors. This is a special hack
@@ -248,7 +264,7 @@ TkTextTagCmd(textPtr, interp, argc, argv)
Tcl_ResetResult(interp);
}
} else {
- Tcl_SetResult(interp, command, TCL_STATIC);
+ Tcl_SetResult(interp, (char *) command, TCL_STATIC);
}
} else {
Tk_GetAllBindings(interp, textPtr->bindingTable,
@@ -462,6 +478,25 @@ TkTextTagCmd(textPtr, interp, argc, argv)
TkTextMakeByteIndex(textPtr->tree, TkBTreeNumLines(textPtr->tree),
0, &last),
TkBTreeTag(&first, &last, tagPtr, 0);
+
+ if (tagPtr == textPtr->selTagPtr) {
+ XEvent event;
+ /*
+ * Send an event that the selection changed.
+ * This is equivalent to
+ * "event generate $textWidget <<Selection>>"
+ */
+
+ memset((VOID *) &event, 0, sizeof(event));
+ event.xany.type = VirtualEvent;
+ event.xany.serial = NextRequest(Tk_Display(textPtr->tkwin));
+ event.xany.send_event = False;
+ event.xany.window = Tk_WindowId(textPtr->tkwin);
+ event.xany.display = Tk_Display(textPtr->tkwin);
+ ((XVirtualEvent *) &event)->name = Tk_GetUid("Selection");
+ Tk_HandleEvent(&event);
+ }
+
Tcl_DeleteHashEntry(hPtr);
if (textPtr->bindingTable != NULL) {
Tk_DeleteAllBindings(textPtr->bindingTable,
@@ -769,7 +804,7 @@ TkTextTagCmd(textPtr, interp, argc, argv)
TkTextTag *
TkTextCreateTag(textPtr, tagName)
TkText *textPtr; /* Widget in which tag is being used. */
- char *tagName; /* Name of desired tag. */
+ CONST char *tagName; /* Name of desired tag. */
{
register TkTextTag *tagPtr;
Tcl_HashEntry *hPtr;
@@ -855,7 +890,7 @@ FindTag(interp, textPtr, tagName)
* if NULL, then don't record an error
* message. */
TkText *textPtr; /* Widget in which tag is being used. */
- char *tagName; /* Name of desired tag. */
+ CONST char *tagName; /* Name of desired tag. */
{
Tcl_HashEntry *hPtr;
@@ -1386,4 +1421,3 @@ TkTextPickCurrent(textPtr, eventPtr)
ckfree((char *) copyArrayPtr);
}
}
-