From c5ce3084e7c0a0cbeb916588dd7012ddab9af3ad Mon Sep 17 00:00:00 2001 From: dkf Date: Mon, 27 Feb 2006 11:12:29 +0000 Subject: Fix pixmap creation ordering issue [Bug 480862] Stupid issue was fixed for the mask pixmap, but not the data pixmap! --- ChangeLog | 6 ++++++ generic/tkImgBmap.c | 38 ++++++++++++++++++++++---------------- 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 + + * 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 * 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) { -- cgit v0.12