diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | generic/tkImgPhoto.c | 11 | ||||
-rw-r--r-- | unix/tkUnixButton.c | 54 |
3 files changed, 68 insertions, 4 deletions
@@ -1,3 +1,10 @@ +2004-12-01 Jeff Hobbs <jeffh@ActiveState.com> + + * unix/tkUnixButton.c (TkpDisplayButton): constrain coords to + Tk_RedrawImage to display only portion that is valid. + * generic/tkImgPhoto.c (ImgPhotoDisplay): add X error suppression + around XGetImage to prevent app abort. [Bug 979239] + 2004-11-24 Jeff Hobbs <jeffh@ActiveState.com> * README: Bumped patchlevel to 8.4.9 diff --git a/generic/tkImgPhoto.c b/generic/tkImgPhoto.c index e6b7846..f9445af 100644 --- a/generic/tkImgPhoto.c +++ b/generic/tkImgPhoto.c @@ -17,7 +17,7 @@ * Department of Computer Science, * Australian National University. * - * RCS: @(#) $Id: tkImgPhoto.c,v 1.36.2.10 2004/08/05 08:57:50 dkf Exp $ + * RCS: @(#) $Id: tkImgPhoto.c,v 1.36.2.11 2004/12/02 02:07:42 hobbs Exp $ */ #include "tkInt.h" @@ -2771,14 +2771,22 @@ ImgPhotoDisplay(clientData, display, drawable, imageX, imageY, width, (instancePtr->masterPtr->flags & COMPLEX_ALPHA) && visInfo.depth >= 15 && (visInfo.class == DirectColor || visInfo.class == TrueColor)) { + Tk_ErrorHandler handler; XImage *bgImg = NULL; /* + * Create an error handler to suppress the case where the input was + * not properly constrained, which can cause an X error. [Bug 979239] + */ + handler = Tk_CreateErrorHandler(display, -1, -1, -1, + (Tk_ErrorProc *) NULL, (ClientData) NULL); + /* * Pull the current background from the display to blend with */ bgImg = XGetImage(display, drawable, drawableX, drawableY, (unsigned int)width, (unsigned int)height, AllPlanes, ZPixmap); if (bgImg == NULL) { + Tk_DeleteErrorHandler(handler); return; } @@ -2793,6 +2801,7 @@ ImgPhotoDisplay(clientData, display, drawable, imageX, imageY, width, bgImg, 0, 0, drawableX, drawableY, (unsigned int) width, (unsigned int) height); XDestroyImage(bgImg); + Tk_DeleteErrorHandler(handler); } else { /* * masterPtr->region describes which parts of the image contain diff --git a/unix/tkUnixButton.c b/unix/tkUnixButton.c index 1246ece..3b1996f 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.4 2003/10/10 20:20:47 hobbs Exp $ + * RCS: @(#) $Id: tkUnixButton.c,v 1.11.2.5 2004/12/02 02:07:43 hobbs Exp $ */ #include "tkButton.h" @@ -236,12 +236,12 @@ TkpDisplayButton(clientData) } case COMPOUND_NONE: {break;} } - + TkComputeAnchor(butPtr->anchor, tkwin, butPtr->padX, butPtr->padY, butPtr->indicatorSpace + fullWidth, fullHeight, &x, &y); x += butPtr->indicatorSpace; - + x += offset; y += offset; if (relief == TK_RELIEF_RAISED) { @@ -256,6 +256,30 @@ TkpDisplayButton(clientData) imageYOffset += y; if (butPtr->image != NULL) { + /* + * Do boundary clipping, so that Tk_RedrawImage is passed + * valid coordinates. [Bug 979239] + */ + + if (imageXOffset < 0) { + imageXOffset = 0; + } + if (imageYOffset < 0) { + imageYOffset = 0; + } + if (width > Tk_Width(tkwin)) { + width = Tk_Width(tkwin); + } + if (height > Tk_Height(tkwin)) { + height = Tk_Height(tkwin); + } + if ((width + imageXOffset) > Tk_Width(tkwin)) { + imageXOffset = Tk_Width(tkwin) - width; + } + if ((height + imageYOffset) > Tk_Height(tkwin)) { + imageYOffset = Tk_Height(tkwin) - height; + } + if ((butPtr->selectImage != NULL) && (butPtr->flags & SELECTED)) { Tk_RedrawImage(butPtr->selectImage, 0, 0, width, height, pixmap, imageXOffset, imageYOffset); @@ -295,6 +319,30 @@ TkpDisplayButton(clientData) imageXOffset += x; imageYOffset += y; if (butPtr->image != NULL) { + /* + * Do boundary clipping, so that Tk_RedrawImage is passed + * valid coordinates. [Bug 979239] + */ + + if (imageXOffset < 0) { + imageXOffset = 0; + } + if (imageYOffset < 0) { + imageYOffset = 0; + } + if (width > Tk_Width(tkwin)) { + width = Tk_Width(tkwin); + } + if (height > Tk_Height(tkwin)) { + height = Tk_Height(tkwin); + } + if ((width + imageXOffset) > Tk_Width(tkwin)) { + imageXOffset = Tk_Width(tkwin) - width; + } + if ((height + imageYOffset) > Tk_Height(tkwin)) { + imageYOffset = Tk_Height(tkwin) - height; + } + if ((butPtr->selectImage != NULL) && (butPtr->flags & SELECTED)) { Tk_RedrawImage(butPtr->selectImage, 0, 0, width, |