diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2005-11-14 11:54:21 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2005-11-14 11:54:21 (GMT) |
commit | 1f3d41930a33bf010c0159ee6409e1ac74d81d61 (patch) | |
tree | 00291dcacfd5759e37d31a967906ccc3e3514e27 /unix/tkUnixButton.c | |
parent | 019c6df65f5e989c826a7bc71e8b03e7a0592f7b (diff) | |
download | tk-1f3d41930a33bf010c0159ee6409e1ac74d81d61.zip tk-1f3d41930a33bf010c0159ee6409e1ac74d81d61.tar.gz tk-1f3d41930a33bf010c0159ee6409e1ac74d81d61.tar.bz2 |
ANSIfy
Diffstat (limited to 'unix/tkUnixButton.c')
-rw-r--r-- | unix/tkUnixButton.c | 384 |
1 files changed, 202 insertions, 182 deletions
diff --git a/unix/tkUnixButton.c b/unix/tkUnixButton.c index cc29a1c..d35524b 100644 --- a/unix/tkUnixButton.c +++ b/unix/tkUnixButton.c @@ -1,15 +1,14 @@ -/* +/* * tkUnixButton.c -- * - * This file implements the Unix specific portion of the button - * widgets. + * This file implements the Unix specific portion of the button widgets. * * Copyright (c) 1996-1997 by Sun Microsystems, Inc. * - * See the file "license.terms" for information on usage and redistribution - * of this file, and for a DISCLAIMER OF ALL WARRANTIES. + * See the file "license.terms" for information on usage and redistribution of + * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkUnixButton.c,v 1.20 2004/12/02 02:10:38 hobbs Exp $ + * RCS: @(#) $Id: tkUnixButton.c,v 1.21 2005/11/14 11:54:21 dkf Exp $ */ #include "tkButton.h" @@ -24,7 +23,7 @@ typedef struct UnixButton { } UnixButton; /* - * The class procedure table for the button widgets. + * The class function table for the button widgets. */ Tk_ClassProcs tkpButtonProcs = { @@ -33,9 +32,9 @@ Tk_ClassProcs tkpButtonProcs = { }; /* - * The button image - * the header info here is ignored, it's the image that's - * important. The colors will be applied as follows: + * The button image. + * The header info here is ignored, it's the image that's important. The + * colors will be applied as follows: * A = Background * B = Background * C = 3D light @@ -91,6 +90,7 @@ static char *button_images[] = { /* * Sizes and offsets into above XPM file. */ + #define CHECK_BUTTON_DIM 13 #define CHECK_MENU_DIM 9 #define CHECK_START 9 @@ -110,20 +110,19 @@ static char *button_images[] = { /* * Indicator Draw Modes */ + #define CHECK_BUTTON 0 #define CHECK_MENU 1 #define RADIO_BUTTON 2 #define RADIO_MENU 3 - /* *---------------------------------------------------------------------- * * TkpDrawCheckIndicator - * - * Draws the checkbox image in the drawable at the (x,y) - * location, value, and state given. This routine is use by the - * button and menu widgets + * Draws the checkbox image in the drawable at the (x,y) location, value, + * and state given. This routine is use by the button and menu widgets * * Results: * None. @@ -134,20 +133,19 @@ static char *button_images[] = { *---------------------------------------------------------------------- */ -void -TkpDrawCheckIndicator(tkwin, display, d, x, y, bgBorder, indicatorColor, - selectColor, disableColor, on, disabled, mode) - Tk_Window tkwin; /* handle for resource alloc */ - Display *display; - Drawable d; /* what to draw on */ - int x, y; /* where to draw */ - Tk_3DBorder bgBorder; /* colors of the border */ - XColor *indicatorColor; /* color of the indicator */ - XColor *selectColor; /* color when selected */ - XColor *disableColor; /* color when disabled */ - int on; /* are we on? */ - int disabled; /* are we disabled? */ - int mode; /* kind of indicator to draw */ +void +TkpDrawCheckIndicator( + Tk_Window tkwin, /* handle for resource alloc */ + Display *display, + Drawable d, /* what to draw on */ + int x, int y, /* where to draw */ + Tk_3DBorder bgBorder, /* colors of the border */ + XColor *indicatorColor, /* color of the indicator */ + XColor *selectColor, /* color when selected */ + XColor *disableColor, /* color when disabled */ + int on, /* are we on? */ + int disabled, /* are we disabled? */ + int mode) /* kind of indicator to draw */ { int ix, iy; int dim; @@ -180,23 +178,23 @@ TkpDrawCheckIndicator(tkwin, display, d, x, y, bgBorder, indicatorColor, depth = Tk_Depth(tkwin); /* - * Compute starting point and dimensions of image inside - * button_images to be used. + * Compute starting point and dimensions of image inside button_images to + * be used. */ switch (mode) { default: case CHECK_BUTTON: - imgsel = on == 2 ? CHECK_DISON_OFFSET : - on == 1 ? CHECK_ON_OFFSET : CHECK_OFF_OFFSET; + imgsel = on == 2 ? CHECK_DISON_OFFSET : + on == 1 ? CHECK_ON_OFFSET : CHECK_OFF_OFFSET; imgsel += disabled && on != 2 ? CHECK_DISOFF_OFFSET : 0; imgstart = CHECK_START; dim = CHECK_BUTTON_DIM; break; case CHECK_MENU: - imgsel = on == 2 ? CHECK_DISOFF_OFFSET : - on == 1 ? CHECK_ON_OFFSET : CHECK_OFF_OFFSET; + imgsel = on == 2 ? CHECK_DISOFF_OFFSET : + on == 1 ? CHECK_ON_OFFSET : CHECK_OFF_OFFSET; imgsel += disabled && on != 2 ? CHECK_DISOFF_OFFSET : 0; imgstart = CHECK_START + 2; imgsel += 2; @@ -205,15 +203,15 @@ TkpDrawCheckIndicator(tkwin, display, d, x, y, bgBorder, indicatorColor, case RADIO_BUTTON: imgsel = on == 2 ? RADIO_DISON_OFFSET : - on==1 ? RADIO_ON_OFFSET : RADIO_OFF_OFFSET; + on==1 ? RADIO_ON_OFFSET : RADIO_OFF_OFFSET; imgsel += disabled && on != 2 ? RADIO_DISOFF_OFFSET : 0; imgstart = RADIO_START; dim = RADIO_BUTTON_DIM; break; - case RADIO_MENU: + case RADIO_MENU: imgsel = on == 2 ? RADIO_DISOFF_OFFSET : - on==1 ? RADIO_ON_OFFSET : RADIO_OFF_OFFSET; + on==1 ? RADIO_ON_OFFSET : RADIO_OFF_OFFSET; imgsel += disabled && on != 2 ? RADIO_DISOFF_OFFSET : 0; imgstart = RADIO_START + 3; imgsel += 3; @@ -222,9 +220,8 @@ TkpDrawCheckIndicator(tkwin, display, d, x, y, bgBorder, indicatorColor, } /* - * Allocate the drawing areas to use. Note that we use - * double-buffering here because not all code paths leading to - * this function do so. + * Allocate the drawing areas to use. Note that we use double-buffering + * here because not all code paths leading to this function do so. */ pixmap = Tk_GetPixmap(display, d, dim, dim, depth); @@ -252,13 +249,13 @@ TkpDrawCheckIndicator(tkwin, display, d, x, y, bgBorder, indicatorColor, imgColors[1 /*B*/] = Tk_GetColorByValue(tkwin, bg_brdr->bgColorPtr)->pixel; imgColors[2 /*C*/] = (bg_brdr->lightColorPtr != NULL) ? - Tk_GetColorByValue(tkwin, bg_brdr->lightColorPtr)->pixel : - WhitePixelOfScreen(bg_brdr->screen); + Tk_GetColorByValue(tkwin, bg_brdr->lightColorPtr)->pixel : + WhitePixelOfScreen(bg_brdr->screen); imgColors[3 /*D*/] = Tk_GetColorByValue(tkwin, selectColor)->pixel; - imgColors[4 /*E*/] = (bg_brdr->darkColorPtr != NULL) ? - Tk_GetColorByValue(tkwin, bg_brdr->darkColorPtr)->pixel : - BlackPixelOfScreen(bg_brdr->screen); + imgColors[4 /*E*/] = (bg_brdr->darkColorPtr != NULL) ? + Tk_GetColorByValue(tkwin, bg_brdr->darkColorPtr)->pixel : + BlackPixelOfScreen(bg_brdr->screen); imgColors[5 /*F*/] = Tk_GetColorByValue(tkwin, bg_brdr->bgColorPtr)->pixel; imgColors[6 /*G*/] = @@ -317,10 +314,10 @@ TkpDrawCheckIndicator(tkwin, display, d, x, y, bgBorder, indicatorColor, */ TkButton * -TkpCreateButton(tkwin) - Tk_Window tkwin; +TkpCreateButton( + Tk_Window tkwin) { - UnixButton *butPtr = (UnixButton *)ckalloc(sizeof(UnixButton)); + UnixButton *butPtr = (UnixButton *) ckalloc(sizeof(UnixButton)); return (TkButton *) butPtr; } @@ -329,29 +326,29 @@ TkpCreateButton(tkwin) * * TkpDisplayButton -- * - * This procedure is invoked to display a button widget. It is - * normally invoked as an idle handler. + * This function is invoked to display a button widget. It is normally + * invoked as an idle handler. * * Results: * None. * * Side effects: - * Commands are output to X to display the button in its - * current mode. The REDRAW_PENDING flag is cleared. + * Commands are output to X to display the button in its current mode. + * The REDRAW_PENDING flag is cleared. * *---------------------------------------------------------------------- */ void -TkpDisplayButton(clientData) - ClientData clientData; /* Information about widget. */ +TkpDisplayButton( + ClientData clientData) /* Information about widget. */ { register TkButton *butPtr = (TkButton *) clientData; GC gc; Tk_3DBorder border; Pixmap pixmap; - int x = 0; /* Initialization only needed to stop - * compiler warning. */ + int x = 0; /* Initialization only needed to stop compiler + * warning. */ int y, relief; Tk_Window tkwin = butPtr->tkwin; int width, height, fullWidth, fullHeight; @@ -359,12 +356,12 @@ TkpDisplayButton(clientData) int haveImage = 0, haveText = 0; int offset; /* 1 means this is a button widget, so we * offset the text to make the button appear - * to move up and down as the relief changes. - */ + * to move up and down as the relief + * changes. */ int imageWidth, imageHeight; - int imageXOffset = 0, imageYOffset = 0; /* image information that will - * be used to restrict disabled - * pixmap as well */ + int imageXOffset = 0, imageYOffset = 0; + /* image information that will be used to + * restrict disabled pixmap as well */ butPtr->flags &= ~REDRAW_PENDING; if ((butPtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) { @@ -387,9 +384,8 @@ TkpDisplayButton(clientData) } /* - * Override the relief specified for the button if this is a - * checkbutton or radiobutton and there's no indicator. The new - * relief is as follows: + * Override the relief specified for the button if this is a checkbutton + * or radiobutton and there's no indicator. The new relief is as follows: * If the button is select --> "sunken" * If relief==overrelief --> relief * Otherwise --> overrelief @@ -403,15 +399,15 @@ TkpDisplayButton(clientData) * on no sunken * on yes sunken * - * This is accomplished by configuring the checkbutton or radiobutton - * like this: + * This is accomplished by configuring the checkbutton or radiobutton like + * this: * * -indicatoron 0 -overrelief raised -offrelief flat * * Bindings (see library/button.tcl) will copy the -overrelief into - * -relief on mouseover. Hence, we can tell if we are in mouse-over by - * comparing relief against overRelief. This is an aweful kludge, but - * it gives use the desired behavior while keeping the code backwards + * -relief on mouseover. Hence, we can tell if we are in mouse-over by + * comparing relief against overRelief. This is an aweful kludge, but it + * gives use the desired behavior while keeping the code backwards * compatible. */ @@ -427,10 +423,10 @@ TkpDisplayButton(clientData) offset = (butPtr->type == TYPE_BUTTON) && !Tk_StrictMotif(butPtr->tkwin); /* - * In order to avoid screen flashes, this procedure redraws - * the button in a pixmap, then copies the pixmap to the - * screen in a single operation. This means that there's no - * point in time where the on-screen image has been cleared. + * In order to avoid screen flashes, this function redraws the button in a + * pixmap, then copies the pixmap to the screen in a single operation. + * This means that there's no point in time where the on-screen image has + * been cleared. */ pixmap = Tk_GetPixmap(butPtr->display, Tk_WindowId(tkwin), @@ -453,7 +449,7 @@ TkpDisplayButton(clientData) imageHeight = height; haveText = (butPtr->textWidth != 0 && butPtr->textHeight != 0); - + if (butPtr->compound != COMPOUND_NONE && haveImage && haveText) { textXOffset = 0; textYOffset = 0; @@ -461,49 +457,56 @@ TkpDisplayButton(clientData) fullHeight = 0; switch ((enum compound) butPtr->compound) { - case COMPOUND_TOP: - case COMPOUND_BOTTOM: { - /* Image is above or below text */ - if (butPtr->compound == COMPOUND_TOP) { - textYOffset = height + butPtr->padY; - } else { - imageYOffset = butPtr->textHeight + butPtr->padY; - } - fullHeight = height + butPtr->textHeight + butPtr->padY; - fullWidth = (width > butPtr->textWidth ? width : - butPtr->textWidth); - textXOffset = (fullWidth - butPtr->textWidth)/2; - imageXOffset = (fullWidth - width)/2; - break; - } - case COMPOUND_LEFT: - case COMPOUND_RIGHT: { - /* Image is left or right of text */ - if (butPtr->compound == COMPOUND_LEFT) { - textXOffset = width + butPtr->padX; - } else { - imageXOffset = butPtr->textWidth + butPtr->padX; - } - fullWidth = butPtr->textWidth + butPtr->padX + width; - fullHeight = (height > butPtr->textHeight ? height : - butPtr->textHeight); - textYOffset = (fullHeight - butPtr->textHeight)/2; - imageYOffset = (fullHeight - height)/2; - break; + case COMPOUND_TOP: + case COMPOUND_BOTTOM: + /* + * Image is above or below text. + */ + + if (butPtr->compound == COMPOUND_TOP) { + textYOffset = height + butPtr->padY; + } else { + imageYOffset = butPtr->textHeight + butPtr->padY; } - case COMPOUND_CENTER: { - /* Image and text are superimposed */ - fullWidth = (width > butPtr->textWidth ? width : - butPtr->textWidth); - fullHeight = (height > butPtr->textHeight ? height : - butPtr->textHeight); - textXOffset = (fullWidth - butPtr->textWidth)/2; - imageXOffset = (fullWidth - width)/2; - textYOffset = (fullHeight - butPtr->textHeight)/2; - imageYOffset = (fullHeight - height)/2; - break; + fullHeight = height + butPtr->textHeight + butPtr->padY; + fullWidth = (width > butPtr->textWidth ? width : + butPtr->textWidth); + textXOffset = (fullWidth - butPtr->textWidth)/2; + imageXOffset = (fullWidth - width)/2; + break; + case COMPOUND_LEFT: + case COMPOUND_RIGHT: + /* + * Image is left or right of text. + */ + + if (butPtr->compound == COMPOUND_LEFT) { + textXOffset = width + butPtr->padX; + } else { + imageXOffset = butPtr->textWidth + butPtr->padX; } - case COMPOUND_NONE: {break;} + fullWidth = butPtr->textWidth + butPtr->padX + width; + fullHeight = (height > butPtr->textHeight ? height : + butPtr->textHeight); + textYOffset = (fullHeight - butPtr->textHeight)/2; + imageYOffset = (fullHeight - height)/2; + break; + case COMPOUND_CENTER: + /* + * Image and text are superimposed. + */ + + fullWidth = (width > butPtr->textWidth ? width : + butPtr->textWidth); + fullHeight = (height > butPtr->textHeight ? height : + butPtr->textHeight); + textXOffset = (fullWidth - butPtr->textWidth)/2; + imageXOffset = (fullWidth - width)/2; + textYOffset = (fullHeight - butPtr->textHeight)/2; + imageYOffset = (fullHeight - height)/2; + break; + case COMPOUND_NONE: + break; } TkComputeAnchor(butPtr->anchor, tkwin, butPtr->padX, butPtr->padY, @@ -526,8 +529,8 @@ TkpDisplayButton(clientData) if (butPtr->image != NULL) { /* - * Do boundary clipping, so that Tk_RedrawImage is passed - * valid coordinates. [Bug 979239] + * Do boundary clipping, so that Tk_RedrawImage is passed valid + * coordinates. [Bug 979239] */ if (imageXOffset < 0) { @@ -578,7 +581,7 @@ TkpDisplayButton(clientData) TkComputeAnchor(butPtr->anchor, tkwin, 0, 0, butPtr->indicatorSpace + width, height, &x, &y); x += butPtr->indicatorSpace; - + x += offset; y += offset; if (relief == TK_RELIEF_RAISED) { @@ -638,9 +641,9 @@ TkpDisplayButton(clientData) TkComputeAnchor(butPtr->anchor, tkwin, butPtr->padX, butPtr->padY, butPtr->indicatorSpace + butPtr->textWidth, butPtr->textHeight, &x, &y); - + x += butPtr->indicatorSpace; - + x += offset; y += offset; if (relief == TK_RELIEF_RAISED) { @@ -657,11 +660,10 @@ TkpDisplayButton(clientData) y += butPtr->textHeight/2; } } - + /* - * Draw the indicator for check buttons and radio buttons. At this - * point x and y refer to the top-left corner of the text or image - * or bitmap. + * Draw the indicator for check buttons and radio buttons. At this point, + * x and y refer to the top-left corner of the text or image or bitmap. */ if ((butPtr->type == TYPE_CHECK_BUTTON) && butPtr->indicatorOn) { @@ -676,7 +678,8 @@ TkpDisplayButton(clientData) y = Tk_Height(tkwin)/2; TkpDrawCheckIndicator(tkwin, butPtr->display, pixmap, x, y, border, butPtr->normalFg, selColor, butPtr->disabledFg, - ((butPtr->flags & SELECTED)?1:(butPtr->flags & TRISTATED)?2:0), + ((butPtr->flags & SELECTED) ? 1 : + (butPtr->flags & TRISTATED) ? 2 : 0), (butPtr->state == STATE_DISABLED), CHECK_BUTTON); } } else if ((butPtr->type == TYPE_RADIO_BUTTON) && butPtr->indicatorOn) { @@ -691,16 +694,17 @@ TkpDisplayButton(clientData) y = Tk_Height(tkwin)/2; TkpDrawCheckIndicator(tkwin, butPtr->display, pixmap, x, y, border, butPtr->normalFg, selColor, butPtr->disabledFg, - ((butPtr->flags & SELECTED)?1:(butPtr->flags & TRISTATED)?2:0), + ((butPtr->flags & SELECTED) ? 1 : + (butPtr->flags & TRISTATED) ? 2 : 0), (butPtr->state == STATE_DISABLED), RADIO_BUTTON); } } /* * If the button is disabled with a stipple rather than a special - * foreground color, generate the stippled effect. If the widget - * is selected and we use a different background color when selected, - * must temporarily modify the GC so the stippling is the right color. + * foreground color, generate the stippled effect. If the widget is + * selected and we use a different background color when selected, must + * temporarily modify the GC so the stippling is the right color. */ if ((butPtr->state == STATE_DISABLED) @@ -710,10 +714,12 @@ TkpDisplayButton(clientData) XSetForeground(butPtr->display, butPtr->stippleGC, Tk_3DBorderColor(butPtr->selectBorder)->pixel); } + /* - * Stipple the whole button if no disabledFg was specified, - * otherwise restrict stippling only to displayed image + * Stipple the whole button if no disabledFg was specified, otherwise + * restrict stippling only to displayed image */ + if (butPtr->disabledFg == NULL) { XFillRectangle(butPtr->display, pixmap, butPtr->stippleGC, 0, 0, (unsigned) Tk_Width(tkwin), (unsigned) Tk_Height(tkwin)); @@ -730,11 +736,11 @@ TkpDisplayButton(clientData) } /* - * Draw the border and traversal highlight last. This way, if the - * button's contents overflow they'll be covered up by the border. - * This code is complicated by the possible combinations of focus - * highlight and default rings. We draw the focus and highlight rings - * using the highlight border and highlight foreground color. + * Draw the border and traversal highlight last. This way, if the button's + * contents overflow they'll be covered up by the border. This code is + * complicated by the possible combinations of focus highlight and default + * rings. We draw the focus and highlight rings using the highlight border + * and highlight foreground color. */ if (relief != TK_RELIEF_FLAT) { @@ -743,10 +749,10 @@ TkpDisplayButton(clientData) if (butPtr->defaultState == DEFAULT_ACTIVE) { /* * Draw the default ring with 2 pixels of space between the - * default ring and the button and the default ring and the - * focus ring. Note that we need to explicitly draw the space - * in the highlightBorder color to ensure that we overwrite any - * overflow text and/or a different button background color. + * default ring and the button and the default ring and the focus + * ring. Note that we need to explicitly draw the space in the + * highlightBorder color to ensure that we overwrite any overflow + * text and/or a different button background color. */ Tk_Draw3DRectangle(tkwin, pixmap, butPtr->highlightBorder, inset, @@ -805,8 +811,8 @@ TkpDisplayButton(clientData) } /* - * Copy the information from the off-screen pixmap onto the screen, - * then delete the pixmap. + * Copy the information from the off-screen pixmap onto the screen, then + * delete the pixmap. */ XCopyArea(butPtr->display, pixmap, Tk_WindowId(tkwin), @@ -820,9 +826,9 @@ TkpDisplayButton(clientData) * * TkpComputeButtonGeometry -- * - * After changes in a button's text or bitmap, this procedure - * recomputes the button's geometry and passes this information - * along to the geometry manager for the window. + * After changes in a button's text or bitmap, this function recomputes + * the button's geometry and passes this information along to the + * geometry manager for the window. * * Results: * None. @@ -834,8 +840,8 @@ TkpDisplayButton(clientData) */ void -TkpComputeButtonGeometry(butPtr) - register TkButton *butPtr; /* Button whose geometry may have changed. */ +TkpComputeButtonGeometry( + register TkButton *butPtr) /* Button whose geometry may have changed. */ { int width, height, avgWidth, txtWidth, txtHeight; int haveImage = 0, haveText = 0; @@ -857,7 +863,7 @@ TkpComputeButtonGeometry(butPtr) txtWidth = 0; txtHeight = 0; avgWidth = 0; - + if (butPtr->image != NULL) { Tk_SizeOfImage(butPtr->image, &width, &height); haveImage = 1; @@ -865,51 +871,58 @@ TkpComputeButtonGeometry(butPtr) Tk_SizeOfBitmap(butPtr->display, butPtr->bitmap, &width, &height); haveImage = 1; } - + if (haveImage == 0 || butPtr->compound != COMPOUND_NONE) { Tk_FreeTextLayout(butPtr->textLayout); - + butPtr->textLayout = Tk_ComputeTextLayout(butPtr->tkfont, Tcl_GetString(butPtr->textPtr), -1, butPtr->wrapLength, butPtr->justify, 0, &butPtr->textWidth, &butPtr->textHeight); - + txtWidth = butPtr->textWidth; txtHeight = butPtr->textHeight; avgWidth = Tk_TextWidth(butPtr->tkfont, "0", 1); Tk_GetFontMetrics(butPtr->tkfont, &fm); haveText = (txtWidth != 0 && txtHeight != 0); } - + /* - * If the button is compound (ie, it shows both an image and text), - * the new geometry is a combination of the image and text geometry. - * We only honor the compound bit if the button has both text and an - * image, because otherwise it is not really a compound button. + * If the button is compound (i.e., it shows both an image and text), the + * new geometry is a combination of the image and text geometry. We only + * honor the compound bit if the button has both text and an image, + * because otherwise it is not really a compound button. */ if (butPtr->compound != COMPOUND_NONE && haveImage && haveText) { switch ((enum compound) butPtr->compound) { - case COMPOUND_TOP: - case COMPOUND_BOTTOM: { - /* Image is above or below text */ - height += txtHeight + butPtr->padY; - width = (width > txtWidth ? width : txtWidth); - break; - } - case COMPOUND_LEFT: - case COMPOUND_RIGHT: { - /* Image is left or right of text */ - width += txtWidth + butPtr->padX; - height = (height > txtHeight ? height : txtHeight); - break; - } - case COMPOUND_CENTER: { - /* Image and text are superimposed */ - width = (width > txtWidth ? width : txtWidth); - height = (height > txtHeight ? height : txtHeight); - break; - } - case COMPOUND_NONE: {break;} + case COMPOUND_TOP: + case COMPOUND_BOTTOM: + /* + * Image is above or below text. + */ + + height += txtHeight + butPtr->padY; + width = (width > txtWidth ? width : txtWidth); + break; + case COMPOUND_LEFT: + case COMPOUND_RIGHT: + /* + * Image is left or right of text. + */ + + width += txtWidth + butPtr->padX; + height = (height > txtHeight ? height : txtHeight); + break; + case COMPOUND_CENTER: + /* + * Image and text are superimposed. + */ + + width = (width > txtWidth ? width : txtWidth); + height = (height > txtHeight ? height : txtHeight); + break; + case COMPOUND_NONE: + break; } if (butPtr->width > 0) { width = butPtr->width; @@ -929,7 +942,6 @@ TkpComputeButtonGeometry(butPtr) width += 2*butPtr->padX; height += 2*butPtr->padY; - } else { if (haveImage) { if (butPtr->width > 0) { @@ -938,7 +950,7 @@ TkpComputeButtonGeometry(butPtr) if (butPtr->height > 0) { height = butPtr->height; } - + if ((butPtr->type >= TYPE_CHECK_BUTTON) && butPtr->indicatorOn) { butPtr->indicatorSpace = height; if (butPtr->type == TYPE_CHECK_BUTTON) { @@ -950,7 +962,7 @@ TkpComputeButtonGeometry(butPtr) } else { width = txtWidth; height = txtHeight; - + if (butPtr->width > 0) { width = butPtr->width * avgWidth; } @@ -971,8 +983,8 @@ TkpComputeButtonGeometry(butPtr) /* * When issuing the geometry request, add extra space for the indicator, * if any, and for the border and padding, plus two extra pixels so the - * display can be offset by 1 pixel in either direction for the raised - * or lowered effect. + * display can be offset by 1 pixel in either direction for the raised or + * lowered effect. */ if ((butPtr->image == NULL) && (butPtr->bitmap == None)) { @@ -987,3 +999,11 @@ TkpComputeButtonGeometry(butPtr) + 2*butPtr->inset), (int) (height + 2*butPtr->inset)); Tk_SetInternalBorder(butPtr->tkwin, butPtr->inset); } + +/* + * Local Variables: + * mode: c + * c-basic-offset: 4 + * fill-column: 78 + * End: + */ |