include/vcl/settings.hxx | 2 ++ vcl/inc/osx/salframe.h | 1 + vcl/inc/salframe.hxx | 1 + vcl/inc/unx/gtk/gtkframe.hxx | 1 + vcl/inc/win/salframe.h | 1 + vcl/osx/salframe.cxx | 22 +++++++++++++++------- vcl/source/app/settings.cxx | 8 ++++++++ vcl/unx/gtk3/gtkframe.cxx | 10 ++++++++++ vcl/win/window/salframe.cxx | 5 +++++ 9 files changed, 44 insertions(+), 7 deletions(-)
New commits: commit f76ec0b61e19267d9a01946dee2979f53f182a46 Author: Caolán McNamara <caol...@redhat.com> AuthorDate: Fri Apr 14 10:50:59 2023 +0100 Commit: Caolán McNamara <caol...@redhat.com> CommitDate: Fri Apr 14 15:57:22 2023 +0200 add a way to resolve if dark mode (explicit or auto) is active Change-Id: Ie0d4e0c3cd5d19cf6337ec79d30ae7c877cffd82 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/150394 Tested-by: Jenkins Reviewed-by: Caolán McNamara <caol...@redhat.com> diff --git a/include/vcl/settings.hxx b/include/vcl/settings.hxx index 9292e10e45cf..05c7678869d0 100644 --- a/include/vcl/settings.hxx +++ b/include/vcl/settings.hxx @@ -648,6 +648,8 @@ public: // 0 auto, 1 light, 2, dark static void SetDarkMode(int nMode); static int GetDarkMode(); + // return if dark mode is active, resolving 'auto' to dark (true) or light (false) + static bool GetUseDarkMode(); static void SetAppColorMode(int nMode); static int GetAppColorMode(); bool operator ==( const MiscSettings& rSet ) const; diff --git a/vcl/inc/osx/salframe.h b/vcl/inc/osx/salframe.h index af8783b96147..a9c2a4039d0f 100644 --- a/vcl/inc/osx/salframe.h +++ b/vcl/inc/osx/salframe.h @@ -164,6 +164,7 @@ public: // done setting up the clipregion virtual void EndSetClipRegion() override; virtual void UpdateDarkMode() override; + virtual bool GetUseDarkMode() const override; void UpdateFrameGeometry(); diff --git a/vcl/inc/salframe.hxx b/vcl/inc/salframe.hxx index a78f9afe08c0..8f6e2ddfbc50 100644 --- a/vcl/inc/salframe.hxx +++ b/vcl/inc/salframe.hxx @@ -300,6 +300,7 @@ public: void NotifyModalHierarchy(bool bModal) { m_aModalHierarchyHdl.Call(bModal); } virtual void UpdateDarkMode() {} + virtual bool GetUseDarkMode() const { return false; } // Call the callback set; this sometimes necessary for implementation classes // that should not know more than necessary about the SalFrame implementation diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx index d84abd09f7d3..00bbd26379ae 100644 --- a/vcl/inc/unx/gtk/gtkframe.hxx +++ b/vcl/inc/unx/gtk/gtkframe.hxx @@ -612,6 +612,7 @@ public: virtual bool HidePopover(void* nId) override; virtual weld::Window* GetFrameWeld() const override; virtual void UpdateDarkMode() override; + virtual bool GetUseDarkMode() const override; static GtkSalFrame *getFromWindow( GtkWidget *pWindow ); diff --git a/vcl/inc/win/salframe.h b/vcl/inc/win/salframe.h index 78f61945a311..676c70c1eca0 100644 --- a/vcl/inc/win/salframe.h +++ b/vcl/inc/win/salframe.h @@ -140,6 +140,7 @@ public: virtual void UnionClipRegion( tools::Long nX, tools::Long nY, tools::Long nWidth, tools::Long nHeight ) override; virtual void EndSetClipRegion() override; virtual void UpdateDarkMode() override; + virtual bool GetUseDarkMode() const override; constexpr vcl::WindowState state() const { return m_eState; } void UpdateFrameState(); diff --git a/vcl/osx/salframe.cxx b/vcl/osx/salframe.cxx index 4c9f891881eb..6288c44b2ab1 100644 --- a/vcl/osx/salframe.cxx +++ b/vcl/osx/salframe.cxx @@ -1279,6 +1279,20 @@ void AquaSalFrame::UpdateDarkMode() } } +bool AquaSalFrame::GetUseDarkMode() const +{ + if (!mpNSView) + return false; + bool bUseDarkMode(false); + if (@available(macOS 10.14, iOS 13, *)) + { + NSAppearanceName match = [mpNSView.effectiveAppearance bestMatchFromAppearancesWithNames: @[ + NSAppearanceNameAqua, NSAppearanceNameDarkAqua]]; + bUseDarkMode = [match isEqualToString: NSAppearanceNameDarkAqua]; + } + return bUseDarkMode; +} + // on OSX-Aqua the style settings are independent of the frame, so it does // not really belong here. Since the connection to the Appearance_Manager // is currently done in salnativewidgets.cxx this would be a good place. @@ -1309,13 +1323,7 @@ SAL_WNODEPRECATED_DECLARATIONS_POP StyleSettings aStyleSettings = rSettings.GetStyleSettings(); - bool bUseDarkMode(false); - if (@available(macOS 10.14, iOS 13, *)) - { - NSAppearanceName match = [mpNSView.effectiveAppearance bestMatchFromAppearancesWithNames: @[ - NSAppearanceNameAqua, NSAppearanceNameDarkAqua]]; - bUseDarkMode = [match isEqualToString: NSAppearanceNameDarkAqua]; - } + bool bUseDarkMode(GetUseDarkMode()); OUString sThemeName(!bUseDarkMode ? u"sukapura" : u"sukapura_dark"); aStyleSettings.SetPreferredIconTheme(sThemeName, bUseDarkMode); diff --git a/vcl/source/app/settings.cxx b/vcl/source/app/settings.cxx index 5cb172ab8276..313aacfce155 100644 --- a/vcl/source/app/settings.cxx +++ b/vcl/source/app/settings.cxx @@ -2783,6 +2783,14 @@ void MiscSettings::SetDarkMode(int nMode) } } +bool MiscSettings::GetUseDarkMode() +{ + vcl::Window* pDefWindow = ImplGetDefaultWindow(); + if (pDefWindow == nullptr) + return false; + return pDefWindow->ImplGetFrame()->GetUseDarkMode(); +} + int MiscSettings::GetAppColorMode() { if (utl::ConfigManager::IsFuzzing()) diff --git a/vcl/unx/gtk3/gtkframe.cxx b/vcl/unx/gtk3/gtkframe.cxx index 519d520a52f6..4f8a7d46897d 100644 --- a/vcl/unx/gtk3/gtkframe.cxx +++ b/vcl/unx/gtk3/gtkframe.cxx @@ -1370,6 +1370,16 @@ void GtkSalFrame::SetColorScheme(GVariant* variant) g_object_set(pSettings, "gtk-application-prefer-dark-theme", bDarkIconTheme, nullptr); } +bool GtkSalFrame::GetUseDarkMode() const +{ + if (!m_pWindow) + return false; + GtkSettings* pSettings = gtk_widget_get_settings(m_pWindow); + gboolean bDarkIconTheme = false; + g_object_get(pSettings, "gtk-application-prefer-dark-theme", &bDarkIconTheme, nullptr); + return bDarkIconTheme; +} + static void settings_portal_changed_cb(GDBusProxy*, const char*, const char* signal_name, GVariant* parameters, gpointer frame) { diff --git a/vcl/win/window/salframe.cxx b/vcl/win/window/salframe.cxx index 48a251c38e86..2ab3ef3c56ca 100644 --- a/vcl/win/window/salframe.cxx +++ b/vcl/win/window/salframe.cxx @@ -3110,6 +3110,11 @@ void WinSalFrame::UpdateDarkMode() ::UpdateDarkMode(mhWnd); } +bool WinSalFrame::GetUseDarkMode() const +{ + return UseDarkMode(); +} + static bool ImplHandleMouseMsg( HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam ) {