include/sfx2/charmapcontainer.hxx             |    4 ++--
 include/vcl/vclptr.hxx                        |   11 +++++++++++
 include/vcl/weld/weld.hxx                     |    3 ++-
 sc/source/ui/inc/checklistmenu.hxx            |    2 +-
 sc/source/ui/sidebar/CellLineStyleControl.cxx |    4 ++--
 sc/source/ui/sidebar/CellLineStyleControl.hxx |    2 +-
 sfx2/source/control/charmapcontainer.cxx      |    4 ++--
 svx/inc/tbxcolorupdate.hxx                    |    6 +++---
 svx/source/tbxctrls/tbxcolorupdate.cxx        |    6 +++---
 sw/source/ui/frmdlg/column.cxx                |    4 ++--
 sw/source/uibase/inc/FrameControl.hxx         |    2 +-
 sw/source/uibase/inc/HeaderFooterWin.hxx      |    2 +-
 sw/source/uibase/inc/PageBreakWin.hxx         |    2 +-
 sw/source/uibase/inc/column.hxx               |    2 +-
 sw/source/uibase/sidebar/ThemePanel.cxx       |    4 ++--
 sw/source/uibase/sidebar/ThemePanel.hxx       |    2 +-
 vcl/inc/qt5/QtInstanceWidget.hxx              |    2 +-
 vcl/inc/salvtables.hxx                        |    2 +-
 vcl/qt5/QtInstanceWidget.cxx                  |    4 ++--
 vcl/source/app/salvtables.cxx                 |    2 +-
 vcl/unx/gtk3/gtkinst.cxx                      |    4 ++--
 21 files changed, 43 insertions(+), 31 deletions(-)

New commits:
commit 8dd92537cc839b4567e09e84ce854d14a4af5bad
Author:     Noel Grandin <[email protected]>
AuthorDate: Sun Feb 22 12:05:53 2026 +0200
Commit:     Noel Grandin <[email protected]>
CommitDate: Mon Feb 23 17:30:22 2026 +0100

    use more ScopedVclPtr<VirtualDevice> in create_virtual_device
    
    which requires making the move constructor explicit in
    ScopedVclPtr.
    
    Change-Id: I2e4caec45c27ed444a81c121d426a5988bd65015
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200005
    Reviewed-by: Noel Grandin <[email protected]>
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <[email protected]>

diff --git a/include/sfx2/charmapcontainer.hxx 
b/include/sfx2/charmapcontainer.hxx
index cfc40e2455b2..e9b366777f3f 100644
--- a/include/sfx2/charmapcontainer.hxx
+++ b/include/sfx2/charmapcontainer.hxx
@@ -92,8 +92,8 @@ public:
               const Link<void*, void>& rUpdateFavHdl, const Link<void*, void>& 
rUpdateRecentHdl,
               const Link<const CharAndFont&, void>& rCharSelectedHdl);
 
-    static VclPtr<VirtualDevice> CreateIcon(weld::IconView& rIconView, const 
OUString& rFont,
-                                            const OUString& rText);
+    static ScopedVclPtr<VirtualDevice> CreateIcon(weld::IconView& rIconView, 
const OUString& rFont,
+                                                  const OUString& rText);
 
     void getFavCharacterList();
     void updateFavCharControl();
diff --git a/include/vcl/vclptr.hxx b/include/vcl/vclptr.hxx
index 34de43334a82..b55f9f76c2ef 100644
--- a/include/vcl/vclptr.hxx
+++ b/include/vcl/vclptr.hxx
@@ -83,6 +83,7 @@ class VclPtr
             nullptr),
         "template argument type must be derived from VclReferenceBase");
 
+protected:
     ::rtl::Reference<reference_type> m_rInnerRef;
 
 public:
@@ -295,6 +296,9 @@ public:
         : VclPtr<reference_type>(handle)
     {}
 
+    /** Move constructor */
+    ScopedVclPtr(ScopedVclPtr<reference_type> &&) = default;
+
     /**
        Assignment that releases the last reference.
      */
@@ -328,6 +332,13 @@ public:
         return operator=(rRef.get());
     }
 
