96 lines
3.0 KiB
JavaScript
96 lines
3.0 KiB
JavaScript
|
import St from 'gi://St';
|
||
|
import Clutter from 'gi://Clutter';
|
||
|
|
||
|
/// A dummy `Pipeline`, for dynamic blur only.
|
||
|
/// Instead of a pipeline id, we take the settings of the component we want to blur.
|
||
|
export const DummyPipeline = class DummyPipeline {
|
||
|
constructor(effects_manager, settings, actor = null) {
|
||
|
this.effects_manager = effects_manager;
|
||
|
this.settings = settings;
|
||
|
this.effect = null;
|
||
|
this.attach_effect_to_actor(actor);
|
||
|
}
|
||
|
|
||
|
create_background_with_effect(
|
||
|
background_group,
|
||
|
widget_name
|
||
|
) {
|
||
|
// create the new actor
|
||
|
this.actor = new St.Widget({ name: widget_name });
|
||
|
|
||
|
this.attach_effect_to_actor(this.actor);
|
||
|
|
||
|
// a dummy `BackgroundManager`, just to access the pipeline easily
|
||
|
let bg_manager = new Clutter.Actor;
|
||
|
bg_manager.backgroundActor = this.actor;
|
||
|
bg_manager._bms_pipeline = this;
|
||
|
|
||
|
background_group.insert_child_at_index(this.actor, 0);
|
||
|
|
||
|
return [this.actor, bg_manager];
|
||
|
};
|
||
|
|
||
|
attach_effect_to_actor(actor) {
|
||
|
// set the actor
|
||
|
this.actor = actor;
|
||
|
if (!actor)
|
||
|
return;
|
||
|
|
||
|
// build the new effect to be added
|
||
|
this.build_effect({
|
||
|
unscaled_radius: 2 * this.settings.SIGMA,
|
||
|
brightness: this.settings.BRIGHTNESS,
|
||
|
});
|
||
|
|
||
|
// add the effect to the actor
|
||
|
if (this.actor)
|
||
|
this.actor.add_effect(this.effect);
|
||
|
else
|
||
|
this._warn(`could not add effect to actor, actor does not exist anymore`);
|
||
|
}
|
||
|
|
||
|
build_effect(params) {
|
||
|
// create the effect
|
||
|
this.effect = this.effects_manager.new_native_dynamic_gaussian_blur_effect(params);
|
||
|
|
||
|
// connect to settings changes, using the true gsettings object
|
||
|
this._sigma_changed_id = this.settings.settings.connect(
|
||
|
'changed::sigma', () => this.effect.unscaled_radius = 2 * this.settings.SIGMA
|
||
|
);
|
||
|
this._brightness_changed_id = this.settings.settings.connect(
|
||
|
'changed::brightness', () => this.effect.brightness = this.settings.BRIGHTNESS
|
||
|
);
|
||
|
}
|
||
|
|
||
|
repaint_effect() {
|
||
|
this.effect?.queue_repaint();
|
||
|
}
|
||
|
|
||
|
/// Remove every effect from the actor it is attached to. Please note that they are not
|
||
|
/// destroyed, but rather stored (thanks to the `EffectManager` class) to be reused later.
|
||
|
remove_effect() {
|
||
|
this.effects_manager.remove(this.effect);
|
||
|
this.effect = null;
|
||
|
|
||
|
if (this._sigma_changed_id)
|
||
|
this.settings.settings.disconnect(this._sigma_changed_id);
|
||
|
if (this._brightness_changed_id)
|
||
|
this.settings.settings.disconnect(this._brightness_changed_id);
|
||
|
delete this._sigma_changed_id;
|
||
|
delete this._brightness_changed_id;
|
||
|
}
|
||
|
|
||
|
/// Do nothing for this dummy pipeline.
|
||
|
/// Note: exposed to public API.
|
||
|
change_pipeline_to() { return; }
|
||
|
|
||
|
/// Note: exposed to public API.
|
||
|
destroy() {
|
||
|
this.remove_effect();
|
||
|
this.actor = null;
|
||
|
}
|
||
|
|
||
|
_warn(str) {
|
||
|
console.warn(`[Blur my Shell > dummy pip] ${str}`);
|
||
|
}
|
||
|
};
|