diff options
Diffstat (limited to 'tk8.6/generic/ttk/ttkDefaultTheme.c')
-rw-r--r-- | tk8.6/generic/ttk/ttkDefaultTheme.c | 1136 |
1 files changed, 0 insertions, 1136 deletions
diff --git a/tk8.6/generic/ttk/ttkDefaultTheme.c b/tk8.6/generic/ttk/ttkDefaultTheme.c deleted file mode 100644 index 4a06192..0000000 --- a/tk8.6/generic/ttk/ttkDefaultTheme.c +++ /dev/null @@ -1,1136 +0,0 @@ -/* - * Copyright (c) 2003, Joe English - * - * Tk alternate theme, intended to match the MSUE and Gtk's (old) default theme - */ - -#include <math.h> -#include <string.h> - -#include <tkInt.h> -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include "ttkTheme.h" - -#if defined(_WIN32) -static const int WIN32_XDRAWLINE_HACK = 1; -#else -static const int WIN32_XDRAWLINE_HACK = 0; -#endif - -#define BORDERWIDTH 2 -#define SCROLLBAR_WIDTH 14 -#define MIN_THUMB_SIZE 8 - -/* - *---------------------------------------------------------------------- - * - * Helper routines for border drawing: - * - * NOTE: MSUE specifies a slightly different arrangement - * for button borders than for other elements; "shadowColors" - * is for button borders. - * - * Please excuse the gross misspelling "LITE" for "LIGHT", - * but it makes things line up nicer. - */ - -enum BorderColor { FLAT = 1, LITE = 2, DARK = 3, BRDR = 4 }; - -/* top-left outer, top-left inner, bottom-right inner, bottom-right outer */ -static int const shadowColors[6][4] = { - { FLAT, FLAT, FLAT, FLAT }, /* TK_RELIEF_FLAT = 0*/ - { DARK, LITE, DARK, LITE }, /* TK_RELIEF_GROOVE = 1*/ - { LITE, FLAT, DARK, BRDR }, /* TK_RELIEF_RAISED = 2*/ - { LITE, DARK, LITE, DARK }, /* TK_RELIEF_RIDGE = 3*/ - { BRDR, BRDR, BRDR, BRDR }, /* TK_RELIEF_SOLID = 4*/ - { BRDR, DARK, FLAT, LITE } /* TK_RELIEF_SUNKEN = 5*/ -}; - -/* top-left, bottom-right */ -static int const thinShadowColors[6][4] = { - { FLAT, FLAT }, /* TK_RELIEF_FLAT = 0*/ - { DARK, LITE }, /* TK_RELIEF_GROOVE = 1*/ - { LITE, DARK }, /* TK_RELIEF_RAISED = 2*/ - { LITE, DARK }, /* TK_RELIEF_RIDGE = 3*/ - { BRDR, BRDR }, /* TK_RELIEF_SOLID = 4*/ - { DARK, LITE } /* TK_RELIEF_SUNKEN = 5*/ -}; - -static void DrawCorner( - Tk_Window tkwin, - Drawable d, - Tk_3DBorder border, /* get most GCs from here... */ - GC borderGC, /* "window border" color GC */ - int x,int y, int width,int height, /* where to draw */ - int corner, /* 0 => top left; 1 => bottom right */ - enum BorderColor color) -{ - XPoint points[3]; - GC gc; - - --width; --height; - points[0].x = x; points[0].y = y+height; - points[1].x = x+width*corner; points[1].y = y+height*corner; - points[2].x = x+width; points[2].y = y; - - if (color == BRDR) - gc = borderGC; - else - gc = Tk_3DBorderGC(tkwin, border, (int)color); - - XDrawLines(Tk_Display(tkwin), d, gc, points, 3, CoordModeOrigin); -} - -static void DrawBorder( - Tk_Window tkwin, Drawable d, Tk_3DBorder border, XColor *borderColor, - Ttk_Box b, int borderWidth, int relief) -{ - GC borderGC = Tk_GCForColor(borderColor, d); - - switch (borderWidth) { - case 2: /* "thick" border */ - DrawCorner(tkwin, d, border, borderGC, - b.x, b.y, b.width, b.height, 0,shadowColors[relief][0]); - DrawCorner(tkwin, d, border, borderGC, - b.x+1, b.y+1, b.width-2, b.height-2, 0,shadowColors[relief][1]); - DrawCorner(tkwin, d, border, borderGC, - b.x+1, b.y+1, b.width-2, b.height-2, 1,shadowColors[relief][2]); - DrawCorner(tkwin, d, border, borderGC, - b.x, b.y, b.width, b.height, 1,shadowColors[relief][3]); - break; - case 1: /* "thin" border */ - DrawCorner(tkwin, d, border, borderGC, - b.x, b.y, b.width, b.height, 0, thinShadowColors[relief][0]); - DrawCorner(tkwin, d, border, borderGC, - b.x, b.y, b.width, b.height, 1, thinShadowColors[relief][1]); - break; - case 0: /* no border -- do nothing */ - break; - default: /* Fall back to Motif-style borders: */ - Tk_Draw3DRectangle(tkwin, d, border, - b.x, b.y, b.width, b.height, borderWidth,relief); - break; - } -} - -/* Alternate shadow colors for entry fields: - * NOTE: FLAT color is normally white, and the LITE color is a darker shade. - */ -static int fieldShadowColors[4] = { DARK, BRDR, LITE, FLAT }; - -static void DrawFieldBorder( - Tk_Window tkwin, Drawable d, Tk_3DBorder border, XColor *borderColor, - Ttk_Box b) -{ - GC borderGC = Tk_GCForColor(borderColor, d); - DrawCorner(tkwin, d, border, borderGC, - b.x, b.y, b.width, b.height, 0,fieldShadowColors[0]); - DrawCorner(tkwin, d, border, borderGC, - b.x+1, b.y+1, b.width-2, b.height-2, 0,fieldShadowColors[1]); - DrawCorner(tkwin, d, border, borderGC, - b.x+1, b.y+1, b.width-2, b.height-2, 1,fieldShadowColors[2]); - DrawCorner(tkwin, d, border, borderGC, - b.x, b.y, b.width, b.height, 1,fieldShadowColors[3]); - return; -} - -/* - * ArrowPoints -- - * Compute points of arrow polygon. - */ -static void ArrowPoints(Ttk_Box b, ArrowDirection dir, XPoint points[4]) -{ - int cx, cy, h; - - switch (dir) { - case ARROW_UP: - h = (b.width - 1)/2; - cx = b.x + h; - cy = b.y; - if (b.height <= h) h = b.height - 1; - points[0].x = cx; points[0].y = cy; - points[1].x = cx - h; points[1].y = cy + h; - points[2].x = cx + h; points[2].y = cy + h; - break; - case ARROW_DOWN: - h = (b.width - 1)/2; - cx = b.x + h; - cy = b.y + b.height - 1; - if (b.height <= h) h = b.height - 1; - points[0].x = cx; points[0].y = cy; - points[1].x = cx - h; points[1].y = cy - h; - points[2].x = cx + h; points[2].y = cy - h; - break; - case ARROW_LEFT: - h = (b.height - 1)/2; - cx = b.x; - cy = b.y + h; - if (b.width <= h) h = b.width - 1; - points[0].x = cx; points[0].y = cy; - points[1].x = cx + h; points[1].y = cy - h; - points[2].x = cx + h; points[2].y = cy + h; - break; - case ARROW_RIGHT: - h = (b.height - 1)/2; - cx = b.x + b.width - 1; - cy = b.y + h; - if (b.width <= h) h = b.width - 1; - points[0].x = cx; points[0].y = cy; - points[1].x = cx - h; points[1].y = cy - h; - points[2].x = cx - h; points[2].y = cy + h; - break; - } - - points[3].x = points[0].x; - points[3].y = points[0].y; -} - -/*public*/ -void TtkArrowSize(int h, ArrowDirection dir, int *widthPtr, int *heightPtr) -{ - switch (dir) { - case ARROW_UP: - case ARROW_DOWN: *widthPtr = 2*h+1; *heightPtr = h+1; break; - case ARROW_LEFT: - case ARROW_RIGHT: *widthPtr = h+1; *heightPtr = 2*h+1; - } -} - -/* - * TtkDrawArrow, TtkFillArrow -- - * Draw an arrow in the indicated direction inside the specified box. - */ -/*public*/ -void TtkFillArrow( - Display *display, Drawable d, GC gc, Ttk_Box b, ArrowDirection dir) -{ - XPoint points[4]; - ArrowPoints(b, dir, points); - XFillPolygon(display, d, gc, points, 3, Convex, CoordModeOrigin); - XDrawLines(display, d, gc, points, 4, CoordModeOrigin); - - /* Work around bug [77527326e5] - ttk artifacts on Ubuntu */ - XDrawPoint(display, d, gc, points[2].x, points[2].y); -} - -/*public*/ -void TtkDrawArrow( - Display *display, Drawable d, GC gc, Ttk_Box b, ArrowDirection dir) -{ - XPoint points[4]; - ArrowPoints(b, dir, points); - XDrawLines(display, d, gc, points, 4, CoordModeOrigin); - - /* Work around bug [77527326e5] - ttk artifacts on Ubuntu */ - XDrawPoint(display, d, gc, points[2].x, points[2].y); -} - -/* - *---------------------------------------------------------------------- - * +++ Border element implementation. - * - * This border consists of (from outside-in): - * - * + a 1-pixel thick default indicator (defaultable widgets only) - * + 1- or 2- pixel shaded border (controlled by -background and -relief) - * + 1 pixel padding (???) - */ - -typedef struct { - Tcl_Obj *borderObj; - Tcl_Obj *borderColorObj; /* Extra border color */ - Tcl_Obj *borderWidthObj; - Tcl_Obj *reliefObj; - Tcl_Obj *defaultStateObj; /* for buttons */ -} BorderElement; - -static Ttk_ElementOptionSpec BorderElementOptions[] = { - { "-background", TK_OPTION_BORDER, Tk_Offset(BorderElement,borderObj), - DEFAULT_BACKGROUND }, - { "-bordercolor",TK_OPTION_COLOR, - Tk_Offset(BorderElement,borderColorObj), "black" }, - { "-default", TK_OPTION_ANY, Tk_Offset(BorderElement,defaultStateObj), - "disabled" }, - { "-borderwidth",TK_OPTION_PIXELS,Tk_Offset(BorderElement,borderWidthObj), - STRINGIFY(BORDERWIDTH) }, - { "-relief", TK_OPTION_RELIEF, Tk_Offset(BorderElement,reliefObj), - "flat" }, - { NULL, 0, 0, NULL } -}; - -static void BorderElementSize( - void *clientData, void *elementRecord, Tk_Window tkwin, - int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr) -{ - BorderElement *bd = elementRecord; - int borderWidth = 0; - int defaultState = TTK_BUTTON_DEFAULT_DISABLED; - - Tcl_GetIntFromObj(NULL, bd->borderWidthObj, &borderWidth); - Ttk_GetButtonDefaultStateFromObj(NULL, bd->defaultStateObj, &defaultState); - - if (defaultState != TTK_BUTTON_DEFAULT_DISABLED) { - ++borderWidth; - } - - *paddingPtr = Ttk_UniformPadding((short)borderWidth); -} - -static void BorderElementDraw( - void *clientData, void *elementRecord, - Tk_Window tkwin, Drawable d, Ttk_Box b, unsigned int state) -{ - BorderElement *bd = elementRecord; - Tk_3DBorder border = Tk_Get3DBorderFromObj(tkwin, bd->borderObj); - XColor *borderColor = Tk_GetColorFromObj(tkwin, bd->borderColorObj); - int borderWidth = 2; - int relief = TK_RELIEF_FLAT; - int defaultState = TTK_BUTTON_DEFAULT_DISABLED; - - /* - * Get option values. - */ - Tcl_GetIntFromObj(NULL, bd->borderWidthObj, &borderWidth); - Tk_GetReliefFromObj(NULL, bd->reliefObj, &relief); - Ttk_GetButtonDefaultStateFromObj(NULL, bd->defaultStateObj, &defaultState); - - if (defaultState == TTK_BUTTON_DEFAULT_ACTIVE) { - GC gc = Tk_GCForColor(borderColor, d); - XDrawRectangle(Tk_Display(tkwin), d, gc, - b.x, b.y, b.width-1, b.height-1); - } - if (defaultState != TTK_BUTTON_DEFAULT_DISABLED) { - /* Space for default ring: */ - b = Ttk_PadBox(b, Ttk_UniformPadding(1)); - } - - DrawBorder(tkwin, d, border, borderColor, b, borderWidth, relief); -} - -static Ttk_ElementSpec BorderElementSpec = { - TK_STYLE_VERSION_2, - sizeof(BorderElement), - BorderElementOptions, - BorderElementSize, - BorderElementDraw -}; - -/*---------------------------------------------------------------------- - * +++ Field element: - * Used for editable fields. - */ -typedef struct { - Tcl_Obj *borderObj; - Tcl_Obj *borderColorObj; /* Extra border color */ -} FieldElement; - -static Ttk_ElementOptionSpec FieldElementOptions[] = { - { "-fieldbackground", TK_OPTION_BORDER, Tk_Offset(FieldElement,borderObj), - "white" }, - { "-bordercolor",TK_OPTION_COLOR, Tk_Offset(FieldElement,borderColorObj), - "black" }, - { NULL, 0, 0, NULL } -}; - -static void FieldElementSize( - void *clientData, void *elementRecord, Tk_Window tkwin, - int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr) -{ - *paddingPtr = Ttk_UniformPadding(2); -} - -static void FieldElementDraw( - void *clientData, void *elementRecord, Tk_Window tkwin, - Drawable d, Ttk_Box b, unsigned int state) -{ - FieldElement *field = elementRecord; - Tk_3DBorder border = Tk_Get3DBorderFromObj(tkwin, field->borderObj); - XColor *borderColor = Tk_GetColorFromObj(tkwin, field->borderColorObj); - - Tk_Fill3DRectangle( - tkwin, d, border, b.x, b.y, b.width, b.height, 0, TK_RELIEF_SUNKEN); - DrawFieldBorder(tkwin, d, border, borderColor, b); -} - -static Ttk_ElementSpec FieldElementSpec = { - TK_STYLE_VERSION_2, - sizeof(FieldElement), - FieldElementOptions, - FieldElementSize, - FieldElementDraw -}; - -/*------------------------------------------------------------------------ - * Indicators -- - * - * Code derived (probably incorrectly) from TIP 109 implementation, - * unix/tkUnixButton.c r 1.15. - */ - -/* - * Indicator bitmap descriptor: - */ -typedef struct { - int width; /* Width of each image */ - int height; /* Height of each image */ - int nimages; /* #images / row */ - const char *const *pixels; /* array[height] of char[width*nimage] */ - Ttk_StateTable *map;/* used to look up image index by state */ -} IndicatorSpec; - -#if 0 -/*XPM*/ -static const char *const button_images[] = { - /* width height ncolors chars_per_pixel */ - "52 13 8 1", - /* colors */ - "A c #808000000000 s shadow", - "B c #000080800000 s highlight", - "C c #808080800000 s 3dlight", - "D c #000000008080 s window", - "E c #808000008080 s 3ddark", - "F c #000080808080 s frame", - "G c #000000000000 s foreground", - "H c #000080800000 s disabledfg", -}; -#endif - -static Ttk_StateTable checkbutton_states[] = { - { 0, 0, TTK_STATE_SELECTED|TTK_STATE_DISABLED }, - { 1, TTK_STATE_SELECTED, TTK_STATE_DISABLED }, - { 2, TTK_STATE_DISABLED, TTK_STATE_SELECTED }, - { 3, TTK_STATE_SELECTED|TTK_STATE_DISABLED, 0 }, - { 0, 0, 0 } -}; - -static const char *const checkbutton_pixels[] = { - "AAAAAAAAAAAABAAAAAAAAAAAABAAAAAAAAAAAABAAAAAAAAAAAAB", - "AEEEEEEEEEECBAEEEEEEEEEECBAEEEEEEEEEECBAEEEEEEEEEECB", - "AEDDDDDDDDDCBAEDDDDDDDDDCBAEFFFFFFFFFCBAEFFFFFFFFFCB", - "AEDDDDDDDDDCBAEDDDDDDDGDCBAEFFFFFFFFFCBAEFFFFFFFHFCB", - "AEDDDDDDDDDCBAEDDDDDDGGDCBAEFFFFFFFFFCBAEFFFFFFHHFCB", - "AEDDDDDDDDDCBAEDGDDDGGGDCBAEFFFFFFFFFCBAEFHFFFHHHFCB", - "AEDDDDDDDDDCBAEDGGDGGGDDCBAEFFFFFFFFFCBAEFHHFHHHFFCB", - "AEDDDDDDDDDCBAEDGGGGGDDDCBAEFFFFFFFFFCBAEFHHHHHFFFCB", - "AEDDDDDDDDDCBAEDDGGGDDDDCBAEFFFFFFFFFCBAEFFHHHFFFFCB", - "AEDDDDDDDDDCBAEDDDGDDDDDCBAEFFFFFFFFFCBAEFFFHFFFFFCB", - "AEDDDDDDDDDCBAEDDDDDDDDDCBAEFFFFFFFFFCBAEFFFFFFFFFCB", - "ACCCCCCCCCCCBACCCCCCCCCCCBACCCCCCCCCCCBACCCCCCCCCCCB", - "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB", -}; - -static IndicatorSpec checkbutton_spec = { - 13, 13, 4, /* width, height, nimages */ - checkbutton_pixels, - checkbutton_states -}; - -static Ttk_StateTable radiobutton_states[] = { - { 0, 0, TTK_STATE_SELECTED|TTK_STATE_DISABLED }, - { 1, TTK_STATE_SELECTED, TTK_STATE_DISABLED }, - { 2, TTK_STATE_DISABLED, TTK_STATE_SELECTED }, - { 3, TTK_STATE_SELECTED|TTK_STATE_DISABLED, 0 }, - { 0, 0, 0 } -}; - -static const char *const radiobutton_pixels[] = { - "FFFFAAAAFFFFFFFFFAAAAFFFFFFFFFAAAAFFFFFFFFFAAAAFFFFF", - "FFAAEEEEAAFFFFFAAEEEEAAFFFFFAAEEEEAAFFFFFAAEEEEAAFFF", - "FAEEDDDDEEBFFFAEEDDDDEEBFFFAEEFFFFEEBFFFAEEFFFFEEBFF", - "FAEDDDDDDCBFFFAEDDDDDDCBFFFAEFFFFFFCBFFFAEFFFFFFCBFF", - "AEDDDDDDDDCBFAEDDDGGDDDCBFAEFFFFFFFFCBFAEFFFHHFFFCBF", - "AEDDDDDDDDCBFAEDDGGGGDDCBFAEFFFFFFFFCBFAEFFHHHHFFCBF", - "AEDDDDDDDDCBFAEDDGGGGDDCBFAEFFFFFFFFCBFAEFFHHHHFFCBF", - "AEDDDDDDDDCBFAEDDDGGDDDCBFAEFFFFFFFFCBFAEFFFHHFFFCBF", - "FAEDDDDDDCBFFFAEDDDDDDCBFFFAEFFFFFFCBFFFAEFFFFFFCBFF", - "FACCDDDDCCBFFFACCDDDDCCBFFFACCFFFFCCBFFFACCFFFFCCBFF", - "FFBBCCCCBBFFFFFBBCCCCBBFFFFFBBCCCCBBFFFFFBBCCCCBBFFF", - "FFFFBBBBFFFFFFFFFBBBBFFFFFFFFFBBBBFFFFFFFFFBBBBFFFFF", - "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", -}; - -static IndicatorSpec radiobutton_spec = { - 13, 13, 4, /* width, height, nimages */ - radiobutton_pixels, - radiobutton_states -}; - -typedef struct { - Tcl_Obj *backgroundObj; - Tcl_Obj *foregroundObj; - Tcl_Obj *colorObj; - Tcl_Obj *lightColorObj; - Tcl_Obj *shadeColorObj; - Tcl_Obj *borderColorObj; - Tcl_Obj *marginObj; -} IndicatorElement; - -static Ttk_ElementOptionSpec IndicatorElementOptions[] = { - { "-background", TK_OPTION_COLOR, - Tk_Offset(IndicatorElement,backgroundObj), DEFAULT_BACKGROUND }, - { "-foreground", TK_OPTION_COLOR, - Tk_Offset(IndicatorElement,foregroundObj), DEFAULT_FOREGROUND }, - { "-indicatorcolor", TK_OPTION_COLOR, - Tk_Offset(IndicatorElement,colorObj), "#FFFFFF" }, - { "-lightcolor", TK_OPTION_COLOR, - Tk_Offset(IndicatorElement,lightColorObj), "#DDDDDD" }, - { "-shadecolor", TK_OPTION_COLOR, - Tk_Offset(IndicatorElement,shadeColorObj), "#888888" }, - { "-bordercolor", TK_OPTION_COLOR, - Tk_Offset(IndicatorElement,borderColorObj), "black" }, - { "-indicatormargin", TK_OPTION_STRING, - Tk_Offset(IndicatorElement,marginObj), "0 2 4 2" }, - { NULL, 0, 0, NULL } -}; - -static void IndicatorElementSize( - void *clientData, void *elementRecord, Tk_Window tkwin, - int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr) -{ - IndicatorSpec *spec = clientData; - IndicatorElement *indicator = elementRecord; - Ttk_Padding margins; - Ttk_GetPaddingFromObj(NULL, tkwin, indicator->marginObj, &margins); - *widthPtr = spec->width + Ttk_PaddingWidth(margins); - *heightPtr = spec->height + Ttk_PaddingHeight(margins); -} - -static void IndicatorElementDraw( - void *clientData, void *elementRecord, Tk_Window tkwin, - Drawable d, Ttk_Box b, unsigned int state) -{ - IndicatorSpec *spec = clientData; - IndicatorElement *indicator = elementRecord; - Display *display = Tk_Display(tkwin); - Ttk_Padding padding; - XColor *fgColor, *frameColor, *shadeColor, *indicatorColor, *borderColor; - - int index, ix, iy; - XGCValues gcValues; - GC copyGC; - unsigned long imgColors[8]; - XImage *img; - - Ttk_GetPaddingFromObj(NULL, tkwin, indicator->marginObj, &padding); - b = Ttk_PadBox(b, padding); - - if ( b.x < 0 - || b.y < 0 - || Tk_Width(tkwin) < b.x + spec->width - || Tk_Height(tkwin) < b.y + spec->height) - { - /* Oops! not enough room to display the image. - * Don't draw anything. - */ - return; - } - - /* - * Fill in imgColors palette: - * - * (SHOULD: take light and shade colors from the border object, - * but Tk doesn't provide easy access to these in the public API.) - */ - fgColor = Tk_GetColorFromObj(tkwin, indicator->foregroundObj); - frameColor = Tk_GetColorFromObj(tkwin, indicator->backgroundObj); - shadeColor = Tk_GetColorFromObj(tkwin, indicator->shadeColorObj); - indicatorColor = Tk_GetColorFromObj(tkwin, indicator->colorObj); - borderColor = Tk_GetColorFromObj(tkwin, indicator->borderColorObj); - - imgColors[0 /*A*/] = shadeColor->pixel; - imgColors[1 /*B*/] = indicatorColor->pixel; - imgColors[2 /*C*/] = frameColor->pixel; - imgColors[3 /*D*/] = indicatorColor->pixel; - imgColors[4 /*E*/] = borderColor->pixel; - imgColors[5 /*F*/] = frameColor->pixel; - imgColors[6 /*G*/] = fgColor->pixel; - imgColors[7 /*H*/] = fgColor->pixel; - - /* - * Create a scratch buffer to store the image: - */ - img = XGetImage(display,d, 0, 0, - (unsigned int)spec->width, (unsigned int)spec->height, - AllPlanes, ZPixmap); - if (img == NULL) - return; - - /* - * Create the image, painting it into an XImage one pixel at a time. - */ - index = Ttk_StateTableLookup(spec->map, state); - for (iy=0 ; iy<spec->height ; iy++) { - for (ix=0 ; ix<spec->width ; ix++) { - XPutPixel(img, ix, iy, - imgColors[spec->pixels[iy][index*spec->width+ix] - 'A'] ); - } - } - - /* - * Copy onto our target drawable surface. - */ - memset(&gcValues, 0, sizeof(gcValues)); - copyGC = Tk_GetGC(tkwin, 0, &gcValues); - - TkPutImage(NULL, 0, display, d, copyGC, img, 0, 0, b.x, b.y, - spec->width, spec->height); - - /* - * Tidy up. - */ - Tk_FreeGC(display, copyGC); - XDestroyImage(img); -} - -static Ttk_ElementSpec IndicatorElementSpec = { - TK_STYLE_VERSION_2, - sizeof(IndicatorElement), - IndicatorElementOptions, - IndicatorElementSize, - IndicatorElementDraw -}; - -/*---------------------------------------------------------------------- - * +++ Arrow element(s). - * - * Draws a solid triangle, inside a box. - * clientData is an enum ArrowDirection pointer. - */ - -static int ArrowElements[] = { ARROW_UP, ARROW_DOWN, ARROW_LEFT, ARROW_RIGHT }; -typedef struct { - Tcl_Obj *sizeObj; - Tcl_Obj *borderObj; - Tcl_Obj *borderColorObj; /* Extra color for borders */ - Tcl_Obj *reliefObj; - Tcl_Obj *colorObj; /* Arrow color */ -} ArrowElement; - -static Ttk_ElementOptionSpec ArrowElementOptions[] = { - { "-arrowsize", TK_OPTION_PIXELS, - Tk_Offset(ArrowElement,sizeObj), STRINGIFY(SCROLLBAR_WIDTH) }, - { "-background", TK_OPTION_BORDER, - Tk_Offset(ArrowElement,borderObj), DEFAULT_BACKGROUND }, - { "-bordercolor", TK_OPTION_COLOR, - Tk_Offset(ArrowElement,borderColorObj), "black" }, - { "-relief", TK_OPTION_RELIEF, - Tk_Offset(ArrowElement,reliefObj),"raised"}, - { "-arrowcolor", TK_OPTION_COLOR, - Tk_Offset(ArrowElement,colorObj),"black"}, - { NULL, 0, 0, NULL } -}; - -/* - * Note asymmetric padding: - * top/left padding is 1 less than bottom/right, - * since in this theme 2-pixel borders are asymmetric. - */ -static Ttk_Padding ArrowPadding = { 3,3,4,4 }; - -static void ArrowElementSize( - void *clientData, void *elementRecord, Tk_Window tkwin, - int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr) -{ - ArrowElement *arrow = elementRecord; - int direction = *(int *)clientData; - int width = SCROLLBAR_WIDTH; - - Tk_GetPixelsFromObj(NULL, tkwin, arrow->sizeObj, &width); - width -= Ttk_PaddingWidth(ArrowPadding); - TtkArrowSize(width/2, direction, widthPtr, heightPtr); - *widthPtr += Ttk_PaddingWidth(ArrowPadding); - *heightPtr += Ttk_PaddingHeight(ArrowPadding); -} - -static void ArrowElementDraw( - void *clientData, void *elementRecord, Tk_Window tkwin, - Drawable d, Ttk_Box b, unsigned int state) -{ - int direction = *(int *)clientData; - ArrowElement *arrow = elementRecord; - Tk_3DBorder border = Tk_Get3DBorderFromObj(tkwin, arrow->borderObj); - XColor *borderColor = Tk_GetColorFromObj(tkwin, arrow->borderColorObj); - XColor *arrowColor = Tk_GetColorFromObj(tkwin, arrow->colorObj); - int relief = TK_RELIEF_RAISED; - int borderWidth = 2; - - Tk_GetReliefFromObj(NULL, arrow->reliefObj, &relief); - - Tk_Fill3DRectangle( - tkwin, d, border, b.x, b.y, b.width, b.height, 0, TK_RELIEF_FLAT); - DrawBorder(tkwin,d,border,borderColor,b,borderWidth,relief); - - TtkFillArrow(Tk_Display(tkwin), d, Tk_GCForColor(arrowColor, d), - Ttk_PadBox(b, ArrowPadding), direction); -} - -static Ttk_ElementSpec ArrowElementSpec = { - TK_STYLE_VERSION_2, - sizeof(ArrowElement), - ArrowElementOptions, - ArrowElementSize, - ArrowElementDraw -}; - -/*---------------------------------------------------------------------- - * +++ Menubutton indicator: - * Draw an arrow in the direction where the menu will be posted. - */ - -#define MENUBUTTON_ARROW_SIZE 5 - -typedef struct { - Tcl_Obj *directionObj; - Tcl_Obj *sizeObj; - Tcl_Obj *colorObj; -} MenubuttonArrowElement; - -static const char *directionStrings[] = { /* See also: button.c */ - "above", "below", "left", "right", "flush", NULL -}; -enum { POST_ABOVE, POST_BELOW, POST_LEFT, POST_RIGHT, POST_FLUSH }; - -static Ttk_ElementOptionSpec MenubuttonArrowElementOptions[] = { - { "-direction", TK_OPTION_STRING, - Tk_Offset(MenubuttonArrowElement,directionObj), "below" }, - { "-arrowsize", TK_OPTION_PIXELS, - Tk_Offset(MenubuttonArrowElement,sizeObj), STRINGIFY(MENUBUTTON_ARROW_SIZE)}, - { "-arrowcolor",TK_OPTION_COLOR, - Tk_Offset(MenubuttonArrowElement,colorObj), "black"}, - { NULL, 0, 0, NULL } -}; - -static Ttk_Padding MenubuttonArrowPadding = { 3, 0, 3, 0 }; - -static void MenubuttonArrowElementSize( - void *clientData, void *elementRecord, Tk_Window tkwin, - int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr) -{ - MenubuttonArrowElement *arrow = elementRecord; - int size = MENUBUTTON_ARROW_SIZE; - Tk_GetPixelsFromObj(NULL, tkwin, arrow->sizeObj, &size); - *widthPtr = *heightPtr = 2 * size + 1; - *widthPtr += Ttk_PaddingWidth(MenubuttonArrowPadding); - *heightPtr += Ttk_PaddingHeight(MenubuttonArrowPadding); -} - -static void MenubuttonArrowElementDraw( - void *clientData, void *elementRecord, Tk_Window tkwin, - Drawable d, Ttk_Box b, unsigned int state) -{ - MenubuttonArrowElement *arrow = elementRecord; - XColor *arrowColor = Tk_GetColorFromObj(tkwin, arrow->colorObj); - GC gc = Tk_GCForColor(arrowColor, d); - int size = MENUBUTTON_ARROW_SIZE; - int postDirection = POST_BELOW; - ArrowDirection arrowDirection = ARROW_DOWN; - int width = 0, height = 0; - - Tk_GetPixelsFromObj(NULL, tkwin, arrow->sizeObj, &size); - Tcl_GetIndexFromObjStruct(NULL, arrow->directionObj, directionStrings, - sizeof(char *), ""/*message*/, 0/*flags*/, &postDirection); - - /* ... this might not be such a great idea ... */ - switch (postDirection) { - case POST_ABOVE: arrowDirection = ARROW_UP; break; - case POST_BELOW: arrowDirection = ARROW_DOWN; break; - case POST_LEFT: arrowDirection = ARROW_LEFT; break; - case POST_RIGHT: arrowDirection = ARROW_RIGHT; break; - case POST_FLUSH: arrowDirection = ARROW_DOWN; break; - } - - TtkArrowSize(size, arrowDirection, &width, &height); - b = Ttk_PadBox(b, MenubuttonArrowPadding); - b = Ttk_AnchorBox(b, width, height, TK_ANCHOR_CENTER); - TtkFillArrow(Tk_Display(tkwin), d, gc, b, arrowDirection); -} - -static Ttk_ElementSpec MenubuttonArrowElementSpec = { - TK_STYLE_VERSION_2, - sizeof(MenubuttonArrowElement), - MenubuttonArrowElementOptions, - MenubuttonArrowElementSize, - MenubuttonArrowElementDraw -}; - -/*---------------------------------------------------------------------- - * +++ Trough element - * - * Used in scrollbars and the scale. - * - * The -groovewidth option can be used to set the size of the short axis - * for the drawn area. This will not affect the geometry, but can be used - * to draw a thin centered trough inside the packet alloted. This is used - * to show a win32-style scale widget. Use -1 or a large number to use the - * full area (default). - * - */ - -typedef struct { - Tcl_Obj *colorObj; - Tcl_Obj *borderWidthObj; - Tcl_Obj *reliefObj; - Tcl_Obj *grooveWidthObj; - Tcl_Obj *orientObj; -} TroughElement; - -static Ttk_ElementOptionSpec TroughElementOptions[] = { - { "-orient", TK_OPTION_ANY, - Tk_Offset(TroughElement, orientObj), "horizontal" }, - { "-troughborderwidth", TK_OPTION_PIXELS, - Tk_Offset(TroughElement,borderWidthObj), "1" }, - { "-troughcolor", TK_OPTION_BORDER, - Tk_Offset(TroughElement,colorObj), DEFAULT_BACKGROUND }, - { "-troughrelief",TK_OPTION_RELIEF, - Tk_Offset(TroughElement,reliefObj), "sunken" }, - { "-groovewidth", TK_OPTION_PIXELS, - Tk_Offset(TroughElement,grooveWidthObj), "-1" }, - { NULL, 0, 0, NULL } -}; - -static void TroughElementSize( - void *clientData, void *elementRecord, Tk_Window tkwin, - int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr) -{ - TroughElement *troughPtr = elementRecord; - int borderWidth = 2, grooveWidth = 0; - - Tk_GetPixelsFromObj(NULL, tkwin, troughPtr->borderWidthObj, &borderWidth); - Tk_GetPixelsFromObj(NULL, tkwin, troughPtr->grooveWidthObj, &grooveWidth); - - if (grooveWidth <= 0) { - *paddingPtr = Ttk_UniformPadding((short)borderWidth); - } -} - -static void TroughElementDraw( - void *clientData, void *elementRecord, Tk_Window tkwin, - Drawable d, Ttk_Box b, unsigned int state) -{ - TroughElement *troughPtr = elementRecord; - Tk_3DBorder border = NULL; - int borderWidth = 2, relief = TK_RELIEF_SUNKEN, groove = -1, orient; - - border = Tk_Get3DBorderFromObj(tkwin, troughPtr->colorObj); - Ttk_GetOrientFromObj(NULL, troughPtr->orientObj, &orient); - Tk_GetReliefFromObj(NULL, troughPtr->reliefObj, &relief); - Tk_GetPixelsFromObj(NULL, tkwin, troughPtr->borderWidthObj, &borderWidth); - Tk_GetPixelsFromObj(NULL, tkwin, troughPtr->grooveWidthObj, &groove); - - if (groove != -1 && groove < b.height && groove < b.width) { - if (orient == TTK_ORIENT_HORIZONTAL) { - b.y = b.y + b.height/2 - groove/2; - b.height = groove; - } else { - b.x = b.x + b.width/2 - groove/2; - b.width = groove; - } - } - - Tk_Fill3DRectangle(tkwin, d, border, b.x, b.y, b.width, b.height, - borderWidth, relief); -} - -static Ttk_ElementSpec TroughElementSpec = { - TK_STYLE_VERSION_2, - sizeof(TroughElement), - TroughElementOptions, - TroughElementSize, - TroughElementDraw -}; - -/* - *---------------------------------------------------------------------- - * +++ Thumb element. - */ - -typedef struct { - Tcl_Obj *sizeObj; - Tcl_Obj *firstObj; - Tcl_Obj *lastObj; - Tcl_Obj *borderObj; - Tcl_Obj *borderColorObj; - Tcl_Obj *reliefObj; - Tcl_Obj *orientObj; -} ThumbElement; - -static Ttk_ElementOptionSpec ThumbElementOptions[] = { - { "-width", TK_OPTION_PIXELS, Tk_Offset(ThumbElement,sizeObj), - STRINGIFY(SCROLLBAR_WIDTH) }, - { "-background", TK_OPTION_BORDER, Tk_Offset(ThumbElement,borderObj), - DEFAULT_BACKGROUND }, - { "-bordercolor", TK_OPTION_COLOR, Tk_Offset(ThumbElement,borderColorObj), - "black" }, - { "-relief", TK_OPTION_RELIEF,Tk_Offset(ThumbElement,reliefObj),"raised" }, - { "-orient", TK_OPTION_ANY,Tk_Offset(ThumbElement,orientObj),"horizontal"}, - { NULL, 0, 0, NULL } -}; - -static void ThumbElementSize( - void *clientData, void *elementRecord, Tk_Window tkwin, - int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr) -{ - ThumbElement *thumb = elementRecord; - int orient, size; - Tk_GetPixelsFromObj(NULL, tkwin, thumb->sizeObj, &size); - Ttk_GetOrientFromObj(NULL, thumb->orientObj, &orient); - - if (orient == TTK_ORIENT_VERTICAL) { - *widthPtr = size; - *heightPtr = MIN_THUMB_SIZE; - } else { - *widthPtr = MIN_THUMB_SIZE; - *heightPtr = size; - } -} - -static void ThumbElementDraw( - void *clientData, void *elementRecord, Tk_Window tkwin, - Drawable d, Ttk_Box b, unsigned int state) -{ - ThumbElement *thumb = elementRecord; - Tk_3DBorder border = Tk_Get3DBorderFromObj(tkwin, thumb->borderObj); - XColor *borderColor = Tk_GetColorFromObj(tkwin, thumb->borderColorObj); - int relief = TK_RELIEF_RAISED; - int borderWidth = 2; - - /* - * Don't draw the thumb if we are disabled. - * This makes it behave like Windows ... if that's what we want. - if (state & TTK_STATE_DISABLED) - return; - */ - - Tk_GetReliefFromObj(NULL, thumb->reliefObj, &relief); - - Tk_Fill3DRectangle( - tkwin, d, border, b.x,b.y,b.width,b.height, 0, TK_RELIEF_FLAT); - DrawBorder(tkwin, d, border, borderColor, b, borderWidth, relief); -} - -static Ttk_ElementSpec ThumbElementSpec = { - TK_STYLE_VERSION_2, - sizeof(ThumbElement), - ThumbElementOptions, - ThumbElementSize, - ThumbElementDraw -}; - -/* - *---------------------------------------------------------------------- - * +++ Slider element. - * - * This is the moving part of the scale widget. - * - * The slider element is the thumb in the scale widget. This is drawn - * as an arrow-type element that can point up, down, left or right. - * - */ - -typedef struct { - Tcl_Obj *lengthObj; /* Long axis dimension */ - Tcl_Obj *thicknessObj; /* Short axis dimension */ - Tcl_Obj *reliefObj; /* Relief for this object */ - Tcl_Obj *borderObj; /* Border / background color */ - Tcl_Obj *borderColorObj; /* Additional border color */ - Tcl_Obj *borderWidthObj; - Tcl_Obj *orientObj; /* Orientation of overall slider */ -} SliderElement; - -static Ttk_ElementOptionSpec SliderElementOptions[] = { - { "-sliderlength", TK_OPTION_PIXELS, Tk_Offset(SliderElement,lengthObj), - "15" }, - { "-sliderthickness",TK_OPTION_PIXELS,Tk_Offset(SliderElement,thicknessObj), - "15" }, - { "-sliderrelief", TK_OPTION_RELIEF, Tk_Offset(SliderElement,reliefObj), - "raised" }, - { "-borderwidth", TK_OPTION_PIXELS, Tk_Offset(SliderElement,borderWidthObj), - STRINGIFY(BORDERWIDTH) }, - { "-background", TK_OPTION_BORDER, Tk_Offset(SliderElement,borderObj), - DEFAULT_BACKGROUND }, - { "-bordercolor", TK_OPTION_COLOR, Tk_Offset(ThumbElement,borderColorObj), - "black" }, - { "-orient", TK_OPTION_ANY, Tk_Offset(SliderElement,orientObj), - "horizontal" }, - { NULL, 0, 0, NULL } -}; - -static void SliderElementSize( - void *clientData, void *elementRecord, Tk_Window tkwin, - int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr) -{ - SliderElement *slider = elementRecord; - int orient, length, thickness, borderWidth; - - Ttk_GetOrientFromObj(NULL, slider->orientObj, &orient); - Tk_GetPixelsFromObj(NULL, tkwin, slider->borderWidthObj, &borderWidth); - Tk_GetPixelsFromObj(NULL, tkwin, slider->lengthObj, &length); - Tk_GetPixelsFromObj(NULL, tkwin, slider->thicknessObj, &thickness); - - switch (orient) { - case TTK_ORIENT_VERTICAL: - *widthPtr = thickness + (borderWidth *2); - *heightPtr = *widthPtr/2; - break; - - case TTK_ORIENT_HORIZONTAL: - *heightPtr = thickness + (borderWidth *2); - *widthPtr = *heightPtr/2; - break; - } -} - -static void SliderElementDraw( - void *clientData, void *elementRecord, Tk_Window tkwin, - Drawable d, Ttk_Box b, unsigned int state) -{ - SliderElement *slider = elementRecord; - Tk_3DBorder border = Tk_Get3DBorderFromObj(tkwin, slider->borderObj); - XColor *borderColor = Tk_GetColorFromObj(tkwin, slider->borderColorObj); - int relief = TK_RELIEF_RAISED, borderWidth = 2; - - Tk_GetPixelsFromObj(NULL, tkwin, slider->borderWidthObj, &borderWidth); - Tk_GetReliefFromObj(NULL, slider->reliefObj, &relief); - - Tk_Fill3DRectangle(tkwin, d, border, - b.x, b.y, b.width, b.height, - borderWidth, TK_RELIEF_FLAT); - DrawBorder(tkwin, d, border, borderColor, b, borderWidth, relief); -} - -static Ttk_ElementSpec SliderElementSpec = { - TK_STYLE_VERSION_2, - sizeof(SliderElement), - SliderElementOptions, - SliderElementSize, - SliderElementDraw -}; - -/*------------------------------------------------------------------------ - * +++ Tree indicator element. - */ - -#define TTK_STATE_OPEN TTK_STATE_USER1 /* XREF: treeview.c */ -#define TTK_STATE_LEAF TTK_STATE_USER2 - -typedef struct { - Tcl_Obj *colorObj; - Tcl_Obj *marginObj; - Tcl_Obj *diameterObj; -} TreeitemIndicator; - -static Ttk_ElementOptionSpec TreeitemIndicatorOptions[] = { - { "-foreground", TK_OPTION_COLOR, - Tk_Offset(TreeitemIndicator,colorObj), DEFAULT_FOREGROUND }, - { "-diameter", TK_OPTION_PIXELS, - Tk_Offset(TreeitemIndicator,diameterObj), "9" }, - { "-indicatormargins", TK_OPTION_STRING, - Tk_Offset(TreeitemIndicator,marginObj), "2 2 4 2" }, - { NULL, 0, 0, NULL } -}; - -static void TreeitemIndicatorSize( - void *clientData, void *elementRecord, Tk_Window tkwin, - int *widthPtr, int *heightPtr, Ttk_Padding *paddingPtr) -{ - TreeitemIndicator *indicator = elementRecord; - int diameter = 0; - Ttk_Padding margins; - - Ttk_GetPaddingFromObj(NULL, tkwin, indicator->marginObj, &margins); - Tk_GetPixelsFromObj(NULL, tkwin, indicator->diameterObj, &diameter); - *widthPtr = diameter + Ttk_PaddingWidth(margins); - *heightPtr = diameter + Ttk_PaddingHeight(margins); -} - -static void TreeitemIndicatorDraw( - void *clientData, void *elementRecord, Tk_Window tkwin, - Drawable d, Ttk_Box b, Ttk_State state) -{ - TreeitemIndicator *indicator = elementRecord; - XColor *color = Tk_GetColorFromObj(tkwin, indicator->colorObj); - GC gc = Tk_GCForColor(color, d); - Ttk_Padding padding = Ttk_UniformPadding(0); - int w = WIN32_XDRAWLINE_HACK; - int cx, cy; - - if (state & TTK_STATE_LEAF) { - /* don't draw anything ... */ - return; - } - - Ttk_GetPaddingFromObj(NULL,tkwin,indicator->marginObj,&padding); - b = Ttk_PadBox(b, padding); - - XDrawRectangle(Tk_Display(tkwin), d, gc, - b.x, b.y, b.width - 1, b.height - 1); - - cx = b.x + (b.width - 1) / 2; - cy = b.y + (b.height - 1) / 2; - XDrawLine(Tk_Display(tkwin), d, gc, b.x+2, cy, b.x+b.width-3+w, cy); - - if (!(state & TTK_STATE_OPEN)) { - /* turn '-' into a '+' */ - XDrawLine(Tk_Display(tkwin), d, gc, cx, b.y+2, cx, b.y+b.height-3+w); - } -} - -static Ttk_ElementSpec TreeitemIndicatorElementSpec = { - TK_STYLE_VERSION_2, - sizeof(TreeitemIndicator), - TreeitemIndicatorOptions, - TreeitemIndicatorSize, - TreeitemIndicatorDraw -}; - -/*------------------------------------------------------------------------ - * TtkAltTheme_Init -- - * Install alternate theme. - */ -MODULE_SCOPE int TtkAltTheme_Init(Tcl_Interp *interp) -{ - Ttk_Theme theme = Ttk_CreateTheme(interp, "alt", NULL); - - if (!theme) { - return TCL_ERROR; - } - - Ttk_RegisterElement(interp, theme, "border", &BorderElementSpec, NULL); - - Ttk_RegisterElement(interp, theme, "Checkbutton.indicator", - &IndicatorElementSpec, &checkbutton_spec); - Ttk_RegisterElement(interp, theme, "Radiobutton.indicator", - &IndicatorElementSpec, &radiobutton_spec); - Ttk_RegisterElement(interp, theme, "Menubutton.indicator", - &MenubuttonArrowElementSpec, NULL); - - Ttk_RegisterElement(interp, theme, "field", &FieldElementSpec, NULL); - - Ttk_RegisterElement(interp, theme, "trough", &TroughElementSpec, NULL); - Ttk_RegisterElement(interp, theme, "thumb", &ThumbElementSpec, NULL); - Ttk_RegisterElement(interp, theme, "slider", &SliderElementSpec, NULL); - - Ttk_RegisterElement(interp, theme, "uparrow", - &ArrowElementSpec, &ArrowElements[0]); - Ttk_RegisterElement(interp, theme, "downarrow", - &ArrowElementSpec, &ArrowElements[1]); - Ttk_RegisterElement(interp, theme, "leftarrow", - &ArrowElementSpec, &ArrowElements[2]); - Ttk_RegisterElement(interp, theme, "rightarrow", - &ArrowElementSpec, &ArrowElements[3]); - Ttk_RegisterElement(interp, theme, "arrow", - &ArrowElementSpec, &ArrowElements[0]); - - Ttk_RegisterElement(interp, theme, "arrow", - &ArrowElementSpec, &ArrowElements[0]); - - Ttk_RegisterElement(interp, theme, "Treeitem.indicator", - &TreeitemIndicatorElementSpec, 0); - - Tcl_PkgProvide(interp, "ttk::theme::alt", TTK_VERSION); - - return TCL_OK; -} - -/*EOF*/ |