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);

Reply via email to