⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tktext.c

📁 linux系统下的音频通信
💻 C
📖 第 1 页 / 共 5 页
字号:
	    || (textPtr->selTagPtr->lMargin2String != NULL)	    || (textPtr->selTagPtr->offsetString != NULL)	    || (textPtr->selTagPtr->overstrikeString != NULL)	    || (textPtr->selTagPtr->rMarginString != NULL)	    || (textPtr->selTagPtr->spacing1String != NULL)	    || (textPtr->selTagPtr->spacing2String != NULL)	    || (textPtr->selTagPtr->spacing3String != NULL)	    || (textPtr->selTagPtr->tabString != NULL)	    || (textPtr->selTagPtr->underlineString != NULL)	    || (textPtr->selTagPtr->wrapMode != NULL)) {	textPtr->selTagPtr->affectsDisplay = 1;    }    TkTextRedrawTag(textPtr, (TkTextIndex *) NULL, (TkTextIndex *) NULL,	    textPtr->selTagPtr, 1);    /*     * Claim the selection if we've suddenly started exporting it and there     * are tagged characters.     */    if (textPtr->exportSelection && (!oldExport)) {	TkTextSearch search;	TkTextIndex first, last;	TkTextMakeIndex(textPtr->tree, 0, 0, &first);	TkTextMakeIndex(textPtr->tree,		TkBTreeNumLines(textPtr->tree), 0, &last);	TkBTreeStartSearch(&first, &last, textPtr->selTagPtr, &search);	if (TkBTreeCharTagged(&first, textPtr->selTagPtr)		|| TkBTreeNextTag(&search)) {	    Tk_OwnSelection(textPtr->tkwin, XA_PRIMARY, TkTextLostSelection,		    (ClientData) textPtr);	    textPtr->flags |= GOT_SELECTION;	}    }    /*     * Register the desired geometry for the window, and arrange for     * the window to be redisplayed.     */    if (textPtr->width <= 0) {	textPtr->width = 1;    }    if (textPtr->height <= 0) {	textPtr->height = 1;    }    TextWorldChanged((ClientData) textPtr);    return TCL_OK;}/* *--------------------------------------------------------------------------- * * TextWorldChanged -- * *      This procedure is called when the world has changed in some *      way and the widget needs to recompute all its graphics contexts *	and determine its new geometry. * * Results: *      None. * * Side effects: *	Configures all tags in the Text with a empty argc/argv, for *	the side effect of causing all the items to recompute their *	geometry and to be redisplayed. * *--------------------------------------------------------------------------- */ static voidTextWorldChanged(instanceData)    ClientData instanceData;	/* Information about widget. */{    TkText *textPtr;    Tk_FontMetrics fm;    textPtr = (TkText *) instanceData;    textPtr->charWidth = Tk_TextWidth(textPtr->tkfont, "0", 1);    if (textPtr->charWidth <= 0) {	textPtr->charWidth = 1;    }    Tk_GetFontMetrics(textPtr->tkfont, &fm);    Tk_GeometryRequest(textPtr->tkwin,	    textPtr->width * textPtr->charWidth + 2*textPtr->borderWidth		    + 2*textPtr->padX + 2*textPtr->highlightWidth,	    textPtr->height * (fm.linespace + textPtr->spacing1		    + textPtr->spacing3) + 2*textPtr->borderWidth		    + 2*textPtr->padY + 2*textPtr->highlightWidth);    Tk_SetInternalBorder(textPtr->tkwin,	    textPtr->borderWidth + textPtr->highlightWidth);    if (textPtr->setGrid) {	Tk_SetGrid(textPtr->tkwin, textPtr->width, textPtr->height,		textPtr->charWidth, fm.linespace);    } else {	Tk_UnsetGrid(textPtr->tkwin);    }    TkTextRelayoutWindow(textPtr);}/* *-------------------------------------------------------------- * * TextEventProc -- * *	This procedure is invoked by the Tk dispatcher on *	structure changes to a text.  For texts with 3D *	borders, this procedure is also invoked for exposures. * * Results: *	None. * * Side effects: *	When the window gets deleted, internal structures get *	cleaned up.  When it gets exposed, it is redisplayed. * *-------------------------------------------------------------- */static voidTextEventProc(clientData, eventPtr)    ClientData clientData;	/* Information about window. */    register XEvent *eventPtr;	/* Information about event. */{    register TkText *textPtr = (TkText *) clientData;    TkTextIndex index, index2;    if (eventPtr->type == Expose) {	TkTextRedrawRegion(textPtr, eventPtr->xexpose.x,		eventPtr->xexpose.y, eventPtr->xexpose.width,		eventPtr->xexpose.height);    } else if (eventPtr->type == ConfigureNotify) {	if ((textPtr->prevWidth != Tk_Width(textPtr->tkwin))		|| (textPtr->prevHeight != Tk_Height(textPtr->tkwin))) {	    TkTextRelayoutWindow(textPtr);	    textPtr->prevWidth = Tk_Width(textPtr->tkwin);	    textPtr->prevHeight = Tk_Height(textPtr->tkwin);	}    } else if (eventPtr->type == DestroyNotify) {	if (textPtr->tkwin != NULL) {	    if (textPtr->setGrid) {		Tk_UnsetGrid(textPtr->tkwin);	    }	    textPtr->tkwin = NULL;	    Tcl_DeleteCommandFromToken(textPtr->interp,		    textPtr->widgetCmd);	}	Tcl_EventuallyFree((ClientData) textPtr, DestroyText);    } else if ((eventPtr->type == FocusIn) || (eventPtr->type == FocusOut)) {	if (eventPtr->xfocus.detail != NotifyInferior) {	    Tcl_DeleteTimerHandler(textPtr->insertBlinkHandler);	    if (eventPtr->type == FocusIn) {		textPtr->flags |= GOT_FOCUS | INSERT_ON;		if (textPtr->insertOffTime != 0) {		    textPtr->insertBlinkHandler = Tcl_CreateTimerHandler(			    textPtr->insertOnTime, TextBlinkProc,			    (ClientData) textPtr);		}	    } else {		textPtr->flags &= ~(GOT_FOCUS | INSERT_ON);		textPtr->insertBlinkHandler = (Tcl_TimerToken) NULL;	    }#ifndef ALWAYS_SHOW_SELECTION	    TkTextRedrawTag(textPtr, NULL, NULL, textPtr->selTagPtr, 1);#endif	    TkTextMarkSegToIndex(textPtr, textPtr->insertMarkPtr, &index);	    TkTextIndexForwChars(&index, 1, &index2);	    TkTextChanged(textPtr, &index, &index2);	    if (textPtr->highlightWidth > 0) {		TkTextRedrawRegion(textPtr, 0, 0, textPtr->highlightWidth,			textPtr->highlightWidth);	    }	}    }}/* *---------------------------------------------------------------------- * * TextCmdDeletedProc -- * *	This procedure is invoked when a widget command is deleted.  If *	the widget isn't already in the process of being destroyed, *	this command destroys it. * * Results: *	None. * * Side effects: *	The widget is destroyed. * *---------------------------------------------------------------------- */static voidTextCmdDeletedProc(clientData)    ClientData clientData;	/* Pointer to widget record for widget. */{    TkText *textPtr = (TkText *) clientData;    Tk_Window tkwin = textPtr->tkwin;    /*     * This procedure could be invoked either because the window was     * destroyed and the command was then deleted (in which case tkwin     * is NULL) or because the command was deleted, and then this procedure     * destroys the widget.     */    if (tkwin != NULL) {	if (textPtr->setGrid) {	    Tk_UnsetGrid(textPtr->tkwin);	}	textPtr->tkwin = NULL;	Tk_DestroyWindow(tkwin);    }}/* *---------------------------------------------------------------------- * * InsertChars -- * *	This procedure implements most of the functionality of the *	"insert" widget command. * * Results: *	None. * * Side effects: *	The characters in "string" get added to the text just before *	the character indicated by "indexPtr". * *---------------------------------------------------------------------- */static voidInsertChars(textPtr, indexPtr, string)    TkText *textPtr;		/* Overall information about text widget. */    TkTextIndex *indexPtr;	/* Where to insert new characters.  May be				 * modified and/or invalidated. */    char *string;		/* Null-terminated string containing new				 * information to add to text. */{    int lineIndex, resetView, offset;    TkTextIndex newTop;    /*     * Don't allow insertions on the last (dummy) line of the text.     */    lineIndex = TkBTreeLineIndex(indexPtr->linePtr);    if (lineIndex == TkBTreeNumLines(textPtr->tree)) {	lineIndex--;	TkTextMakeIndex(textPtr->tree, lineIndex, 1000000, indexPtr);    }    /*     * Notify the display module that lines are about to change, then do     * the insertion.  If the insertion occurs on the top line of the     * widget (textPtr->topIndex), then we have to recompute topIndex     * after the insertion, since the insertion could invalidate it.     */    resetView = offset = 0;    if (indexPtr->linePtr == textPtr->topIndex.linePtr) {	resetView = 1;	offset = textPtr->topIndex.charIndex;	if (offset > indexPtr->charIndex) {	    offset += strlen(string);	}    }    TkTextChanged(textPtr, indexPtr, indexPtr);    TkBTreeInsertChars(indexPtr, string);    if (resetView) {	TkTextMakeIndex(textPtr->tree, lineIndex, 0, &newTop);	TkTextIndexForwChars(&newTop, offset, &newTop);	TkTextSetYView(textPtr, &newTop, 0);    }    /*     * Invalidate any selection retrievals in progress.     */    textPtr->abortSelections = 1;}/* *---------------------------------------------------------------------- * * DeleteChars -- * *	This procedure implements most of the functionality of the *	"delete" widget command. * * Results: *	Returns a standard Tcl result, and leaves an error message *	in textPtr->interp if there is an error. * * Side effects: *	Characters get deleted from the text. * *---------------------------------------------------------------------- */static intDeleteChars(textPtr, index1String, index2String)    TkText *textPtr;		/* Overall information about text widget. */    char *index1String;		/* String describing location of first				 * character to delete. */    char *index2String;		/* String describing location of last				 * character to delete.  NULL means just				 * delete the one character given by				 * index1String. */{    int line1, line2, line, charIndex, resetView;    TkTextIndex index1, index2;    /*     * Parse the starting and stopping indices.     */    if (TkTextGetIndex(textPtr->interp, textPtr, index1String, &index1)	    != TCL_OK) {	return TCL_ERROR;    }    if (index2String != NULL) {	if (TkTextGetIndex(textPtr->interp, textPtr, index2String, &index2)		!= TCL_OK) {	    return TCL_ERROR;	}    } else {	index2 = index1;	TkTextIndexForwChars(&index2, 1, &index2);    }    /*     * Make sure there's really something to delete.     */    if (TkTextIndexCmp(&index1, &index2) >= 0) {	return TCL_OK;    }    /*     * The code below is ugly, but it's needed to make sure there     * is always a dummy empty line at the end of the text.  If the     * final newline of the file (just before the dummy line) is being     * deleted, then back up index to just before the newline.  If     * there is a newline just before the first character being deleted,     * then back up the first index too, so that an even number of lines     * gets deleted.  Furthermore, remove any tags that are present on     * the newline that isn't going to be deleted after all (this simulates     * deleting the newline and then adding a "clean" one back again).     */    line1 = TkBTreeLineIndex(index1.linePtr);    line2 = TkBTreeLineIndex(index2.linePtr);    if (line2 == TkBTreeNumLines(textPtr->tree)) {	TkTextTag **arrayPtr;	int arraySize, i;	TkTextIndex oldIndex2;	oldIndex2 = index2;	TkTextIndexBackChars(&oldIndex2, 1, &index2);	line2--;	if ((index1.charIndex == 0) && (line1 != 0)) {	    TkTextIndexBackChars(&index1, 1, &index1);	    line1--;	}	arrayPtr = TkBTreeGetTags(&index2, &arraySize);	if (arrayPtr != NULL) {	    for (i = 0; i < arraySize; i++) {		TkBTreeTag(&index2, &oldIndex2, arrayPtr[i], 0);	    }	    ckfree((char *) arrayPtr);	}    }    /*     * Tell the display what's about to happen so it can discard     * obsolete display information, then do the deletion.  Also,     * if the deletion involves the top line on the screen, then     * we have to reset the view (the deletion will invalidate     * textPtr->topIndex).  Compute what the new first character     * will be, then do the deletion, then reset the view.     */    TkTextChanged(textPtr, &index1, &index2);    resetView = line = charIndex = 0;    if (TkTextIndexCmp(&index2, &textPtr->topIndex) >= 0) {	if (TkTextIndexCmp(&index1, &textPtr->topIndex) <= 0) {	    /*	     * Deletion range straddles topIndex: use the beginning	     * of the range as the new topIndex.	     */	    resetView = 1;	    line = line1;	    charIndex = index1.charIndex;	} else if (index1.linePtr == textPtr->topIndex.linePtr) {	    /*	     * Deletion range starts on top line but after topIndex.	     * Use the current topIndex as the new one.	     */	    resetView = 1;	    line = line1;	    charIndex = textPtr->topIndex.charIndex;	}    } else if (index2.linePtr == textPtr->topIndex.linePtr) {	/*	 * Deletion range ends on top line but before topIndex.	 * Figure out what will be the new character index for	 * the character currently pointed to by topIndex.	 */	resetView = 1;	line = line2;	charIndex = textPtr->topIndex.charIndex;	if (index1.linePtr != index2.linePtr) {	    charIndex -= index2.charIndex;	} else {	    charIndex -= (index2.charIndex - index1.charIndex);	}    }    TkBTreeDeleteChars(&index1, &index2);    if (resetView) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -