🔀 Merge pull request #256 from Schneegans/feature/portal

This commit is contained in:
Simon Schneegans
2022-12-23 13:05:21 +01:00
committed by GitHub
134 changed files with 1413 additions and 59 deletions
+2
View File
@@ -41,6 +41,7 @@ Effect | Preview
**Pixelate** <br> Pixelate your windows and randomly hide pixels until the entire window is gone.| <img src ="docs/pics/pixelate.gif" />
**Pixel Wheel** <br> This simple effect pixelates the window and hides the pixels in a wheel-like fashion.| <img src ="docs/pics/pixel-wheel.gif" />
**Pixel Wipe** <br> This effect pixelates the window and hides the pixels radially, starting from the pointer position.| <img src ="docs/pics/pixel-wipe.gif" />
**Portal** <br> This ridiculous effect teleports your windows from and to alternative dimensions.| <img src ="docs/pics/portal.gif" />
**Snap of Disintegration** <br> Dissolve your windows into a cloud of dust.| <img src ="docs/pics/snap.gif" />
**T-Rex Attack** <br> Destroy your windows with a series of violent slashes!| <img src ="docs/pics/trex.gif" />
**TV-Effect** <br> This is a very simple effect to demonstrate that this extension could also be used in a more professional environment. | <img src ="docs/pics/tv.gif" />
@@ -72,6 +73,7 @@ Below is a table which summarizes the current availability for all effects.
<tr><td>Pixelate</td> <td>✅</td> <td>✅</td> <td>✅</td><td>✅</td><td>✅</td><td>✅</td><td>✅</td> </tr>
<tr><td>Pixel Wheel</td> <td>✅</td> <td>✅</td> <td>✅</td><td>✅</td><td>✅</td><td>✅</td><td>✅</td> </tr>
<tr><td>Pixel Wipe</td> <td>✅</td> <td>✅</td> <td>✅</td><td>✅</td><td>✅</td><td>✅</td><td>✅</td> </tr>
<tr><td>Portal</td> <td>✅</td> <td>✅</td> <td>✅</td><td>✅</td><td>✅</td><td>✅</td><td>✅</td> </tr>
<tr><td>Snap of Disintegration</td> <td> </td> <td> </td> <td>✅</td><td>✅</td><td>✅</td><td>✅</td><td> </td> </tr>
<tr><td>T-Rex Attack</td> <td> </td> <td> </td> <td>✅</td><td>✅</td><td>✅</td><td>✅</td><td> </td> </tr>
<tr><td>TV-Effect</td> <td>✅</td> <td>✅</td> <td>✅</td><td>✅</td><td>✅</td><td>✅</td><td>✅</td> </tr>
+8
View File
@@ -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
Binary file not shown.

After

Width:  |  Height:  |  Size: 840 KiB

