summaryrefslogtreecommitdiffstats
path: root/generic/tkTreeTheme.c
diff options
context:
space:
mode:
authortreectrl <treectrl>2005-06-30 19:47:08 (GMT)
committertreectrl <treectrl>2005-06-30 19:47:08 (GMT)
commitd3ed412c059ff0e1eeaa423ce048f8e96432d2b4 (patch)
tree77160f9b050202f94ca76de13d161770d6c09bc9 /generic/tkTreeTheme.c
parentfb2e78be6099f5896bd10164581451450dbea733 (diff)
downloadtktreectrl-d3ed412c059ff0e1eeaa423ce048f8e96432d2b4.zip
tktreectrl-d3ed412c059ff0e1eeaa423ce048f8e96432d2b4.tar.gz
tktreectrl-d3ed412c059ff0e1eeaa423ce048f8e96432d2b4.tar.bz2
Cache the size of the expand/collapse button under XP for a massive speedup of item layout.
Diffstat (limited to 'generic/tkTreeTheme.c')
-rw-r--r--generic/tkTreeTheme.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/generic/tkTreeTheme.c b/generic/tkTreeTheme.c
index 750ac38..0d1d1b7 100644
--- a/generic/tkTreeTheme.c
+++ b/generic/tkTreeTheme.c
@@ -5,7 +5,7 @@
*
* Copyright (c) 2005 Tim Baker
*
- * RCS: @(#) $Id: tkTreeTheme.c,v 1.8 2005/05/22 22:19:23 treectrl Exp $
+ * RCS: @(#) $Id: tkTreeTheme.c,v 1.9 2005/06/30 19:47:08 treectrl Exp $
*/
#ifdef WIN32
@@ -91,6 +91,8 @@ typedef struct
XPThemeProcs *procs;
int registered;
int themeEnabled;
+ SIZE buttonOpen;
+ SIZE buttonClosed;
} XPThemeData;
static XPThemeProcs *procs = NULL;
@@ -463,6 +465,14 @@ int TreeTheme_GetButtonSize(TreeCtrl *tree, Drawable drawable, int open,
if (!themeData->themeEnabled || !procs)
return TCL_ERROR;
+ /* Use cached values */
+ size = open ? themeData->buttonOpen : themeData->buttonClosed;
+ if (size.cx > 1) {
+ *widthPtr = size.cx;
+ *heightPtr = size.cy;
+ return TCL_OK;
+ }
+
iPartId = TVP_GLYPH;
iStateId = open ? GLPS_OPENED : GLPS_CLOSED;
@@ -497,6 +507,7 @@ int TreeTheme_GetButtonSize(TreeCtrl *tree, Drawable drawable, int open,
procs->CloseThemeData(hTheme);
TkWinReleaseDrawableDC(drawable, hDC, &dcState);
+ /* With RandomN of 10000, I eventually get hr=E_HANDLE, invalid handle */
if (hr != S_OK)
return TCL_ERROR;
@@ -504,6 +515,12 @@ int TreeTheme_GetButtonSize(TreeCtrl *tree, Drawable drawable, int open,
if ((size.cx <= 1) && (size.cy <= 1))
return TCL_ERROR;
+ /* Cache the values */
+ if (open)
+ themeData->buttonOpen = size;
+ else
+ themeData->buttonClosed = size;
+
*widthPtr = size.cx;
*heightPtr = size.cy;
return TCL_OK;
@@ -522,6 +539,7 @@ WndProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
case WM_THEMECHANGED:
Tcl_MutexLock(&themeMutex);
themeData->themeEnabled = procs->IsThemeActive();
+ themeData->buttonClosed.cx = themeData->buttonOpen.cx = -1;
Tcl_MutexUnlock(&themeMutex);
Tree_TheWorldHasChanged(interp);
break;
@@ -599,6 +617,7 @@ int TreeTheme_Init(Tcl_Interp *interp)
themeData->procs = LoadXPThemeProcs(&themeData->hlibrary);
themeData->registered = FALSE;
themeData->themeEnabled = FALSE;
+ themeData->buttonClosed.cx = themeData->buttonOpen.cx = -1;
procs = themeData->procs;