🔀 Merge pull request #351 from Schneegans/feature/paint-brush

This commit is contained in:
Simon Schneegans
2023-07-03 05:50:51 +02:00
committed by GitHub
14 changed files with 489 additions and 54 deletions
+2
View File
@@ -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" /> **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" /> **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" /> **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" /> **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 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" /> **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>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>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>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>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 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> <tr><td>Pixel Wipe</td> <td>✅</td> <td>✅</td> <td>✅</td> <td>✅</td> </tr>
+15 -2
View File
@@ -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: 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 ```bash
convert *.png -average claws.png 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.
+8
View File
@@ -5,6 +5,14 @@ SPDX-License-Identifier: CC-BY-4.0
# Changelog of the Burn-My-Windows Extension # 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) ## [Burn My Windows 34](https://github.com/schneegans/Burn-My-Windows/releases/tag/v34)
**Release Date:** 2023-09-06 **Release Date:** 2023-09-06
Binary file not shown.

After

Width:  |  Height:  |  Size: 383 KiB

+1
View File
@@ -65,6 +65,7 @@ class Extension {
new Me.imports.src.effects.Hexagon.Hexagon(), new Me.imports.src.effects.Hexagon.Hexagon(),
new Me.imports.src.effects.Incinerate.Incinerate(), new Me.imports.src.effects.Incinerate.Incinerate(),
new Me.imports.src.effects.Matrix.Matrix(), 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.Pixelate.Pixelate(),
new Me.imports.src.effects.PixelWheel.PixelWheel(), new Me.imports.src.effects.PixelWheel.PixelWheel(),
new Me.imports.src.effects.PixelWipe.PixelWipe(), new Me.imports.src.effects.PixelWipe.PixelWipe(),
+63 -52
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: burn-my-windows\n" "Project-Id-Version: burn-my-windows\n"
"Report-Msgid-Bugs-To: \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" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,77 +17,77 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n" "Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\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 #: resources/ui/gtk3/prefs.ui:265 resources/ui/adw/prefs.ui:103
msgid "Opening Windows" msgid "Opening Windows"
msgstr "" 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 #: resources/ui/gtk3/prefs.ui:266 resources/ui/adw/prefs.ui:104
msgid "Closing Windows" msgid "Closing Windows"
msgstr "" 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 #: resources/ui/gtk3/prefs.ui:294 resources/ui/adw/prefs.ui:118
msgid "Normal Windows" msgid "Normal Windows"
msgstr "" 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 #: resources/ui/gtk3/prefs.ui:295 resources/ui/adw/prefs.ui:119
msgid "Dialog Windows" msgid "Dialog Windows"
msgstr "" 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 #: resources/ui/gtk3/prefs.ui:323 resources/ui/adw/prefs.ui:133
msgid "Default Color Scheme" msgid "Default Color Scheme"
msgstr "" 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 #: resources/ui/gtk3/prefs.ui:324 resources/ui/adw/prefs.ui:134
msgid "Dark Color Scheme" msgid "Dark Color Scheme"
msgstr "" 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 #: resources/ui/gtk3/prefs.ui:352 resources/ui/adw/prefs.ui:148
msgid "On Battery" msgid "On Battery"
msgstr "" 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 #: resources/ui/gtk3/prefs.ui:353 resources/ui/adw/prefs.ui:149
msgid "Plugged In" msgid "Plugged In"
msgstr "" 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 #: resources/ui/gtk3/prefs.ui:381 resources/ui/adw/prefs.ui:163
msgid "Power-Saver Mode" msgid "Power-Saver Mode"
msgstr "" 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 #: resources/ui/gtk3/prefs.ui:382 resources/ui/adw/prefs.ui:164
msgid "Balanced Mode" msgid "Balanced Mode"
msgstr "" 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 #: resources/ui/gtk3/prefs.ui:383 resources/ui/adw/prefs.ui:165
msgid "Performance Mode" msgid "Performance Mode"
msgstr "" 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 #: resources/ui/gtk3/prefs.ui:384 resources/ui/adw/prefs.ui:166
msgid "Power Saver or Balanced" msgid "Power Saver or Balanced"
msgstr "" 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 #: resources/ui/gtk3/prefs.ui:385 resources/ui/adw/prefs.ui:167
msgid "Balanced or Performance" msgid "Balanced or Performance"
msgstr "" 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 #: resources/ui/gtk3/prefs.ui:432 resources/ui/adw/prefs.ui:183
msgid "High Priority" msgid "High Priority"
msgstr "" msgstr ""
#: src/ProfileManager.js:191 #: src/ProfileManager.js:198
msgid "Standard Profile" msgid "Standard Profile"
msgstr "" msgstr ""
@@ -155,6 +155,10 @@ msgstr ""
msgid "Matrix" msgid "Matrix"
msgstr "" msgstr ""
#: src/effects/PaintBrush.js:102
msgid "Paint Brush"
msgstr ""
#: src/effects/Pixelate.js:74 #: src/effects/Pixelate.js:74
msgid "Pixelate" msgid "Pixelate"
msgstr "" msgstr ""
@@ -191,60 +195,60 @@ msgstr ""
msgid "Wisps" msgid "Wisps"
msgstr "" msgstr ""
#: prefs.js:247 #: prefs.js:256
msgid "Preview this effect" msgid "Preview this effect"
msgstr "" 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!" msgid "Burn-My-Windows has been updated!"
msgstr "" 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 #: resources/ui/gtk3/prefs.ui:96
msgid "View Changelog" msgid "View Changelog"
msgstr "" msgstr ""
#: prefs.js:496 prefs.js:528 #: prefs.js:557 prefs.js:589
msgid "Gold Sponsors" msgid "Gold Sponsors"
msgstr "" msgstr ""
#: prefs.js:500 prefs.js:532 #: prefs.js:561 prefs.js:593
msgid "Silver Sponsors" msgid "Silver Sponsors"
msgstr "" msgstr ""
#: prefs.js:504 prefs.js:536 #: prefs.js:565 prefs.js:597
msgid "Bronze Sponsors" msgid "Bronze Sponsors"
msgstr "" msgstr ""
#: prefs.js:508 prefs.js:540 #: prefs.js:569 prefs.js:601
msgid "Past Sponsors" msgid "Past Sponsors"
msgstr "" msgstr ""
#: prefs.js:585 #: prefs.js:646
msgid "Delete this Profile?" msgid "Delete this Profile?"
msgstr "" msgstr ""
#: prefs.js:587 #: prefs.js:647
msgid "" msgid ""
"The current effect profile with all its effect settings will be permanently " "The current effect profile with all its effect settings will be permanently "
"lost." "lost."
msgstr "" msgstr ""
#: prefs.js:592 #: prefs.js:650
msgid "Cancel" msgid "Cancel"
msgstr "" msgstr ""
#: prefs.js:593 #: prefs.js:655
msgid "Delete" msgid "Delete"
msgstr "" msgstr ""
#. Translators: %s will be replaced by the effect's name. #. Translators: %s will be replaced by the effect's name.
#: prefs.js:923 #: prefs.js:966
#, javascript-format #, javascript-format
msgid "Preview for %s" msgid "Preview for %s"
msgstr "" msgstr ""
#: prefs.js:945 #: prefs.js:988
msgid "Close this Window to Preview the Effect!" msgid "Close this Window to Preview the Effect!"
msgstr "" msgstr ""
@@ -272,35 +276,36 @@ msgstr ""
msgid "Donate" msgid "Donate"
msgstr "" msgstr ""
#: resources/ui/common/menus.ui:52 #: resources/ui/common/menus.ui:56
msgid "About Burn-My-Windows" msgid "About Burn-My-Windows"
msgstr "" msgstr ""
#: resources/ui/common/menus.ui:63 #: resources/ui/common/menus.ui:67
msgid "Add New Profile..." msgid "Add New Profile..."
msgstr "" msgstr ""
#: resources/ui/gtk4/broken-glass.ui:22 resources/ui/gtk4/tv-glitch.ui:23 #: 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/glitch.ui:23 resources/ui/gtk4/matrix.ui:23
#: resources/ui/gtk4/doom.ui:22 resources/ui/gtk4/trex.ui:23 #: resources/ui/gtk4/doom.ui:22 resources/ui/gtk4/paint-brush.ui:23
#: resources/ui/gtk4/wisps.ui:23 resources/ui/gtk4/energize-b.ui:23 #: resources/ui/gtk4/trex.ui:23 resources/ui/gtk4/wisps.ui:23
#: resources/ui/gtk4/pixel-wheel.ui:23 resources/ui/gtk4/glide.ui:23 #: resources/ui/gtk4/energize-b.ui:23 resources/ui/gtk4/pixel-wheel.ui:23
#: resources/ui/gtk4/apparition.ui:22 resources/ui/gtk4/portal.ui:23 #: resources/ui/gtk4/glide.ui:23 resources/ui/gtk4/apparition.ui:22
#: resources/ui/gtk4/incinerate.ui:23 resources/ui/gtk4/hexagon.ui:23 #: resources/ui/gtk4/portal.ui:23 resources/ui/gtk4/incinerate.ui:23
#: resources/ui/gtk4/fire.ui:46 resources/ui/gtk4/pixel-wipe.ui:23 #: resources/ui/gtk4/hexagon.ui:23 resources/ui/gtk4/fire.ui:46
#: resources/ui/gtk4/snap.ui:23 resources/ui/gtk4/energize-a.ui:23 #: resources/ui/gtk4/pixel-wipe.ui:23 resources/ui/gtk4/snap.ui:23
#: resources/ui/gtk4/pixelate.ui:23 resources/ui/gtk4/tv.ui:23 #: resources/ui/gtk4/energize-a.ui:23 resources/ui/gtk4/pixelate.ui:23
#: resources/ui/gtk3/tv-glitch.ui:52 resources/ui/gtk3/glitch.ui:52 #: resources/ui/gtk4/tv.ui:23 resources/ui/gtk3/tv-glitch.ui:52
#: resources/ui/gtk3/doom.ui:52 resources/ui/gtk3/wisps.ui:38 #: resources/ui/gtk3/glitch.ui:52 resources/ui/gtk3/doom.ui:52
#: resources/ui/gtk3/energize-b.ui:38 resources/ui/gtk3/pixel-wheel.ui:45 #: resources/ui/gtk3/wisps.ui:38 resources/ui/gtk3/energize-b.ui:38
#: resources/ui/gtk3/glide.ui:59 resources/ui/gtk3/apparition.ui:59 #: resources/ui/gtk3/pixel-wheel.ui:45 resources/ui/gtk3/glide.ui:59
#: resources/ui/gtk3/portal.ui:52 resources/ui/gtk3/incinerate.ui:45 #: resources/ui/gtk3/apparition.ui:59 resources/ui/gtk3/portal.ui:52
#: resources/ui/gtk3/hexagon.ui:45 resources/ui/gtk3/fire.ui:84 #: resources/ui/gtk3/incinerate.ui:45 resources/ui/gtk3/hexagon.ui:45
#: resources/ui/gtk3/pixel-wipe.ui:45 resources/ui/gtk3/energize-a.ui:38 #: resources/ui/gtk3/fire.ui:84 resources/ui/gtk3/pixel-wipe.ui:45
#: resources/ui/gtk3/pixelate.ui:45 resources/ui/gtk3/tv.ui:31 #: resources/ui/gtk3/energize-a.ui:38 resources/ui/gtk3/pixelate.ui:45
#: resources/ui/adw/broken-glass.ui:15 resources/ui/adw/tv-glitch.ui:14 #: resources/ui/gtk3/tv.ui:31 resources/ui/adw/broken-glass.ui:15
#: resources/ui/adw/glitch.ui:14 resources/ui/adw/matrix.ui:14 #: resources/ui/adw/tv-glitch.ui:14 resources/ui/adw/glitch.ui:14
#: resources/ui/adw/doom.ui:14 resources/ui/adw/trex.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/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/pixel-wheel.ui:14 resources/ui/adw/glide.ui:14
#: resources/ui/adw/apparition.ui:15 resources/ui/adw/portal.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:189 resources/ui/gtk4/matrix.ui:226
#: resources/ui/gtk4/matrix.ui:263 resources/ui/gtk4/doom.ui:50 #: 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: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:97 resources/ui/gtk4/trex.ui:143
#: resources/ui/gtk4/trex.ui:189 resources/ui/gtk4/trex.ui:226 #: resources/ui/gtk4/trex.ui:189 resources/ui/gtk4/trex.ui:226
#: resources/ui/gtk4/wisps.ui:51 resources/ui/gtk4/wisps.ui:97 #: 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:135 resources/ui/adw/matrix.ui:160
#: resources/ui/adw/matrix.ui:185 resources/ui/adw/doom.ui:36 #: 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: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:69 resources/ui/adw/trex.ui:102
#: resources/ui/adw/trex.ui:135 resources/ui/adw/trex.ui:160 #: resources/ui/adw/trex.ui:135 resources/ui/adw/trex.ui:160
#: resources/ui/adw/wisps.ui:36 resources/ui/adw/wisps.ui:69 #: resources/ui/adw/wisps.ui:36 resources/ui/adw/wisps.ui:69
@@ -531,6 +538,10 @@ msgstr ""
msgid "Pixel Size" msgid "Pixel Size"
msgstr "" 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 #: resources/ui/gtk4/trex.ui:69 resources/ui/adw/trex.ui:47
msgid "Claw Scratch Scale" msgid "Claw Scratch Scale"
msgstr "" msgstr ""
+1
View File
@@ -56,6 +56,7 @@ var PreferencesDialog = class PreferencesDialog {
new Me.imports.src.effects.Hexagon.Hexagon(), new Me.imports.src.effects.Hexagon.Hexagon(),
new Me.imports.src.effects.Incinerate.Incinerate(), new Me.imports.src.effects.Incinerate.Incinerate(),
new Me.imports.src.effects.Matrix.Matrix(), 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.Pixelate.Pixelate(),
new Me.imports.src.effects.PixelWheel.PixelWheel(), new Me.imports.src.effects.PixelWheel.PixelWheel(),
new Me.imports.src.effects.PixelWipe.PixelWipe(), new Me.imports.src.effects.PixelWipe.PixelWipe(),
Binary file not shown.

After

Width:  |  Height:  |  Size: 955 KiB

+62
View File
@@ -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);
}
+80
View File
@@ -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>
+113
View File
@@ -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> <description>The color of the TV effect.</description>
</key> </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 --> <!-- T-Rex Attack Options -->
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+122
View File
@@ -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};
}
}