Add support for specifying both light and dark themes in settings.json (#7404)

This PR adds support for configuring both a light and dark theme in
`settings.json`.

In addition to accepting just a theme name, the `theme` field now also
accepts an object in the following form:

```jsonc
{
  "theme": {
    "mode": "system",
    "light": "One Light",
    "dark": "One Dark"
  }
}
```

Both `light` and `dark` are required, and indicate which theme should be
used when the system is in light mode and dark mode, respectively.

The `mode` field is optional and indicates which theme should be used:
- `"system"` - Use the theme that corresponds to the system's
appearance.
- `"light"` - Use the theme indicated by the `light` field.
- `"dark"` - Use the theme indicated by the `dark` field.

Thank you to @Yesterday17 for taking a first stab at this in #6881!

Release Notes:

- Added support for configuring both a light and dark theme and
switching between them based on system preference.
This commit is contained in:
Marshall Bowers 2024-02-05 15:39:01 -05:00 committed by GitHub
parent b59f925933
commit a80a3b8706
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 167 additions and 24 deletions

View file

@ -5,7 +5,7 @@ use futures::StreamExt;
use gpui::{prelude::*, AppContext, WindowHandle};
use settings::Settings;
use std::sync::{Arc, Weak};
use theme::ThemeSettings;
use theme::{SystemAppearance, ThemeSettings};
use ui::{prelude::*, Button, Label};
use util::ResultExt;
use workspace::AppState;
@ -35,6 +35,8 @@ pub fn init(app_state: &Arc<AppState>, cx: &mut AppContext) {
let options = notification_window_options(screen, window_size);
let window = cx
.open_window(options, |cx| {
SystemAppearance::init_for_window(cx);
cx.new_view(|_| {
IncomingCallNotification::new(
incoming_call.clone(),

View file

@ -6,7 +6,7 @@ use collections::HashMap;
use gpui::{AppContext, Size};
use settings::Settings;
use std::sync::{Arc, Weak};
use theme::ThemeSettings;
use theme::{SystemAppearance, ThemeSettings};
use ui::{prelude::*, Button, Label};
use workspace::AppState;
@ -28,6 +28,8 @@ pub fn init(app_state: &Arc<AppState>, cx: &mut AppContext) {
for screen in cx.displays() {
let options = notification_window_options(screen, window_size);
let window = cx.open_window(options, |cx| {
SystemAppearance::init_for_window(cx);
cx.new_view(|_| {
ProjectSharedNotification::new(
owner.clone(),