diff options
Diffstat (limited to 'generic/tkTextDisp.c')
-rw-r--r-- | generic/tkTextDisp.c | 64 |
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 |