summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2015-10-08 10:43:03 +0100
committerCaolán McNamara <caolanm@redhat.com>2015-10-08 10:43:56 +0100
commit06d253ef3a3339300eff4fd38db728301516bf4d (patch)
tree10088b87d53a9aac8855cb6f56b0676bdf40a5bd
parent4855e780dc4f3cdfcadbce07b6bbdeb9b4eb2d0b (diff)
afl-eventtesting: add Application::EndAllDialogs
which uses PostUserEvent like Application::Quit so can ensure EndAllDialogs gets called before Quit Change-Id: I9eb7dbd4f012be2e9b9cea7a73c90c5aaba141aa
-rw-r--r--include/vcl/svapp.hxx4
-rw-r--r--vcl/inc/svdata.hxx3
-rw-r--r--vcl/source/app/svapp.cxx29
3 files changed, 25 insertions, 11 deletions
diff --git a/include/vcl/svapp.hxx b/include/vcl/svapp.hxx
index 1d8392cd6b5a..a5fb8fe0e4df 100644
--- a/include/vcl/svapp.hxx
+++ b/include/vcl/svapp.hxx
@@ -1481,6 +1481,10 @@ public:
static css::uno::Reference< css::ui::dialogs::XFolderPicker2 >
createFolderPicker( const css::uno::Reference< css::uno::XComponentContext >& rServiceManager );
+ /** Cancel all open dialogs
+ */
+ static void EndAllDialogs();
+
///@}
// For vclbootstrapprotector:
diff --git a/vcl/inc/svdata.hxx b/vcl/inc/svdata.hxx
index 87e6589f37fe..779a14019c37 100644
--- a/vcl/inc/svdata.hxx
+++ b/vcl/inc/svdata.hxx
@@ -161,7 +161,8 @@ struct ImplSVAppData
Idle* mpEventTestingIdle;
int mnEventTestLimit;
- DECL_STATIC_LINK_TYPED( ImplSVAppData, ImplQuitMsg, void*, void );
+ DECL_STATIC_LINK_TYPED(ImplSVAppData, ImplQuitMsg, void*, void);
+ DECL_STATIC_LINK_TYPED(ImplSVAppData, ImplEndAllDialogsMsg, void*, void);
DECL_LINK_TYPED(VclEventTestingHdl, Idle*, void);
};
diff --git a/vcl/source/app/svapp.cxx b/vcl/source/app/svapp.cxx
index 2c017443da6f..94ebc6e16092 100644
--- a/vcl/source/app/svapp.cxx
+++ b/vcl/source/app/svapp.cxx
@@ -328,6 +328,21 @@ const vcl::KeyCode* Application::GetReservedKeyCode( sal_uLong i )
return &ImplReservedKeys::get()->first[i].mKeyCode;
}
+IMPL_STATIC_LINK_NOARG_TYPED( ImplSVAppData, ImplEndAllDialogsMsg, void*, void )
+{
+ vcl::Window* pAppWindow = Application::GetFirstTopLevelWindow();
+ while (pAppWindow)
+ {
+ Dialog::EndAllDialogs(pAppWindow);
+ pAppWindow = Application::GetNextTopLevelWindow(pAppWindow);
+ }
+}
+
+void Application::EndAllDialogs()
+{
+ Application::PostUserEvent( LINK( NULL, ImplSVAppData, ImplEndAllDialogsMsg ) );
+}
+
namespace
{
bool InjectKeyEvent(SvStream& rStream)
@@ -351,14 +366,8 @@ namespace
void CloseDialogsAndQuit()
{
- Scheduler::ProcessTaskScheduling(true);
- vcl::Window* pAppWindow = Application::GetFirstTopLevelWindow();
- while (pAppWindow)
- {
- Dialog::EndAllDialogs(pAppWindow);
- pAppWindow = Application::GetNextTopLevelWindow(pAppWindow);
- }
- Scheduler::ProcessTaskScheduling(true);
+ Scheduler::ProcessTaskScheduling(false);
+ Application::EndAllDialogs();
Application::Quit();
}
}
@@ -375,7 +384,7 @@ IMPL_LINK_NOARG_TYPED(ImplSVAppData, VclEventTestingHdl, Idle *, void)
}
else
{
- Scheduler::ProcessTaskScheduling(true);
+ Scheduler::ProcessTaskScheduling(false);
if (InjectKeyEvent(*mpEventTestInput))
--mnEventTestLimit;
if (!mpEventTestInput->good())
@@ -383,7 +392,7 @@ IMPL_LINK_NOARG_TYPED(ImplSVAppData, VclEventTestingHdl, Idle *, void)
SAL_INFO("vcl.eventtesting", "Event Input exhausted, exit next cycle");
mnEventTestLimit = 0;
}
- Scheduler::ProcessTaskScheduling(true);
+ Scheduler::ProcessTaskScheduling(false);
mpEventTestingIdle->Start();
}
}