tdf#125079 turn off GTK_WIN_POS_CENTER_ON_PARENT after a while
Change-Id: Ib268a6b32257aee812e5bae27a6db94431d2abbb
Reviewed-on: https://gerrit.libreoffice.org/71739
Tested-by: Jenkins
Tested-by: Xisco Faulí <xiscofauli@libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
diff --git a/include/sfx2/templatedlg.hxx b/include/sfx2/templatedlg.hxx
index e8ff161..dd821bd 100644
--- a/include/sfx2/templatedlg.hxx
+++ b/include/sfx2/templatedlg.hxx
@@ -15,6 +15,7 @@
#include <set>
#include <vcl/idle.hxx>
#include <vcl/timer.hxx>
#include <vcl/weld.hxx>
@@ -197,8 +198,10 @@ public:
private:
DECL_LINK(OpenTemplateHdl, ThumbnailViewItem*, void);
DECL_LINK(OkClickHdl, weld::Button&, void);
DECL_LINK(TimeOut, Timer*, void);
OUString msTemplatePath;
Idle maIdle;
};
#endif // INCLUDED_SFX2_INC_TEMPLATEDLG_HXX
diff --git a/include/vcl/weld.hxx b/include/vcl/weld.hxx
index 4bc3e08..be325ab 100644
--- a/include/vcl/weld.hxx
+++ b/include/vcl/weld.hxx
@@ -342,10 +342,17 @@ public:
virtual bool get_resizable() const = 0;
virtual Size get_size() const = 0;
virtual Point get_position() const = 0;
// ensure window will be centered on its parent, taking into account that
// there may currently be pending geometry requests for the parent
// not yet processed by the underlying toolkit
virtual void set_centered_on_parent_geometry_request() = 0;
// center window on is parent
//
// bTrackGeometryRequests set to true tries to ensure the window will end
// up still centered on its parent windows final size, taking into account
// that there may currently be pending geometry requests for the parent not
// yet processed by the underlying toolkit
//
// for e.g gtk this will means the window is always centered even when
// resized, calling set_centered_on_parent with false will turn this
// off again.
virtual void set_centered_on_parent(bool bTrackGeometryRequests) = 0;
virtual bool has_toplevel_focus() const = 0;
virtual void present() = 0;
virtual void set_window_state(const OString& rStr) = 0;
diff --git a/sfx2/source/doc/templatedlg.cxx b/sfx2/source/doc/templatedlg.cxx
index 77ca1eb9..909a43e 100644
--- a/sfx2/source/doc/templatedlg.cxx
+++ b/sfx2/source/doc/templatedlg.cxx
@@ -1381,6 +1381,7 @@ SfxTemplateSelectionDlg::SfxTemplateSelectionDlg(weld::Window* pParent)
SfxTemplateSelectionDlg::~SfxTemplateSelectionDlg()
{
maIdle.Stop();
}
short SfxTemplateSelectionDlg::run()
@@ -1389,10 +1390,21 @@ short SfxTemplateSelectionDlg::run()
// has taken its final size. The parent size request is processed during
// the dialogs event loop so configure this dialog to center to
// the parents pending geometry request
m_xDialog->set_centered_on_parent_geometry_request();
m_xDialog->set_centered_on_parent(true);
// tdf#125079 toggle off the size tracking at some future idle point
maIdle.SetPriority(TaskPriority::LOWEST);
maIdle.SetInvokeHandler(LINK(this,SfxTemplateSelectionDlg,TimeOut));
maIdle.Start();
return weld::GenericDialogController::run();
}
IMPL_LINK_NOARG(SfxTemplateSelectionDlg, TimeOut, Timer*, void)
{
m_xDialog->set_centered_on_parent(false);
}
IMPL_LINK(SfxTemplateSelectionDlg, OpenTemplateHdl, ThumbnailViewItem*, pItem, void)
{
TemplateViewItem *pViewItem = static_cast<TemplateViewItem*>(pItem);
diff --git a/uui/source/passworddlg.cxx b/uui/source/passworddlg.cxx
index ffa2897..7fa17d3 100644
--- a/uui/source/passworddlg.cxx
+++ b/uui/source/passworddlg.cxx
@@ -42,7 +42,7 @@ PasswordDialog::PasswordDialog(weld::Window* pParent,
, rResLocale(rLocale)
{
// tdf#115964 we can be launched before the parent has resized to its final size
m_xDialog->set_centered_on_parent_geometry_request();
m_xDialog->set_centered_on_parent(true);
if( nDialogMode == task::PasswordRequestMode_PASSWORD_REENTER )
{
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx
index 4ed1d96..6a7f3ab 100644
--- a/vcl/source/app/salvtables.cxx
+++ b/vcl/source/app/salvtables.cxx
@@ -984,7 +984,7 @@ public:
return m_xWindow->GetPosPixel();
}
virtual void set_centered_on_parent_geometry_request() override
virtual void set_centered_on_parent(bool /*bTrackGeometryRequests*/) override
{
if (vcl::Window* pParent = m_xWidget->GetParent())
{
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index b1c7cf9..bb18038 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -2582,9 +2582,12 @@ public:
return Point(current_x, current_y);
}
virtual void set_centered_on_parent_geometry_request() override
virtual void set_centered_on_parent(bool bTrackGeometryRequests) override
{
gtk_window_set_position(m_pWindow, GTK_WIN_POS_CENTER_ALWAYS);
if (bTrackGeometryRequests)
gtk_window_set_position(m_pWindow, GTK_WIN_POS_CENTER_ALWAYS);
else
gtk_window_set_position(m_pWindow, GTK_WIN_POS_CENTER_ON_PARENT);
}
virtual bool get_resizable() const override