Resolves: tdf#137620 add DeleteSurroundingText at vcl::Window level

a) give it a default implementation based on the current one
b) re-use code introduced for WeldEditView::DeleteSurroundingText
   for the EditView containing vcl::Window in impress/draw and
   various similar Annotation windows

Change-Id: I55547c70e90ee394795b5545450cf8131538fad8
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/104781
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/editeng/source/editeng/editview.cxx b/editeng/source/editeng/editview.cxx
index 94012cf..3133126b 100644
--- a/editeng/source/editeng/editview.cxx
+++ b/editeng/source/editeng/editview.cxx
@@ -1549,6 +1549,17 @@ Selection EditView::GetSurroundingTextSelection() const
    }
}

bool EditView::DeleteSurroundingText(const Selection& rRange)
{
    ESelection aSel(GetSelection());
    aSel.nEndPara = aSel.nStartPara;
    aSel.nStartPos = rRange.Min();
    aSel.nEndPos = rRange.Max();
    SetSelection(aSel);
    DeleteSelected();
    return true;
}

void EditView::SetCursorLogicPosition(const Point& rPosition, bool bPoint, bool bClearMark)
{
    Point aDocPos(pImpEditView->GetDocPos(rPosition));
diff --git a/editeng/source/outliner/outlvw.cxx b/editeng/source/outliner/outlvw.cxx
index 5255597..aff9992 100644
--- a/editeng/source/outliner/outlvw.cxx
+++ b/editeng/source/outliner/outlvw.cxx
@@ -1409,8 +1409,12 @@ Selection OutlinerView::GetSurroundingTextSelection() const
    return pEditView->GetSurroundingTextSelection();
}

// ===== some code for thesaurus sub menu within context menu
bool OutlinerView::DeleteSurroundingText(const Selection& rSelection)
{
    return pEditView->DeleteSurroundingText(rSelection);
}

// ===== some code for thesaurus sub menu within context menu

namespace {

diff --git a/include/editeng/editview.hxx b/include/editeng/editview.hxx
index f75b5ca..e89cd35 100644
--- a/include/editeng/editview.hxx
+++ b/include/editeng/editview.hxx
@@ -309,6 +309,7 @@ public:

    OUString        GetSurroundingText() const;
    Selection       GetSurroundingTextSelection() const;
    bool            DeleteSurroundingText(const Selection& rRange);