+    ScopedVclPtr& operator = (ScopedVclPtr<reference_type> && rRef)
+    {
+        assert(!VclPtr<reference_type>::m_rInnerRef);
+        VclPtr<reference_type>::m_rInnerRef = std::move(rRef.m_rInnerRef);
+        return *this;
+    }
+
     /**
      * Override and disallow this, to prevent people accidentally calling it 
and actually
      * getting VclPtr::Create and getting a naked VclPtr<> instance
diff --git a/include/vcl/weld/weld.hxx b/include/vcl/weld/weld.hxx
index c4285e20ab22..1e1cc539f07d 100644
--- a/include/vcl/weld/weld.hxx
+++ b/include/vcl/weld/weld.hxx
@@ -13,6 +13,7 @@
 #include <rtl/ustring.hxx>
 #include <tools/gen.hxx>
 #include <tools/link.hxx>
+#include <vcl/vclptr.hxx>
 #include <vcl/dllapi.h>
 #include <utility>
 
@@ -368,7 +369,7 @@ public:
     */
     virtual OUString escape_ui_str(const OUString& rLabel) const = 0;
 
-    virtual VclPtr<VirtualDevice> create_virtual_device() const = 0;
+    virtual ScopedVclPtr<VirtualDevice> create_virtual_device() const = 0;
 
     //do something transient to attract the attention of the user to the widget
     virtual void call_attention_to() = 0;
