summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordkf <donal.k.fellows@manchester.ac.uk>2006-02-27 11:12:29 (GMT)
committerdkf <donal.k.fellows@manchester.ac.uk>2006-02-27 11:12:29 (GMT)
commitc5ce3084e7c0a0cbeb916588dd7012ddab9af3ad (patch)
treea806f6fd9a61392c924e8bb59bbfb87db4347d27
parent56353c57aa9cc3d34020896ad2a43f255af89640 (diff)
downloadtk-c5ce3084e7c0a0cbeb916588dd7012ddab9af3ad.zip
tk-c5ce3084e7c0a0cbeb916588dd7012ddab9af3ad.tar.gz
tk-c5ce3084e7c0a0cbeb916588dd7012ddab9af3ad.tar.bz2
Fix pixmap creation ordering issue [Bug 480862]
Stupid issue was fixed for the mask pixmap, but not the data pixmap!
-rw-r--r--ChangeLog6
-rw-r--r--generic/tkImgBmap.c38
2 files changed, 28 insertions, 16 deletions
diff --git a/ChangeLog b/ChangeLog
index 8716e8c..ff04b84 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2006-02-27 Donal K. Fellows <donal.k.fellows@manchester.ac.uk>
+
+ * generic/tkImgBmap.c (ImgBmapConfigureInstance): Force creation of
+ new Pixmaps before deletion of old ones to prevent stupid caching
+ problems. [Bug 480862]
+
2006-02-09 Daniel Steffen <das@users.sourceforge.net>
* generic/tk.decls: fix signature of TkMacOSXInvalClipRgns
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) {