    /** Tries to determine the language of 'rText', returning a matching known
        locale if possible, or a fallback, or LANGUAGE_NONE if nothing found or
diff --git a/include/editeng/outliner.hxx b/include/editeng/outliner.hxx
index 3ea2fd9..f06bd9a 100644
--- a/include/editeng/outliner.hxx
+++ b/include/editeng/outliner.hxx
@@ -354,6 +354,7 @@ public:

    OUString    GetSurroundingText() const;
    Selection   GetSurroundingTextSelection() const;
    bool        DeleteSurroundingText(const Selection& rRange);

    void        SetEndCutPasteLinkHdl(const Link<LinkParamNone*,void> &rLink) { aEndCutPasteLink = rLink; }
};
diff --git a/include/vcl/layout.hxx b/include/vcl/layout.hxx
index 60a7f44..d67ab24 100644
--- a/include/vcl/layout.hxx
+++ b/include/vcl/layout.hxx
@@ -648,6 +648,7 @@ private:
    Link<const CommandEvent&, bool> m_aCommandHdl;
    Link<tools::Rectangle&, OUString> m_aQueryTooltipHdl;
    Link<OUString&, int> m_aGetSurroundingHdl;
    Link<const Selection&, bool> m_aDeleteSurroundingHdl;
    Link<VclDrawingArea*, bool> m_aStartDragHdl;

    virtual void Paint(vcl::RenderContext& rRenderContext, const tools::Rectangle& rRect) override
@@ -748,6 +749,7 @@ public:
    }
    virtual OUString GetSurroundingText() const override;
    virtual Selection GetSurroundingTextSelection() const override;
    virtual bool DeleteSurroundingText(const Selection& rSelection) override;
    void SetUITestFactory(FactoryFunction pFactoryFunction, void* pUserData)
    {
        m_pFactoryFunction = pFactoryFunction;
@@ -801,6 +803,10 @@ public:
    {
        m_aGetSurroundingHdl = rLink;
    }
    void SetDeleteSurroundingHdl(const Link<const Selection&, bool>& rLink)
    {
        m_aDeleteSurroundingHdl = rLink;
    }
    void SetStartDragHdl(const Link<VclDrawingArea*, bool>& rLink)
    {
        m_aStartDragHdl = rLink;
diff --git a/include/vcl/toolkit/edit.hxx b/include/vcl/toolkit/edit.hxx
index 99631d3..655171a 100644
--- a/include/vcl/toolkit/edit.hxx
+++ b/include/vcl/toolkit/edit.hxx
@@ -232,6 +232,7 @@ public:

    virtual OUString GetSurroundingText() const override;
    virtual Selection GetSurroundingTextSelection() const override;
    virtual bool DeleteSurroundingText(const Selection& rSelection) override;
    virtual bool set_property(const OString &rKey, const OUString &rValue) override;

    void SetTextFilter(TextFilter* pFilter) { mpFilterText = pFilter; }
diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx
index 48b7f11..0a378a1 100644
--- a/include/vcl/window.hxx
+++ b/include/vcl/window.hxx
@@ -1534,6 +1534,7 @@ public:

    virtual OUString GetSurroundingText() const;
    virtual Selection GetSurroundingTextSelection() const;
    virtual bool DeleteSurroundingText(const Selection& rSelection);

    virtual FactoryFunction GetUITestFactory() const;

diff --git a/sd/source/ui/annotations/annotationwindow.cxx b/sd/source/ui/annotations/annotationwindow.cxx
index 5bafcbf..b929796 100644
--- a/sd/source/ui/annotations/annotationwindow.cxx
+++ b/sd/source/ui/annotations/annotationwindow.cxx
@@ -228,6 +228,13 @@ Selection AnnotationTextWindow::GetSurroundingTextSelection() const
        return Selection( 0, 0 );
}

bool AnnotationTextWindow::DeleteSurroundingText(const Selection& rSelection)
{
    if( mpOutlinerView )
        return mpOutlinerView->DeleteSurroundingText(rSelection);
    return false;
}

/************** AnnotationWindow***********************************++*/

AnnotationWindow::AnnotationWindow( AnnotationManagerImpl& rManager, DrawDocShell* pDocShell, vcl::Window* pParent )
diff --git a/sd/source/ui/annotations/annotationwindow.hxx b/sd/source/ui/annotations/annotationwindow.hxx
index c57b4bd..3d84202 100644
--- a/sd/source/ui/annotations/annotationwindow.hxx
+++ b/sd/source/ui/annotations/annotationwindow.hxx
@@ -64,6 +64,7 @@ public:

    virtual OUString GetSurroundingText() const override;
    virtual Selection GetSurroundingTextSelection() const override;
    virtual bool DeleteSurroundingText(const Selection& rSelection) override;
};

class AnnotationWindow : public FloatingWindow
diff --git a/sd/source/ui/inc/Window.hxx b/sd/source/ui/inc/Window.hxx
index a33b009..cbbe731 100644
--- a/sd/source/ui/inc/Window.hxx
+++ b/sd/source/ui/inc/Window.hxx
@@ -191,6 +191,8 @@ protected:

    OUString GetSurroundingText() const override;
    Selection GetSurroundingTextSelection() const override;
    bool DeleteSurroundingText(const Selection& rSelection) override;

    /// @see Window::LogicInvalidate().
    void LogicInvalidate(const ::tools::Rectangle* pRectangle) override;
    /// Same as MouseButtonDown(), but coordinates are in logic unit.
