summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--basctl/source/basicide/baside2.cxx8
-rw-r--r--include/vcl/dialog.hxx3
-rw-r--r--vcl/source/window/dialog.cxx9
3 files changed, 20 insertions, 0 deletions
diff --git a/basctl/source/basicide/baside2.cxx b/basctl/source/basicide/baside2.cxx
index 9741bdfeaeed..706c602eb124 100644
--- a/basctl/source/basicide/baside2.cxx
+++ b/basctl/source/basicide/baside2.cxx
@@ -622,7 +622,15 @@ bool ModulWindow::BasicErrorHdl( StarBASIC const * pBasic )
// #i47002#
Reference< awt::XWindow > xWindow = VCLUnoHelper::GetInterface( this );
+ // tdf#118572 make a currently running dialog, regardless of what its modal
+ // to, insensitive to user input until after this error dialog goes away.
+ auto xDialog = Dialog::GetMostRecentExecutingDialog();
+ const bool bToggleEnableInput = xDialog && xDialog->IsInputEnabled();
+ if (bToggleEnableInput)
+ xDialog->EnableInput(false);
ErrorHandler::HandleError(StarBASIC::GetErrorCode(), GetFrameWeld());
+ if (bToggleEnableInput)
+ xDialog->EnableInput(true);
// #i47002#
VclPtr<vcl::Window> pWindow = VCLUnoHelper::GetWindow( xWindow );
diff --git a/include/vcl/dialog.hxx b/include/vcl/dialog.hxx
index 43f45955a69f..440aacf479af 100644
--- a/include/vcl/dialog.hxx
+++ b/include/vcl/dialog.hxx
@@ -167,6 +167,9 @@ public:
void EndDialog( long nResult = 0 );
static void EndAllDialogs( vcl::Window const * pParent );
+ // returns the most recent of the currently executing modal dialogs
+ static VclPtr<Dialog> GetMostRecentExecutingDialog();
+
void GetDrawWindowBorder( sal_Int32& rLeftBorder, sal_Int32& rTopBorder,
sal_Int32& rRightBorder, sal_Int32& rBottomBorder ) const;
diff --git a/vcl/source/window/dialog.cxx b/vcl/source/window/dialog.cxx
index b7c1a3392a73..4403140df3f6 100644
--- a/vcl/source/window/dialog.cxx
+++ b/vcl/source/window/dialog.cxx
@@ -1131,6 +1131,15 @@ void Dialog::EndAllDialogs( vcl::Window const * pParent )
}
}
+VclPtr<Dialog> Dialog::GetMostRecentExecutingDialog()
+{
+ ImplSVData* pSVData = ImplGetSVData();
+ auto& rExecuteDialogs = pSVData->maWinData.mpExecuteDialogs;
+ if (!rExecuteDialogs.empty())
+ return rExecuteDialogs.back();
+ return nullptr;
+}
+
void Dialog::SetModalInputMode( bool bModal )
{
if ( bModal == mbModalMode )