sd/source/ui/sidebar/LayoutMenu.cxx          |    6 ++----
 sd/source/ui/sidebar/LayoutMenu.hxx          |    3 ++-
 sd/source/ui/sidebar/MasterPagesSelector.cxx |   12 ++++--------
 sd/source/ui/sidebar/MasterPagesSelector.hxx |    2 +-
 4 files changed, 9 insertions(+), 14 deletions(-)

New commits:
commit 6c2a89a6e298f0a6a3d41815c9549a9113907a27
Author:     Mike Kaganski <[email protected]>
AuthorDate: Sat Feb 21 15:45:44 2026 +0500
Commit:     Mike Kaganski <[email protected]>
CommitDate: Sat Feb 21 17:13:41 2026 +0100

    fix VirtualDevice GDI handle leaks in IconView's set_image callers
    
    Similar to commit e9392c0c86fcf373e00ede92f8ceeee2c7efd233 (fix
    VirtualDevice GDI handle leaks across IconView callers, 2026-02-21).
    
    Change-Id: I170e0429f4393f819742824bc49a22674d31b257
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/199926
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <[email protected]>

diff --git a/sd/source/ui/sidebar/LayoutMenu.cxx 
b/sd/source/ui/sidebar/LayoutMenu.cxx
index d235943972c5..49a6d7e60ec8 100644
--- a/sd/source/ui/sidebar/LayoutMenu.cxx
+++ b/sd/source/ui/sidebar/LayoutMenu.cxx
@@ -396,7 +396,7 @@ SfxRequest LayoutMenu::CreateRequest (
     return aRequest;
 }
 
-VclPtr<VirtualDevice> LayoutMenu::GetVirtualDevice(Image pImage)
+ScopedVclPtr<VirtualDevice> LayoutMenu::GetVirtualDevice(Image pImage)
 {
     Bitmap aPreviewBitmap = pImage.GetBitmap();
     VclPtr<VirtualDevice> pVDev = VclPtr<VirtualDevice>::Create();
@@ -481,11 +481,9 @@ void LayoutMenu::Fill()
                 OUString sLayoutName = SdResId(elem.mpStrResId);
                 if (!mxLayoutIconView->get_id(id).isEmpty())
                 {
-                    VclPtr<VirtualDevice> pVDev = GetVirtualDevice(aImg);
-                    mxLayoutIconView->set_image(id, *pVDev);
+                    mxLayoutIconView->set_image(id, *GetVirtualDevice(aImg));
                     mxLayoutIconView->set_id(id, sId);
                     mxLayoutIconView->set_text(id, sLayoutName);
-                    pVDev.disposeAndClear();
                 }
                 else
                 {
diff --git a/sd/source/ui/sidebar/LayoutMenu.hxx 
b/sd/source/ui/sidebar/LayoutMenu.hxx
index 2632350a8a30..34763fec2673 100644
--- a/sd/source/ui/sidebar/LayoutMenu.hxx
+++ b/sd/source/ui/sidebar/LayoutMenu.hxx
@@ -25,6 +25,7 @@
 #include <sfx2/request.hxx>
 #include <xmloff/autolayout.hxx>
 #include <vcl/image.hxx>
+#include <vcl/vclptr.hxx>
 #include <vcl/weld/IconView.hxx>
 #include <map>
 
@@ -159,7 +160,7 @@ private:
     DECL_LINK(EventMultiplexerListener, ::sdtools::EventMultiplexerEvent&, 
void);
     DECL_LINK(MenuSelectAsyncHdl, void*, void);
 
-    static VclPtr<VirtualDevice> GetVirtualDevice(Image pPreview);
+    static ScopedVclPtr<VirtualDevice> GetVirtualDevice(Image pPreview);
     static Bitmap GetPreviewAsBitmap(const Image& rImage);
     void HandleMenuSelect(std::u16string_view rIdent);
 };
diff --git a/sd/source/ui/sidebar/MasterPagesSelector.cxx 
b/sd/source/ui/sidebar/MasterPagesSelector.cxx
index 685c128cc479..24725dd19c0b 100644
--- a/sd/source/ui/sidebar/MasterPagesSelector.cxx
+++ b/sd/source/ui/sidebar/MasterPagesSelector.cxx
@@ -368,8 +368,7 @@ void MasterPagesSelector::NotifyContainerChangeEvent (const 
MasterPageContainerC
                 Image 
aPreview(mpContainer->GetPreviewForToken(rEvent.maChildToken));
                 if (aPreview.GetSizePixel().Width() > 0)
                 {
-                    VclPtr<VirtualDevice> pVDev = GetVirtualDevice(aPreview);
-                    mxPreviewIconView->set_image(nIndex, *pVDev);
+                    mxPreviewIconView->set_image(nIndex, 
*GetVirtualDevice(aPreview));
                 }
             }
         }
@@ -427,10 +426,8 @@ void MasterPagesSelector::SetItem (
         {
             if (!mxPreviewIconView->get_id(nIndex).isEmpty())
             {
-                VclPtr<VirtualDevice> pVDev = GetVirtualDevice(aPreview);
-                mxPreviewIconView->set_image(nIndex, *pVDev);
+                mxPreviewIconView->set_image(nIndex, 
*GetVirtualDevice(aPreview));
                 mxPreviewIconView->set_id(nIndex, OUString::number(aToken));
-                pVDev.disposeAndClear();
             }
             else
             {
@@ -503,7 +500,7 @@ void MasterPagesSelector::InvalidatePreview (const SdPage* 
pPage)
     }
 }
 
-VclPtr<VirtualDevice> MasterPagesSelector::GetVirtualDevice(const Image& 
rImage)
+ScopedVclPtr<VirtualDevice> MasterPagesSelector::GetVirtualDevice(const Image& 
rImage)
 {
     Bitmap aPreviewBitmap = rImage.GetBitmap();
     VclPtr<VirtualDevice> pVDev = VclPtr<VirtualDevice>::Create();
@@ -540,8 +537,7 @@ void MasterPagesSelector::UpdateAllPreviews()
         Image aPreview(mpContainer->GetPreviewForToken(aToken));
         if (aPreview.GetSizePixel().Width() > 0)
         {
-            VclPtr<VirtualDevice> pVDev = GetVirtualDevice(aPreview);
-            mxPreviewIconView->set_image(aIndex, *pVDev);
+            mxPreviewIconView->set_image(aIndex, *GetVirtualDevice(aPreview));
         }
         else if (mpContainer->GetPreviewState(aToken) == 
MasterPageContainer::PS_CREATABLE)
         {
diff --git a/sd/source/ui/sidebar/MasterPagesSelector.hxx 
b/sd/source/ui/sidebar/MasterPagesSelector.hxx
index 93162ddf9c63..31a2e30a96b6 100644
--- a/sd/source/ui/sidebar/MasterPagesSelector.hxx
+++ b/sd/source/ui/sidebar/MasterPagesSelector.hxx
@@ -196,7 +196,7 @@ private:
         sal_uInt16 nIndex,
         MasterPageContainer::Token aToken);
 
-    static VclPtr<VirtualDevice> GetVirtualDevice(const Image& rPreview);
+    static ScopedVclPtr<VirtualDevice> GetVirtualDevice(const Image& rPreview);
     static Bitmap GetPreviewAsBitmap(const Image& rPreview);
 };
 

Reply via email to