diff options
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/inc/salvtables.hxx | 2 | ||||
-rw-r--r-- | vcl/source/app/salvtables.cxx | 17 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkinst.cxx | 32 |
3 files changed, 51 insertions, 0 deletions
diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx index 4322cb242b1b..badc2ff188fd 100644 --- a/vcl/inc/salvtables.hxx +++ b/vcl/inc/salvtables.hxx @@ -413,6 +413,8 @@ private: public: SalInstanceContainer(vcl::Window* pContainer, SalInstanceBuilder* pBuilder, bool bTakeOwnership); + virtual void HandleEventListener(VclWindowEvent& rEvent) override; + virtual void connect_container_focus_changed(const Link<Container&, void>& rLink) override; virtual void move(weld::Widget* pWidget, weld::Container* pNewParent) override; virtual void recursively_unset_default_buttons() override; virtual css::uno::Reference<css::awt::XWindow> CreateChildFrame() override; diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index 56f297ae8415..81ceba3ccd11 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -1146,6 +1146,23 @@ void SalInstanceContainer::implResetDefault(const vcl::Window* _pWindow) } } +void SalInstanceContainer::connect_container_focus_changed(const Link<Container&, void>& rLink) +{ + ensure_event_listener(); + weld::Container::connect_container_focus_changed(rLink); +} + +void SalInstanceContainer::HandleEventListener(VclWindowEvent& rEvent) +{ + if (rEvent.GetId() == VclEventId::WindowActivate + || rEvent.GetId() == VclEventId::WindowDeactivate) + { + signal_container_focus_changed(); + return; + } + SalInstanceWidget::HandleEventListener(rEvent); +} + SalInstanceContainer::SalInstanceContainer(vcl::Window* pContainer, SalInstanceBuilder* pBuilder, bool bTakeOwnership) : SalInstanceWidget(pContainer, pBuilder, bTakeOwnership) diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index 63ebf1885967..7a58dd7d2ead 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -3763,6 +3763,8 @@ class GtkInstanceContainer : public GtkInstanceWidget, public virtual weld::Cont { private: GtkContainer* m_pContainer; + gulong m_nSetFocusChildSignalId; + bool m_bChildHasFocus; static void implResetDefault(GtkWidget *pWidget, gpointer user_data) { @@ -3772,11 +3774,35 @@ private: gtk_container_forall(GTK_CONTAINER(pWidget), implResetDefault, user_data); } + void signal_set_focus_child(bool bChildHasFocus) + { + if (m_bChildHasFocus != bChildHasFocus) + { + m_bChildHasFocus = bChildHasFocus; + signal_container_focus_changed(); + } + } + + static void signalSetFocusChild(GtkContainer*, GtkWidget* pChild, gpointer widget) + { + GtkInstanceContainer* pThis = static_cast<GtkInstanceContainer*>(widget); + pThis->signal_set_focus_child(pChild != nullptr); + } + public: GtkInstanceContainer(GtkContainer* pContainer, GtkInstanceBuilder* pBuilder, bool bTakeOwnership) : GtkInstanceWidget(GTK_WIDGET(pContainer), pBuilder, bTakeOwnership) , m_pContainer(pContainer) + , m_nSetFocusChildSignalId(0) + , m_bChildHasFocus(false) + { + } + + virtual void connect_container_focus_changed(const Link<Container&, void>& rLink) override { + if (!m_nSetFocusChildSignalId) + m_nSetFocusChildSignalId = g_signal_connect(G_OBJECT(m_pContainer), "set-focus-child", G_CALLBACK(signalSetFocusChild), this); + weld::Container::connect_container_focus_changed(rLink); } GtkContainer* getContainer() { return m_pContainer; } @@ -3830,6 +3856,12 @@ public: css::uno::Reference<css::awt::XWindow> xWindow(xEmbedWindow->GetComponentInterface(), css::uno::UNO_QUERY); return xWindow; } + + virtual ~GtkInstanceContainer() override + { + if (m_nSetFocusChildSignalId) + g_signal_handler_disconnect(m_pContainer, m_nSetFocusChildSignalId); + } }; } |