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

📄 tkmenubutton.c

📁 linux系统下的音频通信
💻 C
📖 第 1 页 / 共 2 页
字号:
/*  * tkMenubutton.c -- * *	This module implements button-like widgets that are used *	to invoke pull-down menus. * * 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: @(#) tkMenubutton.c 1.94 97/07/31 09:10:37 */#include "tkMenubutton.h"#include "tkPort.h"#include "default.h"/* * Uids internal to menubuttons. */static Tk_Uid aboveUid = NULL;static Tk_Uid belowUid = NULL;static Tk_Uid leftUid = NULL;static Tk_Uid rightUid = NULL;static Tk_Uid flushUid = NULL;/* * Information used for parsing configuration specs: */static Tk_ConfigSpec configSpecs[] = {    {TK_CONFIG_BORDER, "-activebackground", "activeBackground", "Foreground",	DEF_MENUBUTTON_ACTIVE_BG_COLOR, Tk_Offset(TkMenuButton, activeBorder),	TK_CONFIG_COLOR_ONLY},    {TK_CONFIG_BORDER, "-activebackground", "activeBackground", "Foreground",	DEF_MENUBUTTON_ACTIVE_BG_MONO, Tk_Offset(TkMenuButton, activeBorder),	TK_CONFIG_MONO_ONLY},    {TK_CONFIG_COLOR, "-activeforeground", "activeForeground", "Background",	DEF_MENUBUTTON_ACTIVE_FG_COLOR, Tk_Offset(TkMenuButton, activeFg),	TK_CONFIG_COLOR_ONLY},    {TK_CONFIG_COLOR, "-activeforeground", "activeForeground", "Background",	DEF_MENUBUTTON_ACTIVE_FG_MONO, Tk_Offset(TkMenuButton, activeFg),	TK_CONFIG_MONO_ONLY},    {TK_CONFIG_ANCHOR, "-anchor", "anchor", "Anchor",	DEF_MENUBUTTON_ANCHOR, Tk_Offset(TkMenuButton, anchor), 0},    {TK_CONFIG_BORDER, "-background", "background", "Background",	DEF_MENUBUTTON_BG_COLOR, Tk_Offset(TkMenuButton, normalBorder),	TK_CONFIG_COLOR_ONLY},    {TK_CONFIG_BORDER, "-background", "background", "Background",	DEF_MENUBUTTON_BG_MONO, Tk_Offset(TkMenuButton, normalBorder),	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_BITMAP, "-bitmap", "bitmap", "Bitmap",	DEF_MENUBUTTON_BITMAP, Tk_Offset(TkMenuButton, bitmap),	TK_CONFIG_NULL_OK},    {TK_CONFIG_PIXELS, "-borderwidth", "borderWidth", "BorderWidth",	DEF_MENUBUTTON_BORDER_WIDTH, Tk_Offset(TkMenuButton, borderWidth), 0},    {TK_CONFIG_ACTIVE_CURSOR, "-cursor", "cursor", "Cursor",	DEF_MENUBUTTON_CURSOR, Tk_Offset(TkMenuButton, cursor),	TK_CONFIG_NULL_OK},    {TK_CONFIG_UID, "-direction", "direction", "Direction",    	DEF_MENUBUTTON_DIRECTION, Tk_Offset(TkMenuButton, direction), 	0},    {TK_CONFIG_COLOR, "-disabledforeground", "disabledForeground",	"DisabledForeground", DEF_MENUBUTTON_DISABLED_FG_COLOR,	Tk_Offset(TkMenuButton, disabledFg),	TK_CONFIG_COLOR_ONLY|TK_CONFIG_NULL_OK},    {TK_CONFIG_COLOR, "-disabledforeground", "disabledForeground",	"DisabledForeground", DEF_MENUBUTTON_DISABLED_FG_MONO,	Tk_Offset(TkMenuButton, disabledFg),	TK_CONFIG_MONO_ONLY|TK_CONFIG_NULL_OK},    {TK_CONFIG_SYNONYM, "-fg", "foreground", (char *) NULL,	(char *) NULL, 0, 0},    {TK_CONFIG_FONT, "-font", "font", "Font",	DEF_MENUBUTTON_FONT, Tk_Offset(TkMenuButton, tkfont), 0},    {TK_CONFIG_COLOR, "-foreground", "foreground", "Foreground",	DEF_MENUBUTTON_FG, Tk_Offset(TkMenuButton, normalFg), 0},    {TK_CONFIG_STRING, "-height", "height", "Height",	DEF_MENUBUTTON_HEIGHT, Tk_Offset(TkMenuButton, heightString), 0},    {TK_CONFIG_COLOR, "-highlightbackground", "highlightBackground",	"HighlightBackground", DEF_MENUBUTTON_HIGHLIGHT_BG,	Tk_Offset(TkMenuButton, highlightBgColorPtr), 0},    {TK_CONFIG_COLOR, "-highlightcolor", "highlightColor", "HighlightColor",	DEF_MENUBUTTON_HIGHLIGHT, Tk_Offset(TkMenuButton, highlightColorPtr),	0},    {TK_CONFIG_PIXELS, "-highlightthickness", "highlightThickness",	"HighlightThickness", DEF_MENUBUTTON_HIGHLIGHT_WIDTH,	Tk_Offset(TkMenuButton, highlightWidth), 0},    {TK_CONFIG_STRING, "-image", "image", "Image",	DEF_MENUBUTTON_IMAGE, Tk_Offset(TkMenuButton, imageString),	TK_CONFIG_NULL_OK},    {TK_CONFIG_BOOLEAN, "-indicatoron", "indicatorOn", "IndicatorOn",	DEF_MENUBUTTON_INDICATOR, Tk_Offset(TkMenuButton, indicatorOn), 0},    {TK_CONFIG_JUSTIFY, "-justify", "justify", "Justify",	DEF_MENUBUTTON_JUSTIFY, Tk_Offset(TkMenuButton, justify), 0},    {TK_CONFIG_STRING, "-menu", "menu", "Menu",	DEF_MENUBUTTON_MENU, Tk_Offset(TkMenuButton, menuName),	TK_CONFIG_NULL_OK},    {TK_CONFIG_PIXELS, "-padx", "padX", "Pad",	DEF_MENUBUTTON_PADX, Tk_Offset(TkMenuButton, padX), 0},    {TK_CONFIG_PIXELS, "-pady", "padY", "Pad",	DEF_MENUBUTTON_PADY, Tk_Offset(TkMenuButton, padY), 0},    {TK_CONFIG_RELIEF, "-relief", "relief", "Relief",	DEF_MENUBUTTON_RELIEF, Tk_Offset(TkMenuButton, relief), 0},    {TK_CONFIG_UID, "-state", "state", "State",	DEF_MENUBUTTON_STATE, Tk_Offset(TkMenuButton, state), 0},    {TK_CONFIG_STRING, "-takefocus", "takeFocus", "TakeFocus",	DEF_MENUBUTTON_TAKE_FOCUS, Tk_Offset(TkMenuButton, takeFocus),	TK_CONFIG_NULL_OK},    {TK_CONFIG_STRING, "-text", "text", "Text",	DEF_MENUBUTTON_TEXT, Tk_Offset(TkMenuButton, text), 0},    {TK_CONFIG_STRING, "-textvariable", "textVariable", "Variable",	DEF_MENUBUTTON_TEXT_VARIABLE, Tk_Offset(TkMenuButton, textVarName),	TK_CONFIG_NULL_OK},    {TK_CONFIG_INT, "-underline", "underline", "Underline",	DEF_MENUBUTTON_UNDERLINE, Tk_Offset(TkMenuButton, underline), 0},    {TK_CONFIG_STRING, "-width", "width", "Width",	DEF_MENUBUTTON_WIDTH, Tk_Offset(TkMenuButton, widthString), 0},    {TK_CONFIG_PIXELS, "-wraplength", "wrapLength", "WrapLength",	DEF_MENUBUTTON_WRAP_LENGTH, Tk_Offset(TkMenuButton, wrapLength), 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		MenuButtonCmdDeletedProc _ANSI_ARGS_((			    ClientData clientData));static void		MenuButtonEventProc _ANSI_ARGS_((ClientData clientData,			    XEvent *eventPtr));static void		MenuButtonImageProc _ANSI_ARGS_((ClientData clientData,			    int x, int y, int width, int height, int imgWidth,			    int imgHeight));static char *		MenuButtonTextVarProc _ANSI_ARGS_((			    ClientData clientData, Tcl_Interp *interp,			    char *name1, char *name2, int flags));static int		MenuButtonWidgetCmd _ANSI_ARGS_((ClientData clientData,			    Tcl_Interp *interp, int argc, char **argv));static int		ConfigureMenuButton _ANSI_ARGS_((Tcl_Interp *interp,			    TkMenuButton *mbPtr, int argc, char **argv,			    int flags));static void		DestroyMenuButton _ANSI_ARGS_((char *memPtr));/* *-------------------------------------------------------------- * * Tk_MenubuttonCmd -- * *	This procedure is invoked to process the "button", "label", *	"radiobutton", and "checkbutton" Tcl commands.  See the *	user documentation for details on what it does. * * Results: *	A standard Tcl result. * * Side effects: *	See the user documentation. * *-------------------------------------------------------------- */intTk_MenubuttonCmd(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. */{    register TkMenuButton *mbPtr;    Tk_Window tkwin = (Tk_Window) clientData;    Tk_Window new;    if (argc < 2) {	Tcl_AppendResult(interp, "wrong # args: should be \"",		argv[0], " pathName ?options?\"", (char *) NULL);	return TCL_ERROR;    }    /*     * Create the new window.     */    new = Tk_CreateWindowFromPath(interp, tkwin, argv[1], (char *) NULL);    if (new == NULL) {	return TCL_ERROR;    }    Tk_SetClass(new, "Menubutton");    mbPtr = TkpCreateMenuButton(new);    TkSetClassProcs(new, &tkpMenubuttonClass, (ClientData) mbPtr);    /*     * Initialize the data structure for the button.     */    mbPtr->tkwin = new;    mbPtr->display = Tk_Display (new);    mbPtr->interp = interp;    mbPtr->widgetCmd = Tcl_CreateCommand(interp, Tk_PathName(mbPtr->tkwin),	    MenuButtonWidgetCmd, (ClientData) mbPtr, MenuButtonCmdDeletedProc);    mbPtr->menuName = NULL;    mbPtr->text = NULL;    mbPtr->underline = -1;    mbPtr->textVarName = NULL;    mbPtr->bitmap = None;    mbPtr->imageString = NULL;    mbPtr->image = NULL;    mbPtr->state = tkNormalUid;    mbPtr->normalBorder = NULL;    mbPtr->activeBorder = NULL;    mbPtr->borderWidth = 0;    mbPtr->relief = TK_RELIEF_FLAT;    mbPtr->highlightWidth = 0;    mbPtr->highlightBgColorPtr = NULL;    mbPtr->highlightColorPtr = NULL;    mbPtr->inset = 0;    mbPtr->tkfont = NULL;    mbPtr->normalFg = NULL;    mbPtr->activeFg = NULL;    mbPtr->disabledFg = NULL;    mbPtr->normalTextGC = None;    mbPtr->activeTextGC = None;    mbPtr->gray = None;    mbPtr->disabledGC = None;    mbPtr->leftBearing = 0;    mbPtr->rightBearing = 0;    mbPtr->widthString = NULL;    mbPtr->heightString = NULL;    mbPtr->width = 0;    mbPtr->width = 0;    mbPtr->wrapLength = 0;    mbPtr->padX = 0;    mbPtr->padY = 0;    mbPtr->anchor = TK_ANCHOR_CENTER;    mbPtr->justify = TK_JUSTIFY_CENTER;    mbPtr->textLayout = NULL;    mbPtr->indicatorOn = 0;    mbPtr->indicatorWidth = 0;    mbPtr->indicatorHeight = 0;    mbPtr->cursor = None;    mbPtr->takeFocus = NULL;    mbPtr->flags = 0;    if (aboveUid == NULL) {	aboveUid = Tk_GetUid("above");	belowUid = Tk_GetUid("below");	leftUid = Tk_GetUid("left");	rightUid = Tk_GetUid("right");	flushUid = Tk_GetUid("flush");    }    mbPtr->direction = flushUid;    Tk_CreateEventHandler(mbPtr->tkwin,	    ExposureMask|StructureNotifyMask|FocusChangeMask,	    MenuButtonEventProc, (ClientData) mbPtr);    if (ConfigureMenuButton(interp, mbPtr, argc-2, argv+2, 0) != TCL_OK) {	Tk_DestroyWindow(mbPtr->tkwin);	return TCL_ERROR;    }    interp->result = Tk_PathName(mbPtr->tkwin);    return TCL_OK;}/* *-------------------------------------------------------------- * * MenuButtonWidgetCmd -- * *	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 intMenuButtonWidgetCmd(clientData, interp, argc, argv)    ClientData clientData;	/* Information about button widget. */    Tcl_Interp *interp;		/* Current interpreter. */    int argc;			/* Number of arguments. */    char **argv;		/* Argument strings. */{    register TkMenuButton *mbPtr = (TkMenuButton *) clientData;    int result;    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) mbPtr);    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);	    result = TCL_ERROR;	} else {	    result = Tk_ConfigureValue(interp, mbPtr->tkwin, configSpecs,		    (char *) mbPtr, argv[2], 0);	}    } else if ((c == 'c') && (strncmp(argv[1], "configure", length) == 0)	    && (length >= 2)) {	if (argc == 2) {	    result = Tk_ConfigureInfo(interp, mbPtr->tkwin, configSpecs,		    (char *) mbPtr, (char *) NULL, 0);	} else if (argc == 3) {	    result = Tk_ConfigureInfo(interp, mbPtr->tkwin, configSpecs,		    (char *) mbPtr, argv[2], 0);	} else {	    result = ConfigureMenuButton(interp, mbPtr, argc-2, argv+2,		    TK_CONFIG_ARGV_ONLY);	}    } else {	Tcl_AppendResult(interp, "bad option \"", argv[1],		"\": must be cget or configure",		(char *) NULL);	result = TCL_ERROR;    }    Tcl_Release((ClientData) mbPtr);    return result;}/* *---------------------------------------------------------------------- * * DestroyMenuButton -- * *	This procedure is invoked to recycle all of the resources *	associated with a button widget.  It is invoked as a *	when-idle handler in order to make sure that there is no *	other use of the button pending at the time of the deletion. * * Results: *	None. * * Side effects: *	Everything associated with the widget is freed up. * *---------------------------------------------------------------------- */static voidDestroyMenuButton(memPtr)    char *memPtr;		/* Info about button widget. */{    register TkMenuButton *mbPtr = (TkMenuButton *) memPtr;    /*     * Free up all the stuff that requires special handling, then     * let Tk_FreeOptions handle all the standard option-related     * stuff.     */    if (mbPtr->textVarName != NULL) {	Tcl_UntraceVar(mbPtr->interp, mbPtr->textVarName,		TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,		MenuButtonTextVarProc, (ClientData) mbPtr);    }    if (mbPtr->image != NULL) {	Tk_FreeImage(mbPtr->image);    }    if (mbPtr->normalTextGC != None) {	Tk_FreeGC(mbPtr->display, mbPtr->normalTextGC);    }    if (mbPtr->activeTextGC != None) {	Tk_FreeGC(mbPtr->display, mbPtr->activeTextGC);    }    if (mbPtr->gray != None) {	Tk_FreeBitmap(mbPtr->display, mbPtr->gray);    }    if (mbPtr->disabledGC != None) {	Tk_FreeGC(mbPtr->display, mbPtr->disabledGC);    }    Tk_FreeTextLayout(mbPtr->textLayout);    Tk_FreeOptions(configSpecs, (char *) mbPtr, mbPtr->display, 0);    ckfree((char *) mbPtr);}/* *---------------------------------------------------------------------- * * ConfigureMenuButton -- * *	This procedure is called to process an argv/argc list, plus *	the Tk option database, in order to configure (or *	reconfigure) a menubutton widget. * * 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, such as text string, colors, font, *	etc. get set for mbPtr;  old resources get freed, if there *	were any.  The menubutton is redisplayed. * *---------------------------------------------------------------------- */static intConfigureMenuButton(interp, mbPtr, argc, argv, flags)    Tcl_Interp *interp;		/* Used for error reporting. */    register TkMenuButton *mbPtr;	/* Information about widget;  may or may				 * not already have values for some fields. */    int argc;			/* Number of valid entries in argv. */    char **argv;		/* Arguments. */    int flags;			/* Flags to pass to Tk_ConfigureWidget. */{    int result;    Tk_Image image;

⌨️ 快捷键说明

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