+1
View File
@@ -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(),
+1
View File
@@ -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"
+149
View File
@@ -0,0 +1,149 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
SPDX-FileCopyrightText: Simon Schneegans <code@simonschneegans.de>
SPDX-License-Identifier: GPL-3.0-or-later
-->
<ui version="4.0">
<class>BMWConfigForm</class>
<widget class="QWidget" name="BMWConfigForm">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>562</width>
<height>365</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="4" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Color:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>kcfg_Color</cstring>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Duration:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Rotation Speed</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="kcfg_Duration">
<property name="suffix">
<string> milliseconds</string>
</property>
<property name="minimum">
<number>500</number>
</property>
<property name="maximum">
<number>5000</number>
</property>
<property name="singleStep">
<number>100</number>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="KColorButton" name="kcfg_Color">
<property name="alphaChannelEnabled" stdset="0">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Whirling</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Details</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QDoubleSpinBox" name="kcfg_Details">
<property name="minimum">
<double>1.000000000000000</double>
</property>
<property name="maximum">
<double>100.000000000000000</double>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QDoubleSpinBox" name="kcfg_Whirl">
<property name="minimum">
<double>-2.000000000000000</double>
</property>
<property name="maximum">
<double>2.000000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="stepType">
<enum>QAbstractSpinBox::AdaptiveDecimalStepType</enum>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="kcfg_RotationSpeed">
<property name="minimum">
<double>-2.000000000000000</double>
</property>
<property name="maximum">
<double>2.000000000000000</double>
</property>
<property name="singleStep">
<double>0.100000000000000</double>
</property>
<property name="stepType">
<enum>QAbstractSpinBox::AdaptiveDecimalStepType</enum>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KColorButton</class>
<extends>QPushButton</extends>
<header>kcolorbutton.h</header>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>
+29
View File
@@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
SPDX-FileCopyrightText: Simon Schneegans <code@simonschneegans.de>
SPDX-License-Identifier: GPL-3.0-or-later
-->
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0 http://www.kde.org/standards/kcfg/1.0/kcfg.xsd">
<kcfgfile name="" />
<group name="">
<entry name="Duration" type="UInt">
<default>1250</default>
</entry>
<entry name="Color" type="Color">
<default>#79E918</default>
</entry>
<entry name="Details" type="Double">
<default>15.0</default>
</entry>
<entry name="RotationSpeed" type="Double">
<default>0.3</default>
</entry>
<entry name="Whirling" type="Double">
<default>1.0</default>
</entry>
</group>
</kcfg>
+7
View File
@@ -0,0 +1,7 @@
// SPDX-FileCopyrightText: Simon Schneegans <code@simonschneegans.de>
// 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()]);
+12
View File
@@ -0,0 +1,12 @@
// SPDX-FileCopyrightText: Simon Schneegans <code@simonschneegans.de>
// 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));
+79 -50
View File
@@ -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 <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\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 ""
+1
View File
@@ -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(),
+1 -6
View File
@@ -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);
+27 -2
View File
@@ -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) {
+206
View File
@@ -0,0 +1,206 @@
//////////////////////////////////////////////////////////////////////////////////////////
// ) ( //
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
// |__/ //
//////////////////////////////////////////////////////////////////////////////////////////
// SPDX-FileCopyrightText: Simon Schneegans <code@simonschneegans.de>
// 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);
}
+171
View File
@@ -0,0 +1,171 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
SPDX-FileCopyrightText: Simon Schneegans <code@simonschneegans.de>
SPDX-License-Identifier: GPL-3.0-or-later
-->
<interface domain="burn-my-windows">
<object class="AdwExpanderRow" id="portal-prefs">
<child>
<object class="AdwActionRow">
<property name="title" translatable="yes">Animation Time [ms]</property>
<child>
<object class="GtkScale">
<property name="valign">center</property>
<property name="draw-value">1</property>
<property name="digits">0</property>
<property name="value-pos">left</property>
<property name="width-request">300</property>
<property name="adjustment">
<object class="GtkAdjustment" id="portal-animation-time">
<property name="upper">5000</property>
<property name="lower">500</property>
<property name="step-increment">1</property>
<property name="page-increment">100</property>
</object>
</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset-portal-animation-time">
<property name="icon-name">edit-clear-symbolic</property>
<property name="valign">center</property>
<property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style>
<class name="flat" />
</style>
</object>
</child>
</object>
</child>
<child>
<object class="AdwActionRow">
<property name="title" translatable="yes">Rotation Speed</property>
<child>
<object class="GtkScale">
<property name="valign">center</property>
<property name="draw-value">1</property>
<property name="digits">2</property>
<property name="value-pos">left</property>
<property name="width-request">300</property>
<property name="adjustment">
<object class="GtkAdjustment" id="portal-rotation-speed">
<property name="upper">2</property>
<property name="lower">-2</property>
<property name="step-increment">0.1</property>
<property name="page-increment">1</property>
</object>
</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset-portal-rotation-speed">
<property name="icon-name">edit-clear-symbolic</property>
<property name="valign">center</property>
<property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style>
<class name="flat" />
</style>
</object>
</child>
</object>
</child>
<child>
<object class="AdwActionRow">
<property name="title" translatable="yes">Whirling</property>
<child>
<object class="GtkScale">
<property name="valign">center</property>
<property name="draw-value">1</property>
<property name="digits">2</property>
<property name="value-pos">left</property>
<property name="width-request">300</property>
<property name="adjustment">
<object class="GtkAdjustment" id="portal-whirling">
<property name="upper">2</property>
<property name="lower">-2</property>
<property name="step-increment">0.1</property>
<property name="page-increment">1</property>
</object>
</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset-portal-whirling">
<property name="icon-name">edit-clear-symbolic</property>
<property name="valign">center</property>
<property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style>
<class name="flat" />
</style>
</object>
</child>
</object>
</child>
<child>
<object class="AdwActionRow">
<property name="title" translatable="yes">Details</property>
<child>
<object class="GtkScale">
<property name="valign">center</property>
<property name="draw-value">1</property>
<property name="digits">1</property>
<property name="value-pos">left</property>
<property name="width-request">300</property>
<property name="adjustment">
<object class="GtkAdjustment" id="portal-details">
<property name="upper">100</property>
<property name="lower">1</property>
<property name="step-increment">1</property>
<property name="page-increment">10</property>
</object>
</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset-portal-details">
<property name="icon-name">edit-clear-symbolic</property>
<property name="valign">center</property>
<property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style>
<class name="flat" />
</style>
</object>
</child>
</object>
</child>
<child>
<object class="AdwActionRow">
<property name="title" translatable="yes">Color</property>
<property name="activatable-widget">portal-color</property>
<child>
<object class="GtkColorButton" id="portal-color">
<property name="valign">center</property>
<property name="width-request">250</property>
<property name="use_alpha">0</property>
<property name="show_editor">1</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset-portal-color">
<property name="icon-name">edit-clear-symbolic</property>
<property name="valign">center</property>
<property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style>
<class name="flat" />
</style>
</object>
</child>
</object>
</child>
</object>
</interface>
+301
View File
@@ -0,0 +1,301 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
SPDX-FileCopyrightText: Simon Schneegans <code@simonschneegans.de>
SPDX-License-Identifier: GPL-3.0-or-later
-->
<interface domain="burn-my-windows">
<object class="GtkAdjustment" id="portal-animation-time">
<property name="upper">5000</property>
<property name="lower">500</property>
<property name="step-increment">1</property>
<property name="page-increment">100</property>
</object>
<object class="GtkAdjustment" id="portal-rotation-speed">
<property name="upper">2</property>
<property name="lower">-2</property>
<property name="step-increment">0.1</property>
<property name="page-increment">1</property>
</object>
<object class="GtkAdjustment" id="portal-whirling">
<property name="upper">2</property>
<property name="lower">-2</property>
<property name="step-increment">0.1</property>
<property name="page-increment">1</property>
</object>
<object class="GtkAdjustment" id="portal-details">
<property name="upper">100</property>
<property name="lower">1</property>
<property name="step-increment">1</property>
<property name="page-increment">10</property>
</object>
<object class="GtkBox" id="portal-prefs">
<property name="orientation">vertical</property>
<child>
<object class="GtkFrame">
<child>
<object class="GtkListBox">
<property name="selection-mode">none</property>
<style>
<class name="rich-list" />
</style>
<child>
<object class="GtkListBoxRow">
<property name="margin-start">10</property>
<property name="margin-end">10</property>
<property name="margin-top">10</property>
<property name="margin-bottom">10</property>
<property name="activatable">0</property>
<child>
<object class="GtkBox">
<property name="spacing">8</property>
<child>
<object class="GtkLabel">
<property name="label" translatable="yes">Animation Time [ms]</property>
<property name="xalign">0</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="hexpand">1</property>
</object>
</child>
<child>
<object class="GtkScale">
<property name="halign">end</property>
<property name="valign">center</property>
<property name="draw-value">1</property>
<property name="digits">0</property>
<property name="value-pos">left</property>
<property name="width-request">300</property>
<property name="adjustment">portal-animation-time</property>
</object>
</child>
<child>
<object class="GtkButton"
id="reset-portal-animation-time">
<child>
<object class="GtkImage">
<property name="icon-name">edit-clear-symbolic</property>
<property name="icon-size">1</property>
</object>
</child>
<property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style>
<class name="flat" />
</style>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkListBoxRow">
<property name="margin-start">10</property>
<property name="margin-end">10</property>
<property name="margin-top">10</property>
<property name="margin-bottom">10</property>
<property name="activatable">0</property>
<child>
<object class="GtkBox">
<property name="spacing">8</property>
<child>
<object class="GtkLabel">
<property name="label" translatable="yes">Rotation Speed</property>
<property name="xalign">0</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="hexpand">1</property>
</object>
</child>
<child>
<object class="GtkScale">
<property name="halign">end</property>
<property name="valign">center</property>
<property name="draw-value">1</property>
<property name="digits">2</property>
<property name="value-pos">left</property>
<property name="width-request">300</property>
<property name="adjustment">portal-rotation-speed</property>
</object>
</child>
<child>
<object class="GtkButton"
id="reset-portal-rotation-speed">
<child>
<object class="GtkImage">
<property name="icon-name">edit-clear-symbolic</property>
<property name="icon-size">1</property>
</object>
</child>
<property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style>
<class name="flat" />
</style>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkListBoxRow">
<property name="margin-start">10</property>
<property name="margin-end">10</property>
<property name="margin-top">10</property>
<property name="margin-bottom">10</property>
<property name="activatable">0</property>
<child>
<object class="GtkBox">
<property name="spacing">8</property>
<child>
<object class="GtkLabel">
<property name="label" translatable="yes">Whirling</property>
<property name="xalign">0</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="hexpand">1</property>
</object>
</child>
<child>
<object class="GtkScale">
<property name="halign">end</property>
<property name="valign">center</property>
<property name="draw-value">1</property>
<property name="digits">2</property>
<property name="value-pos">left</property>
<property name="width-request">300</property>
<property name="adjustment">portal-whirling</property>
</object>
</child>
<child>
<object class="GtkButton"
id="reset-portal-whirling">
<child>
<object class="GtkImage">
<property name="icon-name">edit-clear-symbolic</property>
<property name="icon-size">1</property>
</object>
</child>
<property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style>
<class name="flat" />
</style>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkListBoxRow">
<property name="margin-start">10</property>
<property name="margin-end">10</property>
<property name="margin-top">10</property>
<property name="margin-bottom">10</property>
<property name="activatable">0</property>
<child>
<object class="GtkBox">
<property name="spacing">8</property>
<child>
<object class="GtkLabel">
<property name="label" translatable="yes">Details</property>
<property name="xalign">0</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="hexpand">1</property>
</object>
</child>
<child>
<object class="GtkScale">
<property name="halign">end</property>
<property name="valign">center</property>
<property name="draw-value">1</property>
<property name="digits">1</property>
<property name="value-pos">left</property>
<property name="width-request">300</property>
<property name="adjustment">portal-details</property>
</object>
</child>
<child>
<object class="GtkButton"
id="reset-portal-details">
<child>
<object class="GtkImage">
<property name="icon-name">edit-clear-symbolic</property>
<property name="icon-size">1</property>
</object>
</child>
<property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style>
<class name="flat" />
</style>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkListBoxRow">
<property name="margin-start">10</property>
<property name="margin-end">10</property>
<property name="margin-top">10</property>
<property name="margin-bottom">10</property>
<property name="activatable">0</property>
<child>
<object class="GtkBox">
<child>
<object class="GtkLabel">
<property name="label" translatable="yes">Color</property>
<property name="xalign">0</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="hexpand">1</property>
</object>
</child>
<child>
<object class="GtkColorButton" id="portal-color">
<property name="use_alpha">0</property>
<property name="show_editor">1</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset-portal-color">
<child>
<object class="GtkImage">
<property name="icon-name">edit-clear-symbolic</property>
<property name="icon-size">1</property>
</object>
</child>
<property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style>
<class name="flat" />
</style>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>
+249
View File
@@ -0,0 +1,249 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
SPDX-FileCopyrightText: Simon Schneegans <code@simonschneegans.de>
SPDX-License-Identifier: GPL-3.0-or-later
-->
<interface domain="burn-my-windows">
<object class="GtkBox" id="portal-prefs">
<property name="orientation">vertical</property>
<child>
<object class="GtkFrame">
<child>
<object class="GtkListBox">
<property name="selection-mode">none</property>
<property name="show-separators">1</property>
<style>
<class name="rich-list" />
</style>
<child>
<object class="GtkListBoxRow">
<property name="activatable">0</property>
<child>
<object class="GtkBox">
<child>
<object class="GtkLabel">
<property name="label" translatable="yes">Animation Time [ms]</property>
<property name="xalign">0</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="hexpand">1</property>
</object>
</child>
<child>
<object class="GtkScale">
<property name="halign">end</property>
<property name="valign">center</property>
<property name="draw-value">1</property>
<property name="digits">0</property>
<property name="value-pos">left</property>
<property name="width-request">300</property>
<property name="adjustment">
<object class="GtkAdjustment" id="portal-animation-time">
<property name="upper">5000</property>
<property name="lower">500</property>
<property name="step-increment">1</property>
<property name="page-increment">100</property>
</object>
</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset-portal-animation-time">
<property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style>
<class name="flat" />
</style>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkListBoxRow">
<property name="activatable">0</property>
<child>
<object class="GtkBox">
<child>
<object class="GtkLabel">
<property name="label" translatable="yes">Whirling</property>
<property name="xalign">0</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="hexpand">1</property>
</object>
</child>
<child>
<object class="GtkScale">
<property name="halign">end</property>
<property name="valign">center</property>
<property name="draw-value">1</property>
<property name="digits">2</property>
<property name="value-pos">left</property>
<property name="width-request">300</property>
<property name="adjustment">
<object class="GtkAdjustment" id="portal-whirling">
<property name="upper">2</property>
<property name="lower">-2</property>
<property name="step-increment">0.1</property>
<property name="page-increment">1</property>
</object>
</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset-portal-whirling">
<property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style>
<class name="flat" />
</style>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkListBoxRow">
<property name="activatable">0</property>
<child>
<object class="GtkBox">
<child>
<object class="GtkLabel">
<property name="label" translatable="yes">Rotation Speed</property>
<property name="xalign">0</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="hexpand">1</property>
</object>
</child>
<child>
<object class="GtkScale">
<property name="halign">end</property>
<property name="valign">center</property>
<property name="draw-value">1</property>
<property name="digits">2</property>
<property name="value-pos">left</property>
<property name="width-request">300</property>
<property name="adjustment">
<object class="GtkAdjustment" id="portal-rotation-speed">
<property name="upper">2</property>
<property name="lower">-2</property>
<property name="step-increment">0.1</property>
<property name="page-increment">1</property>
</object>
</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset-portal-rotation-speed">
<property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style>
<class name="flat" />
</style>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkListBoxRow">
<property name="activatable">0</property>
<child>
<object class="GtkBox">
<child>
<object class="GtkLabel">
<property name="label" translatable="yes">Details</property>
<property name="xalign">0</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="hexpand">1</property>
</object>
</child>
<child>
<object class="GtkScale">
<property name="halign">end</property>
<property name="valign">center</property>
<property name="draw-value">1</property>
<property name="digits">1</property>
<property name="value-pos">left</property>
<property name="width-request">300</property>
<property name="adjustment">
<object class="GtkAdjustment" id="portal-details">
<property name="upper">100</property>
<property name="lower">1</property>
<property name="step-increment">1</property>
<property name="page-increment">10</property>
</object>
</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset-portal-details">
<property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style>
<class name="flat" />
</style>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkListBoxRow">
<property name="activatable">0</property>
<child>
<object class="GtkBox">
<child>
<object class="GtkLabel">
<property name="label" translatable="yes">Color</property>
<property name="xalign">0</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="hexpand">1</property>
</object>
</child>
<child>
<object class="GtkColorButton" id="portal-color">
<property name="use_alpha">0</property>
<property name="show_editor">1</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset-portal-color">
<property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style>
<class name="flat" />
</style>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>
@@ -44,7 +44,7 @@ SPDX-License-Identifier: CC0-1.0
</key>
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
<!-- Apparition Effect Options -->
<!-- Apparition Effect Options -->
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
<key name="apparition-open-effect" type="b">
@@ -715,6 +715,52 @@ SPDX-License-Identifier: CC0-1.0
<description>Use the pointer location for the broken glass effect.</description>
</key>
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
<!-- Portal Options -->
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
<key name="portal-close-effect" type="b">
<default>false</default>
<summary>Portal Close Effect</summary>
<description>Use the Portal effect for window closing.</description>
</key>
<key name="portal-open-effect" type="b">
<default>false</default>
<summary>Portal Open Effect</summary>
<description>Use the Portal effect for window opening.</description>
</key>
<key name="portal-animation-time" type="i">
<default>1250</default>
<summary>Portal Animation Time</summary>
<description>The time the Portal effect takes.</description>
</key>
<key name="portal-color" type="s">
<default>"rgb(121, 233, 24)"</default>
<summary>Portal Color</summary>
<description>The color of the effect.</description>
</key>
<key name="portal-rotation-speed" type="d">
<default>0.3</default>
<summary>Portal Rotation Speed</summary>
<description>The angular speed of the portal.</description>
</key>
<key name="portal-whirling" type="d">
<default>1.0</default>
<summary>Portal Whirling</summary>
<description>The amount of distortion.</description>
</key>
<key name="portal-details" type="d">
<default>15.0</default>
<summary>Portal Details</summary>
<description>The amount of details in the portal.</description>
</key>
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
<!-- Snap of Disintegration Effect Options -->
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+120
View File
@@ -0,0 +1,120 @@
//////////////////////////////////////////////////////////////////////////////////////////
// ) ( //
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
// |__/ //
//////////////////////////////////////////////////////////////////////////////////////////
// SPDX-FileCopyrightText: Simon Schneegans <code@simonschneegans.de>
// 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/<nick>.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};
}
}
+1
View File
@@ -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"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 942 B

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 877 B

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 877 B

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 979 B

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 917 B

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 917 B

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 942 B

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 877 B

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 877 B

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 979 B

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 917 B

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 917 B

