summaryrefslogtreecommitdiffstats
path: root/unix/tkUnixScale.c
diff options
context:
space:
mode:
Diffstat (limited to 'unix/tkUnixScale.c')
-rw-r--r--unix/tkUnixScale.c124
1 files changed, 70 insertions, 54 deletions
diff --git a/unix/tkUnixScale.c b/unix/tkUnixScale.c
index 8f4d23b..69bcb27 100644
--- a/unix/tkUnixScale.c
+++ b/unix/tkUnixScale.c
@@ -114,17 +114,21 @@ DisplayVerticalScale(
int x, y, width, height, shadowWidth;
double tickValue, tickInterval = scalePtr->tickInterval;
Tk_3DBorder sliderBorder;
+ int scaleWidth, borderWidth, sliderLength;
/*
* Display the information from left to right across the window.
*/
+ Tk_GetPixelsFromObj(NULL, tkwin, scalePtr->widthObj, &scaleWidth);
+ Tk_GetPixelsFromObj(NULL, tkwin, scalePtr->borderWidthObj, &borderWidth);
+ Tk_GetPixelsFromObj(NULL, tkwin, scalePtr->sliderLengthObj, &sliderLength);
if (!(scalePtr->flags & REDRAW_OTHER)) {
drawnAreaPtr->x = scalePtr->vertTickRightX;
drawnAreaPtr->y = scalePtr->inset;
- drawnAreaPtr->width = scalePtr->vertTroughX + scalePtr->width
- + 2*scalePtr->borderWidth - scalePtr->vertTickRightX;
- drawnAreaPtr->height -= 2*scalePtr->inset;
+ drawnAreaPtr->width = scalePtr->vertTroughX + scaleWidth
+ + 2 * borderWidth - scalePtr->vertTickRightX;
+ drawnAreaPtr->height -= 2 * scalePtr->inset;
}
Tk_Fill3DRectangle(tkwin, drawable, scalePtr->bgBorder,
drawnAreaPtr->x, drawnAreaPtr->y, drawnAreaPtr->width,
@@ -187,33 +191,33 @@ DisplayVerticalScale(
Tk_Draw3DRectangle(tkwin, drawable,
scalePtr->bgBorder, scalePtr->vertTroughX, scalePtr->inset,
- scalePtr->width + 2*scalePtr->borderWidth,
- Tk_Height(tkwin) - 2*scalePtr->inset, scalePtr->borderWidth,
+ scaleWidth + 2 * borderWidth,
+ Tk_Height(tkwin) - 2 * scalePtr->inset, borderWidth,
TK_RELIEF_SUNKEN);
XFillRectangle(scalePtr->display, drawable, scalePtr->troughGC,
- scalePtr->vertTroughX + scalePtr->borderWidth,
- scalePtr->inset + scalePtr->borderWidth,
- (unsigned) scalePtr->width,
- (unsigned) (Tk_Height(tkwin) - 2*scalePtr->inset
- - 2*scalePtr->borderWidth));
+ scalePtr->vertTroughX + borderWidth,
+ scalePtr->inset + borderWidth,
+ (unsigned) scaleWidth,
+ (unsigned) (Tk_Height(tkwin) - 2 * scalePtr->inset
+ - 2 * borderWidth));
if (scalePtr->state == STATE_ACTIVE) {
sliderBorder = scalePtr->activeBorder;
} else {
sliderBorder = scalePtr->bgBorder;
}
- width = scalePtr->width;
- height = scalePtr->sliderLength/2;
- x = scalePtr->vertTroughX + scalePtr->borderWidth;
+ width = scaleWidth;
+ height = sliderLength / 2;
+ x = scalePtr->vertTroughX + borderWidth;
y = TkScaleValueToPixel(scalePtr, scalePtr->value) - height;
- shadowWidth = scalePtr->borderWidth/2;
+ shadowWidth = borderWidth / 2;
if (shadowWidth == 0) {
shadowWidth = 1;
}
Tk_Draw3DRectangle(tkwin, drawable, sliderBorder, x, y, width,
- 2*height, shadowWidth, scalePtr->sliderRelief);
+ 2 * height, shadowWidth, scalePtr->sliderRelief);
x += shadowWidth;
y += shadowWidth;
- width -= 2*shadowWidth;
+ width -= 2 * shadowWidth;
height -= shadowWidth;
Tk_Fill3DRectangle(tkwin, drawable, sliderBorder, x, y, width,
height, shadowWidth, scalePtr->sliderRelief);
@@ -224,13 +228,14 @@ DisplayVerticalScale(
* Draw the label to the right of the scale.
*/
- if ((scalePtr->flags & REDRAW_OTHER) && (scalePtr->labelLength != 0)) {
+ if ((scalePtr->flags & REDRAW_OTHER) && (scalePtr->labelObj != NULL)) {
Tk_FontMetrics fm;
+ Tcl_Size labelLength;
+ const char *label = Tcl_GetStringFromObj(scalePtr->labelObj, &labelLength);
Tk_GetFontMetrics(scalePtr->tkfont, &fm);
Tk_DrawChars(scalePtr->display, drawable, scalePtr->textGC,
- scalePtr->tkfont, scalePtr->label,
- scalePtr->labelLength, scalePtr->vertLabelX,
+ scalePtr->tkfont, label, labelLength, scalePtr->vertLabelX,
scalePtr->inset + (3 * fm.ascent) / 2);
}
}
@@ -329,17 +334,21 @@ DisplayHorizontalScale(
int x, y, width, height, shadowWidth;
double tickInterval = scalePtr->tickInterval;
Tk_3DBorder sliderBorder;
+ int scaleWidth, borderWidth, sliderLength;
/*
* Display the information from bottom to top across the window.
*/
+ Tk_GetPixelsFromObj(NULL, tkwin, scalePtr->widthObj, &scaleWidth);
+ Tk_GetPixelsFromObj(NULL, tkwin, scalePtr->borderWidthObj, &borderWidth);
+ Tk_GetPixelsFromObj(NULL, tkwin, scalePtr->sliderLengthObj, &sliderLength);
if (!(scalePtr->flags & REDRAW_OTHER)) {
drawnAreaPtr->x = scalePtr->inset;
drawnAreaPtr->y = scalePtr->horizValueY;
drawnAreaPtr->width -= 2*scalePtr->inset;
- drawnAreaPtr->height = scalePtr->horizTroughY + scalePtr->width
- + 2*scalePtr->borderWidth - scalePtr->horizValueY;
+ drawnAreaPtr->height = scalePtr->horizTroughY + scaleWidth
+ + 2 * borderWidth - scalePtr->horizValueY;
}
Tk_Fill3DRectangle(tkwin, drawable, scalePtr->bgBorder,
drawnAreaPtr->x, drawnAreaPtr->y, drawnAreaPtr->width,
@@ -410,25 +419,25 @@ DisplayHorizontalScale(
y = scalePtr->horizTroughY;
Tk_Draw3DRectangle(tkwin, drawable,
scalePtr->bgBorder, scalePtr->inset, y,
- Tk_Width(tkwin) - 2*scalePtr->inset,
- scalePtr->width + 2*scalePtr->borderWidth,
- scalePtr->borderWidth, TK_RELIEF_SUNKEN);
+ Tk_Width(tkwin) - 2 * scalePtr->inset,
+ scaleWidth + 2 * borderWidth,
+ borderWidth, TK_RELIEF_SUNKEN);
XFillRectangle(scalePtr->display, drawable, scalePtr->troughGC,
- scalePtr->inset + scalePtr->borderWidth,
- y + scalePtr->borderWidth,
- (unsigned) (Tk_Width(tkwin) - 2*scalePtr->inset
- - 2*scalePtr->borderWidth),
- (unsigned) scalePtr->width);
+ scalePtr->inset + borderWidth,
+ y + borderWidth,
+ (unsigned) (Tk_Width(tkwin) - 2 * scalePtr->inset
+ - 2 * borderWidth),
+ (unsigned) scaleWidth);
if (scalePtr->state == STATE_ACTIVE) {
sliderBorder = scalePtr->activeBorder;
} else {
sliderBorder = scalePtr->bgBorder;
}
- width = scalePtr->sliderLength/2;
- height = scalePtr->width;
+ width = sliderLength / 2;
+ height = scaleWidth;
x = TkScaleValueToPixel(scalePtr, scalePtr->value) - width;
- y += scalePtr->borderWidth;
- shadowWidth = scalePtr->borderWidth/2;
+ y += borderWidth;
+ shadowWidth = borderWidth / 2;
if (shadowWidth == 0) {
shadowWidth = 1;
}
@@ -447,13 +456,14 @@ DisplayHorizontalScale(
* Draw the label at the top of the scale.
*/
- if ((scalePtr->flags & REDRAW_OTHER) && (scalePtr->labelLength != 0)) {
+ if ((scalePtr->flags & REDRAW_OTHER) && (scalePtr->labelObj != NULL)) {
Tk_FontMetrics fm;
+ Tcl_Size labelLength;
+ const char *label = Tcl_GetStringFromObj(scalePtr->labelObj, &labelLength);
Tk_GetFontMetrics(scalePtr->tkfont, &fm);
Tk_DrawChars(scalePtr->display, drawable, scalePtr->textGC,
- scalePtr->tkfont, scalePtr->label,
- scalePtr->labelLength, scalePtr->inset + fm.ascent/2,
+ scalePtr->tkfont, label, labelLength, scalePtr->inset + fm.ascent/2,
scalePtr->horizLabelY + fm.ascent);
}
}
@@ -554,9 +564,10 @@ TkpDisplayScale(
char string[TCL_DOUBLE_SPACE];
XRectangle drawnArea;
Tcl_DString buf;
+ int highlightWidth, borderWidth;
scalePtr->flags &= ~REDRAW_PENDING;
- if ((scalePtr->tkwin == NULL) || !Tk_IsMapped(scalePtr->tkwin)) {
+ if ((tkwin == NULL) || !Tk_IsMapped(tkwin)) {
goto done;
}
@@ -565,14 +576,14 @@ TkpDisplayScale(
*/
Tcl_Preserve(scalePtr);
- if ((scalePtr->flags & INVOKE_COMMAND) && (scalePtr->command != NULL)) {
+ if ((scalePtr->flags & INVOKE_COMMAND) && (scalePtr->commandObj != NULL)) {
Tcl_Preserve(interp);
if (snprintf(string, TCL_DOUBLE_SPACE, scalePtr->valueFormat,
scalePtr->value) < 0) {
string[TCL_DOUBLE_SPACE - 1] = '\0';
}
Tcl_DStringInit(&buf);
- Tcl_DStringAppend(&buf, scalePtr->command, TCL_INDEX_NONE);
+ Tcl_DStringAppend(&buf, Tcl_GetString(scalePtr->commandObj), TCL_INDEX_NONE);
Tcl_DStringAppend(&buf, " ", TCL_INDEX_NONE);
Tcl_DStringAppend(&buf, string, TCL_INDEX_NONE);
result = Tcl_EvalEx(interp, Tcl_DStringValue(&buf), TCL_INDEX_NONE, TCL_EVAL_GLOBAL);
@@ -624,15 +635,17 @@ TkpDisplayScale(
* vertical scales: border and traversal highlight.
*/
+ Tk_GetPixelsFromObj(NULL, tkwin, scalePtr->highlightWidthObj, &highlightWidth);
+ Tk_GetPixelsFromObj(NULL, tkwin, scalePtr->borderWidthObj, &borderWidth);
if (scalePtr->flags & REDRAW_OTHER) {
if (scalePtr->relief != TK_RELIEF_FLAT) {
Tk_Draw3DRectangle(tkwin, pixmap, scalePtr->bgBorder,
- scalePtr->highlightWidth, scalePtr->highlightWidth,
- Tk_Width(tkwin) - 2*scalePtr->highlightWidth,
- Tk_Height(tkwin) - 2*scalePtr->highlightWidth,
- scalePtr->borderWidth, scalePtr->relief);
+ highlightWidth, highlightWidth,
+ Tk_Width(tkwin) - 2 * highlightWidth,
+ Tk_Height(tkwin) - 2 * highlightWidth,
+ borderWidth, scalePtr->relief);
}
- if (scalePtr->highlightWidth > 0) {
+ if (highlightWidth > 0) {
GC gc;
if (scalePtr->flags & GOT_FOCUS) {
@@ -641,7 +654,7 @@ TkpDisplayScale(
gc = Tk_GCForColor(
Tk_3DBorderColor(scalePtr->highlightBorder), pixmap);
}
- Tk_DrawFocusHighlight(tkwin, gc, scalePtr->highlightWidth, pixmap);
+ Tk_DrawFocusHighlight(tkwin, gc, highlightWidth, pixmap);
}
}
@@ -684,12 +697,15 @@ TkpScaleElement(
TkScale *scalePtr, /* Widget record for scale. */
int x, int y) /* Coordinates within scalePtr's window. */
{
- int sliderFirst;
+ int sliderFirst, width, borderWidth, sliderLength;
+ Tk_GetPixelsFromObj(NULL, scalePtr->tkwin, scalePtr->widthObj, &width);
+ Tk_GetPixelsFromObj(NULL, scalePtr->tkwin, scalePtr->borderWidthObj, &borderWidth);
+ Tk_GetPixelsFromObj(NULL, scalePtr->tkwin, scalePtr->sliderLengthObj, &sliderLength);
if (scalePtr->orient == ORIENT_VERTICAL) {
if ((x < scalePtr->vertTroughX)
- || (x >= (scalePtr->vertTroughX + 2*scalePtr->borderWidth +
- scalePtr->width))) {
+ || (x >= (scalePtr->vertTroughX + 2 * borderWidth +
+ width))) {
return OTHER;
}
if ((y < scalePtr->inset)
@@ -697,19 +713,19 @@ TkpScaleElement(
return OTHER;
}
sliderFirst = TkScaleValueToPixel(scalePtr, scalePtr->value)
- - scalePtr->sliderLength/2;
+ - sliderLength/2;
if (y < sliderFirst) {
return TROUGH1;
}
- if (y < sliderFirst + scalePtr->sliderLength) {
+ if (y < sliderFirst + sliderLength) {
return SLIDER;
}
return TROUGH2;
}
if ((y < scalePtr->horizTroughY)
- || (y >= (scalePtr->horizTroughY + 2*scalePtr->borderWidth +
- scalePtr->width))) {
+ || (y >= (scalePtr->horizTroughY + 2 * borderWidth +
+ width))) {
return OTHER;
}
if ((x < scalePtr->inset)
@@ -717,11 +733,11 @@ TkpScaleElement(
return OTHER;
}
sliderFirst = TkScaleValueToPixel(scalePtr, scalePtr->value)
- - scalePtr->sliderLength/2;
+ - sliderLength / 2;
if (x < sliderFirst) {
return TROUGH1;
}
- if (x < sliderFirst + scalePtr->sliderLength) {
+ if (x < sliderFirst + sliderLength) {
return SLIDER;
}
return TROUGH2;