diff --git a/sd/source/ui/view/sdwindow.cxx b/sd/source/ui/view/sdwindow.cxx
index bb71ade..1f99312 100644
--- a/sd/source/ui/view/sdwindow.cxx
+++ b/sd/source/ui/view/sdwindow.cxx
@@ -1003,6 +1003,23 @@ Selection Window::GetSurroundingTextSelection() const
    }
}

bool Window::DeleteSurroundingText(const Selection& rSelection)
{
    if ( mpViewShell->GetShellType() == ViewShell::ST_OUTLINE )
    {
        return false;
    }
    else if ( mpViewShell->GetView()->IsTextEdit() )
    {
        OutlinerView *pOLV = mpViewShell->GetView()->GetTextEditOutlinerView();
        return pOLV->GetEditView().DeleteSurroundingText(rSelection);
    }
    else
    {
        return false;
    }
}

void Window::LogicInvalidate(const ::tools::Rectangle* pRectangle)
{
    DrawViewShell* pDrawViewShell = dynamic_cast<DrawViewShell*>(mpViewShell);
diff --git a/svx/source/dialog/weldeditview.cxx b/svx/source/dialog/weldeditview.cxx
index c90b211..f62a3df 100644
--- a/svx/source/dialog/weldeditview.cxx
+++ b/svx/source/dialog/weldeditview.cxx
@@ -1448,18 +1448,9 @@ int WeldEditView::GetSurroundingText(OUString& rSurrounding)

bool WeldEditView::DeleteSurroundingText(const Selection& rRange)
{
    bool bRes(false);
    if (m_xEditView)
    {
        ESelection aSel(m_xEditView->GetSelection());
        aSel.nEndPara = aSel.nStartPara;
        aSel.nStartPos = rRange.Min();
        aSel.nEndPos = rRange.Max();
        m_xEditView->SetSelection(aSel);
        m_xEditView->DeleteSelected();
        bRes = true;
    }
    return bRes;
    if (!m_xEditView)
        return false;
    return m_xEditView->DeleteSurroundingText(rRange);
}

void WeldEditView::GetFocus()
diff --git a/sw/source/uibase/docvw/SidebarTxtControl.cxx b/sw/source/uibase/docvw/SidebarTxtControl.cxx
index c33e07e..fde4516 100644
--- a/sw/source/uibase/docvw/SidebarTxtControl.cxx
+++ b/sw/source/uibase/docvw/SidebarTxtControl.cxx
@@ -430,6 +430,13 @@ Selection SidebarTextControl::GetSurroundingTextSelection() const
        return Selection( 0, 0 );
}

bool SidebarTextControl::DeleteSurroundingText(const Selection& rSelection)
{
    if (OutlinerView* pTextView = GetTextView())
        return pTextView->DeleteSurroundingText(rSelection);
    return false;
}

