diff --git a/docs/changelog.md b/docs/changelog.md
index d3538d4..e7b781e 100644
--- a/docs/changelog.md
+++ b/docs/changelog.md
@@ -9,6 +9,10 @@ SPDX-License-Identifier: CC-BY-4.0
**Release Date:** TBD
+#### New Features
+
+- Added an option to choose a random color for the Fire effect each time a window is closed or opened. Thanks to [@jgarza9788](https://github.com/jgarza9788) for this contribution!
+
#### Bug Fixes
- Fixed an issue introduced by the GNOME 48 Beta release which caused some effects to break (Broken Glass, Matrix, Paint Brush, Snap of Disintegration, T-Rex Attack).
diff --git a/kwin/fire/config.ui b/kwin/fire/config.ui
index 509b83c..0999985 100755
--- a/kwin/fire/config.ui
+++ b/kwin/fire/config.ui
@@ -6,145 +6,152 @@ SPDX-License-Identifier: GPL-3.0-or-later
-->
- BMWConfigForm
-
-
-
- 0
- 0
- 562
- 365
-
-
-
- -
-
-
- Gradient
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
- -
-
-
- 100
-
-
- 9999
-
-
- 100
-
-
-
- -
-
-
- 0.100000000000000
-
-
- 10.000000000000000
-
-
-
- -
-
-
- Speed
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
- -
-
-
- -5.000000000000000
-
-
- 5.000000000000000
-
-
-
- -
-
-
- Scale
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
- -
-
-
-
-
-
- true
-
-
-
- -
-
-
- true
-
-
-
- -
-
-
- true
-
-
-
- -
-
-
- true
-
-
-
- -
-
-
- true
-
-
-
-
-
- -
-
-
- 3D Noise
-
-
-
- -
-
-
- Animation Time [ms]
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
-
+ BMWConfigForm
+
+
+
+ 0
+ 0
+ 562
+ 365
+
+
+
+ -
+
+
+ Animation Time [ms]
+
+
+ Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter
+
-
-
- KColorButton
- QPushButton
-
-
-
-
-
+
+ -
+
+
+ 100
+
+
+ 9999
+
+
+ 100
+
+
+
+ -
+
+
+ Scale
+
+
+ Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter
+
+
+
+ -
+
+
+ 0.100000000000000
+
+
+ 10.000000000000000
+
+
+
+ -
+
+
+ Speed
+
+
+ Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter
+
+
+
+ -
+
+
+ -5.000000000000000
+
+
+ 5.000000000000000
+
+
+
+ -
+
+
+ Gradient
+
+
+ Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter
+
+
+
+ -
+
+
-
+
+
+ true
+
+
+
+ -
+
+
+ true
+
+
+
+ -
+
+
+ true
+
+
+
+ -
+
+
+ true
+
+
+
+ -
+
+
+ true
+
+
+
+
+
+ -
+
+
+ 3D Noise
+
+
+
+ -
+
+
+ Use Random Color
+
+
+
+
+
+
+
+ KColorButton
+ QPushButton
+
+
+
+
+
diff --git a/kwin/fire/main.xml b/kwin/fire/main.xml
index 0ca4dc0..da48b7d 100755
--- a/kwin/fire/main.xml
+++ b/kwin/fire/main.xml
@@ -36,5 +36,8 @@ SPDX-License-Identifier: GPL-3.0-or-later
false
+
+ false
+
\ No newline at end of file
diff --git a/kwin/fire/onAnimationBegin.js b/kwin/fire/onAnimationBegin.js
new file mode 100644
index 0000000..fcc14a2
--- /dev/null
+++ b/kwin/fire/onAnimationBegin.js
@@ -0,0 +1,8 @@
+// SPDX-FileCopyrightText: Simon Schneegans
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// This part is automatically included in the effect's source during the build process.
+// The code below is called whenever a window is closed or opened.
+
+let seed = Math.random();
+effect.setUniform(this.shader, 'uSeed', seed);
diff --git a/kwin/fire/onSettingsChanged.js b/kwin/fire/onSettingsChanged.js
index 5490f4b..2e4ade8 100644
--- a/kwin/fire/onSettingsChanged.js
+++ b/kwin/fire/onSettingsChanged.js
@@ -8,6 +8,8 @@
effect.setUniform(this.shader, 'uDuration', this.duration * 0.001);
effect.setUniform(this.shader, 'u3DNoise',
effect.readConfig('3DNoise', true) ? 1.0 : 0.0);
+effect.setUniform(this.shader, 'uRandomColor',
+ effect.readConfig('RandomColor', true) ? 1.0 : 0.0);
effect.setUniform(this.shader, 'uScale', effect.readConfig('Scale', 1.0));
effect.setUniform(this.shader, 'uMovementSpeed', effect.readConfig('MovementSpeed', 1.0));
effect.setUniform(this.shader, 'uGradient1', this.readRGBAConfig('Gradient1'));
diff --git a/resources/shaders/fire.frag b/resources/shaders/fire.frag
index 06a6957..4ed281d 100644
--- a/resources/shaders/fire.frag
+++ b/resources/shaders/fire.frag
@@ -22,6 +22,8 @@ uniform vec4 uGradient2;
uniform vec4 uGradient3;
uniform vec4 uGradient4;
uniform vec4 uGradient5;
+uniform bool uRandomColor;
+uniform float uSeed;
// These may be configurable in the future.
const float EDGE_FADE = 70.0;
@@ -29,7 +31,7 @@ const float FADE_WIDTH = 0.1;
const float HIDE_TIME = 0.4;
// This maps the input value from [0..1] to a color from the gradient.
-vec4 getFireColor(float v) {
+vec4 getFireColor(float v, vec4 c0, vec4 c1, vec4 c2, vec4 c3, vec4 c4) {
float steps[5];
steps[0] = 0.0;
steps[1] = 0.2;
@@ -38,11 +40,11 @@ vec4 getFireColor(float v) {
steps[4] = 0.8;
vec4 colors[5];
- colors[0] = uGradient1;
- colors[1] = uGradient2;
- colors[2] = uGradient3;
- colors[3] = uGradient4;
- colors[4] = uGradient5;
+ colors[0] = c0;
+ colors[1] = c1;
+ colors[2] = c2;
+ colors[3] = c3;
+ colors[4] = c4;
if (v < steps[0]) {
return colors[0];
@@ -114,7 +116,25 @@ void main() {
noise *= effectMask.y;
// Map noise value to color.
- vec4 fire = getFireColor(noise);
+ vec4 fire = vec4(0.0);
+
+ if (uRandomColor) {
+ vec3 baseColor0 = offsetHue(vec3(1.0, 0.0, 0.0), hash11(uSeed));
+ vec3 baseColor1 = offsetHue(baseColor0, 0.1);
+ vec3 baseColor2 = offsetHue(baseColor1, 0.1);
+
+ // Hardcoding some alpha values.
+ vec4 c0 = vec4(baseColor0, 0.0);
+ vec4 c1 = vec4(baseColor0, 0.5);
+ vec4 c2 = vec4(baseColor1, 0.8);
+ vec4 c3 = vec4(baseColor1, 0.9);
+ vec4 c4 = vec4(baseColor2, 1.0);
+
+ fire = getFireColor(noise, c0, c1, c2, c3, c4);
+ } else {
+ fire =
+ getFireColor(noise, uGradient1, uGradient2, uGradient3, uGradient4, uGradient5);
+ }
// Get the window texture.
vec4 oColor = getInputColor(iTexCoord.st);
@@ -131,4 +151,4 @@ void main() {
// oColor = vec4(vec3(effectMask.y), 1);
setOutputColor(oColor);
-}
\ No newline at end of file
+}
diff --git a/resources/ui/adw/fire.ui b/resources/ui/adw/fire.ui
index 08d7e81..038f585 100644
--- a/resources/ui/adw/fire.ui
+++ b/resources/ui/adw/fire.ui
@@ -147,6 +147,28 @@ SPDX-License-Identifier: GPL-3.0-or-later
+
+
+
+
Gradient
@@ -206,4 +228,4 @@ SPDX-License-Identifier: GPL-3.0-or-later
-
\ No newline at end of file
+
diff --git a/schemas/org.gnome.shell.extensions.burn-my-windows-profile.gschema.xml b/schemas/org.gnome.shell.extensions.burn-my-windows-profile.gschema.xml
index 47cebb9..e6b87a4 100644
--- a/schemas/org.gnome.shell.extensions.burn-my-windows-profile.gschema.xml
+++ b/schemas/org.gnome.shell.extensions.burn-my-windows-profile.gschema.xml
@@ -242,6 +242,12 @@ SPDX-License-Identifier: CC0-1.0
The size of the fire.
+
+ false
+ use a random color for the fire
+ use a random color of the fire
+
+
false
Fire 3D Noise
@@ -1110,4 +1116,4 @@ SPDX-License-Identifier: CC0-1.0
-
\ No newline at end of file
+
diff --git a/src/effects/Fire.js b/src/effects/Fire.js
index f10e765..07f2c2d 100644
--- a/src/effects/Fire.js
+++ b/src/effects/Fire.js
@@ -12,6 +12,8 @@
// SPDX-FileCopyrightText: Simon Schneegans
// SPDX-License-Identifier: GPL-3.0-or-later
+// modified by Justin Garza
+
'use strict';
import Gio from 'gi://Gio';
@@ -58,6 +60,9 @@ export default class Effect {
shader._uScale = shader.get_uniform_location('uScale');
shader._uMovementSpeed = shader.get_uniform_location('uMovementSpeed');
+ shader._uRandomColor = shader.get_uniform_location('uRandomColor');
+ shader._uSeed = shader.get_uniform_location('uSeed');
+
// And update all uniforms at the start of each animation.
shader.connect('begin-animation', (shader, settings) => {
for (let i = 1; i <= 5; i++) {
@@ -68,6 +73,8 @@ export default class Effect {
// clang-format off
shader.set_uniform_float(shader._u3DNoise, 1, [settings.get_boolean('fire-3d-noise')]);
+ shader.set_uniform_float(shader._uRandomColor, 1, [settings.get_boolean('fire-random-color')]);
+ shader.set_uniform_float(shader._uSeed, 1, [Math.random()]);
shader.set_uniform_float(shader._uScale, 1, [settings.get_double('fire-scale')]);
shader.set_uniform_float(shader._uMovementSpeed, 1, [settings.get_double('fire-movement-speed')]);
// clang-format on
@@ -107,6 +114,7 @@ export default class Effect {
dialog.bindAdjustment('fire-movement-speed');
dialog.bindAdjustment('fire-scale');
dialog.bindSwitch('fire-3d-noise');
+ dialog.bindSwitch('fire-random-color');
dialog.bindColorButton('fire-color-1');
dialog.bindColorButton('fire-color-2');
dialog.bindColorButton('fire-color-3');
@@ -129,6 +137,33 @@ export default class Effect {
// Initialize the fire-preset dropdown.
Effect._createFirePresets(dialog);
}
+
+ // enables and disables the color buttons
+ function enableDisableColorButtons(dialog, state) {
+
+ for (let i = 1; i <= 5; i++) {
+ dialog.getBuilder().get_object('fire-color-' + i).set_sensitive(!state);
+ }
+ }
+
+ const switchWidget = dialog.getBuilder().get_object('fire-random-color');
+ if (switchWidget) {
+ // Connect to the "state-set" signal to update preferences dynamically based on
+ // the switch state.
+ switchWidget.connect('state-set', (widget, state) => {
+ enableDisableColorButtons(dialog,
+ state); // Update sensitivity when the state changes.
+ });
+
+ // Manually call the update function on startup, using the initial state of the
+ // switch.
+ const initialState =
+ switchWidget.get_active(); // Get the current state of the switch.
+ enableDisableColorButtons(dialog, initialState);
+ } else {
+ // Log an error if the switch widget is not found in the UI.
+ log('Error: \'fire-random-color\' switch widget not found.');
+ }
}
// ---------------------------------------------------------------- API for extension.js