After

Width:  |  Height:  |  Size: 196 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 717 B

After

Width:  |  Height:  |  Size: 263 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 651 B

After

Width:  |  Height:  |  Size: 288 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 603 B

After

Width:  |  Height:  |  Size: 265 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 594 B

After

Width:  |  Height:  |  Size: 265 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 699 B

After

Width:  |  Height:  |  Size: 285 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 625 B

After

Width:  |  Height:  |  Size: 308 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 603 B

After

Width:  |  Height:  |  Size: 284 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 617 B

After

Width:  |  Height:  |  Size: 284 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 631 B

After

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 466 B

After

Width:  |  Height:  |  Size: 250 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 498 B

After

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 498 B

After

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 603 B

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 437 B

After

Width:  |  Height:  |  Size: 240 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 484 B

After

Width:  |  Height:  |  Size: 257 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 484 B

After

Width:  |  Height:  |  Size: 257 B

View File

Before

Width:  |  Height:  |  Size: 340 B

After

Width:  |  Height:  |  Size: 340 B

View File

Before

Width:  |  Height:  |  Size: 339 B

After

Width:  |  Height:  |  Size: 339 B

View File

Before

Width:  |  Height:  |  Size: 341 B

After

Width:  |  Height:  |  Size: 341 B

View File

Before

