vcl/inc/unx/gtk/gtkobject.hxx | 7 +++++ vcl/unx/gtk3/gtkobject.cxx | 53 ++++++++++++++++++++++++++++++------------ 2 files changed, 46 insertions(+), 14 deletions(-)
New commits: commit 7c313b2e41e013d33b3576960a688c319d584d9a Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Fri Apr 15 16:27:37 2022 +0100 Commit: Adolfo Jayme Barrientos <fit...@ubuntu.com> CommitDate: Tue Apr 19 09:13:10 2022 +0200 Related: tdf#147237 change the SalObject background when the settings change which solves the problem of parts of the gtk ui remaining in the old theme when switching dark<->light Change-Id: I59060dfdf3937ca13cd706eefc9e67c133478992 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/133043 Tested-by: Jenkins Reviewed-by: Adolfo Jayme Barrientos <fit...@ubuntu.com> diff --git a/vcl/inc/unx/gtk/gtkobject.hxx b/vcl/inc/unx/gtk/gtkobject.hxx index 113868a4616c..b43f09e0bd30 100644 --- a/vcl/inc/unx/gtk/gtkobject.hxx +++ b/vcl/inc/unx/gtk/gtkobject.hxx @@ -82,6 +82,8 @@ class GtkSalObjectWidgetClip final : public GtkSalObjectBase tools::Rectangle m_aRect; tools::Rectangle m_aClipRect; GtkWidget* m_pScrolledWindow; + GtkWidget* m_pViewPort; + GtkCssProvider* m_pBgCssProvider; // signals #if !GTK_CHECK_VERSION(4, 0, 0) @@ -98,6 +100,11 @@ class GtkSalObjectWidgetClip final : public GtkSalObjectBase #endif void ApplyClipRegion(); + + void SetViewPortBackground(); + + DECL_LINK(SettingsChangedHdl, VclWindowEvent&, void); + public: GtkSalObjectWidgetClip(GtkSalFrame* pParent, bool bShow); virtual ~GtkSalObjectWidgetClip() override; diff --git a/vcl/unx/gtk3/gtkobject.cxx b/vcl/unx/gtk3/gtkobject.cxx index 6f8fffd3f0a0..8a987c09faf7 100644 --- a/vcl/unx/gtk3/gtkobject.cxx +++ b/vcl/unx/gtk3/gtkobject.cxx @@ -27,6 +27,7 @@ #include <unx/gtk/gtkobject.hxx> #include <unx/gtk/gtkframe.hxx> #include <unx/gtk/gtkdata.hxx> +#include <vcl/event.hxx> GtkSalObjectBase::GtkSalObjectBase(GtkSalFrame* pParent) : m_pSocket(nullptr) @@ -298,6 +299,8 @@ void GtkSalObjectBase::SetForwardKey( bool bEnable ) GtkSalObjectWidgetClip::GtkSalObjectWidgetClip(GtkSalFrame* pParent, bool bShow) : GtkSalObjectBase(pParent) , m_pScrolledWindow(nullptr) + , m_pViewPort(nullptr) + , m_pBgCssProvider(nullptr) { if( !pParent ) return; @@ -320,31 +323,26 @@ GtkSalObjectWidgetClip::GtkSalObjectWidgetClip(GtkSalFrame* pParent, bool bShow) 0, 0 ); // deliberately without adjustments to avoid gtk's auto adjustment on changing focus - GtkWidget* pViewPort = gtk_viewport_new(nullptr, nullptr); + m_pViewPort = gtk_viewport_new(nullptr, nullptr); // force in a fake background of a suitable color - GtkStyleContext *pWidgetContext = gtk_widget_get_style_context(pViewPort); - GtkCssProvider* pBgCssProvider = gtk_css_provider_new(); - OUString sColor = Application::GetSettings().GetStyleSettings().GetDialogColor().AsRGBHexString(); - OUString aBuffer = "* { background-color: #" + sColor + "; }"; - OString aResult = OUStringToOString(aBuffer, RTL_TEXTENCODING_UTF8); - css_provider_load_from_data(pBgCssProvider, aResult.getStr(), aResult.getLength()); - gtk_style_context_add_provider(pWidgetContext, GTK_STYLE_PROVIDER(pBgCssProvider), - GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + SetViewPortBackground(); + + ImplGetDefaultWindow()->AddEventListener(LINK(this, GtkSalObjectWidgetClip, SettingsChangedHdl)); #if !GTK_CHECK_VERSION(4, 0, 0) - gtk_container_add(GTK_CONTAINER(m_pScrolledWindow), pViewPort); + gtk_container_add(GTK_CONTAINER(m_pScrolledWindow), m_pViewPort); #else - gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(m_pScrolledWindow), pViewPort); + gtk_scrolled_window_set_child(GTK_SCROLLED_WINDOW(m_pScrolledWindow), m_pViewPort); #endif - gtk_widget_show(pViewPort); + gtk_widget_show(m_pViewPort); // our plug window m_pSocket = gtk_grid_new(); #if !GTK_CHECK_VERSION(4, 0, 0) - gtk_container_add(GTK_CONTAINER(pViewPort), m_pSocket); + gtk_container_add(GTK_CONTAINER(m_pViewPort), m_pSocket); #else - gtk_viewport_set_child(GTK_VIEWPORT(pViewPort), m_pSocket); + gtk_viewport_set_child(GTK_VIEWPORT(m_pViewPort), m_pSocket); #endif gtk_widget_show(m_pSocket); @@ -355,8 +353,35 @@ GtkSalObjectWidgetClip::GtkSalObjectWidgetClip(GtkSalFrame* pParent, bool bShow) g_signal_connect( G_OBJECT(m_pSocket), "destroy", G_CALLBACK(signalDestroy), this ); } +// force in a fake background of a suitable color +void GtkSalObjectWidgetClip::SetViewPortBackground() +{ + GtkStyleContext *pWidgetContext = gtk_widget_get_style_context(m_pViewPort); + if (m_pBgCssProvider) + gtk_style_context_remove_provider(pWidgetContext, GTK_STYLE_PROVIDER(m_pBgCssProvider)); + m_pBgCssProvider = gtk_css_provider_new(); + OUString sColor = Application::GetSettings().GetStyleSettings().GetDialogColor().AsRGBHexString(); + OUString aBuffer = "* { background-color: #" + sColor + "; }"; + OString aResult = OUStringToOString(aBuffer, RTL_TEXTENCODING_UTF8); + css_provider_load_from_data(m_pBgCssProvider, aResult.getStr(), aResult.getLength()); + gtk_style_context_add_provider(pWidgetContext, GTK_STYLE_PROVIDER(m_pBgCssProvider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); +} + +IMPL_LINK(GtkSalObjectWidgetClip, SettingsChangedHdl, VclWindowEvent&, rEvent, void) +{ + if (rEvent.GetId() != VclEventId::WindowDataChanged) + return; + + DataChangedEvent* pData = static_cast<DataChangedEvent*>(rEvent.GetData()); + if (pData->GetType() == DataChangedEventType::SETTINGS) + SetViewPortBackground(); +} + GtkSalObjectWidgetClip::~GtkSalObjectWidgetClip() { + ImplGetDefaultWindow()->RemoveEventListener(LINK(this, GtkSalObjectWidgetClip, SettingsChangedHdl)); + if( !m_pSocket ) return;