vcl/inc/win/saldata.hxx | 5 ++--- vcl/win/app/salinst.cxx | 1 - vcl/win/app/salshl.cxx | 19 +++++++------------ vcl/win/gdi/salgdi.cxx | 8 +++----- 4 files changed, 12 insertions(+), 21 deletions(-)
New commits: commit 5c62d0b2a1ad867b5339721e79fb660c5aca1991 Author: Michael Weghorn <[email protected]> AuthorDate: Fri Feb 27 08:13:06 2026 +0000 Commit: Michael Weghorn <[email protected]> CommitDate: Sat Feb 28 09:05:39 2026 +0100 vcl win: Use a std::unordered_map for icon cache ... instead of implementing a linked list for no obvious reason. Change-Id: Ic804cbe82d60743f48a6ff5c1f702f9af2e3fd4c Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200566 Tested-by: Jenkins Reviewed-by: Michael Weghorn <[email protected]> diff --git a/vcl/inc/win/saldata.hxx b/vcl/inc/win/saldata.hxx index 6b17a02f6796..0036884adb63 100644 --- a/vcl/inc/win/saldata.hxx +++ b/vcl/inc/win/saldata.hxx @@ -35,6 +35,7 @@ #include <set> #include <map> +#include <unordered_map> class AutoTimer; class WinSalInstance; @@ -69,10 +70,8 @@ struct HDCCache struct SalIcon { - int nId; HICON hIcon; HICON hSmallIcon; - SalIcon *pNext; }; class SalData : public sal::systools::CoInitializeGuard @@ -115,7 +114,7 @@ public: WPARAM mnSalObjWantKeyEvt; // KeyEvent that should be processed by SalObj-Hook bool mbObjClassInit; // is SALOBJECTCLASS initialised DWORD mnAppThreadId; // Id from Application-Thread - SalIcon* mpFirstIcon; // icon cache, points to first icon, NULL if none + std::unordered_map<int, SalIcon*> maIconCache; // icon cache TempFontItem* mpTempFontItem; // LibreOffice own fonts (shared and embedded) bool mbThemeChanged; // true if visual theme was changed: throw away theme handles bool mbThemeMenuSupport; diff --git a/vcl/win/app/salinst.cxx b/vcl/win/app/salinst.cxx index 9746b910655d..d7f1f47d78eb 100644 --- a/vcl/win/app/salinst.cxx +++ b/vcl/win/app/salinst.cxx @@ -273,7 +273,6 @@ SalData::SalData() mnSalObjWantKeyEvt = 0; // KeyEvent for the SalObj hook mbObjClassInit = false; // is SALOBJECTCLASS initialised mnAppThreadId = 0; // Id from Application-Thread - mpFirstIcon = nullptr; // icon cache, points to first icon, NULL if none mpTempFontItem = nullptr; mbThemeChanged = false; // true if visual theme was changed: throw away theme handles mbThemeMenuSupport = false; diff --git a/vcl/win/app/salshl.cxx b/vcl/win/app/salshl.cxx index 7e3e4b9327d0..b8485ca24412 100644 --- a/vcl/win/app/salshl.cxx +++ b/vcl/win/app/salshl.cxx @@ -60,17 +60,13 @@ bool ImplLoadSalIcon(int nId, HICON& rIcon, HICON& rSmallIcon, SalData* pSalData pSalData = GetSalData(); // check the cache first - SalIcon *pSalIcon = pSalData->mpFirstIcon; - while( pSalIcon ) + auto aIt = pSalData->maIconCache.find(nId); + if (aIt != pSalData->maIconCache.end()) { - if( pSalIcon->nId != nId ) - pSalIcon = pSalIcon->pNext; - else - { - rIcon = pSalIcon->hIcon; - rSmallIcon = pSalIcon->hSmallIcon; - return (rSmallIcon != nullptr); - } + SalIcon* pSalIcon = aIt->second; + rIcon = pSalIcon->hIcon; + rSmallIcon = pSalIcon->hSmallIcon; + return (rSmallIcon != nullptr); } // Try at first to load the icons from the application exe file @@ -103,8 +99,7 @@ bool ImplLoadSalIcon(int nId, HICON& rIcon, HICON& rSmallIcon, SalData* pSalData if( rIcon ) { // add to icon cache - pSalData->mpFirstIcon = new SalIcon{ - nId, rIcon, rSmallIcon, pSalData->mpFirstIcon}; + pSalData->maIconCache[nId] = new SalIcon{rIcon, rSmallIcon}; } return (rSmallIcon != nullptr); diff --git a/vcl/win/gdi/salgdi.cxx b/vcl/win/gdi/salgdi.cxx index 339b9e4c3c0d..1e75f045dea7 100644 --- a/vcl/win/gdi/salgdi.cxx +++ b/vcl/win/gdi/salgdi.cxx @@ -105,16 +105,14 @@ void ImplFreeSalGDI() ImplClearHDCCache( pSalData ); // delete icon cache - SalIcon* pIcon = pSalData->mpFirstIcon; - pSalData->mpFirstIcon = nullptr; - while( pIcon ) + for (auto aIt : pSalData->maIconCache) { - SalIcon* pTmp = pIcon->pNext; + SalIcon* pIcon = aIt.second; DestroyIcon( pIcon->hIcon ); DestroyIcon( pIcon->hSmallIcon ); delete pIcon; - pIcon = pTmp; } + pSalData->maIconCache.clear(); // delete temporary font list ImplReleaseTempFonts(*pSalData);
