include/vcl/scrbar.hxx                   |   40 +++++----
 include/vcl/scrollable.hxx               |   50 +++++++++++
 include/vcl/weld.hxx                     |    2 
 include/vcl/window.hxx                   |    7 -
 svtools/source/table/tabledatawindow.cxx |    1 
 sw/UIConfig_swriter.mk                   |    1 
 sw/inc/view.hxx                          |    6 -
 sw/source/uibase/inc/pview.hxx           |    6 -
 sw/source/uibase/inc/scroll.hxx          |   42 ++++++++-
 sw/source/uibase/uiview/pview.cxx        |   52 +++++++-----
 sw/source/uibase/uiview/scroll.cxx       |  131 ++++++++++++++++++++++++++-----
 sw/source/uibase/uiview/view.cxx         |    1 
 sw/source/uibase/uiview/viewmdi.cxx      |    7 -
 sw/source/uibase/uiview/viewport.cxx     |   47 +++++------
 sw/uiconfig/swriter/ui/scrollbars.ui     |   45 ++++++++++
 vcl/source/app/salvtables.cxx            |   32 +++----
 vcl/source/control/scrbar.cxx            |    5 +
 vcl/source/window/window2.cxx            |   15 +--
 vcl/unx/gtk3/gtkinst.cxx                 |   10 ++
 19 files changed, 377 insertions(+), 123 deletions(-)

New commits:
commit 6c12f6dca251ba583297090def8aa9597a818c14
Author:     Caolán McNamara <[email protected]>
AuthorDate: Tue Aug 2 16:44:44 2022 +0100
Commit:     Caolán McNamara <[email protected]>
CommitDate: Wed Aug 3 20:23:49 2022 +0200

    tdf#117388 use native scrollbar under gtk in writer
    
    with the motivation that for gtk4 theming for vcl scrollbar isn't
    available, so it looks super yuck but this should also support the
    long-press scrolling thing under gtk3 as a side effect.
    
    Change-Id: Iada5a66087d5aa982f9213d7ec0a05f6177f4e66
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/137750
    Tested-by: Caolán McNamara <[email protected]>
    Reviewed-by: Caolán McNamara <[email protected]>

diff --git a/include/vcl/scrbar.hxx b/include/vcl/scrbar.hxx
index 240a1c7e8aa9..dd8f309152b6 100644
--- a/include/vcl/scrbar.hxx
+++ b/include/vcl/scrbar.hxx
@@ -22,11 +22,13 @@
 
 #include <vcl/dllapi.h>
 #include <vcl/ctrl.hxx>
+#include <vcl/scrollable.hxx>
 #include <memory>
 
 struct ImplScrollBarData;
 
 class VCL_DLLPUBLIC ScrollBar : public Control