Width:  |  Height:  |  Size: 337 B

After

Width:  |  Height:  |  Size: 337 B

View File

Before

Width:  |  Height:  |  Size: 337 B

After

Width:  |  Height:  |  Size: 337 B

View File

Before

Width:  |  Height:  |  Size: 342 B

After

Width:  |  Height:  |  Size: 342 B

View File

Before

Width:  |  Height:  |  Size: 340 B

After

Width:  |  Height:  |  Size: 340 B

View File

Before

Width:  |  Height:  |  Size: 352 B

After

Width:  |  Height:  |  Size: 352 B

View File

Before

Width:  |  Height:  |  Size: 347 B

After

Width:  |  Height:  |  Size: 347 B

View File

Before

Width:  |  Height:  |  Size: 347 B

After

Width:  |  Height:  |  Size: 347 B

View File

Before

Width:  |  Height:  |  Size: 340 B

After

Width:  |  Height:  |  Size: 340 B

View File

Before

Width:  |  Height:  |  Size: 339 B

After

Width:  |  Height:  |  Size: 339 B

View File

Before

Width:  |  Height:  |  Size: 341 B

After

Width:  |  Height:  |  Size: 341 B

View File

Before

Width:  |  Height:  |  Size: 337 B

After

Width:  |  Height:  |  Size: 337 B

