summaryrefslogtreecommitdiffstats
path: root/generic/tkTextDisp.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tkTextDisp.c')
-rw-r--r--generic/tkTextDisp.c64
1 files changed, 41 insertions, 23 deletions
diff --git a/generic/tkTextDisp.c b/generic/tkTextDisp.c
index a275b28..ff90520 100644
--- a/generic/tkTextDisp.c
+++ b/generic/tkTextDisp.c
@@ -590,8 +590,7 @@ static int TextGetScrollInfoObj(Tcl_Interp *interp,
Tcl_Obj *CONST objv[], double *dblPtr,
int *intPtr);
static void AsyncUpdateLineMetrics(ClientData clientData);
-static void GenerateMetricsEvent(TkText *textPtr,
- CONST char *eventname);
+static void GenerateTextLineHeightsInvalidEvent(TkText *textPtr);
static void AsyncUpdateYScrollbar(ClientData clientData);
static int IsStartOfNotMergedLine(TkText *textPtr,
CONST TkTextIndex *indexPtr);
@@ -2922,6 +2921,8 @@ AsyncUpdateLineMetrics(
lineNum = TkTextUpdateLineMetrics(textPtr, lineNum,
dInfoPtr->lastMetricUpdateLine, 256);
+ dInfoPtr->currentMetricUpdateLine = lineNum;
+
if (tkTextDebug) {
char buffer[2 * TCL_INTEGER_SPACE + 1];
@@ -2929,6 +2930,8 @@ AsyncUpdateLineMetrics(
LOG("tk_textInvalidateLine", buffer);
}
+ GenerateTextLineHeightsInvalidEvent(textPtr);
+
/*
* If we're not in the middle of a long-line calculation (metricEpoch==-1)
* and we've reached the last line, then we're done.
@@ -2946,10 +2949,8 @@ AsyncUpdateLineMetrics(
if (textPtr->refCount == 0) {
ckfree((char *) textPtr);
}
- GenerateMetricsEvent(textPtr, "MetricsDone");
return;
}
- dInfoPtr->currentMetricUpdateLine = lineNum;
/*
* Re-arm the timer. We already have a refCount on the text widget so no
@@ -2963,45 +2964,37 @@ AsyncUpdateLineMetrics(
/*
*----------------------------------------------------------------------
*
- * GenerateMetricsEvent --
+ * GenerateTextLineHeightsInvalidEvent --
*
- * Send an event related to the text widget metrics asynchronous update
- * Two events are used:
- * - <<MetricsOutdated>>: the asynchronous update of line metrics is
- * currently running
- * - <<MetricsDone>> : the asynchronous update of line metrics is
- * over
+ * Send the <<TextLineHeightsInvalid>> event related to the text widget
+ * line metrics asynchronous update.
* This is equivalent to:
- * event generate $textWidget <<MetricsOutdated>>
- * or
- * event generate $textWidget <<MetricsDone>>
+ * event generate $textWidget <<TextLineHeightsInvalid>> -detail $N
+ * where $N is the number of lines for which the height is outdated.
*
* Results:
* None
*
* Side effects:
- * May force the text window into existence.
* If corresponding bindings are present, they will trigger.
*
*----------------------------------------------------------------------
*/
static void
-GenerateMetricsEvent(
- TkText *textPtr, /* Information about text widget. */
- CONST char *eventname) /* Name of the virtual event to send. */
+GenerateTextLineHeightsInvalidEvent(
+ TkText *textPtr) /* Information about text widget. */
{
union {XEvent general; XVirtualEvent virtual;} event;
- Tk_MakeWindowExist(textPtr->tkwin);
-
memset(&event, 0, sizeof(event));
event.general.xany.type = VirtualEvent;
event.general.xany.serial = NextRequest(Tk_Display(textPtr->tkwin));
event.general.xany.send_event = False;
event.general.xany.window = Tk_WindowId(textPtr->tkwin);
event.general.xany.display = Tk_Display(textPtr->tkwin);
- event.virtual.name = Tk_GetUid(eventname);
+ event.virtual.name = Tk_GetUid("TextLineHeightsInvalid");
+ event.virtual.user_data = Tcl_NewIntObj(TkTextPendingyupdate(textPtr));
Tk_HandleEvent(&event.general);
}
@@ -3384,7 +3377,6 @@ TextInvalidateLineMetrics(
textPtr->refCount++;
dInfoPtr->lineUpdateTimer = Tcl_CreateTimerHandler(1,
AsyncUpdateLineMetrics, (ClientData) textPtr);
- GenerateMetricsEvent(textPtr, "MetricsOutdated");
}
}
@@ -5089,7 +5081,6 @@ TkTextRelayoutWindow(
textPtr->refCount++;
dInfoPtr->lineUpdateTimer = Tcl_CreateTimerHandler(1,
AsyncUpdateLineMetrics, (ClientData) textPtr);
- GenerateMetricsEvent(textPtr, "MetricsOutdated");
}
}
}
@@ -6084,6 +6075,33 @@ TkTextYviewCmd(
/*
*--------------------------------------------------------------
*
+ * TkTextPendingyupdate --
+ *
+ * This function computes how many lines are not up-to-date regarding
+ * asynchronous height calculations.
+ *
+ * Results:
+ * Returns a positive integer corresponding to the number of lines for
+ * which the height is outdated.
+ *
+ * Side effects:
+ * None.
+ *
+ *--------------------------------------------------------------
+ */
+
+int
+TkTextPendingyupdate(
+ TkText *textPtr) /* Information about text widget. */
+{
+ TextDInfo *dInfoPtr = textPtr->dInfoPtr;
+
+ return (dInfoPtr->lastMetricUpdateLine - dInfoPtr->currentMetricUpdateLine);
+}
+
+/*
+ *--------------------------------------------------------------
+ *
* TkTextScanCmd --
*
* This function is invoked to process the "scan" option for the widget