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

📄 tkscrollbar.c

📁 linux系统下的音频通信
💻 C
📖 第 1 页 / 共 2 页
字号:
/*  * tkScrollbar.c -- * *	This module implements a scrollbar widgets for the Tk *	toolkit.  A scrollbar displays a slider and two arrows; *	mouse clicks on features within the scrollbar cause *	scrolling commands to be invoked. * * Copyright (c) 1990-1994 The Regents of the University of California. * Copyright (c) 1994-1997 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: @(#) tkScrollbar.c 1.94 97/07/31 09:12:44 */#include "tkPort.h"#include "tkScrollbar.h"#include "default.h"/* * Information used for argv parsing. */Tk_ConfigSpec tkpScrollbarConfigSpecs[] = {    {TK_CONFIG_BORDER, "-activebackground", "activeBackground", "Foreground",	DEF_SCROLLBAR_ACTIVE_BG_COLOR, Tk_Offset(TkScrollbar, activeBorder),	TK_CONFIG_COLOR_ONLY},    {TK_CONFIG_BORDER, "-activebackground", "activeBackground", "Foreground",	DEF_SCROLLBAR_ACTIVE_BG_MONO, Tk_Offset(TkScrollbar, activeBorder),	TK_CONFIG_MONO_ONLY},    {TK_CONFIG_RELIEF, "-activerelief", "activeRelief", "Relief",	DEF_SCROLLBAR_ACTIVE_RELIEF, Tk_Offset(TkScrollbar, activeRelief), 0},    {TK_CONFIG_BORDER, "-background", "background", "Background",	DEF_SCROLLBAR_BG_COLOR, Tk_Offset(TkScrollbar, bgBorder),	TK_CONFIG_COLOR_ONLY},    {TK_CONFIG_BORDER, "-background", "background", "Background",	DEF_SCROLLBAR_BG_MONO, Tk_Offset(TkScrollbar, bgBorder),	TK_CONFIG_MONO_ONLY},    {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_SCROLLBAR_BORDER_WIDTH, Tk_Offset(TkScrollbar, borderWidth), 0},    {TK_CONFIG_STRING, "-command", "command", "Command",	DEF_SCROLLBAR_COMMAND, Tk_Offset(TkScrollbar, command),	TK_CONFIG_NULL_OK},    {TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor",	DEF_SCROLLBAR_CURSOR, Tk_Offset(TkScrollbar, cursor), TK_CONFIG_NULL_OK},    {TK_CONFIG_PIXELS, "-elementborderwidth", "elementBorderWidth",	"BorderWidth", DEF_SCROLLBAR_EL_BORDER_WIDTH,	Tk_Offset(TkScrollbar, elementBorderWidth), 0},    {TK_CONFIG_COLOR, "-highlightbackground", "highlightBackground",	"HighlightBackground", DEF_SCROLLBAR_HIGHLIGHT_BG,	Tk_Offset(TkScrollbar, highlightBgColorPtr), 0},    {TK_CONFIG_COLOR, "-highlightcolor", "highlightColor", "HighlightColor",	DEF_SCROLLBAR_HIGHLIGHT,	Tk_Offset(TkScrollbar, highlightColorPtr), 0},    {TK_CONFIG_PIXELS, "-highlightthickness", "highlightThickness",	"HighlightThickness",	DEF_SCROLLBAR_HIGHLIGHT_WIDTH, Tk_Offset(TkScrollbar, highlightWidth), 0},    {TK_CONFIG_BOOLEAN, "-jump", "jump", "Jump",	DEF_SCROLLBAR_JUMP, Tk_Offset(TkScrollbar, jump), 0},    {TK_CONFIG_UID, "-orient", "orient", "Orient",	DEF_SCROLLBAR_ORIENT, Tk_Offset(TkScrollbar, orientUid), 0},    {TK_CONFIG_RELIEF, "-relief", "relief", "Relief",	DEF_SCROLLBAR_RELIEF, Tk_Offset(TkScrollbar, relief), 0},    {TK_CONFIG_INT, "-repeatdelay", "repeatDelay", "RepeatDelay",	DEF_SCROLLBAR_REPEAT_DELAY, Tk_Offset(TkScrollbar, repeatDelay), 0},    {TK_CONFIG_INT, "-repeatinterval", "repeatInterval", "RepeatInterval",	DEF_SCROLLBAR_REPEAT_INTERVAL, Tk_Offset(TkScrollbar, repeatInterval), 0},    {TK_CONFIG_STRING, "-takefocus", "takeFocus", "TakeFocus",	DEF_SCROLLBAR_TAKE_FOCUS, Tk_Offset(TkScrollbar, takeFocus),	TK_CONFIG_NULL_OK},    {TK_CONFIG_COLOR, "-troughcolor", "troughColor", "Background",	DEF_SCROLLBAR_TROUGH_COLOR, Tk_Offset(TkScrollbar, troughColorPtr),	TK_CONFIG_COLOR_ONLY},    {TK_CONFIG_COLOR, "-troughcolor", "troughColor", "Background",	DEF_SCROLLBAR_TROUGH_MONO, Tk_Offset(TkScrollbar, troughColorPtr),	TK_CONFIG_MONO_ONLY},    {TK_CONFIG_PIXELS, "-width", "width", "Width",	DEF_SCROLLBAR_WIDTH, Tk_Offset(TkScrollbar, 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 int		ConfigureScrollbar _ANSI_ARGS_((Tcl_Interp *interp,			    TkScrollbar *scrollPtr, int argc, char **argv,			    int flags));static void		ScrollbarCmdDeletedProc _ANSI_ARGS_((			    ClientData clientData));static int		ScrollbarWidgetCmd _ANSI_ARGS_((ClientData clientData,			    Tcl_Interp *, int argc, char **argv));/* *-------------------------------------------------------------- * * Tk_ScrollbarCmd -- * *	This procedure is invoked to process the "scrollbar" Tcl *	command.  See the user documentation for details on what *	it does. * * Results: *	A standard Tcl result. * * Side effects: *	See the user documentation. * *-------------------------------------------------------------- */intTk_ScrollbarCmd(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 TkScrollbar *scrollPtr;    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;    }    Tk_SetClass(new, "Scrollbar");    scrollPtr = TkpCreateScrollbar(new);    TkSetClassProcs(new, &tkpScrollbarProcs, (ClientData) scrollPtr);    /*     * Initialize fields that won't be initialized by ConfigureScrollbar,     * or which ConfigureScrollbar expects to have reasonable values     * (e.g. resource pointers).     */    scrollPtr->tkwin = new;    scrollPtr->display = Tk_Display(new);    scrollPtr->interp = interp;    scrollPtr->widgetCmd = Tcl_CreateCommand(interp,	    Tk_PathName(scrollPtr->tkwin), ScrollbarWidgetCmd,	    (ClientData) scrollPtr, ScrollbarCmdDeletedProc);    scrollPtr->orientUid = NULL;    scrollPtr->vertical = 0;    scrollPtr->width = 0;    scrollPtr->command = NULL;    scrollPtr->commandSize = 0;    scrollPtr->repeatDelay = 0;    scrollPtr->repeatInterval = 0;    scrollPtr->borderWidth = 0;    scrollPtr->bgBorder = NULL;    scrollPtr->activeBorder = NULL;    scrollPtr->troughColorPtr = NULL;    scrollPtr->relief = TK_RELIEF_FLAT;    scrollPtr->highlightWidth = 0;    scrollPtr->highlightBgColorPtr = NULL;    scrollPtr->highlightColorPtr = NULL;    scrollPtr->inset = 0;    scrollPtr->elementBorderWidth = -1;    scrollPtr->arrowLength = 0;    scrollPtr->sliderFirst = 0;    scrollPtr->sliderLast = 0;    scrollPtr->activeField = 0;    scrollPtr->activeRelief = TK_RELIEF_RAISED;    scrollPtr->totalUnits = 0;    scrollPtr->windowUnits = 0;    scrollPtr->firstUnit = 0;    scrollPtr->lastUnit = 0;    scrollPtr->firstFraction = 0.0;    scrollPtr->lastFraction = 0.0;    scrollPtr->cursor = None;    scrollPtr->takeFocus = NULL;    scrollPtr->flags = 0;    if (ConfigureScrollbar(interp, scrollPtr, argc-2, argv+2, 0) != TCL_OK) {	Tk_DestroyWindow(scrollPtr->tkwin);	return TCL_ERROR;    }    interp->result = Tk_PathName(scrollPtr->tkwin);    return TCL_OK;}/* *-------------------------------------------------------------- * * ScrollbarWidgetCmd -- * *	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 intScrollbarWidgetCmd(clientData, interp, argc, argv)    ClientData clientData;	/* Information about scrollbar					 * widget. */    Tcl_Interp *interp;			/* Current interpreter. */    int argc;				/* Number of arguments. */    char **argv;			/* Argument strings. */{    register TkScrollbar *scrollPtr = (TkScrollbar *) 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) scrollPtr);    c = argv[1][0];    length = strlen(argv[1]);    if ((c == 'a') && (strncmp(argv[1], "activate", length) == 0)) {	int oldActiveField;	if (argc == 2) {	    switch (scrollPtr->activeField) {		case TOP_ARROW:		interp->result = "arrow1";	break;		case SLIDER:		interp->result = "slider";	break;		case BOTTOM_ARROW:	interp->result = "arrow2";	break;	    }	    goto done;	}	if (argc != 3) {	    Tcl_AppendResult(interp, "wrong # args: should be \"",		    argv[0], " activate element\"", (char *) NULL);	    goto error;	}	c = argv[2][0];	length = strlen(argv[2]);	oldActiveField = scrollPtr->activeField;	if ((c == 'a') && (strcmp(argv[2], "arrow1") == 0)) {	    scrollPtr->activeField = TOP_ARROW;	} else if ((c == 'a') && (strcmp(argv[2], "arrow2") == 0)) {	    scrollPtr->activeField = BOTTOM_ARROW;	} else if ((c == 's') && (strncmp(argv[2], "slider", length) == 0)) {	    scrollPtr->activeField = SLIDER;	} else {	    scrollPtr->activeField = OUTSIDE;	}	if (oldActiveField != scrollPtr->activeField) {	    TkScrollbarEventuallyRedraw(scrollPtr);	}    } else 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, scrollPtr->tkwin,		tkpScrollbarConfigSpecs, (char *) scrollPtr, argv[2], 0);    } else if ((c == 'c') && (strncmp(argv[1], "configure", length) == 0)	    && (length >= 2)) {	if (argc == 2) {	    result = Tk_ConfigureInfo(interp, scrollPtr->tkwin,		    tkpScrollbarConfigSpecs, (char *) scrollPtr,		    (char *) NULL, 0);	} else if (argc == 3) {	    result = Tk_ConfigureInfo(interp, scrollPtr->tkwin,		    tkpScrollbarConfigSpecs, (char *) scrollPtr, argv[2], 0);	} else {	    result = ConfigureScrollbar(interp, scrollPtr, argc-2, argv+2,		    TK_CONFIG_ARGV_ONLY);	}    } else if ((c == 'd') && (strncmp(argv[1], "delta", length) == 0)) {	int xDelta, yDelta, pixels, length;	double fraction;	if (argc != 4) {	    Tcl_AppendResult(interp, "wrong # args: should be \"",		    argv[0], " delta xDelta yDelta\"", (char *) NULL);	    goto error;	}	if ((Tcl_GetInt(interp, argv[2], &xDelta) != TCL_OK)		|| (Tcl_GetInt(interp, argv[3], &yDelta) != TCL_OK)) {	    goto error;	}	if (scrollPtr->vertical) {	    pixels = yDelta;	    length = Tk_Height(scrollPtr->tkwin) - 1		    - 2*(scrollPtr->arrowLength + scrollPtr->inset);	} else {	    pixels = xDelta;	    length = Tk_Width(scrollPtr->tkwin) - 1		    - 2*(scrollPtr->arrowLength + scrollPtr->inset);	}	if (length == 0) {	    fraction = 0.0;	} else {	    fraction = ((double) pixels / (double) length);	}	sprintf(interp->result, "%g", fraction);    } else if ((c == 'f') && (strncmp(argv[1], "fraction", length) == 0)) {	int x, y, pos, length;	double fraction;	if (argc != 4) {	    Tcl_AppendResult(interp, "wrong # args: should be \"",		    argv[0], " fraction x y\"", (char *) NULL);	    goto error;	}	if ((Tcl_GetInt(interp, argv[2], &x) != TCL_OK)		|| (Tcl_GetInt(interp, argv[3], &y) != TCL_OK)) {	    goto error;	}	if (scrollPtr->vertical) {	    pos = y - (scrollPtr->arrowLength + scrollPtr->inset);	    length = Tk_Height(scrollPtr->tkwin) - 1		    - 2*(scrollPtr->arrowLength + scrollPtr->inset);	} else {	    pos = x - (scrollPtr->arrowLength + scrollPtr->inset);	    length = Tk_Width(scrollPtr->tkwin) - 1		    - 2*(scrollPtr->arrowLength + scrollPtr->inset);	}	if (length == 0) {	    fraction = 0.0;	} else {	    fraction = ((double) pos / (double) length);	}

⌨️ 快捷键说明

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