Skip to content

Commit

Permalink
switch back to working variant detection from 2.4.x
Browse files Browse the repository at this point in the history
  • Loading branch information
dweymouth committed Jul 26, 2024
1 parent 49ad989 commit 2be50a9
Showing 1 changed file with 29 additions and 5 deletions.
34 changes: 29 additions & 5 deletions app/app_xdg.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ import (
"github.com/rymdport/portal/notification"
"github.com/rymdport/portal/openuri"
portalSettings "github.com/rymdport/portal/settings"
"github.com/rymdport/portal/settings/appearance"

"fyne.io/fyne/v2"
internalapp "fyne.io/fyne/v2/internal/app"
Expand All @@ -37,15 +36,38 @@ func (a *fyneApp) OpenURL(url *url.URL) error {

// fetch color variant from dbus portal desktop settings.
func findFreedesktopColorScheme() fyne.ThemeVariant {
colourScheme, err := appearance.GetColorScheme()
dbusConn, err := dbus.SessionBus()
if err != nil {
fyne.LogError("Unable to connect to session D-Bus", err)
return theme.VariantDark
}

dbusObj := dbusConn.Object("org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop")
call := dbusObj.Call(
"org.freedesktop.portal.Settings.Read",
dbus.FlagNoAutoStart,
"org.freedesktop.appearance",
"color-scheme",
)
if call.Err != nil {
// many desktops don't have this exported yet
return theme.VariantDark
}

var value uint8
if err = call.Store(&value); err != nil {
fyne.LogError("failed to read theme variant from D-Bus", err)
return theme.VariantDark
}

switch colourScheme {
case appearance.Light:
// See: https://github.com/flatpak/xdg-desktop-portal/blob/1.16.0/data/org.freedesktop.impl.portal.Settings.xml#L32-L46
// 0: No preference
// 1: Prefer dark appearance
// 2: Prefer light appearance
switch value {
case 2:
return theme.VariantLight
case appearance.Dark:
case 1:
return theme.VariantDark
default:
// Default to light theme to support Gnome's default see https://github.com/fyne-io/fyne/pull/3561
Expand Down Expand Up @@ -119,6 +141,8 @@ func watchTheme() {
go func() {
// with portal this may not be immediate, so we update a cache instead
internalapp.CurrentVariant.Store(uint64(findFreedesktopColorScheme()))
// ensure initial variant setting is applied at startup
fyne.CurrentApp().Settings().(*settings).setupTheme()

portalSettings.OnSignalSettingChanged(func(changed portalSettings.Changed) {
if changed.Namespace == "org.freedesktop.appearance" && changed.Key == "color-scheme" {
Expand Down

0 comments on commit 2be50a9

Please sign in to comment.