summaryrefslogtreecommitdiffstats
path: root/generic/tkText.c
diff options
context:
space:
mode:
authorfvogel <fvogelnew1@free.fr>2015-12-26 20:52:21 (GMT)
committerfvogel <fvogelnew1@free.fr>2015-12-26 20:52:21 (GMT)
commit7fba872bef36903476be033836a8394fd742a1c0 (patch)
tree55c638085f078ac4c8f49ae14404e2b35df10162 /generic/tkText.c
parent60480c3f5dfc5ab6e13b6e55a310e3b991879eac (diff)
downloadtk-7fba872bef36903476be033836a8394fd742a1c0.zip
tk-7fba872bef36903476be033836a8394fd742a1c0.tar.gz
tk-7fba872bef36903476be033836a8394fd742a1c0.tar.bz2
[.text sync -command $cmd] schedules execution of $cmd by the event loop at idle time
Diffstat (limited to 'generic/tkText.c')
-rw-r--r--generic/tkText.c51
1 files changed, 49 insertions, 2 deletions
diff --git a/generic/tkText.c b/generic/tkText.c
index a2b7dde..0cb8431 100644
--- a/generic/tkText.c
+++ b/generic/tkText.c
@@ -397,6 +397,7 @@ static int TextSearchIndexInLine(const SearchSpec *searchSpecPtr,
static int TextPeerCmd(TkText *textPtr, Tcl_Interp *interp,
int objc, Tcl_Obj *const objv[]);
static TkUndoProc TextUndoRedoCallback;
+static void RunAfterSyncCmd(ClientData clientData);
/*
* Declarations of the three search procs required by the multi-line search
@@ -1512,8 +1513,8 @@ TextWidgetObjCmd(
}
textPtr->afterSyncCmd = cmd;
} else {
- result = Tcl_EvalObjEx(interp, cmd, TCL_EVAL_GLOBAL);
- Tcl_DecrRefCount(cmd);
+ textPtr->afterSyncCmd = cmd;
+ Tcl_DoWhenIdle(RunAfterSyncCmd, (ClientData) textPtr);
}
break;
} else if (objc != 2) {
@@ -6747,6 +6748,52 @@ TkpTesttextCmd(
}
/*
+ *----------------------------------------------------------------------
+ *
+ * RunAfterSyncCmd --
+ *
+ * This function is called by the event loop and excutes the command
+ * scheduled by [.text sync -command $cmd].
+ *
+ * Results:
+ * None.
+ *
+ * Side effects:
+ * Anything may happen, depending on $cmd contents.
+ *
+ *----------------------------------------------------------------------
+ */
+
+static void
+RunAfterSyncCmd(
+ ClientData clientData) /* Information about text widget. */
+{
+ register TkText *textPtr = (TkText *) clientData;
+ int code;
+
+ if ((textPtr->tkwin == NULL) || (textPtr->flags & DESTROYED)) {
+ /*
+ * The widget has been deleted. Don't do anything.
+ */
+
+ if (--textPtr->refCount == 0) {
+ ckfree((char *) textPtr);
+ }
+ return;
+ }
+
+ Tcl_Preserve((ClientData) textPtr->interp);
+ code = Tcl_EvalObjEx(textPtr->interp, textPtr->afterSyncCmd, TCL_EVAL_GLOBAL);
+ if (code == TCL_ERROR) {
+ Tcl_AddErrorInfo(textPtr->interp, "\n (text sync)");
+ Tcl_BackgroundError(textPtr->interp);
+ }
+ Tcl_Release((ClientData) textPtr->interp);
+ Tcl_DecrRefCount(textPtr->afterSyncCmd);
+ textPtr->afterSyncCmd = NULL;
+}
+
+/*
* Local Variables:
* mode: c
* c-basic-offset: 4