diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2006-02-27 11:12:29 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2006-02-27 11:12:29 (GMT) |
commit | 6ea528c7ad651fef535c7d18a8e19500750763a0 (patch) | |
tree | a806f6fd9a61392c924e8bb59bbfb87db4347d27 /generic/tkImgBmap.c | |
parent | e9664c4928b35efaa5e4509df2221671710f3e2d (diff) | |
download | tk-6ea528c7ad651fef535c7d18a8e19500750763a0.zip tk-6ea528c7ad651fef535c7d18a8e19500750763a0.tar.gz tk-6ea528c7ad651fef535c7d18a8e19500750763a0.tar.bz2 |
Fix pixmap creation ordering issue [Bug 480862]
Stupid issue was fixed for the mask pixmap, but not the data pixmap!
Diffstat (limited to 'generic/tkImgBmap.c')
-rw-r--r-- | generic/tkImgBmap.c | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/generic/tkImgBmap.c b/generic/tkImgBmap.c index d89663e..b4ae169 100644 --- a/generic/tkImgBmap.c +++ b/generic/tkImgBmap.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: tkImgBmap.c,v 1.15 2002/08/05 04:30:39 dgp Exp $ + * RCS: @(#) $Id: tkImgBmap.c,v 1.15.2.1 2006/02/27 11:12:29 dkf Exp $ */ #include "tkInt.h" @@ -356,7 +356,7 @@ ImgBmapConfigureInstance(instancePtr) XGCValues gcValues; GC gc; unsigned int mask; - Pixmap oldMask; + Pixmap oldBitmap, oldMask; /* * For each of the options in masterPtr, translate the string @@ -387,10 +387,21 @@ ImgBmapConfigureInstance(instancePtr) } instancePtr->fg = colorPtr; - if (instancePtr->bitmap != None) { - Tk_FreePixmap(Tk_Display(instancePtr->tkwin), instancePtr->bitmap); - instancePtr->bitmap = None; - } + oldMask = instancePtr->mask; + instancePtr->mask = None; + + /* + * Careful: We have to allocate new Pixmaps before deleting the old ones. + * Otherwise, The XID allocator will always return the same XID for the + * new Pixmaps as was used for the old Pixmaps. And that will prevent the + * data and/or mask from changing in the GC below. + */ + + oldBitmap = instancePtr->bitmap; + instancePtr->bitmap = None; + oldMask = instancePtr->mask; + instancePtr->mask = None; + if (masterPtr->data != NULL) { instancePtr->bitmap = XCreateBitmapFromData( Tk_Display(instancePtr->tkwin), @@ -398,15 +409,6 @@ ImgBmapConfigureInstance(instancePtr) masterPtr->data, (unsigned) masterPtr->width, (unsigned) masterPtr->height); } - - /* - * Careful: We have to allocate a new mask Pixmap before deleting - * the old one. Otherwise, The XID allocator will always return - * the same XID for the new Pixmap as was used for the old Pixmap. - * And that will prevent the mask from changing in the GC below. - */ - oldMask = instancePtr->mask; - instancePtr->mask = None; if (masterPtr->maskData != NULL) { instancePtr->mask = XCreateBitmapFromData( Tk_Display(instancePtr->tkwin), @@ -414,8 +416,12 @@ ImgBmapConfigureInstance(instancePtr) masterPtr->maskData, (unsigned) masterPtr->width, (unsigned) masterPtr->height); } + if (oldMask != None) { - Tk_FreePixmap(Tk_Display(instancePtr->tkwin), oldMask); + Tk_FreePixmap(Tk_Display(instancePtr->tkwin), oldMask); + } + if (oldBitmap != None) { + Tk_FreePixmap(Tk_Display(instancePtr->tkwin), oldBitmap); } if (masterPtr->data != NULL) { |