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

📄 tkscale.c

📁 linux系统下的音频通信
💻 C
📖 第 1 页 / 共 3 页
字号:
/*  * tkScale.c -- * *	This module implements a scale widgets for the Tk toolkit. *	A scale displays a slider that can be adjusted to change a *	value;  it also displays numeric labels and a textual label, *	if desired. *	 *	The modifications to use floating-point values are based on *	an implementation by Paul Mackerras.  The -variable option *	is due to Henning Schulzrinne.  All of these are used with *	permission. * * Copyright (c) 1990-1994 The Regents of the University of California. * Copyright (c) 1994-1996 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: @(#) tkScale.c 1.88 97/07/31 09:11:57 */#include "tkPort.h"#include "default.h"#include "tkInt.h"#include "tclMath.h"#include "tkScale.h"static Tk_ConfigSpec configSpecs[] = {    {TK_CONFIG_BORDER, "-activebackground", "activeBackground", "Foreground",	DEF_SCALE_ACTIVE_BG_COLOR, Tk_Offset(TkScale, activeBorder),	TK_CONFIG_COLOR_ONLY},    {TK_CONFIG_BORDER, "-activebackground", "activeBackground", "Foreground",	DEF_SCALE_ACTIVE_BG_MONO, Tk_Offset(TkScale, activeBorder),	TK_CONFIG_MONO_ONLY},    {TK_CONFIG_BORDER, "-background", "background", "Background",	DEF_SCALE_BG_COLOR, Tk_Offset(TkScale, bgBorder),	TK_CONFIG_COLOR_ONLY},    {TK_CONFIG_BORDER, "-background", "background", "Background",	DEF_SCALE_BG_MONO, Tk_Offset(TkScale, bgBorder),	TK_CONFIG_MONO_ONLY},    {TK_CONFIG_DOUBLE, "-bigincrement", "bigIncrement", "BigIncrement",	DEF_SCALE_BIG_INCREMENT, Tk_Offset(TkScale, bigIncrement), 0},    {TK_CONFIG_SYNONYM, "-bd", "borderWidth", (char *) NULL,	(char *) NULL, 0, 0},    {TK_CONFIG_SYNONYM, "-bg", "background", (char *) NULL,	(char *) NULL, 0, 0},    {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",	DEF_SCALE_BORDER_WIDTH, Tk_Offset(TkScale, borderWidth), 0},    {TK_CONFIG_STRING, "-command", "command", "Command",	DEF_SCALE_COMMAND, Tk_Offset(TkScale, command), TK_CONFIG_NULL_OK},    {TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor",	DEF_SCALE_CURSOR, Tk_Offset(TkScale, cursor), TK_CONFIG_NULL_OK},    {TK_CONFIG_INT, "-digits", "digits", "Digits",	DEF_SCALE_DIGITS, Tk_Offset(TkScale, digits), 0},    {TK_CONFIG_SYNONYM, "-fg", "foreground", (char *) NULL,	(char *) NULL, 0, 0},    {TK_CONFIG_FONT, "-font", "font", "Font",	DEF_SCALE_FONT, Tk_Offset(TkScale, tkfont),	0},    {TK_CONFIG_COLOR, "-foreground", "foreground", "Foreground",	DEF_SCALE_FG_COLOR, Tk_Offset(TkScale, textColorPtr),	TK_CONFIG_COLOR_ONLY},    {TK_CONFIG_COLOR, "-foreground", "foreground", "Foreground",	DEF_SCALE_FG_MONO, Tk_Offset(TkScale, textColorPtr),	TK_CONFIG_MONO_ONLY},    {TK_CONFIG_DOUBLE, "-from", "from", "From",	DEF_SCALE_FROM, Tk_Offset(TkScale, fromValue), 0},    {TK_CONFIG_COLOR, "-highlightbackground", "highlightBackground",	"HighlightBackground", DEF_SCALE_HIGHLIGHT_BG,	Tk_Offset(TkScale, highlightBgColorPtr), 0},    {TK_CONFIG_COLOR, "-highlightcolor", "highlightColor", "HighlightColor",	DEF_SCALE_HIGHLIGHT, Tk_Offset(TkScale, highlightColorPtr), 0},    {TK_CONFIG_PIXELS, "-highlightthickness", "highlightThickness",	"HighlightThickness",	DEF_SCALE_HIGHLIGHT_WIDTH, Tk_Offset(TkScale, highlightWidth), 0},    {TK_CONFIG_STRING, "-label", "label", "Label",	DEF_SCALE_LABEL, Tk_Offset(TkScale, label), TK_CONFIG_NULL_OK},    {TK_CONFIG_PIXELS, "-length", "length", "Length",	DEF_SCALE_LENGTH, Tk_Offset(TkScale, length), 0},    {TK_CONFIG_UID, "-orient", "orient", "Orient",	DEF_SCALE_ORIENT, Tk_Offset(TkScale, orientUid), 0},    {TK_CONFIG_RELIEF, "-relief", "relief", "Relief",	DEF_SCALE_RELIEF, Tk_Offset(TkScale, relief), 0},    {TK_CONFIG_INT, "-repeatdelay", "repeatDelay", "RepeatDelay",	DEF_SCALE_REPEAT_DELAY, Tk_Offset(TkScale, repeatDelay), 0},    {TK_CONFIG_INT, "-repeatinterval", "repeatInterval", "RepeatInterval",	DEF_SCALE_REPEAT_INTERVAL, Tk_Offset(TkScale, repeatInterval), 0},    {TK_CONFIG_DOUBLE, "-resolution", "resolution", "Resolution",	DEF_SCALE_RESOLUTION, Tk_Offset(TkScale, resolution), 0},    {TK_CONFIG_BOOLEAN, "-showvalue", "showValue", "ShowValue",	DEF_SCALE_SHOW_VALUE, Tk_Offset(TkScale, showValue), 0},    {TK_CONFIG_PIXELS, "-sliderlength", "sliderLength", "SliderLength",	DEF_SCALE_SLIDER_LENGTH, Tk_Offset(TkScale, sliderLength), 0},    {TK_CONFIG_RELIEF, "-sliderrelief", "sliderRelief", "SliderRelief",	DEF_SCALE_SLIDER_RELIEF, Tk_Offset(TkScale, sliderRelief),	TK_CONFIG_DONT_SET_DEFAULT},    {TK_CONFIG_UID, "-state", "state", "State",	DEF_SCALE_STATE, Tk_Offset(TkScale, state), 0},    {TK_CONFIG_STRING, "-takefocus", "takeFocus", "TakeFocus",	DEF_SCALE_TAKE_FOCUS, Tk_Offset(TkScale, takeFocus),	TK_CONFIG_NULL_OK},    {TK_CONFIG_DOUBLE, "-tickinterval", "tickInterval", "TickInterval",	DEF_SCALE_TICK_INTERVAL, Tk_Offset(TkScale, tickInterval), 0},    {TK_CONFIG_DOUBLE, "-to", "to", "To",	DEF_SCALE_TO, Tk_Offset(TkScale, toValue), 0},    {TK_CONFIG_COLOR, "-troughcolor", "troughColor", "Background",	DEF_SCALE_TROUGH_COLOR, Tk_Offset(TkScale, troughColorPtr),	TK_CONFIG_COLOR_ONLY},    {TK_CONFIG_COLOR, "-troughcolor", "troughColor", "Background",	DEF_SCALE_TROUGH_MONO, Tk_Offset(TkScale, troughColorPtr),	TK_CONFIG_MONO_ONLY},    {TK_CONFIG_STRING, "-variable", "variable", "Variable",	DEF_SCALE_VARIABLE, Tk_Offset(TkScale, varName), TK_CONFIG_NULL_OK},    {TK_CONFIG_PIXELS, "-width", "width", "Width",	DEF_SCALE_WIDTH, Tk_Offset(TkScale, width), 0},    {TK_CONFIG_END, (char *) NULL, (char *) NULL, (char *) NULL,	(char *) NULL, 0, 0}};/* * Forward declarations for procedures defined later in this file: */static void		ComputeFormat _ANSI_ARGS_((TkScale *scalePtr));static void		ComputeScaleGeometry _ANSI_ARGS_((TkScale *scalePtr));static int		ConfigureScale _ANSI_ARGS_((Tcl_Interp *interp,			    TkScale *scalePtr, int argc, char **argv,			    int flags));static void		DestroyScale _ANSI_ARGS_((char *memPtr));static void		ScaleCmdDeletedProc _ANSI_ARGS_((			    ClientData clientData));static void		ScaleEventProc _ANSI_ARGS_((ClientData clientData,			    XEvent *eventPtr));static char *		ScaleVarProc _ANSI_ARGS_((ClientData clientData,			    Tcl_Interp *interp, char *name1, char *name2,			    int flags));static int		ScaleWidgetCmd _ANSI_ARGS_((ClientData clientData,			    Tcl_Interp *interp, int argc, char **argv));static void		ScaleWorldChanged _ANSI_ARGS_((			    ClientData instanceData));/* * The structure below defines scale class behavior by means of procedures * that can be invoked from generic window code. */static TkClassProcs scaleClass = {    NULL,			/* createProc. */    ScaleWorldChanged,		/* geometryProc. */    NULL			/* modalProc. */};/* *-------------------------------------------------------------- * * Tk_ScaleCmd -- * *	This procedure is invoked to process the "scale" Tcl *	command.  See the user documentation for details on what *	it does. * * Results: *	A standard Tcl result. * * Side effects: *	See the user documentation. * *-------------------------------------------------------------- */intTk_ScaleCmd(clientData, interp, argc, argv)    ClientData clientData;		/* Main window associated with				 * interpreter. */    Tcl_Interp *interp;		/* Current interpreter. */    int argc;			/* Number of arguments. */    char **argv;		/* Argument strings. */{    Tk_Window tkwin = (Tk_Window) clientData;    register TkScale *scalePtr;    Tk_Window new;    if (argc < 2) {	Tcl_AppendResult(interp, "wrong # args: should be \"",		argv[0], " pathName ?options?\"", (char *) NULL);	return TCL_ERROR;    }    new = Tk_CreateWindowFromPath(interp, tkwin, argv[1], (char *) NULL);    if (new == NULL) {	return TCL_ERROR;    }    scalePtr = TkpCreateScale(new);    /*     * Initialize fields that won't be initialized by ConfigureScale,     * or which ConfigureScale expects to have reasonable values     * (e.g. resource pointers).     */    scalePtr->tkwin = new;    scalePtr->display = Tk_Display(new);    scalePtr->interp = interp;    scalePtr->widgetCmd = Tcl_CreateCommand(interp,	    Tk_PathName(scalePtr->tkwin), ScaleWidgetCmd,	    (ClientData) scalePtr, ScaleCmdDeletedProc);    scalePtr->orientUid = NULL;    scalePtr->vertical = 0;    scalePtr->width = 0;    scalePtr->length = 0;    scalePtr->value = 0;    scalePtr->varName = NULL;    scalePtr->fromValue = 0;    scalePtr->toValue = 0;    scalePtr->tickInterval = 0;    scalePtr->resolution = 1;    scalePtr->bigIncrement = 0.0;    scalePtr->command = NULL;    scalePtr->repeatDelay = 0;    scalePtr->repeatInterval = 0;    scalePtr->label = NULL;    scalePtr->labelLength = 0;    scalePtr->state = tkNormalUid;    scalePtr->borderWidth = 0;    scalePtr->bgBorder = NULL;    scalePtr->activeBorder = NULL;    scalePtr->sliderRelief = TK_RELIEF_RAISED;    scalePtr->troughColorPtr = NULL;    scalePtr->troughGC = None;    scalePtr->copyGC = None;    scalePtr->tkfont = NULL;    scalePtr->textColorPtr = NULL;    scalePtr->textGC = None;    scalePtr->relief = TK_RELIEF_FLAT;    scalePtr->highlightWidth = 0;    scalePtr->highlightBgColorPtr = NULL;    scalePtr->highlightColorPtr = NULL;    scalePtr->inset = 0;    scalePtr->sliderLength = 0;    scalePtr->showValue = 0;    scalePtr->horizLabelY = 0;    scalePtr->horizValueY = 0;    scalePtr->horizTroughY = 0;    scalePtr->horizTickY = 0;    scalePtr->vertTickRightX = 0;    scalePtr->vertValueRightX = 0;    scalePtr->vertTroughX = 0;    scalePtr->vertLabelX = 0;    scalePtr->cursor = None;    scalePtr->takeFocus = NULL;    scalePtr->flags = NEVER_SET;    Tk_SetClass(scalePtr->tkwin, "Scale");    TkSetClassProcs(scalePtr->tkwin, &scaleClass, (ClientData) scalePtr);    Tk_CreateEventHandler(scalePtr->tkwin,	    ExposureMask|StructureNotifyMask|FocusChangeMask,	    ScaleEventProc, (ClientData) scalePtr);    if (ConfigureScale(interp, scalePtr, argc-2, argv+2, 0) != TCL_OK) {	goto error;    }    interp->result = Tk_PathName(scalePtr->tkwin);    return TCL_OK;    error:    Tk_DestroyWindow(scalePtr->tkwin);    return TCL_ERROR;}/* *-------------------------------------------------------------- * * ScaleWidgetCmd -- * *	This procedure is invoked to process the Tcl command *	that corresponds to a widget managed by this module. *	See the user documentation for details on what it does. * * Results: *	A standard Tcl result. * * Side effects: *	See the user documentation. * *-------------------------------------------------------------- */static intScaleWidgetCmd(clientData, interp, argc, argv)    ClientData clientData;		/* Information about scale					 * widget. */    Tcl_Interp *interp;			/* Current interpreter. */    int argc;				/* Number of arguments. */    char **argv;			/* Argument strings. */{    register TkScale *scalePtr = (TkScale *) clientData;    int result = TCL_OK;    size_t length;    int c;    if (argc < 2) {	Tcl_AppendResult(interp, "wrong # args: should be \"",		argv[0], " option ?arg arg ...?\"", (char *) NULL);	return TCL_ERROR;    }    Tcl_Preserve((ClientData) scalePtr);    c = argv[1][0];    length = strlen(argv[1]);    if ((c == 'c') && (strncmp(argv[1], "cget", length) == 0)	    && (length >= 2)) {	if (argc != 3) {	    Tcl_AppendResult(interp, "wrong # args: should be \"",		    argv[0], " cget option\"",		    (char *) NULL);	    goto error;	}	result = Tk_ConfigureValue(interp, scalePtr->tkwin, configSpecs,		(char *) scalePtr, argv[2], 0);    } else if ((c == 'c') && (strncmp(argv[1], "configure", length) == 0)	    && (length >= 3)) {	if (argc == 2) {	    result = Tk_ConfigureInfo(interp, scalePtr->tkwin, configSpecs,		    (char *) scalePtr, (char *) NULL, 0);	} else if (argc == 3) {	    result = Tk_ConfigureInfo(interp, scalePtr->tkwin, configSpecs,		    (char *) scalePtr, argv[2], 0);	} else {	    result = ConfigureScale(interp, scalePtr, argc-2, argv+2,		    TK_CONFIG_ARGV_ONLY);	}    } else if ((c == 'c') && (strncmp(argv[1], "coords", length) == 0)	    && (length >= 3)) {	int x, y ;	double value;	if ((argc != 2) && (argc != 3)) {	    Tcl_AppendResult(interp, "wrong # args: should be \"",		    argv[0], " coords ?value?\"", (char *) NULL);	    goto error;	}	if (argc == 3) {	    if (Tcl_GetDouble(interp, argv[2], &value) != TCL_OK) {		goto error;	    }	} else {	    value = scalePtr->value;	}	if (scalePtr->vertical) {	    x = scalePtr->vertTroughX + scalePtr->width/2		    + scalePtr->borderWidth;	    y = TkpValueToPixel(scalePtr, value);	} else {	    x = TkpValueToPixel(scalePtr, value);	    y = scalePtr->horizTroughY + scalePtr->width/2		    + scalePtr->borderWidth;	}	sprintf(interp->result, "%d %d", x, y);    } else if ((c == 'g') && (strncmp(argv[1], "get", length) == 0)) {	double value;	int x, y;	if ((argc != 2) && (argc != 4)) {	    Tcl_AppendResult(interp, "wrong # args: should be \"",		    argv[0], " get ?x y?\"", (char *) NULL);	    goto error;	}	if (argc == 2) {	    value = scalePtr->value;	} else {	    if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK)		    || (Tcl_GetInt(interp, argv[3], &y) != TCL_OK)) {		goto error;	    }	    value = TkpPixelToValue(scalePtr, x, y);	}	sprintf(interp->result, scalePtr->format, value);    } else if ((c == 'i') && (strncmp(argv[1], "identify", length) == 0)) {	int x, y, thing;	if (argc != 4) {

⌨️ 快捷键说明

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