diff options
author | Caolán McNamara <caolanm@redhat.com> | 2020-02-16 20:45:06 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2020-02-17 12:05:37 +0100 |
commit | e05c7017a04a1c2a2ee4dc22ee53ae8d66847c32 (patch) | |
tree | 9e65dbc8c9e54b15c4de02bb076802ea8b8a73c9 /vcl | |
parent | 9abe0acb8e2b11c360b569f023d89d1e9c502f83 (diff) |
Related: tdf#130414 implement queue_resize for ChildFrame
so it can respond to changes to its childrens layout request state
Change-Id: I32235c1df9f315954b9d91b500388abe663fa16d
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/88824
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkinst.cxx | 53 |
1 files changed, 40 insertions, 13 deletions
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index f6414f2f9d8c..bdaf11ffecf6 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -3461,20 +3461,47 @@ public: } }; - class ChildFrame : public WorkWindow +class ChildFrame : public WorkWindow +{ +private: + Idle maLayoutIdle; + + DECL_LINK(ImplHandleLayoutTimerHdl, Timer*, void); +public: + ChildFrame(vcl::Window* pParent, WinBits nStyle) + : WorkWindow(pParent, nStyle) { - public: - ChildFrame(vcl::Window* pParent, WinBits nStyle) - : WorkWindow(pParent, nStyle) - { - } - virtual void Resize() override - { - WorkWindow::Resize(); - if (vcl::Window *pChild = GetWindow(GetWindowType::FirstChild)) - pChild->SetPosSizePixel(Point(0, 0), GetSizePixel()); - } - }; + maLayoutIdle.SetPriority(TaskPriority::RESIZE); + maLayoutIdle.SetInvokeHandler( LINK( this, ChildFrame, ImplHandleLayoutTimerHdl ) ); + maLayoutIdle.SetDebugName( "ChildFrame maLayoutIdle" ); + } + + virtual void dispose() override + { + maLayoutIdle.Stop(); + WorkWindow::dispose(); + } + + virtual void queue_resize(StateChangedType eReason = StateChangedType::Layout) override + { + WorkWindow::queue_resize(eReason); + if (maLayoutIdle.IsActive()) + return; + maLayoutIdle.Start(); + } + + virtual void Resize() override + { + WorkWindow::Resize(); + queue_resize(); + } +}; + +IMPL_LINK_NOARG(ChildFrame, ImplHandleLayoutTimerHdl, Timer*, void) +{ + if (vcl::Window *pChild = GetWindow(GetWindowType::FirstChild)) + pChild->SetPosSizePixel(Point(0, 0), GetSizePixel()); +} class GtkInstanceContainer : public GtkInstanceWidget, public virtual weld::Container { |