diff --git a/sc/source/ui/inc/checklistmenu.hxx 
b/sc/source/ui/inc/checklistmenu.hxx
index f5916782b191..210940284827 100644
--- a/sc/source/ui/inc/checklistmenu.hxx
+++ b/sc/source/ui/inc/checklistmenu.hxx
@@ -385,7 +385,7 @@ public:
 
     ScViewData& GetViewData() const { return mrParentControl.GetViewData(); }
     ScCheckListMenuControl::ExtendedData* getExtendedData() { return 
mrParentControl.getExtendedData(); }
-    VclPtr<VirtualDevice> create_virtual_device() const { return 
mxMenu->create_virtual_device(); }
+    ScopedVclPtr<VirtualDevice> create_virtual_device() const { return 
mxMenu->create_virtual_device(); }
 
     /**
      * Dismiss all visible popup menus and set focus back to the application
diff --git a/sc/source/ui/sidebar/CellLineStyleControl.cxx 
b/sc/source/ui/sidebar/CellLineStyleControl.cxx
index 2729fea06126..1faa2ca54ad9 100644
--- a/sc/source/ui/sidebar/CellLineStyleControl.cxx
+++ b/sc/source/ui/sidebar/CellLineStyleControl.cxx
@@ -78,9 +78,9 @@ CellLineStylePopup::~CellLineStylePopup()
 {
 }
 
-VclPtr<VirtualDevice> CellLineStylePopup::CreateImage(int nIndex)
+ScopedVclPtr<VirtualDevice> CellLineStylePopup::CreateImage(int nIndex)
 {
-    VclPtr<VirtualDevice> pDev = 
mxCellLineStyleTreeView->create_virtual_device();
+    ScopedVclPtr<VirtualDevice> pDev = 
mxCellLineStyleTreeView->create_virtual_device();
     const StyleSettings& rStyleSettings = 
Application::GetSettings().GetStyleSettings();
     pDev->SetBackground(rStyleSettings.GetFieldColor());
     pDev->SetLineColor(rStyleSettings.GetFieldTextColor());
diff --git a/sc/source/ui/sidebar/CellLineStyleControl.hxx 
b/sc/source/ui/sidebar/CellLineStyleControl.hxx
index af70d0df9bc9..6d1454a30a0b 100644
--- a/sc/source/ui/sidebar/CellLineStyleControl.hxx
+++ b/sc/source/ui/sidebar/CellLineStyleControl.hxx
@@ -40,7 +40,7 @@ private:
     DECL_LINK(StyleSelectHdl, weld::TreeView&, bool);
     DECL_LINK(PBClickHdl, weld::Button&, void);
 
-    VclPtr<VirtualDevice> CreateImage(int nIndex);
+    ScopedVclPtr<VirtualDevice> CreateImage(int nIndex);
 
 public:
     CellLineStylePopup(weld::Toolbar* pParent, const OUString& rId, 
SfxDispatcher* pDispatcher);
diff --git a/sfx2/source/control/charmapcontainer.cxx 
b/sfx2/source/control/charmapcontainer.cxx
index 43abdfcfbe92..efbdc5dc88ea 100644
--- a/sfx2/source/control/charmapcontainer.cxx
+++ b/sfx2/source/control/charmapcontainer.cxx
@@ -73,7 +73,7 @@ void SfxCharmapContainer::init(const Link<const CharAndFont&, 
void>& rActivateHd
     m_xFavIconView->connect_command(LINK(this, SfxCharmapContainer, 
FavContextMenuHdl));
 }
 
-VclPtr<VirtualDevice> SfxCharmapContainer::CreateIcon(weld::IconView& 
rIconView,
+ScopedVclPtr<VirtualDevice> SfxCharmapContainer::CreateIcon(weld::IconView& 
rIconView,
                                                       const OUString& rFont, 
const OUString& rText)
 {
     const StyleSettings& rStyleSettings = 
Application::GetSettings().GetStyleSettings();
@@ -81,7 +81,7 @@ VclPtr<VirtualDevice> 
SfxCharmapContainer::CreateIcon(weld::IconView& rIconView,
     Size aFontSize = aFont.GetFontSize();
     aFont.SetFontSize(Size(aFontSize.Width() * 2, aFontSize.Height() * 2));
 
-    VclPtr<VirtualDevice> pDev = rIconView.create_virtual_device();
+    ScopedVclPtr<VirtualDevice> pDev = rIconView.create_virtual_device();
 
     Size aSize;
     {
diff --git a/svx/inc/tbxcolorupdate.hxx b/svx/inc/tbxcolorupdate.hxx
index ff952b6c0c29..6bb6c0164be0 100644
--- a/svx/inc/tbxcolorupdate.hxx
+++ b/svx/inc/tbxcolorupdate.hxx
@@ -82,7 +82,7 @@ protected:
     virtual void SetQuickHelpText(const OUString& rText) = 0;
     virtual OUString GetQuickHelpText() const = 0;
     virtual void SetImage(VirtualDevice* pVirDev) = 0;
-    virtual VclPtr<VirtualDevice> CreateVirtualDevice() const = 0;
+    virtual ScopedVclPtr<VirtualDevice> CreateVirtualDevice() const = 0;
     // true -> use Device to Record to Metafile, false -> Render to Device
     virtual bool RecordVirtualDevice() const = 0;
     virtual vcl::ImageType GetImageSize() const = 0;
@@ -104,7 +104,7 @@ private:
     virtual void SetQuickHelpText(const OUString& rText) override;
     virtual OUString GetQuickHelpText() const override;
     virtual void SetImage(VirtualDevice* pVirDev) override;
-    virtual VclPtr<VirtualDevice> CreateVirtualDevice() const override;
+    virtual ScopedVclPtr<VirtualDevice> CreateVirtualDevice() const override;
     virtual bool RecordVirtualDevice() const override { return true; }
     virtual vcl::ImageType GetImageSize() const override;
     virtual Size GetItemSize(const Size& rImageSize) const override;
@@ -124,7 +124,7 @@ private:
     virtual void SetQuickHelpText(const OUString& rText) override;
     virtual OUString GetQuickHelpText() const override;
     virtual void SetImage(VirtualDevice* pVirDev) override;
-    virtual VclPtr<VirtualDevice> CreateVirtualDevice() const override;
+    virtual ScopedVclPtr<VirtualDevice> CreateVirtualDevice() const override;
     virtual bool RecordVirtualDevice() const override { return false; }
     virtual vcl::ImageType GetImageSize() const override;
     virtual Size GetItemSize(const Size& rImageSize) const override;
diff --git a/svx/source/tbxctrls/tbxcolorupdate.cxx 
b/svx/source/tbxctrls/tbxcolorupdate.cxx
index a2fcf6c5bdfb..82d43c27942a 100644
--- a/svx/source/tbxctrls/tbxcolorupdate.cxx
+++ b/svx/source/tbxctrls/tbxcolorupdate.cxx
@@ -194,9 +194,9 @@ void VclToolboxButtonColorUpdater::SetImage(VirtualDevice* 
pVirDev)
     mpTbx->SetItemImage(mnBtnId, Image(aGraphic.GetXGraphic()));
 }
 
-VclPtr<VirtualDevice> VclToolboxButtonColorUpdater::CreateVirtualDevice() const
+ScopedVclPtr<VirtualDevice> 
VclToolboxButtonColorUpdater::CreateVirtualDevice() const
 {
-    auto xVD = VclPtr<VirtualDevice>::Create(*mpTbx->GetOutDev());
+    ScopedVclPtr<VirtualDevice> xVD = 
VclPtr<VirtualDevice>::Create(*mpTbx->GetOutDev());
     xVD->SetBackground(Wallpaper(COL_WHITE));
     return xVD;
 }
@@ -351,7 +351,7 @@ void ToolboxButtonColorUpdater::SetImage(VirtualDevice* 
pVirDev)
     mpTbx->set_item_image(msBtnId, pVirDev);
 }
 
-VclPtr<VirtualDevice> ToolboxButtonColorUpdater::CreateVirtualDevice() const
+ScopedVclPtr<VirtualDevice> ToolboxButtonColorUpdater::CreateVirtualDevice() 
const
 {
     return mpTbx->create_virtual_device();
 }
diff --git a/sw/source/ui/frmdlg/column.cxx b/sw/source/ui/frmdlg/column.cxx
index 9f2bfda0d678..28d577069e90 100644
--- a/sw/source/ui/frmdlg/column.cxx
+++ b/sw/source/ui/frmdlg/column.cxx
@@ -1319,7 +1319,7 @@ void SwColumnPage::SetInSection(bool bSet)
     m_xTextDirectionLB->set_visible(bSet);
 }
 
-VclPtr<VirtualDevice> SwColumnPage::CreateIconViewImage(int nIndex)
+ScopedVclPtr<VirtualDevice> SwColumnPage::CreateIconViewImage(int nIndex)
 {
     const StyleSettings& rStyleSettings = 
Application::GetSettings().GetStyleSettings();
 
@@ -1327,7 +1327,7 @@ VclPtr<VirtualDevice> 
SwColumnPage::CreateIconViewImage(int nIndex)
     tools::Long nRectWidth = aSize.getWidth();
     tools::Long nRectHeight = aSize.getHeight();
 
-    VclPtr<VirtualDevice> pDev = m_xDefaultIconView->create_virtual_device();
+    ScopedVclPtr<VirtualDevice> pDev = 
m_xDefaultIconView->create_virtual_device();
     pDev->SetOutputSizePixel(aSize);
 
     pDev->SetFillColor(rStyleSettings.GetFieldColor());
diff --git a/sw/source/uibase/inc/FrameControl.hxx 
b/sw/source/uibase/inc/FrameControl.hxx
index 39e74de38fad..098cb1be850c 100644
--- a/sw/source/uibase/inc/FrameControl.hxx
+++ b/sw/source/uibase/inc/FrameControl.hxx
@@ -56,7 +56,7 @@ public:
 class SwFrameMenuButtonBase : public InterimItemWindow, public ISwFrameControl
 {
 protected:
-    VclPtr<VirtualDevice> m_xVirDev;
+    ScopedVclPtr<VirtualDevice> m_xVirDev;
 private:
     VclPtr<SwEditWin>     m_pEditWin;
     const SwFrame*          m_pFrame;
diff --git a/sw/source/uibase/inc/HeaderFooterWin.hxx 
b/sw/source/uibase/inc/HeaderFooterWin.hxx
index 63de3e9d2cce..3c9c0c65fe9e 100644
--- a/sw/source/uibase/inc/HeaderFooterWin.hxx
+++ b/sw/source/uibase/inc/HeaderFooterWin.hxx
@@ -72,7 +72,7 @@ class SwHeaderFooterWin final : public InterimItemWindow
     std::unique_ptr<weld::MenuButton> m_xMenuButton;
     std::unique_ptr<weld::Button> m_xPushButton;
     VclPtr<SwEditWin>     m_pEditWin;
-    VclPtr<VirtualDevice> m_xVirDev;
+    ScopedVclPtr<VirtualDevice> m_xVirDev;
     const SwFrame*        m_pFrame;
     OUString              m_sLabel;
     bool                  m_bIsHeader;
diff --git a/sw/source/uibase/inc/PageBreakWin.hxx 
b/sw/source/uibase/inc/PageBreakWin.hxx
index 0112640caaf5..83cca13ea8f0 100644
--- a/sw/source/uibase/inc/PageBreakWin.hxx
+++ b/sw/source/uibase/inc/PageBreakWin.hxx
@@ -65,7 +65,7 @@ class SwPageBreakWin final : public InterimItemWindow
     std::unique_ptr<weld::MenuButton> m_xMenuButton;
     VclPtr<SwBreakDashedLine> m_pLine;
     VclPtr<SwEditWin>     m_pEditWin;
-    VclPtr<VirtualDevice> m_xVirDev;
+    ScopedVclPtr<VirtualDevice> m_xVirDev;
     const SwFrame*        m_pFrame;
     bool                  m_bIsAppearing;
     int                   m_nFadeRate;
diff --git a/sw/source/uibase/inc/column.hxx b/sw/source/uibase/inc/column.hxx
index e179768c76cc..26deb8e91864 100644
--- a/sw/source/uibase/inc/column.hxx
+++ b/sw/source/uibase/inc/column.hxx
@@ -137,7 +137,7 @@ class SwColumnPage final : public SfxTabPage
     DECL_LINK(UpdateColMgrColorBox, ColorListBox&, void);
     void Timeout();
 
-    VclPtr<VirtualDevice> CreateIconViewImage(int nIndex);
+    ScopedVclPtr<VirtualDevice> CreateIconViewImage(int nIndex);
     void            Update(const weld::MetricSpinButton* pInteractiveField);
     void            UpdateCols();
     void            Init();
diff --git a/sw/source/uibase/sidebar/ThemePanel.cxx 
b/sw/source/uibase/sidebar/ThemePanel.cxx
index 74d23240e121..2451f0d7d9bc 100644
--- a/sw/source/uibase/sidebar/ThemePanel.cxx
+++ b/sw/source/uibase/sidebar/ThemePanel.cxx
@@ -74,7 +74,7 @@ IMPL_LINK_NOARG(ThemePanel, ItemActivatedHdl, 
weld::IconView&, bool)
     return true;
 }
 
-VclPtr<VirtualDevice> ThemePanel::CreateImage(const model::ColorSet& rColorSet)
+ScopedVclPtr<VirtualDevice> ThemePanel::CreateImage(const model::ColorSet& 
rColorSet)
 {
     constexpr tools::Long BORDER = 4;
     constexpr tools::Long SIZE = 16;
@@ -86,7 +86,7 @@ VclPtr<VirtualDevice> ThemePanel::CreateImage(const 
model::ColorSet& rColorSet)
                     BORDER * 3 + SIZE * 2 + LABEL_HEIGHT);
 
     const Size aSize(aMin.Width() + 40, aMin.Height());
-    VclPtr<VirtualDevice> pDev = mxIconViewColors->create_virtual_device();
+    ScopedVclPtr<VirtualDevice> pDev = 
mxIconViewColors->create_virtual_device();
     pDev->SetOutputSizePixel(aSize);
 
     tools::Long startX = (aSize.Width() / 2.0) - (aMin.Width() / 2.0);
diff --git a/sw/source/uibase/sidebar/ThemePanel.hxx 
b/sw/source/uibase/sidebar/ThemePanel.hxx
index 5f78b48ba8be..71147f66c390 100644
--- a/sw/source/uibase/sidebar/ThemePanel.hxx
+++ b/sw/source/uibase/sidebar/ThemePanel.hxx
@@ -43,7 +43,7 @@ private:
     DECL_LINK(ClickHdl, weld::Button&, void);
     DECL_LINK(ItemActivatedHdl, weld::IconView&, bool);
     void DoubleClickHdl();
-    VclPtr<VirtualDevice> CreateImage(const model::ColorSet& rColorSet);
+    ScopedVclPtr<VirtualDevice> CreateImage(const model::ColorSet& rColorSet);
 };
 
 } // end of namespace sw::sidebar
diff --git a/vcl/inc/qt5/QtInstanceWidget.hxx b/vcl/inc/qt5/QtInstanceWidget.hxx
index 70adb55d894c..ffa949d8326c 100644
--- a/vcl/inc/qt5/QtInstanceWidget.hxx
+++ b/vcl/inc/qt5/QtInstanceWidget.hxx
@@ -147,7 +147,7 @@ public:
 
     virtual OUString escape_ui_str(const OUString& rLabel) const override;
 
-    virtual VclPtr<VirtualDevice> create_virtual_device() const override;
+    virtual ScopedVclPtr<VirtualDevice> create_virtual_device() const override;
 
     virtual css::uno::Reference<css::datatransfer::dnd::XDropTarget> 
get_drop_target() override;
 
diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx
index 04f2eabd2d24..1e3a7c810e50 100644
--- a/vcl/inc/salvtables.hxx
+++ b/vcl/inc/salvtables.hxx
@@ -387,7 +387,7 @@ public:
     virtual OUString strip_mnemonic(const OUString& rLabel) const override;
     virtual OUString escape_ui_str(const OUString& rLabel) const override;
 
-    virtual VclPtr<VirtualDevice> create_virtual_device() const override;
+    virtual ScopedVclPtr<VirtualDevice> create_virtual_device() const override;
 
     virtual css::uno::Reference<css::datatransfer::dnd::XDropTarget> 
get_drop_target() override;
     virtual css::uno::Reference<css::datatransfer::clipboard::XClipboard>
diff --git a/vcl/qt5/QtInstanceWidget.cxx b/vcl/qt5/QtInstanceWidget.cxx
index 00a101e6b0bb..0d7e9afb4143 100644
--- a/vcl/qt5/QtInstanceWidget.cxx
+++ b/vcl/qt5/QtInstanceWidget.cxx
@@ -764,9 +764,9 @@ OUString QtInstanceWidget::escape_ui_str(const OUString& 
rLabel) const
     return rLabel.replaceAll("&", "&&");
 }
 
-VclPtr<VirtualDevice> QtInstanceWidget::create_virtual_device() const
+ScopedVclPtr<VirtualDevice> QtInstanceWidget::create_virtual_device() const
 {
-    VclPtr<VirtualDevice> xRet = VclPtr<VirtualDevice>::Create();
+    ScopedVclPtr<VirtualDevice> xRet(VclPtr<VirtualDevice>::Create());
     xRet->SetBackground();
     return xRet;
 }
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index f2fd5701a180..ae6b31d986fd 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -666,7 +666,7 @@ OUString SalInstanceWidget::escape_ui_str(const OUString& 
rLabel) const
     return rLabel.replaceAll("~", "~~");
 }
 
-VclPtr<VirtualDevice> SalInstanceWidget::create_virtual_device() const
+ScopedVclPtr<VirtualDevice> SalInstanceWidget::create_virtual_device() const
 {
     // create with (annoying) separate alpha layer that LibreOffice itself uses
     return VclPtr<VirtualDevice>::Create(*Application::GetDefaultDevice(),
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 70269889a08f..c2c901ab2fb8 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -4334,10 +4334,10 @@ public:
         return rLabel.replaceAll("_", "__");
     }
 
-    virtual VclPtr<VirtualDevice> create_virtual_device() const override
+    virtual ScopedVclPtr<VirtualDevice> create_virtual_device() const override
     {
         // create with no separate alpha layer like everything sane does
-        auto xRet = VclPtr<VirtualDevice>::Create();
+        ScopedVclPtr<VirtualDevice> xRet(VclPtr<VirtualDevice>::Create());
         xRet->SetBackground();
         return xRet;
     }

Reply via email to