View File

Before

Width:  |  Height:  |  Size: 337 B

After

Width:  |  Height:  |  Size: 337 B

View File

Before

Width:  |  Height:  |  Size: 342 B

After

Width:  |  Height:  |  Size: 342 B

View File

Before

Width:  |  Height:  |  Size: 340 B

After

Width:  |  Height:  |  Size: 340 B

View File

Before

Width:  |  Height:  |  Size: 352 B

After

Width:  |  Height:  |  Size: 352 B

View File

Before

Width:  |  Height:  |  Size: 347 B

After

Width:  |  Height:  |  Size: 347 B

View File

Before

Width:  |  Height:  |  Size: 347 B

After

Width:  |  Height:  |  Size: 347 B

View File

Before

Width:  |  Height:  |  Size: 494 B

After

Width:  |  Height:  |  Size: 494 B

View File

Before

Width:  |  Height:  |  Size: 617 B

After

Width:  |  Height:  |  Size: 617 B

View File

Before

Width:  |  Height:  |  Size: 560 B

After

Width:  |  Height:  |  Size: 560 B

View File

Before

Width:  |  Height:  |  Size: 676 B

After

Width:  |  Height:  |  Size: 676 B

View File

Before

Width:  |  Height:  |  Size: 676 B

After

Width:  |  Height:  |  Size: 676 B

