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

📄 tkconfig.c

📁 linux系统下的音频通信
💻 C
📖 第 1 页 / 共 2 页
字号:
/*  * tkConfig.c -- * *	This file contains the Tk_ConfigureWidget procedure. * * Copyright (c) 1990-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: @(#) tkConfig.c 1.53 96/04/26 10:29:31 */#include "tkPort.h"#include "tk.h"/* * Values for "flags" field of Tk_ConfigSpec structures.  Be sure * to coordinate these values with those defined in tk.h * (TK_CONFIG_COLOR_ONLY, etc.).  There must not be overlap! * * INIT -		Non-zero means (char *) things have been *			converted to Tk_Uid's. */#define INIT		0x20/* * Forward declarations for procedures defined later in this file: */static int		DoConfig _ANSI_ARGS_((Tcl_Interp *interp,			    Tk_Window tkwin, Tk_ConfigSpec *specPtr,			    Tk_Uid value, int valueIsUid, char *widgRec));static Tk_ConfigSpec *	FindConfigSpec _ANSI_ARGS_((Tcl_Interp *interp,			    Tk_ConfigSpec *specs, char *argvName,			    int needFlags, int hateFlags));static char *		FormatConfigInfo _ANSI_ARGS_((Tcl_Interp *interp,			    Tk_Window tkwin, Tk_ConfigSpec *specPtr,			    char *widgRec));static char *		FormatConfigValue _ANSI_ARGS_((Tcl_Interp *interp,			    Tk_Window tkwin, Tk_ConfigSpec *specPtr,			    char *widgRec, char *buffer,			    Tcl_FreeProc **freeProcPtr));/* *-------------------------------------------------------------- * * Tk_ConfigureWidget -- * *	Process command-line options and database options to *	fill in fields of a widget record with resources and *	other parameters. * * Results: *	A standard Tcl return value.  In case of an error, *	interp->result will hold an error message. * * Side effects: *	The fields of widgRec get filled in with information *	from argc/argv and the option database.  Old information *	in widgRec's fields gets recycled. * *-------------------------------------------------------------- */intTk_ConfigureWidget(interp, tkwin, specs, argc, argv, widgRec, flags)    Tcl_Interp *interp;		/* Interpreter for error reporting. */    Tk_Window tkwin;		/* Window containing widget (needed to				 * set up X resources). */    Tk_ConfigSpec *specs;	/* Describes legal options. */    int argc;			/* Number of elements in argv. */    char **argv;		/* Command-line options. */    char *widgRec;		/* Record whose fields are to be				 * modified.  Values must be properly				 * initialized. */    int flags;			/* Used to specify additional flags				 * that must be present in config specs				 * for them to be considered.  Also,				 * may have TK_CONFIG_ARGV_ONLY set. */{    register Tk_ConfigSpec *specPtr;    Tk_Uid value;		/* Value of option from database. */    int needFlags;		/* Specs must contain this set of flags				 * or else they are not considered. */    int hateFlags;		/* If a spec contains any bits here, it's				 * not considered. */    needFlags = flags & ~(TK_CONFIG_USER_BIT - 1);    if (Tk_Depth(tkwin) <= 1) {	hateFlags = TK_CONFIG_COLOR_ONLY;    } else {	hateFlags = TK_CONFIG_MONO_ONLY;    }    /*     * Pass one:  scan through all the option specs, replacing strings     * with Tk_Uids (if this hasn't been done already) and clearing     * the TK_CONFIG_OPTION_SPECIFIED flags.     */    for (specPtr = specs; specPtr->type != TK_CONFIG_END; specPtr++) {	if (!(specPtr->specFlags & INIT) && (specPtr->argvName != NULL)) {	    if (specPtr->dbName != NULL) {		specPtr->dbName = Tk_GetUid(specPtr->dbName);	    }	    if (specPtr->dbClass != NULL) {		specPtr->dbClass = Tk_GetUid(specPtr->dbClass);	    }	    if (specPtr->defValue != NULL) {		specPtr->defValue = Tk_GetUid(specPtr->defValue);	    }	}	specPtr->specFlags = (specPtr->specFlags & ~TK_CONFIG_OPTION_SPECIFIED)		| INIT;    }    /*     * Pass two:  scan through all of the arguments, processing those     * that match entries in the specs.     */    for ( ; argc > 0; argc -= 2, argv += 2) {	specPtr = FindConfigSpec(interp, specs, *argv, needFlags, hateFlags);	if (specPtr == NULL) {	    return TCL_ERROR;	}	/*	 * Process the entry.	 */	if (argc < 2) {	    Tcl_AppendResult(interp, "value for \"", *argv,		    "\" missing", (char *) NULL);	    return TCL_ERROR;	}	if (DoConfig(interp, tkwin, specPtr, argv[1], 0, widgRec) != TCL_OK) {	    char msg[100];	    sprintf(msg, "\n    (processing \"%.40s\" option)",		    specPtr->argvName);	    Tcl_AddErrorInfo(interp, msg);	    return TCL_ERROR;	}	specPtr->specFlags |= TK_CONFIG_OPTION_SPECIFIED;    }    /*     * Pass three:  scan through all of the specs again;  if no     * command-line argument matched a spec, then check for info     * in the option database.  If there was nothing in the     * database, then use the default.     */    if (!(flags & TK_CONFIG_ARGV_ONLY)) {	for (specPtr = specs; specPtr->type != TK_CONFIG_END; specPtr++) {	    if ((specPtr->specFlags & TK_CONFIG_OPTION_SPECIFIED)		    || (specPtr->argvName == NULL)		    || (specPtr->type == TK_CONFIG_SYNONYM)) {		continue;	    }	    if (((specPtr->specFlags & needFlags) != needFlags)		    || (specPtr->specFlags & hateFlags)) {		continue;	    }	    value = NULL;	    if (specPtr->dbName != NULL) {		value = Tk_GetOption(tkwin, specPtr->dbName, specPtr->dbClass);	    }	    if (value != NULL) {		if (DoConfig(interp, tkwin, specPtr, value, 1, widgRec) !=			TCL_OK) {		    char msg[200];    		    sprintf(msg, "\n    (%s \"%.50s\" in widget \"%.50s\")",			    "database entry for",			    specPtr->dbName, Tk_PathName(tkwin));		    Tcl_AddErrorInfo(interp, msg);		    return TCL_ERROR;		}	    } else {		value = specPtr->defValue;		if ((value != NULL) && !(specPtr->specFlags			& TK_CONFIG_DONT_SET_DEFAULT)) {		    if (DoConfig(interp, tkwin, specPtr, value, 1, widgRec) !=			    TCL_OK) {			char msg[200];				sprintf(msg,				"\n    (%s \"%.50s\" in widget \"%.50s\")",				"default value for",				specPtr->dbName, Tk_PathName(tkwin));			Tcl_AddErrorInfo(interp, msg);			return TCL_ERROR;		    }		}	    }	}    }    return TCL_OK;}/* *-------------------------------------------------------------- * * FindConfigSpec -- * *	Search through a table of configuration specs, looking for *	one that matches a given argvName. * * Results: *	The return value is a pointer to the matching entry, or NULL *	if nothing matched.  In that case an error message is left *	in interp->result. * * Side effects: *	None. * *-------------------------------------------------------------- */static Tk_ConfigSpec *FindConfigSpec(interp, specs, argvName, needFlags, hateFlags)    Tcl_Interp *interp;		/* Used for reporting errors. */    Tk_ConfigSpec *specs;	/* Pointer to table of configuration				 * specifications for a widget. */    char *argvName;		/* Name (suitable for use in a "config"				 * command) identifying particular option. */    int needFlags;		/* Flags that must be present in matching				 * entry. */    int hateFlags;		/* Flags that must NOT be present in				 * matching entry. */{    register Tk_ConfigSpec *specPtr;    register char c;		/* First character of current argument. */    Tk_ConfigSpec *matchPtr;	/* Matching spec, or NULL. */    size_t length;    c = argvName[1];    length = strlen(argvName);    matchPtr = NULL;    for (specPtr = specs; specPtr->type != TK_CONFIG_END; specPtr++) {	if (specPtr->argvName == NULL) {	    continue;	}	if ((specPtr->argvName[1] != c)		|| (strncmp(specPtr->argvName, argvName, length) != 0)) {	    continue;	}	if (((specPtr->specFlags & needFlags) != needFlags)		|| (specPtr->specFlags & hateFlags)) {	    continue;	}	if (specPtr->argvName[length] == 0) {	    matchPtr = specPtr;	    goto gotMatch;	}	if (matchPtr != NULL) {	    Tcl_AppendResult(interp, "ambiguous option \"", argvName,		    "\"", (char *) NULL);	    return (Tk_ConfigSpec *) NULL;	}	matchPtr = specPtr;    }    if (matchPtr == NULL) {	Tcl_AppendResult(interp, "unknown option \"", argvName,		"\"", (char *) NULL);	return (Tk_ConfigSpec *) NULL;    }    /*     * Found a matching entry.  If it's a synonym, then find the     * entry that it's a synonym for.     */    gotMatch:    specPtr = matchPtr;    if (specPtr->type == TK_CONFIG_SYNONYM) {	for (specPtr = specs; ; specPtr++) {	    if (specPtr->type == TK_CONFIG_END) {		Tcl_AppendResult(interp,			"couldn't find synonym for option \"",			argvName, "\"", (char *) NULL);		return (Tk_ConfigSpec *) NULL;	    }	    if ((specPtr->dbName == matchPtr->dbName) 		    && (specPtr->type != TK_CONFIG_SYNONYM)		    && ((specPtr->specFlags & needFlags) == needFlags)		    && !(specPtr->specFlags & hateFlags)) {		break;	    }	}    }    return specPtr;}/* *-------------------------------------------------------------- * * DoConfig -- * *	This procedure applies a single configuration option *	to a widget record. * * Results: *	A standard Tcl return value. * * Side effects: *	WidgRec is modified as indicated by specPtr and value. *	The old value is recycled, if that is appropriate for *	the value type. * *-------------------------------------------------------------- */static intDoConfig(interp, tkwin, specPtr, value, valueIsUid, widgRec)    Tcl_Interp *interp;		/* Interpreter for error reporting. */    Tk_Window tkwin;		/* Window containing widget (needed to				 * set up X resources). */    Tk_ConfigSpec *specPtr;	/* Specifier to apply. */    char *value;		/* Value to use to fill in widgRec. */    int valueIsUid;		/* Non-zero means value is a Tk_Uid;				 * zero means it's an ordinary string. */    char *widgRec;		/* Record whose fields are to be				 * modified.  Values must be properly				 * initialized. */{    char *ptr;    Tk_Uid uid;    int nullValue;    nullValue = 0;    if ((*value == 0) && (specPtr->specFlags & TK_CONFIG_NULL_OK)) {	nullValue = 1;    }    do {	ptr = widgRec + specPtr->offset;	switch (specPtr->type) {	    case TK_CONFIG_BOOLEAN:		if (Tcl_GetBoolean(interp, value, (int *) ptr) != TCL_OK) {		    return TCL_ERROR;		}		break;	    case TK_CONFIG_INT:		if (Tcl_GetInt(interp, value, (int *) ptr) != TCL_OK) {		    return TCL_ERROR;		}		break;	    case TK_CONFIG_DOUBLE:		if (Tcl_GetDouble(interp, value, (double *) ptr) != TCL_OK) {		    return TCL_ERROR;		}		break;	    case TK_CONFIG_STRING: {		char *old, *new;		if (nullValue) {		    new = NULL;		} else {		    new = (char *) ckalloc((unsigned) (strlen(value) + 1));		    strcpy(new, value);		}		old = *((char **) ptr);		if (old != NULL) {		    ckfree(old);		}		*((char **) ptr) = new;		break;	    }	    case TK_CONFIG_UID:		if (nullValue) {		    *((Tk_Uid *) ptr) = NULL;		} else {		    uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value);		    *((Tk_Uid *) ptr) = uid;		}		break;	    case TK_CONFIG_COLOR: {		XColor *newPtr, *oldPtr;		if (nullValue) {		    newPtr = NULL;		} else {		    uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value);		    newPtr = Tk_GetColor(interp, tkwin, uid);		    if (newPtr == NULL) {			return TCL_ERROR;		    }		}		oldPtr = *((XColor **) ptr);		if (oldPtr != NULL) {		    Tk_FreeColor(oldPtr);		}		*((XColor **) ptr) = newPtr;		break;	    }	    case TK_CONFIG_FONT: {		Tk_Font new;		if (nullValue) {		    new = NULL;		} else {		    new = Tk_GetFont(interp, tkwin, value);		    if (new == NULL) {			return TCL_ERROR;		    }		}		Tk_FreeFont(*((Tk_Font *) ptr));		*((Tk_Font *) ptr) = new;		break;	    }	    case TK_CONFIG_BITMAP: {		Pixmap new, old;		if (nullValue) {		    new = None;	        } else {		    uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value);		    new = Tk_GetBitmap(interp, tkwin, uid);		    if (new == None) {			return TCL_ERROR;		    }		}		old = *((Pixmap *) ptr);		if (old != None) {		    Tk_FreeBitmap(Tk_Display(tkwin), old);		}		*((Pixmap *) ptr) = new;		break;	    }	    case TK_CONFIG_BORDER: {		Tk_3DBorder new, old;		if (nullValue) {		    new = NULL;		} else {		    uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value);		    new = Tk_Get3DBorder(interp, tkwin, uid);		    if (new == NULL) {			return TCL_ERROR;		    }		}		old = *((Tk_3DBorder *) ptr);		if (old != NULL) {		    Tk_Free3DBorder(old);		}		*((Tk_3DBorder *) ptr) = new;		break;	    }	    case TK_CONFIG_RELIEF:		uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value);		if (Tk_GetRelief(interp, uid, (int *) ptr) != TCL_OK) {		    return TCL_ERROR;		}		break;	    case TK_CONFIG_CURSOR:	    case TK_CONFIG_ACTIVE_CURSOR: {		Tk_Cursor new, old;		if (nullValue) {		    new = None;		} else {		    uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value);		    new = Tk_GetCursor(interp, tkwin, uid);		    if (new == None) {			return TCL_ERROR;		    }		}		old = *((Tk_Cursor *) ptr);		if (old != None) {		    Tk_FreeCursor(Tk_Display(tkwin), old);		}		*((Tk_Cursor *) ptr) = new;		if (specPtr->type == TK_CONFIG_ACTIVE_CURSOR) {		    Tk_DefineCursor(tkwin, new);		}		break;	    }	    case TK_CONFIG_JUSTIFY:		uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value);		if (Tk_GetJustify(interp, uid, (Tk_Justify *) ptr) != TCL_OK) {		    return TCL_ERROR;		}		break;	    case TK_CONFIG_ANCHOR:		uid = valueIsUid ? (Tk_Uid) value : Tk_GetUid(value);		if (Tk_GetAnchor(interp, uid, (Tk_Anchor *) ptr) != TCL_OK) {		    return TCL_ERROR;		}

⌨️ 快捷键说明

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