diff options
| author | jan.nijtmans <nijtmans@users.sourceforge.net> | 2025-10-31 19:28:42 (GMT) |
|---|---|---|
| committer | jan.nijtmans <nijtmans@users.sourceforge.net> | 2025-10-31 19:28:42 (GMT) |
| commit | c25f14940d3c7823cae0a783f34c6f147518a1b3 (patch) | |
| tree | d598543193e4ffbb2336840441fd696a854ab6cc /generic/ttk | |
| parent | 3d21e16ae679d4c1ae0b73441536c7429a72657d (diff) | |
| parent | 2f48a0563a693aeccaf7550989d0539a3c940d95 (diff) | |
| download | tk-core-tk-print-fixes.zip tk-core-tk-print-fixes.tar.gz tk-core-tk-print-fixes.tar.bz2 | |
Merge trunkcore-tk-print-fixes
Diffstat (limited to 'generic/ttk')
29 files changed, 1202 insertions, 311 deletions
diff --git a/generic/ttk/ttk.decls b/generic/ttk/ttk.decls index ff2c18d..55be583 100644 --- a/generic/ttk/ttk.decls +++ b/generic/ttk/ttk.decls @@ -21,7 +21,7 @@ declare 4 { Tcl_Interp *interp, void *deleteData, Ttk_CleanupProc *cleanupProc) } -declare 5 { +declare 5 {deprecated {Use Ttk_RegisterElement}} { int Ttk_RegisterElementSpec( Ttk_Theme theme, const char *elementName, diff --git a/generic/ttk/ttkBlink.c b/generic/ttk/ttkBlink.c index 8f4c8af..5fddbc8 100644 --- a/generic/ttk/ttkBlink.c +++ b/generic/ttk/ttkBlink.c @@ -97,7 +97,7 @@ CursorBlinkProc(void *clientData) int blinkTime; if (cm->owner->flags & CURSOR_ON) { - cm->owner->flags &= ~CURSOR_ON; + cm->owner->flags &= ~(unsigned)CURSOR_ON; blinkTime = cm->offTime; } else { cm->owner->flags |= CURSOR_ON; @@ -113,7 +113,7 @@ CursorBlinkProc(void *clientData) static void LoseCursor(CursorManager *cm, WidgetCore *corePtr) { if (corePtr->flags & CURSOR_ON) { - corePtr->flags &= ~CURSOR_ON; + corePtr->flags &= ~(unsigned)CURSOR_ON; TtkRedisplayWidget(corePtr); } if (cm->owner == corePtr) { @@ -130,10 +130,12 @@ static void LoseCursor(CursorManager *cm, WidgetCore *corePtr) */ static void ClaimCursor(CursorManager *cm, WidgetCore *corePtr) { - if (cm->owner == corePtr) + if (cm->owner == corePtr) { return; - if (cm->owner) + } + if (cm->owner) { LoseCursor(cm, cm->owner); + } corePtr->flags |= CURSOR_ON; TtkRedisplayWidget(corePtr); @@ -161,18 +163,21 @@ CursorEventProc(void *clientData, XEvent *eventPtr) switch (eventPtr->type) { case DestroyNotify: - if (cm->owner == corePtr) + if (cm->owner == corePtr) { LoseCursor(cm, corePtr); + } Tk_DeleteEventHandler( corePtr->tkwin, CursorEventMask, CursorEventProc, clientData); break; case FocusIn: - if (RealFocusEvent(eventPtr->xfocus.detail)) + if (RealFocusEvent(eventPtr->xfocus.detail)) { ClaimCursor(cm, corePtr); + } break; case FocusOut: - if (RealFocusEvent(eventPtr->xfocus.detail)) + if (RealFocusEvent(eventPtr->xfocus.detail)) { LoseCursor(cm, corePtr); + } break; } } @@ -181,16 +186,18 @@ void TtkSetBlinkCursorOnTime(Tcl_Interp* interp, int onTime) { CursorManager* cm = GetCursorManager(interp); - if (onTime >= 0) + if (onTime >= 0) { cm->onTime = onTime; + } } void TtkSetBlinkCursorOffTime(Tcl_Interp* interp, int offTime) { CursorManager* cm = GetCursorManager(interp); - if (offTime >= 0) + if (offTime >= 0) { cm->offTime = offTime; + } } /* diff --git a/generic/ttk/ttkButton.c b/generic/ttk/ttkButton.c index 0cf0517..1db042f 100644 --- a/generic/ttk/ttkButton.c +++ b/generic/ttk/ttkButton.c @@ -533,10 +533,12 @@ CheckbuttonPostConfigure(Tcl_Interp *interp, void *recordPtr, int mask) Checkbutton *checkPtr = (Checkbutton *)recordPtr; int status = TCL_OK; - if (checkPtr->checkbutton.variableTrace) + if (checkPtr->checkbutton.variableTrace) { status = Ttk_FireTrace(checkPtr->checkbutton.variableTrace); - if (status == TCL_OK && !WidgetDestroyed(&checkPtr->core)) + } + if (status == TCL_OK && !WidgetDestroyed(&checkPtr->core)) { status = BasePostConfigure(interp, recordPtr, mask); + } return status; } @@ -556,16 +558,17 @@ CheckbuttonInvokeCommand( Tcl_WrongNumArgs(interp, 1, objv, "invoke"); return TCL_ERROR; } - if (corePtr->state & TTK_STATE_DISABLED) + if (corePtr->state & TTK_STATE_DISABLED) { return TCL_OK; - + } /* * Toggle the selected state. */ - if (corePtr->state & TTK_STATE_SELECTED) + if (corePtr->state & TTK_STATE_SELECTED) { newValue = checkPtr->checkbutton.offValueObj; - else + } else { newValue = checkPtr->checkbutton.onValueObj; + } if (checkPtr->checkbutton.variableObj == NULL || *Tcl_GetString(checkPtr->checkbutton.variableObj) == '\0') @@ -576,8 +579,9 @@ CheckbuttonInvokeCommand( == NULL) return TCL_ERROR; - if (WidgetDestroyed(corePtr)) + if (WidgetDestroyed(corePtr)) { return TCL_ERROR; + } return Tcl_EvalObjEx(interp, checkPtr->checkbutton.commandObj, TCL_EVAL_GLOBAL); @@ -721,10 +725,12 @@ RadiobuttonPostConfigure(Tcl_Interp *interp, void *recordPtr, int mask) Radiobutton *radioPtr = (Radiobutton *)recordPtr; int status = TCL_OK; - if (radioPtr->radiobutton.variableTrace) + if (radioPtr->radiobutton.variableTrace) { status = Ttk_FireTrace(radioPtr->radiobutton.variableTrace); - if (status == TCL_OK && !WidgetDestroyed(&radioPtr->core)) + } + if (status == TCL_OK && !WidgetDestroyed(&radioPtr->core)) { status = BasePostConfigure(interp, recordPtr, mask); + } return status; } @@ -743,8 +749,9 @@ RadiobuttonInvokeCommand( Tcl_WrongNumArgs(interp, 1, objv, "invoke"); return TCL_ERROR; } - if (corePtr->state & TTK_STATE_DISABLED) + if (corePtr->state & TTK_STATE_DISABLED) { return TCL_OK; + } if (Tcl_ObjSetVar2(interp, radioPtr->radiobutton.variableObj, NULL, @@ -753,8 +760,9 @@ RadiobuttonInvokeCommand( == NULL) return TCL_ERROR; - if (WidgetDestroyed(corePtr)) + if (WidgetDestroyed(corePtr)) { return TCL_ERROR; + } return Tcl_EvalObjEx(interp, radioPtr->radiobutton.commandObj, TCL_EVAL_GLOBAL); diff --git a/generic/ttk/ttkClamTheme.c b/generic/ttk/ttkClamTheme.c index 91c15fc..a8c42e0 100644 --- a/generic/ttk/ttkClamTheme.c +++ b/generic/ttk/ttkClamTheme.c @@ -378,8 +378,8 @@ static void IndicatorElementSize( double scalingLevel = TkScalingLevel(tkwin); Ttk_GetPaddingFromObj(NULL, tkwin, indicator->marginObj, &margins); - *widthPtr = spec->width * scalingLevel + Ttk_PaddingWidth(margins); - *heightPtr = spec->height * scalingLevel + Ttk_PaddingHeight(margins); + *widthPtr = (int)(spec->width * scalingLevel) + Ttk_PaddingWidth(margins); + *heightPtr = (int)(spec->height * scalingLevel) + Ttk_PaddingHeight(margins); } static void ColorToStr( @@ -408,8 +408,8 @@ static void IndicatorElementDraw( Ttk_Padding padding; const IndicatorSpec *spec = (const IndicatorSpec *)clientData; double scalingLevel = TkScalingLevel(tkwin); - int width = spec->width * scalingLevel; - int height = spec->height * scalingLevel; + int width = (int)(spec->width * scalingLevel); + int height = (int)(spec->height * scalingLevel); char upperBdColorStr[7], lowerBdColorStr[7], bgColorStr[7], fgColorStr[7]; unsigned int selected = (state & TTK_STATE_SELECTED); @@ -675,8 +675,8 @@ static void TroughElementDraw( GC gcb = Ttk_GCForColor(tkwin,sb->borderColorObj,d); GC gct = Ttk_GCForColor(tkwin,sb->troughColorObj,d); - XFillRectangle(Tk_Display(tkwin), d, gct, b.x, b.y, b.width-1, b.height-1); - XDrawRectangle(Tk_Display(tkwin), d, gcb, b.x, b.y, b.width-1, b.height-1); + XFillRectangle(Tk_Display(tkwin), d, gct, b.x, b.y, (unsigned)b.width-1, (unsigned)b.height-1); + XDrawRectangle(Tk_Display(tkwin), d, gcb, b.x, b.y, (unsigned)b.width-1, (unsigned)b.height-1); } static const Ttk_ElementSpec TroughElementSpec = { @@ -721,7 +721,7 @@ static void ThumbElementDraw( sb->borderColorObj, sb->lightColorObj, sb->darkColorObj); XFillRectangle( Tk_Display(tkwin), d, BackgroundGC(tkwin, sb->backgroundObj), - b.x+2, b.y+2, b.width-4, b.height-4); + b.x+2, b.y+2, (unsigned)b.width-4, (unsigned)b.height-4); /* * Draw grip: @@ -824,7 +824,7 @@ static void PbarElementDraw( sb->borderColorObj, sb->lightColorObj, sb->darkColorObj); XFillRectangle(Tk_Display(tkwin), d, BackgroundGC(tkwin, sb->backgroundObj), - b.x+2, b.y+2, b.width-4, b.height-4); + b.x+2, b.y+2, (unsigned)b.width-4, (unsigned)b.height-4); } } @@ -847,7 +847,7 @@ static void ArrowElementSize( ScrollbarElement *sb = (ScrollbarElement *)elementRecord; ArrowDirection direction = (ArrowDirection)PTR2INT(clientData); double scalingLevel = TkScalingLevel(tkwin); - Ttk_Padding padding = Ttk_UniformPadding(round(3 * scalingLevel)); + Ttk_Padding padding = Ttk_UniformPadding((short)round(3 * scalingLevel)); int size = SCROLLBAR_THICKNESS; Tk_GetPixelsFromObj(NULL, tkwin, sb->arrowSizeObj, &size); @@ -870,7 +870,7 @@ static void ArrowElementDraw( ScrollbarElement *sb = (ScrollbarElement *)elementRecord; ArrowDirection direction = (ArrowDirection)PTR2INT(clientData); double scalingLevel = TkScalingLevel(tkwin); - Ttk_Padding padding = Ttk_UniformPadding(round(3 * scalingLevel)); + Ttk_Padding padding = Ttk_UniformPadding((short)round(3 * scalingLevel)); int cx, cy; GC gc = Ttk_GCForColor(tkwin, sb->arrowColorObj, d); @@ -879,7 +879,7 @@ static void ArrowElementDraw( XFillRectangle( Tk_Display(tkwin), d, BackgroundGC(tkwin, sb->backgroundObj), - b.x+2, b.y+2, b.width-4, b.height-4); + b.x+2, b.y+2, (unsigned)b.width-4, (unsigned)b.height-4); b = Ttk_PadBox(b, padding); @@ -925,7 +925,7 @@ static void SpinboxArrowElementSize( ScrollbarElement *sb = (ScrollbarElement *)elementRecord; ArrowDirection direction = (ArrowDirection)PTR2INT(clientData); double scalingLevel = TkScalingLevel(tkwin); - Ttk_Padding padding = Ttk_UniformPadding(round(3 * scalingLevel)); + Ttk_Padding padding = Ttk_UniformPadding((short)round(3 * scalingLevel)); int size = 10; Tk_GetPixelsFromObj(NULL, tkwin, sb->arrowSizeObj, &size); diff --git a/generic/ttk/ttkClassicTheme.c b/generic/ttk/ttkClassicTheme.c index e4dffff..c178ccb 100644 --- a/generic/ttk/ttkClassicTheme.c +++ b/generic/ttk/ttkClassicTheme.c @@ -67,7 +67,7 @@ static void HighlightElementDraw( GC gc = Tk_GCForColor(highlightColor, d); if (defaultState == TTK_BUTTON_DEFAULT_NORMAL) { TkDrawInsetFocusHighlight(tkwin, gc, highlightThickness, d, - round(5 * TkScalingLevel(tkwin))); + (int)round(5 * TkScalingLevel(tkwin))); } else { Tk_DrawFocusHighlight(tkwin, gc, highlightThickness, d); } @@ -129,7 +129,7 @@ static void ButtonBorderElementSize( Ttk_GetButtonDefaultStateFromObj(NULL, bd->defaultStateObj, &defaultState); if (defaultState != TTK_BUTTON_DEFAULT_DISABLED) { - borderWidth += round(5 * TkScalingLevel(tkwin)); + borderWidth += (int)round(5 * TkScalingLevel(tkwin)); } *paddingPtr = Ttk_UniformPadding((short)borderWidth); } @@ -169,7 +169,7 @@ static void ButtonBorderElementDraw( case TTK_BUTTON_DEFAULT_DISABLED : break; case TTK_BUTTON_DEFAULT_NORMAL : - inset += round(5 * TkScalingLevel(tkwin)); + inset += (int)round(5 * TkScalingLevel(tkwin)); break; case TTK_BUTTON_DEFAULT_ACTIVE : Tk_Draw3DRectangle(tkwin, d, border, @@ -342,14 +342,14 @@ static void DiamondIndicatorElementDraw( diameter = b.width < b.height ? b.width : b.height; radius = diameter / 2; - points[0].x = b.x; - points[0].y = b.y + radius; - points[1].x = b.x + radius; - points[1].y = b.y + 2*radius; - points[2].x = b.x + 2*radius; - points[2].y = b.y + radius; - points[3].x = b.x + radius; - points[3].y = b.y; + points[0].x = (short)b.x; + points[0].y = (short)(b.y + radius); + points[1].x = (short)(b.x + radius); + points[1].y = (short)(b.y + 2*radius); + points[2].x = (short)(b.x + 2*radius); + points[2].y = (short)(b.y + radius); + points[3].x = (short)(b.x + radius); + points[3].y = (short)b.y; Tk_Fill3DPolygon(tkwin,d,interior,points,4,borderWidth,TK_RELIEF_FLAT); Tk_Draw3DPolygon(tkwin,d,border,points,4,borderWidth,relief); @@ -518,24 +518,24 @@ static void ArrowElementDraw( switch (direction) { case ARROW_UP: - points[2].x = b.x; points[2].y = b.y + size; - points[1].x = b.x + size/2; points[1].y = b.y; - points[0].x = b.x + size; points[0].y = b.y + size; + points[2].x = (short)b.x; points[2].y = (short)(b.y + size); + points[1].x = (short)(b.x + size/2); points[1].y = (short)b.y; + points[0].x = (short)(b.x + size); points[0].y = (short)(b.y + size); break; case ARROW_DOWN: - points[0].x = b.x; points[0].y = b.y; - points[1].x = b.x + size/2; points[1].y = b.y + size; - points[2].x = b.x + size; points[2].y = b.y; + points[0].x = (short)b.x; points[0].y = (short)b.y; + points[1].x = (short)(b.x + size/2); points[1].y = (short)(b.y + size); + points[2].x = (short)(b.x + size); points[2].y = (short)b.y; break; case ARROW_LEFT: - points[0].x = b.x; points[0].y = b.y + size / 2; - points[1].x = b.x + size; points[1].y = b.y + size; - points[2].x = b.x + size; points[2].y = b.y; + points[0].x = (short)b.x; points[0].y = (short)(b.y + size / 2); + points[1].x = (short)(b.x + size); points[1].y = (short)(b.y + size); + points[2].x = (short)(b.x + size); points[2].y = (short)b.y; break; case ARROW_RIGHT: - points[0].x = b.x + size; points[0].y = b.y + size / 2; - points[1].x = b.x; points[1].y = b.y; - points[2].x = b.x; points[2].y = b.y + size; + points[0].x = (short)(b.x + size); points[0].y = (short)(b.y + size / 2); + points[1].x = (short)b.x; points[1].y = (short)b.y; + points[2].x = (short)b.x; points[2].y = (short)(b.y + size); break; } @@ -718,13 +718,15 @@ static void SashElementSize( Tk_GetPixelsFromObj(NULL, tkwin, sash->handleSizeObj, &handleSize); Tk_GetPixelsFromObj(NULL, tkwin, sash->sashPadObj, &sashPad); - if (sashThickness < handleSize + 2*sashPad) + if (sashThickness < handleSize + 2*sashPad) { sashThickness = handleSize + 2*sashPad; + } - if (orient == TTK_ORIENT_HORIZONTAL) + if (orient == TTK_ORIENT_HORIZONTAL) { *heightPtr = sashThickness; - else + } else { *widthPtr = sashThickness; + } } static void SashElementDraw( diff --git a/generic/ttk/ttkDecls.h b/generic/ttk/ttkDecls.h index 9c40904..83a2bca 100644 --- a/generic/ttk/ttkDecls.h +++ b/generic/ttk/ttkDecls.h @@ -54,7 +54,8 @@ TTKAPI void Ttk_RegisterCleanup(Tcl_Interp *interp, void *deleteData, Ttk_CleanupProc *cleanupProc); /* 5 */ -TTKAPI int Ttk_RegisterElementSpec(Ttk_Theme theme, +TTK_DEPRECATED("Use Ttk_RegisterElement") +int Ttk_RegisterElementSpec(Ttk_Theme theme, const char *elementName, const Ttk_ElementSpec *elementSpec, void *clientData); @@ -153,7 +154,7 @@ typedef struct TtkStubs { Ttk_Theme (*ttk_GetCurrentTheme) (Tcl_Interp *interp); /* 2 */ Ttk_Theme (*ttk_CreateTheme) (Tcl_Interp *interp, const char *name, Ttk_Theme parent); /* 3 */ void (*ttk_RegisterCleanup) (Tcl_Interp *interp, void *deleteData, Ttk_CleanupProc *cleanupProc); /* 4 */ - int (*ttk_RegisterElementSpec) (Ttk_Theme theme, const char *elementName, const Ttk_ElementSpec *elementSpec, void *clientData); /* 5 */ + TCL_DEPRECATED_API("Use Ttk_RegisterElement") int (*ttk_RegisterElementSpec) (Ttk_Theme theme, const char *elementName, const Ttk_ElementSpec *elementSpec, void *clientData); /* 5 */ Ttk_ElementClass * (*ttk_RegisterElement) (Tcl_Interp *interp, Ttk_Theme theme, const char *elementName, const Ttk_ElementSpec *elementSpec, void *clientData); /* 6 */ int (*ttk_RegisterElementFactory) (Tcl_Interp *interp, const char *name, Ttk_ElementFactory factoryProc, void *clientData); /* 7 */ void (*ttk_RegisterLayout) (Ttk_Theme theme, const char *className, Ttk_LayoutSpec layoutSpec); /* 8 */ @@ -280,4 +281,8 @@ extern const TtkStubs *ttkStubsPtr; /* !END!: Do not edit above this line. */ +#ifdef TK_NO_DEPRECATED +# undef Ttk_RegisterElementSpec +#endif + #endif /* _TTKDECLS */ diff --git a/generic/ttk/ttkDefaultTheme.c b/generic/ttk/ttkDefaultTheme.c index f1c37a6..9f3c282 100644 --- a/generic/ttk/ttkDefaultTheme.c +++ b/generic/ttk/ttkDefaultTheme.c @@ -59,24 +59,31 @@ static const enum BorderColor thinShadowColors[6][4] = { 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 */ + 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 */ + bool corner, /* false => top left; true => 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; + points[0].x = x; points[0].y = y+height; + points[1].x = corner ? x + width : x; points[1].y = corner ? y + height : y; + points[2].x = x+width; points[2].y = y; - if (color == BRDR) + if (corner) { + points[2].y -= WIN32_XDRAWLINE_HACK; + } else { + points[2].x += WIN32_XDRAWLINE_HACK; + } + + if (color == BRDR) { gc = borderGC; - else + } else { gc = Tk_3DBorderGC(tkwin, border, (int)color); + } XDrawLines(Tk_Display(tkwin), d, gc, points, 3, CoordModeOrigin); } @@ -90,19 +97,19 @@ static void DrawBorder( switch (borderWidth) { case 2: /* "thick" border */ DrawCorner(tkwin, d, border, borderGC, - b.x, b.y, b.width, b.height, 0,shadowColors[relief][0]); + b.x, b.y, b.width, b.height, false, shadowColors[relief][0]); DrawCorner(tkwin, d, border, borderGC, - b.x+1, b.y+1, b.width-2, b.height-2, 0,shadowColors[relief][1]); + b.x+1, b.y+1, b.width-2, b.height-2, false, shadowColors[relief][1]); DrawCorner(tkwin, d, border, borderGC, - b.x+1, b.y+1, b.width-2, b.height-2, 1,shadowColors[relief][2]); + b.x+1, b.y+1, b.width-2, b.height-2, true, shadowColors[relief][2]); DrawCorner(tkwin, d, border, borderGC, - b.x, b.y, b.width, b.height, 1,shadowColors[relief][3]); + b.x, b.y, b.width, b.height, true, 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]); + b.x, b.y, b.width, b.height, false, thinShadowColors[relief][0]); DrawCorner(tkwin, d, border, borderGC, - b.x, b.y, b.width, b.height, 1, thinShadowColors[relief][1]); + b.x, b.y, b.width, b.height, true, thinShadowColors[relief][1]); break; case 0: /* no border -- do nothing */ break; @@ -122,13 +129,13 @@ static void DrawFieldBorder( { GC borderGC = Tk_GCForColor(borderColor, d); DrawCorner(tkwin, d, border, borderGC, - b.x, b.y, b.width, b.height, 0, DARK); + b.x, b.y, b.width, b.height, false, DARK); DrawCorner(tkwin, d, border, borderGC, - b.x+1, b.y+1, b.width-2, b.height-2, 0, BRDR); + b.x+1, b.y+1, b.width-2, b.height-2, false, BRDR); DrawCorner(tkwin, d, border, borderGC, - b.x+1, b.y+1, b.width-2, b.height-2, 1, LITE); + b.x+1, b.y+1, b.width-2, b.height-2, true, LITE); DrawCorner(tkwin, d, border, borderGC, - b.x, b.y, b.width, b.height, 1, FLAT); + b.x, b.y, b.width, b.height, true, FLAT); return; } @@ -372,10 +379,11 @@ static void FieldElementDraw( XColor *focusColor = Tk_GetColorFromObj(tkwin, field->focusColorObj); GC focusGC = Tk_GCForColor(focusColor, d); - if (focusWidth > 1) { + if (focusWidth > 1 && b.width >= 2 && b.height >= 2) { int x1 = b.x, x2 = b.x + b.width - 1; int y1 = b.y, y2 = b.y + b.height - 1; int w = WIN32_XDRAWLINE_HACK; + GC bgGC = Tk_3DBorderGC(tkwin, border, TK_3D_FLAT_GC); /* * Draw the outer rounded rectangle @@ -394,7 +402,6 @@ static void FieldElementDraw( /* * Fill the inner rectangle */ - GC bgGC = Tk_3DBorderGC(tkwin, border, TK_3D_FLAT_GC); XFillRectangle(disp, d, bgGC, b.x+1, b.y+1, b.width-2, b.height-2); } else { /* @@ -1091,8 +1098,9 @@ static void ThumbElementDraw( /* * 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) + if (state & TTK_STATE_DISABLED) { return; + } */ Tk_GetReliefFromObj(NULL, thumb->reliefObj, &relief); diff --git a/generic/ttk/ttkElements.c b/generic/ttk/ttkElements.c index e8ff680..304f8ff 100644 --- a/generic/ttk/ttkElements.c +++ b/generic/ttk/ttkElements.c @@ -19,6 +19,69 @@ #define DEFAULT_ARROW_SIZE "15" #define MIN_THUMB_SIZE 10 +/* + *---------------------------------------------------------------------- + * + * Helper routine for drawing a few style elements: + * + * The following function is needed when drawing the trough element + * (which is used in scrollbars, scales, and progressbars) and the + * arrow and thumb elements of a scrollbar. It draws the light or dark + * border color along the entire bottom and right edges, contrary to + * the Tk_Fill3DRectangle function, which on the windowing systems x11 + * and aqua draws the light or dark border color along the entire top + * and left edges instead. + * + * An alternative approach would be to modify the function + * Tk_3DHorizontalBevel in the file unix/tkUnix3d.c. That function is + * called in Tk_Draw3DRectangle, which in turn is invoked in + * Tk_Fill3DRectangle (both functions are implemented in the file + * generic/tk3d.c). With that approach there would be no need for the + * Fill3DRectangle function below, but it would result in some (minor) + * changes related to the appearance of most Tk and Ttk widgets on x11 + * and aqua. + */ + +#if defined(_WIN32) +#define Fill3DRectangle Tk_Fill3DRectangle +#else +static void Fill3DRectangle( + Tk_Window tkwin, /* Window for which border was allocated. */ + Drawable drawable, /* X window or pixmap in which to draw. */ + Tk_3DBorder border, /* Token for border to draw. */ + int x, int y, /* Upper-left corner of the rectangle. */ + int width, int height, /* The width and height of the rectangle. */ + int borderWidth, /* Desired width for border, in pixels. Border + * will be *inside* region. */ + int relief) /* Indicates 3D effect: TK_RELIEF_FLAT, + * TK_RELIEF_RAISED, TK_RELIEF_SUNKEN, etc. */ +{ + if (borderWidth == 1 && width >= 2 && height >= 2 && + (relief == TK_RELIEF_RAISED || relief == TK_RELIEF_SUNKEN)) { + GC flatGC = Tk_3DBorderGC(tkwin, border, TK_3D_FLAT_GC); + GC lightGC = Tk_3DBorderGC(tkwin, border, TK_3D_LIGHT_GC); + GC darkGC = Tk_3DBorderGC(tkwin, border, TK_3D_DARK_GC); + GC nGC, wGC, sGC, eGC; + int x1 = x, x2 = x + width - 1; + int y1 = y, y2 = y + height - 1; + + XFillRectangle(Tk_Display(tkwin), drawable, flatGC, + x + 1, y + 1, width - 2, height - 2); + + nGC = wGC = (relief == TK_RELIEF_RAISED ? lightGC : darkGC); + sGC = eGC = (relief == TK_RELIEF_RAISED ? darkGC : lightGC); + + XDrawLine(Tk_Display(tkwin), drawable, nGC, x1, y1, x2-1, y1); /* N */ + XDrawLine(Tk_Display(tkwin), drawable, wGC, x1, y1, x1, y2-1); /* W */ + XDrawLine(Tk_Display(tkwin), drawable, sGC, x1, y2, x2, y2); /* S */ + XDrawLine(Tk_Display(tkwin), drawable, eGC, x2, y1, x2, y2); /* E */ + } else { + Tk_Fill3DRectangle(tkwin, drawable, border, x, y, width, height, + borderWidth, relief); + } +} +#endif + /*---------------------------------------------------------------------- * +++ Null element. Does nothing; used as a stub. * Null element methods, option table and element spec are public, @@ -243,11 +306,11 @@ static void FieldElementDraw( XColor *focusColor = Tk_GetColorFromObj(tkwin, field->focusColorObj); GC focusGC = Tk_GCForColor(focusColor, d); - if (focusWidth > 1) { + if (focusWidth > 1 && b.width >= 2 && b.height >= 2) { int x1 = b.x, x2 = b.x + b.width - 1; int y1 = b.y, y2 = b.y + b.height - 1; int w = WIN32_XDRAWLINE_HACK; - GC bgGC; + GC bgGC = Tk_3DBorderGC(tkwin, border, TK_3D_FLAT_GC); /* * Draw the outer rounded rectangle @@ -266,7 +329,6 @@ static void FieldElementDraw( /* * Fill the inner rectangle */ - bgGC = Tk_3DBorderGC(tkwin, border, TK_3D_FLAT_GC); XFillRectangle(disp, d, bgGC, b.x+1, b.y+1, b.width-2, b.height-2); } else { /* @@ -384,15 +446,25 @@ static void DrawFocusRing( gc = Tk_GetGC(tkwin, GCForeground, &gcValues); if (solid) { - XRectangle rects[4] = { - {(short)b.x, (short)b.y, (unsigned short)b.width, (unsigned short)thickness}, /* N */ - {(short)b.x, (short)(b.y + b.height - thickness), (unsigned short)b.width, (unsigned short)thickness}, /* S */ - {(short)b.x, (short)(b.y + thickness), (unsigned short)thickness, (unsigned short)(b.height - 2*thickness)}, /* W */ - {(short)(b.x + b.width - thickness), (short)(b.y + thickness), /* E */ - (unsigned short)thickness, (unsigned short)(b.height - 2*thickness)} - }; - - XFillRectangles(disp, d, gc, rects, 4); + if (b.width >= 2*thickness && b.height >= 2*thickness) { + XRectangle rects[4] = { + {(short)b.x, (short)b.y, + (unsigned short)b.width, (unsigned short)thickness}, /* N */ + + {(short)b.x, (short)(b.y + b.height - thickness), + (unsigned short)b.width, (unsigned short)thickness}, /* S */ + + {(short)b.x, (short)(b.y + thickness), + (unsigned short)thickness, + (unsigned short)(b.height - 2*thickness)}, /* W */ + + {(short)(b.x + b.width - thickness), (short)(b.y + thickness), + (unsigned short)thickness, + (unsigned short)(b.height - 2*thickness)} /* E */ + }; + + XFillRectangles(disp, d, gc, rects, 4); + } } else { TkDrawDottedRect(disp, d, gc, b.x, b.y, b.width, b.height); } @@ -609,6 +681,7 @@ static void SizegripDraw( GC lightGC = Tk_3DBorderGC(tkwin, border, TK_3D_LIGHT_GC); GC darkGC = Tk_3DBorderGC(tkwin, border, TK_3D_DARK_GC); int x1 = b.x + b.width-1, y1 = b.y + b.height-1, x2 = x1, y2 = y1; + int w = WIN32_XDRAWLINE_HACK; Tk_GetPixelsFromObj(NULL, tkwin, grip->gripSizeObj, &gripSize); gripThickness = gripSize * 3 / (gripCount * 5); @@ -616,9 +689,11 @@ static void SizegripDraw( while (gripCount--) { x1 -= gripSpace; y2 -= gripSpace; for (int i = 1; i < gripThickness; i++) { - XDrawLine(Tk_Display(tkwin), d, darkGC, x1,y1, x2,y2); --x1; --y2; + XDrawLine(Tk_Display(tkwin), d, darkGC, + x1, y1, x2+w, y2-w); --x1; --y2; } - XDrawLine(Tk_Display(tkwin), d, lightGC, x1,y1, x2,y2); --x1; --y2; + XDrawLine(Tk_Display(tkwin), d, lightGC, + x1, y1, x2+w, y2-w); --x1; --y2; } } @@ -976,7 +1051,7 @@ static void ArrowElementDraw( Tk_GetPixelsFromObj(NULL, tkwin, arrow->borderWidthObj, &borderWidth); Tk_GetReliefFromObj(NULL, arrow->reliefObj, &relief); - Tk_Fill3DRectangle(tkwin, d, border, b.x, b.y, b.width, b.height, + Fill3DRectangle(tkwin, d, border, b.x, b.y, b.width, b.height, borderWidth, relief); padding.left = round(ArrowPadding.left * scalingLevel); @@ -1257,7 +1332,7 @@ static void TroughElementDraw( } } - Tk_Fill3DRectangle(tkwin, d, border, b.x, b.y, b.width, b.height, + Fill3DRectangle(tkwin, d, border, b.x, b.y, b.width, b.height, borderWidth, relief); } @@ -1332,7 +1407,7 @@ static void ThumbElementDraw( Tk_GetPixelsFromObj(NULL, tkwin, thumb->borderWidthObj, &borderWidth); Tk_GetReliefFromObj(NULL, thumb->reliefObj, &relief); - Tk_Fill3DRectangle(tkwin, d, border, b.x, b.y, b.width, b.height, + Fill3DRectangle(tkwin, d, border, b.x, b.y, b.width, b.height, borderWidth, relief); } @@ -1818,20 +1893,30 @@ static void TabElementDraw( switch (nbTabsStickBit) { default: case TTK_STICK_S: - XFillRectangle(disp, d, Tk_GCForColor(hlColor, d), - b.x + cut, b.y, b.width - 2*cut, cut); + if (b.width >= 2*cut) { + XFillRectangle(disp, d, Tk_GCForColor(hlColor, d), + b.x + cut, b.y, b.width - 2*cut, cut); + } break; case TTK_STICK_N: - XFillRectangle(disp, d, Tk_GCForColor(hlColor, d), - b.x + cut, b.y + b.height - cut, b.width - 2*cut, cut); + if (b.width >= 2*cut) { + XFillRectangle(disp, d, Tk_GCForColor(hlColor, d), + b.x + cut, b.y + b.height - cut, + b.width - 2*cut, cut); + } break; case TTK_STICK_E: - XFillRectangle(disp, d, Tk_GCForColor(hlColor, d), - b.x, b.y + cut, cut, b.height - 2*cut); + if (b.height >= 2*cut) { + XFillRectangle(disp, d, Tk_GCForColor(hlColor, d), + b.x, b.y + cut, cut, b.height - 2*cut); + } break; case TTK_STICK_W: - XFillRectangle(disp, d, Tk_GCForColor(hlColor, d), - b.x + b.width - cut, b.y + cut, cut, b.height - 2*cut); + if (b.height >= 2*cut) { + XFillRectangle(disp, d, Tk_GCForColor(hlColor, d), + b.x + b.width - cut, b.y + cut, + cut, b.height - 2*cut); + } break; } } diff --git a/generic/ttk/ttkEntry.c b/generic/ttk/ttkEntry.c index cd10a12..578e9df 100644 --- a/generic/ttk/ttkEntry.c +++ b/generic/ttk/ttkEntry.c @@ -548,8 +548,9 @@ static int RunValidationScript( Tcl_DStringValue(&script), Tcl_DStringLength(&script), TCL_EVAL_GLOBAL); Tcl_DStringFree(&script); - if (WidgetDestroyed(&entryPtr->core)) + if (WidgetDestroyed(&entryPtr->core)) { return TCL_ERROR; + } if (code != TCL_OK && code != TCL_RETURN) { Tcl_AddErrorInfo(interp, "\n\t(in "); @@ -606,8 +607,7 @@ EntryValidateChange( if ((entryPtr->entry.validateCmdObj == NULL) || (entryPtr->core.flags & VALIDATING) - || !EntryNeedsValidation(vmode, reason)) - { + || !EntryNeedsValidation(vmode, reason)) { return TCL_OK; } @@ -726,8 +726,9 @@ static void AdjustIndices(Entry *entryPtr, int index, int nChars) e->selectLast = AdjustIndex(e->selectLast, index+g, nChars); e->xscroll.first= AdjustIndex(e->xscroll.first, index+g, nChars); - if (e->selectLast <= e->selectFirst) + if (e->selectLast <= e->selectFirst) { e->selectFirst = e->selectLast = TCL_INDEX_NONE; + } } /* EntryStoreValue -- @@ -742,18 +743,21 @@ EntryStoreValue(Entry *entryPtr, const char *value) size_t numBytes = strlen(value); Tcl_Size numChars = Tcl_NumUtfChars(value, numBytes); - if (entryPtr->core.flags & VALIDATING) + if (entryPtr->core.flags & VALIDATING) { entryPtr->core.flags |= VALIDATION_SET_VALUE; + } /* Make sure all indices remain in bounds: */ - if (numChars < entryPtr->entry.numChars) + if (numChars < entryPtr->entry.numChars) { AdjustIndices(entryPtr, numChars, numChars - entryPtr->entry.numChars); + } /* Free old value: */ - if (entryPtr->entry.displayString != entryPtr->entry.string) + if (entryPtr->entry.displayString != entryPtr->entry.string) { ckfree(entryPtr->entry.displayString); + } ckfree(entryPtr->entry.string); /* Store new value: @@ -990,8 +994,9 @@ EntryCleanup(void *recordPtr) { Entry *entryPtr = (Entry *)recordPtr; - if (entryPtr->entry.textVariableTrace) + if (entryPtr->entry.textVariableTrace) { Ttk_UntraceVariable(entryPtr->entry.textVariableTrace); + } TtkFreeScrollHandle(entryPtr->entry.xscrollHandle); @@ -1000,8 +1005,9 @@ EntryCleanup(void *recordPtr) Tk_DeleteSelHandler(entryPtr->core.tkwin, XA_PRIMARY, XA_STRING); Tk_FreeTextLayout(entryPtr->entry.textLayout); - if (entryPtr->entry.displayString != entryPtr->entry.string) + if (entryPtr->entry.displayString != entryPtr->entry.string) { ckfree(entryPtr->entry.displayString); + } ckfree(entryPtr->entry.string); } @@ -1030,8 +1036,9 @@ static int EntryConfigure(Tcl_Interp *interp, void *recordPtr, int mask) /* Update derived resources: */ if (mask & TEXTVAR_CHANGED) { - if (entryPtr->entry.textVariableTrace) + if (entryPtr->entry.textVariableTrace) { Ttk_UntraceVariable(entryPtr->entry.textVariableTrace); + } entryPtr->entry.textVariableTrace = vt; } @@ -1056,8 +1063,9 @@ static int EntryConfigure(Tcl_Interp *interp, void *recordPtr, int mask) /* Recompute the displayString, in case showChar changed: */ - if (entryPtr->entry.displayString != entryPtr->entry.string) + if (entryPtr->entry.displayString != entryPtr->entry.string) { ckfree(entryPtr->entry.displayString); + } entryPtr->entry.displayString = entryPtr->entry.showCharObj @@ -1237,10 +1245,12 @@ static void EntryDisplay(void *clientData, Drawable d) /* Adjust selection range to keep in display bounds. */ if (showSelection) { - if (selFirst < leftIndex) + if (selFirst < leftIndex) { selFirst = leftIndex; - if (selLast > rightIndex) + } + if (selLast > rightIndex) { selLast = rightIndex; + } } /* Draw widget background & border @@ -1260,14 +1270,16 @@ static void EntryDisplay(void *clientData, Drawable d) if (selBorder) { int selWidth; int textareaEnd = textarea.x + textarea.width; - if (selEndX > textareaEnd) + if (selEndX > textareaEnd) { selEndX = textareaEnd; + } selWidth = selEndX - selStartX + 2 * borderWidth; - if (selWidth > 0) + if (selWidth > 0) { Tk_Fill3DRectangle(tkwin, d, selBorder, selStartX - borderWidth, entryPtr->entry.layoutY - borderWidth, selWidth, entryPtr->entry.layoutHeight + 2*borderWidth, borderWidth, TK_RELIEF_RAISED); + } } } @@ -1430,7 +1442,7 @@ EntryIndex( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "selection isn't in widget %s", Tk_PathName(entryPtr->core.tkwin))); - Tcl_SetErrorCode(interp, "TTK", "ENTRY", "NO_SELECTION", NULL); + Tcl_SetErrorCode(interp, "TTK", "ENTRY", "NO_SELECTION", (char *)NULL); return TCL_ERROR; } if (strncmp(string, "sel.first", length) == 0) { @@ -1478,7 +1490,7 @@ EntryIndex( badIndex: Tcl_SetObjResult(interp, Tcl_ObjPrintf( "bad entry index \"%s\"", string)); - Tcl_SetErrorCode(interp, "TTK", "ENTRY", "INDEX", NULL); + Tcl_SetErrorCode(interp, "TTK", "ENTRY", "INDEX", (char *)NULL); return TCL_ERROR; } @@ -1725,8 +1737,9 @@ static int EntryValidateCommand( code = EntryRevalidate(interp, entryPtr, VALIDATE_FORCED); - if (code == TCL_ERROR) + if (code == TCL_ERROR) { return code; + } Tcl_SetObjResult(interp, Tcl_NewBooleanObj(code == TCL_OK)); return TCL_OK; @@ -1841,8 +1854,9 @@ ComboboxConfigure(Tcl_Interp *interp, void *recordPtr, int mask) /* Make sure -values is a valid list: */ - if (Tcl_ListObjLength(interp,cbPtr->combobox.valuesObj,&unused) != TCL_OK) + if (Tcl_ListObjLength(interp,cbPtr->combobox.valuesObj,&unused) != TCL_OK) { return TCL_ERROR; + } return EntryConfigure(interp, recordPtr, mask); } @@ -1894,14 +1908,14 @@ static int ComboboxCurrentCommand( if (idx < 0 || idx >= nValues) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "index \"%s\" out of range", Tcl_GetString(objv[2]))); - Tcl_SetErrorCode(interp, "TTK", "COMBOBOX", "IDX_RANGE", NULL); + Tcl_SetErrorCode(interp, "TTK", "COMBOBOX", "IDX_RANGE", (char *)NULL); return TCL_ERROR; } currentIndex = idx; } else { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "bad index \"%s\"", Tcl_GetString(objv[2]))); - Tcl_SetErrorCode(interp, "TTK", "COMBOBOX", "IDX_VALUE", NULL); + Tcl_SetErrorCode(interp, "TTK", "COMBOBOX", "IDX_VALUE", (char *)NULL); return TCL_ERROR; } @@ -2026,8 +2040,9 @@ SpinboxConfigure(Tcl_Interp *interp, void *recordPtr, int mask) /* Make sure -values is a valid list: */ - if (Tcl_ListObjLength(interp,sb->spinbox.valuesObj,&unused) != TCL_OK) + if (Tcl_ListObjLength(interp,sb->spinbox.valuesObj,&unused) != TCL_OK) { return TCL_ERROR; + } return EntryConfigure(interp, recordPtr, mask); } @@ -2103,8 +2118,9 @@ static void TextareaElementSize( Tk_GetFontMetrics(font, &fm); Tcl_GetIntFromObj(NULL, textarea->widthObj, &prefWidth); - if (prefWidth <= 0) + if (prefWidth <= 0) { prefWidth = 1; + } *heightPtr = fm.linespace; *widthPtr = prefWidth * avgWidth; diff --git a/generic/ttk/ttkFrame.c b/generic/ttk/ttkFrame.c index b4c6e35..a1a37b2 100644 --- a/generic/ttk/ttkFrame.c +++ b/generic/ttk/ttkFrame.c @@ -211,7 +211,7 @@ error: if (interp) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Bad label anchor specification %s", Tcl_GetString(objPtr))); - Tcl_SetErrorCode(interp, "TTK", "LABEL", "ANCHOR", NULL); + Tcl_SetErrorCode(interp, "TTK", "LABEL", "ANCHOR", (char *)NULL); } return TCL_ERROR; } @@ -303,10 +303,10 @@ static void LabelframeStyleOptions(Labelframe *lf, LabelframeStyle *style) } else { if (style->labelAnchor & (TTK_PACK_TOP|TTK_PACK_BOTTOM)) { style->labelMargins = - Ttk_MakePadding(DEFAULT_LABELINSET,0,DEFAULT_LABELINSET,0); + Ttk_MakePadding(DEFAULT_LABELINSET, 0, DEFAULT_LABELINSET, 0); } else { style->labelMargins = - Ttk_MakePadding(0,DEFAULT_LABELINSET,0,DEFAULT_LABELINSET); + Ttk_MakePadding(0, DEFAULT_LABELINSET, 0, DEFAULT_LABELINSET); } } if ((objPtr = Ttk_QueryOption(layout,"-labeloutside", 0)) != NULL) { @@ -366,10 +366,10 @@ static int LabelframeSize( labelHeight += Ttk_PaddingHeight(style.labelMargins); switch (LabelAnchorSide(style.labelAnchor)) { - case TTK_SIDE_LEFT: margins.left += labelWidth; break; - case TTK_SIDE_RIGHT: margins.right += labelWidth; break; - case TTK_SIDE_TOP: margins.top += labelHeight; break; - case TTK_SIDE_BOTTOM: margins.bottom += labelHeight; break; + case TTK_SIDE_LEFT: margins.left += (short)labelWidth; break; + case TTK_SIDE_RIGHT: margins.right += (short)labelWidth; break; + case TTK_SIDE_TOP: margins.top += (short)labelHeight; break; + case TTK_SIDE_BOTTOM: margins.bottom += (short)labelHeight; break; } Ttk_SetMargins(corePtr->tkwin,margins); diff --git a/generic/ttk/ttkImage.c b/generic/ttk/ttkImage.c index d46b420..357caab 100644 --- a/generic/ttk/ttkImage.c +++ b/generic/ttk/ttkImage.c @@ -100,7 +100,7 @@ TtkGetImageSpecEx(Tcl_Interp *interp, Tk_Window tkwin, Tcl_Obj *objPtr, Tcl_SetObjResult(interp, Tcl_NewStringObj( "image specification must contain an odd number of elements", -1)); - Tcl_SetErrorCode(interp, "TTK", "IMAGE", "SPEC", NULL); + Tcl_SetErrorCode(interp, "TTK", "IMAGE", "SPEC", (char *)NULL); } goto error; } @@ -222,8 +222,9 @@ static void Ttk_Fill( int db = dst.y + dst.height; int x,y; - if (!(src.width && src.height && dst.width && dst.height)) + if (!(src.width && src.height && dst.width && dst.height)) { return; + } for (x = dst.x; x < dr; x += src.width) { int cw = MIN(src.width, dr - x); @@ -380,7 +381,7 @@ Ttk_CreateImageElement( if (objc + 1 < 2) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "Must supply a base image", -1)); - Tcl_SetErrorCode(interp, "TTK", "IMAGE", "BASE", NULL); + Tcl_SetErrorCode(interp, "TTK", "IMAGE", "BASE", (char *)NULL); return TCL_ERROR; } @@ -405,7 +406,7 @@ Ttk_CreateImageElement( if (i == objc - 1) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Value for %s missing", Tcl_GetString(objv[i]))); - Tcl_SetErrorCode(interp, "TTK", "IMAGE", "VALUE", NULL); + Tcl_SetErrorCode(interp, "TTK", "IMAGE", "VALUE", (char *)NULL); goto error; } diff --git a/generic/ttk/ttkInit.c b/generic/ttk/ttkInit.c index 38bbbaa..96c2766 100644 --- a/generic/ttk/ttkInit.c +++ b/generic/ttk/ttkInit.c @@ -201,6 +201,7 @@ MODULE_SCOPE void TtkProgressbar_Init(Tcl_Interp *); MODULE_SCOPE void TtkScale_Init(Tcl_Interp *); MODULE_SCOPE void TtkScrollbar_Init(Tcl_Interp *); MODULE_SCOPE void TtkSeparator_Init(Tcl_Interp *); +MODULE_SCOPE void TtkToggleswitch_Init(Tcl_Interp *); MODULE_SCOPE void TtkTreeview_Init(Tcl_Interp *); #ifdef TTK_SQUARE_WIDGET @@ -218,6 +219,7 @@ static void RegisterWidgets(Tcl_Interp *interp) TtkScale_Init(interp); TtkScrollbar_Init(interp); TtkSeparator_Init(interp); + TtkToggleswitch_Init(interp); TtkTreeview_Init(interp); #ifdef TTK_SQUARE_WIDGET TtkSquareWidget_Init(interp); diff --git a/generic/ttk/ttkLabel.c b/generic/ttk/ttkLabel.c index a59f1fe..85629bf 100644 --- a/generic/ttk/ttkLabel.c +++ b/generic/ttk/ttkLabel.c @@ -104,8 +104,9 @@ static int TextReqWidth(TextElement *text) int avgWidth = Tk_TextWidth(text->tkfont, "0", 1); if (reqWidth <= 0) { int specWidth = avgWidth * -reqWidth; - if (specWidth > text->width) + if (specWidth > text->width) { return specWidth; + } } else { return avgWidth * reqWidth; } @@ -209,8 +210,9 @@ static void TextElementSize( { TextElement *text = (TextElement *)elementRecord; - if (!TextSetup(text, tkwin)) + if (!TextSetup(text, tkwin)) { return; + } *heightPtr = text->height; *widthPtr = TextReqWidth(text); @@ -270,8 +272,9 @@ static void cTextElementSize( { TextElement *text = (TextElement *)elementRecord; - if (!cTextSetup(text, tkwin)) + if (!cTextSetup(text, tkwin)) { return; + } *heightPtr = text->height; *widthPtr = TextReqWidth(text); @@ -580,8 +583,9 @@ static void LabelSetup( c->compound = TTK_COMPOUND_TEXT; } } - if (c->compound != TTK_COMPOUND_IMAGE) + if (c->compound != TTK_COMPOUND_IMAGE) { TextSetup(&c->text, tkwin); + } /* * ASSERT: @@ -623,10 +627,12 @@ static void LabelSetup( static void LabelCleanup(LabelElement *c) { - if (c->compound != TTK_COMPOUND_TEXT) + if (c->compound != TTK_COMPOUND_TEXT) { ImageCleanup(&c->image); - if (c->compound != TTK_COMPOUND_IMAGE) + } + if (c->compound != TTK_COMPOUND_IMAGE) { TextCleanup(&c->text); + } } static void LabelElementSize( @@ -646,8 +652,9 @@ static void LabelElementSize( /* Requested width based on -width option, not actual text width: */ - if (label->compound != TTK_COMPOUND_IMAGE) + if (label->compound != TTK_COMPOUND_IMAGE) { textReqWidth = TextReqWidth(&label->text); + } switch (label->compound) { diff --git a/generic/ttk/ttkLayout.c b/generic/ttk/ttkLayout.c index 48cf615..b77db39 100644 --- a/generic/ttk/ttkLayout.c +++ b/generic/ttk/ttkLayout.c @@ -335,7 +335,7 @@ int Ttk_GetPaddingFromObj( if (interp) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "Wrong #elements in padding spec", -1)); - Tcl_SetErrorCode(interp, "TTK", "VALUE", "PADDING", NULL); + Tcl_SetErrorCode(interp, "TTK", "VALUE", "PADDING", (char *)NULL); } goto error; } @@ -374,7 +374,7 @@ int Ttk_GetBorderFromObj(Tcl_Interp *interp, Tcl_Obj *objPtr, Ttk_Padding *pad) if (interp) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "Wrong #elements in padding spec", -1)); - Tcl_SetErrorCode(interp, "TTK", "VALUE", "BORDER", NULL); + Tcl_SetErrorCode(interp, "TTK", "VALUE", "BORDER", (char *)NULL); } goto error; } @@ -489,7 +489,7 @@ int Ttk_GetStickyFromObj( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Bad -sticky specification %s", Tcl_GetString(objPtr))); - Tcl_SetErrorCode(interp, "TTK", "VALUE", "STICKY", NULL); + Tcl_SetErrorCode(interp, "TTK", "VALUE", "STICKY", (char *)NULL); } return TCL_ERROR; } @@ -625,8 +625,9 @@ Ttk_LayoutTemplate Ttk_ParseLayoutTemplate(Tcl_Interp *interp, Tcl_Obj *objPtr) Tcl_Obj **objv; Ttk_TemplateNode *head = 0, *tail = 0; - if (Tcl_ListObjGetElements(interp, objPtr, &objc, &objv) != TCL_OK) + if (Tcl_ListObjGetElements(interp, objPtr, &objc, &objv) != TCL_OK) { return 0; + } while (i < objc) { const char *elementName = Tcl_GetString(objv[i]); @@ -641,8 +642,9 @@ Ttk_LayoutTemplate Ttk_ParseLayoutTemplate(Tcl_Interp *interp, Tcl_Obj *objPtr) const char *optName = Tcl_GetString(objv[i]); int option, value; - if (optName[0] != '-') + if (optName[0] != '-') { break; + } if (Tcl_GetIndexFromObjStruct(interp, objv[i], optStrings, sizeof(char *), "option", 0, &option) @@ -655,41 +657,47 @@ Ttk_LayoutTemplate Ttk_ParseLayoutTemplate(Tcl_Interp *interp, Tcl_Obj *objPtr) Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Missing value for option %s", Tcl_GetString(objv[i-1]))); - Tcl_SetErrorCode(interp, "TTK", "VALUE", "LAYOUT", NULL); + Tcl_SetErrorCode(interp, "TTK", "VALUE", "LAYOUT", (char *)NULL); goto error; } switch (option) { case OP_SIDE: /* <<NOTE-PACKSIDE>> */ if (Tcl_GetIndexFromObjStruct(interp, objv[i], packSideStrings, - sizeof(char *), "side", 0, &value) != TCL_OK) - { + sizeof(char *), "side", 0, &value) != TCL_OK) { goto error; } flags |= (TTK_PACK_LEFT << value); break; case OP_STICKY: - if (Ttk_GetStickyFromObj(interp,objv[i],&sticky) != TCL_OK) + if (Ttk_GetStickyFromObj(interp,objv[i],&sticky) != TCL_OK) { goto error; + } break; case OP_EXPAND: - if (Tcl_GetBooleanFromObj(interp,objv[i],&value) != TCL_OK) + if (Tcl_GetBooleanFromObj(interp,objv[i],&value) != TCL_OK) { goto error; - if (value) + } + if (value) { flags |= TTK_EXPAND; + } break; case OP_BORDER: - if (Tcl_GetBooleanFromObj(interp,objv[i],&value) != TCL_OK) + if (Tcl_GetBooleanFromObj(interp,objv[i],&value) != TCL_OK) { goto error; - if (value) + } + if (value) { flags |= TTK_BORDER; + } break; case OP_UNIT: - if (Tcl_GetBooleanFromObj(interp,objv[i],&value) != TCL_OK) + if (Tcl_GetBooleanFromObj(interp,objv[i],&value) != TCL_OK) { goto error; - if (value) + } + if (value) { flags |= TTK_UNIT; + } break; case OP_CHILDREN: childSpec = objv[i]; @@ -711,7 +719,7 @@ Ttk_LayoutTemplate Ttk_ParseLayoutTemplate(Tcl_Interp *interp, Tcl_Obj *objPtr) tail->child = Ttk_ParseLayoutTemplate(interp, childSpec); if (!tail->child) { Tcl_SetObjResult(interp, Tcl_ObjPrintf("Invalid -children value")); - Tcl_SetErrorCode(interp, "TTK", "VALUE", "CHILDREN", NULL); + Tcl_SetErrorCode(interp, "TTK", "VALUE", "CHILDREN", (char *)NULL); goto error; } } @@ -890,7 +898,7 @@ Ttk_Layout Ttk_CreateLayout( if (!layoutTemplate) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Layout %s not found", styleName)); - Tcl_SetErrorCode(interp, "TTK", "LOOKUP", "LAYOUT", styleName, NULL); + Tcl_SetErrorCode(interp, "TTK", "LOOKUP", "LAYOUT", styleName, (char *)NULL); return 0; } @@ -931,7 +939,7 @@ Ttk_CreateSublayout( if (!layoutTemplate) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Layout %s not found", styleName)); - Tcl_SetErrorCode(interp, "TTK", "LOOKUP", "LAYOUT", styleName, NULL); + Tcl_SetErrorCode(interp, "TTK", "LOOKUP", "LAYOUT", styleName, (char *)NULL); return 0; } @@ -1121,19 +1129,22 @@ static void Ttk_DrawNodeList( int border = node->flags & TTK_BORDER; int substate = state; - if (node->flags & TTK_UNIT) + if (node->flags & TTK_UNIT) { substate |= node->state; + } - if (node->child && border) + if (node->child && border) { Ttk_DrawNodeList(layout, substate, node->child, d); + } Ttk_DrawElement( node->eclass, layout->style,layout->recordPtr,layout->optionTable,layout->tkwin, d, node->parcel, state | node->state); - if (node->child && !border) + if (node->child && !border) { Ttk_DrawNodeList(layout, substate, node->child, d); + } } } @@ -1194,13 +1205,15 @@ static Ttk_Element FindNode(Ttk_Element node, const char *nodeName) { for (; node ; node = node->next) { - if (!strcmp(tail(Ttk_ElementName(node)), nodeName)) + if (!strcmp(tail(Ttk_ElementName(node)), nodeName)) { return node; + } if (node->child) { Ttk_Element childNode = FindNode(node->child, nodeName); - if (childNode) + if (childNode) { return childNode; + } } } return 0; diff --git a/generic/ttk/ttkManager.c b/generic/ttk/ttkManager.c index 8ce7b3d..e660538 100644 --- a/generic/ttk/ttkManager.c +++ b/generic/ttk/ttkManager.c @@ -429,8 +429,9 @@ Tcl_Size Ttk_ContentIndex(Ttk_Manager *mgr, Tk_Window window) { Tcl_Size index; for (index = 0; index < mgr->nContent; ++index) - if (mgr->content[index]->window == window) + if (mgr->content[index]->window == window) { return index; + } return -1; } @@ -465,7 +466,7 @@ int Ttk_GetContentIndexFromObj( if (index < 0 || (index - !!lastOK) >= mgr->nContent) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Managed window index \"%s\" out of bounds", Tcl_GetString(objPtr))); - Tcl_SetErrorCode(interp, "TTK", "MANAGED", "INDEX", NULL); + Tcl_SetErrorCode(interp, "TTK", "MANAGED", "INDEX", (char *)NULL); return TCL_ERROR; } *indexPtr = index; @@ -481,7 +482,7 @@ int Ttk_GetContentIndexFromObj( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "%s is not managed by %s", string, Tk_PathName(mgr->window))); - Tcl_SetErrorCode(interp, "TTK", "MANAGED", "MANAGER", NULL); + Tcl_SetErrorCode(interp, "TTK", "MANAGED", "MANAGER", (char *)NULL); return TCL_ERROR; } *indexPtr = index; @@ -490,7 +491,7 @@ int Ttk_GetContentIndexFromObj( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Invalid managed window specification %s", string)); - Tcl_SetErrorCode(interp, "TTK", "MANAGED", "SPEC", NULL); + Tcl_SetErrorCode(interp, "TTK", "MANAGED", "SPEC", (char *)NULL); return TCL_ERROR; } @@ -551,7 +552,7 @@ int Ttk_Maintainable(Tcl_Interp *interp, Tk_Window window, Tk_Window container) badWindow: Tcl_SetObjResult(interp, Tcl_ObjPrintf("cannot add \"%s\" as content of \"%s\"", Tk_PathName(window), Tk_PathName(container))); - Tcl_SetErrorCode(interp, "TTK", "GEOMETRY", "MAINTAINABLE", NULL); + Tcl_SetErrorCode(interp, "TTK", "GEOMETRY", "MAINTAINABLE", (char *)NULL); return 0; } diff --git a/generic/ttk/ttkNotebook.c b/generic/ttk/ttkNotebook.c index 6b730b9..649964a 100644 --- a/generic/ttk/ttkNotebook.c +++ b/generic/ttk/ttkNotebook.c @@ -227,21 +227,18 @@ static int ConfigureTab( int mask = 0; if (Tk_SetOptions(interp, tab, nb->notebook.paneOptionTable, - objc, objv, window, &savedOptions, &mask) != TCL_OK) - { + objc, objv, window, &savedOptions, &mask) != TCL_OK) { return TCL_ERROR; } /* Check options: * @@@ TODO: validate -image option. */ - if (Ttk_GetStickyFromObj(interp, tab->stickyObj, &sticky) != TCL_OK) - { + if (Ttk_GetStickyFromObj(interp, tab->stickyObj, &sticky) != TCL_OK) { goto error; } if (Ttk_GetPaddingFromObj(interp, window, tab->paddingObj, &padding) - != TCL_OK) - { + != TCL_OK) { goto error; } @@ -268,9 +265,8 @@ static Tcl_Size IdentifyTab(Notebook *nb, int x, int y) Tcl_Size index; for (index = 0; index < Ttk_NumberContent(nb->notebook.mgr); ++index) { Tab *tab = (Tab *)Ttk_ContentData(nb->notebook.mgr,index); - if ( tab->state != TAB_STATE_HIDDEN - && Ttk_BoxContains(tab->parcel, x,y)) - { + if (tab->state != TAB_STATE_HIDDEN + && Ttk_BoxContains(tab->parcel, x,y)) { return index; } } @@ -423,10 +419,12 @@ static int NotebookSize(void *clientData, int *widthPtr, int *heightPtr) */ Tk_GetPixelsFromObj(NULL, nbwin, nb->notebook.widthObj, &reqWidth); Tk_GetPixelsFromObj(NULL, nbwin, nb->notebook.heightObj, &reqHeight); - if (reqWidth > 0) + if (reqWidth > 0) { clientWidth = reqWidth; - if (reqHeight > 0) + } + if (reqHeight > 0) { clientHeight = reqHeight; + } /* Tab row: */ @@ -754,7 +752,7 @@ static int AddTab( if (Ttk_ContentIndex(nb->notebook.mgr, window) >= 0) { Tcl_SetObjResult(interp, Tcl_ObjPrintf("%s already added", Tk_PathName(window))); - Tcl_SetErrorCode(interp, "TTK", "NOTEBOOK", "PRESENT", NULL); + Tcl_SetErrorCode(interp, "TTK", "NOTEBOOK", "PRESENT", (char *)NULL); return TCL_ERROR; } #endif @@ -870,7 +868,7 @@ static int FindTabIndex( if (*index_rtn == Ttk_NumberContent(nb->notebook.mgr)) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Invalid tab specification %s", string)); - Tcl_SetErrorCode(interp, "TTK", "NOTEBOOK", "SPEC", NULL); + Tcl_SetErrorCode(interp, "TTK", "NOTEBOOK", "SPEC", (char *)NULL); return TCL_ERROR; } @@ -891,14 +889,14 @@ static int GetTabIndex( if (status == TCL_OK && *index_rtn >= Ttk_NumberContent(nb->notebook.mgr)) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Tab index \"%s\" out of bounds", Tcl_GetString(objPtr))); - Tcl_SetErrorCode(interp, "TTK", "NOTEBOOK", "INDEX", NULL); + Tcl_SetErrorCode(interp, "TTK", "NOTEBOOK", "INDEX", (char *)NULL); return TCL_ERROR; } if (status == TCL_OK && *index_rtn < 0) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Tab '%s' not found", Tcl_GetString(objPtr))); - Tcl_SetErrorCode(interp, "TTK", "NOTEBOOK", "TAB", NULL); + Tcl_SetErrorCode(interp, "TTK", "NOTEBOOK", "TAB", (char *)NULL); status = TCL_ERROR; } return status; @@ -1309,8 +1307,9 @@ static void NotebookCleanup(void *recordPtr) Notebook *nb = (Notebook *)recordPtr; Ttk_DeleteManager(nb->notebook.mgr); - if (nb->notebook.tabLayout) + if (nb->notebook.tabLayout) { Ttk_FreeLayout(nb->notebook.tabLayout); + } } static int NotebookConfigure(Tcl_Interp *interp, void *clientData, int mask) diff --git a/generic/ttk/ttkPanedwindow.c b/generic/ttk/ttkPanedwindow.c index 15f6d59..43271e5 100644 --- a/generic/ttk/ttkPanedwindow.c +++ b/generic/ttk/ttkPanedwindow.c @@ -158,7 +158,7 @@ static int ConfigurePane( if (pane->weight < 0) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "-weight must be non-negative", -1)); - Tcl_SetErrorCode(interp, "TTK", "PANE", "WEIGHT", NULL); + Tcl_SetErrorCode(interp, "TTK", "PANE", "WEIGHT", (char *)NULL); goto error; } @@ -192,12 +192,14 @@ static int ShoveUp(Paned *pw, int i, int pos) int sashThickness = pw->paned.sashThickness; if (i == 0) { - if (pos < 0) + if (pos < 0) { pos = 0; + } } else { Pane *prevPane = (Pane *)Ttk_ContentData(pw->paned.mgr, i-1); - if (pos < prevPane->sashPos + sashThickness) + if (pos < prevPane->sashPos + sashThickness) { pos = ShoveUp(pw, i-1, pos - sashThickness) + sashThickness; + } } return pane->sashPos = pos; } @@ -215,8 +217,9 @@ static int ShoveDown(Paned *pw, Tcl_Size i, int pos) pos = pane->sashPos; /* Sentinel value == container window size */ } else { Pane *nextPane = (Pane *)Ttk_ContentData(pw->paned.mgr,i+1); - if (pos + sashThickness > nextPane->sashPos) + if (pos + sashThickness > nextPane->sashPos) { pos = ShoveDown(pw, i+1, pos + sashThickness) - sashThickness; + } } return pane->sashPos = pos; } @@ -241,8 +244,9 @@ static int PanedSize(void *recordPtr, int *widthPtr, int *heightPtr) Pane *pane = (Pane *)Ttk_ContentData(pw->paned.mgr, index); Tk_Window window = Ttk_ContentWindow(pw->paned.mgr, index); - if (height < Tk_ReqHeight(window)) + if (height < Tk_ReqHeight(window)) { height = Tk_ReqHeight(window); + } width += pane->reqSize; } width += nSashes * sashThickness; @@ -251,8 +255,9 @@ static int PanedSize(void *recordPtr, int *widthPtr, int *heightPtr) Pane *pane = (Pane *)Ttk_ContentData(pw->paned.mgr, index); Tk_Window window = Ttk_ContentWindow(pw->paned.mgr, index); - if (width < Tk_ReqWidth(window)) + if (width < Tk_ReqWidth(window)) { width = Tk_ReqWidth(window); + } height += pane->reqSize; } height += nSashes * sashThickness; @@ -310,8 +315,9 @@ static void PlaceSashes(Paned *pw, int width, int height) int reqSize = 0, totalWeight = 0; int difference, delta, remainder, pos, i; - if (nPanes == 0) + if (nPanes == 0) { return; + } /* Compute total required size and total available weight: */ @@ -344,13 +350,15 @@ static void PlaceSashes(Paned *pw, int width, int height) int weight = pane->weight * (pane->reqSize != 0); int size = pane->reqSize + delta * weight; - if (weight > remainder) + if (weight > remainder) { weight = remainder; + } remainder -= weight; size += weight; - if (size < 0) + if (size < 0) { size = 0; + } pane->sashPos = (pos += size); pos += sashThickness; @@ -422,7 +430,7 @@ static int AddPane( if (Ttk_ContentIndex(pw->paned.mgr, window) >= 0) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "%s already added", Tk_PathName(window))); - Tcl_SetErrorCode(interp, "TTK", "PANE", "PRESENT", NULL); + Tcl_SetErrorCode(interp, "TTK", "PANE", "PRESENT", (char *)NULL); return TCL_ERROR; } @@ -512,8 +520,9 @@ static void PanedCleanup(void *recordPtr) { Paned *pw = (Paned *)recordPtr; - if (pw->paned.sashLayout) + if (pw->paned.sashLayout) { Ttk_FreeLayout(pw->paned.sashLayout); + } Tk_DeleteEventHandler(pw->core.tkwin, PanedEventMask, PanedEventProc, recordPtr); Ttk_DeleteManager(pw->paned.mgr); @@ -563,8 +572,9 @@ static Ttk_Layout PanedGetLayout( Ttk_LayoutSize(sashLayout, 0, &sashWidth, &sashHeight); pw->paned.sashThickness = horizontal ? sashWidth : sashHeight; - if (pw->paned.sashLayout) + if (pw->paned.sashLayout) { Ttk_FreeLayout(pw->paned.sashLayout); + } pw->paned.sashLayout = sashLayout; } else { Ttk_FreeLayout(panedLayout); @@ -677,8 +687,9 @@ static int PanedInsertCommand( return AddPane(interp, pw, destIndex, window, objc-4, objv+4); } /* else -- move existing content: */ - if (destIndex >= nContent) + if (destIndex >= nContent) { destIndex = nContent - 1; + } Ttk_ReorderContent(pw->paned.mgr, srcIndex, destIndex); return objc == 4 ? TCL_OK : @@ -852,7 +863,7 @@ static int PanedSashposCommand( if (sashIndex < 0 || sashIndex >= Ttk_NumberContent(pw->paned.mgr) - 1) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "sash index %" TCL_LL_MODIFIER "d out of range", sashIndex)); - Tcl_SetErrorCode(interp, "TTK", "PANE", "SASH_INDEX", NULL); + Tcl_SetErrorCode(interp, "TTK", "PANE", "SASH_INDEX", (char *)NULL); return TCL_ERROR; } diff --git a/generic/ttk/ttkProgress.c b/generic/ttk/ttkProgress.c index af8c527..74cced3 100644 --- a/generic/ttk/ttkProgress.c +++ b/generic/ttk/ttkProgress.c @@ -220,10 +220,12 @@ static void ProgressbarInitialize( static void ProgressbarCleanup(void *recordPtr) { Progressbar *pb = (Progressbar *)recordPtr; - if (pb->progress.variableTrace) + if (pb->progress.variableTrace) { Ttk_UntraceVariable(pb->progress.variableTrace); - if (pb->progress.timer) + } + if (pb->progress.timer) { Tcl_DeleteTimerHandler(pb->progress.timer); + } } /* @@ -405,10 +407,12 @@ static Ttk_Layout ProgressbarGetLayout( if (layout) { Tcl_Obj *periodObj = Ttk_QueryOption(layout, "-period", 0); Tcl_Obj *maxPhaseObj = Ttk_QueryOption(layout, "-maxphase", 0); - if (periodObj) + if (periodObj) { Tcl_GetIntFromObj(NULL, periodObj, &pb->progress.period); - if (maxPhaseObj) + } + if (maxPhaseObj) { Tcl_GetIntFromObj(NULL, maxPhaseObj, &pb->progress.maxPhase); + } } return layout; diff --git a/generic/ttk/ttkScale.c b/generic/ttk/ttkScale.c index e318600..36e6946 100644 --- a/generic/ttk/ttkScale.c +++ b/generic/ttk/ttkScale.c @@ -271,8 +271,9 @@ ScaleGetCommand( Tcl_SetObjResult(interp, scalePtr->scale.valueObj); } else if (objc == 4) { r = Tcl_GetIntFromObj(interp, objv[2], &x); - if (r == TCL_OK) + if (r == TCL_OK) { r = Tcl_GetIntFromObj(interp, objv[3], &y); + } if (r == TCL_OK) { value = PointToValue(scalePtr, x, y); Tcl_SetObjResult(interp, Tcl_NewDoubleObj(value)); @@ -440,14 +441,27 @@ static double PointToValue(Scale *scalePtr, int x, int y) { Ttk_Box troughBox = TroughRange(scalePtr); - double from = 0, to = 1, fraction; + double value = 0, from = 0, to = 1, fraction; + Tcl_GetDoubleFromObj(NULL, scalePtr->scale.valueObj, &value); Tcl_GetDoubleFromObj(NULL, scalePtr->scale.fromObj, &from); Tcl_GetDoubleFromObj(NULL, scalePtr->scale.toObj, &to); if (scalePtr->scale.orient == TTK_ORIENT_HORIZONTAL) { + /* + * Bug d25b721f: drag when trough not shown due to missing display place + */ + if (troughBox.width <= 0) { + return value; + } fraction = (double)(x - troughBox.x) / (double)troughBox.width; } else { + /* + * Bug d25b721f: drag when trough not shown due to missing display place + */ + if (troughBox.height <= 0) { + return value; + } fraction = (double)(y - troughBox.y) / (double)troughBox.height; } diff --git a/generic/ttk/ttkScroll.c b/generic/ttk/ttkScroll.c index 61b3273..c1c5d25 100644 --- a/generic/ttk/ttkScroll.c +++ b/generic/ttk/ttkScroll.c @@ -258,12 +258,15 @@ void TtkScrollTo(ScrollHandle h, int newFirst, int updateScrollInfo) TtkUpdateScrollInfo(h); } - if (newFirst >= s->total) + if (newFirst >= s->total) { newFirst = s->total - 1; - if (newFirst > s->first && s->last >= s->total) /* don't scroll past end */ + } + if (newFirst > s->first && s->last >= s->total) {/* don't scroll past end */ newFirst = s->first; - if (newFirst < 0) + } + if (newFirst < 0) { newFirst = 0; + } if (newFirst != s->first) { s->first = newFirst; diff --git a/generic/ttk/ttkSquare.c b/generic/ttk/ttkSquare.c index d0d25b1..c9500e0 100644 --- a/generic/ttk/ttkSquare.c +++ b/generic/ttk/ttkSquare.c @@ -114,8 +114,9 @@ SquareDoLayout(void *clientData) Ttk_Box b; b = Ttk_ElementParcel(squareNode); - if (squarePtr->square.anchorObj != NULL) + if (squarePtr->square.anchorObj != NULL) { Tk_GetAnchorFromObj(NULL, squarePtr->square.anchorObj, &anchor); + } b = Ttk_AnchorBox(winBox, b.width, b.height, anchor); Ttk_PlaceElement(corePtr->layout, squareNode, b); diff --git a/generic/ttk/ttkState.c b/generic/ttk/ttkState.c index 005cd48..4024f0b 100644 --- a/generic/ttk/ttkState.c +++ b/generic/ttk/ttkState.c @@ -79,8 +79,9 @@ static int StateSpecSetFromAny(Tcl_Interp *interp, Tcl_Obj *objPtr) unsigned int onbits = 0, offbits = 0; status = Tcl_ListObjGetElements(interp, objPtr, &objc, &objv); - if (status != TCL_OK) + if (status != TCL_OK) { return status; + } for (i = 0; i < objc; ++i) { const char *stateName = Tcl_GetString(objv[i]); @@ -94,15 +95,16 @@ static int StateSpecSetFromAny(Tcl_Interp *interp, Tcl_Obj *objPtr) } for (j = 0; stateNames[j].value; ++j) { - if (strcmp(stateName, stateNames[j].name) == 0) + if (strcmp(stateName, stateNames[j].name) == 0) { break; + } } if (stateNames[j].value == 0) { if (interp) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Invalid state name %s", stateName)); - Tcl_SetErrorCode(interp, "TTK", "VALUE", "STATE", NULL); + Tcl_SetErrorCode(interp, "TTK", "VALUE", "STATE", (char *)NULL); } return TCL_ERROR; } @@ -185,8 +187,9 @@ int Ttk_GetStateSpecFromObj( { if (objPtr->typePtr != &StateSpecObjType.objType) { int status = StateSpecSetFromAny(interp, objPtr); - if (status != TCL_OK) + if (status != TCL_OK) { return status; + } } spec->onbits = objPtr->internalRep.wideValue >> 32; @@ -212,20 +215,23 @@ Tcl_Obj *Ttk_StateMapLookup( int status; status = Tcl_ListObjGetElements(interp, map, &nSpecs, &specs); - if (status != TCL_OK) + if (status != TCL_OK) { return NULL; + } for (j = 0; j < nSpecs; j += 2) { Ttk_StateSpec spec; status = Ttk_GetStateSpecFromObj(interp, specs[j], &spec); - if (status != TCL_OK) + if (status != TCL_OK) { return NULL; - if (Ttk_StateMatches(state, &spec)) + } + if (Ttk_StateMatches(state, &spec)) { return specs[j+1]; + } } if (interp) { Tcl_SetObjResult(interp, Tcl_NewStringObj("No match in state map", -1)); - Tcl_SetErrorCode(interp, "TTK", "STATE", "UNMATCHED", NULL); + Tcl_SetErrorCode(interp, "TTK", "STATE", "UNMATCHED", (char *)NULL); } return NULL; } @@ -244,22 +250,24 @@ Ttk_StateMap Ttk_GetStateMapFromObj( int status; status = Tcl_ListObjGetElements(interp, mapObj, &nSpecs, &specs); - if (status != TCL_OK) + if (status != TCL_OK) { return NULL; + } if (nSpecs % 2 != 0) { if (interp) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "State map must have an even number of elements", -1)); - Tcl_SetErrorCode(interp, "TTK", "VALUE", "STATEMAP", NULL); + Tcl_SetErrorCode(interp, "TTK", "VALUE", "STATEMAP", (char *)NULL); } return 0; } for (j = 0; j < nSpecs; j += 2) { Ttk_StateSpec spec; - if (Ttk_GetStateSpecFromObj(interp, specs[j], &spec) != TCL_OK) + if (Ttk_GetStateSpecFromObj(interp, specs[j], &spec) != TCL_OK) { return NULL; + } } return mapObj; diff --git a/generic/ttk/ttkStubInit.c b/generic/ttk/ttkStubInit.c index 9d7d4fc..4dea92d 100644 --- a/generic/ttk/ttkStubInit.c +++ b/generic/ttk/ttkStubInit.c @@ -8,6 +8,11 @@ MODULE_SCOPE const TtkStubs ttkStubs; + +#ifdef TK_NO_DEPRECATED +# define Ttk_RegisterElementSpec 0 +#endif /* TK_NO_DEPRECATED */ + #ifdef __GNUC__ /* * The rest of this file shouldn't warn about deprecated functions; they're diff --git a/generic/ttk/ttkTheme.c b/generic/ttk/ttkTheme.c index 4ecc30b..dff3c72 100644 --- a/generic/ttk/ttkTheme.c +++ b/generic/ttk/ttkTheme.c @@ -102,8 +102,9 @@ Tcl_Obj *Ttk_StyleDefault(Ttk_Style style, const char *optionName) while (style) { Tcl_HashEntry *entryPtr = Tcl_FindHashEntry(&style->defaultsTable, optionName); - if (entryPtr) + if (entryPtr) { return (Tcl_Obj *)Tcl_GetHashValue(entryPtr); + } style= style->parentStyle; } return 0; @@ -137,8 +138,9 @@ static const Tk_OptionSpec *TTKGetOptionSpec( { const Tk_OptionSpec *optionSpec = TkGetOptionSpec(optionName, optionTable); - if (!optionSpec) + if (!optionSpec) { return 0; + } /* Make sure widget option has a Tcl_Obj* entry: */ @@ -568,7 +570,7 @@ Ttk_CreateTheme( if (!newEntry) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Theme %s already exists", name)); - Tcl_SetErrorCode(interp, "TTK", "THEME", "EXISTS", NULL); + Tcl_SetErrorCode(interp, "TTK", "THEME", "EXISTS", (char *)NULL); return NULL; } @@ -612,7 +614,7 @@ static Ttk_Theme LookupTheme( if (!entryPtr) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "theme \"%s\" does not exist", name)); - Tcl_SetErrorCode(interp, "TTK", "LOOKUP", "THEME", name, NULL); + Tcl_SetErrorCode(interp, "TTK", "LOOKUP", "THEME", name, (char *)NULL); return NULL; } @@ -910,7 +912,7 @@ Ttk_ElementClass *Ttk_RegisterElement( Tcl_ResetResult(interp); Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Duplicate element %s", name)); - Tcl_SetErrorCode(interp, "TTK", "REGISTER_ELEMENT", "DUPE", NULL); + Tcl_SetErrorCode(interp, "TTK", "REGISTER_ELEMENT", "DUPE", (char *)NULL); } return 0; } @@ -922,6 +924,7 @@ Ttk_ElementClass *Ttk_RegisterElement( return elementClass; } +#ifndef TK_NO_DEPRECATED /* Ttk_RegisterElementSpec (deprecated) -- * Register a new element. */ @@ -931,6 +934,7 @@ int Ttk_RegisterElementSpec(Ttk_Theme theme, return Ttk_RegisterElement(NULL, theme, name, specPtr, clientData) ? TCL_OK : TCL_ERROR; } +#endif /* TK_NO_DEPRECATED */ /*------------------------------------------------------------------------ * +++ Element record initialization. @@ -1121,11 +1125,11 @@ Ttk_DrawElement( Ttk_Box b, /* Element area */ Ttk_State state) /* Widget or element state flags. */ { - if (b.width <= 0 || b.height <= 0) + if (b.width <= 0 || b.height <= 0) { return; + } if (!InitializeElementRecord( - eclass, style, recordPtr, optionTable, tkwin, state)) - { + eclass, style, recordPtr, optionTable, tkwin, state)) { return; } eclass->specPtr->draw( @@ -1239,8 +1243,9 @@ usage: * (@@@ SHOULD: check for valid resource values as well, * but we don't know what types they should be at this level.) */ - if (!Ttk_GetStateMapFromObj(interp, stateMap)) + if (!Ttk_GetStateMapFromObj(interp, stateMap)) { return TCL_ERROR; + } entryPtr = Tcl_CreateHashEntry( &stylePtr->settingsTable,optionName,&newEntry); @@ -1380,7 +1385,7 @@ static int StyleThemeCurrentCmd( if (name == NULL) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "error: failed to get theme name", -1)); - Tcl_SetErrorCode(interp, "TTK", "THEME", "NAMELESS", NULL); + Tcl_SetErrorCode(interp, "TTK", "THEME", "NAMELESS", (char *)NULL); return TCL_ERROR; } @@ -1421,8 +1426,9 @@ static int StyleThemeCreateCmd( case OP_PARENT: parentTheme = LookupTheme( interp, pkgPtr, Tcl_GetString(objv[i+1])); - if (!parentTheme) + if (!parentTheme) { return TCL_ERROR; + } break; case OP_SETTINGS: settingsScript = objv[i+1]; @@ -1488,8 +1494,9 @@ StyleThemeSettingsCmd( } newTheme = LookupTheme(interp, pkgPtr, Tcl_GetString(objv[3])); - if (!newTheme) + if (!newTheme) { return TCL_ERROR; + } pkgPtr->currentTheme = newTheme; status = Tcl_EvalObjEx(interp, objv[4], 0); @@ -1583,7 +1590,7 @@ static int StyleElementOptionsCmd( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "element %s not found", elementName)); - Tcl_SetErrorCode(interp, "TTK", "LOOKUP", "ELEMENT", elementName, NULL); + Tcl_SetErrorCode(interp, "TTK", "LOOKUP", "ELEMENT", elementName, (char *)NULL); return TCL_ERROR; } @@ -1647,8 +1654,9 @@ static int StyleThemeStylesCmd( } else { themePtr = Ttk_GetTheme(interp, Tcl_GetString(objv[3])); } - if (!themePtr) + if (!themePtr) { return TCL_ERROR; + } return TtkEnumerateHashTable(interp, &themePtr->styleTable); } diff --git a/generic/ttk/ttkTheme.h b/generic/ttk/ttkTheme.h index 5049b23..fc45157 100644 --- a/generic/ttk/ttkTheme.h +++ b/generic/ttk/ttkTheme.h @@ -391,7 +391,7 @@ MODULE_SCOPE int TtkEnumerateHashTable(Tcl_Interp *, Tcl_HashTable *); * +++ Stub table declarations. */ -#include "ttkDecls.h" +#include "ttkDecls.h" /* IWYU pragma: export */ /* * Drawing utilities for theme code: diff --git a/generic/ttk/ttkToggleswitch.c b/generic/ttk/ttkToggleswitch.c new file mode 100644 index 0000000..04cae23 --- /dev/null +++ b/generic/ttk/ttkToggleswitch.c @@ -0,0 +1,638 @@ +/* + * Copyright © 2025 Csaba Nemethi <csaba.nemethi@t-online.de> + * + * ttk::toggleswitch widget. + */ + +#include "tkInt.h" +#include "ttkTheme.h" +#include "ttkWidget.h" + +/* + * Tglswitch widget record + */ +typedef struct +{ + /* widget options */ + Tcl_Obj *commandObj; + Tcl_Obj *offValueObj; + Tcl_Obj *onValueObj; + Tcl_Obj *sizeObj; + Tcl_Obj *variableObj; + + /* internal state */ + Tcl_Obj *minValObj; /* minimum value */ + Tcl_Obj *maxValObj; /* maximum value */ + Tcl_Obj *curValObj; /* current value */ + Ttk_TraceHandle *varTrace; + double minVal, maxVal; +} TglswitchPart; + +typedef struct +{ + WidgetCore core; + TglswitchPart tglsw; +} Tglswitch; + +static const char *const sizeStrings[] = { "1", "2", "3", NULL }; + +static const Tk_OptionSpec TglswitchOptionSpecs[] = +{ + {TK_OPTION_STRING, "-command", "command", "Command", "", + offsetof(Tglswitch, tglsw.commandObj), TCL_INDEX_NONE, + 0, 0, 0}, + {TK_OPTION_STRING, "-offvalue", "offValue", "OffValue", "0", + offsetof(Tglswitch, tglsw.offValueObj), TCL_INDEX_NONE, + 0, 0, 0}, + {TK_OPTION_STRING, "-onvalue", "onValue", "OnValue", "1", + offsetof(Tglswitch, tglsw.onValueObj), TCL_INDEX_NONE, + 0, 0, 0}, + {TK_OPTION_STRING_TABLE, "-size", "size", "Size", "2", + offsetof(Tglswitch, tglsw.sizeObj), TCL_INDEX_NONE, + 0, sizeStrings, GEOMETRY_CHANGED}, + {TK_OPTION_STRING, "-variable", "variable", "Variable", NULL, + offsetof(Tglswitch, tglsw.variableObj), TCL_INDEX_NONE, + TK_OPTION_NULL_OK, 0, 0}, + + WIDGET_TAKEFOCUS_TRUE, + WIDGET_INHERIT_OPTIONS(ttkCoreOptionSpecs) +}; + +/* + * TglswitchVariableChanged -- + * Variable trace procedure for the ttk::toggleswitch -variable option. + * Updates the ttk::toggleswitch widget's switch state. + */ +static void TglswitchVariableChanged(void *clientData, const char *value) +{ + Tglswitch *tglswPtr = (Tglswitch *)clientData; + + if (WidgetDestroyed(&tglswPtr->core)) { + return; + } + + if (value == NULL) { + TtkWidgetChangeState(&tglswPtr->core, TTK_STATE_INVALID, 0); + } else { + Tcl_DecrRefCount(tglswPtr->tglsw.curValObj); + if (!strcmp(value, Tcl_GetString(tglswPtr->tglsw.onValueObj))) { + TtkWidgetChangeState(&tglswPtr->core, TTK_STATE_SELECTED, 0); + tglswPtr->tglsw.curValObj = tglswPtr->tglsw.maxValObj; + } else { + TtkWidgetChangeState(&tglswPtr->core, 0, TTK_STATE_SELECTED); + tglswPtr->tglsw.curValObj = tglswPtr->tglsw.minValObj; + } + Tcl_IncrRefCount(tglswPtr->tglsw.curValObj); + + TtkWidgetChangeState(&tglswPtr->core, 0, TTK_STATE_INVALID); + } + + TtkRedisplayWidget(&tglswPtr->core); +} + +/* + * TglswitchInitialize -- + * ttk::toggleswitch widget initialization hook. + */ +static void TglswitchInitialize(Tcl_Interp *interp, void *recordPtr) +{ + Tglswitch *tglswPtr = (Tglswitch *)recordPtr; + + /* + * Create the *Tglswitch*.trough and *Tglswitch*.slider + * elements for the Toggleswitch* styles if necessary + */ + int code = Tcl_EvalEx(interp, "ttk::toggleswitch::CondMakeElements", + TCL_INDEX_NONE, TCL_EVAL_GLOBAL); + if (code != TCL_OK) { + Tcl_BackgroundException(interp, code); + } + + /* + * Initialize the minimum, maximum, and current values + */ + + tglswPtr->tglsw.minVal = 0.0; + tglswPtr->tglsw.minValObj = Tcl_NewDoubleObj(tglswPtr->tglsw.minVal); + Tcl_IncrRefCount(tglswPtr->tglsw.minValObj); + + tglswPtr->tglsw.maxVal = 20.0; + tglswPtr->tglsw.maxValObj = Tcl_NewDoubleObj(tglswPtr->tglsw.maxVal); + Tcl_IncrRefCount(tglswPtr->tglsw.maxValObj); + + tglswPtr->tglsw.curValObj = Tcl_NewDoubleObj(0.0); + Tcl_IncrRefCount(tglswPtr->tglsw.curValObj); + + /* + * Set the -variable option to the widget's path name + */ + tglswPtr->tglsw.variableObj = + Tcl_NewStringObj(Tk_PathName(tglswPtr->core.tkwin), -1); + Tcl_IncrRefCount(tglswPtr->tglsw.variableObj); + + TtkTrackElementState(&tglswPtr->core); +} + +/* + * TglswitchCleanup -- + * Cleanup hook. + */ +static void TglswitchCleanup(void *recordPtr) +{ + Tglswitch *tglswPtr = (Tglswitch *)recordPtr; + + if (tglswPtr->tglsw.varTrace) { + Ttk_UntraceVariable(tglswPtr->tglsw.varTrace); + tglswPtr->tglsw.varTrace = 0; + } +} + +/* + * TglswitchConfigure -- + * Configuration hook. + */ +static int TglswitchConfigure(Tcl_Interp *interp, void *recordPtr, int mask) +{ + Tglswitch *tglswPtr = (Tglswitch *)recordPtr; + Tcl_Obj *variableObj = tglswPtr->tglsw.variableObj; + Ttk_TraceHandle *varTrace = NULL; + + if (mask & GEOMETRY_CHANGED) { + /* + * Processing the "-size" option: Set the "-style" option to + * "(*.)Toggleswitch{1|2|3}" if its value is of the same form. + */ + + const char *styleName = 0, *lastDot = 0, *nameTail = 0; + + if (tglswPtr->core.styleObj) { + styleName = Tcl_GetString(tglswPtr->core.styleObj); + } + if (!styleName || *styleName == '\0') { + styleName = "Toggleswitch2"; + } + lastDot = strrchr(styleName, '.'); + nameTail = lastDot ? lastDot + 1 : styleName; + + if (!strcmp(nameTail, "Toggleswitch1") + || !strcmp(nameTail, "Toggleswitch2") + || !strcmp(nameTail, "Toggleswitch3")) { + size_t length = strlen(styleName); + char *styleName2 = (char *)ckalloc(length + 1); + const char *sizeStr = Tcl_GetString(tglswPtr->tglsw.sizeObj); + + memcpy(styleName2, styleName, length + 1); + styleName2[length-1] = *sizeStr; + + Tcl_DecrRefCount(tglswPtr->core.styleObj); + tglswPtr->core.styleObj = Tcl_NewStringObj(styleName2, -1); + Tcl_IncrRefCount(tglswPtr->core.styleObj); + + ckfree(styleName2); + + /* + * Update the layout according to the new style + */ + TtkCoreConfigure(interp, recordPtr, STYLE_CHANGED); + } + } else if (mask & STYLE_CHANGED) { /* intentionally "else if" */ + /* + * Processing the "-style" option: Set the "-size" option + * to "1|2|3" if the style is "(*.)Toggleswitch{1|2|3}" + */ + + const char *sizeStr = 0; + const char *styleName = Tcl_GetString(tglswPtr->core.styleObj); + const char *lastDot = strrchr(styleName, '.'); + const char *nameTail = lastDot ? lastDot + 1 : styleName; + + if (!strcmp(nameTail, "Toggleswitch1")) { + sizeStr = "1"; + } else if (!strcmp(nameTail, "Toggleswitch2")) { + sizeStr = "2"; + } else if (!strcmp(nameTail, "Toggleswitch3")) { + sizeStr = "3"; + } + + if (sizeStr) { + Tcl_DecrRefCount(tglswPtr->tglsw.sizeObj); + tglswPtr->tglsw.sizeObj = Tcl_NewStringObj(sizeStr, -1); + Tcl_IncrRefCount(tglswPtr->tglsw.sizeObj); + } + } + + if (variableObj != NULL && *Tcl_GetString(variableObj) != '\0') { + varTrace = Ttk_TraceVariable(interp, variableObj, + TglswitchVariableChanged, recordPtr); + if (!varTrace) { + return TCL_ERROR; + } + } + + if (TtkCoreConfigure(interp, recordPtr, mask) != TCL_OK) { + Ttk_UntraceVariable(varTrace); + return TCL_ERROR; + } + + if (tglswPtr->tglsw.varTrace) { + Ttk_UntraceVariable(tglswPtr->tglsw.varTrace); + } + tglswPtr->tglsw.varTrace = varTrace; + + return TCL_OK; +} + +/* + * TglswitchPostConfigure -- + * Post-configuration hook. + */ +static int TglswitchPostConfigure( + TCL_UNUSED(Tcl_Interp *), + void *recordPtr, + TCL_UNUSED(int)) +{ + Tglswitch *tglswPtr = (Tglswitch *)recordPtr; + int status = TCL_OK; + + if (tglswPtr->tglsw.varTrace) { + status = Ttk_FireTrace(tglswPtr->tglsw.varTrace); + if (WidgetDestroyed(&tglswPtr->core)) { + return TCL_ERROR; + } + } + + return status; +} + +/* + * TglswitchGetLayout -- + * getLayout hook. + */ +static Ttk_Layout TglswitchGetLayout( + Tcl_Interp *interp, Ttk_Theme themePtr, void *recordPtr) +{ + Tglswitch *tglswPtr = (Tglswitch *)recordPtr; + const char *styleName = 0; + Tcl_DString dsStyleName; + Ttk_Layout layout; + + Tcl_DStringInit(&dsStyleName); + + if (tglswPtr->core.styleObj) { + styleName = Tcl_GetString(tglswPtr->core.styleObj); + Tcl_DStringAppend(&dsStyleName, styleName, TCL_INDEX_NONE); + } + if (!styleName || *styleName == '\0') { + const char *sizeStr = Tcl_GetString(tglswPtr->tglsw.sizeObj); + + styleName = tglswPtr->core.widgetSpec->className; + Tcl_DStringAppend(&dsStyleName, styleName, TCL_INDEX_NONE); + Tcl_DStringAppend(&dsStyleName, sizeStr, TCL_INDEX_NONE); + } + + layout = Ttk_CreateLayout(interp, themePtr, Tcl_DStringValue(&dsStyleName), + recordPtr, tglswPtr->core.optionTable, tglswPtr->core.tkwin); + + Tcl_DStringFree(&dsStyleName); + + return layout; +} + +/* + * TroughRange -- + * Returns the value area of the trough element, adjusted for slider size. + */ +static Ttk_Box TroughRange(Tglswitch *tglswPtr) +{ + Ttk_Box troughBox = Ttk_ClientRegion(tglswPtr->core.layout, "trough"); + Ttk_Element slider = Ttk_FindElement(tglswPtr->core.layout, "slider"); + + if (slider) { + Ttk_Box sliderBox = Ttk_ElementParcel(slider); + troughBox.x += sliderBox.width / 2; + troughBox.width -= sliderBox.width; + } + + return troughBox; +} + +/* + * ValueToFraction -- + * Returns the fraction corresponding to a given value. + */ +static double ValueToFraction(Tglswitch *tglswPtr, double value) +{ + double minVal = tglswPtr->tglsw.minVal; + double maxVal = tglswPtr->tglsw.maxVal; + double fraction = (value - minVal) / (maxVal - minVal); + + return fraction < 0 ? 0 : fraction > 1 ? 1 : fraction; +} + +/* + * ValueToPoint -- + * Returns the x coordinate corresponding to a given value. + */ +static int ValueToPoint(Tglswitch *tglswPtr, double value) +{ + Ttk_Box troughBox = TroughRange(tglswPtr); + double fraction = ValueToFraction(tglswPtr, value); + + return troughBox.x + (int)(fraction * troughBox.width); +} + +/* + * PointToValue -- + * Returns the value corresponding to a given x coordinate. + */ +static double PointToValue(Tglswitch *tglswPtr, int x) +{ + Ttk_Box troughBox = TroughRange(tglswPtr); + double minVal = tglswPtr->tglsw.minVal; + double maxVal = tglswPtr->tglsw.maxVal; + double value = 0.0, fraction; + + Tcl_GetDoubleFromObj(NULL, tglswPtr->tglsw.curValObj, &value); + if (troughBox.width <= 0) { + return value; + } + + fraction = (double)(x - troughBox.x) / (double)troughBox.width; + fraction = fraction < 0 ? 0 : fraction > 1 ? 1 : fraction; + + return minVal + fraction * (maxVal - minVal); +} + +/* + * TglswitchDoLayout -- + */ +static void TglswitchDoLayout(void *clientData) +{ + WidgetCore *corePtr = (WidgetCore *)clientData; + Ttk_Element slider = Ttk_FindElement(corePtr->layout, "slider"); + + Ttk_PlaceLayout(corePtr->layout, corePtr->state, + Ttk_WinBox(corePtr->tkwin)); + + /* + * Adjust the slider position + */ + if (slider) { + Tglswitch *tglswPtr = (Tglswitch *)clientData; + Ttk_Box troughBox = Ttk_ClientRegion(tglswPtr->core.layout, "trough"); + Ttk_Box sliderBox = Ttk_ElementParcel(slider); + double value = 0.0; + double fraction; + int range; + + Tcl_GetDoubleFromObj(NULL, tglswPtr->tglsw.curValObj, &value); + fraction = ValueToFraction(tglswPtr, value); + range = troughBox.width - sliderBox.width; + + sliderBox.x += (int)(fraction * range); + Ttk_PlaceElement(corePtr->layout, slider, sliderBox); + } +} + +/* + * $toggleswitch get ?min|max|$x? -- + * Returns the ttk::toggleswitch widget's current/minimum/maximum value, + * or the value corresponding to $x. + */ +static int TglswitchGetCommand( + void *recordPtr, Tcl_Interp *interp, Tcl_Size objc, Tcl_Obj *const objv[]) +{ + Tglswitch *tglswPtr = (Tglswitch *)recordPtr; + char *arg2 = NULL; + int x, res = TCL_OK; + double value = 0.0; + + if (objc == 2) { + Tcl_SetObjResult(interp, tglswPtr->tglsw.curValObj); + } else if (objc == 3) { + arg2 = Tcl_GetString(objv[2]); + if (!strcmp(arg2, "min")) { + Tcl_SetObjResult(interp, tglswPtr->tglsw.minValObj); + } else if (!strcmp(arg2, "max")) { + Tcl_SetObjResult(interp, tglswPtr->tglsw.maxValObj); + } else { + res = Tcl_GetIntFromObj(interp, objv[2], &x); + if (res == TCL_OK) { + value = PointToValue(tglswPtr, x); + Tcl_SetObjResult(interp, Tcl_NewDoubleObj(value)); + } + } + } else { + Tcl_WrongNumArgs(interp, 1, objv, "get ?min|max|x?"); + return TCL_ERROR; + } + + return res; +} + +/* + * $toggleswitch set $newValue + * Sets the ttk::toggleswitch widget's value to $newValue. + */ +static int TglswitchSetCommand( + void *recordPtr, Tcl_Interp *interp, Tcl_Size objc, Tcl_Obj *const objv[]) +{ + Tglswitch *tglswPtr = (Tglswitch *)recordPtr; + double minVal = tglswPtr->tglsw.minVal; + double maxVal = tglswPtr->tglsw.maxVal; + double value; + + if (objc != 3) { + Tcl_WrongNumArgs(interp, 1, objv, "set value"); + return TCL_ERROR; + } + + if (Tcl_GetDoubleFromObj(interp, objv[2], &value) != TCL_OK) { + return TCL_ERROR; + } + + if (tglswPtr->core.state & TTK_STATE_DISABLED) { + return TCL_OK; + } + + /* + * Limit new value to between minVal and maxVal + */ + value = value < minVal ? minVal : value > maxVal ? maxVal : value; + + /* + * Set value + */ + Tcl_DecrRefCount(tglswPtr->tglsw.curValObj); + tglswPtr->tglsw.curValObj = Tcl_NewDoubleObj(value); + Tcl_IncrRefCount(tglswPtr->tglsw.curValObj); + TtkRedisplayWidget(&tglswPtr->core); + + if (WidgetDestroyed(&tglswPtr->core)) { + return TCL_ERROR; + } + + return TCL_OK; +} + +/* + * $toggleswitch switchstate ?$boolean? -- + * Modifies or inquires the widget's switch state. + */ +static int TglswitchSwitchstateCommand( + void *recordPtr, Tcl_Interp *interp, Tcl_Size objc, Tcl_Obj *const objv[]) +{ + Tglswitch *tglswPtr = (Tglswitch *)recordPtr; + Ttk_State selState = (tglswPtr->core.state & TTK_STATE_SELECTED); + Tcl_Obj *variableObj = tglswPtr->tglsw.variableObj; + int arg2 = 0; + + if (objc == 2) { + /* + * Return the widget's current switch state + */ + Tcl_SetObjResult(interp, Tcl_NewBooleanObj(selState)); + } else if (objc == 3) { + if (Tcl_GetBooleanFromObj(interp, objv[2], &arg2) != TCL_OK) { + return TCL_ERROR; + } + + if (tglswPtr->core.state & TTK_STATE_DISABLED) { + return TCL_OK; + } + + /* + * Update the widget's selected state and current value + */ + Tcl_DecrRefCount(tglswPtr->tglsw.curValObj); + if (arg2) { + TtkWidgetChangeState(&tglswPtr->core, TTK_STATE_SELECTED, 0); + tglswPtr->tglsw.curValObj = tglswPtr->tglsw.maxValObj; + } else { + TtkWidgetChangeState(&tglswPtr->core, 0, TTK_STATE_SELECTED); + tglswPtr->tglsw.curValObj = tglswPtr->tglsw.minValObj; + } + Tcl_IncrRefCount(tglswPtr->tglsw.curValObj); + + if (variableObj != NULL && *Tcl_GetString(variableObj) != '\0') { + /* + * Update the associated variable + */ + Tcl_Obj *newOnOffValueObj = arg2 ? tglswPtr->tglsw.onValueObj + : tglswPtr->tglsw.offValueObj; + if (Tcl_ObjSetVar2(interp, variableObj, NULL, newOnOffValueObj, + TCL_GLOBAL_ONLY|TCL_LEAVE_ERR_MSG) == NULL) { + return TCL_ERROR; + } + } + + if (WidgetDestroyed(&tglswPtr->core)) { + return TCL_ERROR; + } + + if ((tglswPtr->core.state & TTK_STATE_SELECTED) != selState) { + /* + * Evaluate the associated command at global scope + */ + return Tcl_EvalObjEx(interp, tglswPtr->tglsw.commandObj, + TCL_EVAL_GLOBAL); + } + } else { + Tcl_WrongNumArgs(interp, 1, objv, "switchstate ?boolean?"); + return TCL_ERROR; + } + + return TCL_OK; +} + +/* + * $toggleswitch toggle -- + * Toggles the widget's switch state. + */ +static int TglswitchToggleCommand( + void *recordPtr, Tcl_Interp *interp, Tcl_Size objc, Tcl_Obj *const objv[]) +{ + Tglswitch *tglswPtr = (Tglswitch *)recordPtr; + static Tcl_Obj *newObjv[3]; + + if (objc != 2) { + Tcl_WrongNumArgs(interp, 1, objv, "toggle"); + return TCL_ERROR; + } + + newObjv[0] = objv[0]; + newObjv[1] = Tcl_NewStringObj("switchstate", -1); + newObjv[2] = (tglswPtr->core.state & TTK_STATE_SELECTED) ? + Tcl_NewBooleanObj(0) : Tcl_NewBooleanObj(1); + + return TglswitchSwitchstateCommand(recordPtr, interp, 3, newObjv); +} + +/* + * $toggleswitch xcoord ?$value? -- + * Returns the x coordinate corresponding to $value, or to the current + * value if $value is omitted. + */ +static int TglswitchXcoordCommand( + void *recordPtr, Tcl_Interp *interp, Tcl_Size objc, Tcl_Obj *const objv[]) +{ + Tglswitch *tglswPtr = (Tglswitch *)recordPtr; + double value; + int res = TCL_OK; + + if (objc == 3) { + res = Tcl_GetDoubleFromObj(interp, objv[2], &value); + } else if (objc == 2) { + res = Tcl_GetDoubleFromObj(interp, tglswPtr->tglsw.curValObj, &value); + } else { + Tcl_WrongNumArgs(interp, 1, objv, "xcoord ?value?"); + return TCL_ERROR; + } + + if (res == TCL_OK) { + int x = ValueToPoint(tglswPtr, value); + Tcl_SetObjResult(interp, Tcl_NewIntObj(x)); + } + + return res; +} + +static const Ttk_Ensemble TglswitchCommands[] = +{ + { "cget", TtkWidgetCgetCommand, 0 }, + { "configure", TtkWidgetConfigureCommand, 0 }, + { "get", TglswitchGetCommand, 0 }, + { "identify", TtkWidgetIdentifyCommand, 0 }, + { "instate", TtkWidgetInstateCommand, 0 }, + { "set", TglswitchSetCommand, 0 }, + { "state", TtkWidgetStateCommand, 0 }, + { "style", TtkWidgetStyleCommand, 0 }, + { "switchstate", TglswitchSwitchstateCommand, 0 }, + { "toggle", TglswitchToggleCommand, 0 }, + { "xcoord", TglswitchXcoordCommand, 0 }, + { 0, 0, 0 } +}; + +static const WidgetSpec TglswitchWidgetSpec = +{ + "Toggleswitch", /* Class name */ + sizeof(Tglswitch), /* record size */ + TglswitchOptionSpecs, /* option specs */ + TglswitchCommands, /* widget commands */ + TglswitchInitialize, /* initialization proc */ + TglswitchCleanup, /* cleanup proc */ + TglswitchConfigure, /* configure proc */ + TglswitchPostConfigure, /* postConfigure */ + TglswitchGetLayout, /* getLayoutProc */ + TtkWidgetSize, /* sizeProc */ + TglswitchDoLayout, /* layoutProc */ + TtkWidgetDisplay /* displayProc */ +}; + +/* + * Initialization. + */ +MODULE_SCOPE void TtkToggleswitch_Init(Tcl_Interp *interp) +{ + RegisterWidget(interp, "ttk::toggleswitch", &TglswitchWidgetSpec); +} diff --git a/generic/ttk/ttkTrack.c b/generic/ttk/ttkTrack.c index 032a672..cce6259 100644 --- a/generic/ttk/ttkTrack.c +++ b/generic/ttk/ttkTrack.c @@ -69,8 +69,9 @@ static void ActivateElement(ElementStateTracker *es, Ttk_Element element) */ static void ReleaseElement(ElementStateTracker *es) { - if (!es->pressedElement) + if (!es->pressedElement) { return; + } Ttk_ChangeElementState( es->pressedElement, 0,TTK_STATE_PRESSED|TTK_STATE_ACTIVE); @@ -78,8 +79,9 @@ static void ReleaseElement(ElementStateTracker *es) /* Reactivate element under the mouse cursor: */ - if (es->activeElement) - Ttk_ChangeElementState(es->activeElement, TTK_STATE_ACTIVE,0); + if (es->activeElement) { + Ttk_ChangeElementState(es->activeElement, TTK_STATE_ACTIVE, 0); + } TtkRedisplayWidget(es->corePtr); } @@ -138,8 +140,9 @@ ElementStateEventProc(void *clientData, XEvent *ev) break; case LeaveNotify: ActivateElement(es, 0); - if (ev->xcrossing.mode == NotifyGrab) + if (ev->xcrossing.mode == NotifyGrab) { PressElement(es, 0); + } break; case EnterNotify: element = Ttk_IdentifyElement( @@ -149,8 +152,9 @@ ElementStateEventProc(void *clientData, XEvent *ev) case ButtonPress: element = Ttk_IdentifyElement( layout, ev->xbutton.x, ev->xbutton.y); - if (element) + if (element) { PressElement(es, element); + } break; case ButtonRelease: ReleaseElement(es); diff --git a/generic/ttk/ttkTreeview.c b/generic/ttk/ttkTreeview.c index f430aec..ea01b25 100644 --- a/generic/ttk/ttkTreeview.c +++ b/generic/ttk/ttkTreeview.c @@ -172,12 +172,15 @@ static void FreeItemCB(void *clientData) { FreeItem((TreeItem *)clientData); } */ static void DetachItem(TreeItem *item) { - if (item->parent && item->parent->children == item) + if (item->parent && item->parent->children == item) { item->parent->children = item->next; - if (item->prev) + } + if (item->prev) { item->prev->next = item->next; - if (item->next) + } + if (item->next) { item->next->prev = item->prev; + } item->next = item->prev = item->parent = NULL; } @@ -210,12 +213,14 @@ static void InsertItem(TreeItem *parent, TreeItem *prev, TreeItem *item) static TreeItem *NextPreorder(TreeItem *item) { - if (item->children) + if (item->children) { return item->children; + } while (!item->next) { item = item->parent; - if (!item) + if (!item) { return 0; + } } return item->next; } @@ -404,8 +409,9 @@ static int GetEnumSetFromObj( Tcl_Size i, objc; Tcl_Obj **objv; - if (Tcl_ListObjGetElements(interp, objPtr, &objc, &objv) != TCL_OK) + if (Tcl_ListObjGetElements(interp, objPtr, &objc, &objv) != TCL_OK) { return TCL_ERROR; + } for (i = 0; i < objc; ++i) { int index; @@ -668,7 +674,7 @@ static TreeColumn *GetColumn( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Column index \"%s\" out of bounds", Tcl_GetString(columnIDObj))); - Tcl_SetErrorCode(interp, "TTK", "TREE", "COLBOUND", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "COLBOUND", (char *)NULL); return NULL; } @@ -676,7 +682,7 @@ static TreeColumn *GetColumn( } Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Invalid column index \"%s\"", Tcl_GetString(columnIDObj))); - Tcl_SetErrorCode(interp, "TTK", "TREE", "COLUMN", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "COLUMN", (char *)NULL); return NULL; } @@ -688,15 +694,15 @@ static TreeColumn *FindColumn( { Tcl_WideInt colno; - if (sscanf(Tcl_GetString(columnIDObj), "#%" TCL_LL_MODIFIER "d", &colno) == 1) - { /* Display column specification, #n */ + if (sscanf(Tcl_GetString(columnIDObj), "#%" TCL_LL_MODIFIER "d", &colno) == 1) { + /* Display column specification, #n */ if (colno >= 0 && colno < tv->tree.nDisplayColumns) { return tv->tree.displayColumns[colno]; } /* else */ Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Column %s out of range", Tcl_GetString(columnIDObj))); - Tcl_SetErrorCode(interp, "TTK", "TREE", "COLUMN", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "COLUMN", (char *)NULL); return NULL; } @@ -716,7 +722,7 @@ static TreeItem *FindItem( if (!entryPtr) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Item %s not found", itemName)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "ITEM", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "ITEM", (char *)NULL); return 0; } return (TreeItem *)Tcl_GetHashValue(entryPtr); @@ -876,8 +882,9 @@ static int TreeviewInitDisplayColumns(Tcl_Interp *interp, Treeview *tv) } displayColumns[0] = &tv->tree.column0; - if (tv->tree.displayColumns) + if (tv->tree.displayColumns) { ckfree(tv->tree.displayColumns); + } tv->tree.displayColumns = displayColumns; tv->tree.nDisplayColumns = ndcols + 1; @@ -1082,7 +1089,7 @@ static int GetCellFromObj( if (nElements != 2) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "Cell id must be a list of two elements", -1)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "CELL", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "CELL", (char *)NULL); return TCL_ERROR; } /* Valid item/column in each pair? */ @@ -1107,7 +1114,7 @@ static int GetCellFromObj( if (i == tv->tree.nDisplayColumns) { /* specified column unviewable */ Tcl_SetObjResult(interp, Tcl_NewStringObj( "Cell id must be in a visible column", -1)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "CELL", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "CELL", (char *)NULL); return TCL_ERROR; } if (displayColumn != NULL) { @@ -1347,8 +1354,9 @@ static void TreeviewCleanup(void *recordPtr) FreeColumn(&tv->tree.column0); TreeviewFreeColumns(tv); - if (tv->tree.displayColumns) + if (tv->tree.displayColumns) { ckfree(tv->tree.displayColumns); + } foreachHashEntry(&tv->tree.items, FreeItemCB); Tcl_DeleteHashTable(&tv->tree.items); @@ -1370,13 +1378,15 @@ TreeviewConfigure(Tcl_Interp *interp, void *recordPtr, int mask) unsigned showFlags = tv->tree.showFlags; if (mask & COLUMNS_CHANGED) { - if (TreeviewInitColumns(interp, tv) != TCL_OK) + if (TreeviewInitColumns(interp, tv) != TCL_OK) { return TCL_ERROR; + } mask |= DCOLUMNS_CHANGED; } if (mask & DCOLUMNS_CHANGED) { - if (TreeviewInitDisplayColumns(interp, tv) != TCL_OK) + if (TreeviewInitDisplayColumns(interp, tv) != TCL_OK) { return TCL_ERROR; + } } if (mask & COLUMNS_CHANGED) { CellSelectionClear(tv); @@ -1385,14 +1395,14 @@ TreeviewConfigure(Tcl_Interp *interp, void *recordPtr, int mask) Tcl_SetObjResult(interp, Tcl_ObjPrintf( "\"#%" TCL_SIZE_MODIFIER "d\" is out of range", tv->tree.nTitleColumns)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "TITLECOLUMNS", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "TITLECOLUMNS", (char *)NULL); return TCL_ERROR; } if (tv->tree.nTitleItems < 0) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "\"%" TCL_SIZE_MODIFIER "d\" is out of range", tv->tree.nTitleItems)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "TITLEITEMS", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "TITLEITEMS", (char *)NULL); return TCL_ERROR; } if (mask & SCROLLCMD_CHANGED) { @@ -1441,8 +1451,9 @@ static int ConfigureItem( */ if (item->valuesObj) { Tcl_Size unused; - if (Tcl_ListObjLength(interp, item->valuesObj, &unused) != TCL_OK) + if (Tcl_ListObjLength(interp, item->valuesObj, &unused) != TCL_OK) { goto error; + } } /* Check -height @@ -1450,7 +1461,7 @@ static int ConfigureItem( if (item->height < 1) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Invalid item height %d", item->height)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "HEIGHT", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "HEIGHT", (char *)NULL); goto error; } @@ -1480,12 +1491,14 @@ static int ConfigureItem( */ if (item->openObj) { int isOpen; - if (Tcl_GetBooleanFromObj(interp, item->openObj, &isOpen) != TCL_OK) + if (Tcl_GetBooleanFromObj(interp, item->openObj, &isOpen) != TCL_OK) { goto error; - if (isOpen) + } + if (isOpen) { item->state |= TTK_STATE_OPEN; - else + } else { item->state &= ~TTK_STATE_OPEN; + } } /* All OK. @@ -1530,7 +1543,7 @@ static int ConfigureColumn( if (mask & READONLY_OPTION) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "Attempt to change read-only option", -1)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "READONLY", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "READONLY", (char *)NULL); goto error; } @@ -1889,8 +1902,9 @@ static Ttk_Layout GetSublayout( interp, themePtr, parentLayout, layoutName, optionTable); if (newLayout) { - if (*layoutPtr) + if (*layoutPtr) { Ttk_FreeLayout(*layoutPtr); + } *layoutPtr = newLayout; } return newLayout; @@ -2036,10 +2050,12 @@ static int TreeviewSize(void *clientData, int *widthPtr, int *heightPtr) static Ttk_State ItemState(Treeview *tv, TreeItem *item) { Ttk_State state = tv->core.state | item->state; - if (!item->children) + if (!item->children) { state |= TTK_STATE_LEAF; - if (item != tv->tree.focus) + } + if (item != tv->tree.focus) { state &= ~TTK_STATE_FOCUS; + } return state; } @@ -2591,7 +2607,7 @@ static int AncestryCheck( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Cannot insert %s as descendant of %s", ItemName(tv, item), ItemName(tv, parent))); - Tcl_SetErrorCode(interp, "TTK", "TREE", "ANCESTRY", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "ANCESTRY", (char *)NULL); return 0; } p = p->parent; @@ -2653,8 +2669,9 @@ static int TreeviewChildrenCommand( TreeItem *child; int i; - if (!newChildren) + if (!newChildren) { return TCL_ERROR; + } /* Sanity-check: */ @@ -2935,10 +2952,12 @@ static int TreeviewHorribleIdentify( done: result = Tcl_NewListObj(0,0); Tcl_ListObjAppendElement(NULL, result, Tcl_NewStringObj(what, -1)); - if (item) + if (item) { Tcl_ListObjAppendElement(NULL, result, ItemID(tv, item)); - if (detail) + } + if (detail) { Tcl_ListObjAppendElement(NULL, result, Tcl_NewStringObj(detail, -1)); + } Tcl_SetObjResult(interp, result); return TCL_OK; @@ -3170,8 +3189,9 @@ static int TreeviewSetCommand( Tcl_WrongNumArgs(interp, 2, objv, "item ?column ?value??"); return TCL_ERROR; } - if (!(item = FindItem(interp, tv, objv[2]))) + if (!(item = FindItem(interp, tv, objv[2]))) { return TCL_ERROR; + } /* Make sure -values exists: */ @@ -3199,14 +3219,15 @@ static int TreeviewSetCommand( /* else -- get or set column */ - if (!(column = FindColumn(interp, tv, objv[3]))) + if (!(column = FindColumn(interp, tv, objv[3]))) { return TCL_ERROR; + } if (column == &tv->tree.column0) { /* @@@ Maybe set -text here instead? */ Tcl_SetObjResult(interp, Tcl_NewStringObj( "Display column #0 cannot be set", -1)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "COLUMN_0", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "COLUMN_0", (char *)NULL); return TCL_ERROR; } @@ -3277,8 +3298,9 @@ static int TreeviewInsertCommand( sibling = EndPosition(tv, parent); } else { int index; - if (Tcl_GetIntFromObj(interp, objv[3], &index) != TCL_OK) + if (Tcl_GetIntFromObj(interp, objv[3], &index) != TCL_OK) { return TCL_ERROR; + } sibling = InsertPosition(parent, index); } @@ -3294,7 +3316,7 @@ static int TreeviewInsertCommand( if (!isNew) { Tcl_SetObjResult(interp, Tcl_ObjPrintf( "Item %s already exists", itemName)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "ITEM_EXISTS", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "ITEM_EXISTS", (char *)NULL); return TCL_ERROR; } objc -= 2; objv += 2; @@ -3354,7 +3376,7 @@ static int TreeviewDetachCommand( if (items[i] == tv->tree.root) { Tcl_SetObjResult(interp, Tcl_NewStringObj( "Cannot detach root item", -1)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "ROOT", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "ROOT", (char *)NULL); ckfree(items); return TCL_ERROR; } @@ -3443,7 +3465,7 @@ static int TreeviewDeleteCommand( ckfree(items); Tcl_SetObjResult(interp, Tcl_NewStringObj( "Cannot delete root item", -1)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "ROOT", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "ROOT", (char *)NULL); return TCL_ERROR; } } @@ -3468,10 +3490,12 @@ static int TreeviewDeleteCommand( */ while (delq) { TreeItem *next = delq->next; - if (tv->tree.focus == delq) + if (tv->tree.focus == delq) { tv->tree.focus = 0; - if (tv->tree.endPtr == delq) + } + if (tv->tree.endPtr == delq) { tv->tree.endPtr = 0; + } FreeItem(delq); delq = next; } @@ -3676,7 +3700,7 @@ static int TreeviewDragCommand( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "column %s is not displayed", Tcl_GetString(objv[2]))); - Tcl_SetErrorCode(interp, "TTK", "TREE", "COLUMN_INVISIBLE", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "COLUMN_INVISIBLE", (char *)NULL); return TCL_ERROR; } @@ -3712,8 +3736,9 @@ static int TreeviewFocusCommand( return TCL_OK; } else if (objc == 3) { TreeItem *newFocus = FindItem(interp, tv, objv[2]); - if (!newFocus) + if (!newFocus) { return TCL_ERROR; + } tv->tree.focus = newFocus; TtkRedisplayWidget(&tv->core); return TCL_OK; @@ -3742,8 +3767,9 @@ static int TreeviewSelectionCommand( if (objc == 2) { Tcl_Obj *result = Tcl_NewListObj(0,0); for (item = tv->tree.root->children; item; item = NextPreorder(item)) { - if (item->state & TTK_STATE_SELECTED) + if (item->state & TTK_STATE_SELECTED) { Tcl_ListObjAppendElement(NULL, result, ItemID(tv, item)); + } } Tcl_SetObjResult(interp, result); return TCL_OK; @@ -4106,7 +4132,7 @@ static int TreeviewTagBindCommand( Tcl_SetObjResult(interp, Tcl_ObjPrintf( "unsupported event %s\nonly key, button, motion, and" " virtual events supported", sequence)); - Tcl_SetErrorCode(interp, "TTK", "TREE", "BIND_EVENTS", NULL); + Tcl_SetErrorCode(interp, "TTK", "TREE", "BIND_EVENTS", (char *)NULL); return TCL_ERROR; } } diff --git a/generic/ttk/ttkWidget.c b/generic/ttk/ttkWidget.c index 3c345d2..40b8ee1 100644 --- a/generic/ttk/ttkWidget.c +++ b/generic/ttk/ttkWidget.c @@ -202,8 +202,9 @@ WidgetInstanceObjCmdDeleted(void *clientData) { WidgetCore *corePtr = (WidgetCore *)clientData; corePtr->widgetCmd = NULL; - if (corePtr->tkwin != NULL) + if (corePtr->tkwin != NULL) { Tk_DestroyWindow(corePtr->tkwin); + } } /* DestroyWidget -- @@ -288,10 +289,11 @@ static void CoreEventProc(void *clientData, XEvent *eventPtr) || eventPtr->xfocus.detail == NotifyAncestor || eventPtr->xfocus.detail == NotifyNonlinear) { - if (eventPtr->type == FocusIn) + if (eventPtr->type == FocusIn) { corePtr->state |= TTK_STATE_FOCUS; - else + } else { corePtr->state &= ~TTK_STATE_FOCUS; + } TtkRedisplayWidget(corePtr); } break; @@ -367,8 +369,9 @@ int TtkWidgetConstructorObjCmd( tkwin = Tk_CreateWindowFromPath( interp, Tk_MainWindow(interp), Tcl_GetString(objv[1]), NULL); - if (tkwin == NULL) + if (tkwin == NULL) { return TCL_ERROR; + } /* * Allocate and initialize the widget record. @@ -411,13 +414,16 @@ int TtkWidgetConstructorObjCmd( } else { Tk_FreeSavedOptions(&savedOptions); } - if (widgetSpec->configureProc(interp, recordPtr, ~0) != TCL_OK) + if (widgetSpec->configureProc(interp, recordPtr, ~0) != TCL_OK) { goto error; - if (widgetSpec->postConfigureProc(interp, recordPtr, ~0) != TCL_OK) + } + if (widgetSpec->postConfigureProc(interp, recordPtr, ~0) != TCL_OK) { goto error; + } - if (WidgetDestroyed(corePtr)) + if (WidgetDestroyed(corePtr)) { goto error; + } Tcl_Release(corePtr); @@ -453,11 +459,13 @@ Ttk_Layout TtkWidgetGetLayout( WidgetCore *corePtr = (WidgetCore *)recordPtr; const char *styleName = 0; - if (corePtr->styleObj) + if (corePtr->styleObj) { styleName = Tcl_GetString(corePtr->styleObj); + } - if (!styleName || *styleName == '\0') + if (!styleName || *styleName == '\0') { styleName = corePtr->widgetSpec->className; + } return Ttk_CreateLayout(interp, themePtr, styleName, recordPtr, corePtr->optionTable, corePtr->tkwin); @@ -483,17 +491,20 @@ Ttk_Layout TtkWidgetGetOrientedLayout( /* Prefix: */ Ttk_GetOrientFromObj(NULL, orientObj, &orient); - if (orient == TTK_ORIENT_HORIZONTAL) + if (orient == TTK_ORIENT_HORIZONTAL) { Tcl_DStringAppend(&styleName, "Horizontal.", TCL_INDEX_NONE); - else + } else { Tcl_DStringAppend(&styleName, "Vertical.", TCL_INDEX_NONE); + } /* Add base style name: */ - if (corePtr->styleObj) + if (corePtr->styleObj) { baseStyleName = Tcl_GetString(corePtr->styleObj); - if (!baseStyleName || *baseStyleName == '\0') + } + if (!baseStyleName || *baseStyleName == '\0') { baseStyleName = corePtr->widgetSpec->className; + } Tcl_DStringAppend(&styleName, baseStyleName, TCL_INDEX_NONE); @@ -598,8 +609,9 @@ int TtkWidgetCgetCommand( } result = Tk_GetOptionValue(interp, recordPtr, corePtr->optionTable, objv[2], corePtr->tkwin); - if (result == NULL) + if (result == NULL) { return TCL_ERROR; + } Tcl_SetObjResult(interp, result); return TCL_OK; } @@ -626,8 +638,9 @@ int TtkWidgetConfigureCommand( status = Tk_SetOptions(interp, recordPtr, corePtr->optionTable, objc - 2, objv + 2, corePtr->tkwin, &savedOptions, &mask); - if (status != TCL_OK) + if (status != TCL_OK) { return status; + } if (mask & READONLY_OPTION) { Tcl_SetObjResult(interp, Tcl_NewStringObj( @@ -695,8 +708,9 @@ int TtkWidgetStateCommand( return TCL_ERROR; } status = Ttk_GetStateSpecFromObj(interp, objv[2], &spec); - if (status != TCL_OK) + if (status != TCL_OK) { return status; + } oldState = corePtr->state; corePtr->state = Ttk_ModifyState(corePtr->state, &spec); @@ -729,8 +743,9 @@ int TtkWidgetInstateCommand( return TCL_ERROR; } status = Ttk_GetStateSpecFromObj(interp, objv[2], &spec); - if (status != TCL_OK) + if (status != TCL_OK) { return status; + } if (objc == 3) { Tcl_SetObjResult(interp, |
