Skip to content

Frosted glass shell, driven by gsettings - #4

Open
wayne-tbl wants to merge 12 commits into
FuriLabs:forkyfrom
wayne-tbl:glass-theme
Open

Frosted glass shell, driven by gsettings#4
wayne-tbl wants to merge 12 commits into
FuriLabs:forkyfrom
wayne-tbl:glass-theme

Conversation

@wayne-tbl

@wayne-tbl wayne-tbl commented Aug 16, 2026

Copy link
Copy Markdown

The frosted-glass look for the shell, built from gsettings keys rather than compiled into a stylesheet, and the client side of phoc's background blur.

Updated at review request: phosh's own stylesheets are no longer touched. common.css, adwaita-dark.css and adwaita-hc-light.css are byte-identical to forky on this branch. The glass is a set of whole stylesheets of its own — common-furios.css, adwaita-dark-furios.css, adwaita-hc-light-furios.css, adwaita-light-furios.css — loaded in their place only when the user asks for the theme.

The switch

glass-theme is a new boolean, off by default. With it off, phosh is left exactly as it is: phosh_style_manager_get_stylesheet() picks the sheet the way it does today, the generated CSS contains only the two accent colours phosh generates itself, gtk-application-prefer-dark-theme is not touched, no surface asks the compositor for blur, and the generated ~/.config/gtk-4.0/gtk.css is removed so applications do not keep a look that is no longer in use. Turning it on and off again returns the shell to stock without a restart.

The one FuriOS behaviour that stays live either way is the free-form accent colour: it widens phosh's own accent setting rather than being part of the glass.

  • protocol: add the blur request to layer-shell-effects — version 4 of zphoc_layer_shell_effects_v1, in sync with phoc.
  • phosh-wayland: bind layer-shell-effects version 4
  • layersurface: ask the compositor to blur the background — mirrors the alpha surface. The FuriOS global is bound only if the compositor offers it, and is deliberately left out of the "lacks needed globals" fatal check, so the shell still starts against a stock phoc and simply gets no blur.
  • util: add the glass gsettings keys / data: add the glass gsettings keys — the io.furios.phosh.shell keys: the glass-theme switch itself, blur radius, glass opacity, lightness and accent wash, text and shadow colours, and a free-form accent that overrides the nine swatches. The look is retuned with gsettings rather than by rebuilding a stylesheet.
  • stylesheet: add a frosted glass variant — translucent surfaces, soft shadows and inset hairline highlights on the drawer, notifications, media player and OSD, radii normalised. The panel is a single glass sheet: stacking translucent layers on each other is what made the drawer read as solid.
  • stylesheet: add a light glass variant — phosh has no light stylesheet of its own, so this one has no upstream counterpart to leave alone.
  • stylesheet: keep high contrast solid — glass is the opposite of what the high contrast variant is for, so its -furios copy puts the translucent surfaces back to opaque.
  • style-manager: build the shell's glass from the gsettings keys — loads the -furios sheets when the theme is on and follows org.gnome.desktop.interface color-scheme while it is, so the dark mode quick setting swaps the look live. Text is pure black on light and pure white on dark, because what sits behind it is a wallpaper the theme knows nothing about; the shadow takes the opposite of the text colour actually in use rather than of the scheme.
  • style-manager: generate a GTK4 stylesheet from the same keys
  • top-panel: ask for background blur — only while the theme is on: behind an opaque panel the blur would not show and the compositor would still pay for it.
  • lockscreen: frost the keypad page — only once the user has swiped up. The info page is a wallpaper with a clock on it and the lock screen sits above its own background surface, not above the running apps, so blurring it only makes the picture worse.

Two things worth a reviewer's eye. The -furios sheets are whole stylesheets rather than overlays on phosh's: it costs some duplication in common-furios.css, and buys a guarantee that with the theme off nothing of ours is in the cascade at all. And generating ~/.config/gtk-4.0/gtk.css is deliberately its own commit: it makes the theme phone-wide rather than shell-only, which is a decision worth taking separately from the shell theme. It refuses to touch a file it did not write, and applications pick changes up when they next start, since GTK4 reads the user stylesheet once and does not watch it.

Pairs with FuriLabs/phoc glass-theme, which implements the blur. Because of the version guard the two can land in either order — against a stock phoc the panels are translucent and simply not frosted.
Switched on from FuriLabs/gnome-control-center#6, which carries the toggle.

12 commits, off forky. Tested on an FLX1 across many boots, including rotation, dark/light switching and the accent swatches.

The blur request needs somewhere to live. Adding it to
zphoc_layer_shell_effects_v1 would mean editing a protocol phoc owns:
our version 4 and any version 4 phoc later defines would be two
different things under one name, and a client could not tell them
apart.