css::uno::Reference< css::accessibility::XAccessible > SidebarTextControl::CreateAccessible()
{

diff --git a/sw/source/uibase/docvw/SidebarTxtControl.hxx b/sw/source/uibase/docvw/SidebarTxtControl.hxx
index ab9c760..def7522 100644
--- a/sw/source/uibase/docvw/SidebarTxtControl.hxx
+++ b/sw/source/uibase/docvw/SidebarTxtControl.hxx
@@ -46,6 +46,7 @@ class SidebarTextControl : public Control
        virtual void    RequestHelp(const HelpEvent &rEvt) override;
        virtual OUString GetSurroundingText() const override;
        virtual Selection GetSurroundingTextSelection() const override;
        virtual bool DeleteSurroundingText(const Selection& rSelection) override;

    public:
        SidebarTextControl( sw::annotation::SwAnnotationWin& rSidebarWin,
diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx
index 5a715b1..7717502 100644
--- a/vcl/inc/salvtables.hxx
+++ b/vcl/inc/salvtables.hxx
@@ -1100,6 +1100,7 @@ private:
    DECL_LINK(CommandHdl, const CommandEvent&, bool);
    DECL_LINK(QueryTooltipHdl, tools::Rectangle&, OUString);
    DECL_LINK(GetSurroundingHdl, OUString&, int);
    DECL_LINK(DeleteSurroundingHdl, const Selection&, bool);
    DECL_LINK(StartDragHdl, VclDrawingArea*, bool);

    // SalInstanceWidget has a generic listener for all these
diff --git a/vcl/inc/salwtype.hxx b/vcl/inc/salwtype.hxx
index ea2ee46..2b07854 100644
--- a/vcl/inc/salwtype.hxx
+++ b/vcl/inc/salwtype.hxx
@@ -80,6 +80,7 @@ enum class SalEvent {
    ShowDialog,
    MenuButtonCommand,
    SurroundingTextRequest,
    DeleteSurroundingTextRequest,
    SurroundingTextSelectionChange,
    StartReconversion,
    QueryCharPosition,
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 26e382a..3039075 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -5848,6 +5848,7 @@ SalInstanceDrawingArea::SalInstanceDrawingArea(VclDrawingArea* pDrawingArea, Sal
    m_xDrawingArea->SetCommandHdl(LINK(this, SalInstanceDrawingArea, CommandHdl));
    m_xDrawingArea->SetQueryTooltipHdl(LINK(this, SalInstanceDrawingArea, QueryTooltipHdl));
    m_xDrawingArea->SetGetSurroundingHdl(LINK(this, SalInstanceDrawingArea, GetSurroundingHdl));
    m_xDrawingArea->SetDeleteSurroundingHdl(LINK(this, SalInstanceDrawingArea, DeleteSurroundingHdl));
    m_xDrawingArea->SetStartDragHdl(LINK(this, SalInstanceDrawingArea, StartDragHdl));
}

@@ -5941,6 +5942,7 @@ void SalInstanceDrawingArea::enable_drag_source(rtl::Reference<TransferDataConta

SalInstanceDrawingArea::~SalInstanceDrawingArea()
{
    m_xDrawingArea->SetDeleteSurroundingHdl(Link<const Selection&, bool>());
    m_xDrawingArea->SetGetSurroundingHdl(Link<OUString&, int>());
    m_xDrawingArea->SetQueryTooltipHdl(Link<tools::Rectangle&, OUString>());
    m_xDrawingArea->SetCommandHdl(Link<const CommandEvent&, bool>());
@@ -6017,6 +6019,11 @@ IMPL_LINK(SalInstanceDrawingArea, GetSurroundingHdl, OUString&, rSurrounding, in
    return m_aGetSurroundingHdl.Call(rSurrounding);
}

IMPL_LINK(SalInstanceDrawingArea, DeleteSurroundingHdl, const Selection&, rSelection, bool)
{
    return m_aDeleteSurroundingHdl.Call(rSelection);
}

IMPL_LINK(SalInstanceDrawingArea, QueryTooltipHdl, tools::Rectangle&, rHelpArea, OUString)
{
    return m_aQueryTooltipHdl.Call(rHelpArea);
diff --git a/vcl/source/control/edit.cxx b/vcl/source/control/edit.cxx
index 18f4fb7..27eadda 100644
--- a/vcl/source/control/edit.cxx
+++ b/vcl/source/control/edit.cxx
@@ -2908,7 +2908,15 @@ OUString Edit::GetSurroundingText() const

Selection Edit::GetSurroundingTextSelection() const
{
  return GetSelection();
    return GetSelection();
}

bool Edit::DeleteSurroundingText(const Selection& rSelection)
{
    SetSelection(rSelection);
    DeleteSelected();
    // maybe we should update mpIMEInfos here
    return true;
}

FactoryFunction Edit::GetUITestFactory() const
diff --git a/vcl/source/window/layout.cxx b/vcl/source/window/layout.cxx
index 36ebf51..4c98d7a 100644
--- a/vcl/source/window/layout.cxx
+++ b/vcl/source/window/layout.cxx
@@ -2859,19 +2859,27 @@ void VclDrawingArea::StartDrag(sal_Int8, const Point&)

OUString VclDrawingArea::GetSurroundingText() const
{
    if (!m_aGetSurroundingHdl.IsSet())
        return Control::GetSurroundingText();
    OUString sSurroundingText;
    if (m_aGetSurroundingHdl.Call(sSurroundingText) != -1)
        return sSurroundingText;
    return Control::GetSurroundingText();
    m_aGetSurroundingHdl.Call(sSurroundingText);
    return sSurroundingText;
}

Selection VclDrawingArea::GetSurroundingTextSelection() const
{
    if (!m_aGetSurroundingHdl.IsSet())
        return Control::GetSurroundingTextSelection();
    OUString sSurroundingText;
    int nCursor = m_aGetSurroundingHdl.Call(sSurroundingText);
    if (nCursor != -1)
        return Selection(nCursor, nCursor);
    return Control::GetSurroundingTextSelection();
    return Selection(nCursor, nCursor);
}

bool VclDrawingArea::DeleteSurroundingText(const Selection& rSelection)
{
    if (!m_aDeleteSurroundingHdl.IsSet())
        return Control::DeleteSurroundingText(rSelection);
    return m_aDeleteSurroundingHdl.Call(rSelection);
}

VclHPaned::~VclHPaned()
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 447cd01..2d9cfd5 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -21,6 +21,7 @@
#include <sal/log.hxx>

#include <sal/types.h>
#include <tools/diagnose_ex.h>
#include <vcl/salgtype.hxx>
#include <vcl/event.hxx>
#include <vcl/help.hxx>
@@ -57,6 +58,7 @@

#include <com/sun/star/accessibility/AccessibleRelation.hpp>
#include <com/sun/star/accessibility/XAccessible.hpp>
#include <com/sun/star/accessibility/XAccessibleEditableText.hpp>
#include <com/sun/star/awt/XWindowPeer.hpp>
#include <com/sun/star/datatransfer/clipboard/XClipboard.hpp>
#include <com/sun/star/datatransfer/dnd/XDragGestureRecognizer.hpp>
@@ -3771,6 +3773,64 @@ Selection Window::GetSurroundingTextSelection() const
  return Selection( 0, 0 );
}

namespace
{
    using namespace com::sun::star;

    uno::Reference<accessibility::XAccessibleEditableText> lcl_GetxText(vcl::Window *pFocusWin)
    {
        uno::Reference<accessibility::XAccessibleEditableText> xText;
        try
        {
            uno::Reference< accessibility::XAccessible > xAccessible( pFocusWin->GetAccessible() );
            if (xAccessible.is())
                xText = FindFocusedEditableText(xAccessible->getAccessibleContext());
        }
        catch(const uno::Exception&)
        {
            TOOLS_WARN_EXCEPTION( "vcl.gtk3", "Exception in getting input method surrounding text");
        }
        return xText;
    }
}

// this is a rubbish implementation using a11y, ideally all subclasses implementing
// GetSurroundingText/GetSurroundingTextSelection should implement this and then this
// should be removed in favor of a stub that returns false
bool Window::DeleteSurroundingText(const Selection& rSelection)
{
    uno::Reference<accessibility::XAccessibleEditableText> xText = lcl_GetxText(this);
    if (xText.is())
    {
        sal_Int32 nPosition = xText->getCaretPosition();
        // #i111768# range checking
        sal_Int32 nDeletePos = rSelection.Min();
        sal_Int32 nDeleteEnd = rSelection.Max();
        if (nDeletePos < 0)
            nDeletePos = 0;
        if (nDeleteEnd < 0)
            nDeleteEnd = 0;
        if (nDeleteEnd > xText->getCharacterCount())
            nDeleteEnd = xText->getCharacterCount();

        xText->deleteText(nDeletePos, nDeleteEnd);
        //tdf91641 adjust cursor if deleted chars shift it forward (normal case)
        if (nDeletePos < nPosition)
        {
            if (nDeleteEnd <= nPosition)
                nPosition = nPosition - (nDeleteEnd - nDeletePos);
            else
                nPosition = nDeletePos;

            if (xText->getCharacterCount() >= nPosition)
                xText->setCaretPosition( nPosition );
        }
        return true;
    }

    return false;
}

bool Window::UsePolyPolygonForComplexGradient()
{
    return meRasterOp != RasterOp::OverPaint;
diff --git a/vcl/source/window/winproc.cxx b/vcl/source/window/winproc.cxx
index 39b76a8..aab2cb2 100644
--- a/vcl/source/window/winproc.cxx
+++ b/vcl/source/window/winproc.cxx
@@ -2274,6 +2274,23 @@ static void ImplHandleSalSurroundingTextRequest( vcl::Window *pWindow,
        pEvt->mnEnd = aSelRange.Max();
}

static void ImplHandleSalDeleteSurroundingTextRequest( vcl::Window *pWindow,
                         SalSurroundingTextSelectionChangeEvent *pEvt )
{
    vcl::Window* pChild = ImplGetKeyInputWindow( pWindow );

    Selection aSelection(pEvt->mnStart, pEvt->mnEnd);
    if (pChild && pChild->DeleteSurroundingText(aSelection))
    {
        pEvt->mnStart = aSelection.Min();
        pEvt->mnEnd = aSelection.Max();
    }
    else
    {
        pEvt->mnStart = pEvt->mnEnd = SAL_MAX_UINT32;
    }
}

static void ImplHandleSurroundingTextSelectionChange( vcl::Window *pWindow,
                              sal_uLong nStart,
                              sal_uLong nEnd )
@@ -2569,6 +2586,9 @@ bool ImplWindowFrameProc( vcl::Window* _pWindow, SalEvent nEvent, const void* pE
        case SalEvent::SurroundingTextRequest:
            ImplHandleSalSurroundingTextRequest( pWindow, const_cast<SalSurroundingTextRequestEvent *>(static_cast<SalSurroundingTextRequestEvent const *>(pEvent)) );
            break;
        case SalEvent::DeleteSurroundingTextRequest:
            ImplHandleSalDeleteSurroundingTextRequest( pWindow, const_cast<SalSurroundingTextSelectionChangeEvent *>(static_cast<SalSurroundingTextSelectionChangeEvent const *>(pEvent)) );
            break;
        case SalEvent::SurroundingTextSelectionChange:
        {
            SalSurroundingTextSelectionChangeEvent const * pEvt
diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx
index 1bccc46..8c62814 100644
--- a/vcl/unx/gtk3/gtk3gtkframe.cxx
+++ b/vcl/unx/gtk3/gtk3gtkframe.cxx
@@ -58,7 +58,6 @@
#include <cstdlib>
#include <cmath>

#include <com/sun/star/accessibility/XAccessibleEditableText.hpp>
#include <com/sun/star/awt/MouseButton.hpp>
#include <com/sun/star/datatransfer/dnd/DNDConstants.hpp>

@@ -4360,22 +4359,6 @@ void GtkSalFrame::IMHandler::signalIMPreeditEnd( GtkIMContext*, gpointer im_hand
        pThis->updateIMSpotLocation();
}

static uno::Reference<accessibility::XAccessibleEditableText> lcl_GetxText(vcl::Window *pFocusWin)
{
    uno::Reference<accessibility::XAccessibleEditableText> xText;
    try
    {
        uno::Reference< accessibility::XAccessible > xAccessible( pFocusWin->GetAccessible() );
        if (xAccessible.is())
            xText = FindFocusedEditableText(xAccessible->getAccessibleContext());
    }
    catch(const uno::Exception&)
    {
        TOOLS_WARN_EXCEPTION( "vcl.gtk3", "Exception in getting input method surrounding text");
    }
    return xText;
}

gboolean GtkSalFrame::IMHandler::signalIMRetrieveSurrounding( GtkIMContext* pContext, gpointer im_handler )
{
    GtkSalFrame::IMHandler* pThis = static_cast<GtkSalFrame::IMHandler*>(im_handler);
@@ -4396,7 +4379,7 @@ gboolean GtkSalFrame::IMHandler::signalIMRetrieveSurrounding( GtkIMContext* pCon

Selection GtkSalFrame::CalcDeleteSurroundingSelection(const OUString& rSurroundingText, int nCursorIndex, int nOffset, int nChars)
{
    Selection aInvalid(-1, -1);
    Selection aInvalid(SAL_MAX_UINT32, SAL_MAX_UINT32);

    if (nCursorIndex == -1)
        return aInvalid;
@@ -4445,42 +4428,37 @@ Selection GtkSalFrame::CalcDeleteSurroundingSelection(const OUString& rSurroundi
}

gboolean GtkSalFrame::IMHandler::signalIMDeleteSurrounding( GtkIMContext*, gint offset, gint nchars,
    gpointer /*im_handler*/ )
    gpointer im_handler )
{
    vcl::Window *pFocusWin = Application::GetFocusWindow();
    if (!pFocusWin)
        return true;
    GtkSalFrame::IMHandler* pThis = static_cast<GtkSalFrame::IMHandler*>(im_handler);

    uno::Reference<accessibility::XAccessibleEditableText> xText = lcl_GetxText(pFocusWin);
    if (xText.is())
    {
        sal_Int32 nPosition = xText->getCaretPosition();
        // #i111768# range checking
        sal_Int32 nDeletePos = nPosition + offset;
        sal_Int32 nDeleteEnd = nDeletePos + nchars;
        if (nDeletePos < 0)
            nDeletePos = 0;
        if (nDeleteEnd < 0)
            nDeleteEnd = 0;
        if (nDeleteEnd > xText->getCharacterCount())
            nDeleteEnd = xText->getCharacterCount();
    // First get the surrounding text
    SalSurroundingTextRequestEvent aSurroundingTextEvt;
    aSurroundingTextEvt.maText.clear();
    aSurroundingTextEvt.mnStart = aSurroundingTextEvt.mnEnd = 0;

        xText->deleteText(nDeletePos, nDeleteEnd);
        //tdf91641 adjust cursor if deleted chars shift it forward (normal case)
        if (nDeletePos < nPosition)
        {
            if (nDeleteEnd <= nPosition)
                nPosition = nPosition - (nDeleteEnd - nDeletePos);
            else
                nPosition = nDeletePos;
    SolarMutexGuard aGuard;
    pThis->m_pFrame->CallCallback(SalEvent::SurroundingTextRequest, &aSurroundingTextEvt);

            if (xText->getCharacterCount() >= nPosition)
                xText->setCaretPosition( nPosition );
        }
        return true;
    }
    // Turn offset, nchars into a utf-16 selection
    Selection aSelection = GtkSalFrame::CalcDeleteSurroundingSelection(aSurroundingTextEvt.maText,
                                                                       aSurroundingTextEvt.mnStart,
                                                                       offset, nchars);
    Selection aInvalid(SAL_MAX_UINT32, SAL_MAX_UINT32);
    if (aSelection == aInvalid)
        return false;

    return false;
    SalSurroundingTextSelectionChangeEvent aEvt;
    aEvt.mnStart = aSelection.Min();
    aEvt.mnEnd = aSelection.Max();

    pThis->m_pFrame->CallCallback(SalEvent::DeleteSurroundingTextRequest, &aEvt);

    aSelection = Selection(aEvt.mnStart, aEvt.mnEnd);
    if (aSelection == aInvalid)
        return false;

    return true;
}

Size GtkSalDisplay::GetScreenSize( int nDisplayScreen )
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 6ee16f7..e9a7070 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -13849,7 +13849,7 @@ public:
        sal_Int32 nCursorIndex = pThis->m_pArea->im_context_get_surrounding(sSurroundingText);

        Selection aSelection = GtkSalFrame::CalcDeleteSurroundingSelection(sSurroundingText, nCursorIndex, nOffset, nChars);
        if (aSelection != Selection(-1, -1))
        if (aSelection != Selection(SAL_MAX_UINT32, SAL_MAX_UINT32))
            bRet = pThis->m_pArea->im_context_delete_surrounding(aSelection);
        return bRet;
    }