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

📄 tkmenubutton.c

📁 linux系统下的音频通信
💻 C
📖 第 1 页 / 共 2 页
字号:
    /*     * Eliminate any existing trace on variables monitored by the menubutton.     */    if (mbPtr->textVarName != NULL) {	Tcl_UntraceVar(interp, mbPtr->textVarName,		TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,		MenuButtonTextVarProc, (ClientData) mbPtr);    }    result = Tk_ConfigureWidget(interp, mbPtr->tkwin, configSpecs,	    argc, argv, (char *) mbPtr, flags);    if (result != TCL_OK) {	return TCL_ERROR;    }    /*     * A few options need special processing, such as setting the     * background from a 3-D border, or filling in complicated     * defaults that couldn't be specified to Tk_ConfigureWidget.     */    if ((mbPtr->state == tkActiveUid) && !Tk_StrictMotif(mbPtr->tkwin)) {	Tk_SetBackgroundFromBorder(mbPtr->tkwin, mbPtr->activeBorder);    } else {	Tk_SetBackgroundFromBorder(mbPtr->tkwin, mbPtr->normalBorder);	if ((mbPtr->state != tkNormalUid) && (mbPtr->state != tkActiveUid)		&& (mbPtr->state != tkDisabledUid)) {	    Tcl_AppendResult(interp, "bad state value \"", mbPtr->state,		    "\": must be normal, active, or disabled", (char *) NULL);	    mbPtr->state = tkNormalUid;	    return TCL_ERROR;	}    }    if ((mbPtr->direction != aboveUid) && (mbPtr->direction != belowUid)	    && (mbPtr->direction != leftUid) && (mbPtr->direction != rightUid)	    && (mbPtr->direction != flushUid)) {	Tcl_AppendResult(interp, "bad direction value \"", mbPtr->direction,		"\": must be above, below, left, right, or flush",		(char *) NULL);	mbPtr->direction = belowUid;	return TCL_ERROR;    }        if (mbPtr->highlightWidth < 0) {	mbPtr->highlightWidth = 0;    }    if (mbPtr->padX < 0) {	mbPtr->padX = 0;    }    if (mbPtr->padY < 0) {	mbPtr->padY = 0;    }    /*     * Get the image for the widget, if there is one.  Allocate the     * new image before freeing the old one, so that the reference     * count doesn't go to zero and cause image data to be discarded.     */    if (mbPtr->imageString != NULL) {	image = Tk_GetImage(mbPtr->interp, mbPtr->tkwin,		mbPtr->imageString, MenuButtonImageProc, (ClientData) mbPtr);	if (image == NULL) {	    return TCL_ERROR;	}    } else {	image = NULL;    }    if (mbPtr->image != NULL) {	Tk_FreeImage(mbPtr->image);    }    mbPtr->image = image;    if ((mbPtr->image == NULL) && (mbPtr->bitmap == None)	    && (mbPtr->textVarName != NULL)) {	/*	 * The menubutton displays a variable.  Set up a trace to watch	 * for any changes in it.	 */	char *value;	value = Tcl_GetVar(interp, mbPtr->textVarName, TCL_GLOBAL_ONLY);	if (value == NULL) {	    Tcl_SetVar(interp, mbPtr->textVarName, mbPtr->text,		    TCL_GLOBAL_ONLY);	} else {	    if (mbPtr->text != NULL) {		ckfree(mbPtr->text);	    }	    mbPtr->text = (char *) ckalloc((unsigned) (strlen(value) + 1));	    strcpy(mbPtr->text, value);	}	Tcl_TraceVar(interp, mbPtr->textVarName,		TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,		MenuButtonTextVarProc, (ClientData) mbPtr);    }    /*     * Recompute the geometry for the button.     */    if ((mbPtr->bitmap != None) || (mbPtr->image != NULL)) {	if (Tk_GetPixels(interp, mbPtr->tkwin, mbPtr->widthString,		&mbPtr->width) != TCL_OK) {	    widthError:	    Tcl_AddErrorInfo(interp, "\n    (processing -width option)");	    return TCL_ERROR;	}	if (Tk_GetPixels(interp, mbPtr->tkwin, mbPtr->heightString,		&mbPtr->height) != TCL_OK) {	    heightError:	    Tcl_AddErrorInfo(interp, "\n    (processing -height option)");	    return TCL_ERROR;	}    } else {	if (Tcl_GetInt(interp, mbPtr->widthString, &mbPtr->width)		!= TCL_OK) {	    goto widthError;	}	if (Tcl_GetInt(interp, mbPtr->heightString, &mbPtr->height)		!= TCL_OK) {	    goto heightError;	}    }    TkMenuButtonWorldChanged((ClientData) mbPtr);    return TCL_OK;}/* *--------------------------------------------------------------------------- * * TkMenuButtonWorldChanged -- * *      This procedure is called when the world has changed in some *      way and the widget needs to recompute all its graphics contexts *	and determine its new geometry. * * Results: *      None. * * Side effects: *      TkMenuButton will be relayed out and redisplayed. * *--------------------------------------------------------------------------- */ voidTkMenuButtonWorldChanged(instanceData)    ClientData instanceData;	/* Information about widget. */{    XGCValues gcValues;    GC gc;    unsigned long mask;    TkMenuButton *mbPtr;    mbPtr = (TkMenuButton *) instanceData;    gcValues.font = Tk_FontId(mbPtr->tkfont);    gcValues.foreground = mbPtr->normalFg->pixel;    gcValues.background = Tk_3DBorderColor(mbPtr->normalBorder)->pixel;    /*     * Note: GraphicsExpose events are disabled in GC's because they're     * used to copy stuff from an off-screen pixmap onto the screen (we know     * that there's no problem with obscured areas).     */    gcValues.graphics_exposures = False;    mask = GCForeground | GCBackground | GCFont | GCGraphicsExposures;    gc = Tk_GetGC(mbPtr->tkwin, mask, &gcValues);    if (mbPtr->normalTextGC != None) {	Tk_FreeGC(mbPtr->display, mbPtr->normalTextGC);    }    mbPtr->normalTextGC = gc;    gcValues.font = Tk_FontId(mbPtr->tkfont);    gcValues.foreground = mbPtr->activeFg->pixel;    gcValues.background = Tk_3DBorderColor(mbPtr->activeBorder)->pixel;    mask = GCForeground | GCBackground | GCFont;    gc = Tk_GetGC(mbPtr->tkwin, mask, &gcValues);    if (mbPtr->activeTextGC != None) {	Tk_FreeGC(mbPtr->display, mbPtr->activeTextGC);    }    mbPtr->activeTextGC = gc;    gcValues.font = Tk_FontId(mbPtr->tkfont);    gcValues.background = Tk_3DBorderColor(mbPtr->normalBorder)->pixel;    if ((mbPtr->disabledFg != NULL) && (mbPtr->imageString == NULL)) {	gcValues.foreground = mbPtr->disabledFg->pixel;	mask = GCForeground | GCBackground | GCFont;    } else {	gcValues.foreground = gcValues.background;	mask = GCForeground;	if (mbPtr->gray == None) {	    mbPtr->gray = Tk_GetBitmap(NULL, mbPtr->tkwin,		    Tk_GetUid("gray50"));	}	if (mbPtr->gray != None) {	    gcValues.fill_style = FillStippled;	    gcValues.stipple = mbPtr->gray;	    mask |= GCFillStyle | GCStipple;	}    }    gc = Tk_GetGC(mbPtr->tkwin, mask, &gcValues);    if (mbPtr->disabledGC != None) {	Tk_FreeGC(mbPtr->display, mbPtr->disabledGC);    }    mbPtr->disabledGC = gc;    TkpComputeMenuButtonGeometry(mbPtr);    /*     * Lastly, arrange for the button to be redisplayed.     */    if (Tk_IsMapped(mbPtr->tkwin) && !(mbPtr->flags & REDRAW_PENDING)) {	Tcl_DoWhenIdle(TkpDisplayMenuButton, (ClientData) mbPtr);	mbPtr->flags |= REDRAW_PENDING;    }}/* *-------------------------------------------------------------- * * MenuButtonEventProc -- * *	This procedure is invoked by the Tk dispatcher for various *	events on buttons. * * Results: *	None. * * Side effects: *	When the window gets deleted, internal structures get *	cleaned up.  When it gets exposed, it is redisplayed. * *-------------------------------------------------------------- */static voidMenuButtonEventProc(clientData, eventPtr)    ClientData clientData;	/* Information about window. */    XEvent *eventPtr;		/* Information about event. */{    TkMenuButton *mbPtr = (TkMenuButton *) clientData;    if ((eventPtr->type == Expose) && (eventPtr->xexpose.count == 0)) {	goto redraw;    } else if (eventPtr->type == ConfigureNotify) {	/*	 * Must redraw after size changes, since layout could have changed	 * and borders will need to be redrawn.	 */	goto redraw;    } else if (eventPtr->type == DestroyNotify) {	TkpDestroyMenuButton(mbPtr);	if (mbPtr->tkwin != NULL) {	    mbPtr->tkwin = NULL;	    Tcl_DeleteCommandFromToken(mbPtr->interp, mbPtr->widgetCmd);	}	if (mbPtr->flags & REDRAW_PENDING) {	    Tcl_CancelIdleCall(TkpDisplayMenuButton, (ClientData) mbPtr);	}	Tcl_EventuallyFree((ClientData) mbPtr, DestroyMenuButton);    } else if (eventPtr->type == FocusIn) {	if (eventPtr->xfocus.detail != NotifyInferior) {	    mbPtr->flags |= GOT_FOCUS;	    if (mbPtr->highlightWidth > 0) {		goto redraw;	    }	}    } else if (eventPtr->type == FocusOut) {	if (eventPtr->xfocus.detail != NotifyInferior) {	    mbPtr->flags &= ~GOT_FOCUS;	    if (mbPtr->highlightWidth > 0) {		goto redraw;	    }	}    }    return;    redraw:    if ((mbPtr->tkwin != NULL) && !(mbPtr->flags & REDRAW_PENDING)) {	Tcl_DoWhenIdle(TkpDisplayMenuButton, (ClientData) mbPtr);	mbPtr->flags |= REDRAW_PENDING;    }}/* *---------------------------------------------------------------------- * * MenuButtonCmdDeletedProc -- * *	This procedure is invoked when a widget command is deleted.  If *	the widget isn't already in the process of being destroyed, *	this command destroys it. * * Results: *	None. * * Side effects: *	The widget is destroyed. * *---------------------------------------------------------------------- */static voidMenuButtonCmdDeletedProc(clientData)    ClientData clientData;	/* Pointer to widget record for widget. */{    TkMenuButton *mbPtr = (TkMenuButton *) clientData;    Tk_Window tkwin = mbPtr->tkwin;    /*     * This procedure could be invoked either because the window was     * destroyed and the command was then deleted (in which case tkwin     * is NULL) or because the command was deleted, and then this procedure     * destroys the widget.     */    if (tkwin != NULL) {	mbPtr->tkwin = NULL;	Tk_DestroyWindow(tkwin);    }}/* *-------------------------------------------------------------- * * MenuButtonTextVarProc -- * *	This procedure is invoked when someone changes the variable *	whose contents are to be displayed in a menu button. * * Results: *	NULL is always returned. * * Side effects: *	The text displayed in the menu button will change to match the *	variable. * *-------------------------------------------------------------- */	/* ARGSUSED */static char *MenuButtonTextVarProc(clientData, interp, name1, name2, flags)    ClientData clientData;	/* Information about button. */    Tcl_Interp *interp;		/* Interpreter containing variable. */    char *name1;		/* Name of variable. */    char *name2;		/* Second part of variable name. */    int flags;			/* Information about what happened. */{    register TkMenuButton *mbPtr = (TkMenuButton *) clientData;    char *value;    /*     * If the variable is unset, then immediately recreate it unless     * the whole interpreter is going away.     */    if (flags & TCL_TRACE_UNSETS) {	if ((flags & TCL_TRACE_DESTROYED) && !(flags & TCL_INTERP_DESTROYED)) {	    Tcl_SetVar(interp, mbPtr->textVarName, mbPtr->text,		    TCL_GLOBAL_ONLY);	    Tcl_TraceVar(interp, mbPtr->textVarName,		    TCL_GLOBAL_ONLY|TCL_TRACE_WRITES|TCL_TRACE_UNSETS,		    MenuButtonTextVarProc, clientData);	}	return (char *) NULL;    }    value = Tcl_GetVar(interp, mbPtr->textVarName, TCL_GLOBAL_ONLY);    if (value == NULL) {	value = "";    }    if (mbPtr->text != NULL) {	ckfree(mbPtr->text);    }    mbPtr->text = (char *) ckalloc((unsigned) (strlen(value) + 1));    strcpy(mbPtr->text, value);    TkpComputeMenuButtonGeometry(mbPtr);    if ((mbPtr->tkwin != NULL) && Tk_IsMapped(mbPtr->tkwin)	    && !(mbPtr->flags & REDRAW_PENDING)) {	Tcl_DoWhenIdle(TkpDisplayMenuButton, (ClientData) mbPtr);	mbPtr->flags |= REDRAW_PENDING;    }    return (char *) NULL;}/* *---------------------------------------------------------------------- * * MenuButtonImageProc -- * *	This procedure is invoked by the image code whenever the manager *	for an image does something that affects the size of contents *	of an image displayed in a button. * * Results: *	None. * * Side effects: *	Arranges for the button to get redisplayed. * *---------------------------------------------------------------------- */static voidMenuButtonImageProc(clientData, x, y, width, height, imgWidth, imgHeight)    ClientData clientData;		/* Pointer to widget record. */    int x, y;				/* Upper left pixel (within image)					 * that must be redisplayed. */    int width, height;			/* Dimensions of area to redisplay					 * (may be <= 0). */    int imgWidth, imgHeight;		/* New dimensions of image. */{    register TkMenuButton *mbPtr = (TkMenuButton *) clientData;    if (mbPtr->tkwin != NULL) {	TkpComputeMenuButtonGeometry(mbPtr);	if (Tk_IsMapped(mbPtr->tkwin) && !(mbPtr->flags & REDRAW_PENDING)) {	    Tcl_DoWhenIdle(TkpDisplayMenuButton, (ClientData) mbPtr);	    mbPtr->flags |= REDRAW_PENDING;	}    }}

⌨️ 快捷键说明

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