+                              , public Scrollable
 {
 private:
     tools::Rectangle       maBtn1Rect;
@@ -97,27 +99,29 @@ public:
     void            Scroll();
     virtual void    EndScroll();
 
-    tools::Long            DoScroll( tools::Long nNewPos );
-    tools::Long            DoScrollAction( ScrollType eScrollType );
+    tools::Long     DoScroll( tools::Long nNewPos ) override;
+    tools::Long     DoScrollAction( ScrollType eScrollType );
 
     void            EnableDrag() { mbFullDrag = true; }
 
-    void            SetRangeMin( tools::Long nNewRange );
-    tools::Long            GetRangeMin() const { return mnMinRange; }
-    void            SetRangeMax( tools::Long nNewRange );
-    tools::Long            GetRangeMax() const { return mnMaxRange; }
-    void            SetRange( const Range& rRange );
-    Range           GetRange() const { return Range( GetRangeMin(), 
GetRangeMax() ); }
-    void            SetThumbPos( tools::Long nThumbPos );
-    tools::Long            GetThumbPos() const { return mnThumbPos; }
-    void            SetLineSize( tools::Long nNewSize ) { mnLineSize = 
nNewSize; }
-    tools::Long            GetLineSize() const { return mnLineSize; }
-    void            SetPageSize( tools::Long nNewSize ) { mnPageSize = 
nNewSize; }
-    tools::Long            GetPageSize() const { return mnPageSize; }
-    void            SetVisibleSize( tools::Long nNewSize );
-    tools::Long            GetVisibleSize() const { return mnVisibleSize; }
-
-    tools::Long            GetDelta() const { return mnDelta; }
+    void            SetRangeMin( tools::Long nNewRange ) override;
+    tools::Long     GetRangeMin() const override { return mnMinRange; }
+    void            SetRangeMax( tools::Long nNewRange ) override;
+    tools::Long     GetRangeMax() const override { return mnMaxRange; }
+    void            SetRange( const Range& rRange ) override;
+    Range           GetRange() const override { return Range( GetRangeMin(), 
GetRangeMax() ); }
+    void            SetThumbPos( tools::Long nThumbPos ) override;
+    tools::Long     GetThumbPos() const override { return mnThumbPos; }
+    void            SetLineSize( tools::Long nNewSize ) override { mnLineSize 
= nNewSize; }
+    tools::Long     GetLineSize() const override { return mnLineSize; }
+    void            SetPageSize( tools::Long nNewSize ) override { mnPageSize 
= nNewSize; }
+    tools::Long     GetPageSize() const override { return mnPageSize; }
+    void            SetVisibleSize( tools::Long nNewSize ) override;
+    tools::Long     GetVisibleSize() const override { return mnVisibleSize; }
+
+    bool Inactive() const override;
+
+    tools::Long     GetDelta() const { return mnDelta; }
     ScrollType      GetType() const { return meScrollType; }
 
     void            SetScrollHdl( const Link<ScrollBar*,void>& rLink ) { 
maScrollHdl = rLink; }
diff --git a/include/vcl/scrollable.hxx b/include/vcl/scrollable.hxx
new file mode 100644
index 000000000000..7544fe9b0e15
--- /dev/null
+++ b/include/vcl/scrollable.hxx
@@ -0,0 +1,50 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ *   Licensed to the Apache Software Foundation (ASF) under one or more
+ *   contributor license agreements. See the NOTICE file distributed
+ *   with this work for additional information regarding copyright
+ *   ownership. The ASF licenses this file to you under the Apache
+ *   License, Version 2.0 (the "License"); you may not use this file
+ *   except in compliance with the License. You may obtain a copy of
+ *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#pragma once
+
+#include <tools/long.hxx>
+#include <vcl/dllapi.h>
+
+class VCL_DLLPUBLIC Scrollable
+{
+public:
+    virtual tools::Long DoScroll(tools::Long nNewPos) = 0;
+
+    virtual void SetRangeMin(tools::Long nNewRange) = 0;
+    virtual tools::Long GetRangeMin() const = 0;
+    virtual void SetRangeMax(tools::Long nNewRange) = 0;
+    virtual tools::Long GetRangeMax() const = 0;
+    virtual void SetRange(const Range& rRange) = 0;
+    virtual Range GetRange() const = 0;
+    virtual void SetThumbPos(tools::Long nThumbPos) = 0;
+    virtual tools::Long GetThumbPos() const = 0;
+    virtual void SetLineSize(tools::Long nNewSize) = 0;
+    virtual tools::Long GetLineSize() const = 0;
+    virtual void SetPageSize(tools::Long nNewSize) = 0;
+    virtual tools::Long GetPageSize() const = 0;
+    virtual void SetVisibleSize(tools::Long nNewSize) = 0;
+    virtual tools::Long GetVisibleSize() const = 0;
+
+    virtual bool Inactive() const = 0;
+
+    virtual ~Scrollable() {}
+};
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index 1c3f19ab94ae..c886ba2af075 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -2510,7 +2510,9 @@ public:
     virtual void adjustment_set_upper(int upper) = 0;
     virtual int adjustment_get_page_size() const = 0;
     virtual void adjustment_set_page_size(int size) = 0;
+    virtual int adjustment_get_page_increment() const = 0;
     virtual void adjustment_set_page_increment(int size) = 0;
+    virtual int adjustment_get_step_increment() const = 0;
     virtual void adjustment_set_step_increment(int size) = 0;
     virtual int adjustment_get_lower() const = 0;
     virtual void adjustment_set_lower(int upper) = 0;
diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx
index 51324a2c8060..2494f8852a68 100644
--- a/include/vcl/window.hxx
+++ b/include/vcl/window.hxx
@@ -43,6 +43,7 @@ struct SystemParentData;
 class ImplBorderWindow;
 class Timer;
 class DockingManager;
+class Scrollable;
 class ScrollBar;
 class FixedText;
 class MouseEvent;
@@ -687,7 +688,7 @@ private:
     SAL_DLLPRIVATE void                 
ImplCallActivateListeners(vcl::Window*);
     SAL_DLLPRIVATE void                 
ImplCallDeactivateListeners(vcl::Window*);
 
-    SAL_DLLPRIVATE static void          ImplHandleScroll(ScrollBar* pHScrl, 
double nX, ScrollBar* pVScrl, double nY);
+    SAL_DLLPRIVATE static void          ImplHandleScroll(Scrollable* pHScrl, 
double nX, Scrollable* pVScrl, double nY);
 
     SAL_DLLPRIVATE tools::Rectangle     
ImplOutputToUnmirroredAbsoluteScreenPixel( const tools::Rectangle& rRect ) 
const;
     SAL_DLLPRIVATE tools::Rectangle     
ImplUnmirroredAbsoluteScreenToOutputPixel( const tools::Rectangle& rRect ) 
const;
@@ -1086,8 +1087,8 @@ public:
     void                                EndAutoScroll();
 
     bool                                HandleScrollCommand( const 
CommandEvent& rCmd,
-                                                             ScrollBar* pHScrl,
-                                                             ScrollBar* pVScrl 
);
+                                                             Scrollable* 
pHScrl,
+                                                             Scrollable* 
pVScrl );
 
     virtual const SystemEnvData*        GetSystemData() const;
 
diff --git a/svtools/source/table/tabledatawindow.cxx 
b/svtools/source/table/tabledatawindow.cxx
index 06e6902b0444..701b9ea4321b 100644
--- a/svtools/source/table/tabledatawindow.cxx
+++ b/svtools/source/table/tabledatawindow.cxx
@@ -24,6 +24,7 @@
 #include "tablegeometry.hxx"
 
 #include <vcl/help.hxx>
+#include <vcl/scrbar.hxx>
 #include <vcl/settings.hxx>
 #include <vcl/commandevent.hxx>
 
