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

📄 tktextwind.c

📁 linux系统下的音频通信
💻 C
📖 第 1 页 / 共 3 页
字号:
/*  * tkTextWind.c -- * *	This file contains code that allows arbitrary windows to be *	nested inside text widgets.  It also implements the "window" *	widget command for texts. * * Copyright (c) 1994 The Regents of the University of California. * Copyright (c) 1994-1995 Sun Microsystems, Inc. * * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * * SCCS: @(#) tkTextWind.c 1.14 97/04/25 16:52:09 */#include "tk.h"#include "tkText.h"#include "tkPort.h"/* * The following structure is the official type record for the * embedded window geometry manager: */static void		EmbWinRequestProc _ANSI_ARGS_((ClientData clientData,			    Tk_Window tkwin));static void		EmbWinLostSlaveProc _ANSI_ARGS_((ClientData clientData,			    Tk_Window tkwin));static Tk_GeomMgr textGeomType = {    "text",			/* name */    EmbWinRequestProc,		/* requestProc */    EmbWinLostSlaveProc,	/* lostSlaveProc */};/* * Definitions for alignment values: */#define ALIGN_BOTTOM		0#define ALIGN_CENTER		1#define ALIGN_TOP		2#define ALIGN_BASELINE		3/* * Macro that determines the size of an embedded window segment: */#define EW_SEG_SIZE ((unsigned) (Tk_Offset(TkTextSegment, body) \	+ sizeof(TkTextEmbWindow)))/* * Prototypes for procedures defined in this file: */static int		AlignParseProc _ANSI_ARGS_((ClientData clientData,			    Tcl_Interp *interp, Tk_Window tkwin, char *value,			    char *widgRec, int offset));static char *		AlignPrintProc _ANSI_ARGS_((ClientData clientData,			    Tk_Window tkwin, char *widgRec, int offset,			    Tcl_FreeProc **freeProcPtr));static TkTextSegment *	EmbWinCleanupProc _ANSI_ARGS_((TkTextSegment *segPtr,			    TkTextLine *linePtr));static void		EmbWinCheckProc _ANSI_ARGS_((TkTextSegment *segPtr,			    TkTextLine *linePtr));static void		EmbWinBboxProc _ANSI_ARGS_((TkTextDispChunk *chunkPtr,			    int index, int y, int lineHeight, int baseline,			    int *xPtr, int *yPtr, int *widthPtr,			    int *heightPtr));static int		EmbWinConfigure _ANSI_ARGS_((TkText *textPtr,			    TkTextSegment *ewPtr, int argc, char **argv));static void		EmbWinDelayedUnmap _ANSI_ARGS_((			    ClientData clientData));static int		EmbWinDeleteProc _ANSI_ARGS_((TkTextSegment *segPtr,			    TkTextLine *linePtr, int treeGone));static void		EmbWinDisplayProc _ANSI_ARGS_((			    TkTextDispChunk *chunkPtr, int x, int y,			    int lineHeight, int baseline, Display *display,			    Drawable dst, int screenY));static int		EmbWinLayoutProc _ANSI_ARGS_((TkText *textPtr,			    TkTextIndex *indexPtr, TkTextSegment *segPtr,			    int offset, int maxX, int maxChars,			    int noCharsYet, Tk_Uid wrapMode,			    TkTextDispChunk *chunkPtr));static void		EmbWinStructureProc _ANSI_ARGS_((ClientData clientData,			    XEvent *eventPtr));static void		EmbWinUndisplayProc _ANSI_ARGS_((TkText *textPtr,			    TkTextDispChunk *chunkPtr));/* * The following structure declares the "embedded window" segment type. */static Tk_SegType tkTextEmbWindowType = {    "window",					/* name */    0,						/* leftGravity */    (Tk_SegSplitProc *) NULL,			/* splitProc */    EmbWinDeleteProc,				/* deleteProc */    EmbWinCleanupProc,				/* cleanupProc */    (Tk_SegLineChangeProc *) NULL,		/* lineChangeProc */    EmbWinLayoutProc,				/* layoutProc */    EmbWinCheckProc				/* checkProc */};/* * Information used for parsing window configuration options: */static Tk_CustomOption alignOption = {AlignParseProc, AlignPrintProc,	(ClientData) NULL};static Tk_ConfigSpec configSpecs[] = {    {TK_CONFIG_CUSTOM, "-align", (char *) NULL, (char *) NULL,	"center", 0, TK_CONFIG_DONT_SET_DEFAULT, &alignOption},    {TK_CONFIG_STRING, "-create", (char *) NULL, (char *) NULL,	(char *) NULL, Tk_Offset(TkTextEmbWindow, create),	TK_CONFIG_DONT_SET_DEFAULT|TK_CONFIG_NULL_OK},    {TK_CONFIG_INT, "-padx", (char *) NULL, (char *) NULL,	"0", Tk_Offset(TkTextEmbWindow, padX),	TK_CONFIG_DONT_SET_DEFAULT},    {TK_CONFIG_INT, "-pady", (char *) NULL, (char *) NULL,	"0", Tk_Offset(TkTextEmbWindow, padY),	TK_CONFIG_DONT_SET_DEFAULT},    {TK_CONFIG_BOOLEAN, "-stretch", (char *) NULL, (char *) NULL,	"0", Tk_Offset(TkTextEmbWindow, stretch),	TK_CONFIG_DONT_SET_DEFAULT},    {TK_CONFIG_WINDOW, "-window", (char *) NULL, (char *) NULL,	(char *) NULL, Tk_Offset(TkTextEmbWindow, tkwin),	TK_CONFIG_DONT_SET_DEFAULT|TK_CONFIG_NULL_OK},    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,	(char *) NULL, 0, 0}};/* *-------------------------------------------------------------- * * TkTextWindowCmd -- * *	This procedure implements the "window" widget command *	for text widgets.  See the user documentation for details *	on what it does. * * Results: *	A standard Tcl result or error. * * Side effects: *	See the user documentation. * *-------------------------------------------------------------- */intTkTextWindowCmd(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				 * parsed this command enough to know that				 * argv[1] is "window". */{    size_t length;    register TkTextSegment *ewPtr;    if (argc < 3) {	Tcl_AppendResult(interp, "wrong # args: should be \"",		argv[0], " window option ?arg arg ...?\"", (char *) NULL);	return TCL_ERROR;    }    length = strlen(argv[2]);    if ((strncmp(argv[2], "cget", length) == 0) && (length >= 2)) {	TkTextIndex index;	TkTextSegment *ewPtr;	if (argc != 5) {	    Tcl_AppendResult(interp, "wrong # args: should be \"",		    argv[0], " window cget index option\"",		    (char *) NULL);	    return TCL_ERROR;	}	if (TkTextGetIndex(interp, textPtr, argv[3], &index) != TCL_OK) {	    return TCL_ERROR;	}	ewPtr = TkTextIndexToSeg(&index, (int *) NULL);	if (ewPtr->typePtr != &tkTextEmbWindowType) {	    Tcl_AppendResult(interp, "no embedded window at index \"",		    argv[3], "\"", (char *) NULL);	    return TCL_ERROR;	}	return Tk_ConfigureValue(interp, textPtr->tkwin, configSpecs,		(char *) &ewPtr->body.ew, argv[4], 0);    } else if ((strncmp(argv[2], "configure", length) == 0) && (length >= 2)) {	TkTextIndex index;	TkTextSegment *ewPtr;	if (argc < 4) {	    Tcl_AppendResult(interp, "wrong # args: should be \"",		    argv[0], " window configure index ?option value ...?\"",		    (char *) NULL);	    return TCL_ERROR;	}	if (TkTextGetIndex(interp, textPtr, argv[3], &index) != TCL_OK) {	    return TCL_ERROR;	}	ewPtr = TkTextIndexToSeg(&index, (int *) NULL);	if (ewPtr->typePtr != &tkTextEmbWindowType) {	    Tcl_AppendResult(interp, "no embedded window at index \"",		    argv[3], "\"", (char *) NULL);	    return TCL_ERROR;	}	if (argc == 4) {	    return Tk_ConfigureInfo(interp, textPtr->tkwin, configSpecs,		    (char *) &ewPtr->body.ew, (char *) NULL, 0);	} else if (argc == 5) {	    return Tk_ConfigureInfo(interp, textPtr->tkwin, configSpecs,		    (char *) &ewPtr->body.ew, argv[4], 0);	} else {	    TkTextChanged(textPtr, &index, &index);	    return EmbWinConfigure(textPtr, ewPtr, argc-4, argv+4);	}    } else if ((strncmp(argv[2], "create", length) == 0) && (length >= 2)) {	TkTextIndex index;	int lineIndex;	/*	 * Add a new window.  Find where to put the new window, and	 * mark that position for redisplay.	 */	if (argc < 4) {	    Tcl_AppendResult(interp, "wrong # args: should be \"",		    argv[0], " window create index ?option value ...?\"",		    (char *) NULL);	    return TCL_ERROR;	}	if (TkTextGetIndex(interp, textPtr, argv[3], &index) != TCL_OK) {	    return TCL_ERROR;	}	/*	 * Don't allow insertions on the last (dummy) line of the text.	 */    	lineIndex = TkBTreeLineIndex(index.linePtr);	if (lineIndex == TkBTreeNumLines(textPtr->tree)) {	    lineIndex--;	    TkTextMakeIndex(textPtr->tree, lineIndex, 1000000, &index);	}	/*	 * Create the new window segment and initialize it.	 */	ewPtr = (TkTextSegment *) ckalloc(EW_SEG_SIZE);	ewPtr->typePtr = &tkTextEmbWindowType;	ewPtr->size = 1;	ewPtr->body.ew.textPtr = textPtr;	ewPtr->body.ew.linePtr = NULL;	ewPtr->body.ew.tkwin = NULL;	ewPtr->body.ew.create = NULL;	ewPtr->body.ew.align = ALIGN_CENTER;	ewPtr->body.ew.padX = ewPtr->body.ew.padY = 0;	ewPtr->body.ew.stretch = 0;	ewPtr->body.ew.chunkCount = 0;	ewPtr->body.ew.displayed = 0;	/*	 * Link the segment into the text widget, then configure it (delete	 * it again if the configuration fails).	 */	TkTextChanged(textPtr, &index, &index);	TkBTreeLinkSegment(ewPtr, &index);	if (EmbWinConfigure(textPtr, ewPtr, argc-4, argv+4) != TCL_OK) {	    TkTextIndex index2;	    TkTextIndexForwChars(&index, 1, &index2);	    TkBTreeDeleteChars(&index, &index2);	    return TCL_ERROR;	}    } else if (strncmp(argv[2], "names", length) == 0) {	Tcl_HashSearch search;	Tcl_HashEntry *hPtr;	if (argc != 3) {	    Tcl_AppendResult(interp, "wrong # args: should be \"",		    argv[0], " window names\"", (char *) NULL);	    return TCL_ERROR;	}	for (hPtr = Tcl_FirstHashEntry(&textPtr->windowTable, &search);		hPtr != NULL; hPtr = Tcl_NextHashEntry(&search)) {	    Tcl_AppendElement(interp,		    Tcl_GetHashKey(&textPtr->markTable, hPtr));	}    } else {	Tcl_AppendResult(interp, "bad window option \"", argv[2],		"\": must be cget, configure, create, or names",		(char *) NULL);	return TCL_ERROR;    }    return TCL_OK;}/* *-------------------------------------------------------------- * * EmbWinConfigure -- * *	This procedure is called to handle configuration options *	for an embedded window, using an argc/argv list. * * Results: *	The return value is a standard Tcl result.  If TCL_ERROR is *	returned, then interp->result contains an error message.. * * Side effects: *	Configuration information for the embedded window changes, *	such as alignment, stretching, or name of the embedded *	window. * *-------------------------------------------------------------- */static intEmbWinConfigure(textPtr, ewPtr, argc, argv)    TkText *textPtr;		/* Information about text widget that				 * contains embedded window. */    TkTextSegment *ewPtr;	/* Embedded window to be configured. */    int argc;			/* Number of strings in argv. */    char **argv;		/* Array of strings describing configuration				 * options. */{    Tk_Window oldWindow;    Tcl_HashEntry *hPtr;    int new;    oldWindow = ewPtr->body.ew.tkwin;    if (Tk_ConfigureWidget(textPtr->interp, textPtr->tkwin, configSpecs,	    argc, argv, (char *) &ewPtr->body.ew, TK_CONFIG_ARGV_ONLY)	    != TCL_OK) {	return TCL_ERROR;    }    if (oldWindow != ewPtr->body.ew.tkwin) {	if (oldWindow != NULL) {	    Tcl_DeleteHashEntry(Tcl_FindHashEntry(&textPtr->windowTable,		    Tk_PathName(oldWindow)));	    Tk_DeleteEventHandler(oldWindow, StructureNotifyMask,		    EmbWinStructureProc, (ClientData) ewPtr);	    Tk_ManageGeometry(oldWindow, (Tk_GeomMgr *) NULL,		    (ClientData) NULL);	    if (textPtr->tkwin != Tk_Parent(oldWindow)) {		Tk_UnmaintainGeometry(oldWindow, textPtr->tkwin);	    } else {		Tk_UnmapWindow(oldWindow);	    }	}	if (ewPtr->body.ew.tkwin != NULL) {	    Tk_Window ancestor, parent;	    /*	     * Make sure that the text is either the parent of the	     * embedded window or a descendant of that parent.  Also,	     * don't allow a top-level window to be managed inside	     * a text.	     */	    parent = Tk_Parent(ewPtr->body.ew.tkwin);	    for (ancestor = textPtr->tkwin; ;		    ancestor = Tk_Parent(ancestor)) {		if (ancestor == parent) {		    break;		}		if (Tk_IsTopLevel(ancestor)) {		    badMaster:		    Tcl_AppendResult(textPtr->interp, "can't embed ",			    Tk_PathName(ewPtr->body.ew.tkwin), " in ",			    Tk_PathName(textPtr->tkwin), (char *) NULL);		    ewPtr->body.ew.tkwin = NULL;		    return TCL_ERROR;		}	    }	    if (Tk_IsTopLevel(ewPtr->body.ew.tkwin)		    || (ewPtr->body.ew.tkwin == textPtr->tkwin)) {		goto badMaster;	    }	    /*	     * Take over geometry management for the window, plus create	     * an event handler to find out when it is deleted.	     */	    Tk_ManageGeometry(ewPtr->body.ew.tkwin, &textGeomType,		    (ClientData) ewPtr);

⌨️ 快捷键说明

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