🔀 Merge pull request #351 from Schneegans/feature/paint-brush
This commit is contained in:
@@ -37,6 +37,7 @@ Effect | Preview
|
||||
**Hexagon** <br> With glowing lines and hexagon-shaped tiles, this effect looks very sci-fi. | <img src ="docs/pics/hexagon.gif" />
|
||||
**Incinerate** <br> A less snappy but definitely more fancy take on the fire effect. | <img src ="docs/pics/incinerate.gif" />
|
||||
**Matrix** <br> Turn your windows into a shower of green letters! The color is actually configurable.| <img src ="docs/pics/matrix.gif" />
|
||||
**Paint Brush** <br> Paint or erase your windows with a thick paint brush. | <img src ="docs/pics/paint-brush.gif" />
|
||||
**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" />
|
||||
@@ -71,6 +72,7 @@ Below is a table which summarizes the current availability for all effects.
|
||||
<tr><td>Hexagon</td> <td>✅</td> <td>✅</td> <td>✅</td> <td>✅</td> </tr>
|
||||
<tr><td>Incinerate</td> <td>✅</td> <td>✅</td> <td>✅</td> <td>✅</td> </tr>
|
||||
<tr><td>Matrix</td> <td> </td> <td> </td> <td>✅</td> <td> </td> </tr>
|
||||
<tr><td>Paint Brush</td> <td> </td> <td> </td> <td>✅</td> <td> </td> </tr>
|
||||
<tr><td>Pixelate</td> <td>✅</td> <td>✅</td> <td>✅</td> <td>✅</td> </tr>
|
||||
<tr><td>Pixel Wheel</td> <td>✅</td> <td>✅</td> <td>✅</td> <td>✅</td> </tr>
|
||||
<tr><td>Pixel Wipe</td> <td>✅</td> <td>✅</td> <td>✅</td> <td>✅</td> </tr>
|
||||
|
||||
+15
-2
@@ -1,7 +1,20 @@
|
||||
# Notes for `claws.blend`
|
||||
# `claws.blend`
|
||||
|
||||
This is the source file for `resources/img/claws.png`. To generate the image, the animation in `claws.blend` is rendered to 256 PNG files and then combined using this command:
|
||||
|
||||
```bash
|
||||
convert *.png -average claws.png
|
||||
```
|
||||
```
|
||||
|
||||
# `brush.blend`
|
||||
|
||||
This is the source file for `resources/img/brush.png`. To generate the image, the four dynamic paint image sequences in `brush.blend` are baked to 256 PNG files each. They are then combined using these commands:
|
||||
|
||||
```bash
|
||||
convert brush1/*.png -average brush1.png
|
||||
convert brush2/*.png -average brush2.png
|
||||
convert brush3/*.png -average brush3.png
|
||||
convert brush4/*.png -average brush4.png
|
||||
|
||||
convert brush1.png brush2.png brush3.png brush4.png -channel RGBA -combine brush.png
|
||||
```
|
||||
|
||||
Binary file not shown.
@@ -5,6 +5,14 @@ SPDX-License-Identifier: CC-BY-4.0
|
||||
|
||||
# Changelog of the Burn-My-Windows Extension
|
||||
|
||||
## [Burn My Windows 35](https://github.com/schneegans/Burn-My-Windows/releases/tag/v35)
|
||||
|
||||
**Release Date:** TBD
|
||||
|
||||
#### New Features
|
||||
|
||||
- **New Effect: Paint-Brush.** This effect paints or erases your windows with a thick paint brush.
|
||||
|
||||
## [Burn My Windows 34](https://github.com/schneegans/Burn-My-Windows/releases/tag/v34)
|
||||
|
||||
**Release Date:** 2023-09-06
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 383 KiB |
@@ -65,6 +65,7 @@ class Extension {
|
||||
new Me.imports.src.effects.Hexagon.Hexagon(),
|
||||
new Me.imports.src.effects.Incinerate.Incinerate(),
|
||||
new Me.imports.src.effects.Matrix.Matrix(),
|
||||
new Me.imports.src.effects.PaintBrush.PaintBrush(),
|
||||
new Me.imports.src.effects.Pixelate.Pixelate(),
|
||||
new Me.imports.src.effects.PixelWheel.PixelWheel(),
|
||||
new Me.imports.src.effects.PixelWipe.PixelWipe(),
|
||||
|
||||
+63
-52
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: burn-my-windows\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2023-02-21 16:46+0100\n"
|
||||
"POT-Creation-Date: 2023-07-02 21:54+0200\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"
|
||||
@@ -17,77 +17,77 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=CHARSET\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: src/ProfileManager.js:168 resources/ui/gtk4/prefs.ui:220
|
||||
#: src/ProfileManager.js:175 resources/ui/gtk4/prefs.ui:220
|
||||
#: resources/ui/gtk3/prefs.ui:265 resources/ui/adw/prefs.ui:103
|
||||
msgid "Opening Windows"
|
||||
msgstr ""
|
||||
|
||||
#: src/ProfileManager.js:169 resources/ui/gtk4/prefs.ui:221
|
||||
#: src/ProfileManager.js:176 resources/ui/gtk4/prefs.ui:221
|
||||
#: resources/ui/gtk3/prefs.ui:266 resources/ui/adw/prefs.ui:104
|
||||
msgid "Closing Windows"
|
||||
msgstr ""
|
||||
|
||||
#: src/ProfileManager.js:170 resources/ui/gtk4/prefs.ui:249
|
||||
#: src/ProfileManager.js:177 resources/ui/gtk4/prefs.ui:249
|
||||
#: resources/ui/gtk3/prefs.ui:294 resources/ui/adw/prefs.ui:118
|
||||
msgid "Normal Windows"
|
||||
msgstr ""
|
||||
|
||||
#: src/ProfileManager.js:171 resources/ui/gtk4/prefs.ui:250
|
||||
#: src/ProfileManager.js:178 resources/ui/gtk4/prefs.ui:250
|
||||
#: resources/ui/gtk3/prefs.ui:295 resources/ui/adw/prefs.ui:119
|
||||
msgid "Dialog Windows"
|
||||
msgstr ""
|
||||
|
||||
#: src/ProfileManager.js:172 resources/ui/gtk4/prefs.ui:278
|
||||
#: src/ProfileManager.js:179 resources/ui/gtk4/prefs.ui:278
|
||||
#: resources/ui/gtk3/prefs.ui:323 resources/ui/adw/prefs.ui:133
|
||||
msgid "Default Color Scheme"
|
||||
msgstr ""
|
||||
|
||||
#: src/ProfileManager.js:173 resources/ui/gtk4/prefs.ui:279
|
||||
#: src/ProfileManager.js:180 resources/ui/gtk4/prefs.ui:279
|
||||
#: resources/ui/gtk3/prefs.ui:324 resources/ui/adw/prefs.ui:134
|
||||
msgid "Dark Color Scheme"
|
||||
msgstr ""
|
||||
|
||||
#: src/ProfileManager.js:174 resources/ui/gtk4/prefs.ui:307
|
||||
#: src/ProfileManager.js:181 resources/ui/gtk4/prefs.ui:307
|
||||
#: resources/ui/gtk3/prefs.ui:352 resources/ui/adw/prefs.ui:148
|
||||
msgid "On Battery"
|
||||
msgstr ""
|
||||
|
||||
#: src/ProfileManager.js:175 resources/ui/gtk4/prefs.ui:308
|
||||
#: src/ProfileManager.js:182 resources/ui/gtk4/prefs.ui:308
|
||||
#: resources/ui/gtk3/prefs.ui:353 resources/ui/adw/prefs.ui:149
|
||||
msgid "Plugged In"
|
||||
msgstr ""
|
||||
|
||||
#: src/ProfileManager.js:176 resources/ui/gtk4/prefs.ui:336
|
||||
#: src/ProfileManager.js:183 resources/ui/gtk4/prefs.ui:336
|
||||
#: resources/ui/gtk3/prefs.ui:381 resources/ui/adw/prefs.ui:163
|
||||
msgid "Power-Saver Mode"
|
||||
msgstr ""
|
||||
|
||||
#: src/ProfileManager.js:177 resources/ui/gtk4/prefs.ui:337
|
||||
#: src/ProfileManager.js:184 resources/ui/gtk4/prefs.ui:337
|
||||
#: resources/ui/gtk3/prefs.ui:382 resources/ui/adw/prefs.ui:164
|
||||
msgid "Balanced Mode"
|
||||
msgstr ""
|
||||
|
||||
#: src/ProfileManager.js:178 resources/ui/gtk4/prefs.ui:338
|
||||
#: src/ProfileManager.js:185 resources/ui/gtk4/prefs.ui:338
|
||||
#: resources/ui/gtk3/prefs.ui:383 resources/ui/adw/prefs.ui:165
|
||||
msgid "Performance Mode"
|
||||
msgstr ""
|
||||
|
||||
#: src/ProfileManager.js:179 resources/ui/gtk4/prefs.ui:339
|
||||
#: src/ProfileManager.js:186 resources/ui/gtk4/prefs.ui:339
|
||||
#: resources/ui/gtk3/prefs.ui:384 resources/ui/adw/prefs.ui:166
|
||||
msgid "Power Saver or Balanced"
|
||||
msgstr ""
|
||||
|
||||
#: src/ProfileManager.js:180 resources/ui/gtk4/prefs.ui:340
|
||||
#: src/ProfileManager.js:187 resources/ui/gtk4/prefs.ui:340
|
||||
#: resources/ui/gtk3/prefs.ui:385 resources/ui/adw/prefs.ui:167
|
||||
msgid "Balanced or Performance"
|
||||
msgstr ""
|
||||
|
||||
#: src/ProfileManager.js:185 resources/ui/gtk4/prefs.ui:387
|
||||
#: src/ProfileManager.js:192 resources/ui/gtk4/prefs.ui:387
|
||||
#: resources/ui/gtk3/prefs.ui:432 resources/ui/adw/prefs.ui:183
|
||||
msgid "High Priority"
|
||||
msgstr ""
|
||||
|
||||
#: src/ProfileManager.js:191
|
||||
#: src/ProfileManager.js:198
|
||||
msgid "Standard Profile"
|
||||
msgstr ""
|
||||
|
||||
@@ -155,6 +155,10 @@ msgstr ""
|
||||
msgid "Matrix"
|
||||
msgstr ""
|
||||
|
||||
#: src/effects/PaintBrush.js:102
|
||||
msgid "Paint Brush"
|
||||
msgstr ""
|
||||
|
||||
#: src/effects/Pixelate.js:74
|
||||
msgid "Pixelate"
|
||||
msgstr ""
|
||||
@@ -191,60 +195,60 @@ msgstr ""
|
||||
msgid "Wisps"
|
||||
msgstr ""
|
||||
|
||||
#: prefs.js:247
|
||||
#: prefs.js:256
|
||||
msgid "Preview this effect"
|
||||
msgstr ""
|
||||
|
||||
#: prefs.js:364 resources/ui/gtk4/prefs.ui:50 resources/ui/gtk3/prefs.ui:86
|
||||
#: prefs.js:375 resources/ui/gtk4/prefs.ui:50 resources/ui/gtk3/prefs.ui:86
|
||||
msgid "Burn-My-Windows has been updated!"
|
||||
msgstr ""
|
||||
|
||||
#: prefs.js:365 resources/ui/common/menus.ui:17 resources/ui/gtk4/prefs.ui:56
|
||||
#: prefs.js:376 resources/ui/common/menus.ui:17 resources/ui/gtk4/prefs.ui:56
|
||||
#: resources/ui/gtk3/prefs.ui:96
|
||||
msgid "View Changelog"
|
||||
msgstr ""
|
||||
|
||||
#: prefs.js:496 prefs.js:528
|
||||
#: prefs.js:557 prefs.js:589
|
||||
msgid "Gold Sponsors"
|
||||
msgstr ""
|
||||
|
||||
#: prefs.js:500 prefs.js:532
|
||||
#: prefs.js:561 prefs.js:593
|
||||
msgid "Silver Sponsors"
|
||||
msgstr ""
|
||||
|
||||
#: prefs.js:504 prefs.js:536
|
||||
#: prefs.js:565 prefs.js:597
|
||||
msgid "Bronze Sponsors"
|
||||
msgstr ""
|
||||
|
||||
#: prefs.js:508 prefs.js:540
|
||||
#: prefs.js:569 prefs.js:601
|
||||
msgid "Past Sponsors"
|
||||
msgstr ""
|
||||
|
||||
#: prefs.js:585
|
||||
#: prefs.js:646
|
||||
msgid "Delete this Profile?"
|
||||
msgstr ""
|
||||
|
||||
#: prefs.js:587
|
||||
#: prefs.js:647
|
||||
msgid ""
|
||||
"The current effect profile with all its effect settings will be permanently "
|
||||
"lost."
|
||||
msgstr ""
|
||||
|
||||
#: prefs.js:592
|
||||
#: prefs.js:650
|
||||
msgid "Cancel"
|
||||
msgstr ""
|
||||
|
||||
#: prefs.js:593
|
||||
#: prefs.js:655
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: %s will be replaced by the effect's name.
|
||||
#: prefs.js:923
|
||||
#: prefs.js:966
|
||||
#, javascript-format
|
||||
msgid "Preview for %s"
|
||||
msgstr ""
|
||||
|
||||
#: prefs.js:945
|
||||
#: prefs.js:988
|
||||
msgid "Close this Window to Preview the Effect!"
|
||||
msgstr ""
|
||||
|
||||
@@ -272,35 +276,36 @@ msgstr ""
|
||||
msgid "Donate"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/common/menus.ui:52
|
||||
#: resources/ui/common/menus.ui:56
|
||||
msgid "About Burn-My-Windows"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/common/menus.ui:63
|
||||
#: resources/ui/common/menus.ui:67
|
||||
msgid "Add New Profile..."
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/broken-glass.ui:22 resources/ui/gtk4/tv-glitch.ui:23
|
||||
#: resources/ui/gtk4/glitch.ui:23 resources/ui/gtk4/matrix.ui:23
|
||||
#: resources/ui/gtk4/doom.ui:22 resources/ui/gtk4/trex.ui:23
|
||||
#: resources/ui/gtk4/wisps.ui:23 resources/ui/gtk4/energize-b.ui:23
|
||||
#: resources/ui/gtk4/pixel-wheel.ui:23 resources/ui/gtk4/glide.ui:23
|
||||
#: resources/ui/gtk4/apparition.ui:22 resources/ui/gtk4/portal.ui:23
|
||||
#: resources/ui/gtk4/incinerate.ui:23 resources/ui/gtk4/hexagon.ui:23
|
||||
#: resources/ui/gtk4/fire.ui:46 resources/ui/gtk4/pixel-wipe.ui:23
|
||||
#: resources/ui/gtk4/snap.ui:23 resources/ui/gtk4/energize-a.ui:23
|
||||
#: resources/ui/gtk4/pixelate.ui:23 resources/ui/gtk4/tv.ui:23
|
||||
#: resources/ui/gtk3/tv-glitch.ui:52 resources/ui/gtk3/glitch.ui:52
|
||||
#: resources/ui/gtk3/doom.ui:52 resources/ui/gtk3/wisps.ui:38
|
||||
#: resources/ui/gtk3/energize-b.ui:38 resources/ui/gtk3/pixel-wheel.ui:45
|
||||
#: resources/ui/gtk3/glide.ui:59 resources/ui/gtk3/apparition.ui:59
|
||||
#: resources/ui/gtk3/portal.ui:52 resources/ui/gtk3/incinerate.ui:45
|
||||
#: resources/ui/gtk3/hexagon.ui:45 resources/ui/gtk3/fire.ui:84
|
||||
#: resources/ui/gtk3/pixel-wipe.ui:45 resources/ui/gtk3/energize-a.ui:38
|
||||
#: resources/ui/gtk3/pixelate.ui:45 resources/ui/gtk3/tv.ui:31
|
||||
#: resources/ui/adw/broken-glass.ui:15 resources/ui/adw/tv-glitch.ui:14
|
||||
#: resources/ui/adw/glitch.ui:14 resources/ui/adw/matrix.ui:14
|
||||
#: resources/ui/adw/doom.ui:14 resources/ui/adw/trex.ui:14
|
||||
#: resources/ui/gtk4/doom.ui:22 resources/ui/gtk4/paint-brush.ui:23
|
||||
#: resources/ui/gtk4/trex.ui:23 resources/ui/gtk4/wisps.ui:23
|
||||
#: resources/ui/gtk4/energize-b.ui:23 resources/ui/gtk4/pixel-wheel.ui:23
|
||||
#: resources/ui/gtk4/glide.ui:23 resources/ui/gtk4/apparition.ui:22
|
||||
#: resources/ui/gtk4/portal.ui:23 resources/ui/gtk4/incinerate.ui:23
|
||||
#: resources/ui/gtk4/hexagon.ui:23 resources/ui/gtk4/fire.ui:46
|
||||
#: resources/ui/gtk4/pixel-wipe.ui:23 resources/ui/gtk4/snap.ui:23
|
||||
#: resources/ui/gtk4/energize-a.ui:23 resources/ui/gtk4/pixelate.ui:23
|
||||
#: resources/ui/gtk4/tv.ui:23 resources/ui/gtk3/tv-glitch.ui:52
|
||||
#: resources/ui/gtk3/glitch.ui:52 resources/ui/gtk3/doom.ui:52
|
||||
#: resources/ui/gtk3/wisps.ui:38 resources/ui/gtk3/energize-b.ui:38
|
||||
#: resources/ui/gtk3/pixel-wheel.ui:45 resources/ui/gtk3/glide.ui:59
|
||||
#: resources/ui/gtk3/apparition.ui:59 resources/ui/gtk3/portal.ui:52
|
||||
#: resources/ui/gtk3/incinerate.ui:45 resources/ui/gtk3/hexagon.ui:45
|
||||
#: resources/ui/gtk3/fire.ui:84 resources/ui/gtk3/pixel-wipe.ui:45
|
||||
#: resources/ui/gtk3/energize-a.ui:38 resources/ui/gtk3/pixelate.ui:45
|
||||
#: resources/ui/gtk3/tv.ui:31 resources/ui/adw/broken-glass.ui:15
|
||||
#: resources/ui/adw/tv-glitch.ui:14 resources/ui/adw/glitch.ui:14
|
||||
#: resources/ui/adw/matrix.ui:14 resources/ui/adw/doom.ui:14
|
||||
#: resources/ui/adw/paint-brush.ui:14 resources/ui/adw/trex.ui:14
|
||||
#: resources/ui/adw/wisps.ui:14 resources/ui/adw/energize-b.ui:15
|
||||
#: resources/ui/adw/pixel-wheel.ui:14 resources/ui/adw/glide.ui:14
|
||||
#: resources/ui/adw/apparition.ui:15 resources/ui/adw/portal.ui:14
|
||||
@@ -323,7 +328,8 @@ msgstr ""
|
||||
#: resources/ui/gtk4/matrix.ui:189 resources/ui/gtk4/matrix.ui:226
|
||||
#: resources/ui/gtk4/matrix.ui:263 resources/ui/gtk4/doom.ui:50
|
||||
#: resources/ui/gtk4/doom.ui:96 resources/ui/gtk4/doom.ui:142
|
||||
#: resources/ui/gtk4/doom.ui:188 resources/ui/gtk4/trex.ui:51
|
||||
#: resources/ui/gtk4/doom.ui:188 resources/ui/gtk4/paint-brush.ui:51
|
||||
#: resources/ui/gtk4/paint-brush.ui:97 resources/ui/gtk4/trex.ui:51
|
||||
#: resources/ui/gtk4/trex.ui:97 resources/ui/gtk4/trex.ui:143
|
||||
#: resources/ui/gtk4/trex.ui:189 resources/ui/gtk4/trex.ui:226
|
||||
#: resources/ui/gtk4/wisps.ui:51 resources/ui/gtk4/wisps.ui:97
|
||||
@@ -395,7 +401,8 @@ msgstr ""
|
||||
#: resources/ui/adw/matrix.ui:135 resources/ui/adw/matrix.ui:160
|
||||
#: resources/ui/adw/matrix.ui:185 resources/ui/adw/doom.ui:36
|
||||
#: resources/ui/adw/doom.ui:69 resources/ui/adw/doom.ui:102
|
||||
#: resources/ui/adw/doom.ui:135 resources/ui/adw/trex.ui:36
|
||||
#: resources/ui/adw/doom.ui:135 resources/ui/adw/paint-brush.ui:36
|
||||
#: resources/ui/adw/paint-brush.ui:69 resources/ui/adw/trex.ui:36
|
||||
#: resources/ui/adw/trex.ui:69 resources/ui/adw/trex.ui:102
|
||||
#: resources/ui/adw/trex.ui:135 resources/ui/adw/trex.ui:160
|
||||
#: resources/ui/adw/wisps.ui:36 resources/ui/adw/wisps.ui:69
|
||||
@@ -531,6 +538,10 @@ msgstr ""
|
||||
msgid "Pixel Size"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/paint-brush.ui:69 resources/ui/adw/paint-brush.ui:47
|
||||
msgid "Brush Size"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/trex.ui:69 resources/ui/adw/trex.ui:47
|
||||
msgid "Claw Scratch Scale"
|
||||
msgstr ""
|
||||
|
||||
@@ -56,6 +56,7 @@ var PreferencesDialog = class PreferencesDialog {
|
||||
new Me.imports.src.effects.Hexagon.Hexagon(),
|
||||
new Me.imports.src.effects.Incinerate.Incinerate(),
|
||||
new Me.imports.src.effects.Matrix.Matrix(),
|
||||
new Me.imports.src.effects.PaintBrush.PaintBrush(),
|
||||
new Me.imports.src.effects.Pixelate.Pixelate(),
|
||||
new Me.imports.src.effects.PixelWheel.PixelWheel(),
|
||||
new Me.imports.src.effects.PixelWipe.PixelWipe(),
|
||||
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 955 KiB |
@@ -0,0 +1,62 @@
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// ) ( //
|
||||
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
|
||||
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
|
||||
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
|
||||
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
|
||||
// | '_ \ || | '_| ' \)) | ' \()| || | \ 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.
|
||||
|
||||
// See assets/README.md for how this texture was created.
|
||||
uniform sampler2D uBrushTexture;
|
||||
uniform float uBrushSize;
|
||||
|
||||
const float SHADOW_WIDTH = 0.03;
|
||||
const float SHADOW_STEPS = 10.0;
|
||||
|
||||
// Returns 1.0 if the window texture at the given texCoord should be painted.
|
||||
float getMask(vec2 texCoord, float progress) {
|
||||
float brush = texture2D(uBrushTexture, texCoord)[int(uBrushSize - 1.0)];
|
||||
if (uForOpening) {
|
||||
return step(brush, progress);
|
||||
}
|
||||
|
||||
return step(progress, brush);
|
||||
}
|
||||
|
||||
void main() {
|
||||
|
||||
vec4 oColor = getInputColor(iTexCoord.st);
|
||||
|
||||
// This will be 0.0 in the masked-out areas.
|
||||
float mask = getMask(iTexCoord.st, uProgress);
|
||||
|
||||
// Add a simple drop shadow below the remaining parts.
|
||||
if (mask == 0.0) {
|
||||
|
||||
for (float i = 0.0; i < SHADOW_STEPS; ++i) {
|
||||
vec2 shadowTexCoord = iTexCoord.st - vec2(0.0, i * SHADOW_WIDTH / SHADOW_STEPS);
|
||||
float shadowMask = getMask(shadowTexCoord, uProgress);
|
||||
float shadowAlpha = (1.0 - i / SHADOW_STEPS) * shadowMask * getInputColor(shadowTexCoord).a;
|
||||
|
||||
if (shadowAlpha > 0.0) {
|
||||
oColor = vec4(vec3(0.0), shadowAlpha * 0.2);
|
||||
break;
|
||||
}
|
||||
|
||||
// If we arrived at the end of the shadow, make sure to set the alpha to 0.
|
||||
if (i == SHADOW_STEPS - 1.0) {
|
||||
oColor.a = 0.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setOutputColor(oColor);
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
<?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="paint-brush-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="paint-brush-animation-time">
|
||||
<property name="upper">10000</property>
|
||||
<property name="lower">100</property>
|
||||
<property name="step-increment">1</property>
|
||||
<property name="page-increment">100</property>
|
||||
</object>
|
||||
</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-paint-brush-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">Brush Size</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="paint-brush-size">
|
||||
<property name="upper">4</property>
|
||||
<property name="lower">1</property>
|
||||
<property name="step-increment">1</property>
|
||||
<property name="page-increment">1</property>
|
||||
</object>
|
||||
</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-paint-brush-size">
|
||||
<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>
|
||||
@@ -0,0 +1,113 @@
|
||||
<?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="GtkRevealer" id="paint-brush-prefs">
|
||||
|
||||
<child>
|
||||
<object class="GtkListBox">
|
||||
<property name="selection-mode">none</property>
|
||||
|
||||
<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="paint-brush-animation-time">
|
||||
<property name="upper">10000</property>
|
||||
<property name="lower">100</property>
|
||||
<property name="step-increment">1</property>
|
||||
<property name="page-increment">100</property>
|
||||
</object>
|
||||
</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-paint-brush-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">Brush Size</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="paint-brush-size">
|
||||
<property name="upper">4</property>
|
||||
<property name="lower">1</property>
|
||||
<property name="step-increment">1</property>
|
||||
<property name="page-increment">1</property>
|
||||
</object>
|
||||
</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-paint-brush-size">
|
||||
<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>
|
||||
|
||||
</interface>
|
||||
@@ -386,6 +386,28 @@ SPDX-License-Identifier: CC0-1.0
|
||||
<description>The color of the TV effect.</description>
|
||||
</key>
|
||||
|
||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
||||
<!-- Paint-Brush Options -->
|
||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
||||
|
||||
<key name="paint-brush-enable-effect" type="b">
|
||||
<default>false</default>
|
||||
<summary>Paint Brush Enable Effect</summary>
|
||||
<description>Use the paint-brush effect.</description>
|
||||
</key>
|
||||
|
||||
<key name="paint-brush-animation-time" type="i">
|
||||
<default>1000</default>
|
||||
<summary>Paint Brush Animation Time</summary>
|
||||
<description>The time the paint-brush effect takes.</description>
|
||||
</key>
|
||||
|
||||
<key name="paint-brush-size" type="i">
|
||||
<default>3</default>
|
||||
<summary>Paint Brush Size</summary>
|
||||
<description>Affects the number of paint strokes.</description>
|
||||
</key>
|
||||
|
||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
||||
<!-- T-Rex Attack Options -->
|
||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
||||
|
||||
@@ -0,0 +1,122 @@
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// ) ( //
|
||||
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
|
||||
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
|
||||
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
|
||||
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
|
||||
// | '_ \ || | '_| ' \)) | ' \()| || | \ 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;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// This effect paints your windows with a thick paint brush. //
|
||||
// This effect is not available on GNOME 3.3x, due to the limitation described in the //
|
||||
// documentation of vfunc_paint_target further down in this file. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// 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 PaintBrush = 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 these modules in this function as they are not available in the
|
||||
// preferences process. This callback is only called within GNOME Shell's process.
|
||||
const {Clutter, GdkPixbuf, Cogl} = imports.gi;
|
||||
|
||||
// Create the texture in the first call.
|
||||
if (!this._brushTexture) {
|
||||
const brushData = GdkPixbuf.Pixbuf.new_from_resource('/img/brush.png');
|
||||
this._brushTexture = new Clutter.Image();
|
||||
this._brushTexture.set_data(brushData.get_pixels(),
|
||||
Cogl.PixelFormat.RGBA_8888_PRE, brushData.width,
|
||||
brushData.height, brushData.rowstride);
|
||||
}
|
||||
|
||||
// Store uniform locations of newly created shaders.
|
||||
shader._uBrushTexture = shader.get_uniform_location('uBrushTexture');
|
||||
shader._uBrushSize = shader.get_uniform_location('uBrushSize');
|
||||
|
||||
// Write all uniform values at the start of each animation.
|
||||
shader.connect('begin-animation', (shader, settings, forOpening, testMode) => {
|
||||
shader.set_uniform_float(shader._uBrushSize, 1,
|
||||
[settings.get_int('paint-brush-size')]);
|
||||
});
|
||||
|
||||
// This is required to bind the brush texture for drawing. Sadly, this seems to be
|
||||
// impossible under GNOME 3.3x as this.get_pipeline() is not available. It was
|
||||
// called get_target() back then but this is not wrapped in GJS.
|
||||
// https://gitlab.gnome.org/GNOME/mutter/-/blob/gnome-3-36/clutter/clutter/clutter-offscreen-effect.c#L598
|
||||
shader.connect('update-animation', (shader) => {
|
||||
const pipeline = shader.get_pipeline();
|
||||
|
||||
// Use linear filtering for the window texture.
|
||||
pipeline.set_layer_filters(0, Cogl.PipelineFilter.LINEAR,
|
||||
Cogl.PipelineFilter.LINEAR);
|
||||
|
||||
// Bind the brush texture.
|
||||
pipeline.set_layer_texture(1, this._brushTexture.get_texture());
|
||||
pipeline.set_uniform_1i(shader._uBrushTexture, 1);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------- metadata
|
||||
|
||||
// This effect is only available on GNOME Shell 40+.
|
||||
getMinShellVersion() {
|
||||
return [40, 0];
|
||||
}
|
||||
|
||||
// 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. '*-enable-effect'), and its animation time
|
||||
// (e.g. '*-animation-time').
|
||||
getNick() {
|
||||
return 'paint-brush';
|
||||
}
|
||||
|
||||
// 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 _('Paint Brush');
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------- API for prefs.js
|
||||
|
||||
// This is called by the preferences dialog whenever a new effect profile is loaded. It
|
||||
// binds all user interface elements to the respective settings keys of the profile.
|
||||
bindPreferences(dialog) {
|
||||
dialog.bindAdjustment('paint-brush-animation-time');
|
||||
dialog.bindAdjustment('paint-brush-size');
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------- 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};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user