So define zphoc_furios_layer_shell_effects_v1 instead, in a file of our
own. Identical to the copy in phoc's tree, which is where the
compositor side of it lives; the two must stay in sync.

Signed-off-by: wayne <wayne@furilabs.com>
Binds zphoc_furios_layer_shell_effects_v1 when the compositor offers it
and leaves zphoc_layer_shell_effects_v1 bound at version 3, as before.

Unlike the phoc globals above it this one is optional and deliberately
absent from the "lacks needed globals" check: phosh has to keep running
against a compositor without it, just without blur.

Signed-off-by: wayne <wayne@furilabs.com>
phosh_layer_surface_set_blur() requests a blur radius for the surface's
backdrop. The radius is remembered before map and applied once the
surface exists, mirroring how alpha is handled.

The request goes to zphoc_furios_layer_shell_effects_v1, our own global,
so a compositor that does not offer it simply leaves blur_surface NULL
and set_blur() does nothing.

Signed-off-by: wayne <wayne@furilabs.com>
The io.furios.phosh.shell keys the look is built from, shared between the
style manager that turns them into colours and the surfaces that ask the
compositor for blur.

Signed-off-by: wayne <wayne@furilabs.com>
A switch for the glass theme itself, off by default, so phosh keeps its
own look until it is asked for. Then blur radius, glass opacity,
lightness and accent wash, the text and shadow colours, and a free-form
accent that overrides the nine swatches. The look is retuned with
gsettings rather than by rebuilding a stylesheet.

Signed-off-by: wayne <wayne@furilabs.com>
Translucent surfaces, soft shadows and inset hairline highlights on the
drawer, notifications, media player and OSD, with the radii normalised.
The panel is a single glass sheet: stacking translucent layers on top of
each other is what made the drawer read as solid.

Kept as whole stylesheets of their own -- common-furios.css and
adwaita-dark-furios.css -- rather than as edits to phosh's, so nothing
about the shell's own look changes until the glass theme is switched on
and these are loaded in their place.

Signed-off-by: wayne <wayne@furilabs.com>
phosh has no light stylesheet of its own, so this one has no upstream
counterpart to leave alone; it follows the -furios naming of the others
and is loaded when the colour scheme is light and the glass theme is on.

Signed-off-by: wayne <wayne@furilabs.com>
Glass is the opposite of what the high contrast variant is for, so the
-furios copy of it overrides the translucent surfaces back to opaque
ones. phosh's own adwaita-hc-light.css is left as it is.

Signed-off-by: wayne <wayne@furilabs.com>
Loads the -furios stylesheets in place of phosh's own when glass-theme is
set, and follows org.gnome.desktop.interface color-scheme while it is --
prefer-dark loads the dark variant, anything else the light one -- so the
dark mode quick setting swaps the look live. The glass colours are
computed from the keys rather than hard-coded. With the key unset none of
this runs: phosh's stylesheet is chosen exactly as it is without us, and
only the accent, which is phosh's own setting, is still generated.

Text is pure black on light and pure white on dark: what sits behind it is
a wallpaper the theme knows nothing about. The shadow takes the opposite
of the text colour actually in use rather than of the scheme.

Signed-off-by: wayne <wayne@furilabs.com>
Writes ~/.config/gtk-4.0/gtk.css so applications carry the shell's glass,
which makes the theme phone-wide rather than shell-only. It refuses to
touch a file it did not write, and applications pick changes up when they
next start -- GTK4 reads the user stylesheet once and does not watch it.
Switching the glass theme off takes the file away again, so applications
do not keep a look that is no longer in use.

Signed-off-by: wayne <wayne@furilabs.com>
Only while the glass theme is on: behind an opaque panel the blur would
not show, and the compositor would still pay for it.

Signed-off-by: wayne <wayne@furilabs.com>
Only once the user has swiped up to the keypad, and only with the glass
theme on. The info page is a wallpaper with a clock on it and there is
nothing behind it worth hiding: the lock screen sits above its own
background surface, not above the running apps. Blurring it only makes
the picture worse.

Signed-off-by: wayne <wayne@furilabs.com>
@wayne-tbl

Copy link
Copy Markdown
Author

The thirteen feature branches build merged. Three conflicts, all the same shape: two branches appending a key at the same spot in a gschema, and the paired signal handlers in phoc desktop.c. Each resolved by keeping both sides, no code change needed. Merged build runs phoc 17/17 and phosh 42/69, no new failure.

Installed and booted on an FLX1 and an FLX1s. With glass-theme off the shell is indistinguishable from a build without it. Blur cost is on FuriLabs/phoc#3.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant