Skip to content

Commit

Permalink
Background: Cleanup (#1776)
Browse files Browse the repository at this point in the history
  • Loading branch information
lenemter authored Oct 24, 2023
1 parent 031e210 commit 6cc8360
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 84 deletions.
1 change: 1 addition & 0 deletions data/gala.metainfo.xml.in
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
</ul>
</description>
<issues>
<issue url="https://github.com/elementary/gala/issues/1774">Scheduled switch to dark style does not dim the wallpaper after cold reboot on elementary OS 7.1</issue>
<issue url="https://github.com/elementary/gala/issues/1261">Alt + Shift unnecessarily blocked when there is only one keyboard layout</issue>
</issues>
</release>
Expand Down
6 changes: 3 additions & 3 deletions src/Background/Background.vala
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ namespace Gala {
var cache = BackgroundCache.get_default ();

foreach (var watch in file_watches.values) {
SignalHandler.disconnect (cache, watch);
cache.disconnect (watch);
}

background_source.changed.disconnect (settings_changed);
Expand Down Expand Up @@ -179,7 +179,7 @@ namespace Gala {
} else {
ulong handler = 0;
handler = image.loaded.connect (() => {
SignalHandler.disconnect (image, handler);
image.disconnect (handler);
if (--num_pending_images == 0) {
finish_animation (files);
}
Expand Down Expand Up @@ -237,7 +237,7 @@ namespace Gala {
ulong handler = 0;
handler = image.loaded.connect (() => {
set_loaded ();
SignalHandler.disconnect (image, handler);
image.disconnect (handler);
});
}
}
Expand Down
88 changes: 13 additions & 75 deletions src/Background/BackgroundManager.vala
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@

namespace Gala {
public class BackgroundManager : Meta.BackgroundGroup {
private const string GALA_BACKGROUND_SCHEMA = "io.elementary.desktop.background";
private const string DIM_WALLPAPER_KEY = "dim-wallpaper-in-dark-style";
private const double DIM_OPACITY = 0.55;
private const int FADE_ANIMATION_TIME = 1000;

Expand All @@ -32,18 +30,10 @@ namespace Gala {
private Meta.BackgroundActor background_actor;
private Meta.BackgroundActor? new_background_actor = null;

private Clutter.PropertyTransition? last_dim_transition = null;

private static Settings gala_background_settings;

public BackgroundManager (Meta.Display display, int monitor_index, bool control_position = true) {
Object (display: display, monitor_index: monitor_index, control_position: control_position);
}

static construct {
gala_background_settings = new Settings (GALA_BACKGROUND_SCHEMA);
}

construct {
background_source = BackgroundCache.get_default ().get_background_source (display);
background_actor = create_background_actor ();
Expand Down Expand Up @@ -120,7 +110,7 @@ namespace Gala {

ulong handler = 0;
handler = background.loaded.connect (() => {
SignalHandler.disconnect (background, handler);
background.disconnect (handler);
background.set_data<ulong> ("background-loaded-handler", 0);

swap_background_actor (animate);
Expand All @@ -138,17 +128,18 @@ namespace Gala {
var background = background_source.get_background (monitor_index);
var background_actor = new Meta.BackgroundActor (display, monitor_index);

((Meta.BackgroundContent)background_actor.content).background = background.background;
((Meta.BackgroundContent)background_actor.content).vignette = true;
unowned var content = (Meta.BackgroundContent) background_actor.content;
content.background = background.background;

// Don't play dim animation when launching gala or switching wallpaper
if (should_dim ()) {
((Meta.BackgroundContent)background_actor.content).brightness = DIM_OPACITY;
if (background_source.should_dim) {
// It doesn't work without Idle :(
Idle.add (() => {
content.vignette = true;
content.brightness = DIM_OPACITY;
return Source.REMOVE;
});
}

Granite.Settings.get_default ().notify["prefers-color-scheme"].connect (update_dim_wallpaper);
gala_background_settings.changed[DIM_WALLPAPER_KEY].connect (update_dim_wallpaper);

insert_child_below (background_actor, null);

var monitor = display.get_monitor_geometry (monitor_index);
Expand All @@ -160,78 +151,25 @@ namespace Gala {

ulong changed_handler = 0;
changed_handler = background.changed.connect (() => {
SignalHandler.disconnect (background, changed_handler);
background.disconnect (changed_handler);
changed_handler = 0;
update_background_actor ();
});

background_actor.destroy.connect (() => {
if (changed_handler != 0) {
SignalHandler.disconnect (background, changed_handler);
background.disconnect (changed_handler);
changed_handler = 0;
}

var loaded_handler = background.get_data<ulong> ("background-loaded-handler");
if (loaded_handler != 0) {
SignalHandler.disconnect (background, loaded_handler);
background.disconnect (loaded_handler);
background.set_data<ulong> ("background-loaded-handler", 0);
}
});

return background_actor;
}

private bool should_dim () {
return (
Granite.Settings.get_default ().prefers_color_scheme == Granite.Settings.ColorScheme.DARK &&
gala_background_settings.get_boolean (DIM_WALLPAPER_KEY)
);
}

// OpacityDimActor is used for transitioning background actor's vignette brightness
// In mutter 3.38+ vignette's properties are contained in Meta.BackgroundContent
// which doesn't support transitions
// so we bind OpacityDimActor.opacity to ((Meta.BackgroundContent) background_actor.content).brightness
// and then create transition for OpacityDimActor.opacity

private class OpacityDimActor : Clutter.Actor {
public new double opacity { get; set; }
}

private void update_dim_wallpaper () {
if (last_dim_transition != null) {
last_dim_transition.stop ();
}

var dim_actor = new OpacityDimActor ();
background_actor.add_child (dim_actor);
var binding = dim_actor.bind_property (
"opacity",
(Meta.BackgroundContent) background_actor.content,
"brightness",
BindingFlags.DEFAULT
);

var transition = new Clutter.PropertyTransition ("opacity");
transition.set_from_value (
((Meta.BackgroundContent) background_actor.content).brightness
);
transition.set_to_value (should_dim () ? DIM_OPACITY : 1.0);
transition.duration = FADE_ANIMATION_TIME;
transition.progress_mode = Clutter.AnimationMode.EASE_OUT_QUAD;
transition.remove_on_complete = true;
transition.completed.connect (() => {
binding.unbind ();

background_actor.remove_child (dim_actor);
dim_actor.destroy ();

changed ();
});

dim_actor.add_transition ("wallpaper-dim", transition);

last_dim_transition = transition;
}
}
}
23 changes: 17 additions & 6 deletions src/Background/BackgroundSource.vala
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ namespace Gala {
// list of keys that are actually relevant for us
private const string[] OPTIONS = {
"color-shading-type",
"picture-opacity",
"picture-options",
"picture-uri",
"picture-uri-dark",
Expand All @@ -31,13 +30,23 @@ namespace Gala {
public signal void changed ();

public Meta.Display display { get; construct; }
public GLib.Settings gnome_background_settings { get; construct; }
public GLib.Settings gnome_background_settings { get; private set; }

internal int use_count { get; set; default = 0; }

private GLib.HashTable<int, Background> backgrounds;
private uint[] hash_cache;
private Meta.MonitorManager? monitor_manager;
private GLib.Settings gala_background_settings;

public bool should_dim {
get {
return (
Granite.Settings.get_default ().prefers_color_scheme == DARK &&
gala_background_settings.get_boolean ("dim-wallpaper-in-dark-style")
);
}
}

public BackgroundSource (Meta.Display display) {
Object (display: display);
Expand All @@ -50,7 +59,12 @@ namespace Gala {
monitor_manager = display.get_context ().get_backend ().get_monitor_manager ();
monitor_manager.monitors_changed.connect (monitors_changed);

gnome_background_settings = new Settings ("org.gnome.desktop.background");
gala_background_settings = new GLib.Settings ("io.elementary.desktop.background");
gala_background_settings.changed["dim-wallpaper-in-dark-style"].connect (() => changed ());

Granite.Settings.get_default ().notify["prefers-color-scheme"].connect (() => changed ());

gnome_background_settings = new GLib.Settings ("org.gnome.desktop.background");

// unfortunately the settings sometimes tend to fire random changes even though
// nothing actually happened. The code below is used to prevent us from spamming
Expand All @@ -71,9 +85,6 @@ namespace Gala {
}
}
});

unowned var granite_settings = Granite.Settings.get_default ();
granite_settings.notify["prefers-color-scheme"].connect (() => changed ());
}

private void monitors_changed () {
Expand Down

0 comments on commit 6cc8360

Please sign in to comment.