fix(webkit): prevent panic on non-GNOME systems in dark mode detection
- commit
- 86ddc8fcb01115b7c142dbc612f4edb7aa38ff3c
- author
- bnema · · 2025-10-23 21:11 UTC
- committer
- bnema · · 2025-10-23 21:14 UTC
- parent
- 47d05a1
- signature
- GPG Unverified
2B82207D370127A0The key is unknown
1 file · +17 -7
M pkg/webkit/helpers.go +17 -7
| @@ -241,16 +241,26 @@ func WidgetAllocation(w gtk.Widgetter) (x, y, width, height int) { | |||
| 241 | 241 | // PrefersDarkTheme checks if the system prefers dark theme | |
| 242 | 242 | func PrefersDarkTheme() bool { | |
| 243 | 243 | // First try to read GNOME's color-scheme setting (GTK4+) | |
| 244 | - | if gnomeSettings := gio.NewSettings("org.gnome.desktop.interface"); gnomeSettings != nil { | |
| 245 | - | colorScheme := gnomeSettings.String("color-scheme") | |
| 246 | - | if colorScheme == "prefer-dark" { | |
| 247 | - | return true | |
| 248 | - | } | |
| 249 | - | if colorScheme == "prefer-light" { | |
| 250 | - | return false | |
| 244 | + | // Check if the schema exists before attempting to create GSettings object | |
| 245 | + | // to avoid panics on non-GNOME systems (e.g., Sway, Hyprland, etc.) | |
| 246 | + | var colorScheme string | |
| 247 | + | schemaSource := gio.SettingsSchemaSourceGetDefault() | |
| 248 | + | if schemaSource != nil { | |
| 249 | + | schema := schemaSource.Lookup("org.gnome.desktop.interface", true) | |
| 250 | + | if schema != nil { | |
| 251 | + | if gnomeSettings := gio.NewSettings("org.gnome.desktop.interface"); gnomeSettings != nil { | |
| 252 | + | colorScheme = gnomeSettings.String("color-scheme") | |
| 253 | + | } | |
| 251 | 254 | } | |
| 252 | 255 | } | |
| 253 | 256 | ||
| 257 | + | switch colorScheme { | |
| 258 | + | case "prefer-dark": | |
| 259 | + | return true | |
| 260 | + | case "prefer-light": | |
| 261 | + | return false | |
| 262 | + | } | |
| 263 | + | ||
| 254 | 264 | // Fallback to GTK's application-level preference | |
| 255 | 265 | settings := gtk.SettingsGetDefault() | |
| 256 | 266 | if settings != nil { | |
| @@ -241,16 +241,26 @@ func WidgetAllocation(w gtk.Widgetter) (x, y, width, height int) { | |||||
| 241 | // PrefersDarkTheme checks if the system prefers dark theme | 241 | // PrefersDarkTheme checks if the system prefers dark theme | ||
| 242 | func PrefersDarkTheme() bool { | 242 | func PrefersDarkTheme() bool { | ||
| 243 | // First try to read GNOME's color-scheme setting (GTK4+) | 243 | // First try to read GNOME's color-scheme setting (GTK4+) | ||
| 244 | - | if gnomeSettings := gio.NewSettings("org.gnome.desktop.interface"); gnomeSettings != nil { | 244 | + | // Check if the schema exists before attempting to create GSettings object |
| 245 | - | colorScheme := gnomeSettings.String("color-scheme") | 245 | + | // to avoid panics on non-GNOME systems (e.g., Sway, Hyprland, etc.) |
| 246 | - | if colorScheme == "prefer-dark" { | 246 | + | var colorScheme string |
| 247 | - | return true | 247 | + | schemaSource := gio.SettingsSchemaSourceGetDefault() |
| 248 | - | } | 248 | + | if schemaSource != nil { |
| 249 | - | if colorScheme == "prefer-light" { | 249 | + | schema := schemaSource.Lookup("org.gnome.desktop.interface", true) |
| 250 | - | return false | 250 | + | if schema != nil { |
| 251 | + | if gnomeSettings := gio.NewSettings("org.gnome.desktop.interface"); gnomeSettings != nil { | |||
| 252 | + | colorScheme = gnomeSettings.String("color-scheme") | |||
| 253 | + | } | |||
| 251 | } | 254 | } | ||
| 252 | } | 255 | } | ||
| 253 | 256 | ||||
| 257 | + | switch colorScheme { | |||
| 258 | + | case "prefer-dark": | |||
| 259 | + | return true | |||
| 260 | + | case "prefer-light": | |||
| 261 | + | return false | |||
| 262 | + | } | |||
| 263 | + | ||||
| 254 | // Fallback to GTK's application-level preference | 264 | // Fallback to GTK's application-level preference | ||
| 255 | settings := gtk.SettingsGetDefault() | 265 | settings := gtk.SettingsGetDefault() | ||
| 256 | if settings != nil { | 266 | if settings != nil { | ||