diff --git a/sw/UIConfig_swriter.mk b/sw/UIConfig_swriter.mk
index f4e003e37243..43543e964d33 100644
--- a/sw/UIConfig_swriter.mk
+++ b/sw/UIConfig_swriter.mk
@@ -282,6 +282,7 @@ $(eval $(call gb_UIConfig_add_uifiles,modules/swriter,\
        sw/uiconfig/swriter/ui/pageheaderpanel \
        sw/uiconfig/swriter/ui/pagefooterpanel \
        sw/uiconfig/swriter/ui/poseditbox \
+       sw/uiconfig/swriter/ui/scrollbars \
        sw/uiconfig/swriter/ui/sidebarwrap \
        sw/uiconfig/swriter/ui/sidebarstylepresets \
        sw/uiconfig/swriter/ui/sidebartableedit \
diff --git a/sw/inc/view.hxx b/sw/inc/view.hxx
index 422da7fe3ea6..fe45f38f215d 100644
--- a/sw/inc/view.hxx
+++ b/sw/inc/view.hxx
@@ -72,6 +72,7 @@ enum class SelectionType : sal_Int32;
 namespace com::sun::star::view { class XSelectionSupplier; }
 namespace sfx2 { class FileDialogHelper; }
 namespace sw::mark { class IFieldmark; }
+namespace weld { class Scrollbar; }
 
 const tools::Long nLeftOfst = -370;
 const tools::Long nScrollX  =   30;
@@ -298,8 +299,9 @@ class SW_DLLPUBLIC SwView: public SfxViewShell
     SAL_DLLPRIVATE void          PhyPageDown();
 
     SAL_DLLPRIVATE void           CreateScrollbar( bool bHori );
-    DECL_DLLPRIVATE_LINK(  ScrollHdl, ScrollBar*, void );
-    DECL_DLLPRIVATE_LINK(  EndScrollHdl, ScrollBar*, void );
+    DECL_DLLPRIVATE_LINK(HoriScrollHdl, weld::Scrollbar&, void);
+    DECL_DLLPRIVATE_LINK(VertScrollHdl, weld::Scrollbar&, void);
+    SAL_DLLPRIVATE void EndScrollHdl(weld::Scrollbar& rScrollbar, bool 
bHorizontal);
     SAL_DLLPRIVATE bool          UpdateScrollbars();
     DECL_DLLPRIVATE_LINK( WindowChildEventListener, VclWindowEvent&, void );
     SAL_DLLPRIVATE void          CalcVisArea( const Size &rPixelSz );
diff --git a/sw/source/uibase/inc/pview.hxx b/sw/source/uibase/inc/pview.hxx
index 2252c8740d28..bc78b3c1e156 100644
--- a/sw/source/uibase/inc/pview.hxx
+++ b/sw/source/uibase/inc/pview.hxx
@@ -194,8 +194,10 @@ class SW_DLLPUBLIC SwPagePreview final : public 
SfxViewShell
     SAL_DLLPRIVATE Point AlignToPixel(const Point& rPt) const;
 
     SAL_DLLPRIVATE void CreateScrollbar( bool bHori);
-    DECL_DLLPRIVATE_LINK(ScrollHdl, ScrollBar*, void);
-    DECL_DLLPRIVATE_LINK(EndScrollHdl, ScrollBar*, void);
+    DECL_DLLPRIVATE_LINK(HoriScrollHdl, weld::Scrollbar&, void);
+    DECL_DLLPRIVATE_LINK(VertScrollHdl, weld::Scrollbar&, void);
+    SAL_DLLPRIVATE void ScrollHdl(weld::Scrollbar&, bool bHorizontal);
+    SAL_DLLPRIVATE void EndScrollHdl(weld::Scrollbar&, bool bHorizontal);
     SAL_DLLPRIVATE bool ChgPage( int eMvMode, bool bUpdateScrollbar = true );
 
     SAL_DLLPRIVATE virtual SfxPrinter*     GetPrinter( bool bCreate = false ) 
override;
diff --git a/sw/source/uibase/inc/scroll.hxx b/sw/source/uibase/inc/scroll.hxx
index 3fb198807998..f473d025b17b 100644
--- a/sw/source/uibase/inc/scroll.hxx
+++ b/sw/source/uibase/inc/scroll.hxx
@@ -18,15 +18,19 @@
  */
 #pragma once
 
-#include <vcl/scrbar.hxx>
+#include <vcl/InterimItemWindow.hxx>
+#include <vcl/scrollable.hxx>
 
-class SwScrollbar final : public ScrollBar
+class SwScrollbar final : public InterimItemWindow
+                        , public Scrollable
 {
     Size    m_aDocSz;
     bool    m_bHori       :1;     // horizontal = true, otherwise vertical
     bool    m_bAuto       :1;     // for scrolling mode
     bool    m_bVisible    :1;     // show/hide should only set this flag
     bool    m_bSizeSet    :1;     // was the size already set?
+    std::unique_ptr<weld::Scrollbar> m_xScrollBar;
+    Link<weld::Scrollbar&, void> m_aLink;
 
     void    AutoShow();
 
@@ -36,7 +40,7 @@ class SwScrollbar final : public ScrollBar
 public:
     void    ExtendedShow( bool bVisible = true );
     void    SetPosSizePixel( const Point& rNewPos, const Size& rNewSize ) 
override;
-    bool    IsVisible(bool bReal) const { return bReal ? 
ScrollBar::IsVisible() : m_bVisible; }
+    bool    IsVisible(bool bReal) const { return bReal ? 
InterimItemWindow::IsVisible() : m_bVisible; }
 
         // changing of document size
     void    DocSzChgd(const Size &rNewSize);
@@ -48,8 +52,38 @@ public:
     void    SetAuto(bool bSet);
     bool    IsAuto() const { return m_bAuto;}
 
+    virtual void SetRange(const Range& rRange) override;
+    virtual Range GetRange() const override;
+
+    virtual void SetRangeMin(tools::Long nNewRange) override;
+    virtual tools::Long GetRangeMin() const override;
+
+    virtual void SetRangeMax(tools::Long nNewRange) override;
+    virtual tools::Long GetRangeMax() const override;
+
+    virtual void SetLineSize(tools::Long nNewSize) override;
+    virtual tools::Long GetLineSize() const override;
+
+    virtual void SetPageSize(tools::Long nNewSize) override;
+    virtual tools::Long GetPageSize() const override;
+
+    virtual void SetVisibleSize(tools::Long nNewSize) override;
+    virtual tools::Long GetVisibleSize() const override;
+
+    virtual void SetThumbPos(tools::Long nThumbPos) override;
+    virtual tools::Long GetThumbPos() const override;
+
+    void SetScrollHdl(const Link<weld::Scrollbar&, void>& rLink);
+
+    virtual tools::Long DoScroll(tools::Long nNewPos) override;
+
+    virtual bool Inactive() const override
+    {
+        return !m_xScrollBar->get_sensitive();
+    }
+
     SwScrollbar(vcl::Window *pParent, bool bHori );
-    virtual ~SwScrollbar() override;
+    virtual void dispose() override;
 };
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/uiview/pview.cxx 
b/sw/source/uibase/uiview/pview.cxx
index ffe1e0d3a6e8..e10174c16028 100644
--- a/sw/source/uibase/uiview/pview.cxx
+++ b/sw/source/uibase/uiview/pview.cxx
@@ -22,6 +22,7 @@
 #include <sfx2/objface.hxx>
 #include <vcl/help.hxx>
 #include <vcl/commandevent.hxx>
+#include <vcl/scrbar.hxx>
 #include <vcl/settings.hxx>
 #include <vcl/svapp.hxx>
 #include <vcl/syswin.hxx>
@@ -1240,14 +1241,14 @@ void SwPagePreview::CreateScrollbar( bool bHori )
     VclPtr<SwScrollbar>& ppScrollbar = bHori ? m_pHScrollbar : m_pVScrollbar;
 
     assert(!ppScrollbar); //check beforehand!
-
     ppScrollbar = VclPtr<SwScrollbar>::Create( pMDI, bHori );
 
     ScrollDocSzChg();
-    ppScrollbar->EnableDrag();
-    ppScrollbar->SetEndScrollHdl( LINK( this, SwPagePreview, EndScrollHdl ));
 
-    ppScrollbar->SetScrollHdl( LINK( this, SwPagePreview, ScrollHdl ));
+    if (bHori)
+        ppScrollbar->SetScrollHdl( LINK( this, SwPagePreview, HoriScrollHdl ));
+    else
+        ppScrollbar->SetScrollHdl( LINK( this, SwPagePreview, VertScrollHdl ));
 
     InvalidateBorder();
     ppScrollbar->ExtendedShow();
@@ -1386,56 +1387,65 @@ void SwPagePreview::SetVisArea( const tools::Rectangle 
&rRect )
     m_pViewWin->Invalidate();
 }
 
-IMPL_LINK( SwPagePreview, ScrollHdl, ScrollBar *, p, void )
+IMPL_LINK(SwPagePreview, HoriScrollHdl, weld::Scrollbar&, rScrollbar, void)
+{
+    ScrollHdl(rScrollbar, true);
+}
+
+IMPL_LINK(SwPagePreview, VertScrollHdl, weld::Scrollbar&, rScrollbar, void)
+{
+    ScrollHdl(rScrollbar, false);
+}
+
+void SwPagePreview::ScrollHdl(weld::Scrollbar& rScrollbar, bool bHori)
 {
-    SwScrollbar* pScrollbar = static_cast<SwScrollbar*>(p);
     if(!GetViewShell())
         return;
-    if( !pScrollbar->IsHoriScroll() &&
-        pScrollbar->GetType() == ScrollType::Drag &&
+
+    if( !bHori &&
+        rScrollbar.get_scroll_type() == ScrollType::Drag &&
         Help::IsQuickHelpEnabled() &&
         
GetViewShell()->PagePreviewLayout()->DoesPreviewLayoutRowsFitIntoWindow())
     {
         // Scroll how many pages??
         OUString sStateStr(m_sPageStr);
-        tools::Long nThmbPos = pScrollbar->GetThumbPos();
+        tools::Long nThmbPos = rScrollbar.adjustment_get_value();
         if( 1 == m_pViewWin->GetCol() || !nThmbPos )
             ++nThmbPos;
         sStateStr += OUString::number( nThmbPos );
-        Point aPos = pScrollbar->GetParent()->OutputToScreenPixel(
-                                        pScrollbar->GetPosPixel());
-        aPos.setY( 
pScrollbar->OutputToScreenPixel(pScrollbar->GetPointerPosPixel()).Y() );
+        Point aPos = m_pVScrollbar->GetParent()->OutputToScreenPixel(
+                                        m_pVScrollbar->GetPosPixel());
+        aPos.setY( 
m_pVScrollbar->OutputToScreenPixel(m_pVScrollbar->GetPointerPosPixel()).Y() );
         tools::Rectangle aRect;
         aRect.SetLeft( aPos.X() -8 );
         aRect.SetRight( aRect.Left() );
         aRect.SetTop( aPos.Y() );
         aRect.SetBottom( aRect.Top() );
 
-        Help::ShowQuickHelp(pScrollbar, aRect, sStateStr,
+        Help::ShowQuickHelp(m_pVScrollbar, aRect, sStateStr,
                 QuickHelpFlags::Right|QuickHelpFlags::VCenter);
 
     }
     else
-        EndScrollHdl( pScrollbar );
+        EndScrollHdl(rScrollbar, bHori);
 }
 
-IMPL_LINK( SwPagePreview, EndScrollHdl, ScrollBar *, p, void )
+void SwPagePreview::EndScrollHdl(weld::Scrollbar& rScrollbar, bool bHori)
 {
-    SwScrollbar* pScrollbar = static_cast<SwScrollbar*>(p);
     if(!GetViewShell())
         return;
 
     // boolean to avoid unnecessary invalidation of the window.
     bool bInvalidateWin = true;
 
-    if( !pScrollbar->IsHoriScroll() )       // scroll vertically
+    if (!bHori)       // scroll vertically
     {
         if ( Help::IsQuickHelpEnabled() )
-            Help::ShowQuickHelp(pScrollbar, tools::Rectangle(), OUString());
+            Help::ShowQuickHelp(m_pVScrollbar, tools::Rectangle(), OUString());
         if ( 
GetViewShell()->PagePreviewLayout()->DoesPreviewLayoutRowsFitIntoWindow() )
         {
             // Scroll how many pages ??
-            const sal_uInt16 nThmbPos = 
o3tl::narrowing<sal_uInt16>(pScrollbar->GetThumbPos());
+            const sal_uInt16 nThmbPos = 
o3tl::narrowing<sal_uInt16>(rScrollbar.adjustment_get_value());
             // adjust to new preview functionality
             if( nThmbPos != m_pViewWin->SelectedPage() )
             {
@@ -1486,13 +1496,13 @@ IMPL_LINK( SwPagePreview, EndScrollHdl, ScrollBar *, p, 
void )
         }
         else
         {
-            tools::Long nThmbPos = pScrollbar->GetThumbPos();
+            tools::Long nThmbPos = rScrollbar.adjustment_get_value();
             m_pViewWin->Scroll(0, nThmbPos - 
m_pViewWin->GetPaintedPreviewDocRect().Top());
         }
     }
     else
     {
-        tools::Long nThmbPos = pScrollbar->GetThumbPos();
+        tools::Long nThmbPos = rScrollbar.adjustment_get_value();
         m_pViewWin->Scroll(nThmbPos - 
m_pViewWin->GetPaintedPreviewDocRect().Left(), 0);
     }
     // additional invalidate page status.
diff --git a/sw/source/uibase/uiview/scroll.cxx 
b/sw/source/uibase/uiview/scroll.cxx
index a277a5972276..39c714cf9c62 100644
--- a/sw/source/uibase/uiview/scroll.cxx
+++ b/sw/source/uibase/uiview/scroll.cxx
@@ -21,24 +21,29 @@
 
 #define SCROLL_LINE_SIZE 250
 
-SwScrollbar::SwScrollbar( vcl::Window *pWin, bool bHoriz ) :
-    ScrollBar( pWin,
-    WinBits( WB_3DLOOK | WB_HIDE | ( bHoriz ? WB_HSCROLL : WB_VSCROLL)  ) ),
-    m_bHori( bHoriz ),
-    m_bAuto( false ),
-    m_bVisible(false),
-    m_bSizeSet(false)
+SwScrollbar::SwScrollbar(vcl::Window *pWin, bool bHoriz)
+    : InterimItemWindow(pWin, "modules/swriter/ui/scrollbars.ui", "ScrollBars")
+    , m_bHori(bHoriz)
+    , m_bAuto(false)
+    , m_bVisible(false)
+    , m_bSizeSet(false)
+    , m_xScrollBar(m_xBuilder->weld_scrollbar(bHoriz ? "horizontal" : 
"vertical"))
 {
+    m_xScrollBar->show();
+
     // No mirroring for horizontal scrollbars
-    if( bHoriz )
-        EnableRTL( false );
+    if (bHoriz)
+        m_xScrollBar->set_direction(false);
 }
 
- SwScrollbar::~SwScrollbar() {}
+void SwScrollbar::dispose()
+{
+    m_xScrollBar.reset();
+    InterimItemWindow::dispose();
+}
 
 // Will be called after a change of the document size
 // to refresh the range of the scrollbars.
-
 void SwScrollbar::DocSzChgd( const Size &rSize )
 {
     m_aDocSz = rSize;
@@ -49,7 +54,6 @@ void SwScrollbar::DocSzChgd( const Size &rSize )
 }
 
 // Will be called after a change of the visible view section.
-
 void SwScrollbar::ViewPortChgd( const tools::Rectangle &rRect )
 {
     tools::Long nThumb, nVisible;
@@ -75,16 +79,17 @@ void SwScrollbar::ExtendedShow( bool bSet )
 {
     m_bVisible = bSet;
     if( (!bSet ||  !m_bAuto) && IsUpdateMode() && m_bSizeSet)
-        ScrollBar::Show(bSet);
+    {
+        InterimItemWindow::Show(bSet);
+    }
 }
 
 void SwScrollbar::SetPosSizePixel( const Point& rNewPos, const Size& rNewSize )
 {
-    ScrollBar::SetPosSizePixel(rNewPos, rNewSize);
+    InterimItemWindow::SetPosSizePixel(rNewPos, rNewSize);
     m_bSizeSet = true;
     if(m_bVisible)
         ExtendedShow();
-
 }
 
 void SwScrollbar::SetAuto(bool bSet)
@@ -94,7 +99,7 @@ void SwScrollbar::SetAuto(bool bSet)
         m_bAuto = bSet;
 
         // hide automatically - then show
-        if(!m_bAuto && m_bVisible && !ScrollBar::IsVisible())
+        if(!m_bAuto && m_bVisible && !InterimItemWindow::IsVisible())
             ExtendedShow();
         else if(m_bAuto)
             AutoShow(); // or hide automatically
@@ -107,13 +112,99 @@ void SwScrollbar::AutoShow()
     tools::Long nLen = GetRange().Len();
     if( nVis >= nLen - 1)
     {
-        if(ScrollBar::IsVisible())
-            ScrollBar::Show(false);
+        if(InterimItemWindow::IsVisible())
+            InterimItemWindow::Show(false);
     }
-    else if ( !ScrollBar::IsVisible() )
+    else if ( !InterimItemWindow::IsVisible() )
     {
-        ScrollBar::Show();
+        InterimItemWindow::Show();
     }
 }
 
+void SwScrollbar::SetRange(const Range& rRange)
+{
+    m_xScrollBar->adjustment_set_lower(rRange.Min());
+    m_xScrollBar->adjustment_set_upper(rRange.Max());
+}
+
+Range SwScrollbar::GetRange() const
+{
+    return Range(m_xScrollBar->adjustment_get_lower(),
+                 m_xScrollBar->adjustment_get_upper());
+}
+
+void SwScrollbar::SetRangeMin(tools::Long nNewRange)
+{
+    m_xScrollBar->adjustment_set_lower(nNewRange);
+}
+
+tools::Long SwScrollbar::GetRangeMin() const
+{
+    return m_xScrollBar->adjustment_get_lower();
+}
+
+void SwScrollbar::SetRangeMax(tools::Long nNewRange)
+{
+    m_xScrollBar->adjustment_set_upper(nNewRange);
+}
+
+tools::Long SwScrollbar::GetRangeMax() const
+{
+    return m_xScrollBar->adjustment_get_upper();
+}
+
+void SwScrollbar::SetLineSize(tools::Long nNewSize)
+{
+    m_xScrollBar->adjustment_set_step_increment(nNewSize);
+}
+
+tools::Long SwScrollbar::GetLineSize() const
+{
+    return m_xScrollBar->adjustment_get_step_increment();
+}
+
+void SwScrollbar::SetPageSize(tools::Long nNewSize)
+{
+    m_xScrollBar->adjustment_set_page_increment(nNewSize);
+}
+
+tools::Long SwScrollbar::GetPageSize() const
+{
+    return m_xScrollBar->adjustment_get_page_increment();
+}
+
+void SwScrollbar::SetVisibleSize(tools::Long nNewSize)
+{
+    m_xScrollBar->adjustment_set_page_size(nNewSize);
+}
+
+tools::Long SwScrollbar::GetVisibleSize() const
+{
+    return m_xScrollBar->adjustment_get_page_size();
+}
+
+void SwScrollbar::SetThumbPos(tools::Long nThumbPos)
+{
+    m_xScrollBar->adjustment_set_value(nThumbPos);
+}
+
+tools::Long SwScrollbar::GetThumbPos() const
+{
+    return m_xScrollBar->adjustment_get_value();
+}
+
+void SwScrollbar::SetScrollHdl(const Link<weld::Scrollbar&, void>& rLink)
+{
+    m_aLink = rLink;
+    m_xScrollBar->connect_adjustment_changed(rLink);
+}
+
+tools::Long SwScrollbar::DoScroll(tools::Long nNewPos)
+{
+    const auto nOrig = m_xScrollBar->adjustment_get_value();
+    m_xScrollBar->adjustment_set_value(nNewPos);
+    m_aLink.Call(*m_xScrollBar);
+    return m_xScrollBar->adjustment_get_value() - nOrig;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/uibase/uiview/view.cxx b/sw/source/uibase/uiview/view.cxx
index 0e83cf683692..0fe4fc8d970e 100644
--- a/sw/source/uibase/uiview/view.cxx
+++ b/sw/source/uibase/uiview/view.cxx
@@ -32,6 +32,7 @@
 #include <officecfg/Office/Common.hxx>
 #include <vcl/graph.hxx>
 #include <vcl/inputctx.hxx>
+#include <vcl/scrbar.hxx>
 #include <svl/eitem.hxx>
 #include <unotools/configmgr.hxx>
 #include <unotools/lingucfg.hxx>
diff --git a/sw/source/uibase/uiview/viewmdi.cxx 
b/sw/source/uibase/uiview/viewmdi.cxx
index fee7f5ce5d91..b7c1810a2dd1 100644
--- a/sw/source/uibase/uiview/viewmdi.cxx
+++ b/sw/source/uibase/uiview/viewmdi.cxx
@@ -307,12 +307,9 @@ void SwView::CreateScrollbar( bool bHori )
     ppScrollbar = VclPtr<SwScrollbar>::Create( pMDI, bHori );
     UpdateScrollbars();
     if(bHori)
-        ppScrollbar->SetScrollHdl( LINK( this, SwView, EndScrollHdl ));
+        ppScrollbar->SetScrollHdl( LINK( this, SwView, HoriScrollHdl ));
     else
-        ppScrollbar->SetScrollHdl( LINK( this, SwView, ScrollHdl ));
-    ppScrollbar->SetEndScrollHdl( LINK( this, SwView, EndScrollHdl ));
-
-    ppScrollbar->EnableDrag();
+        ppScrollbar->SetScrollHdl( LINK( this, SwView, VertScrollHdl ));
 
     if(GetWindow())
         InvalidateBorder();
diff --git a/sw/source/uibase/uiview/viewport.cxx 
b/sw/source/uibase/uiview/viewport.cxx
index f249638bf7f3..ed3adf84b45c 100644
--- a/sw/source/uibase/uiview/viewport.cxx
+++ b/sw/source/uibase/uiview/viewport.cxx
@@ -74,16 +74,16 @@ static tools::Long GetLeftMargin( SwView const &rView )
 
 static void lcl_GetPos(SwView const * pView,
                 Point& rPos,
-                SwScrollbar const * pScrollbar,
+                const weld::Scrollbar& rScrollbar,
+                bool bHori,
                 bool bBorder)
 {
     SwWrtShell &rSh = pView->GetWrtShell();
     const Size aDocSz( rSh.GetDocSize() );
 
     const tools::Long lBorder = bBorder ? DOCUMENTBORDER : DOCUMENTBORDER * 2;
-    const bool bHori = pScrollbar->IsHoriScroll();
 
-    const tools::Long lPos = pScrollbar->GetThumbPos() + (bBorder ? 
DOCUMENTBORDER : 0);
+    const tools::Long lPos = rScrollbar.adjustment_get_value() + (bBorder ? 
DOCUMENTBORDER : 0);
 
     tools::Long lDelta = lPos - (bHori ? rSh.VisArea().Pos().X() : 
rSh.VisArea().Pos().Y());
 
@@ -669,30 +669,28 @@ bool SwView::PageDownCursor(bool bSelect)
 }
 
 // Handler of the scrollbars
-
-IMPL_LINK( SwView, ScrollHdl, ScrollBar *, p, void )
+IMPL_LINK(SwView, VertScrollHdl, weld::Scrollbar&, rScrollbar, void)
 {
-    SwScrollbar* pScrollbar = static_cast<SwScrollbar*>(p);
     if ( GetWrtShell().ActionPend() )
         return;
 
-    if ( pScrollbar->GetType() == ScrollType::Drag )
+    if (rScrollbar.get_scroll_type() == ScrollType::Drag)
         m_pWrtShell->EnableSmooth( false );
 
-    if(!m_pWrtShell->GetViewOptions()->getBrowseMode() &&
-        pScrollbar->GetType() == ScrollType::Drag)
+    if (!m_pWrtShell->GetViewOptions()->getBrowseMode() &&
+        rScrollbar.get_scroll_type() == ScrollType::Drag)
     {
         // Here comment out again if it is not desired to scroll together:
         // The end scrollhandler invalidate the FN_STAT_PAGE,
         // so we don't must do it again.
-        EndScrollHdl(pScrollbar);
+        EndScrollHdl(rScrollbar, false);
 
         if ( !m_bWheelScrollInProgress && Help::IsQuickHelpEnabled() &&
              m_pWrtShell->GetViewOptions()->IsShowScrollBarTips())
         {
 
             Point aPos( m_aVisArea.TopLeft() );
-            lcl_GetPos(this, aPos, pScrollbar, IsDocumentBorder());
+            lcl_GetPos(this, aPos, rScrollbar, false, IsDocumentBorder());
 
             sal_uInt16 nPhNum = 1;
             sal_uInt16 nVirtNum = 1;
@@ -711,10 +709,10 @@ IMPL_LINK( SwView, ScrollHdl, ScrollBar *, p, void )
                     if( !nPgNum || nPgNum != nPhNum )
                     {
                         tools::Rectangle aRect;
-                        aRect.SetLeft( 
pScrollbar->GetParent()->OutputToScreenPixel(
-                                            pScrollbar->GetPosPixel() ).X() -8 
);
-                        aRect.SetTop( pScrollbar->OutputToScreenPixel(
-                                        pScrollbar->GetPointerPosPixel() ).Y() 
);
+                        aRect.SetLeft( 
m_pVScrollbar->GetParent()->OutputToScreenPixel(
+                                            m_pVScrollbar->GetPosPixel() ).X() 
-8 );
+                        aRect.SetTop( m_pVScrollbar->OutputToScreenPixel(
+                                        m_pVScrollbar->GetPointerPosPixel() 
).Y() );
                         aRect.SetRight( aRect.Left() );
                         aRect.SetBottom( aRect.Top() );
 
@@ -731,7 +729,7 @@ IMPL_LINK( SwView, ScrollHdl, ScrollBar *, p, void )
                             sPageStr = sPageStr.replace(0x0a, ' ');
                         }
 
-                        Help::ShowQuickHelp( pScrollbar, aRect, sPageStr,
+                        Help::ShowQuickHelp(m_pVScrollbar, aRect, sPageStr,
                                         
QuickHelpFlags::Right|QuickHelpFlags::VCenter);
                     }
                     nPgNum = nPhNum;
@@ -740,28 +738,26 @@ IMPL_LINK( SwView, ScrollHdl, ScrollBar *, p, void )
         }
     }
     else
-        EndScrollHdl(pScrollbar);
+        EndScrollHdl(rScrollbar, false);
 
-    if ( pScrollbar->GetType() == ScrollType::Drag )
+    if (rScrollbar.get_scroll_type() == ScrollType::Drag)
         m_pWrtShell->EnableSmooth( true );
 }
 
 // Handler of the scrollbars
-
-IMPL_LINK( SwView, EndScrollHdl, ScrollBar *, p, void )
+void SwView::EndScrollHdl(weld::Scrollbar& rScrollbar, bool bHorizontal)
 {
-    SwScrollbar* pScrollbar = static_cast<SwScrollbar*>(p);
     if ( GetWrtShell().ActionPend() )
         return;
 
     if(nPgNum)
     {
         nPgNum = 0;
-        Help::ShowQuickHelp(pScrollbar, tools::Rectangle(), OUString());
+        Help::ShowQuickHelp(bHorizontal ? m_pHScrollbar : m_pVScrollbar, 
tools::Rectangle(), OUString());
     }
     Point aPos( m_aVisArea.TopLeft() );
     bool bBorder = IsDocumentBorder();
-    lcl_GetPos(this, aPos, pScrollbar, bBorder);
+    lcl_GetPos(this, aPos, rScrollbar, bHorizontal, bBorder);
     if ( bBorder && aPos == m_aVisArea.TopLeft() )
         UpdateScrollbars();
     else
@@ -770,6 +766,11 @@ IMPL_LINK( SwView, EndScrollHdl, ScrollBar *, p, void )
     GetViewFrame()->GetBindings().Update(FN_STAT_PAGE);
 }
 
+IMPL_LINK(SwView, HoriScrollHdl, weld::Scrollbar&, rScrollBar, void)
+{
+    EndScrollHdl(rScrollBar, true);
+}
+
 // Calculates the size of the m_aVisArea in dependency of the size of
 // EditWin on the screen.
 
diff --git a/sw/uiconfig/swriter/ui/scrollbars.ui 
b/sw/uiconfig/swriter/ui/scrollbars.ui
new file mode 100644
index 000000000000..c448d3ff187f
--- /dev/null
+++ b/sw/uiconfig/swriter/ui/scrollbars.ui
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.38.2 -->
+<interface domain="sw">
+  <requires lib="gtk+" version="3.20"/>
+  <object class="GtkAdjustment" id="adjustment1">
+    <property name="upper">100</property>
+    <property name="step-increment">1</property>
+    <property name="page-increment">10</property>
+  </object>
+  <object class="GtkAdjustment" id="adjustment2">
+    <property name="upper">100</property>
+    <property name="step-increment">1</property>
+    <property name="page-increment">10</property>
+  </object>
+  <object class="GtkBox" id="ScrollBars">
+    <property name="visible">True</property>
+    <property name="can-focus">False</property>
+    <property name="hexpand">True</property>
+    <property name="vexpand">True</property>
+    <property name="orientation">vertical</property>
+    <child>
+      <object class="GtkScrollbar" id="vertical">
+        <property name="can-focus">False</property>
+        <property name="orientation">vertical</property>
+        <property name="adjustment">adjustment1</property>
+      </object>
+      <packing>
+        <property name="expand">True</property>
+        <property name="fill">True</property>
+        <property name="position">0</property>
+      </packing>
+    </child>
+    <child>
+      <object class="GtkScrollbar" id="horizontal">
+        <property name="can-focus">False</property>
+        <property name="adjustment">adjustment2</property>
+      </object>
+      <packing>
+        <property name="expand">True</property>
+        <property name="fill">True</property>
+        <property name="position">1</property>
+      </packing>
+    </child>
+  </object>
+</interface>
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 3f35337339cd..1cc12d47a12c 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -2494,7 +2494,6 @@ class SalInstanceScrollbar : public SalInstanceWidget, 
public virtual weld::Scro
 {
 private:
     VclPtr<ScrollBar> m_xScrollBar;
-    Link<ScrollBar*, void> m_aOrigScrollHdl;
 
     DECL_LINK(ScrollHdl, ScrollBar*, void);
 
@@ -2503,8 +2502,8 @@ public:
         : SalInstanceWidget(pScrollbar, pBuilder, bTakeOwnership)
         , m_xScrollBar(pScrollbar)
     {
-        m_aOrigScrollHdl = m_xScrollBar->GetScrollHdl();
         m_xScrollBar->SetScrollHdl(LINK(this, SalInstanceScrollbar, 
ScrollHdl));
+        m_xScrollBar->EnableDrag();
     }
 
     virtual void adjustment_configure(int value, int lower, int upper, int 
step_increment,
@@ -2520,11 +2519,7 @@ public:
 
     virtual int adjustment_get_value() const override { return 
m_xScrollBar->GetThumbPos(); }
 
-    virtual void adjustment_set_value(int value) override
-    {
-        m_xScrollBar->SetThumbPos(value);
-        m_aOrigScrollHdl.Call(m_xScrollBar.get());
-    }
+    virtual void adjustment_set_value(int value) override { 
m_xScrollBar->SetThumbPos(value); }
 
     virtual int adjustment_get_upper() const override { return 
m_xScrollBar->GetRangeMax(); }
 
@@ -2536,32 +2531,33 @@ public:
 
     virtual int adjustment_get_page_size() const override { return 
m_xScrollBar->GetVisibleSize(); }
 
-    virtual void adjustment_set_page_size(int size) override
+    virtual void adjustment_set_page_size(int size) override { 
m_xScrollBar->SetVisibleSize(size); }
+
+    virtual int adjustment_get_page_increment() const override
     {
-        return m_xScrollBar->SetVisibleSize(size);
+        return m_xScrollBar->GetPageSize();
     }
 
     virtual void adjustment_set_page_increment(int size) override
     {
-        return m_xScrollBar->SetPageSize(size);
+        m_xScrollBar->SetPageSize(size);
+    }
+
+    virtual int adjustment_get_step_increment() const override
+    {
+        return m_xScrollBar->GetLineSize();
     }
 
     virtual void adjustment_set_step_increment(int size) override
     {
-        return m_xScrollBar->SetLineSize(size);
+        m_xScrollBar->SetLineSize(size);
     }
 
     virtual ScrollType get_scroll_type() const override { return 
m_xScrollBar->GetType(); }
-
-    virtual ~SalInstanceScrollbar() override { 
m_xScrollBar->SetScrollHdl(m_aOrigScrollHdl); }
 };
 }
 
-IMPL_LINK_NOARG(SalInstanceScrollbar, ScrollHdl, ScrollBar*, void)
-{
-    signal_adjustment_changed();
-    m_aOrigScrollHdl.Call(m_xScrollBar.get());
-}
+IMPL_LINK_NOARG(SalInstanceScrollbar, ScrollHdl, ScrollBar*, void) { 
signal_adjustment_changed(); }
 
 SalInstanceNotebook::SalInstanceNotebook(TabControl* pNotebook, 
SalInstanceBuilder* pBuilder,
                                          bool bTakeOwnership)
diff --git a/vcl/source/control/scrbar.cxx b/vcl/source/control/scrbar.cxx
index 79fb1d4c11df..2994fa0e9b61 100644
--- a/vcl/source/control/scrbar.cxx
+++ b/vcl/source/control/scrbar.cxx
@@ -1419,6 +1419,11 @@ Size ScrollBar::getCurrentCalcSize() const
     return aCtrlRegion.GetSize();
 }
 
+bool ScrollBar::Inactive() const
+{
+    return !IsEnabled() || !IsInputEnabled() || IsInModalMode();
+}
+
 void ScrollBarBox::ImplInit(vcl::Window* pParent, WinBits nStyle)
 {
     Window::ImplInit( pParent, nStyle, nullptr );
diff --git a/vcl/source/window/window2.cxx b/vcl/source/window/window2.cxx
index c20dc471120b..6c99b8113a34 100644
--- a/vcl/source/window/window2.cxx
+++ b/vcl/source/window/window2.cxx
@@ -30,6 +30,7 @@
 #include <vcl/layout.hxx>
 #include <vcl/timer.hxx>
 #include <vcl/window.hxx>
+#include <vcl/scrollable.hxx>
 #include <vcl/scrbar.hxx>
 #include <vcl/dockwin.hxx>
 #include <vcl/settings.hxx>
@@ -597,9 +598,9 @@ tools::Long Window::GetDrawPixel( OutputDevice const * 
pDev, tools::Long nPixels
     return nP;
 }
 
-static void lcl_HandleScrollHelper( ScrollBar* pScrl, double nN, bool 
isMultiplyByLineSize )
+static void lcl_HandleScrollHelper( Scrollable* pScrl, double nN, bool 
isMultiplyByLineSize )
 {
-    if ( !pScrl || !nN || !pScrl->IsEnabled() || !pScrl->IsInputEnabled() || 
pScrl->IsInModalMode() )
+    if (!pScrl || !nN || pScrl->Inactive())
         return;
 
     tools::Long nNewPos = pScrl->GetThumbPos();
@@ -625,7 +626,7 @@ static void lcl_HandleScrollHelper( ScrollBar* pScrl, 
double nN, bool isMultiply
 }
 
 bool Window::HandleScrollCommand( const CommandEvent& rCmd,
-                                  ScrollBar* pHScrl, ScrollBar* pVScrl )
+                                  Scrollable* pHScrl, Scrollable* pVScrl )
 {
     bool bRet = false;
 
@@ -639,13 +640,13 @@ bool Window::HandleScrollCommand( const CommandEvent& 
rCmd,
                 if ( pHScrl )
                 {
                     if ( (pHScrl->GetVisibleSize() < pHScrl->GetRangeMax()) &&
-                         pHScrl->IsEnabled() && pHScrl->IsInputEnabled() && ! 
pHScrl->IsInModalMode() )
+                         !pHScrl->Inactive() )
                         nFlags |= StartAutoScrollFlags::Horz;
                 }
                 if ( pVScrl )
                 {
                     if ( (pVScrl->GetVisibleSize() < pVScrl->GetRangeMax()) &&
-                         pVScrl->IsEnabled() && pVScrl->IsInputEnabled() && ! 
pVScrl->IsInModalMode() )
+                         !pVScrl->Inactive() )
                         nFlags |= StartAutoScrollFlags::Vert;
                 }
 
@@ -811,8 +812,8 @@ bool Window::HandleScrollCommand( const CommandEvent& rCmd,
 // horizontal or vertical scroll bar. nY is correspondingly either
 // the horizontal or vertical scroll amount.
 
-void Window::ImplHandleScroll( ScrollBar* pHScrl, double nX,
-                               ScrollBar* pVScrl, double nY )
+void Window::ImplHandleScroll( Scrollable* pHScrl, double nX,
+                               Scrollable* pVScrl, double nY )
 {
     lcl_HandleScrollHelper( pHScrl, nX, true );
     lcl_HandleScrollHelper( pVScrl, nY, true );
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx
index 57e76f4f2eed..8778a6ba9e8e 100644
--- a/vcl/unx/gtk3/gtkinst.cxx
+++ b/vcl/unx/gtk3/gtkinst.cxx
@@ -8488,11 +8488,21 @@ public:
         gtk_adjustment_set_page_size(m_pAdjustment, size);
     }
 
+    virtual int adjustment_get_page_increment() const override
+    {
+        return gtk_adjustment_get_page_increment(m_pAdjustment);
+    }
+
     virtual void adjustment_set_page_increment(int size) override
     {
         gtk_adjustment_set_page_increment(m_pAdjustment, size);
     }
 
+    virtual int adjustment_get_step_increment() const override
+    {
+        return gtk_adjustment_get_step_increment(m_pAdjustment);
+    }
+
     virtual void adjustment_set_step_increment(int size) override
     {
         gtk_adjustment_set_step_increment(m_pAdjustment, size);

Reply via email to