diff --git a/README.md b/README.md
index 6231825..e5edae1 100644
--- a/README.md
+++ b/README.md
@@ -41,6 +41,7 @@ Effect | Preview
**Pixelate** Pixelate your windows and randomly hide pixels until the entire window is gone.|
**Pixel Wheel** This simple effect pixelates the window and hides the pixels in a wheel-like fashion.|
**Pixel Wipe** This effect pixelates the window and hides the pixels radially, starting from the pointer position.|
+**Portal** This ridiculous effect teleports your windows from and to alternative dimensions.|
**Snap of Disintegration** Dissolve your windows into a cloud of dust.|
**T-Rex Attack** Destroy your windows with a series of violent slashes!|
**TV-Effect** This is a very simple effect to demonstrate that this extension could also be used in a more professional environment. |
@@ -72,6 +73,7 @@ Below is a table which summarizes the current availability for all effects.
Pixelate
✅
✅
✅
✅
✅
✅
✅
Pixel Wheel
✅
✅
✅
✅
✅
✅
✅
Pixel Wipe
✅
✅
✅
✅
✅
✅
✅
+
Portal
✅
✅
✅
✅
✅
✅
✅
Snap of Disintegration
✅
✅
✅
✅
T-Rex Attack
✅
✅
✅
✅
TV-Effect
✅
✅
✅
✅
✅
✅
✅
diff --git a/docs/changelog.md b/docs/changelog.md
index f52dcbe..343686e 100644
--- a/docs/changelog.md
+++ b/docs/changelog.md
@@ -5,6 +5,14 @@ SPDX-License-Identifier: CC-BY-4.0
# Changelog of the Burn-My-Windows Extension
+## [Burn My Windows 23](https://github.com/schneegans/Burn-My-Windows/releases/tag/v23)
+
+**Release Date:** TBD
+
+#### New Features
+
+* **New Effect: Portal.** This ridiculous effect teleports your windows from and to alternative dimensions. It may resemble the portal from a well-known cartoon series...
+
## [Burn My Windows 22](https://github.com/schneegans/Burn-My-Windows/releases/tag/v22)
**Release Date:** 2022-11-09
diff --git a/docs/pics/portal.gif b/docs/pics/portal.gif
new file mode 100644
index 0000000..ce03957
Binary files /dev/null and b/docs/pics/portal.gif differ
diff --git a/extension.js b/extension.js
index 2f33920..c8c0b5d 100644
--- a/extension.js
+++ b/extension.js
@@ -64,6 +64,7 @@ class Extension {
new Me.imports.src.Pixelate.Pixelate(),
new Me.imports.src.PixelWheel.PixelWheel(),
new Me.imports.src.PixelWipe.PixelWipe(),
+ new Me.imports.src.Portal.Portal(),
new Me.imports.src.SnapOfDisintegration.SnapOfDisintegration(),
new Me.imports.src.TRexAttack.TRexAttack(),
new Me.imports.src.TVEffect.TVEffect(),
diff --git a/kwin/build.sh b/kwin/build.sh
index e6b37d5..1916e8b 100755
--- a/kwin/build.sh
+++ b/kwin/build.sh
@@ -138,6 +138,7 @@ generate "incinerate" "Incinerate [Burn-My-Windows]" "A less snappy but defini
generate "pixelate" "Pixelate [Burn-My-Windows]" "Pixelate the window and randomly hide the pixels"
generate "pixel-wheel" "Pixel Wheel [Burn-My-Windows]" "Pixelate the window and hide the pixels in a wheel-like fashion"
generate "pixel-wipe" "Pixel Wipe [Burn-My-Windows]" "Pixelate the window and hide the pixels radially, starting from the pointer position"
+generate "portal" "Portal [Burn-My-Windows]" "Transfer your windows to other locations in space and time"
generate "tv" "TV Effect [Burn-My-Windows]" "Make windows close like turning off a TV"
generate "wisps" "Wisps [Burn-My-Windows]" "Let your windows be carried away to the realm of dreams by these little fairies"
diff --git a/kwin/portal/config.ui b/kwin/portal/config.ui
new file mode 100755
index 0000000..2edc08c
--- /dev/null
+++ b/kwin/portal/config.ui
@@ -0,0 +1,149 @@
+
+
+
+
+
+ BMWConfigForm
+
+
+
+ 0
+ 0
+ 562
+ 365
+
+
+
+
+
+
+ Color:
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+ kcfg_Color
+
+
+
+
+
+
+ Duration:
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+
+ Rotation Speed
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+
+ milliseconds
+
+
+ 500
+
+
+ 5000
+
+
+ 100
+
+
+
+
+
+
+ true
+
+
+
+
+
+
+ Whirling
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+
+ Details
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+
+
+
+ 1.000000000000000
+
+
+ 100.000000000000000
+
+
+
+
+
+
+ -2.000000000000000
+
+
+ 2.000000000000000
+
+
+ 0.100000000000000
+
+
+ QAbstractSpinBox::AdaptiveDecimalStepType
+
+
+
+
+
+
+ -2.000000000000000
+
+
+ 2.000000000000000
+
+
+ 0.100000000000000
+
+
+ QAbstractSpinBox::AdaptiveDecimalStepType
+
+
+
+
+
+
+
+ KColorButton
+ QPushButton
+ kcolorbutton.h
+
+
+
+
+
diff --git a/kwin/portal/main.xml b/kwin/portal/main.xml
new file mode 100755
index 0000000..e8e233a
--- /dev/null
+++ b/kwin/portal/main.xml
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+ 1250
+
+
+ #79E918
+
+
+ 15.0
+
+
+ 0.3
+
+
+ 1.0
+
+
+
\ No newline at end of file
diff --git a/kwin/portal/onAnimationBegin.js b/kwin/portal/onAnimationBegin.js
new file mode 100644
index 0000000..dd56436
--- /dev/null
+++ b/kwin/portal/onAnimationBegin.js
@@ -0,0 +1,7 @@
+// 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.
+
+effect.setUniform(this.shader, 'uSeed', [Math.random(), Math.random()]);
diff --git a/kwin/portal/onSettingsChanged.js b/kwin/portal/onSettingsChanged.js
new file mode 100644
index 0000000..fcb2e56
--- /dev/null
+++ b/kwin/portal/onSettingsChanged.js
@@ -0,0 +1,12 @@
+// 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 the user changes something in the configuration of
+// the effect.
+
+effect.setUniform(this.shader, 'uDuration', this.duration * 0.001);
+effect.setUniform(this.shader, 'uColor', this.readRGBConfig('Color'));
+effect.setUniform(this.shader, 'uDetails', effect.readConfig('Details', 1.0));
+effect.setUniform(this.shader, 'uRotationSpeed', effect.readConfig('RotationSpeed', 1.0));
+effect.setUniform(this.shader, 'uWhirling', effect.readConfig('Whirling', 1.0));
diff --git a/po/burn-my-windows.pot b/po/burn-my-windows.pot
index f5f3ac0..7603fa6 100644
--- a/po/burn-my-windows.pot
+++ b/po/burn-my-windows.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: burn-my-windows\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-11-08 21:14+0100\n"
+"POT-Creation-Date: 2022-12-23 11:04+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -89,6 +89,10 @@ msgstr ""
msgid "Pixel Wipe"
msgstr ""
+#: src/Portal.js:89
+msgid "Portal"
+msgstr ""
+
#: src/SnapOfDisintegration.js:118
msgid "Snap of Disintegration"
msgstr ""
@@ -105,50 +109,50 @@ msgstr ""
msgid "Wisps"
msgstr ""
-#: prefs.js:120
+#: prefs.js:121
msgid "Effects"
msgstr ""
-#: prefs.js:162 resources/ui/gtk4/effectPage.ui:43
+#: prefs.js:163 resources/ui/gtk4/effectPage.ui:43
#: resources/ui/gtk3/effectPage.ui:43
msgid "Preview this effect"
msgstr ""
-#: prefs.js:197
+#: prefs.js:198
msgid "Use this effect when opening windows"
msgstr ""
-#: prefs.js:198
+#: prefs.js:199
msgid "Use this effect when closing windows"
msgstr ""
-#: prefs.js:224
+#: prefs.js:225
msgid "General Options"
msgstr ""
-#: prefs.js:318
+#: prefs.js:319
msgid "Gold Sponsors"
msgstr ""
-#: prefs.js:321
+#: prefs.js:322
msgid "Silver Sponsors"
msgstr ""
-#: prefs.js:324
+#: prefs.js:325
msgid "Bronze Sponsors"
msgstr ""
-#: prefs.js:327
+#: prefs.js:328
msgid "Past Sponsors"
msgstr ""
#. Translators: %s will be replaced by the effect's name.
-#: prefs.js:534
+#: prefs.js:535
#, javascript-format
msgid "Preview for %s"
msgstr ""
-#: prefs.js:556
+#: prefs.js:557
msgid "Close this Window to Preview the Effect!"
msgstr ""
@@ -188,13 +192,14 @@ msgstr ""
#: resources/ui/gtk4/Doom.ui:30 resources/ui/gtk4/TVEffect.ui:30
#: resources/ui/gtk4/EnergizeA.ui:30 resources/ui/gtk4/Hexagon.ui:30
#: resources/ui/gtk4/EnergizeB.ui:30 resources/ui/gtk4/Pixelate.ui:30
-#: resources/ui/gtk4/Apparition.ui:30 resources/ui/gtk3/Incinerate.ui:55
-#: resources/ui/gtk3/Wisps.ui:48 resources/ui/gtk3/Fire.ui:99
-#: resources/ui/gtk3/Glide.ui:69 resources/ui/gtk3/PixelWipe.ui:55
-#: resources/ui/gtk3/PixelWheel.ui:55 resources/ui/gtk3/Doom.ui:62
-#: resources/ui/gtk3/TVEffect.ui:41 resources/ui/gtk3/EnergizeA.ui:48
-#: resources/ui/gtk3/Hexagon.ui:55 resources/ui/gtk3/EnergizeB.ui:48
-#: resources/ui/gtk3/Pixelate.ui:55 resources/ui/gtk3/Apparition.ui:69
+#: resources/ui/gtk4/Apparition.ui:30 resources/ui/gtk4/Portal.ui:30
+#: resources/ui/gtk3/Incinerate.ui:55 resources/ui/gtk3/Wisps.ui:48
+#: resources/ui/gtk3/Fire.ui:99 resources/ui/gtk3/Glide.ui:69
+#: resources/ui/gtk3/PixelWipe.ui:55 resources/ui/gtk3/PixelWheel.ui:55
+#: resources/ui/gtk3/Doom.ui:62 resources/ui/gtk3/TVEffect.ui:41
+#: resources/ui/gtk3/EnergizeA.ui:48 resources/ui/gtk3/Hexagon.ui:55
+#: resources/ui/gtk3/EnergizeB.ui:48 resources/ui/gtk3/Pixelate.ui:55
+#: resources/ui/gtk3/Apparition.ui:69 resources/ui/gtk3/Portal.ui:62
#: resources/ui/adw/Matrix.ui:14 resources/ui/adw/BrokenGlass.ui:15
#: resources/ui/adw/Incinerate.ui:14 resources/ui/adw/Wisps.ui:14
#: resources/ui/adw/Fire.ui:30 resources/ui/adw/SnapOfDisintegration.ui:14
@@ -203,7 +208,7 @@ msgstr ""
#: resources/ui/adw/Doom.ui:14 resources/ui/adw/TVEffect.ui:14
#: resources/ui/adw/EnergizeA.ui:14 resources/ui/adw/Hexagon.ui:14
#: resources/ui/adw/EnergizeB.ui:15 resources/ui/adw/Pixelate.ui:14
-#: resources/ui/adw/Apparition.ui:15
+#: resources/ui/adw/Apparition.ui:15 resources/ui/adw/Portal.ui:14
msgid "Animation Time [ms]"
msgstr ""
@@ -240,32 +245,37 @@ msgstr ""
#: resources/ui/gtk4/prefs.ui:172 resources/ui/gtk4/prefs.ui:206
#: resources/ui/gtk4/Apparition.ui:58 resources/ui/gtk4/Apparition.ui:104
#: resources/ui/gtk4/Apparition.ui:150 resources/ui/gtk4/Apparition.ui:196
-#: resources/ui/gtk4/Apparition.ui:242 resources/ui/gtk3/Incinerate.ui:81
-#: resources/ui/gtk3/Incinerate.ui:130 resources/ui/gtk3/Incinerate.ui:179
-#: resources/ui/gtk3/Incinerate.ui:241 resources/ui/gtk3/Incinerate.ui:284
-#: resources/ui/gtk3/Wisps.ui:74 resources/ui/gtk3/Wisps.ui:123
-#: resources/ui/gtk3/Wisps.ui:166 resources/ui/gtk3/Fire.ui:125
-#: resources/ui/gtk3/Fire.ui:173 resources/ui/gtk3/Fire.ui:221
-#: resources/ui/gtk3/Fire.ui:283 resources/ui/gtk3/Fire.ui:351
-#: resources/ui/gtk3/Glide.ui:95 resources/ui/gtk3/Glide.ui:144
-#: resources/ui/gtk3/Glide.ui:193 resources/ui/gtk3/Glide.ui:242
-#: resources/ui/gtk3/Glide.ui:291 resources/ui/gtk3/PixelWipe.ui:81
-#: resources/ui/gtk3/PixelWipe.ui:130 resources/ui/gtk3/PixelWheel.ui:81
-#: resources/ui/gtk3/PixelWheel.ui:130 resources/ui/gtk3/PixelWheel.ui:179
-#: resources/ui/gtk3/Doom.ui:88 resources/ui/gtk3/Doom.ui:137
-#: resources/ui/gtk3/Doom.ui:186 resources/ui/gtk3/Doom.ui:235
-#: resources/ui/gtk3/TVEffect.ui:67 resources/ui/gtk3/TVEffect.ui:110
-#: resources/ui/gtk3/EnergizeA.ui:74 resources/ui/gtk3/EnergizeA.ui:123
-#: resources/ui/gtk3/EnergizeA.ui:166 resources/ui/gtk3/Hexagon.ui:81
-#: resources/ui/gtk3/Hexagon.ui:130 resources/ui/gtk3/Hexagon.ui:179
-#: resources/ui/gtk3/Hexagon.ui:222 resources/ui/gtk3/Hexagon.ui:265
-#: resources/ui/gtk3/Hexagon.ui:327 resources/ui/gtk3/EnergizeB.ui:74
-#: resources/ui/gtk3/EnergizeB.ui:123 resources/ui/gtk3/EnergizeB.ui:166
-#: resources/ui/gtk3/Pixelate.ui:81 resources/ui/gtk3/Pixelate.ui:130
-#: resources/ui/gtk3/Pixelate.ui:179 resources/ui/gtk3/prefs.ui:225
-#: resources/ui/gtk3/prefs.ui:269 resources/ui/gtk3/Apparition.ui:95
-#: resources/ui/gtk3/Apparition.ui:144 resources/ui/gtk3/Apparition.ui:193
-#: resources/ui/gtk3/Apparition.ui:242 resources/ui/gtk3/Apparition.ui:291
+#: resources/ui/gtk4/Apparition.ui:242 resources/ui/gtk4/Portal.ui:58
+#: resources/ui/gtk4/Portal.ui:104 resources/ui/gtk4/Portal.ui:150
+#: resources/ui/gtk4/Portal.ui:196 resources/ui/gtk4/Portal.ui:230
+#: resources/ui/gtk3/Incinerate.ui:81 resources/ui/gtk3/Incinerate.ui:130
+#: resources/ui/gtk3/Incinerate.ui:179 resources/ui/gtk3/Incinerate.ui:241
+#: resources/ui/gtk3/Incinerate.ui:284 resources/ui/gtk3/Wisps.ui:74
+#: resources/ui/gtk3/Wisps.ui:123 resources/ui/gtk3/Wisps.ui:166
+#: resources/ui/gtk3/Fire.ui:125 resources/ui/gtk3/Fire.ui:173
+#: resources/ui/gtk3/Fire.ui:221 resources/ui/gtk3/Fire.ui:283
+#: resources/ui/gtk3/Fire.ui:351 resources/ui/gtk3/Glide.ui:95
+#: resources/ui/gtk3/Glide.ui:144 resources/ui/gtk3/Glide.ui:193
+#: resources/ui/gtk3/Glide.ui:242 resources/ui/gtk3/Glide.ui:291
+#: resources/ui/gtk3/PixelWipe.ui:81 resources/ui/gtk3/PixelWipe.ui:130
+#: resources/ui/gtk3/PixelWheel.ui:81 resources/ui/gtk3/PixelWheel.ui:130
+#: resources/ui/gtk3/PixelWheel.ui:179 resources/ui/gtk3/Doom.ui:88
+#: resources/ui/gtk3/Doom.ui:137 resources/ui/gtk3/Doom.ui:186
+#: resources/ui/gtk3/Doom.ui:235 resources/ui/gtk3/TVEffect.ui:67
+#: resources/ui/gtk3/TVEffect.ui:110 resources/ui/gtk3/EnergizeA.ui:74
+#: resources/ui/gtk3/EnergizeA.ui:123 resources/ui/gtk3/EnergizeA.ui:166
+#: resources/ui/gtk3/Hexagon.ui:81 resources/ui/gtk3/Hexagon.ui:130
+#: resources/ui/gtk3/Hexagon.ui:179 resources/ui/gtk3/Hexagon.ui:222
+#: resources/ui/gtk3/Hexagon.ui:265 resources/ui/gtk3/Hexagon.ui:327
+#: resources/ui/gtk3/EnergizeB.ui:74 resources/ui/gtk3/EnergizeB.ui:123
+#: resources/ui/gtk3/EnergizeB.ui:166 resources/ui/gtk3/Pixelate.ui:81
+#: resources/ui/gtk3/Pixelate.ui:130 resources/ui/gtk3/Pixelate.ui:179
+#: resources/ui/gtk3/prefs.ui:225 resources/ui/gtk3/prefs.ui:269
+#: resources/ui/gtk3/Apparition.ui:95 resources/ui/gtk3/Apparition.ui:144
+#: resources/ui/gtk3/Apparition.ui:193 resources/ui/gtk3/Apparition.ui:242
+#: resources/ui/gtk3/Apparition.ui:291 resources/ui/gtk3/Portal.ui:89
+#: resources/ui/gtk3/Portal.ui:139 resources/ui/gtk3/Portal.ui:189
+#: resources/ui/gtk3/Portal.ui:239 resources/ui/gtk3/Portal.ui:282
#: resources/ui/adw/Matrix.ui:36 resources/ui/adw/Matrix.ui:69
#: resources/ui/adw/Matrix.ui:102 resources/ui/adw/Matrix.ui:135
#: resources/ui/adw/Matrix.ui:160 resources/ui/adw/Matrix.ui:185
@@ -299,7 +309,9 @@ msgstr ""
#: resources/ui/adw/prefs.ui:63 resources/ui/adw/prefs.ui:85
#: resources/ui/adw/Apparition.ui:37 resources/ui/adw/Apparition.ui:70
#: resources/ui/adw/Apparition.ui:103 resources/ui/adw/Apparition.ui:136
-#: resources/ui/adw/Apparition.ui:169
+#: resources/ui/adw/Apparition.ui:169 resources/ui/adw/Portal.ui:36
+#: resources/ui/adw/Portal.ui:69 resources/ui/adw/Portal.ui:102
+#: resources/ui/adw/Portal.ui:135 resources/ui/adw/Portal.ui:160
msgid "Reset to Default Value"
msgstr ""
@@ -374,12 +386,14 @@ msgstr ""
#: resources/ui/gtk4/Incinerate.ui:221 resources/ui/gtk4/Wisps.ui:122
#: resources/ui/gtk4/SnapOfDisintegration.ui:122
#: resources/ui/gtk4/TVEffect.ui:76 resources/ui/gtk4/EnergizeA.ui:122
-#: resources/ui/gtk4/EnergizeB.ui:122 resources/ui/gtk3/Incinerate.ui:263
-#: resources/ui/gtk3/Wisps.ui:145 resources/ui/gtk3/TVEffect.ui:89
-#: resources/ui/gtk3/EnergizeA.ui:145 resources/ui/gtk3/EnergizeB.ui:145
+#: resources/ui/gtk4/EnergizeB.ui:122 resources/ui/gtk4/Portal.ui:214
+#: resources/ui/gtk3/Incinerate.ui:263 resources/ui/gtk3/Wisps.ui:145
+#: resources/ui/gtk3/TVEffect.ui:89 resources/ui/gtk3/EnergizeA.ui:145
+#: resources/ui/gtk3/EnergizeB.ui:145 resources/ui/gtk3/Portal.ui:261
#: resources/ui/adw/Incinerate.ui:136 resources/ui/adw/Wisps.ui:80
#: resources/ui/adw/SnapOfDisintegration.ui:80 resources/ui/adw/TVEffect.ui:47
#: resources/ui/adw/EnergizeA.ui:80 resources/ui/adw/EnergizeB.ui:81
+#: resources/ui/adw/Portal.ui:146
msgid "Color"
msgstr ""
@@ -546,6 +560,21 @@ msgstr ""
msgid "Suction Intensity"
msgstr ""
+#: resources/ui/gtk4/Portal.ui:76 resources/ui/gtk3/Portal.ui:162
+#: resources/ui/adw/Portal.ui:80
+msgid "Whirling"
+msgstr ""
+
+#: resources/ui/gtk4/Portal.ui:122 resources/ui/gtk3/Portal.ui:112
+#: resources/ui/adw/Portal.ui:47
+msgid "Rotation Speed"
+msgstr ""
+
+#: resources/ui/gtk4/Portal.ui:168 resources/ui/gtk3/Portal.ui:212
+#: resources/ui/adw/Portal.ui:113
+msgid "Details"
+msgstr ""
+
#: resources/ui/gtk3/Fire.ui:69 resources/ui/adw/Fire.ui:19
msgid "Choose a Preset"
msgstr ""
diff --git a/prefs.js b/prefs.js
index 7f8c9cf..0cf131a 100644
--- a/prefs.js
+++ b/prefs.js
@@ -60,6 +60,7 @@ var PreferencesDialog = class PreferencesDialog {
new Me.imports.src.Pixelate.Pixelate(),
new Me.imports.src.PixelWheel.PixelWheel(),
new Me.imports.src.PixelWipe.PixelWipe(),
+ new Me.imports.src.Portal.Portal(),
new Me.imports.src.SnapOfDisintegration.SnapOfDisintegration(),
new Me.imports.src.TRexAttack.TRexAttack(),
new Me.imports.src.TVEffect.TVEffect(),
diff --git a/resources/shaders/apparition.frag b/resources/shaders/apparition.frag
index 6b87d2a..f4193a1 100644
--- a/resources/shaders/apparition.frag
+++ b/resources/shaders/apparition.frag
@@ -23,8 +23,6 @@ uniform float uRandomness;
const float ACTOR_SCALE = 2.0;
const float PADDING = ACTOR_SCALE / 2.0 - 0.5;
-// The math for the whirling is inspired by this post:
-// http://www.geeks3d.com/20110428/shader-library-swirl-post-processing-filter-in-glsl
void main() {
// We simply inverse the progress for opening windows.
float progress = uForOpening ? 1.0 - uProgress : uProgress;
@@ -44,10 +42,7 @@ void main() {
coords += progress * coords / dist * 0.5 * uSuction;
// Apply some whirling.
- float angle = pow(1.0 - dist, 2.0) * uTwirl * progress;
- float s = sin(angle);
- float c = cos(angle);
- coords = vec2(dot(coords, vec2(c, -s)), dot(coords, vec2(s, c)));
+ coords = whirl(coords, uTwirl * progress, 0.0);
// Fade out the window texture.
vec4 oColor = getInputColor(coords + center);
diff --git a/resources/shaders/common.glsl b/resources/shaders/common.glsl
index 0201fe2..a76012b 100644
--- a/resources/shaders/common.glsl
+++ b/resources/shaders/common.glsl
@@ -121,8 +121,8 @@ void setOutputColor(vec4 outColor) { cogl_color_out = outColor; }
// The Shell.GLSLEffect uses straight alpha blending. This helper method allows
// compositing color values in the shader in the same way.
vec4 alphaOver(vec4 under, vec4 over) {
- float alpha = over.a + under.a * (1.0 - over.a);
- return vec4((over.rgb * over.a + under.rgb * under.a * (1.0 - over.a)) / alpha, alpha);
+ float alpha = mix(under.a, 1.0, over.a);
+ return vec4(mix(under.rgb * under.a, over.rgb, over.a) / alpha, alpha);
}
// ------------------------------------------------------------------------- color helpers
@@ -136,6 +136,14 @@ vec3 tritone(float val, vec3 shadows, vec3 midtones, vec3 highlights) {
return mix(midtones, highlights, smoothstep(0.0, 1.0, val * 2.0 - 1.0));
}
+// Darkens the given color. If fac is zero, the color will not change, if fac is one, the
+// color will be black.
+vec3 darken(vec3 color, float fac) { return color * (1.0 - fac); }
+
+// Lightens the given color. If fac is zero, the color will not change, if fac is one, the
+// color will be white.
+vec3 lighten(vec3 color, float fac) { return color + (vec3(1.0) - color) * fac; }
+
// ---------------------------------------------------------------------- easing functions
// Here are some basic easing function. More can be added if required!
@@ -143,8 +151,16 @@ vec3 tritone(float val, vec3 shadows, vec3 midtones, vec3 highlights) {
// https://gitlab.gnome.org/GNOME/mutter/-/blob/main/clutter/clutter/clutter-easing.c
float easeOutQuad(float x) { return -1.0 * x * (x - 2.0); }
+
float easeInQuad(float x) { return x * x; }
+float easeInBack(float x, float e) { return x * x * ((e + 1.0) * x - e); }
+
+float easeOutBack(float x, float e) {
+ float p = x - 1.0;
+ return p * p * ((e + 1.0) * p + e) + 1.0;
+}
+
// --------------------------------------------------------------------- edge mask helpers
// This method returns a mask which smoothly transitions towards zero when approaching
@@ -183,6 +199,15 @@ float getRelativeEdgeMask(float fadeAmount) {
// ------------------------------------------------------------------------------- 2D math
+// The math for the whirling is inspired by this post:
+// http://www.geeks3d.com/20110428/shader-library-swirl-post-processing-filter-in-glsl
+vec2 whirl(vec2 coords, float warping, float rotation) {
+ float angle = pow(1.0 - length(coords), 2.0) * warping + rotation;
+ float s = sin(angle);
+ float c = cos(angle);
+ return vec2(dot(coords, vec2(c, -s)), dot(coords, vec2(s, c)));
+}
+
// Returns the shortest distance between the given point and the line defined by "origin"
// and "direction".
float distToLine(vec2 origin, vec2 direction, vec2 point) {
diff --git a/resources/shaders/portal.frag b/resources/shaders/portal.frag
new file mode 100644
index 0000000..ad02926
--- /dev/null
+++ b/resources/shaders/portal.frag
@@ -0,0 +1,206 @@
+//////////////////////////////////////////////////////////////////////////////////////////
+// ) ( //
+// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
+// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
+// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
+// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
+// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
+// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
+// |__/ //
+//////////////////////////////////////////////////////////////////////////////////////////
+
+// SPDX-FileCopyrightText: Simon Schneegans
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+// The content from common.glsl is automatically prepended to each shader effect.
+
+uniform vec2 uSeed;
+uniform vec3 uColor;
+uniform float uRotationSpeed;
+uniform float uWhirling;
+uniform float uDetails;
+
+const float PORTAL_WOBBLE_TIME = 0.8;
+const float PORTAL_WOBBLE_STRENGTH = 1.2;
+const float GLOW_EDGE_WIDTH = 5.0;
+const float WINDOW_SCALE = 0.3;
+const float WINDOW_SQUISH = 1.0;
+const float WINDOW_TILT = -1.0;
+
+// Make sure that the portal and window open / close animations are quick even if the
+// duration is longer.
+float PORTAL_OPEN_TIME = 0.4 / uDuration;
+float PORTAL_CLOSE_TIME = 0.4 / uDuration;
+float WINDOW_OPEN_TIME = 0.35 / uDuration;
+
+// This will distort the given coordinate to achieve the wobble effect of the portal when
+// the window passes through. The wobble happens around the point where the window appears
+// or disappears (which is controlled by WINDOW_OPEN_TIME) and takes
+// PORTAL_WOBBLE_TIME.
+vec2 getPortalWobble(vec2 coords) {
+ float progress = (uForOpening ? (1.0 - uProgress) : uProgress) / WINDOW_OPEN_TIME;
+ progress = clamp(1.0 - abs((progress - 1.0) / PORTAL_WOBBLE_TIME), 0.0, 1.0);
+ progress = easeInBack(progress, 1.7);
+ float dist = length(coords);
+
+ return coords * (1.0 - dist) * exp(-dist) * progress * PORTAL_WOBBLE_STRENGTH;
+}
+
+// This is used to compute the scale of the portal. The returned value will smoothly
+// increase during uDuration*PORTAL_OPEN_TIME, stay at one until uDuration*(1.0 -
+// PORTAL_CLOSE_TIME) and then decrease again.
+float getPortalScale() {
+ float scale = 1.0;
+ if (uProgress < PORTAL_OPEN_TIME) {
+ scale = easeOutBack(uProgress / PORTAL_OPEN_TIME, 1.5);
+ } else if (uProgress > 1.0 - PORTAL_CLOSE_TIME) {
+ scale =
+ easeOutBack(1.0 - (uProgress - 1.0 + PORTAL_CLOSE_TIME) / PORTAL_CLOSE_TIME, 1.5);
+ }
+
+ return scale;
+}
+
+// Returns a random 2D vector in [(-0.5, -0.5) ... (0.5, 0.5)] using two time simplex
+// noise. The scale of the noise can be adjusted with the scale paramter.
+vec2 getRandomDisplace(vec2 seed, float scale) {
+ return vec2(simplex2D(seed * scale + uSeed) - 0.5,
+ simplex2D(seed * scale + uSeed + vec2(7.89, 123.0)) - 0.5);
+}
+
+// Twists the given coordinates around the origin. The speedMultiplier can be used to
+// control the overall rotation speed, warpMultiplier can be used to control the amount of
+// twisting (higher multipliers will make coordinates which are closer to the origin be
+// rotated more than coordinates farther away).
+vec2 getWhirledCoords(vec2 coords, float speedMultiplier, float warpMultiplier) {
+ float rotation = uRotationSpeed * uProgress * uDuration * speedMultiplier;
+ float warping = uWhirling * (6.0 + 1.5 * uProgress) * warpMultiplier;
+ return whirl(coords, warping, rotation);
+}
+
+// This returns a beautiful portal. It is composed of several layers:
+// 1. In the background, there is a slightly distorted radial gradient.
+// 2. Next, there is a layer of whirled bands.
+// 3. Thereafter, there is another layer of whirled bands, rotating a bit faster and
+// usually in a slightly brighter color.
+// 4. Then the rim of the portal is drawn.
+// 5. Finally, some bright sparkling dots are drawn above.
+vec4 getPortalColor() {
+
+ // Put coordinate origin to the center of the window.
+ vec2 coords = (iTexCoord.st - vec2(0.5)) * 2.0;
+
+ // Add some margin for the elastic overshooting.
+ coords *= 1.5;
+
+ // Add the open-close animation of the portal.
+ float scale = getPortalScale();
+ coords /= max(scale * 0.5 + 0.5, 0.01);
+
+ // We will use this distortion vector on all layers below in order to add the elastic
+ // wobbling when the window passes through the portal.
+ vec2 wobble = getPortalWobble(coords);
+
+ // This is used below to scale the detail level of the layers. If the portal is small,
+ // we want to have less details, if the portal is huge on the screen, theres plenty of
+ // space for details.
+ float detailScale = 10000.0 / (uSize.x + uSize.y) / uDetails;
+
+ // ---------------------------------------------------------------------------- 1. layer
+ // We start with the background layer. This is a radial gradient from a dark color in
+ // the center to a not-so-dark color in the outer regions. We distort the coordinates to
+ // add some variations to the colors and to the shape of the portal.
+ vec2 layerCoords = getWhirledCoords(coords - wobble * 1.0, 0.25, 1.0);
+ vec2 displace = getRandomDisplace(layerCoords, 2.1);
+ layerCoords += displace * 0.1;
+ float dist = length(layerCoords);
+ float alpha = dist > 1.0 ? 0.0 : 1.0;
+ vec4 color = vec4(mix(darken(uColor, 0.8), darken(uColor, 0.2), pow(dist, 5.0)), alpha);
+ float rand = dot(displace, displace);
+
+ // ---------------------------------------------------------------------------- 2. layer
+ // Then we add the first layer of whirly bands.
+ float noise = simplex2D(layerCoords / detailScale * 1.0 + vec2(12.3, 56.4) + uSeed);
+ vec4 layer = vec4(darken(uColor, 0.3), noise > 0.6 ? alpha : 0.0);
+ color = alphaOver(color, layer);
+
+ // ---------------------------------------------------------------------------- 3. layer
+ // The second layer of whirly bands uses a lighter color and a different set of
+ // distorted coordinates.
+ layerCoords = getWhirledCoords(coords - wobble * 1.5, 0.75, 0.5);
+ displace = getRandomDisplace(layerCoords, 12.2);
+ layerCoords += displace * 0.1;
+ noise = simplex2D(layerCoords / detailScale * 1.3 + uSeed);
+ layer = vec4(uColor, noise > 0.6 ? alpha : 0.0);
+ color = alphaOver(color, layer);
+
+ // At this point, some of the color components can be outside the [0..1] range, so we
+ // have to clamp them. Else the alpha compositing will create artifacts.
+ color = clamp(color, 0.0, 1.0);
+
+ // ---------------------------------------------------------------------------- 4. layer
+ // Then we add the edge around the portal with the effect's color. It varies in
+ // thickness to create some variations.
+ float edge =
+ mix(1.0, 5.0, rand) * GLOW_EDGE_WIDTH * detailScale - 150.0 * abs(dist - 1.0);
+ layer = vec4(uColor, clamp(edge, 0.0, 1.0));
+ color = alphaOver(color, layer);
+
+ // ---------------------------------------------------------------------------- 5. layer
+ // Finally, we add some sparkling lights.
+ layerCoords = getWhirledCoords(coords - wobble * 1.8, 1.25, 0.0);
+ noise = simplex2D(layerCoords / detailScale * 3.0 + uSeed);
+ layer.rgb = lighten(uColor, 0.8) * clamp(pow(noise * rand + 0.9, 50.0), 0.0, 1.0);
+ color.rgb += layer.rgb;
+
+ // Finally, fade in / out the portal when it appears / disappears.
+ color.a *= pow(clamp(scale, 0.0, 1.0), 2.0);
+ return clamp(color, 0.0, 1.0);
+}
+
+// This method returns the window texture. The window is scaled down / up and faded to /
+// from transparency to create the illusion of travelling through the portal. The
+// animation will happen in a fraction of the full animation time (at the end of the
+// animation when opening a window and at the beginning of the animation when closing the
+// window). The fraction of the animation time take for the window animation is defined by
+// WINDOW_OPEN_TIME.
+vec4 getWindowColor() {
+ float progress = (uForOpening ? (1.0 - uProgress) : uProgress) / WINDOW_OPEN_TIME;
+
+ // Add some elastic easing to make the effect more dynamic.
+ progress = easeInBack(clamp(progress, 0.0, 1.0), 1.2);
+
+ // Put texture coordinate origin to center of window.
+ vec2 coords = iTexCoord.st * 2.0 - 1.0;
+
+ // Scale image texture with progress.
+ coords /= mix(1.0, WINDOW_SCALE, progress);
+
+ // Squish image texture vertically.
+ coords.y /= mix(1.0, (1.0 - 0.2 * WINDOW_SQUISH), progress);
+
+ // 'Tilt' image texture around x-axis.
+ coords.x /= mix(1.0, 1.0 - 0.1 * WINDOW_TILT * coords.y, progress);
+
+ // Move texture coordinate center to corner again.
+ coords = coords * 0.5 + 0.5;
+
+ // Fade the window to transparency. We multiply the progress with 3.0 in order to start
+ // the fade quite late.
+ vec4 oColor = getInputColor(coords);
+ oColor.a *= clamp((1.0 - progress) * 3.0, 0.0, 1.0);
+
+ return oColor;
+}
+
+void main() {
+
+ // Get the window color and the portal color and simply combine them.
+ vec4 portal = getPortalColor();
+ vec4 window = getWindowColor();
+ setOutputColor(alphaOver(portal, window));
+
+ // These can be useful for understanding how this works.
+ // setOutputColor(portal);
+ // setOutputColor(window);
+}
\ No newline at end of file
diff --git a/resources/ui/adw/Portal.ui b/resources/ui/adw/Portal.ui
new file mode 100644
index 0000000..f48f56d
--- /dev/null
+++ b/resources/ui/adw/Portal.ui
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/ui/gtk3/Portal.ui b/resources/ui/gtk3/Portal.ui
new file mode 100644
index 0000000..2b8fd9f
--- /dev/null
+++ b/resources/ui/gtk3/Portal.ui
@@ -0,0 +1,301 @@
+
+
+
+
+
+
+
+ 5000
+ 500
+ 1
+ 100
+
+
+
+ 2
+ -2
+ 0.1
+ 1
+
+
+
+ 2
+ -2
+ 0.1
+ 1
+
+
+
+ 100
+ 1
+ 1
+ 10
+
+
+
+ vertical
+
+
+
+
+
+ none
+
+
+
+
+ 10
+ 10
+ 10
+ 10
+ 0
+
+
+ 8
+
+
+ Animation Time [ms]
+ 0
+ start
+ center
+ 1
+
+
+
+
+ end
+ center
+ 1
+ 0
+ left
+ 300
+ portal-animation-time
+
+
+
+
+
+
+ edit-clear-symbolic
+ 1
+
+
+ Reset to Default Value
+
+
+
+
+
+
+
+
+
+
+ 10
+ 10
+ 10
+ 10
+ 0
+
+
+ 8
+
+
+ Rotation Speed
+ 0
+ start
+ center
+ 1
+
+
+
+
+ end
+ center
+ 1
+ 2
+ left
+ 300
+ portal-rotation-speed
+
+
+
+
+
+
+ edit-clear-symbolic
+ 1
+
+
+ Reset to Default Value
+
+
+
+
+
+
+
+
+
+
+ 10
+ 10
+ 10
+ 10
+ 0
+
+
+ 8
+
+
+ Whirling
+ 0
+ start
+ center
+ 1
+
+
+
+
+ end
+ center
+ 1
+ 2
+ left
+ 300
+ portal-whirling
+
+
+
+
+
+
+ edit-clear-symbolic
+ 1
+
+
+ Reset to Default Value
+
+
+
+
+
+
+
+
+
+
+ 10
+ 10
+ 10
+ 10
+ 0
+
+
+ 8
+
+
+ Details
+ 0
+ start
+ center
+ 1
+
+
+
+
+ end
+ center
+ 1
+ 1
+ left
+ 300
+ portal-details
+
+
+
+
+
+
+ edit-clear-symbolic
+ 1
+
+
+ Reset to Default Value
+
+
+
+
+
+
+
+
+
+
+ 10
+ 10
+ 10
+ 10
+ 0
+
+
+
+
+ Color
+ 0
+ start
+ center
+ 1
+
+
+
+
+ 0
+ 1
+
+
+
+
+
+
+ edit-clear-symbolic
+ 1
+
+
+ Reset to Default Value
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/resources/ui/gtk4/Portal.ui b/resources/ui/gtk4/Portal.ui
new file mode 100644
index 0000000..66c2c6a
--- /dev/null
+++ b/resources/ui/gtk4/Portal.ui
@@ -0,0 +1,249 @@
+
+
+
+
+
+
+
+ vertical
+
+
+
+
+
+ none
+ 1
+
+
+
+
+ 0
+
+
+
+
+ Animation Time [ms]
+ 0
+ start
+ center
+ 1
+
+
+
+
+ end
+ center
+ 1
+ 0
+ left
+ 300
+
+
+ 5000
+ 500
+ 1
+ 100
+
+
+
+
+
+
+ edit-clear-symbolic
+ Reset to Default Value
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ Whirling
+ 0
+ start
+ center
+ 1
+
+
+
+
+ end
+ center
+ 1
+ 2
+ left
+ 300
+
+
+ 2
+ -2
+ 0.1
+ 1
+
+
+
+
+
+
+ edit-clear-symbolic
+ Reset to Default Value
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ Rotation Speed
+ 0
+ start
+ center
+ 1
+
+
+
+
+ end
+ center
+ 1
+ 2
+ left
+ 300
+
+
+ 2
+ -2
+ 0.1
+ 1
+
+
+
+
+
+
+ edit-clear-symbolic
+ Reset to Default Value
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ Details
+ 0
+ start
+ center
+ 1
+
+
+
+
+ end
+ center
+ 1
+ 1
+ left
+ 300
+
+
+ 100
+ 1
+ 1
+ 10
+
+
+
+
+
+
+ edit-clear-symbolic
+ Reset to Default Value
+
+
+
+
+
+
+
+
+
+
+ 0
+
+
+
+
+ Color
+ 0
+ start
+ center
+ 1
+
+
+
+
+ 0
+ 1
+
+
+
+
+ edit-clear-symbolic
+ Reset to Default Value
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml b/schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml
index 6af42eb..be44e36 100644
--- a/schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml
+++ b/schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml
@@ -44,7 +44,7 @@ SPDX-License-Identifier: CC0-1.0
-
+
@@ -715,6 +715,52 @@ SPDX-License-Identifier: CC0-1.0
Use the pointer location for the broken glass effect.
+
+
+
+
+
+ false
+ Portal Close Effect
+ Use the Portal effect for window closing.
+
+
+
+ false
+ Portal Open Effect
+ Use the Portal effect for window opening.
+
+
+
+ 1250
+ Portal Animation Time
+ The time the Portal effect takes.
+
+
+
+ "rgb(121, 233, 24)"
+ Portal Color
+ The color of the effect.
+
+
+
+ 0.3
+ Portal Rotation Speed
+ The angular speed of the portal.
+
+
+
+ 1.0
+ Portal Whirling
+ The amount of distortion.
+
+
+
+ 15.0
+ Portal Details
+ The amount of details in the portal.
+
+
diff --git a/src/Portal.js b/src/Portal.js
new file mode 100644
index 0000000..6b99976
--- /dev/null
+++ b/src/Portal.js
@@ -0,0 +1,120 @@
+//////////////////////////////////////////////////////////////////////////////////////////
+// ) ( //
+// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
+// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
+// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
+// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
+// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
+// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
+// |__/ //
+//////////////////////////////////////////////////////////////////////////////////////////
+
+// SPDX-FileCopyrightText: Simon Schneegans
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+'use strict';
+
+const GObject = imports.gi.GObject;
+
+const _ = imports.gettext.domain('burn-my-windows').gettext;
+
+const ExtensionUtils = imports.misc.extensionUtils;
+const Me = imports.misc.extensionUtils.getCurrentExtension();
+const utils = Me.imports.src.utils;
+const ShaderFactory = Me.imports.src.ShaderFactory.ShaderFactory;
+
+//////////////////////////////////////////////////////////////////////////////////////////
+//////////////////////////////////////////////////////////////////////////////////////////
+
+// The effect class can be used to get some metadata (like the effect's name or supported
+// GNOME Shell versions), to initialize the respective page of the settings dialog, as
+// well as to create the actual shader for the effect.
+var Portal = class {
+
+ // The constructor creates a ShaderFactory which will be used by extension.js to create
+ // shader instances for this effect. The shaders will be automagically created using the
+ // GLSL file in resources/shaders/.glsl. The callback will be called for each
+ // newly created shader instance.
+ constructor() {
+ this.shaderFactory = new ShaderFactory(this.getNick(), (shader) => {
+ // We import Clutter in this function as it is not available in the preferences
+ // process. This creator function of the ShaderFactory is only called within GNOME
+ // Shell's process.
+ const Clutter = imports.gi.Clutter;
+
+ // Store uniform locations of newly created shaders.
+ shader._uSeed = shader.get_uniform_location('uSeed');
+ shader._uColor = shader.get_uniform_location('uColor');
+ shader._uDetails = shader.get_uniform_location('uDetails');
+ shader._uRotationSpeed = shader.get_uniform_location('uRotationSpeed');
+ shader._uWhirling = shader.get_uniform_location('uWhirling');
+
+ // Write all uniform values at the start of each animation.
+ shader.connect('begin-animation', (shader, settings) => {
+ const c = Clutter.Color.from_string(settings.get_string('portal-color'))[1];
+
+ // If we are performing an integration tests, we use a fixed seed.
+ const testMode = settings.get_boolean('test-mode');
+
+ // clang-format off
+ shader.set_uniform_float(shader._uSeed, 2, [testMode ? 0 : Math.random(), testMode ? 0 : Math.random()]);
+ shader.set_uniform_float(shader._uColor, 3, [c.red / 255, c.green / 255, c.blue / 255]);
+ shader.set_uniform_float(shader._uDetails, 1, [settings.get_double('portal-details')]);
+ shader.set_uniform_float(shader._uRotationSpeed, 1, [settings.get_double('portal-rotation-speed')]);
+ shader.set_uniform_float(shader._uWhirling, 1, [settings.get_double('portal-whirling')]);
+ // clang-format on
+ });
+ });
+ }
+
+
+ // ---------------------------------------------------------------------------- metadata
+
+ // The effect is available on all GNOME Shell versions supported by this extension.
+ getMinShellVersion() {
+ return [3, 36];
+ }
+
+ // This will be called in various places where a unique identifier for this effect is
+ // required. It should match the prefix of the settings keys which store whether the
+ // effect is enabled currently (e.g. '*-close-effect'), and its animation time
+ // (e.g. '*-animation-time').
+ getNick() {
+ return 'portal';
+ }
+
+ // This will be shown in the sidebar of the preferences dialog as well as in the
+ // drop-down menus where the user can choose the effect.
+ getLabel() {
+ return _('Portal');
+ }
+
+ // -------------------------------------------------------------------- API for prefs.js
+
+ // This is called by the preferences dialog. It loads the settings page for this effect,
+ // and binds all properties to the settings.
+ getPreferences(dialog) {
+
+ // Add the settings page to the builder.
+ dialog.getBuilder().add_from_resource(`/ui/${utils.getUIDir()}/Portal.ui`);
+
+ // Bind all properties.
+ dialog.bindAdjustment('portal-animation-time');
+ dialog.bindAdjustment('portal-rotation-speed');
+ dialog.bindAdjustment('portal-whirling');
+ dialog.bindAdjustment('portal-details');
+ dialog.bindColorButton('portal-color');
+
+ // Finally, return the new settings page.
+ return dialog.getBuilder().get_object('portal-prefs');
+ }
+
+ // ---------------------------------------------------------------- API for extension.js
+
+ // The getActorScale() is called from extension.js to adjust the actor's size during the
+ // animation. This is useful if the effect requires drawing something beyond the usual
+ // bounds of the actor. This only works for GNOME 3.38+.
+ getActorScale(settings) {
+ return {x: 1.0, y: 1.0};
+ }
+}
diff --git a/tests/generate-references.sh b/tests/generate-references.sh
index 053f472..7032b04 100755
--- a/tests/generate-references.sh
+++ b/tests/generate-references.sh
@@ -191,6 +191,7 @@ capture_effect "incinerate"
capture_effect "pixelate"
capture_effect "pixel-wheel"
capture_effect "pixel-wipe"
+capture_effect "portal"
capture_effect "tv"
capture_effect "wisps"
diff --git a/tests/references/apparition-close-gnome-wayland-nested-33.png b/tests/references/apparition-close-gnome-wayland-nested-33.png
index 482d88e..3e668a0 100755
Binary files a/tests/references/apparition-close-gnome-wayland-nested-33.png and b/tests/references/apparition-close-gnome-wayland-nested-33.png differ
diff --git a/tests/references/apparition-close-gnome-wayland-nested-34.png b/tests/references/apparition-close-gnome-wayland-nested-34.png
index 1d406ca..3e668a0 100755
Binary files a/tests/references/apparition-close-gnome-wayland-nested-34.png and b/tests/references/apparition-close-gnome-wayland-nested-34.png differ
diff --git a/tests/references/apparition-close-gnome-wayland-nested-35.png b/tests/references/apparition-close-gnome-wayland-nested-35.png
index e338448..3e668a0 100755
Binary files a/tests/references/apparition-close-gnome-wayland-nested-35.png and b/tests/references/apparition-close-gnome-wayland-nested-35.png differ
diff --git a/tests/references/apparition-close-gnome-wayland-nested-36.png b/tests/references/apparition-close-gnome-wayland-nested-36.png
index e338448..3e668a0 100755
Binary files a/tests/references/apparition-close-gnome-wayland-nested-36.png and b/tests/references/apparition-close-gnome-wayland-nested-36.png differ
diff --git a/tests/references/apparition-close-gnome-xsession-33.png b/tests/references/apparition-close-gnome-xsession-33.png
index 91c319e..3e668a0 100755
Binary files a/tests/references/apparition-close-gnome-xsession-33.png and b/tests/references/apparition-close-gnome-xsession-33.png differ
diff --git a/tests/references/apparition-close-gnome-xsession-34.png b/tests/references/apparition-close-gnome-xsession-34.png
index d7bf222..3e668a0 100755
Binary files a/tests/references/apparition-close-gnome-xsession-34.png and b/tests/references/apparition-close-gnome-xsession-34.png differ
diff --git a/tests/references/apparition-close-gnome-xsession-35.png b/tests/references/apparition-close-gnome-xsession-35.png
index 63d0bd4..3e668a0 100755
Binary files a/tests/references/apparition-close-gnome-xsession-35.png and b/tests/references/apparition-close-gnome-xsession-35.png differ
diff --git a/tests/references/apparition-close-gnome-xsession-36.png b/tests/references/apparition-close-gnome-xsession-36.png
index 63d0bd4..3e668a0 100755
Binary files a/tests/references/apparition-close-gnome-xsession-36.png and b/tests/references/apparition-close-gnome-xsession-36.png differ
diff --git a/tests/references/apparition-open-gnome-wayland-nested-33.png b/tests/references/apparition-open-gnome-wayland-nested-33.png
index 482d88e..3e668a0 100755
Binary files a/tests/references/apparition-open-gnome-wayland-nested-33.png and b/tests/references/apparition-open-gnome-wayland-nested-33.png differ
diff --git a/tests/references/apparition-open-gnome-wayland-nested-34.png b/tests/references/apparition-open-gnome-wayland-nested-34.png
index 1d406ca..3e668a0 100755
Binary files a/tests/references/apparition-open-gnome-wayland-nested-34.png and b/tests/references/apparition-open-gnome-wayland-nested-34.png differ
diff --git a/tests/references/apparition-open-gnome-wayland-nested-35.png b/tests/references/apparition-open-gnome-wayland-nested-35.png
index e338448..3e668a0 100755
Binary files a/tests/references/apparition-open-gnome-wayland-nested-35.png and b/tests/references/apparition-open-gnome-wayland-nested-35.png differ
diff --git a/tests/references/apparition-open-gnome-wayland-nested-36.png b/tests/references/apparition-open-gnome-wayland-nested-36.png
index e338448..3e668a0 100755
Binary files a/tests/references/apparition-open-gnome-wayland-nested-36.png and b/tests/references/apparition-open-gnome-wayland-nested-36.png differ
diff --git a/tests/references/apparition-open-gnome-xsession-33.png b/tests/references/apparition-open-gnome-xsession-33.png
index 91c319e..3e668a0 100755
Binary files a/tests/references/apparition-open-gnome-xsession-33.png and b/tests/references/apparition-open-gnome-xsession-33.png differ
diff --git a/tests/references/apparition-open-gnome-xsession-34.png b/tests/references/apparition-open-gnome-xsession-34.png
index d7bf222..3e668a0 100755
Binary files a/tests/references/apparition-open-gnome-xsession-34.png and b/tests/references/apparition-open-gnome-xsession-34.png differ
diff --git a/tests/references/apparition-open-gnome-xsession-35.png b/tests/references/apparition-open-gnome-xsession-35.png
index 63d0bd4..3e668a0 100755
Binary files a/tests/references/apparition-open-gnome-xsession-35.png and b/tests/references/apparition-open-gnome-xsession-35.png differ
diff --git a/tests/references/apparition-open-gnome-xsession-36.png b/tests/references/apparition-open-gnome-xsession-36.png
index 63d0bd4..3e668a0 100755
Binary files a/tests/references/apparition-open-gnome-xsession-36.png and b/tests/references/apparition-open-gnome-xsession-36.png differ
diff --git a/tests/references/doom-close-gnome-wayland-nested-33.png b/tests/references/doom-close-gnome-wayland-nested-33.png
index 2dd77ca..a222e32 100755
Binary files a/tests/references/doom-close-gnome-wayland-nested-33.png and b/tests/references/doom-close-gnome-wayland-nested-33.png differ
diff --git a/tests/references/doom-close-gnome-wayland-nested-34.png b/tests/references/doom-close-gnome-wayland-nested-34.png
index 8879b22..16ab833 100755
Binary files a/tests/references/doom-close-gnome-wayland-nested-34.png and b/tests/references/doom-close-gnome-wayland-nested-34.png differ
diff --git a/tests/references/doom-close-gnome-wayland-nested-35.png b/tests/references/doom-close-gnome-wayland-nested-35.png
index ac7b54b..a840f7f 100755
Binary files a/tests/references/doom-close-gnome-wayland-nested-35.png and b/tests/references/doom-close-gnome-wayland-nested-35.png differ
diff --git a/tests/references/doom-close-gnome-wayland-nested-36.png b/tests/references/doom-close-gnome-wayland-nested-36.png
index 84ea46d..a840f7f 100755
Binary files a/tests/references/doom-close-gnome-wayland-nested-36.png and b/tests/references/doom-close-gnome-wayland-nested-36.png differ
diff --git a/tests/references/doom-close-gnome-xsession-33.png b/tests/references/doom-close-gnome-xsession-33.png
index b701718..3f8f3a4 100755
Binary files a/tests/references/doom-close-gnome-xsession-33.png and b/tests/references/doom-close-gnome-xsession-33.png differ
diff --git a/tests/references/doom-close-gnome-xsession-34.png b/tests/references/doom-close-gnome-xsession-34.png
index 2966413..f88d060 100755
Binary files a/tests/references/doom-close-gnome-xsession-34.png and b/tests/references/doom-close-gnome-xsession-34.png differ
diff --git a/tests/references/doom-close-gnome-xsession-35.png b/tests/references/doom-close-gnome-xsession-35.png
index 8e2f7d0..97cfb86 100755
Binary files a/tests/references/doom-close-gnome-xsession-35.png and b/tests/references/doom-close-gnome-xsession-35.png differ
diff --git a/tests/references/doom-close-gnome-xsession-36.png b/tests/references/doom-close-gnome-xsession-36.png
index aa6aa94..97cfb86 100755
Binary files a/tests/references/doom-close-gnome-xsession-36.png and b/tests/references/doom-close-gnome-xsession-36.png differ
diff --git a/tests/references/doom-open-gnome-wayland-nested-33.png b/tests/references/doom-open-gnome-wayland-nested-33.png
index 99f23b2..e1f7aa3 100755
Binary files a/tests/references/doom-open-gnome-wayland-nested-33.png and b/tests/references/doom-open-gnome-wayland-nested-33.png differ
diff --git a/tests/references/doom-open-gnome-wayland-nested-34.png b/tests/references/doom-open-gnome-wayland-nested-34.png
index cce83f4..99e1cd5 100755
Binary files a/tests/references/doom-open-gnome-wayland-nested-34.png and b/tests/references/doom-open-gnome-wayland-nested-34.png differ
diff --git a/tests/references/doom-open-gnome-wayland-nested-35.png b/tests/references/doom-open-gnome-wayland-nested-35.png
index 7d5fd80..9030a7c 100755
Binary files a/tests/references/doom-open-gnome-wayland-nested-35.png and b/tests/references/doom-open-gnome-wayland-nested-35.png differ
diff --git a/tests/references/doom-open-gnome-wayland-nested-36.png b/tests/references/doom-open-gnome-wayland-nested-36.png
index 7d5fd80..9030a7c 100755
Binary files a/tests/references/doom-open-gnome-wayland-nested-36.png and b/tests/references/doom-open-gnome-wayland-nested-36.png differ
diff --git a/tests/references/doom-open-gnome-xsession-33.png b/tests/references/doom-open-gnome-xsession-33.png
index 3eb5ded..96f5b89 100755
Binary files a/tests/references/doom-open-gnome-xsession-33.png and b/tests/references/doom-open-gnome-xsession-33.png differ
diff --git a/tests/references/doom-open-gnome-xsession-34.png b/tests/references/doom-open-gnome-xsession-34.png
index a70227f..6bc837e 100755
Binary files a/tests/references/doom-open-gnome-xsession-34.png and b/tests/references/doom-open-gnome-xsession-34.png differ
diff --git a/tests/references/doom-open-gnome-xsession-35.png b/tests/references/doom-open-gnome-xsession-35.png
index 63a82cf..29d6a17 100755
Binary files a/tests/references/doom-open-gnome-xsession-35.png and b/tests/references/doom-open-gnome-xsession-35.png differ
diff --git a/tests/references/doom-open-gnome-xsession-36.png b/tests/references/doom-open-gnome-xsession-36.png
index 63a82cf..29d6a17 100755
Binary files a/tests/references/doom-open-gnome-xsession-36.png and b/tests/references/doom-open-gnome-xsession-36.png differ
diff --git a/tests/references/pixel-wheel-close-gnome-wayland-nested-32.png b/tests/references/pixel-wheel-close-gnome-wayland-nested-32.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wheel-close-gnome-wayland-nested-33.png b/tests/references/pixel-wheel-close-gnome-wayland-nested-33.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wheel-close-gnome-wayland-nested-34.png b/tests/references/pixel-wheel-close-gnome-wayland-nested-34.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wheel-close-gnome-wayland-nested-35.png b/tests/references/pixel-wheel-close-gnome-wayland-nested-35.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wheel-close-gnome-wayland-nested-36.png b/tests/references/pixel-wheel-close-gnome-wayland-nested-36.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wheel-close-gnome-xsession-32.png b/tests/references/pixel-wheel-close-gnome-xsession-32.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wheel-close-gnome-xsession-33.png b/tests/references/pixel-wheel-close-gnome-xsession-33.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wheel-close-gnome-xsession-34.png b/tests/references/pixel-wheel-close-gnome-xsession-34.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wheel-close-gnome-xsession-35.png b/tests/references/pixel-wheel-close-gnome-xsession-35.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wheel-close-gnome-xsession-36.png b/tests/references/pixel-wheel-close-gnome-xsession-36.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wheel-open-gnome-wayland-nested-32.png b/tests/references/pixel-wheel-open-gnome-wayland-nested-32.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wheel-open-gnome-wayland-nested-33.png b/tests/references/pixel-wheel-open-gnome-wayland-nested-33.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wheel-open-gnome-wayland-nested-34.png b/tests/references/pixel-wheel-open-gnome-wayland-nested-34.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wheel-open-gnome-wayland-nested-35.png b/tests/references/pixel-wheel-open-gnome-wayland-nested-35.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wheel-open-gnome-wayland-nested-36.png b/tests/references/pixel-wheel-open-gnome-wayland-nested-36.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wheel-open-gnome-xsession-32.png b/tests/references/pixel-wheel-open-gnome-xsession-32.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wheel-open-gnome-xsession-33.png b/tests/references/pixel-wheel-open-gnome-xsession-33.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wheel-open-gnome-xsession-34.png b/tests/references/pixel-wheel-open-gnome-xsession-34.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wheel-open-gnome-xsession-35.png b/tests/references/pixel-wheel-open-gnome-xsession-35.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wheel-open-gnome-xsession-36.png b/tests/references/pixel-wheel-open-gnome-xsession-36.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wipe-close-gnome-wayland-nested-32.png b/tests/references/pixel-wipe-close-gnome-wayland-nested-32.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wipe-close-gnome-wayland-nested-33.png b/tests/references/pixel-wipe-close-gnome-wayland-nested-33.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wipe-close-gnome-wayland-nested-34.png b/tests/references/pixel-wipe-close-gnome-wayland-nested-34.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wipe-close-gnome-wayland-nested-35.png b/tests/references/pixel-wipe-close-gnome-wayland-nested-35.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wipe-close-gnome-wayland-nested-36.png b/tests/references/pixel-wipe-close-gnome-wayland-nested-36.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wipe-close-gnome-xsession-32.png b/tests/references/pixel-wipe-close-gnome-xsession-32.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wipe-close-gnome-xsession-33.png b/tests/references/pixel-wipe-close-gnome-xsession-33.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wipe-close-gnome-xsession-34.png b/tests/references/pixel-wipe-close-gnome-xsession-34.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wipe-close-gnome-xsession-35.png b/tests/references/pixel-wipe-close-gnome-xsession-35.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wipe-close-gnome-xsession-36.png b/tests/references/pixel-wipe-close-gnome-xsession-36.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wipe-open-gnome-wayland-nested-32.png b/tests/references/pixel-wipe-open-gnome-wayland-nested-32.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wipe-open-gnome-wayland-nested-33.png b/tests/references/pixel-wipe-open-gnome-wayland-nested-33.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wipe-open-gnome-wayland-nested-34.png b/tests/references/pixel-wipe-open-gnome-wayland-nested-34.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wipe-open-gnome-wayland-nested-35.png b/tests/references/pixel-wipe-open-gnome-wayland-nested-35.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wipe-open-gnome-wayland-nested-36.png b/tests/references/pixel-wipe-open-gnome-wayland-nested-36.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wipe-open-gnome-xsession-32.png b/tests/references/pixel-wipe-open-gnome-xsession-32.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wipe-open-gnome-xsession-33.png b/tests/references/pixel-wipe-open-gnome-xsession-33.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wipe-open-gnome-xsession-34.png b/tests/references/pixel-wipe-open-gnome-xsession-34.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wipe-open-gnome-xsession-35.png b/tests/references/pixel-wipe-open-gnome-xsession-35.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixel-wipe-open-gnome-xsession-36.png b/tests/references/pixel-wipe-open-gnome-xsession-36.png
old mode 100644
new mode 100755
diff --git a/tests/references/pixelate-close-gnome-wayland-nested-32.png b/tests/references/pixelate-close-gnome-wayland-nested-32.png
index 034ccf2..975b40a 100755
Binary files a/tests/references/pixelate-close-gnome-wayland-nested-32.png and b/tests/references/pixelate-close-gnome-wayland-nested-32.png differ
diff --git a/tests/references/pixelate-close-gnome-wayland-nested-33.png b/tests/references/pixelate-close-gnome-wayland-nested-33.png
index 80c3859..17341d0 100755
Binary files a/tests/references/pixelate-close-gnome-wayland-nested-33.png and b/tests/references/pixelate-close-gnome-wayland-nested-33.png differ
diff --git a/tests/references/pixelate-close-gnome-wayland-nested-34.png b/tests/references/pixelate-close-gnome-wayland-nested-34.png
index d69f762..e3eec03 100755
Binary files a/tests/references/pixelate-close-gnome-wayland-nested-34.png and b/tests/references/pixelate-close-gnome-wayland-nested-34.png differ
diff --git a/tests/references/pixelate-close-gnome-wayland-nested-35.png b/tests/references/pixelate-close-gnome-wayland-nested-35.png
index 6998a1b..fa0217d 100755
Binary files a/tests/references/pixelate-close-gnome-wayland-nested-35.png and b/tests/references/pixelate-close-gnome-wayland-nested-35.png differ
diff --git a/tests/references/pixelate-close-gnome-wayland-nested-36.png b/tests/references/pixelate-close-gnome-wayland-nested-36.png
index 6998a1b..fa0217d 100755
Binary files a/tests/references/pixelate-close-gnome-wayland-nested-36.png and b/tests/references/pixelate-close-gnome-wayland-nested-36.png differ
diff --git a/tests/references/pixelate-close-gnome-xsession-32.png b/tests/references/pixelate-close-gnome-xsession-32.png
index 512a1e6..7248158 100755
Binary files a/tests/references/pixelate-close-gnome-xsession-32.png and b/tests/references/pixelate-close-gnome-xsession-32.png differ
diff --git a/tests/references/pixelate-close-gnome-xsession-33.png b/tests/references/pixelate-close-gnome-xsession-33.png
index 46e22b7..5347fd8 100755
Binary files a/tests/references/pixelate-close-gnome-xsession-33.png and b/tests/references/pixelate-close-gnome-xsession-33.png differ
diff --git a/tests/references/pixelate-close-gnome-xsession-34.png b/tests/references/pixelate-close-gnome-xsession-34.png
index 69b2720..2cb6f33 100755
Binary files a/tests/references/pixelate-close-gnome-xsession-34.png and b/tests/references/pixelate-close-gnome-xsession-34.png differ
diff --git a/tests/references/pixelate-close-gnome-xsession-35.png b/tests/references/pixelate-close-gnome-xsession-35.png
index e186432..62f611e 100755
Binary files a/tests/references/pixelate-close-gnome-xsession-35.png and b/tests/references/pixelate-close-gnome-xsession-35.png differ
diff --git a/tests/references/pixelate-close-gnome-xsession-36.png b/tests/references/pixelate-close-gnome-xsession-36.png
index e186432..62f611e 100755
Binary files a/tests/references/pixelate-close-gnome-xsession-36.png and b/tests/references/pixelate-close-gnome-xsession-36.png differ
diff --git a/tests/references/pixelate-open-gnome-wayland-nested-32.png b/tests/references/pixelate-open-gnome-wayland-nested-32.png
index 034ccf2..975b40a 100755
Binary files a/tests/references/pixelate-open-gnome-wayland-nested-32.png and b/tests/references/pixelate-open-gnome-wayland-nested-32.png differ
diff --git a/tests/references/pixelate-open-gnome-wayland-nested-33.png b/tests/references/pixelate-open-gnome-wayland-nested-33.png
index 80c3859..17341d0 100755
Binary files a/tests/references/pixelate-open-gnome-wayland-nested-33.png and b/tests/references/pixelate-open-gnome-wayland-nested-33.png differ
diff --git a/tests/references/pixelate-open-gnome-wayland-nested-34.png b/tests/references/pixelate-open-gnome-wayland-nested-34.png
index d69f762..e3eec03 100755
Binary files a/tests/references/pixelate-open-gnome-wayland-nested-34.png and b/tests/references/pixelate-open-gnome-wayland-nested-34.png differ
diff --git a/tests/references/pixelate-open-gnome-wayland-nested-35.png b/tests/references/pixelate-open-gnome-wayland-nested-35.png
index 6998a1b..fa0217d 100755
Binary files a/tests/references/pixelate-open-gnome-wayland-nested-35.png and b/tests/references/pixelate-open-gnome-wayland-nested-35.png differ
diff --git a/tests/references/pixelate-open-gnome-wayland-nested-36.png b/tests/references/pixelate-open-gnome-wayland-nested-36.png
index 6998a1b..fa0217d 100755
Binary files a/tests/references/pixelate-open-gnome-wayland-nested-36.png and b/tests/references/pixelate-open-gnome-wayland-nested-36.png differ
diff --git a/tests/references/pixelate-open-gnome-xsession-32.png b/tests/references/pixelate-open-gnome-xsession-32.png
index 512a1e6..7248158 100755
Binary files a/tests/references/pixelate-open-gnome-xsession-32.png and b/tests/references/pixelate-open-gnome-xsession-32.png differ
diff --git a/tests/references/pixelate-open-gnome-xsession-33.png b/tests/references/pixelate-open-gnome-xsession-33.png
index 46e22b7..5347fd8 100755
Binary files a/tests/references/pixelate-open-gnome-xsession-33.png and b/tests/references/pixelate-open-gnome-xsession-33.png differ
diff --git a/tests/references/pixelate-open-gnome-xsession-34.png b/tests/references/pixelate-open-gnome-xsession-34.png
index 69b2720..2cb6f33 100755
Binary files a/tests/references/pixelate-open-gnome-xsession-34.png and b/tests/references/pixelate-open-gnome-xsession-34.png differ
diff --git a/tests/references/pixelate-open-gnome-xsession-35.png b/tests/references/pixelate-open-gnome-xsession-35.png
index e186432..62f611e 100755
Binary files a/tests/references/pixelate-open-gnome-xsession-35.png and b/tests/references/pixelate-open-gnome-xsession-35.png differ
diff --git a/tests/references/pixelate-open-gnome-xsession-36.png b/tests/references/pixelate-open-gnome-xsession-36.png
index e186432..62f611e 100755
Binary files a/tests/references/pixelate-open-gnome-xsession-36.png and b/tests/references/pixelate-open-gnome-xsession-36.png differ
diff --git a/tests/references/portal-close-gnome-wayland-nested-32.png b/tests/references/portal-close-gnome-wayland-nested-32.png
new file mode 100755
index 0000000..2d238bf
Binary files /dev/null and b/tests/references/portal-close-gnome-wayland-nested-32.png differ
diff --git a/tests/references/portal-close-gnome-wayland-nested-33.png b/tests/references/portal-close-gnome-wayland-nested-33.png
new file mode 100755
index 0000000..bb5addd
Binary files /dev/null and b/tests/references/portal-close-gnome-wayland-nested-33.png differ
diff --git a/tests/references/portal-close-gnome-wayland-nested-34.png b/tests/references/portal-close-gnome-wayland-nested-34.png
new file mode 100755
index 0000000..ee642d5
Binary files /dev/null and b/tests/references/portal-close-gnome-wayland-nested-34.png differ
diff --git a/tests/references/portal-close-gnome-wayland-nested-35.png b/tests/references/portal-close-gnome-wayland-nested-35.png
new file mode 100755
index 0000000..5954531
Binary files /dev/null and b/tests/references/portal-close-gnome-wayland-nested-35.png differ
diff --git a/tests/references/portal-close-gnome-wayland-nested-36.png b/tests/references/portal-close-gnome-wayland-nested-36.png
new file mode 100755
index 0000000..5954531
Binary files /dev/null and b/tests/references/portal-close-gnome-wayland-nested-36.png differ
diff --git a/tests/references/portal-close-gnome-xsession-32.png b/tests/references/portal-close-gnome-xsession-32.png
new file mode 100755
index 0000000..714a347
Binary files /dev/null and b/tests/references/portal-close-gnome-xsession-32.png differ
diff --git a/tests/references/portal-close-gnome-xsession-33.png b/tests/references/portal-close-gnome-xsession-33.png
new file mode 100755
index 0000000..bc0f9f9
Binary files /dev/null and b/tests/references/portal-close-gnome-xsession-33.png differ
diff --git a/tests/references/portal-close-gnome-xsession-34.png b/tests/references/portal-close-gnome-xsession-34.png
new file mode 100755
index 0000000..2d05df6
Binary files /dev/null and b/tests/references/portal-close-gnome-xsession-34.png differ
diff --git a/tests/references/portal-close-gnome-xsession-35.png b/tests/references/portal-close-gnome-xsession-35.png
new file mode 100755
index 0000000..f6a34a5
Binary files /dev/null and b/tests/references/portal-close-gnome-xsession-35.png differ
diff --git a/tests/references/portal-close-gnome-xsession-36.png b/tests/references/portal-close-gnome-xsession-36.png
new file mode 100755
index 0000000..f6a34a5
Binary files /dev/null and b/tests/references/portal-close-gnome-xsession-36.png differ
diff --git a/tests/references/portal-open-gnome-wayland-nested-32.png b/tests/references/portal-open-gnome-wayland-nested-32.png
new file mode 100755
index 0000000..2d238bf
Binary files /dev/null and b/tests/references/portal-open-gnome-wayland-nested-32.png differ
diff --git a/tests/references/portal-open-gnome-wayland-nested-33.png b/tests/references/portal-open-gnome-wayland-nested-33.png
new file mode 100755
index 0000000..bb5addd
Binary files /dev/null and b/tests/references/portal-open-gnome-wayland-nested-33.png differ
diff --git a/tests/references/portal-open-gnome-wayland-nested-34.png b/tests/references/portal-open-gnome-wayland-nested-34.png
new file mode 100755
index 0000000..ee642d5
Binary files /dev/null and b/tests/references/portal-open-gnome-wayland-nested-34.png differ
diff --git a/tests/references/portal-open-gnome-wayland-nested-35.png b/tests/references/portal-open-gnome-wayland-nested-35.png
new file mode 100755
index 0000000..5954531
Binary files /dev/null and b/tests/references/portal-open-gnome-wayland-nested-35.png differ
diff --git a/tests/references/portal-open-gnome-wayland-nested-36.png b/tests/references/portal-open-gnome-wayland-nested-36.png
new file mode 100755
index 0000000..5954531
Binary files /dev/null and b/tests/references/portal-open-gnome-wayland-nested-36.png differ
diff --git a/tests/references/portal-open-gnome-xsession-32.png b/tests/references/portal-open-gnome-xsession-32.png
new file mode 100755
index 0000000..714a347
Binary files /dev/null and b/tests/references/portal-open-gnome-xsession-32.png differ
diff --git a/tests/references/portal-open-gnome-xsession-33.png b/tests/references/portal-open-gnome-xsession-33.png
new file mode 100755
index 0000000..bc0f9f9
Binary files /dev/null and b/tests/references/portal-open-gnome-xsession-33.png differ
diff --git a/tests/references/portal-open-gnome-xsession-34.png b/tests/references/portal-open-gnome-xsession-34.png
new file mode 100755
index 0000000..2d05df6
Binary files /dev/null and b/tests/references/portal-open-gnome-xsession-34.png differ
diff --git a/tests/references/portal-open-gnome-xsession-35.png b/tests/references/portal-open-gnome-xsession-35.png
new file mode 100755
index 0000000..f6a34a5
Binary files /dev/null and b/tests/references/portal-open-gnome-xsession-35.png differ
diff --git a/tests/references/portal-open-gnome-xsession-36.png b/tests/references/portal-open-gnome-xsession-36.png
new file mode 100755
index 0000000..f6a34a5
Binary files /dev/null and b/tests/references/portal-open-gnome-xsession-36.png differ
diff --git a/tests/references/preferences-gnome-xsession-36.png b/tests/references/preferences-gnome-xsession-36.png
index 6191d22..77522f3 100755
Binary files a/tests/references/preferences-gnome-xsession-36.png and b/tests/references/preferences-gnome-xsession-36.png differ
diff --git a/tests/run-test.sh b/tests/run-test.sh
index e379b62..adffae4 100755
--- a/tests/run-test.sh
+++ b/tests/run-test.sh
@@ -216,6 +216,7 @@ test_effect "incinerate"
test_effect "pixelate"
test_effect "pixel-wheel"
test_effect "pixel-wipe"
+test_effect "portal"
test_effect "tv"
test_effect "wisps"