diff options
-rw-r--r-- | generic/tkTreeColumn.c | 8 | ||||
-rw-r--r-- | generic/tkTreeCtrl.c | 3 | ||||
-rw-r--r-- | generic/tkTreeCtrl.h | 23 | ||||
-rw-r--r-- | generic/tkTreeDisplay.c | 7 | ||||
-rw-r--r-- | generic/tkTreeElem.c | 8 | ||||
-rw-r--r-- | generic/tkTreeUtils.c | 54 |
6 files changed, 51 insertions, 52 deletions
diff --git a/generic/tkTreeColumn.c b/generic/tkTreeColumn.c index 79c495d..628d618 100644 --- a/generic/tkTreeColumn.c +++ b/generic/tkTreeColumn.c @@ -7,7 +7,7 @@ * Copyright (c) 2002-2003 Christian Krone * Copyright (c) 2003 ActiveState Corporation * - * RCS: @(#) $Id: tkTreeColumn.c,v 1.72 2006/12/04 00:20:53 treectrl Exp $ + * RCS: @(#) $Id: tkTreeColumn.c,v 1.73 2006/12/06 00:03:21 treectrl Exp $ */ #include "tkTreeCtrl.h" @@ -4558,13 +4558,12 @@ Column_Draw( gcValues.foreground = column->textColor->pixel; gcValues.graphics_exposures = False; mask = GCFont | GCForeground | GCGraphicsExposures; - gc = Tk_GetGC(tree->tkwin, mask, &gcValues); + gc = Tree_GetGC(tree, mask, &gcValues); TextLayout_Draw(tree->display, drawable, gc, column->textLayout, x + layout.textLeft + sunken, y + (height - h) / 2 + column->textPadY[PAD_TOP_LEFT] + sunken, 0, -1, -1); - Tk_FreeGC(tree->display, gc); } else if ((column->text != NULL) && (layout.bytesThatFit != 0)) { XGCValues gcValues; GC gc; @@ -4590,7 +4589,7 @@ Column_Draw( gcValues.foreground = column->textColor->pixel; gcValues.graphics_exposures = False; mask = GCFont | GCForeground | GCGraphicsExposures; - gc = Tk_GetGC(tree->tkwin, mask, &gcValues); + gc = Tree_GetGC(tree, mask, &gcValues); tx = x + layout.textLeft + sunken; h = column->textPadY[PAD_TOP_LEFT] + layout.fm.linespace + column->textPadY[PAD_BOTTOM_RIGHT]; @@ -4598,7 +4597,6 @@ Column_Draw( ty += column->textPadY[PAD_TOP_LEFT]; Tk_DrawChars(tree->display, drawable, gc, layout.tkfont, text, textLen, tx, ty); - Tk_FreeGC(tree->display, gc); if (text != staticStr) ckfree(text); } diff --git a/generic/tkTreeCtrl.c b/generic/tkTreeCtrl.c index 7f03ccd..77607cf 100644 --- a/generic/tkTreeCtrl.c +++ b/generic/tkTreeCtrl.c @@ -7,7 +7,7 @@ * Copyright (c) 2002-2003 Christian Krone * Copyright (c) 2003-2005 ActiveState, a division of Sophos * - * RCS: @(#) $Id: tkTreeCtrl.c,v 1.93 2006/12/04 05:49:26 treectrl Exp $ + * RCS: @(#) $Id: tkTreeCtrl.c,v 1.94 2006/12/06 00:03:21 treectrl Exp $ */ #include "tkTreeCtrl.h" @@ -1778,6 +1778,7 @@ TreeDestroy( Tk_FreeGC(tree->display, tree->buttonGC); if (tree->lineGC != None) Tk_FreeGC(tree->display, tree->lineGC); + Tree_FreeAllGC(tree); Tree_FreeColumns(tree); diff --git a/generic/tkTreeCtrl.h b/generic/tkTreeCtrl.h index 31c29a4..2cb1ef3 100644 --- a/generic/tkTreeCtrl.h +++ b/generic/tkTreeCtrl.h @@ -7,7 +7,7 @@ * Copyright (c) 2002-2003 Christian Krone * Copyright (c) 2003 ActiveState Corporation * - * RCS: @(#) $Id: tkTreeCtrl.h,v 1.81 2006/12/04 05:51:56 treectrl Exp $ + * RCS: @(#) $Id: tkTreeCtrl.h,v 1.82 2006/12/06 00:03:21 treectrl Exp $ */ #include "tkPort.h" @@ -88,6 +88,15 @@ struct PerStateType /*****/ +typedef struct GCCache GCCache; +struct GCCache +{ + unsigned long mask; + XGCValues gcValues; + GC gc; + GCCache *next; +}; + /* * A TreePtrList is used for dynamically-growing lists of ClientData pointers. * A TreePtrList is NULL-terminated. @@ -366,6 +375,7 @@ struct TreeCtrl int optionHaxCnt; /* Used by OptionHax_xxx */ TreeThemeData themeData; + GCCache *gcCache; /* Graphics contexts for elements. */ }; #define TREE_CONF_FONT 0x0001 @@ -912,15 +922,8 @@ extern Tcl_Obj *PerStateInfo_ObjForState(TreeCtrl *tree, PerStateType *typePtr, extern int PerStateInfo_Undefine(TreeCtrl *tree, PerStateType *typePtr, PerStateInfo *pInfo, int state); -struct PerStateGC -{ - unsigned long mask; - XGCValues gcValues; - GC gc; - struct PerStateGC *next; -}; -extern void PerStateGC_Free(TreeCtrl *tree, struct PerStateGC **pGCPtr); -extern GC PerStateGC_Get(TreeCtrl *tree, struct PerStateGC **pGCPtr, unsigned long mask, XGCValues *gcValues); +extern GC Tree_GetGC(TreeCtrl *tree, unsigned long mask, XGCValues *gcValues); +extern void Tree_FreeAllGC(TreeCtrl *tree); extern Pixmap PerStateBitmap_ForState(TreeCtrl *tree, PerStateInfo *pInfo, int state, int *match); diff --git a/generic/tkTreeDisplay.c b/generic/tkTreeDisplay.c index b7e63af..0842889 100644 --- a/generic/tkTreeDisplay.c +++ b/generic/tkTreeDisplay.c @@ -5,7 +5,7 @@ * * Copyright (c) 2002-2006 Tim Baker * - * RCS: @(#) $Id: tkTreeDisplay.c,v 1.72 2006/12/04 05:49:54 treectrl Exp $ + * RCS: @(#) $Id: tkTreeDisplay.c,v 1.73 2006/12/06 00:03:21 treectrl Exp $ */ #include "tkTreeCtrl.h" @@ -4229,7 +4229,7 @@ Proxy_Draw( #endif gcValues.graphics_exposures = False; gcMask = GCFunction | GCGraphicsExposures; - gc = Tk_GetGC(tree->tkwin, gcMask, &gcValues); + gc = Tree_GetGC(tree, gcMask, &gcValues); /* GXinvert doesn't work with XFillRectangle() on Win32 or Mac */ #if defined(WIN32) || defined(MAC_TCL) @@ -4239,8 +4239,7 @@ Proxy_Draw( x1, y1, MAX(x2 - x1, 1), MAX(y2 - y1, 1)); #endif - Tk_FreeGC(tree->display, gc); -#endif +#endif /* !MAC_OSX_TK */ } /* diff --git a/generic/tkTreeElem.c b/generic/tkTreeElem.c index 5446f86..98e761a 100644 --- a/generic/tkTreeElem.c +++ b/generic/tkTreeElem.c @@ -5,7 +5,7 @@ * * Copyright (c) 2002-2006 Tim Baker * - * RCS: @(#) $Id: tkTreeElem.c,v 1.56 2006/12/05 01:42:40 treectrl Exp $ + * RCS: @(#) $Id: tkTreeElem.c,v 1.57 2006/12/06 00:03:21 treectrl Exp $ */ #include "tkTreeCtrl.h" @@ -2205,7 +2205,6 @@ struct ElementText int textLen; /* Number of bytes (not characters) in the * UTF-8 string. If -1, it means the string * representation is invalid. */ - struct PerStateGC *gc; }; #define TEXTVAR @@ -2764,8 +2763,6 @@ static void DeleteProcText(ElementArgs *args) ElementText *elemX = (ElementText *) elem; ElementTextLayout2 *etl2; - if (elemX->gc != NULL) - PerStateGC_Free(tree, &elemX->gc); if ((elemX->textCfg == NULL) && (elemX->text != NULL)) { ckfree(elemX->text); elemX->text = NULL; @@ -2988,8 +2985,7 @@ static void DisplayProcText(ElementArgs *args) gcMask |= GCFont; gcValues.graphics_exposures = False; gcMask |= GCGraphicsExposures; - gc = PerStateGC_Get(tree, (masterX != NULL) ? &masterX->gc : - &elemX->gc, gcMask, &gcValues); + gc = Tree_GetGC(tree, gcMask, &gcValues); } else { tkfont = tree->tkfont; gc = tree->textGC; diff --git a/generic/tkTreeUtils.c b/generic/tkTreeUtils.c index 5bc32b6..2b81889 100644 --- a/generic/tkTreeUtils.c +++ b/generic/tkTreeUtils.c @@ -5,7 +5,7 @@ * * Copyright (c) 2002-2006 Tim Baker * - * RCS: @(#) $Id: tkTreeUtils.c,v 1.57 2006/12/04 05:50:38 treectrl Exp $ + * RCS: @(#) $Id: tkTreeUtils.c,v 1.58 2006/12/06 00:03:22 treectrl Exp $ */ #include "tkTreeCtrl.h" @@ -437,7 +437,7 @@ DrawActiveOutline( gcValues.function = GXinvert; #endif gcMask = GCFunction; - gc = Tk_GetGC(tree->tkwin, gcMask, &gcValues); + gc = Tree_GetGC(tree, gcMask, &gcValues); if (w) /* left */ { @@ -467,8 +467,6 @@ DrawActiveOutline( XDrawPoint(tree->display, drawable, gc, x + i, y + height - 1); } } - - Tk_FreeGC(tree->display, gc); #endif } @@ -2561,28 +2559,16 @@ int PerStateInfo_Undefine( /*****/ -void PerStateGC_Free(TreeCtrl *tree, struct PerStateGC **pGCPtr) -{ - struct PerStateGC *pGC = (*pGCPtr), *next; - - while (pGC != NULL) { - next = pGC->next; - Tk_FreeGC(tree->display, pGC->gc); - WFREE(pGC, struct PerStateGC); - pGC = next; - } - (*pGCPtr) = NULL; -} - -GC PerStateGC_Get(TreeCtrl *tree, struct PerStateGC **pGCPtr, unsigned long mask, XGCValues *gcValues) +GC Tree_GetGC(TreeCtrl *tree, unsigned long mask, XGCValues *gcValues) { - struct PerStateGC *pGC; + GCCache *pGC; + unsigned long valid = GCFont | GCForeground | GCFunction | GCBackground + | GCGraphicsExposures; - if ((mask | (GCFont | GCForeground | GCBackground | GCGraphicsExposures)) != - (GCFont | GCForeground | GCBackground | GCGraphicsExposures)) - panic("PerStateGC_Get: unsupported mask"); + if ((mask | valid) != valid) + panic("GCCache_Get: unsupported mask"); - for (pGC = (*pGCPtr); pGC != NULL; pGC = pGC->next) { + for (pGC = tree->gcCache; pGC != NULL; pGC = pGC->next) { if (mask != pGC->mask) continue; if ((mask & GCFont) && @@ -2591,6 +2577,9 @@ GC PerStateGC_Get(TreeCtrl *tree, struct PerStateGC **pGCPtr, unsigned long mask if ((mask & GCForeground) && (pGC->gcValues.foreground != gcValues->foreground)) continue; + if ((mask & GCFunction) && + (pGC->gcValues.function != gcValues->function)) + continue; if ((mask & GCBackground) && (pGC->gcValues.background != gcValues->background)) continue; @@ -2600,16 +2589,29 @@ GC PerStateGC_Get(TreeCtrl *tree, struct PerStateGC **pGCPtr, unsigned long mask return pGC->gc; } - pGC = (struct PerStateGC *) ckalloc(sizeof(*pGC)); + pGC = (GCCache *) ckalloc(sizeof(*pGC)); pGC->gcValues = (*gcValues); pGC->mask = mask; pGC->gc = Tk_GetGC(tree->tkwin, mask, gcValues); - pGC->next = (*pGCPtr); - (*pGCPtr) = pGC; + pGC->next = tree->gcCache; + tree->gcCache = pGC; return pGC->gc; } +void Tree_FreeAllGC(TreeCtrl *tree) +{ + GCCache *pGC = tree->gcCache, *next; + + while (pGC != NULL) { + next = pGC->next; + Tk_FreeGC(tree->display, pGC->gc); + WFREE(pGC, GCCache); + pGC = next; + } + tree->gcCache = NULL; +} + /*****/ typedef struct PerStateDataBitmap PerStateDataBitmap; |