Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | another attempt to fix ttk object caching |
---|---|
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
4979992f45ef6cb4b84a3bf32da82b12 |
User & Date: | chw 2023-11-30 18:02:07.789 |
Context
2023-12-01
| ||
15:58 | add selected tcl upstream changes check-in: 0e979461e6 user: chw tags: trunk | |
2023-11-30
| ||
18:02 | another attempt to fix ttk object caching check-in: 4979992f45 user: chw tags: trunk | |
11:21 | update open62541 to version 1.3.9 check-in: 533912d022 user: chw tags: trunk | |
Changes
Changes to jni/sdl2tk/generic/ttk/ttkCache.c.
︙ | ︙ | |||
23 24 25 26 27 28 29 30 31 32 33 34 | * * @@@ Colormap flashing on PseudoColor visuals is still possible, * but this will be a transient effect. */ #include "tkInt.h" #include "ttkTheme.h" struct Ttk_ResourceCache_ { Tcl_Interp *interp; /* Interpreter for error reporting */ Tk_Window tkwin; /* Cache window. */ Tcl_HashTable fontTable; /* Entries: Tcl_Obj* holding FontObjs */ | > > > > > > > > > > > > > > > > > > > > > < > < > > > > > > > > > > > > > > > > > < < < < < < < < < < < < < < < > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 | * * @@@ Colormap flashing on PseudoColor visuals is still possible, * but this will be a transient effect. */ #include "tkInt.h" #include "ttkTheme.h" #if defined(PLATFORM_SDL) || defined(_WIN32) || defined(MAC_OSX_TK) # define NEED_EXTRA_INFO 0 #else /* * Display, Screen, Visual, and Colormap need be tracked, too. * Required on X11 with multiple display connections or * special visuals/colormaps. */ # define NEED_EXTRA_INFO 1 #endif #if NEED_EXTRA_INFO typedef struct { Tcl_Obj *objPtr; /* The cached Tcl_Obj*. */ Display *display; /* Display of (Font|Border|Color)Obj */ int screenNum; /* Screen number of (Font|Border|Color)Obj */ Visual *visual; /* Visual of (Font|Border|Color)Obj */ Colormap colormap; /* Colormap of (Font|Border|Color)Obj */ } Ttk_Cached; #endif struct Ttk_ResourceCache_ { Tcl_Interp *interp; /* Interpreter for error reporting */ Tk_Window tkwin; /* Cache window. */ Tcl_HashTable fontTable; /* Entries: Tcl_Obj* holding FontObjs */ Tcl_HashTable borderTable; /* Entries: Tcl_Obj* holding BorderObjs */ Tcl_HashTable colorTable; /* Entries: Tcl_Obj* holding ColorObjs */ Tcl_HashTable imageTable; /* Entries: Tk_Images */ Tcl_HashTable namedColors; /* Entries: RGB values as Tcl_StringObjs */ }; /* * Ttk_CreateResourceCache -- * Initialize a new resource cache. */ Ttk_ResourceCache Ttk_CreateResourceCache(Tcl_Interp *interp) { Ttk_ResourceCache cache = ckalloc(sizeof(*cache)); cache->tkwin = NULL; /* initialized later */ cache->interp = interp; Tcl_InitHashTable(&cache->fontTable, TCL_STRING_KEYS); Tcl_InitHashTable(&cache->borderTable, TCL_STRING_KEYS); Tcl_InitHashTable(&cache->colorTable, TCL_STRING_KEYS); Tcl_InitHashTable(&cache->imageTable, TCL_STRING_KEYS); Tcl_InitHashTable(&cache->namedColors, TCL_STRING_KEYS); return cache; } /* * Ttk_ClearCache -- * Release references to all cached resources. */ static void Ttk_ClearCache(Ttk_ResourceCache cache) { Tcl_HashSearch search; Tcl_HashEntry *entryPtr; /* * Free fonts: */ entryPtr = Tcl_FirstHashEntry(&cache->fontTable, &search); while (entryPtr != NULL) { #if !NEED_EXTRA_INFO Tcl_Obj *fontObj = Tcl_GetHashValue(entryPtr); if (fontObj) { Tk_FreeFontFromObj(cache->tkwin, fontObj); Tcl_DecrRefCount(fontObj); } #else Ttk_Cached *cachedPtr = Tcl_GetHashValue(entryPtr); if (cachedPtr) { TkWindow fakeWin; Tcl_Obj *fontObj = cachedPtr->objPtr; fakeWin = *((TkWindow *) cache->tkwin); fakeWin.display = cachedPtr->display; fakeWin.screenNum = cachedPtr->screenNum; fakeWin.visual = cachedPtr->visual; fakeWin.atts.colormap = cachedPtr->colormap; Tk_FreeFontFromObj((Tk_Window) &fakeWin, fontObj); Tcl_DecrRefCount(fontObj); ckfree(cachedPtr); } #endif entryPtr = Tcl_NextHashEntry(&search); } Tcl_DeleteHashTable(&cache->fontTable); Tcl_InitHashTable(&cache->fontTable, TCL_STRING_KEYS); /* * Free borders: */ entryPtr = Tcl_FirstHashEntry(&cache->borderTable, &search); while (entryPtr != NULL) { #if !NEED_EXTRA_INFO Tcl_Obj *borderObj = Tcl_GetHashValue(entryPtr); if (borderObj) { Tk_Free3DBorderFromObj(cache->tkwin, borderObj); Tcl_DecrRefCount(borderObj); } #else Ttk_Cached *cachedPtr = Tcl_GetHashValue(entryPtr); if (cachedPtr) { TkWindow fakeWin; Tcl_Obj *borderObj = cachedPtr->objPtr; fakeWin = *((TkWindow *) cache->tkwin); fakeWin.display = cachedPtr->display; fakeWin.screenNum = cachedPtr->screenNum; fakeWin.visual = cachedPtr->visual; fakeWin.atts.colormap = cachedPtr->colormap; Tk_Free3DBorderFromObj((Tk_Window) &fakeWin, borderObj); Tcl_DecrRefCount(borderObj); ckfree(cachedPtr); } #endif entryPtr = Tcl_NextHashEntry(&search); } Tcl_DeleteHashTable(&cache->borderTable); Tcl_InitHashTable(&cache->borderTable, TCL_STRING_KEYS); /* * Free colors: */ entryPtr = Tcl_FirstHashEntry(&cache->colorTable, &search); while (entryPtr != NULL) { #if !NEED_EXTRA_INFO Tcl_Obj *colorObj = Tcl_GetHashValue(entryPtr); if (colorObj) { Tk_FreeColorFromObj(cache->tkwin, colorObj); Tcl_DecrRefCount(colorObj); } #else Ttk_Cached *cachedPtr = Tcl_GetHashValue(entryPtr); if (cachedPtr) { TkWindow fakeWin; Tcl_Obj *colorObj = cachedPtr->objPtr; fakeWin = *((TkWindow *) cache->tkwin); fakeWin.display = cachedPtr->display; fakeWin.screenNum = cachedPtr->screenNum; fakeWin.visual = cachedPtr->visual; fakeWin.atts.colormap = cachedPtr->colormap; Tk_FreeColorFromObj((Tk_Window) &fakeWin, colorObj); Tcl_DecrRefCount(colorObj); ckfree(cachedPtr); } #endif entryPtr = Tcl_NextHashEntry(&search); } Tcl_DeleteHashTable(&cache->colorTable); Tcl_InitHashTable(&cache->colorTable, TCL_STRING_KEYS); /* * Free images: */ entryPtr = Tcl_FirstHashEntry(&cache->imageTable, &search); while (entryPtr != NULL) { Tk_Image image = Tcl_GetHashValue(entryPtr); if (image) { |
︙ | ︙ | |||
175 176 177 178 179 180 181 | Ttk_ClearCache(cache); cache->tkwin = NULL; } /* * InitCacheWindow -- * Specify the cache window if not already set. | < < | | | 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 | Ttk_ClearCache(cache); cache->tkwin = NULL; } /* * InitCacheWindow -- * Specify the cache window if not already set. */ static void InitCacheWindow(Ttk_ResourceCache cache, Tk_Window tkwin) { if (cache->tkwin == NULL) { cache->tkwin = Tk_MainWindow(cache->interp); Tk_CreateEventHandler(cache->tkwin, StructureNotifyMask, CacheWinEventHandler, cache); } } /* * Ttk_RegisterNamedColor -- * Specify an RGB triplet as a named color. |
︙ | ︙ | |||
262 263 264 265 266 267 268 | Allocator allocate, Tk_Window tkwin, Tcl_Obj *objPtr) { int newEntry; Tcl_HashEntry *entryPtr; Tcl_Obj *cacheObj; | | > > > > > > > > > > > > > > > | 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 | Allocator allocate, Tk_Window tkwin, Tcl_Obj *objPtr) { int newEntry; Tcl_HashEntry *entryPtr; Tcl_Obj *cacheObj; #if !NEED_EXTRA_INFO entryPtr = Tcl_CreateHashEntry(table, Tcl_GetString(objPtr), &newEntry); #else Tcl_DString ds; char buffer[64]; Tcl_DStringInit(&ds); Tcl_DStringAppend(&ds, Tcl_GetString(objPtr), -1); sprintf(buffer, ",%d,%lu,%lu", ConnectionNumber(Tk_Display(tkwin)), Tk_Visual(tkwin)->visualid, (unsigned long) Tk_Colormap(tkwin)); Tcl_DStringAppend(&ds, buffer, -1); entryPtr = Tcl_CreateHashEntry(table, Tcl_DStringValue(&ds), &newEntry); Tcl_DStringFree(&ds); #endif if (!newEntry) { #if !NEED_EXTRA_INFO return Tcl_GetHashValue(entryPtr); #else Ttk_Cached *cachedPtr = Tcl_GetHashValue(entryPtr); return cachedPtr->objPtr; #endif } cacheObj = Tcl_DuplicateObj(objPtr); Tcl_IncrRefCount(cacheObj); if (allocate(interp, tkwin, cacheObj)) { #if !NEED_EXTRA_INFO Tcl_SetHashValue(entryPtr, cacheObj); #else Ttk_Cached *cachedPtr = ckalloc(sizeof(*cachedPtr)); cachedPtr->objPtr = cacheObj; cachedPtr->display = Tk_Display(tkwin); cachedPtr->screenNum = Tk_ScreenNumber(tkwin); cachedPtr->visual = Tk_Visual(tkwin); cachedPtr->colormap = Tk_Colormap(tkwin); Tcl_SetHashValue(entryPtr, cachedPtr); #endif return cacheObj; } else { Tcl_DecrRefCount(cacheObj); Tcl_SetHashValue(entryPtr, NULL); Tcl_BackgroundException(interp, TCL_ERROR); return NULL; } |
︙ | ︙ | |||
351 352 353 354 355 356 357 | { const char *imageName = Tcl_GetString(objPtr); int newEntry; Tcl_HashEntry *entryPtr; Tk_Image image; InitCacheWindow(cache, tkwin); | | | 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 | { const char *imageName = Tcl_GetString(objPtr); int newEntry; Tcl_HashEntry *entryPtr; Tk_Image image; InitCacheWindow(cache, tkwin); #if !NEED_EXTRA_INFO entryPtr = Tcl_CreateHashEntry(&cache->imageTable, imageName, &newEntry); #else Tcl_DString ds; char buffer[64]; Tcl_DStringInit(&ds); Tcl_DStringAppend(&ds, imageName, -1); |
︙ | ︙ |