From 34e11ed4fccaf6e7e181ecf0b874e60582744ee1 Mon Sep 17 00:00:00 2001 From: hobbs Date: Sat, 26 Apr 2003 02:53:46 +0000 Subject: * generic/tkButton.h: Rewrote the handling * generic/tkButton.c (TkButtonWorldChanged): of compound *buttons * mac/tkMacButton.c (TkpDisplayButton): to correctly display * macosx/tkMacOSXButton.c (TkpDisplayButton): mixture of disabledfg, * unix/tkUnixButton.c (TkpDisplayButton): selectcolor, indicator, * win/tkWinButton.c (TkpDisplayButton): etc. *buttons will now only stipple the image, unless no disabledfg is given, in which case it will stipple the whole button. --- ChangeLog | 9 +++++ generic/tkButton.c | 34 +++++++++++------ generic/tkButton.h | 12 +++--- mac/tkMacButton.c | 56 +++++++++++++++++----------- macosx/tkMacOSXButton.c | 97 ++++++++++++++++++++++++++++--------------------- unix/tkUnixButton.c | 59 +++++++++++++++++++----------- win/tkWinButton.c | 73 +++++++++++++++++++++---------------- 7 files changed, 205 insertions(+), 135 deletions(-) diff --git a/ChangeLog b/ChangeLog index e0b90e7..b9e0057 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2003-04-25 Jeff Hobbs + * generic/tkButton.h: Rewrote the handling + * generic/tkButton.c (TkButtonWorldChanged): of compound *buttons + * mac/tkMacButton.c (TkpDisplayButton): to correctly display + * macosx/tkMacOSXButton.c (TkpDisplayButton): mixture of disabledfg, + * unix/tkUnixButton.c (TkpDisplayButton): selectcolor, indicator, + * win/tkWinButton.c (TkpDisplayButton): etc. *buttons will + now only stipple the image, unless no disabledfg is given, in which + case it will stipple the whole button. + * library/bgerror.tcl: make bgerror dialog topmost on Windows to prevent it being covered by other windows. diff --git a/generic/tkButton.c b/generic/tkButton.c index 07e226b..7e629cb 100644 --- a/generic/tkButton.c +++ b/generic/tkButton.c @@ -11,7 +11,7 @@ * See the file "license.terms" for information on usage and redistribution * of this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tkButton.c,v 1.20 2002/08/08 09:35:34 hobbs Exp $ + * RCS: @(#) $Id: tkButton.c,v 1.20.2.1 2003/04/26 02:53:46 hobbs Exp $ */ #include "tkButton.h" @@ -699,6 +699,7 @@ ButtonCreate(clientData, interp, objc, objv, type) butPtr->normalTextGC = None; butPtr->activeTextGC = None; butPtr->disabledGC = None; + butPtr->stippleGC = None; butPtr->gray = None; butPtr->copyGC = None; butPtr->widthPtr = NULL; @@ -980,6 +981,9 @@ DestroyButton(butPtr) if (butPtr->disabledGC != None) { Tk_FreeGC(butPtr->display, butPtr->disabledGC); } + if (butPtr->stippleGC != None) { + Tk_FreeGC(butPtr->display, butPtr->stippleGC); + } if (butPtr->gray != None) { Tk_FreeBitmap(butPtr->display, butPtr->gray); } @@ -1337,20 +1341,15 @@ TkButtonWorldChanged(instanceData) butPtr->activeTextGC = newGC; } + gcValues.background = Tk_3DBorderColor(butPtr->normalBorder)->pixel; + /* - * Allocate the disabled graphics context, for drawing the widget in - * its disabled state + * Create the GC that can be used for stippling */ - gcValues.background = Tk_3DBorderColor(butPtr->normalBorder)->pixel; - if ((butPtr->disabledFg != NULL) && (butPtr->imagePtr == NULL)) { - gcValues.foreground = butPtr->disabledFg->pixel; - mask = GCForeground | GCBackground | GCFont; - } else { + + if (butPtr->stippleGC == None) { gcValues.foreground = gcValues.background; mask = GCForeground; - if (butPtr->compound != COMPOUND_NONE) { - mask |= GCFont; - } if (butPtr->gray == None) { butPtr->gray = Tk_GetBitmap(NULL, butPtr->tkwin, "gray50"); } @@ -1359,6 +1358,19 @@ TkButtonWorldChanged(instanceData) gcValues.stipple = butPtr->gray; mask |= GCFillStyle | GCStipple; } + butPtr->stippleGC = Tk_GetGC(butPtr->tkwin, mask, &gcValues); + } + + /* + * Allocate the disabled graphics context, for drawing text in + * its disabled state. + */ + + mask = GCForeground | GCBackground | GCFont; + if (butPtr->disabledFg != NULL) { + gcValues.foreground = butPtr->disabledFg->pixel; + } else { + gcValues.foreground = gcValues.background; } newGC = Tk_GetGC(butPtr->tkwin, mask, &gcValues); if (butPtr->disabledGC != None) { diff --git a/generic/tkButton.h b/generic/tkButton.h index be195c6..d0ecfea 100644 --- a/generic/tkButton.h +++ b/generic/tkButton.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: tkButton.h,v 1.9 2002/06/17 10:54:29 drh Exp $ + * RCS: @(#) $Id: tkButton.h,v 1.9.2.1 2003/04/26 02:53:46 hobbs Exp $ */ #ifndef _TKBUTTON @@ -159,12 +159,10 @@ typedef struct { * screen. */ GC activeTextGC; /* GC for drawing text in active mode (NULL * means use normalTextGC). */ - GC disabledGC; /* Used to produce disabled effect. If - * disabledFg isn't NULL, this GC is used to - * draw button text or icon. Otherwise - * text or icon is drawn with normalGC and - * this GC is used to stipple background - * across it. For labels this is None. */ + GC disabledGC; /* Used to produce disabled effect for text + * and check/radio marks. */ + GC stippleGC; /* Used to produce disabled stipple effect + * for images when disabled. */ Pixmap gray; /* Pixmap for displaying disabled text if * disabledFg is NULL. */ GC copyGC; /* Used for copying information from an diff --git a/mac/tkMacButton.c b/mac/tkMacButton.c index 2c11dba..a2a5916 100644 --- a/mac/tkMacButton.c +++ b/mac/tkMacButton.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: tkMacButton.c,v 1.17 2002/08/28 01:08:06 drh Exp $ + * RCS: @(#) $Id: tkMacButton.c,v 1.17.2.1 2003/04/26 02:53:47 hobbs Exp $ */ #include "tkButton.h" @@ -168,7 +168,7 @@ TkpDisplayButton( int y, relief; register Tk_Window tkwin = butPtr->tkwin; int width, height, fullWidth, fullHeight; - int imageXOffset, imageYOffset, textXOffset, textYOffset; + int textXOffset, textYOffset; int haveImage = 0, haveText = 0; int offset; /* 0 means this is a normal widget. 1 means * it is an image button, so we offset the @@ -179,6 +179,10 @@ TkpDisplayButton( GDHandle saveDevice; GWorldPtr destPort; int drawType, borderWidth; + int imageWidth, imageHeight; + int imageXOffset = 0, imageYOffset = 0; /* image information that will + * be used to restrict disabled + * pixmap as well */ GetGWorld(&saveWorld, &saveDevice); @@ -339,11 +343,11 @@ TkpDisplayButton( Tk_SizeOfBitmap(butPtr->display, butPtr->bitmap, &width, &height); haveImage = 1; } - haveText = (butPtr->textWidth != 0 && butPtr->textHeight != 0); + imageWidth = width; + imageHeight = height; + haveText = (butPtr->textWidth != 0 && butPtr->textHeight != 0); if (butPtr->compound != COMPOUND_NONE && haveImage && haveText) { - imageXOffset = 0; - imageYOffset = 0; textXOffset = 0; textYOffset = 0; fullWidth = 0; @@ -409,25 +413,23 @@ TkpDisplayButton( x += offset; y += offset; } - + imageXOffset += x; + imageYOffset += y; if (butPtr->image != NULL) { if ((butPtr->selectImage != NULL) && (butPtr->flags & SELECTED)) { Tk_RedrawImage(butPtr->selectImage, 0, 0, - width, height, pixmap, x + imageXOffset, - y + imageYOffset); + width, height, pixmap, imageXOffset, imageYOffset); } else { Tk_RedrawImage(butPtr->image, 0, 0, width, - height, pixmap, x + imageXOffset, - y + imageYOffset); + height, pixmap, imageXOffset, imageYOffset); } } else { - XSetClipOrigin(butPtr->display, gc, x + imageXOffset, - y + imageYOffset); + XSetClipOrigin(butPtr->display, gc, + imageXOffset, imageYOffset); XCopyPlane(butPtr->display, butPtr->bitmap, pixmap, gc, - 0, 0, (unsigned int) width, - (unsigned int) height, x + imageXOffset, - y + imageYOffset, 1); + 0, 0, (unsigned int) width, (unsigned int) height, + imageXOffset, imageYOffset, 1); XSetClipOrigin(butPtr->display, gc, 0, 0); } @@ -452,6 +454,8 @@ TkpDisplayButton( x += offset; y += offset; } + imageXOffset += x; + imageXOffset += y; if (butPtr->image != NULL) { if ((butPtr->selectImage != NULL) && (butPtr->flags & SELECTED)) { @@ -488,23 +492,31 @@ TkpDisplayButton( * 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. + * must temporarily modify the GC so the stippling is the right color. */ if ((butPtr->state == STATE_DISABLED) && ((butPtr->disabledFg == NULL) || (butPtr->image != NULL))) { if ((butPtr->flags & SELECTED) && !butPtr->indicatorOn && (butPtr->selectBorder != NULL)) { - XSetForeground(butPtr->display, butPtr->disabledGC, + XSetForeground(butPtr->display, butPtr->stippleGC, Tk_3DBorderColor(butPtr->selectBorder)->pixel); } - XFillRectangle(butPtr->display, pixmap, butPtr->disabledGC, - butPtr->inset, butPtr->inset, - (unsigned) (Tk_Width(tkwin) - 2*butPtr->inset), - (unsigned) (Tk_Height(tkwin) - 2*butPtr->inset)); + /* + * 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)); + } else { + XFillRectangle(butPtr->display, pixmap, butPtr->stippleGC, + imageXOffset, imageYOffset, + (unsigned) imageWidth, (unsigned) imageHeight); + } if ((butPtr->flags & SELECTED) && !butPtr->indicatorOn && (butPtr->selectBorder != NULL)) { - XSetForeground(butPtr->display, butPtr->disabledGC, + XSetForeground(butPtr->display, butPtr->stippleGC, Tk_3DBorderColor(butPtr->normalBorder)->pixel); } } diff --git a/macosx/tkMacOSXButton.c b/macosx/tkMacOSXButton.c index 6314535..6bd99d9 100644 --- a/macosx/tkMacOSXButton.c +++ b/macosx/tkMacOSXButton.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: tkMacOSXButton.c,v 1.2 2002/08/31 06:12:29 das Exp $ + * RCS: @(#) $Id: tkMacOSXButton.c,v 1.2.2.1 2003/04/26 02:53:47 hobbs Exp $ */ #include "tkButton.h" @@ -33,10 +33,10 @@ * Some defines used to control what type of control is drawn. */ -#define DRAW_LABEL 0 /* Labels are treated genericly. */ -#define DRAW_CONTROL 1 /* Draw using the Native control. */ -#define DRAW_CUSTOM 2 /* Make our own button drawing. */ -#define DRAW_BEVEL 3 +#define DRAW_LABEL 0 /* Labels are treated genericly. */ +#define DRAW_CONTROL 1 /* Draw using the Native control. */ +#define DRAW_CUSTOM 2 /* Make our own button drawing. */ +#define DRAW_BEVEL 3 /* * Declaration of Mac specific button structure. @@ -47,18 +47,18 @@ typedef struct { SInt16 minValue; SInt16 maxValue; SInt16 procID; - int isBevel; + int isBevel; } MacControlParams; typedef struct { int drawType; Tk_3DBorder border; int relief; - int offset; /* 0 means this is a normal widget. 1 means - * it is an image button, so we offset the - * image to make the button appear to move - * up and down as the relief changes. */ - GC gc; + int offset; /* 0 means this is a normal widget. 1 means + * it is an image button, so we offset the + * image to make the button appear to move + * up and down as the relief changes. */ + GC gc; int hasImageOrBitmap; } DrawParams; @@ -201,12 +201,16 @@ TkpDisplayButton( * compiler warning. */ int y; int width, height, fullWidth, fullHeight; - int imageXOffset, imageYOffset, textXOffset, textYOffset; + int textXOffset, textYOffset; int haveImage = 0, haveText = 0; GWorldPtr destPort; int borderWidth; Pixmap pixmap; int wasUsingControl; + int imageWidth, imageHeight; + int imageXOffset = 0, imageYOffset = 0; /* image information that will + * be used to restrict disabled + * pixmap as well */ DrawParams drawParams, * dpPtr = &drawParams; butPtr->flags &= ~REDRAW_PENDING; @@ -291,10 +295,11 @@ TkpDisplayButton( Tk_SizeOfBitmap(butPtr->display, butPtr->bitmap, &width, &height); haveImage = 1; } + imageWidth = width; + imageHeight = height; + haveText = (butPtr->textWidth != 0 && butPtr->textHeight != 0); if (butPtr->compound != COMPOUND_NONE && haveImage && haveText) { - imageXOffset = 0; - imageYOffset = 0; textXOffset = 0; textYOffset = 0; fullWidth = 0; @@ -366,29 +371,27 @@ TkpDisplayButton( x += dpPtr->offset; y += dpPtr->offset; } - + imageXOffset += x; + imageYOffset += y; if (butPtr->image != NULL) { if ((butPtr->selectImage != NULL) && (butPtr->flags & SELECTED)) { Tk_RedrawImage(butPtr->selectImage, 0, 0, - width, height, pixmap, x + imageXOffset, - y + imageYOffset); + width, height, pixmap, imageXOffset, imageYOffset); } else { Tk_RedrawImage(butPtr->image, 0, 0, width, - height, pixmap, x + imageXOffset, - y + imageYOffset); + height, pixmap, imageXOffset, imageYOffset); } } else { - XSetClipOrigin(butPtr->display, dpPtr->gc, x + imageXOffset, - y + imageYOffset); + XSetClipOrigin(butPtr->display, dpPtr->gc, + imageXOffset, imageYOffset); XCopyPlane(butPtr->display, butPtr->bitmap, pixmap, dpPtr->gc, - 0, 0, (unsigned int) width, - (unsigned int) height, x + imageXOffset, - y + imageYOffset, 1); + 0, 0, (unsigned int) width, (unsigned int) height, + imageXOffset, imageYOffset, 1); XSetClipOrigin(butPtr->display, dpPtr->gc, 0, 0); } - - if (macButtonPtr->useTkText ) { + + if (macButtonPtr->useTkText) { Tk_DrawTextLayout(butPtr->display, pixmap, dpPtr->gc, butPtr->textLayout, x + textXOffset, y + textYOffset, 0, -1); @@ -403,7 +406,7 @@ TkpDisplayButton( TkComputeAnchor(butPtr->anchor, tkwin, 0, 0, butPtr->indicatorSpace + width, height, &x, &y); x += butPtr->indicatorSpace; - + x += dpPtr->offset; y += dpPtr->offset; if (dpPtr->relief == TK_RELIEF_RAISED) { @@ -413,17 +416,18 @@ TkpDisplayButton( x += dpPtr->offset; y += dpPtr->offset; } + imageXOffset += x; + imageXOffset += y; if (butPtr->image != NULL) { if ((butPtr->selectImage != NULL) && (butPtr->flags & SELECTED)) { Tk_RedrawImage(butPtr->selectImage, 0, 0, width, - height, pixmap, x, y); + height, pixmap, x, y); } else { Tk_RedrawImage(butPtr->image, 0, 0, width, height, pixmap, x, y); } } else { - XSetClipOrigin(butPtr->display, dpPtr->gc, x, y); XCopyPlane(butPtr->display, butPtr->bitmap, pixmap, dpPtr->gc, @@ -453,28 +457,37 @@ TkpDisplayButton( * 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. + * must temporarily modify the GC so the stippling is the right color. */ if (macButtonPtr->useTkText) { if ((butPtr->state == STATE_DISABLED) && ((butPtr->disabledFg == NULL) || (butPtr->image != NULL))) { if ((butPtr->flags & SELECTED) && !butPtr->indicatorOn - && (butPtr->selectBorder != NULL)) { - XSetForeground(butPtr->display, butPtr->disabledGC, - Tk_3DBorderColor(butPtr->selectBorder)->pixel); + && (butPtr->selectBorder != NULL)) { + XSetForeground(butPtr->display, butPtr->stippledGC, + Tk_3DBorderColor(butPtr->selectBorder)->pixel); } - XFillRectangle(butPtr->display, pixmap, butPtr->disabledGC, - butPtr->inset, butPtr->inset, - (unsigned) (Tk_Width(tkwin) - 2*butPtr->inset), - (unsigned) (Tk_Height(tkwin) - 2*butPtr->inset)); + /* + * 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)); + } else { + XFillRectangle(butPtr->display, pixmap, butPtr->stippleGC, + imageXOffset, imageYOffset, + (unsigned) imageWidth, (unsigned) imageHeight); + } if ((butPtr->flags & SELECTED) && !butPtr->indicatorOn - && (butPtr->selectBorder != NULL)) { - XSetForeground(butPtr->display, butPtr->disabledGC, - Tk_3DBorderColor(butPtr->normalBorder)->pixel); - } + && (butPtr->selectBorder != NULL)) { + XSetForeground(butPtr->display, butPtr->stippledGC, + Tk_3DBorderColor(butPtr->normalBorder)->pixel); + } } - + /* * Draw the border and traversal highlight last. This way, if the * button's contents overflow they'll be covered up by the border. diff --git a/unix/tkUnixButton.c b/unix/tkUnixButton.c index 24aef95..dd4eca9 100644 --- a/unix/tkUnixButton.c +++ b/unix/tkUnixButton.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: tkUnixButton.c,v 1.11.2.1 2003/04/25 20:11:30 hobbs Exp $ + * RCS: @(#) $Id: tkUnixButton.c,v 1.11.2.2 2003/04/26 02:53:47 hobbs Exp $ */ #include "tkButton.h" @@ -86,12 +86,16 @@ TkpDisplayButton(clientData) int y, relief; Tk_Window tkwin = butPtr->tkwin; int width, height, fullWidth, fullHeight; - int imageXOffset, imageYOffset, textXOffset, textYOffset; + int textXOffset, textYOffset; 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. */ + int imageWidth, imageHeight; + 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)) { @@ -176,11 +180,12 @@ TkpDisplayButton(clientData) Tk_SizeOfBitmap(butPtr->display, butPtr->bitmap, &width, &height); haveImage = 1; } + imageWidth = width; + imageHeight = height; + haveText = (butPtr->textWidth != 0 && butPtr->textHeight != 0); if (butPtr->compound != COMPOUND_NONE && haveImage && haveText) { - imageXOffset = 0; - imageYOffset = 0; textXOffset = 0; textYOffset = 0; fullWidth = 0; @@ -246,23 +251,23 @@ TkpDisplayButton(clientData) x += offset; y += offset; } - + + imageXOffset += x; + imageYOffset += y; + if (butPtr->image != NULL) { if ((butPtr->selectImage != NULL) && (butPtr->flags & SELECTED)) { Tk_RedrawImage(butPtr->selectImage, 0, 0, - width, height, pixmap, x + imageXOffset, - y + imageYOffset); + width, height, pixmap, imageXOffset, imageYOffset); } else { Tk_RedrawImage(butPtr->image, 0, 0, width, - height, pixmap, x + imageXOffset, y + imageYOffset); + height, pixmap, imageXOffset, imageYOffset); } } else { - XSetClipOrigin(butPtr->display, gc, x + imageXOffset, - y + imageYOffset); + XSetClipOrigin(butPtr->display, gc, imageXOffset, imageYOffset); XCopyPlane(butPtr->display, butPtr->bitmap, pixmap, gc, - 0, 0, (unsigned int) width, - (unsigned int) height, x + imageXOffset, - y + imageYOffset, 1); + 0, 0, (unsigned int) width, (unsigned int) height, + imageXOffset, imageYOffset, 1); XSetClipOrigin(butPtr->display, gc, 0, 0); } @@ -270,9 +275,9 @@ TkpDisplayButton(clientData) * Use normalTextGC in this case since we have both text and image, * the whole button will later be stippled 50% grey. */ - Tk_DrawTextLayout(butPtr->display, pixmap, butPtr->normalTextGC, + Tk_DrawTextLayout(butPtr->display, pixmap, gc, butPtr->textLayout, x + textXOffset, y + textYOffset, 0, -1); - Tk_UnderlineTextLayout(butPtr->display, pixmap, butPtr->normalTextGC, + Tk_UnderlineTextLayout(butPtr->display, pixmap, gc, butPtr->textLayout, x + textXOffset, y + textYOffset, butPtr->underline); y += fullHeight/2; @@ -291,6 +296,8 @@ TkpDisplayButton(clientData) x += offset; y += offset; } + imageXOffset += x; + imageXOffset += y; if (butPtr->image != NULL) { if ((butPtr->selectImage != NULL) && (butPtr->flags & SELECTED)) { @@ -427,23 +434,31 @@ TkpDisplayButton(clientData) * 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. + * must temporarily modify the GC so the stippling is the right color. */ if ((butPtr->state == STATE_DISABLED) && ((butPtr->disabledFg == NULL) || (butPtr->image != NULL))) { if ((butPtr->flags & SELECTED) && !butPtr->indicatorOn && (butPtr->selectBorder != NULL)) { - XSetForeground(butPtr->display, butPtr->disabledGC, + XSetForeground(butPtr->display, butPtr->stippleGC, Tk_3DBorderColor(butPtr->selectBorder)->pixel); } - XFillRectangle(butPtr->display, pixmap, butPtr->disabledGC, - butPtr->inset, butPtr->inset, - (unsigned) (Tk_Width(tkwin) - 2*butPtr->inset), - (unsigned) (Tk_Height(tkwin) - 2*butPtr->inset)); + /* + * 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)); + } else { + XFillRectangle(butPtr->display, pixmap, butPtr->stippleGC, + imageXOffset, imageYOffset, + (unsigned) imageWidth, (unsigned) imageHeight); + } if ((butPtr->flags & SELECTED) && !butPtr->indicatorOn && (butPtr->selectBorder != NULL)) { - XSetForeground(butPtr->display, butPtr->disabledGC, + XSetForeground(butPtr->display, butPtr->stippleGC, Tk_3DBorderColor(butPtr->normalBorder)->pixel); } } diff --git a/win/tkWinButton.c b/win/tkWinButton.c index dc8ef12..415a202 100644 --- a/win/tkWinButton.c +++ b/win/tkWinButton.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: tkWinButton.c,v 1.20.2.1 2003/04/25 20:11:31 hobbs Exp $ + * RCS: @(#) $Id: tkWinButton.c,v 1.20.2.2 2003/04/26 02:53:47 hobbs Exp $ */ #define OEMRESOURCE @@ -355,6 +355,10 @@ TkpDisplayButton(clientData) * move up and down as the relief changes. */ int textXOffset = 0, textYOffset = 0; /* text offsets for use with * compound buttons and focus ring */ + int imageWidth, imageHeight; + int imageXOffset = 0, imageYOffset = 0; /* image information that will + * be used to restrict disabled + * pixmap as well */ DWORD *boxesPalette; ThreadSpecificData *tsdPtr = (ThreadSpecificData *) @@ -459,15 +463,13 @@ TkpDisplayButton(clientData) Tk_SizeOfBitmap(butPtr->display, butPtr->bitmap, &width, &height); haveImage = 1; } + imageWidth = width; + imageHeight = height; haveText = (butPtr->textWidth != 0 && butPtr->textHeight != 0); if (butPtr->compound != COMPOUND_NONE && haveImage && haveText) { - int imageXOffset, imageYOffset, fullWidth, fullHeight; - imageXOffset = 0; - imageYOffset = 0; - fullWidth = 0; - fullHeight = 0; + int fullWidth = 0, fullHeight = 0; switch ((enum compound) butPtr->compound) { case COMPOUND_TOP: @@ -522,33 +524,27 @@ TkpDisplayButton(clientData) x += offset; y += offset; } - + imageXOffset += x; + imageYOffset += y; if (butPtr->image != NULL) { if ((butPtr->selectImage != NULL) && (butPtr->flags & SELECTED)) { Tk_RedrawImage(butPtr->selectImage, 0, 0, - width, height, pixmap, x + imageXOffset, - y + imageYOffset); + width, height, pixmap, imageXOffset, imageYOffset); } else { - Tk_RedrawImage(butPtr->image, 0, 0, width, - height, pixmap, x + imageXOffset, y + imageYOffset); + Tk_RedrawImage(butPtr->image, 0, 0, + width, height, pixmap, imageXOffset, imageYOffset); } } else { - XSetClipOrigin(butPtr->display, gc, x + imageXOffset, - y + imageYOffset); + XSetClipOrigin(butPtr->display, gc, imageXOffset, imageYOffset); XCopyPlane(butPtr->display, butPtr->bitmap, pixmap, gc, - 0, 0, (unsigned int) width, - (unsigned int) height, x + imageXOffset, - y + imageYOffset, 1); + 0, 0, (unsigned int) width, (unsigned int) height, + imageXOffset, imageYOffset, 1); XSetClipOrigin(butPtr->display, gc, 0, 0); } - /* - * Use normalTextGC in this case since we have both text and image, - * the whole button will later be stippled 50% grey. - */ - Tk_DrawTextLayout(butPtr->display, pixmap, butPtr->normalTextGC, + Tk_DrawTextLayout(butPtr->display, pixmap, gc, butPtr->textLayout, x + textXOffset, y + textYOffset, 0, -1); - Tk_UnderlineTextLayout(butPtr->display, pixmap, butPtr->normalTextGC, + Tk_UnderlineTextLayout(butPtr->display, pixmap, gc, butPtr->textLayout, x + textXOffset, y + textYOffset, butPtr->underline); height = fullHeight; @@ -563,6 +559,8 @@ TkpDisplayButton(clientData) x += offset; y += offset; } + imageXOffset += x; + imageXOffset += y; if (butPtr->image != NULL) { if ((butPtr->selectImage != NULL) && (butPtr->flags & SELECTED)) { @@ -578,7 +576,6 @@ TkpDisplayButton(clientData) (unsigned int) width, (unsigned int) height, x, y, 1); XSetClipOrigin(butPtr->display, gc, 0, 0); } - } else { TkComputeAnchor(butPtr->anchor, tkwin, butPtr->padX, butPtr->padY, butPtr->indicatorSpace + butPtr->textWidth, @@ -656,7 +653,13 @@ TkpDisplayButton(clientData) * be placed into the palette. */ - boxesPalette[PAL_CHECK] = FlipColor(gc->foreground); + if ((butPtr->state == STATE_DISABLED) + && (butPtr->disabledFg == NULL)) { + boxesPalette[PAL_CHECK] = FlipColor(TkWinGetBorderPixels(tkwin, + border, TK_3D_DARK_GC)); + } else { + boxesPalette[PAL_CHECK] = FlipColor(gc->foreground); + } boxesPalette[PAL_TOP_OUTER] = FlipColor(TkWinGetBorderPixels(tkwin, border, TK_3D_DARK_GC)); boxesPalette[PAL_TOP_INNER] = FlipColor(TkWinGetBorderPixels(tkwin, @@ -689,23 +692,31 @@ TkpDisplayButton(clientData) * 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. + * must temporarily modify the GC so the stippling is the right color. */ if ((butPtr->state == STATE_DISABLED) && ((butPtr->disabledFg == NULL) || (butPtr->image != NULL))) { if ((butPtr->flags & SELECTED) && !butPtr->indicatorOn && (butPtr->selectBorder != NULL)) { - XSetForeground(butPtr->display, butPtr->disabledGC, + XSetForeground(butPtr->display, butPtr->stippleGC, Tk_3DBorderColor(butPtr->selectBorder)->pixel); } - XFillRectangle(butPtr->display, pixmap, butPtr->disabledGC, - butPtr->inset, butPtr->inset, - (unsigned) (Tk_Width(tkwin) - 2*butPtr->inset), - (unsigned) (Tk_Height(tkwin) - 2*butPtr->inset)); + /* + * 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)); + } else { + XFillRectangle(butPtr->display, pixmap, butPtr->stippleGC, + imageXOffset, imageYOffset, + (unsigned) imageWidth, (unsigned) imageHeight); + } if ((butPtr->flags & SELECTED) && !butPtr->indicatorOn && (butPtr->selectBorder != NULL)) { - XSetForeground(butPtr->display, butPtr->disabledGC, + XSetForeground(butPtr->display, butPtr->stippleGC, Tk_3DBorderColor(butPtr->normalBorder)->pixel); } } -- cgit v0.12