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

New commits:
commit 5d0b55252de85500e8be36e5c1daa754a34c83b9
Author:     Noel Grandin <[email protected]>
AuthorDate: Sun Feb 22 12:05:53 2026 +0200
Commit:     Mike Kaganski <[email protected]>
CommitDate: Fri Mar 6 06:01:44 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]>
    (cherry picked from commit 8dd92537cc839b4567e09e84ce854d14a4af5bad)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/200999
    Tested-by: Jenkins CollaboraOffice <[email protected]>

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.hxx b/include/vcl/weld.hxx
index b1182382e570..51048f5a0c3f 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -360,7 +360,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 03dc2cf498a0..ee2eae332439 100644
--- a/sc/source/ui/inc/checklistmenu.hxx
+++ b/sc/source/ui/inc/checklistmenu.hxx
@@ -382,8 +382,7 @@ public:
 
     ScViewData& GetViewData() const { return mrParentControl.GetViewData(); }
     ScCheckListMenuControl::ExtendedData* getExtendedData() { return 
mrParentControl.getExtendedData(); }
-    // [-loplugin:scopedvclptr]
-    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 b8a3ce30db2a..11b8f85345ed 100644
--- a/sc/source/ui/sidebar/CellLineStyleControl.cxx
+++ b/sc/source/ui/sidebar/CellLineStyleControl.cxx
@@ -79,7 +79,7 @@ CellLineStylePopup::~CellLineStylePopup()
 
 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/svx/inc/tbxcolorupdate.hxx b/svx/inc/tbxcolorupdate.hxx
index d14ba4bd1ec7..d7fc59787dd3 100644
--- a/svx/inc/tbxcolorupdate.hxx
+++ b/svx/inc/tbxcolorupdate.hxx
@@ -81,7 +81,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;
@@ -103,7 +103,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;
@@ -123,7 +123,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 44dfca847e6f..4bad267c93b3 100644
--- a/svx/source/tbxctrls/tbxcolorupdate.cxx
+++ b/svx/source/tbxctrls/tbxcolorupdate.cxx
@@ -193,10 +193,9 @@ void VclToolboxButtonColorUpdater::SetImage(VirtualDevice* 
pVirDev)
     mpTbx->SetItemImage(mnBtnId, Image(aGraphic.GetXGraphic()));
 }
 
-// [-loplugin:scopedvclptr]
-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,8 +350,7 @@ void ToolboxButtonColorUpdater::SetImage(VirtualDevice* 
pVirDev)
     mpTbx->set_item_image(msBtnId, pVirDev);
 }
 
-// [-loplugin:scopedvclptr]
-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 9de3bb9f4fa7..bb4a39704173 100644
--- a/sw/source/ui/frmdlg/column.cxx
+++ b/sw/source/ui/frmdlg/column.cxx
@@ -1339,7 +1339,7 @@ void SwColumnPage::SetInSection(bool bSet)
 
 ScopedVclPtr<VirtualDevice> SwColumnPage::CreateColumnLayoutVDev(sal_uInt16 
nItemId)
 {
-    VclPtr<VirtualDevice> pVDev = VclPtr<VirtualDevice>::Create();
+    ScopedVclPtr<VirtualDevice> pVDev(VclPtr<VirtualDevice>::Create());
     const Size aSize(30, 30);
     pVDev->SetOutputSizePixel(aSize);
 
diff --git a/sw/source/uibase/inc/FrameControl.hxx 
b/sw/source/uibase/inc/FrameControl.hxx
index b6a761feef6a..e9e670f1e9fe 100644
--- a/sw/source/uibase/inc/FrameControl.hxx
+++ b/sw/source/uibase/inc/FrameControl.hxx
@@ -55,7 +55,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 859745292437..739df08aaf4f 100644
--- a/sw/source/uibase/inc/HeaderFooterWin.hxx
+++ b/sw/source/uibase/inc/HeaderFooterWin.hxx
@@ -67,7 +67,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 b4d559db38a1..4a04848db9bf 100644
--- a/sw/source/uibase/inc/PageBreakWin.hxx
+++ b/sw/source/uibase/inc/PageBreakWin.hxx
@@ -60,7 +60,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/vcl/inc/qt5/QtInstanceWidget.hxx b/vcl/inc/qt5/QtInstanceWidget.hxx
index 8a77f7898be5..a1a53f18a257 100644
--- a/vcl/inc/qt5/QtInstanceWidget.hxx
+++ b/vcl/inc/qt5/QtInstanceWidget.hxx
@@ -153,7 +153,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 ded6170b5990..90f292f96d90 100644
--- a/vcl/inc/salvtables.hxx
+++ b/vcl/inc/salvtables.hxx
@@ -367,7 +367,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 c8457995f37c..8de7549d8196 100644
--- a/vcl/qt5/QtInstanceWidget.cxx
+++ b/vcl/qt5/QtInstanceWidget.cxx
@@ -755,9 +755,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 bc2eefd6f44f..f870237d2b87 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -665,8 +665,7 @@ OUString SalInstanceWidget::escape_ui_str(const OUString& 
rLabel) const
     return rLabel.replaceAll("~", "~~");
 }
 
-// [-loplugin:scopedvclptr]
-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 300ab96536e1..ec8846cd1591 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -4296,11 +4296,10 @@ public:
         return rLabel.replaceAll("_", "__");
     }
 
-    // [-loplugin:scopedvclptr]
-    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