diff options
author | Caolán McNamara <caolanm@redhat.com> | 2021-11-05 11:19:37 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2021-11-05 13:34:37 +0100 |
commit | 8bd46187e355f2da76812d38d0fa36cc255a841b (patch) | |
tree | 9156885c02fe74703291511171cc3e8c147a20e9 | |
parent | d13712200e2c0cfee56afb6796f35e0fd15186e1 (diff) |
gtk[3|4] add find_image_widget
Change-Id: I13aa94c66d54a99ecd4cbe410360ff61b4762c34
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/124741
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
-rw-r--r-- | vcl/unx/gtk3/gtkinst.cxx | 54 |
1 files changed, 40 insertions, 14 deletions
diff --git a/vcl/unx/gtk3/gtkinst.cxx b/vcl/unx/gtk3/gtkinst.cxx index 3469ff87049b..1888a45ca1ce 100644 --- a/vcl/unx/gtk3/gtkinst.cxx +++ b/vcl/unx/gtk3/gtkinst.cxx @@ -4560,6 +4560,30 @@ namespace return pChild; } + + GtkWidget* find_image_widget(GtkContainer* pContainer) + { + GList* pChildren = gtk_container_get_children(pContainer); + + GtkWidget* pChild = nullptr; + for (GList* pCandidate = pChildren; pCandidate; pCandidate = pCandidate->next) + { + if (GTK_IS_IMAGE(pCandidate->data)) + { + pChild = GTK_WIDGET(pCandidate->data); + break; + } + else if (GTK_IS_CONTAINER(pCandidate->data)) + { + pChild = find_image_widget(GTK_CONTAINER(pCandidate->data)); + if (pChild) + break; + } + } + g_list_free(pChildren); + + return pChild; + } #endif GtkLabel* get_label_widget(GtkWidget* pButton) @@ -4578,6 +4602,21 @@ namespace #endif } + GtkImage* get_image_widget(GtkWidget *pButton) + { +#if !GTK_CHECK_VERSION(4, 0, 0) + GtkWidget* pChild = gtk_bin_get_child(GTK_BIN(pButton)); + + if (GTK_IS_CONTAINER(pChild)) + pChild = find_image_widget(GTK_CONTAINER(pChild)); + else if (!GTK_IS_IMAGE(pChild)) + pChild = nullptr; + + return GTK_IMAGE(pChild); +#else + return GTK_IMAGE(find_image_widget(pButton)); +#endif + } OUString get_button_label(GtkButton* pButton) { @@ -9929,19 +9968,6 @@ private: gtk_widget_show(GTK_WIDGET(m_pImage)); } - static void find_image(GtkWidget *pWidget, gpointer user_data) - { - GtkImage **ppImage = static_cast<GtkImage**>(user_data); - if (GTK_IS_IMAGE(pWidget)) - *ppImage = GTK_IMAGE(pWidget); -#if GTK_CHECK_VERSION(4, 0, 0) - *ppImage = GTK_IMAGE(find_image_widget(pWidget)); -#else - if (GTK_IS_CONTAINER(pWidget)) - gtk_container_forall(GTK_CONTAINER(pWidget), find_image, user_data); -#endif - } - static void signalFlagsChanged(GtkToggleButton* pToggleButton, GtkStateFlags flags, gpointer widget) { GtkInstanceMenuButton* pThis = static_cast<GtkInstanceMenuButton*>(widget); @@ -9988,7 +10014,7 @@ public: m_nToggledSignalId = g_signal_connect(m_pToggleButton, "state-flags-changed", G_CALLBACK(signalFlagsChanged), this); m_pLabel = gtk_bin_get_child(GTK_BIN(m_pMenuButton)); - find_image(GTK_WIDGET(m_pMenuButton), &m_pImage); + m_pImage = get_image_widget(GTK_WIDGET(m_pMenuButton)); m_pBox = formatMenuButton(m_pLabel); #else GtkWidget* pToggleButton = gtk_widget_get_first_child(GTK_WIDGET(m_pMenuButton)); |