diff options
author | tmh <tmh> | 2001-05-21 14:07:32 (GMT) |
---|---|---|
committer | tmh <tmh> | 2001-05-21 14:07:32 (GMT) |
commit | 29e6415ec425f744f1595e852af0c922a09258bb (patch) | |
tree | 20838e3aece8170aafef73f9007c1064480550df | |
parent | 234f863650b0b7804c98c2994e07e9ef354b0e92 (diff) | |
download | tk-29e6415ec425f744f1595e852af0c922a09258bb.zip tk-29e6415ec425f744f1595e852af0c922a09258bb.tar.gz tk-29e6415ec425f744f1595e852af0c922a09258bb.tar.bz2 |
implement TIP11, -compound option for menubutton widget
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | doc/menubutton.n | 10 | ||||
-rw-r--r-- | generic/tkMenubutton.c | 14 | ||||
-rw-r--r-- | generic/tkMenubutton.h | 15 | ||||
-rw-r--r-- | mac/tkMacMenubutton.c | 118 | ||||
-rw-r--r-- | tests/menubut.test | 4 | ||||
-rw-r--r-- | unix/tkUnixMenubu.c | 261 |
7 files changed, 368 insertions, 67 deletions
@@ -1,3 +1,16 @@ +2001-05-21 Todd M. Helfter <tmh@purdue.edu + + Implementation of TIP #11, the addition of a -compound + option to the menubutton allowing text and an image to + be displayed at the same time. This behavior is identical + to the behavior of the button widget. + * doc/menubutton.n + * generic/tkMenubutton.c + * generic/tkMenubutton.h + * mac/tkMacMenubutton.c + * tests/menubut.test + * unix/tkUnixMenubu.c + 2001-05-16 Donal K. Fellows <fellowsd@cs.man.ac.uk> * doc/console.n: Added - was erroneously placed in Tcl before... diff --git a/doc/menubutton.n b/doc/menubutton.n index 6501337..64cb5d7 100644 --- a/doc/menubutton.n +++ b/doc/menubutton.n @@ -5,7 +5,7 @@ '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" -'\" RCS: @(#) $Id: menubutton.n,v 1.3 2000/08/25 06:58:32 ericm Exp $ +'\" RCS: @(#) $Id: menubutton.n,v 1.4 2001/05/21 14:07:32 tmh Exp $ '\" .so man.macros .TH menubutton n 4.0 Tk "Tk Built-In Commands" @@ -26,6 +26,14 @@ menubutton \- Create and manipulate menubutton widgets \-disabledforeground \-padx .SE .SH "WIDGET-SPECIFIC OPTIONS" +.OP \-compound compound Compound +Specifies whether the menubutton should display both an image and text, +and if so, where the image should be placed relative to the text. +Valid values for this option are \fBbottom\fR, \fBcenter\fR, +\fBleft\fR, \fBnone\fR, \fBright\fR and \fBtop\fR. The default value +is \fBnone\fR, meaning that the menubutton will display either an image or +text, depending on the values of the \fB\-image\fR and \fB\-bitmap\fR +options. .VS .OP \-direction direction Height Specifies where the menu is going to be popup up. \fBabove\fR tries to diff --git a/generic/tkMenubutton.c b/generic/tkMenubutton.c index bfe43d3..a685f9d 100644 --- a/generic/tkMenubutton.c +++ b/generic/tkMenubutton.c @@ -10,7 +10,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMenubutton.c,v 1.5 2000/11/22 01:49:38 ericm Exp $ + * RCS: @(#) $Id: tkMenubutton.c,v 1.6 2001/05/21 14:07:33 tmh Exp $ */ #include "tkMenubutton.h" @@ -37,6 +37,15 @@ static char *stateStrings[] = { }; /* + * The following table defines the legal values for the -compound option. + * It is used with the "enum compound" declaration in tkButton.h + */ + +static char *compoundStrings[] = { + "bottom", "center", "left", "none", "right", "top", (char *) NULL +}; + +/* * Information used for parsing configuration specs: */ @@ -113,6 +122,9 @@ static Tk_OptionSpec optionSpecs[] = { {TK_OPTION_RELIEF, "-relief", "relief", "Relief", DEF_MENUBUTTON_RELIEF, -1, Tk_Offset(TkMenuButton, relief), 0, 0, 0}, + {TK_OPTION_STRING_TABLE, "-compound", "compound", "Compound", + DEF_BUTTON_COMPOUND, -1, Tk_Offset(TkMenuButton, compound), 0, + (ClientData) compoundStrings, 0}, {TK_OPTION_STRING_TABLE, "-state", "state", "State", DEF_MENUBUTTON_STATE, -1, Tk_Offset(TkMenuButton, state), 0, (ClientData) stateStrings, 0}, diff --git a/generic/tkMenubutton.h b/generic/tkMenubutton.h index 979f23d..a4a8a05 100644 --- a/generic/tkMenubutton.h +++ b/generic/tkMenubutton.h @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMenubutton.h,v 1.6 2000/11/22 01:49:38 ericm Exp $ + * RCS: @(#) $Id: tkMenubutton.h,v 1.7 2001/05/21 14:07:33 tmh Exp $ */ #ifndef _TKMENUBUTTON @@ -25,6 +25,15 @@ #endif /* + * Legal values for the "compound" field of TkButton records. + */ + +enum compound { + COMPOUND_BOTTOM, COMPOUND_CENTER, COMPOUND_LEFT, COMPOUND_NONE, + COMPOUND_RIGHT, COMPOUND_TOP +}; + +/* * Legal values for the "orient" field of TkMenubutton records. */ @@ -162,6 +171,10 @@ typedef struct { * Miscellaneous information: */ + int compound; /* Value of -compound option; specifies whether + * the button should show both an image and + * text, and, if so, how. */ + enum direction direction; /* Direction for where to pop the menu. * Valid directions are "above", "below", * "left", "right", and "flush". "flush" diff --git a/mac/tkMacMenubutton.c b/mac/tkMacMenubutton.c index 4c274e6..1acc521 100644 --- a/mac/tkMacMenubutton.c +++ b/mac/tkMacMenubutton.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkMacMenubutton.c,v 1.7 2000/11/22 01:49:38 ericm Exp $ + * RCS: @(#) $Id: tkMacMenubutton.c,v 1.8 2001/05/21 14:07:33 tmh Exp $ */ #include "tkMenubutton.h" @@ -92,7 +92,9 @@ TkpDisplayMenuButton( * compiler warning. */ int y; Tk_Window tkwin = mbPtr->tkwin; - int width, height; + int width, height, fullWidth, fullHeight; + int imageXOffset, imageYOffset, textXOffset, textYOffset; + int haveImage = 0, haveText = 0; MacMenuButton * macMBPtr = (MacMenuButton *) mbPtr; GWorldPtr destPort; CGrafPtr saveWorld; @@ -119,6 +121,15 @@ TkpDisplayMenuButton( } border = mbPtr->normalBorder; + if (mbPtr->image != None) { + Tk_SizeOfImage(mbPtr->image, &width, &height); + haveImage = 1; + } else if (mbPtr->bitmap != None) { + Tk_SizeOfBitmap(mbPtr->display, mbPtr->bitmap, &width, &height); + haveImage = 1; + } + haveText = (mbPtr->textWidth != 0 && mbPtr->textHeight != 0); + /* * In order to avoid screen flashes, this procedure redraws * the menu button in a pixmap, then copies the pixmap to the @@ -129,6 +140,108 @@ TkpDisplayMenuButton( Tk_Fill3DRectangle(tkwin, Tk_WindowId(tkwin), border, 0, 0, Tk_Width(tkwin), Tk_Height(tkwin), 0, TK_RELIEF_FLAT); + imageXOffset = 0; + imageYOffset = 0; + textXOffset = 0; + textYOffset = 0; + fullWidth = 0; + fullHeight = 0; + + if (mbPtr->compound != COMPOUND_NONE && haveImage && haveText) { + switch ((enum compound) mbPtr->compound) { + case COMPOUND_TOP: + case COMPOUND_BOTTOM: { + /* Image is above or below text */ + if (mbPtr->compound == COMPOUND_TOP) { + textYOffset = height + mbPtr->padY; + } else { + imageYOffset = mbPtr->textHeight + mbPtr->padY; + } + fullHeight = height + mbPtr->textHeight + mbPtr->padY; + fullWidth = (width > mbPtr->textWidth ? width : + mbPtr->textWidth); + textXOffset = (fullWidth - mbPtr->textWidth)/2; + imageXOffset = (fullWidth - width)/2; + break; + } + case COMPOUND_LEFT: + case COMPOUND_RIGHT: { + /* Image is left or right of text */ + if (mbPtr->compound == COMPOUND_LEFT) { + textXOffset = width + mbPtr->padX; + } else { + imageXOffset = mbPtr->textWidth + mbPtr->padX; + } + fullWidth = mbPtr->textWidth + mbPtr->padX + width; + fullHeight = (height > mbPtr->textHeight ? height : + mbPtr->textHeight); + textYOffset = (fullHeight - mbPtr->textHeight)/2; + imageYOffset = (fullHeight - height)/2; + break; + } + case COMPOUND_CENTER: { + /* Image and text are superimposed */ + fullWidth = (width > mbPtr->textWidth ? width : + mbPtr->textWidth); + fullHeight = (height > mbPtr->textHeight ? height : + mbPtr->textHeight); + textXOffset = (fullWidth - mbPtr->textWidth)/2; + imageXOffset = (fullWidth - width)/2; + textYOffset = (fullHeight - mbPtr->textHeight)/2; + imageYOffset = (fullHeight - height)/2; + break; + } + case COMPOUND_NONE: {break;} + } + + + TkComputeAnchor(mbPtr->anchor, tkwin, 0, 0, + mbPtr->indicatorWidth + fullWidth, fullHeight, + &x, &y); + + if (mbPtr->image != NULL) { + Tk_RedrawImage(mbPtr->image, 0, 0, width, height, Tk_WindowId(tkwin), + x + imageXOffset, y + imageYOffset); + } + if (mbPtr->bitmap != None) { + XCopyPlane(mbPtr->display, mbPtr->bitmap, Tk_WindowId(tkwin), + gc, 0, 0, (unsigned) width, (unsigned) height, + x + imageXOffset, y + imageYOffset, 1); + } + if (haveText) { + Tk_DrawTextLayout(mbPtr->display, Tk_WindowId(tkwin), gc, + mbPtr->textLayout, x + textXOffset, y + textYOffset , + 0, -1); + Tk_UnderlineTextLayout(mbPtr->display, Tk_WindowId(tkwin), gc, + mbPtr->textLayout, x + textXOffset, y + textYOffset , + mbPtr->underline); + } + } else { + if (mbPtr->image != NULL) { + TkComputeAnchor(mbPtr->anchor, tkwin, 0, 0, + width + mbPtr->indicatorWidth, height, &x, &y); + Tk_RedrawImage(mbPtr->image, 0, 0, width, height, Tk_WindowId(tkwin), + x + imageXOffset, y + imageYOffset); + } else if (mbPtr->bitmap != None) { + TkComputeAnchor(mbPtr->anchor, tkwin, 0, 0, + width + mbPtr->indicatorWidth, height, &x, &y); + XCopyPlane(mbPtr->display, mbPtr->bitmap, Tk_WindowId(tkwin), + gc, 0, 0, (unsigned) width, (unsigned) height, + x + imageXOffset, y + imageYOffset, 1); + } else { + TkComputeAnchor(mbPtr->anchor, tkwin, mbPtr->padX, mbPtr->padY, + mbPtr->textWidth + mbPtr->indicatorWidth, + mbPtr->textHeight, &x, &y); + Tk_DrawTextLayout(mbPtr->display, Tk_WindowId(tkwin), gc, + mbPtr->textLayout, x + textXOffset, y + textYOffset, + 0, -1); + Tk_UnderlineTextLayout(mbPtr->display, Tk_WindowId(tkwin), gc, + mbPtr->textLayout, x + textXOffset, y + textYOffset , + mbPtr->underline); + } + } + +#if 0 /* this is the original code */ /* * Display image or bitmap or text for button. */ @@ -156,6 +269,7 @@ TkpDisplayMenuButton( Tk_DrawTextLayout(mbPtr->display, Tk_WindowId(tkwin), gc, mbPtr->textLayout, x, y, 0, -1); } +#endif /* * If the menu button is disabled with a stipple rather than a special diff --git a/tests/menubut.test b/tests/menubut.test index 619f9e9..e1042b1 100644 --- a/tests/menubut.test +++ b/tests/menubut.test @@ -6,7 +6,7 @@ # Copyright (c) 1998-1999 by Scriptics Corporation. # All rights reserved. # -# RCS: @(#) $Id: menubut.test,v 1.5 1999/04/21 21:53:29 rjohnson Exp $ +# RCS: @(#) $Id: menubut.test,v 1.6 2001/05/21 14:07:33 tmh Exp $ # XXX This test file is woefully incomplete right now. If any part # XXX of a procedure has tests then the whole procedure has tests, @@ -138,7 +138,7 @@ test menubutton-3.6 {ButtonWidgetCmd procedure, "cget" option} { } {3} test menubutton-3.7 {ButtonWidgetCmd procedure, "configure" option} { llength [.mb configure] -} {32} +} {33} test menubutton-3.8 {ButtonWidgetCmd procedure, "configure" option} { list [catch {.mb configure -gorp} msg] $msg } {1 {unknown option "-gorp"}} diff --git a/unix/tkUnixMenubu.c b/unix/tkUnixMenubu.c index 8e46f46..186bd75 100644 --- a/unix/tkUnixMenubu.c +++ b/unix/tkUnixMenubu.c @@ -9,7 +9,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkUnixMenubu.c,v 1.5 2000/11/22 01:49:38 ericm Exp $ + * RCS: @(#) $Id: tkUnixMenubu.c,v 1.6 2001/05/21 14:07:33 tmh Exp $ */ #include "tkMenubutton.h" @@ -74,9 +74,11 @@ TkpDisplayMenuButton(clientData) Pixmap pixmap; int x = 0; /* Initialization needed only to stop * compiler warning. */ - int y; + int y = 0; register Tk_Window tkwin = mbPtr->tkwin; - int width, height; + int width, height, fullWidth, fullHeight; + int imageXOffset, imageYOffset, textXOffset, textYOffset; + int haveImage = 0, haveText = 0; mbPtr->flags &= ~REDRAW_PENDING; if ((mbPtr->tkwin == NULL) || !Tk_IsMapped(tkwin)) { @@ -95,6 +97,15 @@ TkpDisplayMenuButton(clientData) border = mbPtr->normalBorder; } + if (mbPtr->image != None) { + Tk_SizeOfImage(mbPtr->image, &width, &height); + haveImage = 1; + } else if (mbPtr->bitmap != None) { + Tk_SizeOfBitmap(mbPtr->display, mbPtr->bitmap, &width, &height); + haveImage = 1; + } + haveText = (mbPtr->textWidth != 0 && mbPtr->textHeight != 0); + /* * In order to avoid screen flashes, this procedure redraws * the menu button in a pixmap, then copies the pixmap to the @@ -107,34 +118,105 @@ TkpDisplayMenuButton(clientData) Tk_Fill3DRectangle(tkwin, pixmap, border, 0, 0, Tk_Width(tkwin), Tk_Height(tkwin), 0, TK_RELIEF_FLAT); - /* - * Display image or bitmap or text for button. - */ + imageXOffset = 0; + imageYOffset = 0; + textXOffset = 0; + textYOffset = 0; + fullWidth = 0; + fullHeight = 0; - if (mbPtr->image != None) { - Tk_SizeOfImage(mbPtr->image, &width, &height); + if (mbPtr->compound != COMPOUND_NONE && haveImage && haveText) { - imageOrBitmap: - TkComputeAnchor(mbPtr->anchor, tkwin, 0, 0, - width + mbPtr->indicatorWidth, height, &x, &y); - if (mbPtr->image != NULL) { - Tk_RedrawImage(mbPtr->image, 0, 0, width, height, pixmap, - x, y); - } else { - XCopyPlane(mbPtr->display, mbPtr->bitmap, pixmap, - gc, 0, 0, (unsigned) width, (unsigned) height, x, y, 1); - } - } else if (mbPtr->bitmap != None) { - Tk_SizeOfBitmap(mbPtr->display, mbPtr->bitmap, &width, &height); - goto imageOrBitmap; + switch ((enum compound) mbPtr->compound) { + case COMPOUND_TOP: + case COMPOUND_BOTTOM: { + /* Image is above or below text */ + if (mbPtr->compound == COMPOUND_TOP) { + textYOffset = height + mbPtr->padY; + } else { + imageYOffset = mbPtr->textHeight + mbPtr->padY; + } + fullHeight = height + mbPtr->textHeight + mbPtr->padY; + fullWidth = (width > mbPtr->textWidth ? width : + mbPtr->textWidth); + textXOffset = (fullWidth - mbPtr->textWidth)/2; + imageXOffset = (fullWidth - width)/2; + break; + } + case COMPOUND_LEFT: + case COMPOUND_RIGHT: { + /* Image is left or right of text */ + if (mbPtr->compound == COMPOUND_LEFT) { + textXOffset = width + mbPtr->padX; + } else { + imageXOffset = mbPtr->textWidth + mbPtr->padX; + } + fullWidth = mbPtr->textWidth + mbPtr->padX + width; + fullHeight = (height > mbPtr->textHeight ? height : + mbPtr->textHeight); + textYOffset = (fullHeight - mbPtr->textHeight)/2; + imageYOffset = (fullHeight - height)/2; + break; + } + case COMPOUND_CENTER: { + /* Image and text are superimposed */ + fullWidth = (width > mbPtr->textWidth ? width : + mbPtr->textWidth); + fullHeight = (height > mbPtr->textHeight ? height : + mbPtr->textHeight); + textXOffset = (fullWidth - mbPtr->textWidth)/2; + imageXOffset = (fullWidth - width)/2; + textYOffset = (fullHeight - mbPtr->textHeight)/2; + imageYOffset = (fullHeight - height)/2; + break; + } + case COMPOUND_NONE: {break;} + } + + TkComputeAnchor(mbPtr->anchor, tkwin, 0, 0, + mbPtr->indicatorWidth + fullWidth, fullHeight, + &x, &y); + + if (mbPtr->image != NULL) { + Tk_RedrawImage(mbPtr->image, 0, 0, width, height, pixmap, + x + imageXOffset, y + imageYOffset); + } + if (mbPtr->bitmap != None) { + XCopyPlane(mbPtr->display, mbPtr->bitmap, pixmap, + gc, 0, 0, (unsigned) width, (unsigned) height, + x + imageXOffset, y + imageYOffset, 1); + } + if (haveText) { + Tk_DrawTextLayout(mbPtr->display, pixmap, gc, mbPtr->textLayout, + x + textXOffset, y + textYOffset , + 0, -1); + Tk_UnderlineTextLayout(mbPtr->display, pixmap, gc, + mbPtr->textLayout, x + textXOffset, y + textYOffset , + mbPtr->underline); + } } else { - TkComputeAnchor(mbPtr->anchor, tkwin, mbPtr->padX, mbPtr->padY, - mbPtr->textWidth + mbPtr->indicatorWidth, - mbPtr->textHeight, &x, &y); - Tk_DrawTextLayout(mbPtr->display, pixmap, gc, mbPtr->textLayout, x, y, - 0, -1); - Tk_UnderlineTextLayout(mbPtr->display, pixmap, gc, mbPtr->textLayout, - x, y, mbPtr->underline); + if (mbPtr->image != NULL) { + TkComputeAnchor(mbPtr->anchor, tkwin, 0, 0, + width + mbPtr->indicatorWidth, height, &x, &y); + Tk_RedrawImage(mbPtr->image, 0, 0, width, height, pixmap, + x + imageXOffset, y + imageYOffset); + } else if (mbPtr->bitmap != None) { + TkComputeAnchor(mbPtr->anchor, tkwin, 0, 0, + width + mbPtr->indicatorWidth, height, &x, &y); + XCopyPlane(mbPtr->display, mbPtr->bitmap, pixmap, + gc, 0, 0, (unsigned) width, (unsigned) height, + x + imageXOffset, y + imageYOffset, 1); + } else { + TkComputeAnchor(mbPtr->anchor, tkwin, mbPtr->padX, mbPtr->padY, + mbPtr->textWidth + mbPtr->indicatorWidth, + mbPtr->textHeight, &x, &y); + Tk_DrawTextLayout(mbPtr->display, pixmap, gc, mbPtr->textLayout, + x + textXOffset, y + textYOffset , + 0, -1); + Tk_UnderlineTextLayout(mbPtr->display, pixmap, gc, + mbPtr->textLayout, x + textXOffset, y + textYOffset , + mbPtr->underline); + } } /* @@ -251,54 +333,113 @@ TkpComputeMenuButtonGeometry(mbPtr) TkMenuButton *mbPtr; /* Widget record for menu button. */ { int width, height, mm, pixels; + int avgWidth, txtWidth, txtHeight; + int haveImage = 0, haveText = 0; + Tk_FontMetrics fm; mbPtr->inset = mbPtr->highlightWidth + mbPtr->borderWidth; + + width = 0; + height = 0; + txtWidth = 0; + txtHeight = 0; + avgWidth = 0; + if (mbPtr->image != None) { Tk_SizeOfImage(mbPtr->image, &width, &height); - if (mbPtr->width > 0) { - width = mbPtr->width; - } - if (mbPtr->height > 0) { - height = mbPtr->height; - } + haveImage = 1; } else if (mbPtr->bitmap != None) { Tk_SizeOfBitmap(mbPtr->display, mbPtr->bitmap, &width, &height); - if (mbPtr->width > 0) { - width = mbPtr->width; - } - if (mbPtr->height > 0) { - height = mbPtr->height; - } - } else { + haveImage = 1; + } + + if (haveImage == 0 || mbPtr->compound != COMPOUND_NONE) { Tk_FreeTextLayout(mbPtr->textLayout); + mbPtr->textLayout = Tk_ComputeTextLayout(mbPtr->tkfont, mbPtr->text, -1, mbPtr->wrapLength, mbPtr->justify, 0, &mbPtr->textWidth, &mbPtr->textHeight); - width = mbPtr->textWidth; - height = mbPtr->textHeight; - if (mbPtr->width > 0) { - width = mbPtr->width * Tk_TextWidth(mbPtr->tkfont, "0", 1); - } - if (mbPtr->height > 0) { - Tk_FontMetrics fm; + txtWidth = mbPtr->textWidth; + txtHeight = mbPtr->textHeight; + avgWidth = Tk_TextWidth(mbPtr->tkfont, "0", 1); + Tk_GetFontMetrics(mbPtr->tkfont, &fm); + haveText = (txtWidth != 0 && txtHeight != 0); + } + + /* + * If the menubutton 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 menubutton has both text and + * an image, because otherwise it is not really a compound menubutton. + */ - Tk_GetFontMetrics(mbPtr->tkfont, &fm); - height = mbPtr->height * fm.linespace; + if (mbPtr->compound != COMPOUND_NONE && haveImage && haveText) { + switch ((enum compound) mbPtr->compound) { + case COMPOUND_TOP: + case COMPOUND_BOTTOM: { + /* Image is above or below text */ + height += txtHeight + mbPtr->padY; + width = (width > txtWidth ? width : txtWidth); + break; + } + case COMPOUND_LEFT: + case COMPOUND_RIGHT: { + /* Image is left or right of text */ + width += txtWidth + mbPtr->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 (mbPtr->width > 0) { + width = mbPtr->width; + } + if (mbPtr->height > 0) { + height = mbPtr->height; + } + width += 2*mbPtr->padX; + height += 2*mbPtr->padY; + } else { + if (haveImage) { + if (mbPtr->width > 0) { + width = mbPtr->width; + } + if (mbPtr->height > 0) { + height = mbPtr->height; + } + } else { + width = txtWidth; + height = txtHeight; + if (mbPtr->width > 0) { + width = mbPtr->width * avgWidth; + } + if (mbPtr->height > 0) { + height = mbPtr->height * fm.linespace; + } } - width += 2*mbPtr->padX; - height += 2*mbPtr->padY; + } + + if (! haveImage) { + width += 2*mbPtr->padX; + height += 2*mbPtr->padY; } if (mbPtr->indicatorOn) { - mm = WidthMMOfScreen(Tk_Screen(mbPtr->tkwin)); - pixels = WidthOfScreen(Tk_Screen(mbPtr->tkwin)); - mbPtr->indicatorHeight= (INDICATOR_HEIGHT * pixels)/(10*mm); - mbPtr->indicatorWidth = (INDICATOR_WIDTH * pixels)/(10*mm) - + 2*mbPtr->indicatorHeight; - width += mbPtr->indicatorWidth; + mm = WidthMMOfScreen(Tk_Screen(mbPtr->tkwin)); + pixels = WidthOfScreen(Tk_Screen(mbPtr->tkwin)); + mbPtr->indicatorHeight= (INDICATOR_HEIGHT * pixels)/(10*mm); + mbPtr->indicatorWidth = (INDICATOR_WIDTH * pixels)/(10*mm) + + 2*mbPtr->indicatorHeight; + width += mbPtr->indicatorWidth; } else { - mbPtr->indicatorHeight = 0; - mbPtr->indicatorWidth = 0; + mbPtr->indicatorHeight = 0; + mbPtr->indicatorWidth = 0; } Tk_GeometryRequest(mbPtr->tkwin, (int) (width + 2*mbPtr->inset), |