From f04295b32bad55275393294928cc65fa07aa96a7 Mon Sep 17 00:00:00 2001 From: Simon Schneegans Date: Sun, 9 Jan 2022 21:18:01 +0100 Subject: [PATCH] :wrench: Add transiation tweaking --- extension.js | 46 +++++++++++++++++---------------------------- prefs.js | 16 ++++++++-------- src/FireEffect.js | 18 ++++++++++++++++++ src/MatrixEffect.js | 18 ++++++++++++++++++ src/TRexEffect.js | 20 ++++++++++++++++++++ src/TVEffect.js | 18 ++++++++++++++++++ 6 files changed, 99 insertions(+), 37 deletions(-) diff --git a/extension.js b/extension.js index e831235..12c9ff8 100644 --- a/extension.js +++ b/extension.js @@ -24,7 +24,7 @@ const Me = imports.misc.extensionUtils.getCurrentExtension(); const utils = Me.imports.src.utils; const FireEffect = Me.imports.src.FireEffect.FireEffect; -const EFFECT_TYPES = [ +const ALL_EFFECTS = [ Me.imports.src.FireEffect.FireEffect, Me.imports.src.MatrixEffect.MatrixEffect, Me.imports.src.TRexEffect.TRexEffect, @@ -136,39 +136,27 @@ class Extension { return; } - // If there's a transition in progress, we re-target these transitions so that the - // window is neither scaled nor faded. - const tweakTransition = (property, value) => { - const transition = actor.get_transition(property); - if (transition) { - transition.set_to(value); - transition.set_progress_mode(Clutter.AnimationMode.EASE_OUT_QUAD); - transition.set_duration(1500); + // Choose a random effect. + const enabledEffects = []; + ALL_EFFECTS.forEach(Effect => { + const [minMajor, minMinor] = Effect.getMinShellVersion(); + const prefix = Effect.getSettingsPrefix(); + if (utils.shellVersionIsAtLeast(minMajor, minMinor) && + this._settings.get_boolean(`${prefix}-close-effect`)) { + enabledEffects.push(Effect); } - }; + }); - tweakTransition('opacity', 255); - tweakTransition('scale-x', 1); - tweakTransition('scale-y', 1); + if (enabledEffects.length == 0) { + return; + } - let shader = null; + const Effect = enabledEffects[Math.floor(Math.random() * enabledEffects.length)]; + + Effect.tweakTransitions(actor, this._settings); // Add a cool shader to our window actor! - // const mode = this._settings.get_enum('close-animation'); - // if (mode == 1) { - shader = FireEffect.createShader(this._settings); - // } else if (mode == 2) { - // shader = new MatrixShader(this._settings); - // } else if (mode == 3) { - // shader = new TVEffectShader(this._settings); - // tweakTransition('scale-y', 0.5); - // } else if (mode == 4) { - // shader = new TRexShader(this._settings); - - // const warp = 0.5 * this._settings.get_double('claw-scratch-warp'); - // tweakTransition('scale-x', 1.0 + warp); - // tweakTransition('scale-y', 1.0 + warp); - // } + const shader = Effect.createShader(this._settings); if (shader) { actor.add_effect(shader); diff --git a/prefs.js b/prefs.js index d1f201e..82f4d40 100644 --- a/prefs.js +++ b/prefs.js @@ -19,7 +19,7 @@ const ExtensionUtils = imports.misc.extensionUtils; const Me = imports.misc.extensionUtils.getCurrentExtension(); const utils = Me.imports.src.utils; -const EFFECT_TYPES = [ +const ALL_EFFECTS = [ Me.imports.src.FireEffect.FireEffect, Me.imports.src.MatrixEffect.MatrixEffect, Me.imports.src.TRexEffect.TRexEffect, @@ -57,10 +57,10 @@ var PreferencesDialog = class PreferencesDialog { stack.add_titled( this._builder.get_object('general-prefs'), 'general', 'General Options'); - EFFECT_TYPES.forEach(Type => { - const [minMajor, minMinor] = Type.getMinShellVersion(); + ALL_EFFECTS.forEach(Effect => { + const [minMajor, minMinor] = Effect.getMinShellVersion(); if (utils.shellVersionIsAtLeast(minMajor, minMinor)) { - Type.initPreferences(this); + Effect.initPreferences(this); } }); @@ -107,11 +107,11 @@ var PreferencesDialog = class PreferencesDialog { const menu = this._builder.get_object('close-effect-menu'); - EFFECT_TYPES.forEach(Type => { - const [minMajor, minMinor] = Type.getMinShellVersion(); + ALL_EFFECTS.forEach(Effect => { + const [minMajor, minMinor] = Effect.getMinShellVersion(); if (utils.shellVersionIsAtLeast(minMajor, minMinor)) { - const prefix = Type.getSettingsPrefix(); - const label = Type.getLabel(); + const prefix = Effect.getSettingsPrefix(); + const label = Effect.getLabel(); const action = this._settings.create_action(`${prefix}-close-effect`); group.add_action(action); diff --git a/src/FireEffect.js b/src/FireEffect.js index 3a2a0ce..108e47c 100644 --- a/src/FireEffect.js +++ b/src/FireEffect.js @@ -215,6 +215,24 @@ var FireEffect = class FireEffect { return new FireShader(settings); } + // If there's a transition in progress, we re-target these transitions so that the + // window is neither scaled nor faded. + static tweakTransitions(actor, settings) { + const animationTime = settings.get_int('fire-animation-time'); + + const tweakTransition = (property, value) => { + const transition = actor.get_transition(property); + if (transition) { + transition.set_to(value); + transition.set_duration(animationTime); + } + }; + + tweakTransition('opacity', 255); + tweakTransition('scale-x', 1); + tweakTransition('scale-y', 1); + } + // ----------------------------------------------------------------------- private stuff // This populates the preset dropdown menu for the fire options. diff --git a/src/MatrixEffect.js b/src/MatrixEffect.js index 56a9235..ebae347 100644 --- a/src/MatrixEffect.js +++ b/src/MatrixEffect.js @@ -190,4 +190,22 @@ var MatrixEffect = class MatrixEffect { static createShader(settings) { return new MatrixShader(settings); } + + // If there's a transition in progress, we re-target these transitions so that the + // window is neither scaled nor faded. + static tweakTransitions(actor, settings) { + const animationTime = settings.get_int('matrix-animation-time'); + + const tweakTransition = (property, value) => { + const transition = actor.get_transition(property); + if (transition) { + transition.set_to(value); + transition.set_duration(animationTime); + } + }; + + tweakTransition('opacity', 255); + tweakTransition('scale-x', 1); + tweakTransition('scale-y', 1); + } } \ No newline at end of file diff --git a/src/TRexEffect.js b/src/TRexEffect.js index e302ac3..6d650f5 100644 --- a/src/TRexEffect.js +++ b/src/TRexEffect.js @@ -201,4 +201,24 @@ var TRexEffect = class TRexEffect { static createShader(settings) { return new TRexShader(settings); } + + // If there's a transition in progress, we re-target these transitions so that the + // window is neither scaled nor faded. + static tweakTransitions(actor, settings) { + const animationTime = settings.get_int('trex-animation-time'); + + const tweakTransition = (property, value) => { + const transition = actor.get_transition(property); + if (transition) { + transition.set_to(value); + transition.set_duration(animationTime); + } + }; + + const warp = 0.5 * settings.get_double('claw-scratch-warp'); + + tweakTransition('opacity', 255); + tweakTransition('scale-x', 1.0 + warp); + tweakTransition('scale-y', 1.0 + warp); + } } \ No newline at end of file diff --git a/src/TVEffect.js b/src/TVEffect.js index 1d9d3f5..d8c8de7 100644 --- a/src/TVEffect.js +++ b/src/TVEffect.js @@ -130,4 +130,22 @@ var TVEffect = class TVEffect { static createShader(settings) { return new TVEffectShader(settings); } + + // If there's a transition in progress, we re-target these transitions so that the + // window is neither scaled nor faded. + static tweakTransitions(actor, settings) { + const animationTime = settings.get_int('tv-animation-time'); + + const tweakTransition = (property, value) => { + const transition = actor.get_transition(property); + if (transition) { + transition.set_to(value); + transition.set_duration(animationTime); + } + }; + + tweakTransition('opacity', 255); + tweakTransition('scale-x', 1); + tweakTransition('scale-y', 0.5); + } } \ No newline at end of file