summaryrefslogtreecommitdiffstats
path: root/generic
diff options
context:
space:
mode:
authortreectrl <treectrl>2006-12-06 00:03:21 (GMT)
committertreectrl <treectrl>2006-12-06 00:03:21 (GMT)
commit4204b2f78309da5ae8fc5a788ba3489655d442de (patch)
tree48abeb3192639b7603c5268b45555ce3141f39b3 /generic
parent77ac4fe60485a11fd2fd7ee06625ca33401d4671 (diff)
downloadtktreectrl-4204b2f78309da5ae8fc5a788ba3489655d442de.zip
tktreectrl-4204b2f78309da5ae8fc5a788ba3489655d442de.tar.gz
tktreectrl-4204b2f78309da5ae8fc5a788ba3489655d442de.tar.bz2
Renamed the 2 PerStateGC_xxx functions since they had nothing to do with per-state options. Call the renamed functions from several places where GCs are used. Removed ElementText.gc to save some more memory.
Diffstat (limited to 'generic')
-rw-r--r--generic/tkTreeColumn.c8
-rw-r--r--generic/tkTreeCtrl.c3
-rw-r--r--generic/tkTreeCtrl.h23
-rw-r--r--generic/tkTreeDisplay.c7
-rw-r--r--generic/tkTreeElem.c8
-rw-r--r--generic/tkTreeUtils.c54
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;