diff options
| author | AlexanderCurl <alexc@alexc.hu> | 2026-04-18 17:46:06 +0100 |
|---|---|---|
| committer | AlexanderCurl <alexc@alexc.hu> | 2026-04-18 17:46:06 +0100 |
| commit | 70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69 (patch) | |
| tree | ab1123d4067c1b086dd6faa7ee4ea643236b565a /raveos-gnome-theme/theme-data/extensions/installed/blur-my-shell@aunetx/conveniences/pipelines_manager.js | |
| parent | 5d94c0a7d44a2255b81815a52a7056a94a39842d (diff) | |
| download | RaveOS-PKGBUILD-70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69.tar.gz RaveOS-PKGBUILD-70ca3fef77ee8bdc6e3ac28589a6fa08c024cc69.zip | |
Replaced file structures for themes in the correct format
Diffstat (limited to 'raveos-gnome-theme/theme-data/extensions/installed/blur-my-shell@aunetx/conveniences/pipelines_manager.js')
| -rw-r--r-- | raveos-gnome-theme/theme-data/extensions/installed/blur-my-shell@aunetx/conveniences/pipelines_manager.js | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/raveos-gnome-theme/theme-data/extensions/installed/blur-my-shell@aunetx/conveniences/pipelines_manager.js b/raveos-gnome-theme/theme-data/extensions/installed/blur-my-shell@aunetx/conveniences/pipelines_manager.js new file mode 100644 index 0000000..0fdfe9e --- /dev/null +++ b/raveos-gnome-theme/theme-data/extensions/installed/blur-my-shell@aunetx/conveniences/pipelines_manager.js @@ -0,0 +1,168 @@ +const Signals = imports.signals; + +/// The `PipelinesManager` object permits to store the list of pipelines and their effects in +/// memory. It is meant to *always* be in sync with the `org.gnome.shell.extensions.blur-my-shell`'s +/// `pipelines` gschema. However, we do not want to re-create every effect each time this schema is +/// changed, so the pipelines manager handles it, and dispatches the updates with targeted signals. +/// +/// It is only connected to ONE signal (the pipelines schema being changed), and emits numerous +/// which are connected to by both the different `Pipeline` objects in the extension, and by the +/// different pages of the extension preferences. +/// It emits three different types of signals: +/// +/// - general changes to the pipelines list, connected to by the extension preferences: +/// - `pipeline-list-changed`, when the list of pipelines has changed (by creation or deletion) +/// - `pipeline-names-changed`, when the name of a pipeline is changed +/// +/// - signals that are targeted towards a given pipeline, with `pipeline_id` being its unique id: +/// - `'pipeline_id'::pipeline-updated`, handing a new pipeline descriptor object, when the +/// pipeline has been changed quite a bit (added/destroyed/reordered the effects) +/// - `'pipeline_id'::pipeline-destroyed`, when the pipeline has been destroyed +/// - `'pipeline_id'::pipeline-renamed`, handing the new name, when the pipeline has been +/// renamed, which is only important for the preferences +/// +/// - signals that are targeted towards a given effect, with `effect_id` being its unique id, and +/// `pipeline_id` the unique id of the pipeline it is attached to: +/// - `'pipeline_id'::effect-'effect_id'-key-removed`, handing the key that was removed +/// - `'pipeline_id'::effect-'effect_id'-key-updated`, handing the key that was changed and its +/// new value +/// - `'pipeline_id'::effect-'effect_id'-key-added`, handing the key that was added and its +/// value +export class PipelinesManager { + constructor(settings) { + this.settings = settings; + this.pipelines = this.settings.PIPELINES; + this.settings.PIPELINES_changed(_ => this.on_pipeline_update()); + } + + create_pipeline(name, effects = []) { + // select a random id for the pipeline + let id = "pipeline_" + ("" + Math.random()).slice(2, 16); + // add a random ID for each effect, to help tracking them + effects.forEach(effect => effect.id = "effect_" + ("" + Math.random()).slice(2, 16)); + + this.pipelines[id] = { name, effects }; + this.settings.PIPELINES = this.pipelines; + this._emit('pipeline-created', id, this.pipelines[id]); + this._emit('pipeline-list-changed'); + return id; + } + + duplicate_pipeline(id) { + if (!(id in this.pipelines)) { + this._warn(`could not duplicate pipeline, id ${id} does not exist`); + return; + } + const pipeline = this.pipelines[id]; + this.create_pipeline(pipeline.name + " - duplicate", [...pipeline.effects]); + this.settings.PIPELINES = this.pipelines; + } + + delete_pipeline(id) { + if (!(id in this.pipelines)) { + this._warn(`could not delete pipeline, id ${id} does not exist`); + return; + } + if (id == "pipeline_default") { + this._warn(`could not delete pipeline "pipeline_default" as it is immutable`); + return; + } + delete this.pipelines[id]; + this.settings.PIPELINES = this.pipelines; + this._emit(id + '::pipeline-destroyed'); + this._emit('pipeline-list-changed'); + } + + update_pipeline_effects(id, effects, emit_update_signal = true) { + if (!(id in this.pipelines)) { + this._warn(`could not update pipeline effects, id ${id} does not exist`); + return; + } + this.pipelines[id].effects = [...effects]; + this.settings.PIPELINES = this.pipelines; + if (emit_update_signal) + this._emit(id + '::pipeline-updated'); + } + + rename_pipeline(id, name) { + if (!(id in this.pipelines)) { + this._warn(`could not rename pipeline, id ${id} does not exist`); + return; + } + this.pipelines[id].name = name.slice(); + this.settings.PIPELINES = this.pipelines; + this._emit(id + '::pipeline-renamed', name); + this._emit('pipeline-names-changed'); + } + + on_pipeline_update() { + const old_pipelines = this.pipelines; + this.pipelines = this.settings.PIPELINES; + + for (var pipeline_id in old_pipelines) { + // if we find a pipeline that does not exist anymore, signal it + if (!(pipeline_id in this.pipelines)) { + this._emit(pipeline_id + '::pipeline-destroyed'); + continue; + } + + const old_pipeline = old_pipelines[pipeline_id]; + const new_pipeline = this.pipelines[pipeline_id]; + + // verify if both pipelines have effects in the same order + // if they have, then check for their parameters + if ( + old_pipeline.effects.length == new_pipeline.effects.length && + old_pipeline.effects.every((effect, i) => effect.id === new_pipeline.effects[i].id) + ) { + for (let i = 0; i < old_pipeline.effects.length; i++) { + const old_effect = old_pipeline.effects[i]; + const new_effect = new_pipeline.effects[i]; + const id = old_effect.id; + for (let key in old_effect.params) { + // if a key was removed, we emit to tell the effect to use the default value + if (!(key in new_effect.params)) + this._emit( + pipeline_id + '::effect-' + id + '-key-removed', key + ); + // if a key was updated, we emit to tell the effect to change its value + else if (old_effect.params[key] != new_effect.params[key]) + this._emit( + pipeline_id + '::effect-' + id + '-key-updated', key, new_effect.params[key] + ); + } + for (let key in new_effect.params) { + // if a key was added, we emit to tell the effect the key and its value + if (!(key in old_effect.params)) + this._emit( + pipeline_id + '::effect-' + id + '-key-added', key, new_effect.params[key] + ); + } + } + } + // if either the order has changed, or there are new effects, then rebuild it + else + this._emit(pipeline_id + '::pipeline-updated', new_pipeline); + } + } + + destroy() { + this.settings.PIPELINES_disconnect(); + } + + _emit(signal, ...args) { + this.emit(signal, ...args); + this._log(`signal: '${signal}', arguments: ${args}`); + } + + _log(str) { + if (this.settings.DEBUG) + console.log(`[Blur my Shell > pipelines] ${str}`); + } + + _warn(str) { + console.warn(`[Blur my Shell > pipelines] ${str}`); + } +} + +Signals.addSignalMethods(PipelinesManager.prototype);
\ No newline at end of file |