diff options
Diffstat (limited to 'raveos-gnome-theme/theme-data/extensions/installed/blur-my-shell@aunetx/conveniences/effects_manager.js')
| -rw-r--r-- | raveos-gnome-theme/theme-data/extensions/installed/blur-my-shell@aunetx/conveniences/effects_manager.js | 68 |
1 files changed, 32 insertions, 36 deletions
diff --git a/raveos-gnome-theme/theme-data/extensions/installed/blur-my-shell@aunetx/conveniences/effects_manager.js b/raveos-gnome-theme/theme-data/extensions/installed/blur-my-shell@aunetx/conveniences/effects_manager.js index 947d535..8b99396 100644 --- a/raveos-gnome-theme/theme-data/extensions/installed/blur-my-shell@aunetx/conveniences/effects_manager.js +++ b/raveos-gnome-theme/theme-data/extensions/installed/blur-my-shell@aunetx/conveniences/effects_manager.js @@ -4,7 +4,7 @@ import { get_supported_effects } from '../effects/effects.js'; export const EffectsManager = class EffectsManager { constructor(connections) { this.connections = connections; - this.used = []; + this.used = new Set(); this.SUPPORTED_EFFECTS = get_supported_effects(); Object.keys(this.SUPPORTED_EFFECTS).forEach(effect_name => { @@ -15,60 +15,56 @@ export const EffectsManager = class EffectsManager { this['new_' + effect_name + '_effect'] = function (params) { let effect; if (this[effect_name + '_effects'].length > 0) { - effect = this[effect_name + '_effects'].splice(0, 1)[0]; + effect = this[effect_name + '_effects'].pop(); effect.set({ ...this.SUPPORTED_EFFECTS[effect_name].class.default_params, ...params }); - } else + } else { effect = new this.SUPPORTED_EFFECTS[effect_name].class({ ...this.SUPPORTED_EFFECTS[effect_name].class.default_params, ...params }); + this.connect_to_destroy(effect); + } - this.used.push(effect); - this.connect_to_destroy(effect); + this.used.add(effect); return effect; }; }); } connect_to_destroy(effect) { - effect.old_actor = effect.get_actor(); - if (effect.old_actor) - effect.old_actor_id = effect.old_actor.connect('destroy', _ => { - this.remove(effect, true); - }); - - this.connections.connect(effect, 'notify::actor', _ => { - let actor = effect.get_actor(); + const update_actor = () => { + const actor = effect.get_actor(); + if (actor === effect._bms_actor) + return; - if (effect.old_actor && actor != effect.old_actor) - effect.old_actor.disconnect(effect.old_actor_id); + this.disconnect_actor_destroy(effect); + effect._bms_actor = actor; + if (actor) + effect._bms_actor_destroy_id = actor.connect( + 'destroy', () => this.remove(effect, true) + ); + }; - if (actor && actor != effect.old_actor) { - effect.old_actor_id = actor.connect('destroy', _ => { - this.remove(effect, true); - }); - } - }); + this.connections.connect(effect, 'notify::actor', update_actor); + update_actor(); } - // IMPORTANT: do never call this in a mutable `this.used.forEach` - remove(effect, actor_already_destroyed = false) { - if (!actor_already_destroyed) - try { - effect.get_actor()?.remove_effect(effect); - } catch (e) { - this._warn(`could not remove the effect, continuing: ${e}`); - } - if (effect.old_actor) - effect.old_actor.disconnect(effect.old_actor_id); - delete effect.old_actor; - delete effect.old_actor_id; + disconnect_actor_destroy(effect) { + if (effect._bms_actor && effect._bms_actor_destroy_id) { + effect._bms_actor.disconnect(effect._bms_actor_destroy_id); + } + effect._bms_actor = null; + effect._bms_actor_destroy_id = null; + } - let index = this.used.indexOf(effect); - if (index >= 0) { - this.used.splice(index, 1); + remove(effect) { + const actor = effect.get_actor(); + if (actor) + actor.remove_effect(effect); + this.disconnect_actor_destroy(effect); + if (this.used.delete(effect)) { Object.keys(this.SUPPORTED_EFFECTS).forEach(effect_name => { if (effect instanceof this.SUPPORTED_EFFECTS[effect_name].class) this[effect_name + '_effects'].push(effect); |