View File

Before

Width:  |  Height:  |  Size: 470 B

After

Width:  |  Height:  |  Size: 470 B

View File

Before

Width:  |  Height:  |  Size: 568 B

After

Width:  |  Height:  |  Size: 568 B

View File

Before

Width:  |  Height:  |  Size: 557 B

After

Width:  |  Height:  |  Size: 557 B

View File

Before

Width:  |  Height:  |  Size: 575 B

After

Width:  |  Height:  |  Size: 575 B

View File

Before

Width:  |  Height:  |  Size: 575 B

After

Width:  |  Height:  |  Size: 575 B

View File

Before

Width:  |  Height:  |  Size: 515 B

After

Width:  |  Height:  |  Size: 515 B

View File

Before

Width:  |  Height:  |  Size: 738 B

After

Width:  |  Height:  |  Size: 738 B

View File

Before

Width:  |  Height:  |  Size: 836 B

After

Width:  |  Height:  |  Size: 836 B

View File

Before

Width:  |  Height:  |  Size: 763 B

After

Width:  |  Height:  |  Size: 763 B

View File

Before

Width:  |  Height:  |  Size: 763 B

After

Width:  |  Height:  |  Size: 763 B

View File

Before

Width:  |  Height:  |  Size: 686 B

After

Width:  |  Height:  |  Size: 686 B

View File

Before

Width:  |  Height:  |  Size: 745 B

After

Width:  |  Height:  |  Size: 745 B

View File

Before

Width:  |  Height:  |  Size: 794 B

After

Width:  |  Height:  |  Size: 794 B

View File

Before

Width:  |  Height:  |  Size: 754 B

After

Width:  |  Height:  |  Size: 754 B

View File

Before

Width:  |  Height:  |  Size: 754 B

After

Width:  |  Height:  |  Size: 754 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 350 B

After

Width:  |  Height:  |  Size: 585 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 350 B

After

Width:  |  Height:  |  Size: 610 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 343 B

After

Width:  |  Height:  |  Size: 585 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 343 B

After

Width:  |  Height:  |  Size: 594 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 343 B

After

Width:  |  Height:  |  Size: 594 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 347 B

After

Width:  |  Height:  |  Size: 608 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 348 B

After

Width:  |  Height:  |  Size: 603 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 358 B

After

Width:  |  Height:  |  Size: 613 B

Some files were not shown because too many files have changed in this diff Show More