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

📄 tkmacscale.c

📁 linux系统下的音频通信
💻 C
📖 第 1 页 / 共 2 页
字号:
/*  * tkMacScale.c -- * *	This file implements the Macintosh specific portion of the  *	scale widget. * * Copyright (c) 1996 by 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: @(#) tkMacScale.c 1.3 96/10/17 13:16:18 */#include "tkScale.h"#include "tkInt.h"#include <Controls.h>#include "tkMacInt.h"/* * Defines used in this file. */#define slider		1110#define inSlider	1#define inInc		2#define inDecr		3/* * Declaration of Macintosh specific scale structure. */typedef struct MacScale {    TkScale info;		/* Generic scale info. */    int flags;			/* Flags. */    ControlRef scaleHandle;	/* Handle to the Scale control struct. */} MacScale;/* * Globals uses locally in this file. */static ControlActionUPP scaleActionProc = NULL; /* Pointer to func. *//* * Forward declarations for procedures defined later in this file: */static void		MacScaleEventProc _ANSI_ARGS_((ClientData clientData,			    XEvent *eventPtr));static pascal void	ScaleActionProc _ANSI_ARGS_((ControlRef theControl,			    ControlPartCode partCode));/* *---------------------------------------------------------------------- * * TkpCreateScale -- * *	Allocate a new TkScale structure. * * Results: *	Returns a newly allocated TkScale structure. * * Side effects: *	None. * *---------------------------------------------------------------------- */TkScale *TkpCreateScale(tkwin)    Tk_Window tkwin;{    MacScale *macScalePtr;;        macScalePtr = (MacScale *) ckalloc(sizeof(MacScale));    macScalePtr->scaleHandle = NULL;    if (scaleActionProc == NULL) {	scaleActionProc = NewControlActionProc(ScaleActionProc);    }        Tk_CreateEventHandler(tkwin, ButtonPressMask,	    MacScaleEventProc, (ClientData) macScalePtr);	        return (TkScale *) macScalePtr;}/* *---------------------------------------------------------------------- * * TkpDestroyScale -- * *	Free Macintosh specific resources. * * Results: *	None * * Side effects: *	The slider control is destroyed. * *---------------------------------------------------------------------- */voidTkpDestroyScale(scalePtr)    TkScale *scalePtr;{    MacScale *macScalePtr = (MacScale *) scalePtr;        /*     * Free Macintosh control.     */    if (macScalePtr->scaleHandle != NULL) {        DisposeControl(macScalePtr->scaleHandle);    }}/* *---------------------------------------------------------------------- * * TkpDisplayScale -- * *	This procedure is invoked as an idle handler to redisplay *	the contents of a scale widget. * * Results: *	None. * * Side effects: *	The scale gets redisplayed. * *---------------------------------------------------------------------- */voidTkpDisplayScale(clientData)    ClientData clientData;	/* Widget record for scale. */{    TkScale *scalePtr = (TkScale *) clientData;    Tk_Window tkwin = scalePtr->tkwin;    Tcl_Interp *interp = scalePtr->interp;    int result;    char string[PRINT_CHARS];    MacScale *macScalePtr = (MacScale *) clientData;    Rect r;    WindowRef windowRef;    GWorldPtr destPort;            CGrafPtr saveWorld;    GDHandle saveDevice;    MacDrawable *macDraw;        if ((scalePtr->tkwin == NULL) || !Tk_IsMapped(scalePtr->tkwin)) {	goto done;    }    /*     * Invoke the scale's command if needed.     */    Tcl_Preserve((ClientData) scalePtr);    if ((scalePtr->flags & INVOKE_COMMAND) && (scalePtr->command != NULL)) {	Tcl_Preserve((ClientData) interp);	sprintf(string, scalePtr->format, scalePtr->value);	result = Tcl_VarEval(interp, scalePtr->command,	" ", string,                             (char *) NULL);	if (result != TCL_OK) {	    Tcl_AddErrorInfo(interp, "\n    (command executed by scale)");	    Tcl_BackgroundError(interp);	}	Tcl_Release((ClientData) interp);    }    scalePtr->flags &= ~INVOKE_COMMAND;    if (scalePtr->tkwin == NULL) {	Tcl_Release((ClientData) scalePtr);	return;    }    Tcl_Release((ClientData) scalePtr);    /*     * Now handle the part of redisplay that is the same for     * horizontal and vertical scales:  border and traversal     * highlight.     */    if (scalePtr->highlightWidth != 0) {	GC gc;    	if (scalePtr->flags & GOT_FOCUS) {	    gc = Tk_GCForColor(scalePtr->highlightColorPtr, Tk_WindowId(tkwin));	} else {	    gc = Tk_GCForColor(scalePtr->highlightBgColorPtr, Tk_WindowId(tkwin));	}	Tk_DrawFocusHighlight(tkwin, gc, scalePtr->highlightWidth, Tk_WindowId(tkwin));    }    Tk_Draw3DRectangle(tkwin, Tk_WindowId(tkwin), scalePtr->bgBorder,	    scalePtr->highlightWidth, scalePtr->highlightWidth,	    Tk_Width(tkwin) - 2*scalePtr->highlightWidth,	    Tk_Height(tkwin) - 2*scalePtr->highlightWidth,	    scalePtr->borderWidth, scalePtr->relief);    /*     * Set up port for drawing Macintosh control.     */    macDraw = (MacDrawable *) Tk_WindowId(tkwin);    destPort = TkMacGetDrawablePort(Tk_WindowId(tkwin));    GetGWorld(&saveWorld, &saveDevice);    SetGWorld(destPort, NULL);    TkMacSetUpClippingRgn(Tk_WindowId(tkwin));    /*     * Create Macintosh control.     */    if (macScalePtr->scaleHandle == NULL) {        r.left = r.top = 0;        r.right = r.bottom = 1;        /* TODO: initial value. */        /* 16*slider+4 */	macScalePtr->scaleHandle = NewControl((WindowRef) destPort, 		&r, "\p", false, (short) 35, 0, 1000,		16*slider, (SInt32) macScalePtr);	/*	 * If we are foremost than make us active.	 */	if ((WindowPtr) destPort == FrontWindow()) {	    macScalePtr->flags |= ACTIVE;	}    }    windowRef  = (**macScalePtr->scaleHandle).contrlOwner;    /*     * We can't use the Macintosh commands SizeControl and MoveControl as these     * calls will also cause a redraw which in our case will also cause     * flicker.  To avoid this we adjust the control record directly.  The     * Draw1Control command appears to just draw where ever the control says to     * draw so this seems right.     *     * NOTE: changing the control record directly may not work when     * Apple releases the Copland version of the MacOS in late 1996.     */         (**macScalePtr->scaleHandle).contrlRect.left = macDraw->xOff + scalePtr->inset;    (**macScalePtr->scaleHandle).contrlRect.top = macDraw->yOff + scalePtr->inset;    (**macScalePtr->scaleHandle).contrlRect.right = macDraw->xOff + Tk_Width(tkwin)	- scalePtr->inset;    (**macScalePtr->scaleHandle).contrlRect.bottom = macDraw->yOff +	Tk_Height(tkwin) - scalePtr->inset;    /*     * Set the thumb and resolution etc.     */    (**macScalePtr->scaleHandle).contrlMin = (SInt16) scalePtr->toValue;    (**macScalePtr->scaleHandle).contrlMax = (SInt16) scalePtr->fromValue;    (**macScalePtr->scaleHandle).contrlValue = (SInt16) scalePtr->value;    /*     * Finally draw the control.     */    (**macScalePtr->scaleHandle).contrlVis = 255;    (**macScalePtr->scaleHandle).contrlHilite = 0;    Draw1Control(macScalePtr->scaleHandle);    SetGWorld(saveWorld, saveDevice);    done:    scalePtr->flags &= ~REDRAW_ALL;}/* *---------------------------------------------------------------------- * * TkpScaleElement -- * *	Determine which part of a scale widget lies under a given *	point. * * Results: *	The return value is either TROUGH1, SLIDER, TROUGH2, or *	OTHER, depending on which of the scale's active elements *	(if any) is under the point at (x,y). * * Side effects: *	None. * *---------------------------------------------------------------------- */intTkpScaleElement(scalePtr, x, y)    TkScale *scalePtr;		/* Widget record for scale. */    int x, y;			/* Coordinates within scalePtr's window. */{    MacScale *macScalePtr = (MacScale *) scalePtr;    ControlPartCode part;    Point where;    Rect bounds;    CGrafPtr saveWorld;    GDHandle saveDevice;    GWorldPtr destPort;            destPort = TkMacGetDrawablePort(Tk_WindowId(scalePtr->tkwin));    GetGWorld(&saveWorld, &saveDevice);    SetGWorld(destPort, NULL);

⌨️ 快捷键说明

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