diff -rcN -x *.obj generic/tkSquare.c.org generic/tkSquare.c *** generic/tkSquare.c.org Mon Oct 15 12:54:54 2001 --- generic/tkSquare.c Mon Oct 15 13:06:33 2001 *************** *** 34,39 **** --- 34,40 ---- Tcl_Command widgetCmd; /* Token for square's widget command. */ Tk_OptionTable optionTable; /* Token representing the configuration * specifications. */ + Tk_Style style; /* Style currently applied. */ Tcl_Obj *xPtr, *yPtr; /* Position of square's upper-left corner * within widget. */ int x, y; *************** *** 85,90 **** --- 86,93 ---- "raised", Tk_Offset(Square, reliefPtr), -1}, {TK_OPTION_PIXELS, "-size", "size", "Size", "20", Tk_Offset(Square, sizeObjPtr), -1}, + {TK_OPTION_STYLE, "-style", "style", "Style", + "", -1, Tk_Offset(Square, style)}, {TK_OPTION_END} }; *************** *** 106,111 **** --- 109,191 ---- XEvent *eventPtr)); static int SquareWidgetCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *, int objc, Tcl_Obj * CONST objv[])); + + /* + * Square element. + */ + + Tk_GetElementSizeProc SquareElementGetSize; + Tk_GetElementBoxProc SquareElementGetBox; + Tk_GetElementBorderWidthProc SquareElementGetBorderWidth; + Tk_DrawElementProc SquareElementDraw; + + enum { + SQUARE_ELEMENT_FOREGROUND, + SQUARE_ELEMENT_BORDERWIDTH, + SQUARE_ELEMENT_POSX, + SQUARE_ELEMENT_POSY, + SQUARE_ELEMENT_SIZE + } squareElementOption; + + Tk_ElementOptionSpec squareElementOptions[] = { + {"-foreground", TK_OPTION_BORDER}, + {"-borderwidth", TK_OPTION_PIXELS}, + {"-posx", TK_OPTION_PIXELS}, + {"-posy", TK_OPTION_PIXELS}, + {"-size", TK_OPTION_PIXELS}, + {NULL} + }; + Tk_ElementSpec squareElementSpec = { + /* Options. */ + squareElementOptions, + + /* Hooks. */ + SquareElementGetSize, /* getSize */ + SquareElementGetBox, /* getBox */ + SquareElementGetBorderWidth, /* getBorderWidth */ + SquareElementDraw /* draw */ + }; + + int squareElementId; + + + /* + * Variant of square element with fixed border width (used by instances of the + * "fixedborder" engine). + */ + + Tk_GetElementSizeProc FSquareElementGetSize; + Tk_GetElementBoxProc FSquareElementGetBox; + Tk_GetElementBorderWidthProc FSquareElementGetBorderWidth; + Tk_DrawElementProc FSquareElementDraw; + + enum { + FIXED_SQUARE_ELEMENT_FOREGROUND, + FIXED_SQUARE_ELEMENT_POSX, + FIXED_SQUARE_ELEMENT_POSY, + FIXED_SQUARE_ELEMENT_SIZE + } fSquareElementOption; + + Tk_ElementOptionSpec fSquareElementOptions[] = { + {"-foreground", TK_OPTION_BORDER}, + {"-posx", TK_OPTION_PIXELS}, + {"-posy", TK_OPTION_PIXELS}, + {"-size", TK_OPTION_PIXELS}, + {NULL} + }; + Tk_ElementSpec fSquareElementSpec = { + /* Options. */ + fSquareElementOptions, + + /* Hooks. */ + FSquareElementGetSize, /* getSize */ + FSquareElementGetBox, /* getBox */ + FSquareElementGetBorderWidth, /* getBorderWidth */ + FSquareElementDraw /* draw */ + }; + + + /* *-------------------------------------------------------------- *************** *** 170,175 **** --- 250,256 ---- */ squarePtr = (Square *) ckalloc(sizeof(Square)); + squarePtr->tkwin = tkwin; squarePtr->display = Tk_Display(tkwin); squarePtr->interp = interp; *************** *** 189,194 **** --- 270,276 ---- squarePtr->doubleBufferPtr = NULL; squarePtr->updatePending = 0; squarePtr->optionTable = optionTable; + squarePtr->style = NULL; if (Tk_InitOptions(interp, (char *) squarePtr, optionTable, tkwin) != TCL_OK) { *************** *** 500,507 **** Pixmap pm = None; Drawable d; int borderWidth, size, relief; ! Tk_3DBorder bgBorder, fgBorder; int doubleBuffer; squarePtr->updatePending = 0; if (!Tk_IsMapped(tkwin)) { --- 582,590 ---- Pixmap pm = None; Drawable d; int borderWidth, size, relief; ! Tk_3DBorder bgBorder; int doubleBuffer; + Tk_StyledElement squareElement; squarePtr->updatePending = 0; if (!Tk_IsMapped(tkwin)) { *************** *** 539,548 **** */ Tk_GetPixelsFromObj(NULL, squarePtr->tkwin, squarePtr->sizeObjPtr, &size); ! fgBorder = Tk_Get3DBorderFromObj(squarePtr->tkwin, ! squarePtr->fgBorderPtr); ! Tk_Fill3DRectangle(tkwin, d, fgBorder, squarePtr->x, squarePtr->y, size, ! size, borderWidth, TK_RELIEF_RAISED); /* * If double-buffered, copy to the screen and release the pixmap. --- 622,631 ---- */ Tk_GetPixelsFromObj(NULL, squarePtr->tkwin, squarePtr->sizeObjPtr, &size); ! squareElement = Tk_GetStyledElement(squarePtr->style, squareElementId, ! squarePtr->optionTable); ! Tk_DrawElement(squarePtr->style, squareElement, (char *) squarePtr, ! squarePtr->tkwin, d, squarePtr->x, squarePtr->y, size, size, 0); /* * If double-buffered, copy to the screen and release the pixmap. *************** *** 634,637 **** --- 717,953 ---- if (squarePtr->y < bd) { squarePtr->y = bd; } + } + + int + GetPixelsFromWidget(tkwin, recordPtr, specPtr, intPtr) + Tk_Window tkwin; + char *recordPtr; + CONST Tk_OptionSpec *specPtr; + int *intPtr; + { + if (specPtr) { + if (specPtr->internalOffset != -1) { + *intPtr = *(int *) (recordPtr+specPtr->internalOffset); + return TCL_OK; + } else if (specPtr->objOffset != -1) { + return Tk_GetPixelsFromObj(NULL, tkwin, + *(Tcl_Obj **) (recordPtr+specPtr->objOffset), + intPtr); + } + } + return TCL_ERROR; + } + + int + Get3DBorderFromWidget(tkwin, recordPtr, specPtr, borderPtr) + Tk_Window tkwin; + char *recordPtr; + CONST Tk_OptionSpec *specPtr; + Tk_3DBorder *borderPtr; + { + if (specPtr) { + if (specPtr->internalOffset != -1) { + *borderPtr = *(Tk_3DBorder *) (recordPtr+specPtr->internalOffset); + return TCL_OK; + } else if (specPtr->objOffset != -1) { + *borderPtr = Tk_Get3DBorderFromObj(tkwin, + *(Tcl_Obj **) (recordPtr+specPtr->objOffset)); + return TCL_OK; + } + } + return TCL_ERROR; + } + + + + void + SquareInit(interp) + Tcl_Interp *interp; + { + Tk_StyleEngine engine; + + /* + * Register the default square element implementation. + */ + + squareElementId = Tk_RegisterStyledElement(NULL, "Square.square", + &squareElementSpec); + + /* + * Create a new "flat" style engine derived from the default engine, and + * register a new square element implementation. + */ + + engine = Tk_RegisterStyleEngine("fixedborder", NULL); + Tk_RegisterStyledElement(engine, "Square.square", &fSquareElementSpec); + + /* + * Create various instances of the "fixedborder" engine. The client data + * gives the fixed border width in pixels. + */ + + Tk_CreateStyle("flat", engine, (ClientData) 0); + Tk_CreateStyle("border2", engine, (ClientData) 2); + Tk_CreateStyle("border4", engine, (ClientData) 4); + Tk_CreateStyle("border8", engine, (ClientData) 8); + } + + void + SquareElementGetSize(clientData, recordPtr, optionsPtr, tkwin, width, height, + inner, widthPtr, heightPtr) + ClientData clientData; + char *recordPtr; + CONST Tk_OptionSpec **optionsPtr; + Tk_Window tkwin; + int width, height; + int inner; + int *widthPtr, *heightPtr; + { + } + + void + SquareElementGetBox(clientData, recordPtr, optionsPtr, tkwin, x, y, width, + height, inner, xPtr, yPtr, widthPtr, heightPtr) + ClientData clientData; + char *recordPtr; + CONST Tk_OptionSpec **optionsPtr; + Tk_Window tkwin; + int x, y; + int width, height; + int inner; + int *xPtr, *yPtr; + int *widthPtr, *heightPtr; + { + } + + int + SquareElementGetBorderWidth(clientData, recordPtr, optionsPtr, tkwin) + ClientData clientData; + char *recordPtr; + CONST Tk_OptionSpec **optionsPtr; + Tk_Window tkwin; + { + int borderWidth = 0; + + /* TODO: quick shortcut % optionTable. */ + GetPixelsFromWidget(tkwin, recordPtr, + optionsPtr[SQUARE_ELEMENT_BORDERWIDTH], &borderWidth); + return borderWidth; + } + + void + SquareElementDraw(clientData, recordPtr, optionsPtr, tkwin, d, x, y, width, + height, state) + ClientData clientData; + char *recordPtr; + CONST Tk_OptionSpec **optionsPtr; + Tk_Window tkwin; + Drawable d; + int x, y; + int width, height; + int state; + { + int borderWidth = 0; + Tk_3DBorder fgBorder = NULL; + + /* TODO: quick shortcut % optionTable. */ + + /* + * Get option values. + */ + + /* Foreground border. */ + Get3DBorderFromWidget(tkwin, recordPtr, + optionsPtr[SQUARE_ELEMENT_FOREGROUND], &fgBorder); + if (!fgBorder) { + /* + * No border to draw. + */ + + return; + } + + /* Border width. */ + GetPixelsFromWidget(tkwin, recordPtr, + optionsPtr[SQUARE_ELEMENT_BORDERWIDTH], &borderWidth); + + Tk_Fill3DRectangle(tkwin, d, fgBorder, x, y, width, height, borderWidth, + TK_RELIEF_RAISED); + } + + void + FSquareElementGetSize(clientData, recordPtr, optionsPtr, tkwin, width, height, + inner, widthPtr, heightPtr) + ClientData clientData; + char *recordPtr; + CONST Tk_OptionSpec **optionsPtr; + Tk_Window tkwin; + int width, height; + int inner; + int *widthPtr, *heightPtr; + { + } + + void + FSquareElementGetBox(clientData, recordPtr, optionsPtr, tkwin, x, y, width, + height, inner, xPtr, yPtr, widthPtr, heightPtr) + ClientData clientData; + char *recordPtr; + CONST Tk_OptionSpec **optionsPtr; + Tk_Window tkwin; + int x, y; + int width, height; + int inner; + int *xPtr, *yPtr; + int *widthPtr, *heightPtr; + { + } + + int + FSquareElementGetBorderWidth(clientData, recordPtr, optionsPtr, tkwin) + ClientData clientData; + char *recordPtr; + CONST Tk_OptionSpec **optionsPtr; + Tk_Window tkwin; + { + int borderWidth = (int) clientData; + + return borderWidth; + } + + void + FSquareElementDraw(clientData, recordPtr, optionsPtr, tkwin, d, x, y, width, + height, state) + ClientData clientData; + char *recordPtr; + CONST Tk_OptionSpec **optionsPtr; + Tk_Window tkwin; + Drawable d; + int x, y; + int width, height; + int state; + { + int borderWidth = (int) clientData; + Tk_3DBorder fgBorder = NULL; + + /* TODO: quick shortcut % optionTable. */ + + /* + * Get option values. + */ + + /* Foreground border. */ + Get3DBorderFromWidget(tkwin, recordPtr, + optionsPtr[FIXED_SQUARE_ELEMENT_FOREGROUND], &fgBorder); + if (!fgBorder) { + /* + * No border to draw. + */ + + return; + } + + Tk_Fill3DRectangle(tkwin, d, fgBorder, x, y, width, height, borderWidth, + TK_RELIEF_RAISED); } diff -rcN -x *.obj generic/tkTest.c.org generic/tkTest.c *** generic/tkTest.c.org Mon Oct 30 20:04:16 2000 --- generic/tkTest.c Thu Oct 11 12:46:21 2001 *************** *** 109,119 **** /* First in list of all new interpreters. */ /* ! * Declaration for the square widget's class command procedure: */ extern int SquareObjCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj * CONST objv[])); typedef struct CBinding { Tcl_Interp *interp; --- 109,120 ---- /* First in list of all new interpreters. */ /* ! * Declaration for the square widget's init and class command procedure: */ extern int SquareObjCmd _ANSI_ARGS_((ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj * CONST objv[])); + extern void SquareInit _ANSI_ARGS_((Tcl_Interp *interp)); typedef struct CBinding { Tcl_Interp *interp; *************** *** 260,265 **** --- 261,267 ---- return TCL_ERROR; } + SquareInit(interp); Tcl_CreateObjCommand(interp, "square", SquareObjCmd, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateCommand(interp, "testcbind", TestcbindCmd,