summaryrefslogtreecommitdiff
path: root/vcl/unx/gtk3/gtk3gtkinst.cxx
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2021-03-16 12:56:42 +0000
committerCaolán McNamara <caolanm@redhat.com>2021-03-16 21:38:23 +0100
commit5aef0085cadb03c5c6b64747cf0ea76657a3a2ca (patch)
treebd234ca61b98996078d9d342f747c04462a223b4 /vcl/unx/gtk3/gtk3gtkinst.cxx
parent486f329b9589f1c795286228a513cb3751492fd2 (diff)
enable grabbing focus to an unspecified container child
Change-Id: I269f76a3e71832ef2e8961952d9362838bd49cfc Reviewed-on: https://gerrit.libreoffice.org/c/core/+/112577 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl/unx/gtk3/gtk3gtkinst.cxx')
-rw-r--r--vcl/unx/gtk3/gtk3gtkinst.cxx34
1 files changed, 30 insertions, 4 deletions
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index d15ee5d5a7e8..fc958c780f18 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -3817,6 +3817,27 @@ public:
GtkContainer* getContainer() { return m_pContainer; }
+ virtual void child_grab_focus() override
+ {
+ disable_notify_events();
+ gtk_widget_grab_focus(m_pWidget);
+ bool bHasFocusChild = gtk_container_get_focus_child(m_pContainer);
+ if (!bHasFocusChild)
+ {
+ GList* pChildren = gtk_container_get_children(m_pContainer);
+ for (GList* pChild = g_list_first(pChildren); pChild; pChild = g_list_next(pChild))
+ {
+ gtk_container_set_focus_child(m_pContainer, static_cast<GtkWidget*>(pChild->data));
+ bHasFocusChild = true;
+ break;
+ }
+ g_list_free(pChildren);
+ }
+ if (bHasFocusChild)
+ gtk_widget_child_focus(gtk_container_get_focus_child(GTK_CONTAINER(m_pWidget)), GTK_DIR_TAB_FORWARD);
+ enable_notify_events();
+ }
+
virtual void move(weld::Widget* pWidget, weld::Container* pNewParent) override
{
GtkInstanceWidget* pGtkWidget = dynamic_cast<GtkInstanceWidget*>(pWidget);
@@ -8897,12 +8918,17 @@ public:
{
disable_notify_events();
gtk_widget_grab_focus(m_pWidget);
- if (!gtk_container_get_focus_child(GTK_CONTAINER(m_pWidget)))
+ bool bHasFocusChild = gtk_container_get_focus_child(GTK_CONTAINER(m_pWidget));
+ if (!bHasFocusChild)
{
- GtkToolItem* pItem = gtk_toolbar_get_nth_item(m_pToolbar, 0);
- gtk_container_set_focus_child(GTK_CONTAINER(m_pWidget), GTK_WIDGET(pItem));
+ if (GtkToolItem* pItem = gtk_toolbar_get_nth_item(m_pToolbar, 0))
+ {
+ gtk_container_set_focus_child(GTK_CONTAINER(m_pWidget), GTK_WIDGET(pItem));
+ bHasFocusChild = true;
+ }
}
- gtk_widget_child_focus(gtk_container_get_focus_child(GTK_CONTAINER(m_pWidget)), GTK_DIR_TAB_FORWARD);
+ if (bHasFocusChild)
+ gtk_widget_child_focus(gtk_container_get_focus_child(GTK_CONTAINER(m_pWidget)), GTK_DIR_TAB_FORWARD);
enable_notify_events();
}