Compare commits
141 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9ed471a1c6 | |||
| badd1fd2c3 | |||
| 2f4d9ade01 | |||
| 2d386e3620 | |||
| b7306b9feb | |||
| 020fbc9332 | |||
| 20b9086464 | |||
| 703f990f7f | |||
| 8d8779130c | |||
| 83658510af | |||
| 76aa003d99 | |||
| 1a14b8bd56 | |||
| de190b4fd9 | |||
| 812fa6612a | |||
| 18a43390b6 | |||
| 6af87f727d | |||
| 8dbfa5fdb1 | |||
| e0d9ed5677 | |||
| 6e65f29bb3 | |||
| eb597cffbe | |||
| be88a682b9 | |||
| fa09a1f40a | |||
| 1262089e82 | |||
| 0da73cf675 | |||
| a228dc7b2e | |||
| e6a6a0d831 | |||
| 0fb05c66eb | |||
| e1017b7707 | |||
| cb4b87811e | |||
| 1ccc34f766 | |||
| 1fe20971f8 | |||
| 7ee6e2c58c | |||
| 7b8d6e18b2 | |||
| 84d5ad9caf | |||
| 46cc997e2a | |||
| 829cc49e3c | |||
| a134449706 | |||
| 5b89db0c4b | |||
| 351838b121 | |||
| f59d354729 | |||
| 9d7d912261 | |||
| 77d5de7b8e | |||
| 2238a744f3 | |||
| 539fd59e9b | |||
| a42e2736db | |||
| 2eca2c7374 | |||
| 2bd897fe0e | |||
| 1347fc4d11 | |||
| afaeebd0ab | |||
| 7e33e1ce4a | |||
| 2f1c38afc2 | |||
| 295aa1e362 | |||
| d224d14db1 | |||
| 478ba77288 | |||
| 3175c289b5 | |||
| 78679ef139 | |||
| fa8e3a17c1 | |||
| 88a56998d6 | |||
| 6555a8f02c | |||
| a28e406da4 | |||
| 317eaa2969 | |||
| 61bea04018 | |||
| 6ebc975a20 | |||
| 9f8f2afead | |||
| 472317612c | |||
| e9b82d0b78 | |||
| 07929e1775 | |||
| e20bcd46d7 | |||
| 3b0be6236c | |||
| 27d2a43c99 | |||
| 06aa705f43 | |||
| fa9941ce5b | |||
| c0b1115b23 | |||
| 2ba7b181da | |||
| e2e3425720 | |||
| b7d72d35ed | |||
| 256e6db158 | |||
| e0aebca055 | |||
| cde4e73645 | |||
| 83b583dd13 | |||
| c459d06f53 | |||
| c49615a504 | |||
| 6605fd0cae | |||
| 6bf5970b90 | |||
| 57e8e0384b | |||
| c82f5dabd8 | |||
| 7cecc9e160 | |||
| 9b2e57cba0 | |||
| 2dac407959 | |||
| 9c1139b3af | |||
| ab990b1a05 | |||
| d0f624ab5f | |||
| b2a4aec1c3 | |||
| 999b6800a9 | |||
| 77505c5aa9 | |||
| 1a1e952804 | |||
| de5ddc8622 | |||
| 08ffdef229 | |||
| d7e56483c0 | |||
| 6a2f72f406 | |||
| 9809d7b0d6 | |||
| 359f61e1f4 | |||
| 74a3cc281d | |||
| 26ac1dce6c | |||
| 82be8aa32f | |||
| bebe7d95b0 | |||
| 1b3d76d35e | |||
| 2282f44dfa | |||
| dc849112b8 | |||
| b6a419a0d7 | |||
| e802f41d44 | |||
| b29598643d | |||
| eb4b6d72e3 | |||
| d38e6b6e7a | |||
| ba52acebc9 | |||
| b6a3e5d941 | |||
| f11d36d295 | |||
| cf1721bae1 | |||
| 0603540315 | |||
| 4de12d426c | |||
| c8cf476501 | |||
| a7aef913fc | |||
| 7d0a75cd59 | |||
| a166072168 | |||
| 47f8222349 | |||
| 4942418120 | |||
| a0d087be33 | |||
| dd80db09e9 | |||
| 653d680347 | |||
| ee584ab15e | |||
| 82e2738f33 | |||
| 45d52842cf | |||
| f738f648d8 | |||
| 0cf53c5a5d | |||
| 6f5bcc6681 | |||
| 638613a190 | |||
| 9b59dd942c | |||
| 20dce532ae | |||
| 8e53dc6117 | |||
| 4e29c751ed | |||
| 58a8213233 |
@@ -3,4 +3,5 @@ AlignConsecutiveAssignments: true
|
||||
AlignAfterOpenBracket: Align
|
||||
ContinuationIndentWidth: 2
|
||||
KeepEmptyLinesAtTheStartOfBlocks: true
|
||||
SortIncludes: false
|
||||
ColumnLimit: 90
|
||||
@@ -17,9 +17,9 @@ jobs:
|
||||
- name: Get the Numbers
|
||||
run: |
|
||||
echo "CODE_LINES=$(scripts/cloc.sh --loc)" >> $GITHUB_ENV
|
||||
echo "COMMENT_LINES=$(scripts/cloc.sh --percentage)%" >> $GITHUB_ENV
|
||||
echo "COMMENT_LINES=$(scripts/cloc.sh --percentage)" >> $GITHUB_ENV
|
||||
- name: Create Lines-of-Code-Badge
|
||||
uses: schneegans/dynamic-badges-action@v1.2.0
|
||||
uses: schneegans/dynamic-badges-action@v1.3.0
|
||||
with:
|
||||
auth: ${{ secrets.GIST_SECRET }}
|
||||
gistID: 8cf45f23253ff09b21196e7271378762
|
||||
@@ -29,12 +29,14 @@ jobs:
|
||||
color: lightgrey
|
||||
labelColor: 303030
|
||||
- name: Create Comments-Badge
|
||||
uses: schneegans/dynamic-badges-action@v1.2.0
|
||||
uses: schneegans/dynamic-badges-action@v1.3.0
|
||||
with:
|
||||
auth: ${{ secrets.GIST_SECRET }}
|
||||
gistID: 8cf45f23253ff09b21196e7271378762
|
||||
filename: comments.json
|
||||
label: Comments
|
||||
message: ${{ env.COMMENT_LINES }}
|
||||
color: green
|
||||
message: ${{ env.COMMENT_LINES }}%
|
||||
valColorRange: ${{ env.COMMENT_LINES }}
|
||||
maxColorRange: 50
|
||||
minColorRange: 0
|
||||
labelColor: 303030
|
||||
|
||||
@@ -86,7 +86,7 @@ jobs:
|
||||
- '35'
|
||||
- '36'
|
||||
session:
|
||||
- 'gnome-xsession'
|
||||
#- 'gnome-xsession' Disabled for now as it miraculously fails on GitHub. Locally, all tests pass...
|
||||
- 'gnome-wayland-nested'
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
@@ -21,11 +21,14 @@ For a list of things changed in previous releases, you can have a look at the [c
|
||||
|
||||
Effect | Preview
|
||||
-----|--------
|
||||
**Apparition** <br> This effect hides your windows by violently sucking them into the void of magic! <br><br> _Only available in GNOME Shell 3.38+_ | <img src ="docs/pics/apparition.gif" />
|
||||
**Broken Glass** <br> Shatter your windows into a shower sharp shards! This effect can be configured so that the shards fly away from your mouse pointer position! <br><br> _Only available in GNOME Shell 40+_ | <img src ="docs/pics/glass.gif" />
|
||||
**Energize A** <br> Beam your windows away! | <img src ="docs/pics/energizeA.gif" />
|
||||
**Energize B** <br> Using different transporter technology results in an alternative visual effect. | <img src ="docs/pics/energizeB.gif" />
|
||||
**Fire** <br> The classic effect inspired by Compiz. However, this is implemented using a GLSL shader and not with a particle system like in the old days. | <img src ="docs/pics/fire.gif" />
|
||||
**Hexagon** <br> With glowing lines and hexagon-shaped tiles, this effect looks very sci-fi. | <img src ="docs/pics/hexagon.gif" />
|
||||
**Matrix** <br> Turn your windows into a shower of green letters! The color is actually configurable. <br><br> _Only available in GNOME Shell 40+_ | <img src ="docs/pics/matrix.gif" />
|
||||
**Snap of Disintegration** <br> Dissolve your windows into a cloud of dust. <br><br> _Only available in GNOME Shell 40+_ | <img src ="docs/pics/snap.gif" />
|
||||
**T-Rex Attack** <br> Destroy your windows with a series of violent slashes! <br><br> _Only available in GNOME Shell 40+_ | <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" />
|
||||
**Wisps** <br> Let your windows be carried away to the realm of dreams by these little fairies! | <img src ="docs/pics/wisps.gif" />
|
||||
@@ -43,6 +46,7 @@ While [coding new features](docs/how-to-create-new-effects.md) or [translating t
|
||||
|
||||
<h3 align="center">🥈 Current Silver Sponsors</h3>
|
||||
<p align="center">
|
||||
<a href="https://github.com/danielheadbang">@danielheadbang</a><br>
|
||||
<a href="https://twitter.com/tjiiik">tj3k</a><br>
|
||||
<a href="https://github.com/MRR-dev">@MRR-dev</a><br>
|
||||
<a href="https://github.com/castrojo">Jorge Castro</a><br>
|
||||
@@ -50,11 +54,12 @@ While [coding new features](docs/how-to-create-new-effects.md) or [translating t
|
||||
|
||||
<h3 align="center">🥉 Current Bronze Sponsors</h3>
|
||||
<p align="center">
|
||||
<a href="https://github.com/danielheadbang">@danielheadbang</a><br>
|
||||
<a href='https://github.com/AngelBrielez'>Angel Brielez</a>
|
||||
</p>
|
||||
|
||||
<h3 align="center">🏅 Previous Sponsors and One-Time Donators</h3>
|
||||
<p align="center">
|
||||
<a href="https://github.com/MrTomRod">@MrTomRod</a><br>
|
||||
Pouhiou<br>
|
||||
DAPREMONT Christophe<br>
|
||||
<a href="https://github.com/manero6">@manero6</a><br>
|
||||
|
||||
@@ -1,6 +1,51 @@
|
||||
# Changelog of the Burn-My-Windows Extension
|
||||
|
||||
## [Burn My Window 13](https://github.com/schneegans/Burn-My-Windows/releases/tag/v13)
|
||||
## [Burn My Windows 16](https://github.com/schneegans/Burn-My-Windows/releases/tag/v16)
|
||||
|
||||
**Release Date:** 2022-05-21
|
||||
|
||||
#### Enhancements
|
||||
|
||||
* Many translation updates, including a completely new Arabic, Finnish, Korean, and Swedish translation. A BIG THANKS to all translators!
|
||||
* The shaders are now aware of the actual window size (e.g. excluding the area where the shadow is drawn). For instance, this **fixes the drawing of the effects outside the window bounds** for `libadwaita` apps.
|
||||
* Refactored how the size and opacity transitions of the window actors are set up. Effects can now only specify a desired actor scale which will not change during the animation. All dynamic scaling and fading must be implemented in the shaders now.
|
||||
* The standard uniforms of all shaders have been updated: The window size is now passed as a `vec2` and there is a new `bool uForOpening` which is set to `true` if a window-open animation is ongoing, to `false` otherwise.
|
||||
|
||||
#### Bug Fixes
|
||||
|
||||
* **Fixed a major memory leak**. Now, shaders are not re-created anymore whenever a window is opened or closed. Instead, previously created shaders are re-used as often as possible. This requires that all settings are set as uniform values (previously they were injected into the shader source) which in turn requires that `Shell.GLSLEffect` is used instead of `Clutter.ShaderEffect`. This change also requires that all shaders now work with straight instead of premultiplied alpha. Anyways, a lot needed to be refactored for this fix and I hope that it did not bring too many visual changes.
|
||||
* Fixed the window-close animation of windows which were opened before the session was started (e.g. before GNOME Shell has been restarted).
|
||||
* There seem to be cases were `libadwaita` is not available on GNOME 42 (e.g. Pop!_OS 22.04 beta). The preferences dialog now tries to fallback to the GTK4-only variant if `libadwaita` is not available.
|
||||
|
||||
## [Burn My Windows 15](https://github.com/schneegans/Burn-My-Windows/releases/tag/v15)
|
||||
|
||||
**Release Date:** 2022-04-06
|
||||
|
||||
#### New Features
|
||||
|
||||
* **New Effect: Apparition.** This effect hides the window by violently sucking it into the void of magic. This is available only for GNOME Shell 3.38 and newer.
|
||||
* **New Effect: Hexagon.** With glowing lines and hexagon-shaped tiles, this effect looks very sci-fi. This is available for GNOME Shell 3.36 and newer.
|
||||
* **New Effect: Snap of Disintegration.** This was requested quite frequently! Dissolve your windows into a cloud of dust. This is available only for GNOME Shell 40 and newer.
|
||||
|
||||
#### Bug Fixes
|
||||
|
||||
* Disabled the buggy "Shatter from pointer" option of the Broken Glass effect when opening windows (it only makes sense for closing windows).
|
||||
|
||||
## [Burn My Windows 14](https://github.com/schneegans/Burn-My-Windows/releases/tag/v14)
|
||||
|
||||
**Release Date:** 2022-03-29
|
||||
|
||||
#### Enhancements
|
||||
|
||||
* Reduced the lower animation time limits for all effects to 100 ms. This should now allow for very snappy animations!
|
||||
* A completely new Russian translation. Thank you, ANIGO R.!
|
||||
|
||||
#### Bug Fixes
|
||||
|
||||
* Fixed the version check for GNOME Shell `42.rc` (before it only worked on `42.alpha` and `42.beta`)
|
||||
|
||||
|
||||
## [Burn My Windows 13](https://github.com/schneegans/Burn-My-Windows/releases/tag/v13)
|
||||
|
||||
**Release Date:** 2022-03-27
|
||||
|
||||
@@ -17,7 +62,7 @@
|
||||
|
||||
* Fixed the version check for GNOME Shell 42.
|
||||
|
||||
## [Burn My Window 12](https://github.com/schneegans/Burn-My-Windows/releases/tag/v12)
|
||||
## [Burn My Windows 12](https://github.com/schneegans/Burn-My-Windows/releases/tag/v12)
|
||||
|
||||
**Release Date:** 2022-02-19
|
||||
|
||||
@@ -30,7 +75,7 @@
|
||||
|
||||
* Added [Liberapay](https://liberapay.com/Schneegans) to the sponsorship options.
|
||||
|
||||
## [Burn My Window 11](https://github.com/schneegans/Burn-My-Windows/releases/tag/v11)
|
||||
## [Burn My Windows 11](https://github.com/schneegans/Burn-My-Windows/releases/tag/v11)
|
||||
|
||||
**Release Date:** 2022-02-03
|
||||
|
||||
@@ -55,7 +100,7 @@
|
||||
|
||||
* Fixed an issue which caused corrupted windows when trying to maximize windows while the window-open animation was still running (#82, #86, #91).
|
||||
|
||||
## [Burn My Window 10](https://github.com/schneegans/Burn-My-Windows/releases/tag/v10)
|
||||
## [Burn My Windows 10](https://github.com/schneegans/Burn-My-Windows/releases/tag/v10)
|
||||
|
||||
**Release Date:** 2022-01-31
|
||||
|
||||
@@ -76,7 +121,7 @@
|
||||
* The README now shows the current lines of code and the current comment percentage using my [dynamic-badges-action](https://github.com/Schneegans/dynamic-badges-action).
|
||||
* **Add advanced CI tests:** For each commit to `main`, it is now tested whether the extension can be installed and if the preferences dialog can be shown on GNOME Shell 3.36, 3.38, 40, and 41. Both, X11 and Wayland are checked.
|
||||
|
||||
## [Burn My Window 9](https://github.com/schneegans/Burn-My-Windows/releases/tag/v9)
|
||||
## [Burn My Windows 9](https://github.com/schneegans/Burn-My-Windows/releases/tag/v9)
|
||||
|
||||
**Release Date:** 2022-01-18
|
||||
|
||||
@@ -85,7 +130,7 @@
|
||||
* Improved compatibility with [Show Application View When Workspace Empty ](https://extensions.gnome.org/extension/2036/show-application-view-when-workspace-empty/) (#54).
|
||||
* Fixed a crash which happened when the window-close icon in the overview was clicked twice (#49).
|
||||
|
||||
## [Burn My Window 8](https://github.com/schneegans/Burn-My-Windows/releases/tag/v8)
|
||||
## [Burn My Windows 8](https://github.com/schneegans/Burn-My-Windows/releases/tag/v8)
|
||||
|
||||
**Release Date:** 2022-01-17
|
||||
|
||||
@@ -111,7 +156,7 @@
|
||||
* The extension now works even if GNOME Shell's animations are disabled globally.
|
||||
|
||||
|
||||
## [Burn My Window 7](https://github.com/schneegans/Burn-My-Windows/releases/tag/v7)
|
||||
## [Burn My Windows 7](https://github.com/schneegans/Burn-My-Windows/releases/tag/v7)
|
||||
|
||||
**Release Date:** 2022-01-03
|
||||
|
||||
@@ -125,7 +170,7 @@
|
||||
* Resolve copyright issues by using a MIT-licensed noise implementation.
|
||||
|
||||
|
||||
## [Burn My Window 6](https://github.com/schneegans/Burn-My-Windows/releases/tag/v6)
|
||||
## [Burn My Windows 6](https://github.com/schneegans/Burn-My-Windows/releases/tag/v6)
|
||||
|
||||
**Release Date:** 2022-01-02
|
||||
|
||||
@@ -133,7 +178,7 @@
|
||||
|
||||
* Removed a debug log message.
|
||||
|
||||
## [Burn My Window 5](https://github.com/schneegans/Burn-My-Windows/releases/tag/v5)
|
||||
## [Burn My Windows 5](https://github.com/schneegans/Burn-My-Windows/releases/tag/v5)
|
||||
|
||||
**Release Date:** 2022-01-02
|
||||
|
||||
@@ -151,7 +196,7 @@
|
||||
|
||||
* Fixed a bug which messed up the overview of GNOME Shell 3.36.
|
||||
|
||||
## [Burn My Window 4](https://github.com/schneegans/Burn-My-Windows/releases/tag/v4)
|
||||
## [Burn My Windows 4](https://github.com/schneegans/Burn-My-Windows/releases/tag/v4)
|
||||
|
||||
**Release Date:** 2021-12-25
|
||||
|
||||
@@ -165,7 +210,7 @@
|
||||
* Refactored the code a lot to make it easier to add new shader effects in the future.
|
||||
* Tweaked timing of the fire shader. Previously, the fire became invisible quite quickly. Due to this new animation timing, the default animation time has been reduced to 1500 ms.
|
||||
|
||||
## [Burn My Window 3](https://github.com/schneegans/Burn-My-Windows/releases/tag/v3)
|
||||
## [Burn My Windows 3](https://github.com/schneegans/Burn-My-Windows/releases/tag/v3)
|
||||
|
||||
**Release Date:** 2021-12-20
|
||||
|
||||
@@ -173,7 +218,7 @@
|
||||
|
||||
* Add support for GNOME 3.36 and GNOME 3.38.
|
||||
|
||||
## [Burn My Window 2](https://github.com/schneegans/Burn-My-Windows/releases/tag/v2)
|
||||
## [Burn My Windows 2](https://github.com/schneegans/Burn-My-Windows/releases/tag/v2)
|
||||
|
||||
**Release Date:** 2021-12-16
|
||||
|
||||
@@ -183,7 +228,7 @@
|
||||
* Added the possibility to adjust flame speed and scale.
|
||||
* Added some fire presets.
|
||||
|
||||
## [Burn My Window 1](https://github.com/schneegans/Burn-My-Windows/releases/tag/v1)
|
||||
## [Burn My Windows 1](https://github.com/schneegans/Burn-My-Windows/releases/tag/v1)
|
||||
|
||||
**Release Date:** 2021-12-14
|
||||
|
||||
|
||||
@@ -77,11 +77,56 @@ Just remember to replace `simple-fade` with your custom name!
|
||||
|
||||
### 2. Creating the Effect Class
|
||||
|
||||
You will have to create a new file called `src/SimpleFade.js` and paste the following code to it.
|
||||
You will have to create a new GLSL file called `resources/shaders/simple-fade.glsl` and a new JavaScript source file called `src/SimpleFade.js`.
|
||||
Simply paste the following source code to the respective file.
|
||||
Please study this code carefully, all of it is explained with inline comments.
|
||||
|
||||
<details>
|
||||
<summary>Expand this to show the code.</summary>
|
||||
<summary>Expand this to show the GLSL code.</summary>
|
||||
|
||||
```glsl
|
||||
// The code below injects some standard uniforms which will be updated during the
|
||||
// animation. This includes:
|
||||
// bool uForOpening: True if a window-open animation is ongoing, false otherwise.
|
||||
// sampler2D uTexture: Contains the texture of the window.
|
||||
// float uProgress: A value which transitions from 0 to 1 during the entire animation.
|
||||
// float uTime: A steadily increasing value in seconds.
|
||||
// vec2 uSize: The size of uTexture in pixels.
|
||||
// float uPadding: The empty area around the actual window (e.g. where the shadow is drawn).
|
||||
#include "common/uniforms.glsl"
|
||||
|
||||
// The width of the fading effect is loaded from the settings.
|
||||
uniform float uFadeWidth;
|
||||
|
||||
void main() {
|
||||
// Get the color from the window texture.
|
||||
cogl_color_out = texture2D(uTexture, cogl_tex_coord_in[0].st);
|
||||
|
||||
// Shell.GLSLEffect uses straight alpha. So we have to convert from premultiplied.
|
||||
if (cogl_color_out.a > 0) {
|
||||
cogl_color_out.rgb /= cogl_color_out.a;
|
||||
}
|
||||
|
||||
// Radial distance from window edge to the window's center.
|
||||
float dist = length(cogl_tex_coord_in[0].st - 0.5) * 2.0 / sqrt(2.0);
|
||||
|
||||
// This gradually dissolves from [1..0] from the outside to the center. We
|
||||
// switch the direction for opening and closing.
|
||||
float progress = uForOpening ? 1.0 - uProgress : uProgress;
|
||||
float mask = (1.0 - progress * (1.0 + uFadeWidth) - dist + uFadeWidth) / uFadeWidth;
|
||||
|
||||
// Make the mask smoother.
|
||||
mask = smoothstep(0, 1, mask);
|
||||
|
||||
// Apply the mask to the output.
|
||||
cogl_color_out.a *= mask;
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<details>
|
||||
<summary>Expand this to show the JavaScript code.</summary>
|
||||
|
||||
```javascript
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -101,27 +146,50 @@ Please study this code carefully, all of it is explained with inline comments.
|
||||
|
||||
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 ... //
|
||||
// <- Please add a description of your effect here -> //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// The shader class for this effect is registered further down in this file.
|
||||
let Shader = null;
|
||||
// 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 SimpleFade = class {
|
||||
|
||||
// The effect class is completely static. It 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 SimpleFade = class SimpleFade {
|
||||
// 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._uForOpening = shader.get_uniform_location('uForOpening');
|
||||
shader._uFadeWidth = shader.get_uniform_location('uFadeWidth');
|
||||
|
||||
// Write all uniform values at the start of each animation.
|
||||
shader.connect('begin-animation', (shader, settings) => {
|
||||
shader.set_uniform_float(shader._uForOpening, 1, [forOpening]);
|
||||
shader.set_uniform_float(shader._uFadeWidth, 1, [settings.get_double('simple-fade-width')]);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------- metadata
|
||||
|
||||
// The effect is available on all GNOME Shell versions supported by this extension.
|
||||
static getMinShellVersion() {
|
||||
getMinShellVersion() {
|
||||
return [3, 36];
|
||||
}
|
||||
|
||||
@@ -129,14 +197,14 @@ var SimpleFade = class SimpleFade {
|
||||
// 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').
|
||||
static getNick() {
|
||||
getNick() {
|
||||
return 'simple-fade';
|
||||
}
|
||||
|
||||
// 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.
|
||||
static getLabel() {
|
||||
return 'Simple Fade Effect';
|
||||
getLabel() {
|
||||
return _('Simple Fade Effect');
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------- API for prefs.js
|
||||
@@ -144,89 +212,19 @@ var SimpleFade = class SimpleFade {
|
||||
// This is called by the preferences dialog. It loads the settings page for this effect,
|
||||
// binds all properties to the settings and appends the page to the main stack of the
|
||||
// preferences dialog.
|
||||
static getPreferences(dialog) {
|
||||
getPreferences(dialog) {
|
||||
// Empty for now... Code is added here later in the tutorial!
|
||||
return null;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------- API for extension.js
|
||||
|
||||
// This is called from extension.js whenever a window is closed with this effect.
|
||||
static createShader(actor, settings, forOpening) {
|
||||
return new Shader(settings, forOpening);
|
||||
// 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};
|
||||
}
|
||||
|
||||
// The tweakTransition() is called from extension.js to tweak a window's open / close
|
||||
// transitions - usually windows are faded in / out and scaled up / down by GNOME Shell.
|
||||
// The parameter 'forOpening' is set to true if this is called for a window-open
|
||||
// transition, for a window-close transition it is set to false. The modes can be set to
|
||||
// any value from here: https://gjs-docs.gnome.org/clutter8~8_api/clutter.animationmode.
|
||||
// The only required property is 'opacity', even if it transitions from 1.0 to 1.0. The
|
||||
// current value of the opacity transition is passed as uProgress to the shader.
|
||||
// Tweaking the actor's scale during the transition only works properly for GNOME 3.38+.
|
||||
|
||||
// For this effect, windows should neither be scaled nor faded.
|
||||
static tweakTransition(actor, settings, forOpening) {
|
||||
return {
|
||||
'opacity': {from: 255, to: 255, mode: 4},
|
||||
'scale-x': {from: 1.0, to: 1.0, mode: 4},
|
||||
'scale-y': {from: 1.0, to: 1.0, mode: 4}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// The shader class for this effect will only be registered in GNOME Shell's process //
|
||||
// (not in the preferences process). It's done this way as Clutter may not be installed //
|
||||
// on the system and therefore the preferences would crash. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
if (utils.isInShellProcess()) {
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const shaderSnippets = Me.imports.src.shaderSnippets;
|
||||
|
||||
Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect {
|
||||
_init(settings, forOpening) {
|
||||
super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
|
||||
|
||||
this.set_shader_source(`
|
||||
|
||||
// The code below injects some standard uniforms which will be updated during the
|
||||
// animation. This includes:
|
||||
// uTexture: Contains the texture of the window.
|
||||
// uProgress: A value which transitions from 0 to 1 during the entire animation.
|
||||
// uTime: A steadily increasing value in seconds.
|
||||
// uSizeX: The horizontal size of uTexture in pixels.
|
||||
// uSizeY: The vertical size of uTexture in pixels.
|
||||
${shaderSnippets.standardUniforms()}
|
||||
|
||||
// The width of the fading effect is directly loaded from the settings.
|
||||
const float FADE_WIDTH = ${settings.get_double('simple-fade-width')};
|
||||
|
||||
void main() {
|
||||
|
||||
// Get the color from the window texture.
|
||||
vec4 windowColor = texture2D(uTexture, cogl_tex_coord_in[0].st);
|
||||
|
||||
// Radial distance from window edge to the window's center.
|
||||
float dist = length(cogl_tex_coord_in[0].st - 0.5) * 2.0 / sqrt(2.0);
|
||||
|
||||
// This gradually dissolves from [1..0] from the outside to the center. We
|
||||
// switch the direction for opening and closing.
|
||||
float progress = ${forOpening ? '1.0 - uProgress' : 'uProgress'};
|
||||
float mask = (1.0 - progress * (1.0 + FADE_WIDTH) - dist + FADE_WIDTH) / FADE_WIDTH;
|
||||
|
||||
// Make the mask smoother.
|
||||
mask = smoothstep(0, 1, mask);
|
||||
|
||||
// Set the final output color. This uses premultiplied alpha.
|
||||
cogl_color_out = windowColor * mask;
|
||||
}
|
||||
`);
|
||||
};
|
||||
});
|
||||
}
|
||||
```
|
||||
|
||||
@@ -241,7 +239,7 @@ Like this:
|
||||
```javascript
|
||||
const ALL_EFFECTS = [
|
||||
...
|
||||
Me.imports.src.SimpleFade.SimpleFade,
|
||||
new Me.imports.src.SimpleFade.SimpleFade(),
|
||||
...
|
||||
];
|
||||
```
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Preview GIFs
|
||||
|
||||
The preview GIFs are recorded with OBS Studio and converted to a GIF with the following command:
|
||||
The preview GIFs are recorded with OBS Studio at 1920x1080, cut to a length of exactly two seconds and converted to a GIF with the following command:
|
||||
|
||||
```bash
|
||||
gifski --fps 30 -W 400 -H 225 -o effect.gif effect.mp4
|
||||
|
||||
|
After Width: | Height: | Size: 415 KiB |
|
After Width: | Height: | Size: 615 KiB |
|
After Width: | Height: | Size: 928 KiB |
@@ -31,18 +31,6 @@ const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = imports.misc.extensionUtils.getCurrentExtension();
|
||||
const utils = Me.imports.src.utils;
|
||||
|
||||
// New effects must be registered here and in prefs.js.
|
||||
const ALL_EFFECTS = [
|
||||
Me.imports.src.EnergizeA.EnergizeA,
|
||||
Me.imports.src.EnergizeB.EnergizeB,
|
||||
Me.imports.src.Fire.Fire,
|
||||
Me.imports.src.Matrix.Matrix,
|
||||
Me.imports.src.BrokenGlass.BrokenGlass,
|
||||
Me.imports.src.TRexAttack.TRexAttack,
|
||||
Me.imports.src.TVEffect.TVEffect,
|
||||
Me.imports.src.Wisps.Wisps,
|
||||
];
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// This extensions modifies the window-close and window-open animations with all kinds //
|
||||
// of effects. The effects are implemented using GLSL shaders which are applied to the //
|
||||
@@ -60,6 +48,21 @@ class Extension {
|
||||
// from GNOME Tweaks, when you log in or when the screen is unlocked.
|
||||
enable() {
|
||||
|
||||
// New effects must be registered here and in prefs.js.
|
||||
this._ALL_EFFECTS = [
|
||||
new Me.imports.src.Apparition.Apparition(),
|
||||
new Me.imports.src.BrokenGlass.BrokenGlass(),
|
||||
new Me.imports.src.EnergizeA.EnergizeA(),
|
||||
new Me.imports.src.EnergizeB.EnergizeB(),
|
||||
new Me.imports.src.Fire.Fire(),
|
||||
new Me.imports.src.Hexagon.Hexagon(),
|
||||
new Me.imports.src.Matrix.Matrix(),
|
||||
new Me.imports.src.SnapOfDisintegration.SnapOfDisintegration(),
|
||||
new Me.imports.src.TRexAttack.TRexAttack(),
|
||||
new Me.imports.src.TVEffect.TVEffect(),
|
||||
new Me.imports.src.Wisps.Wisps(),
|
||||
];
|
||||
|
||||
// Load all of our resources.
|
||||
this._resources = Gio.Resource.load(Me.path + '/resources/burn-my-windows.gresource');
|
||||
Gio.resources_register(this._resources);
|
||||
@@ -67,10 +70,6 @@ class Extension {
|
||||
// Store a reference to the settings object.
|
||||
this._settings = ExtensionUtils.getSettings();
|
||||
|
||||
// This will store an item of ALL_EFFECTS array which was used the last time a window
|
||||
// was opened / closed.
|
||||
this._currentEffect = 0;
|
||||
|
||||
// We will use extensionThis to refer to the extension inside the patched methods.
|
||||
const extensionThis = this;
|
||||
|
||||
@@ -80,6 +79,7 @@ class Extension {
|
||||
this._origDoRemoveWindow = Workspace.prototype._doRemoveWindow;
|
||||
this._origShouldAnimateActor = WindowManager.prototype._shouldAnimateActor;
|
||||
this._origWaitForOverviewToHide = WindowManager.prototype._waitForOverviewToHide;
|
||||
this._origDestroyWindowDone = WindowManager.prototype._destroyWindowDone;
|
||||
|
||||
// We will also override these animation times.
|
||||
this._origWindowTime = imports.ui.windowManager.DESTROY_WINDOW_ANIMATION_TIME;
|
||||
@@ -95,7 +95,7 @@ class Extension {
|
||||
|
||||
// If a window is created the transitions are set up in the async _mapWindow of the
|
||||
// WindowManager:
|
||||
// https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/windowManager.js#L1449
|
||||
// https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/windowManager.js#L1452
|
||||
// AFAIK, overriding this method is not possible as it's called by a signal to
|
||||
// which it is bound via the bind() method. To tweak the async transition
|
||||
// anyways, we override the actors ease() method once - the next time it will be
|
||||
@@ -169,7 +169,7 @@ class Extension {
|
||||
// but not _doRemoveWindow. The latter is required to trigger the repositioning of
|
||||
// the overview window layout. Therefore we call this method in addition.
|
||||
// https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/gnome-3-36/js/ui/workspace.js#L1877
|
||||
// https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/workspace.js#L1415
|
||||
// https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/workspace.js#L1405
|
||||
if (utils.shellVersionIs(3, 36)) {
|
||||
clone.connect('destroy', () => this._doRemoveWindow(clone.metaWindow));
|
||||
}
|
||||
@@ -189,7 +189,7 @@ class Extension {
|
||||
// cannot monkey-patch the _destroyWindow or _mapWindow methods themselves, we check
|
||||
// inside the method below whether it was called by either of those. If so, we return
|
||||
// true. Let's see if this breaks stuff left and right...
|
||||
// https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/windowManager.js#L1125
|
||||
// https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/windowManager.js#L1124
|
||||
WindowManager.prototype._shouldAnimateActor = function(...params) {
|
||||
const caller = (new Error()).stack.split('\n')[1];
|
||||
if (caller.includes('_destroyWindow@') || caller.includes('_mapWindow@')) {
|
||||
@@ -201,18 +201,35 @@ class Extension {
|
||||
|
||||
// ----------------------------------------------- patching the window-close animation
|
||||
|
||||
// The signal handler below is all which is required outside of the overview. All
|
||||
// other hacks further below are just required to defer the window-hiding in the
|
||||
// overview until the effect is finished.
|
||||
// The signal handler below and the following patch are all which is required outside
|
||||
// of the overview. All other hacks further below are just required to defer the
|
||||
// window-hiding in the overview until the effect is finished.
|
||||
|
||||
// The close animation is set up in WindowManager's _destroyWindow:
|
||||
// https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/windowManager.js#L1549
|
||||
// https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/windowManager.js#L1541
|
||||
// As we cannot monkey-patch the _destroyWindow itself, we connect to the 'destroy'
|
||||
// signal of the window manager and tweak the animation to our needs.
|
||||
this._destroyConnection = global.window_manager.connect('destroy', (wm, actor) => {
|
||||
this._setupEffect(actor, false);
|
||||
});
|
||||
|
||||
// Once the window-close animation is is finished, the window manager's
|
||||
// _destroyWindowDone is called. We use this to free the effect so that it can be
|
||||
// re-used in future.
|
||||
// https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/windowManager.js#L1541
|
||||
WindowManager.prototype._destroyWindowDone = function(shellwm, actor) {
|
||||
if (this._destroying.has(actor)) {
|
||||
const shader = actor.get_effect('burn-my-windows-effect');
|
||||
if (shader) {
|
||||
actor.remove_effect(shader);
|
||||
shader.returnToFactory();
|
||||
}
|
||||
}
|
||||
|
||||
// Call the original method.
|
||||
extensionThis._origDestroyWindowDone.apply(this, [shellwm, actor]);
|
||||
};
|
||||
|
||||
// These three method overrides are mega-hacky! Usually, windows are not faded when
|
||||
// closed from the overview (why?). With these overrides we make sure that they are
|
||||
// actually faded out. To do this, _windowRemoved and _doRemoveWindow now check
|
||||
@@ -220,14 +237,14 @@ class Extension {
|
||||
// the case, these methods do nothing. Are the actors removed in the end? I hope so.
|
||||
// The _destroyWindow of the WindowManager sets the transitions up and should take
|
||||
// care of removing the actors at the end of the transitions.
|
||||
// https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/workspace.js#L1299
|
||||
// https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/workspace.js#L1301
|
||||
Workspace.prototype._windowRemoved = function(ws, metaWin) {
|
||||
if (extensionThis._shouldDestroy(this, metaWin)) {
|
||||
extensionThis._origWindowRemoved.apply(this, [ws, metaWin]);
|
||||
}
|
||||
};
|
||||
|
||||
// https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/workspace.js#L1178
|
||||
// https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/workspace.js#L1180
|
||||
Workspace.prototype._doRemoveWindow = function(metaWin) {
|
||||
if (extensionThis._shouldDestroy(this, metaWin)) {
|
||||
extensionThis._origDoRemoveWindow.apply(this, [metaWin]);
|
||||
@@ -288,6 +305,9 @@ class Extension {
|
||||
// Tweaks, when you log out or when the screen locks.
|
||||
disable() {
|
||||
|
||||
// Free all effect resources.
|
||||
this._ALL_EFFECTS = [];
|
||||
|
||||
// Unregister our resources.
|
||||
Gio.resources_unregister(this._resources);
|
||||
|
||||
@@ -300,6 +320,7 @@ class Extension {
|
||||
Workspace.prototype._doRemoveWindow = this._origDoRemoveWindow;
|
||||
WindowManager.prototype._shouldAnimateActor = this._origShouldAnimateActor;
|
||||
WindowManager.prototype._waitForOverviewToHide = this._origWaitForOverviewToHide;
|
||||
WindowManager.prototype._destroyWindowDone = this._origDestroyWindowDone;
|
||||
|
||||
imports.ui.windowManager.DESTROY_WINDOW_ANIMATION_TIME = this._origWindowTime;
|
||||
imports.ui.windowManager.DIALOG_DESTROY_WINDOW_ANIMATION_TIME = this._origDialogTime;
|
||||
@@ -334,7 +355,7 @@ class Extension {
|
||||
// We do nothing if a dialog got closed and we should not burn them.
|
||||
const shouldDestroyDialogs = this._settings.get_boolean('destroy-dialogs');
|
||||
|
||||
// If an effect is to be previewed however, we have to affect dialogs es well. This is
|
||||
// If an effect is to be previewed, we have to affect dialogs es well. This is
|
||||
// because the preview window is a dialog window...
|
||||
const action = forOpening ? 'open' : 'close';
|
||||
const previewNick = this._settings.get_string(action + '-preview-effect');
|
||||
@@ -344,16 +365,23 @@ class Extension {
|
||||
return;
|
||||
}
|
||||
|
||||
// There is the weird case where an animation is already ongoing. This happens when a
|
||||
// window is closed which has been created before the session was started (e.g. when
|
||||
// GNOME Shell has been restarted in the meantime).
|
||||
const oldShader = actor.get_effect('burn-my-windows-effect');
|
||||
if (oldShader) {
|
||||
actor.remove_effect(oldShader);
|
||||
oldShader.returnToFactory();
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------ choose an effect
|
||||
|
||||
// Now we chose a random effect from all enabled effects.
|
||||
this._currentEffect = null;
|
||||
let effect = null;
|
||||
|
||||
// First we check if an effect is to be previewed.
|
||||
if (previewNick != '') {
|
||||
this._currentEffect = ALL_EFFECTS.find(Effect => {
|
||||
return Effect.getNick() == previewNick;
|
||||
});
|
||||
effect = this._ALL_EFFECTS.find(effect => effect.getNick() == previewNick);
|
||||
|
||||
// Only preview the effect once.
|
||||
this._settings.set_string(action + '-preview-effect', '');
|
||||
@@ -363,18 +391,18 @@ class Extension {
|
||||
else {
|
||||
|
||||
// Therefore, we first create a list of all currently enabled effects.
|
||||
const enabled = ALL_EFFECTS.filter(Effect => {
|
||||
return this._settings.get_boolean(`${Effect.getNick()}-${action}-effect`);
|
||||
const enabled = this._ALL_EFFECTS.filter(effect => {
|
||||
return this._settings.get_boolean(`${effect.getNick()}-${action}-effect`);
|
||||
});
|
||||
|
||||
// And then choose a random effect.
|
||||
if (enabled.length > 0) {
|
||||
this._currentEffect = enabled[Math.floor(Math.random() * enabled.length)];
|
||||
effect = enabled[Math.floor(Math.random() * enabled.length)];
|
||||
}
|
||||
}
|
||||
|
||||
// If nothing was enabled, we have to do nothing :)
|
||||
if (this._currentEffect == null) {
|
||||
if (effect == null) {
|
||||
this._fixAnimationTimes(isDialogWindow, forOpening, null);
|
||||
return;
|
||||
}
|
||||
@@ -386,19 +414,24 @@ class Extension {
|
||||
const testMode = this._settings.get_boolean('test-mode');
|
||||
|
||||
// The following is used to tweak the ongoing transitions of a window actor. Usually
|
||||
// windows are faded in / out scaled up / down slightly by GNOME Shell. Here, we allow
|
||||
// modifications to this behavior by the effects.
|
||||
const config = this._currentEffect.tweakTransition(actor, this._settings, forOpening);
|
||||
const duration = testMode ?
|
||||
5000 :
|
||||
this._settings.get_int(this._currentEffect.getNick() + '-animation-time');
|
||||
// windows are faded in / out scaled up / down slightly by GNOME Shell. Here, we tweak
|
||||
// the transitions so that nothing changes. The window stays opaque and is scaled to
|
||||
// actorScale.
|
||||
const actorScale = effect.getActorScale(this._settings);
|
||||
|
||||
// To make things deterministic during testing, we set the effect duration to 5
|
||||
// seconds.
|
||||
const duration =
|
||||
testMode ? 5000 : this._settings.get_int(effect.getNick() + '-animation-time');
|
||||
|
||||
// All animations are relative to the window's center.
|
||||
actor.set_pivot_point(0.5, 0.5);
|
||||
|
||||
// This goes through all properties given in the config object and tweaks any ongoing
|
||||
// transitions accordingly. If there is no ongoing transition for a given property, a
|
||||
// new one is set up.
|
||||
|
||||
// We tweak the opacity and scale of the actor. If there is no ongoing transition for
|
||||
// a property, a new one is set up.
|
||||
const config = {'opacity': 255, 'scale-x': actorScale.x, 'scale-y': actorScale.y};
|
||||
|
||||
for (const property in config) {
|
||||
let transition = actor.get_transition(property);
|
||||
|
||||
@@ -421,11 +454,10 @@ class Extension {
|
||||
// Tweak the transition according to the config object. For some reason, there are
|
||||
// rare cases, where no transition is set up. This happens from time to time...
|
||||
if (transition) {
|
||||
const middle = (config[property].to + config[property].from) / 2;
|
||||
transition.set_duration(duration);
|
||||
transition.set_to(testMode ? middle : config[property].to);
|
||||
transition.set_from(testMode ? middle : config[property].from);
|
||||
transition.set_progress_mode(config[property].mode);
|
||||
transition.set_to(config[property]);
|
||||
transition.set_from(config[property]);
|
||||
transition.set_progress_mode(Clutter.AnimationMode.LINEAR);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -442,37 +474,41 @@ class Extension {
|
||||
// -------------------------------------------------------------------- add the shader
|
||||
|
||||
// Now add a cool shader to our window actor!
|
||||
const shader = this._currentEffect.createShader(actor, this._settings, forOpening);
|
||||
const shader = effect.shaderFactory.getShader();
|
||||
|
||||
if (shader) {
|
||||
// There should always be an opacity transition going on...
|
||||
const transition = actor.get_transition('opacity');
|
||||
// There should always be an opacity transition going on...
|
||||
const transition = actor.get_transition('opacity');
|
||||
|
||||
if (!transition) {
|
||||
this._fixAnimationTimes(isDialogWindow, forOpening, null);
|
||||
utils.debug('Cannot setup shader without opacity transition.')
|
||||
return;
|
||||
if (!transition) {
|
||||
this._fixAnimationTimes(isDialogWindow, forOpening, null);
|
||||
utils.debug('Cannot setup shader without opacity transition.')
|
||||
return;
|
||||
}
|
||||
|
||||
// Assign the effect to the window actor!
|
||||
actor.add_effect_with_name('burn-my-windows-effect', shader);
|
||||
|
||||
// Set one-time uniforms.
|
||||
shader.beginAnimation(this._settings, forOpening, actor);
|
||||
|
||||
// Set other uniforms each frame.
|
||||
transition.connect('new-frame', (t) => {
|
||||
if (testMode) {
|
||||
shader.updateAnimation(0.5, 0.001 * duration * 0.5);
|
||||
} else {
|
||||
shader.updateAnimation(t.get_progress(), 0.001 * t.get_elapsed_time());
|
||||
}
|
||||
});
|
||||
|
||||
// First remove any old effect.
|
||||
actor.remove_effect_by_name(`burn-my-windows-effect`);
|
||||
actor.add_effect_with_name(`burn-my-windows-effect`, shader);
|
||||
|
||||
// Update uniforms at each frame.
|
||||
transition.connect('new-frame', (t) => {
|
||||
shader.set_uniform_value('uProgress', testMode ? 0.5 : t.get_progress());
|
||||
shader.set_uniform_value('uTime',
|
||||
testMode ? duration / 2 : 0.001 * t.get_elapsed_time());
|
||||
shader.set_uniform_value('uSizeX', actor.width);
|
||||
shader.set_uniform_value('uSizeY', actor.height);
|
||||
// Remove the effect if the animation finished or was interrupted.
|
||||
if (forOpening) {
|
||||
transition.connect('stopped', () => {
|
||||
const oldShader = actor.get_effect('burn-my-windows-effect');
|
||||
if (oldShader) {
|
||||
actor.remove_effect(oldShader);
|
||||
oldShader.returnToFactory();
|
||||
}
|
||||
});
|
||||
|
||||
// Remove the effect if the animation finished or was interrupted.
|
||||
if (forOpening) {
|
||||
transition.connect('stopped', () => {
|
||||
actor.remove_effect_by_name(`burn-my-windows-effect`);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Finally, ensure that all animation times are set properly so that other extensions
|
||||
|
||||
@@ -12,5 +12,5 @@
|
||||
"42"
|
||||
],
|
||||
"url": "https://github.com/Schneegans/Burn-My-Windows",
|
||||
"version": 13
|
||||
"version": 16
|
||||
}
|
||||
@@ -0,0 +1,363 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR Simon Schneegans
|
||||
# This file is distributed under the same license as the burn-my-windows package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: burn-my-windows\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-04-05 09:22+0200\n"
|
||||
"PO-Revision-Date: 2022-05-17 19:18+0000\n"
|
||||
"Last-Translator: fawaz006 <fawaz27000@hotmail.com>\n"
|
||||
"Language-Team: Arabic <https://hosted.weblate.org/projects/burn-my-windows/"
|
||||
"core/ar/>\n"
|
||||
"Language: ar\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
|
||||
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
|
||||
"X-Generator: Weblate 4.13-dev\n"
|
||||
|
||||
#: prefs.js:112
|
||||
msgid "Effect Options"
|
||||
msgstr "خيارات التأثير"
|
||||
|
||||
#: prefs.js:140
|
||||
msgid "Go Back"
|
||||
msgstr "عُد"
|
||||
|
||||
#: prefs.js:182
|
||||
msgid "General Options"
|
||||
msgstr "خيارات عامة"
|
||||
|
||||
#: prefs.js:276
|
||||
msgid "Gold Sponsors"
|
||||
msgstr "الرعاة الذهبيون"
|
||||
|
||||
#: prefs.js:279
|
||||
msgid "Silver Sponsors"
|
||||
msgstr "الرعاة الفضيون"
|
||||
|
||||
#: prefs.js:282
|
||||
msgid "Bronze Sponsors"
|
||||
msgstr "الرعاة البرونزيون"
|
||||
|
||||
#: prefs.js:285
|
||||
msgid "Past Sponsors"
|
||||
msgstr "الرعاة السابقون"
|
||||
|
||||
#. Translators: %s will be replaced by the effect's name.
|
||||
#: prefs.js:510
|
||||
#, javascript-format
|
||||
msgid "Preview for %s"
|
||||
msgstr "معاينة لـ %s"
|
||||
|
||||
#: prefs.js:532
|
||||
msgid "Close this Window to Preview the Effect!"
|
||||
msgstr "أغلق هذه النافذة لمعاينة التأثير!"
|
||||
|
||||
#: src/BrokenGlass.js:57
|
||||
msgid "Broken Glass"
|
||||
msgstr "زجاج المكسور"
|
||||
|
||||
#: src/TVEffect.js:56
|
||||
msgid "TV Effect"
|
||||
msgstr "تأثير التلفزيون"
|
||||
|
||||
#: src/TRexAttack.js:56
|
||||
msgid "T-Rex Attack"
|
||||
msgstr "هجوم تي ريكس"
|
||||
|
||||
#: src/SnapOfDisintegration.js:60
|
||||
msgid "Snap of Disintegration"
|
||||
msgstr "الانفجار القطع"
|
||||
|
||||
#: src/Wisps.js:55
|
||||
msgid "Wisps"
|
||||
msgstr "قطع"
|
||||
|
||||
#: src/Fire.js:58
|
||||
msgid "Fire"
|
||||
msgstr "نار"
|
||||
|
||||
#: src/Fire.js:130
|
||||
msgid "Default Fire"
|
||||
msgstr "النار الافتراضية"
|
||||
|
||||
#: src/Fire.js:140
|
||||
msgid "Hell Fire"
|
||||
msgstr "نار حارقة"
|
||||
|
||||
#: src/Fire.js:150
|
||||
msgid "Dark and Smutty"
|
||||
msgstr "داكن وقذر"
|
||||
|
||||
#: src/Fire.js:160
|
||||
msgid "Cold Breeze"
|
||||
msgstr "نسيم بارد"
|
||||
|
||||
#: src/Fire.js:170
|
||||
msgid "Santa is Coming"
|
||||
msgstr "سانتا قادم"
|
||||
|
||||
#: src/Hexagon.js:53
|
||||
msgid "Hexagon"
|
||||
msgstr "سداسي الزوايا"
|
||||
|
||||
#: src/EnergizeA.js:54
|
||||
msgid "Energize A"
|
||||
msgstr "تنشيط أ"
|
||||
|
||||
#: src/Apparition.js:57
|
||||
msgid "Apparition"
|
||||
msgstr "شبح"
|
||||
|
||||
#: src/EnergizeB.js:54
|
||||
msgid "Energize B"
|
||||
msgstr "تنشيط ب"
|
||||
|
||||
#: src/Matrix.js:58
|
||||
msgid "Matrix"
|
||||
msgstr "ماتركس"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:6
|
||||
msgid "Visit Homepage"
|
||||
msgstr "قم بزيارة الصفحة الرئيسية"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:10
|
||||
msgid "View Changelog"
|
||||
msgstr "مشاهدة ملف Changelog"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:16
|
||||
msgid "Report a Bug"
|
||||
msgstr "الإبلاغ عن خلل"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:20
|
||||
msgid "Create an Effect"
|
||||
msgstr "انشاء تأثير"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:24
|
||||
msgid "Translate"
|
||||
msgstr "ترجم"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:28
|
||||
msgid "Donate"
|
||||
msgstr "تبرع"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:41
|
||||
msgid "About Burn-My-Windows"
|
||||
msgstr "حول Burn-My-Windows"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:24 resources/ui/gtk4/BrokenGlass.ui:24
|
||||
#: resources/ui/gtk4/Wisps.ui:24 resources/ui/gtk4/Fire.ui:49
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:24
|
||||
#: resources/ui/gtk4/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/Hexagon.ui:24
|
||||
#: resources/ui/gtk4/EnergizeB.ui:24 resources/ui/gtk4/Apparition.ui:24
|
||||
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
|
||||
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
|
||||
#: resources/ui/gtk3/Hexagon.ui:49 resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Apparition.ui:63
|
||||
msgid "Animation Time [ms]"
|
||||
msgstr "المدة [م,ث]"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:52 resources/ui/gtk4/Matrix.ui:98
|
||||
#: resources/ui/gtk4/Matrix.ui:144 resources/ui/gtk4/Matrix.ui:190
|
||||
#: resources/ui/gtk4/Matrix.ui:224 resources/ui/gtk4/Matrix.ui:258
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:52 resources/ui/gtk4/BrokenGlass.ui:98
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:144 resources/ui/gtk4/BrokenGlass.ui:190
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:244 resources/ui/gtk4/Wisps.ui:52
|
||||
#: resources/ui/gtk4/Wisps.ui:98 resources/ui/gtk4/Wisps.ui:132
|
||||
#: resources/ui/gtk4/Fire.ui:77 resources/ui/gtk4/Fire.ui:123
|
||||
#: resources/ui/gtk4/Fire.ui:169 resources/ui/gtk4/Fire.ui:222
|
||||
#: resources/ui/gtk4/Fire.ui:280 resources/ui/gtk4/TRexAttack.ui:52
|
||||
#: resources/ui/gtk4/TRexAttack.ui:98 resources/ui/gtk4/TRexAttack.ui:144
|
||||
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
|
||||
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
|
||||
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/Hexagon.ui:52
|
||||
#: resources/ui/gtk4/Hexagon.ui:98 resources/ui/gtk4/Hexagon.ui:144
|
||||
#: resources/ui/gtk4/Hexagon.ui:178 resources/ui/gtk4/Hexagon.ui:212
|
||||
#: resources/ui/gtk4/Hexagon.ui:265 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk4/Apparition.ui:52
|
||||
#: resources/ui/gtk4/Apparition.ui:98 resources/ui/gtk4/Apparition.ui:144
|
||||
#: resources/ui/gtk4/Apparition.ui:190 resources/ui/gtk4/Apparition.ui:236
|
||||
#: resources/ui/gtk3/Wisps.ui:68 resources/ui/gtk3/Wisps.ui:117
|
||||
#: resources/ui/gtk3/Wisps.ui:160 resources/ui/gtk3/Fire.ui:119
|
||||
#: resources/ui/gtk3/Fire.ui:167 resources/ui/gtk3/Fire.ui:215
|
||||
#: resources/ui/gtk3/Fire.ui:277 resources/ui/gtk3/Fire.ui:345
|
||||
#: resources/ui/gtk3/TVEffect.ui:61 resources/ui/gtk3/TVEffect.ui:104
|
||||
#: resources/ui/gtk3/EnergizeA.ui:68 resources/ui/gtk3/EnergizeA.ui:117
|
||||
#: resources/ui/gtk3/EnergizeA.ui:160 resources/ui/gtk3/Hexagon.ui:75
|
||||
#: resources/ui/gtk3/Hexagon.ui:124 resources/ui/gtk3/Hexagon.ui:173
|
||||
#: resources/ui/gtk3/Hexagon.ui:216 resources/ui/gtk3/Hexagon.ui:259
|
||||
#: resources/ui/gtk3/Hexagon.ui:321 resources/ui/gtk3/EnergizeB.ui:68
|
||||
#: resources/ui/gtk3/EnergizeB.ui:117 resources/ui/gtk3/EnergizeB.ui:160
|
||||
#: resources/ui/gtk3/prefs.ui:219 resources/ui/gtk3/Apparition.ui:89
|
||||
#: resources/ui/gtk3/Apparition.ui:138 resources/ui/gtk3/Apparition.ui:187
|
||||
#: resources/ui/gtk3/Apparition.ui:236 resources/ui/gtk3/Apparition.ui:285
|
||||
msgid "Reset to Default Value"
|
||||
msgstr "إعادة التعيين إلى القيمة الافتراضية"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
|
||||
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/Hexagon.ui:70
|
||||
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Wisps.ui:91
|
||||
#: resources/ui/gtk3/Fire.ui:141 resources/ui/gtk3/EnergizeA.ui:91
|
||||
#: resources/ui/gtk3/Hexagon.ui:98 resources/ui/gtk3/EnergizeB.ui:91
|
||||
msgid "Scale"
|
||||
msgstr "مقاس"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:116 resources/ui/gtk4/Apparition.ui:70
|
||||
#: resources/ui/gtk3/Apparition.ui:112
|
||||
msgid "Randomness"
|
||||
msgstr "العشوائية"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:162
|
||||
msgid "Vertical Overshooting"
|
||||
msgstr "تجاوز رأسي"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:208
|
||||
msgid "Trail Color"
|
||||
msgstr "لون الممر"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:242
|
||||
msgid "Tip Color"
|
||||
msgstr "لون الحافة"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:116
|
||||
msgid "Gravity"
|
||||
msgstr "الجاذبية"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:162
|
||||
msgid "Blow Force"
|
||||
msgstr "قوة النفخ"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:212
|
||||
msgid "Shatter From Pointer Location"
|
||||
msgstr "تتحطم من موقع المؤشر"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:221
|
||||
msgid ""
|
||||
"The shards will fly away from where your mouse pointer was when closing the "
|
||||
"window."
|
||||
msgstr "ستنتقل القطع بعيدًا عن مكان وجود مؤشر الماوس عند إغلاق النافذة."
|
||||
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/SnapOfDisintegration.ui:116
|
||||
#: resources/ui/gtk4/TVEffect.ui:70 resources/ui/gtk4/EnergizeA.ui:116
|
||||
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Wisps.ui:139
|
||||
#: resources/ui/gtk3/TVEffect.ui:83 resources/ui/gtk3/EnergizeA.ui:139
|
||||
#: resources/ui/gtk3/EnergizeB.ui:139
|
||||
msgid "Color"
|
||||
msgstr "اللون"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:25 resources/ui/gtk3/Fire.ui:49
|
||||
msgid "Presets"
|
||||
msgstr "الإعدادات المسبقة"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:141 resources/ui/gtk3/Fire.ui:189
|
||||
msgid "Speed"
|
||||
msgstr "السرعة"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:191 resources/ui/gtk3/Fire.ui:241
|
||||
msgid "3D Noise"
|
||||
msgstr "ضوضاء ثلاثية الأبعاد"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:200 resources/ui/gtk3/Fire.ui:250
|
||||
msgid "Creates a more dynamic fire but requires more GPU power."
|
||||
msgstr ""
|
||||
"يُنشئ حريقًا أكثر ديناميكية ولكنه يتطلب المزيد من طاقة وحدة معالجة الرسومات."
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:240 resources/ui/gtk3/Fire.ui:300
|
||||
msgid "Gradient"
|
||||
msgstr "ميل"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:70
|
||||
msgid "Claw Scratch Scale"
|
||||
msgstr "حجم خدش المخلب"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:116
|
||||
msgid "Claw Scratch Count"
|
||||
msgstr "عدد خدوش المخلب"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:162
|
||||
msgid "Warp Effect"
|
||||
msgstr "تأثير الاعوجاج"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:208
|
||||
msgid "Flash Color"
|
||||
msgstr "ألوان مضيئة"
|
||||
|
||||
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
|
||||
msgid "Preview this Effect"
|
||||
msgstr "معاينة هذا التأثير"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
|
||||
msgid "Mesh Line Width"
|
||||
msgstr "عرض خط الشبكة"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
|
||||
msgid "Line Color"
|
||||
msgstr "لون السطر"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
|
||||
msgid "Glow Color"
|
||||
msgstr "توهج اللون"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
|
||||
msgid "Additive Blending"
|
||||
msgstr "مزج مضاف"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:243 resources/ui/gtk3/Hexagon.ui:294
|
||||
msgid "You may want to enable this for dark window themes."
|
||||
msgstr "قد ترغب في تمكين هذا لسمات النوافذ المظلمة."
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
|
||||
msgid "Welcome to Burn-My-Windows!"
|
||||
msgstr "مرحبًا بك في Burn-My-Windows!"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:39 resources/ui/gtk3/prefs.ui:46
|
||||
msgid "If you like this extension, recommend it to your friends :)"
|
||||
msgstr "إذا كنت تحب هذا الامتداد، فوصي به لأصدقائك :)"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:66 resources/ui/gtk3/prefs.ui:74
|
||||
msgid "Open Window Animation"
|
||||
msgstr "افتح نافذة التأثيرات"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:75 resources/ui/gtk4/prefs.ui:119
|
||||
#: resources/ui/gtk3/prefs.ui:83 resources/ui/gtk3/prefs.ui:147
|
||||
msgid "If multiple are selected, one is chosen randomly."
|
||||
msgstr "إذا تم تحديد عدة خيارات، يتم اختيار واحد بشكل عشوائي."
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:90 resources/ui/gtk4/prefs.ui:134
|
||||
#: resources/ui/gtk3/prefs.ui:104 resources/ui/gtk3/prefs.ui:168
|
||||
msgid "Choose Effects"
|
||||
msgstr "اختر التأثيرات"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:110 resources/ui/gtk3/prefs.ui:138
|
||||
msgid "Close Window Animation"
|
||||
msgstr "إغلاق التأثيرات للنافذة"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:150 resources/ui/gtk3/prefs.ui:198
|
||||
msgid "Also Add Effects to Dialogs"
|
||||
msgstr "أضف أيضًا تأثيرات إلى الحوارات"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
|
||||
msgid "Twirl Intensity"
|
||||
msgstr "شدة الدوران"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
|
||||
msgid "Shake Intensity"
|
||||
msgstr "شدة ألاهتزاز"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
|
||||
msgid "Suction Intensity"
|
||||
msgstr "شدة السحب"
|
||||
|
||||
#: resources/ui/gtk3/Fire.ui:63
|
||||
msgid "Choose a Preset"
|
||||
msgstr "اختر إعدادًا مسبقًا"
|
||||
@@ -1,14 +1,14 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR Simon Schneegans
|
||||
# This file is distributed under the same license as the Burn-My-Windows package.
|
||||
# This file is distributed under the same license as the burn-my-windows package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Burn-My-Windows\n"
|
||||
"Project-Id-Version: burn-my-windows\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-18 20:33+0100\n"
|
||||
"POT-Creation-Date: 2022-04-05 09:22+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,15 +17,15 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=CHARSET\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
|
||||
#: prefs.js:111
|
||||
#: prefs.js:112
|
||||
msgid "Effect Options"
|
||||
msgstr ""
|
||||
|
||||
#: prefs.js:139
|
||||
#: prefs.js:140
|
||||
msgid "Go Back"
|
||||
msgstr ""
|
||||
|
||||
#: prefs.js:181
|
||||
#: prefs.js:182
|
||||
msgid "General Options"
|
||||
msgstr ""
|
||||
|
||||
@@ -46,12 +46,12 @@ msgid "Past Sponsors"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: %s will be replaced by the effect's name.
|
||||
#: prefs.js:512
|
||||
#: prefs.js:510
|
||||
#, javascript-format
|
||||
msgid "Preview for %s"
|
||||
msgstr ""
|
||||
|
||||
#: prefs.js:534
|
||||
#: prefs.js:532
|
||||
msgid "Close this Window to Preview the Effect!"
|
||||
msgstr ""
|
||||
|
||||
@@ -67,6 +67,10 @@ msgstr ""
|
||||
msgid "T-Rex Attack"
|
||||
msgstr ""
|
||||
|
||||
#: src/SnapOfDisintegration.js:60
|
||||
msgid "Snap of Disintegration"
|
||||
msgstr ""
|
||||
|
||||
#: src/Wisps.js:55
|
||||
msgid "Wisps"
|
||||
msgstr ""
|
||||
@@ -95,10 +99,18 @@ msgstr ""
|
||||
msgid "Santa is Coming"
|
||||
msgstr ""
|
||||
|
||||
#: src/Hexagon.js:53
|
||||
msgid "Hexagon"
|
||||
msgstr ""
|
||||
|
||||
#: src/EnergizeA.js:54
|
||||
msgid "Energize A"
|
||||
msgstr ""
|
||||
|
||||
#: src/Apparition.js:57
|
||||
msgid "Apparition"
|
||||
msgstr ""
|
||||
|
||||
#: src/EnergizeB.js:54
|
||||
msgid "Energize B"
|
||||
msgstr ""
|
||||
@@ -131,17 +143,20 @@ msgstr ""
|
||||
msgid "Donate"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/common/main-menu.ui:45
|
||||
#: resources/ui/common/main-menu.ui:41
|
||||
msgid "About Burn-My-Windows"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:24 resources/ui/gtk4/BrokenGlass.ui:24
|
||||
#: resources/ui/gtk4/Wisps.ui:24 resources/ui/gtk4/Fire.ui:49
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:24
|
||||
#: resources/ui/gtk4/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/EnergizeB.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/Hexagon.ui:24
|
||||
#: resources/ui/gtk4/EnergizeB.ui:24 resources/ui/gtk4/Apparition.ui:24
|
||||
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
|
||||
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
|
||||
#: resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Hexagon.ui:49 resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Apparition.ui:63
|
||||
msgid "Animation Time [ms]"
|
||||
msgstr ""
|
||||
|
||||
@@ -159,29 +174,43 @@ msgstr ""
|
||||
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
|
||||
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
|
||||
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/Hexagon.ui:52
|
||||
#: resources/ui/gtk4/Hexagon.ui:98 resources/ui/gtk4/Hexagon.ui:144
|
||||
#: resources/ui/gtk4/Hexagon.ui:178 resources/ui/gtk4/Hexagon.ui:212
|
||||
#: resources/ui/gtk4/Hexagon.ui:265 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk3/Wisps.ui:68
|
||||
#: resources/ui/gtk3/Wisps.ui:117 resources/ui/gtk3/Wisps.ui:160
|
||||
#: resources/ui/gtk3/Fire.ui:119 resources/ui/gtk3/Fire.ui:167
|
||||
#: resources/ui/gtk3/Fire.ui:215 resources/ui/gtk3/Fire.ui:277
|
||||
#: resources/ui/gtk3/Fire.ui:345 resources/ui/gtk3/TVEffect.ui:61
|
||||
#: resources/ui/gtk3/TVEffect.ui:104 resources/ui/gtk3/EnergizeA.ui:68
|
||||
#: resources/ui/gtk3/EnergizeA.ui:117 resources/ui/gtk3/EnergizeA.ui:160
|
||||
#: resources/ui/gtk3/EnergizeB.ui:68 resources/ui/gtk3/EnergizeB.ui:117
|
||||
#: resources/ui/gtk3/EnergizeB.ui:160 resources/ui/gtk3/prefs.ui:219
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk4/Apparition.ui:52
|
||||
#: resources/ui/gtk4/Apparition.ui:98 resources/ui/gtk4/Apparition.ui:144
|
||||
#: resources/ui/gtk4/Apparition.ui:190 resources/ui/gtk4/Apparition.ui:236
|
||||
#: resources/ui/gtk3/Wisps.ui:68 resources/ui/gtk3/Wisps.ui:117
|
||||
#: resources/ui/gtk3/Wisps.ui:160 resources/ui/gtk3/Fire.ui:119
|
||||
#: resources/ui/gtk3/Fire.ui:167 resources/ui/gtk3/Fire.ui:215
|
||||
#: resources/ui/gtk3/Fire.ui:277 resources/ui/gtk3/Fire.ui:345
|
||||
#: resources/ui/gtk3/TVEffect.ui:61 resources/ui/gtk3/TVEffect.ui:104
|
||||
#: resources/ui/gtk3/EnergizeA.ui:68 resources/ui/gtk3/EnergizeA.ui:117
|
||||
#: resources/ui/gtk3/EnergizeA.ui:160 resources/ui/gtk3/Hexagon.ui:75
|
||||
#: resources/ui/gtk3/Hexagon.ui:124 resources/ui/gtk3/Hexagon.ui:173
|
||||
#: resources/ui/gtk3/Hexagon.ui:216 resources/ui/gtk3/Hexagon.ui:259
|
||||
#: resources/ui/gtk3/Hexagon.ui:321 resources/ui/gtk3/EnergizeB.ui:68
|
||||
#: resources/ui/gtk3/EnergizeB.ui:117 resources/ui/gtk3/EnergizeB.ui:160
|
||||
#: resources/ui/gtk3/prefs.ui:219 resources/ui/gtk3/Apparition.ui:89
|
||||
#: resources/ui/gtk3/Apparition.ui:138 resources/ui/gtk3/Apparition.ui:187
|
||||
#: resources/ui/gtk3/Apparition.ui:236 resources/ui/gtk3/Apparition.ui:285
|
||||
msgid "Reset to Default Value"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
|
||||
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/EnergizeB.ui:70
|
||||
#: resources/ui/gtk3/Wisps.ui:91 resources/ui/gtk3/Fire.ui:141
|
||||
#: resources/ui/gtk3/EnergizeA.ui:91 resources/ui/gtk3/EnergizeB.ui:91
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/Hexagon.ui:70
|
||||
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Wisps.ui:91
|
||||
#: resources/ui/gtk3/Fire.ui:141 resources/ui/gtk3/EnergizeA.ui:91
|
||||
#: resources/ui/gtk3/Hexagon.ui:98 resources/ui/gtk3/EnergizeB.ui:91
|
||||
msgid "Scale"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:116
|
||||
#: resources/ui/gtk4/Matrix.ui:116 resources/ui/gtk4/Apparition.ui:70
|
||||
#: resources/ui/gtk3/Apparition.ui:112
|
||||
msgid "Randomness"
|
||||
msgstr ""
|
||||
|
||||
@@ -215,10 +244,11 @@ msgid ""
|
||||
"window."
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/TVEffect.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:116 resources/ui/gtk4/EnergizeB.ui:116
|
||||
#: resources/ui/gtk3/Wisps.ui:139 resources/ui/gtk3/TVEffect.ui:83
|
||||
#: resources/ui/gtk3/EnergizeA.ui:139 resources/ui/gtk3/EnergizeB.ui:139
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/SnapOfDisintegration.ui:116
|
||||
#: resources/ui/gtk4/TVEffect.ui:70 resources/ui/gtk4/EnergizeA.ui:116
|
||||
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Wisps.ui:139
|
||||
#: resources/ui/gtk3/TVEffect.ui:83 resources/ui/gtk3/EnergizeA.ui:139
|
||||
#: resources/ui/gtk3/EnergizeB.ui:139
|
||||
msgid "Color"
|
||||
msgstr ""
|
||||
|
||||
@@ -262,6 +292,26 @@ msgstr ""
|
||||
msgid "Preview this Effect"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
|
||||
msgid "Mesh Line Width"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
|
||||
msgid "Line Color"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
|
||||
msgid "Glow Color"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
|
||||
msgid "Additive Blending"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:243 resources/ui/gtk3/Hexagon.ui:294
|
||||
msgid "You may want to enable this for dark window themes."
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
|
||||
msgid "Welcome to Burn-My-Windows!"
|
||||
msgstr ""
|
||||
@@ -292,6 +342,18 @@ msgstr ""
|
||||
msgid "Also Add Effects to Dialogs"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
|
||||
msgid "Twirl Intensity"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
|
||||
msgid "Shake Intensity"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
|
||||
msgid "Suction Intensity"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk3/Fire.ui:63
|
||||
msgid "Choose a Preset"
|
||||
msgstr ""
|
||||
|
||||
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Burn-My-Windows\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-18 20:33+0100\n"
|
||||
"POT-Creation-Date: 2022-04-05 09:22+0200\n"
|
||||
"PO-Revision-Date: 2022-02-02 19:55+0000\n"
|
||||
"Last-Translator: Jiří Doubravský <jiri.doubravsky@gmail.com>\n"
|
||||
"Language-Team: Czech <https://hosted.weblate.org/projects/burn-my-windows/"
|
||||
@@ -19,15 +19,15 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 4.11-dev\n"
|
||||
|
||||
#: prefs.js:111
|
||||
#: prefs.js:112
|
||||
msgid "Effect Options"
|
||||
msgstr ""
|
||||
|
||||
#: prefs.js:139
|
||||
#: prefs.js:140
|
||||
msgid "Go Back"
|
||||
msgstr ""
|
||||
|
||||
#: prefs.js:181
|
||||
#: prefs.js:182
|
||||
msgid "General Options"
|
||||
msgstr "Obecné možnosti"
|
||||
|
||||
@@ -48,12 +48,12 @@ msgid "Past Sponsors"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: %s will be replaced by the effect's name.
|
||||
#: prefs.js:512
|
||||
#: prefs.js:510
|
||||
#, javascript-format
|
||||
msgid "Preview for %s"
|
||||
msgstr "Náhled %s"
|
||||
|
||||
#: prefs.js:534
|
||||
#: prefs.js:532
|
||||
msgid "Close this Window to Preview the Effect!"
|
||||
msgstr "Zavřete toto okno, pokud chcete vidět efekt!"
|
||||
|
||||
@@ -69,6 +69,10 @@ msgstr "Televize"
|
||||
msgid "T-Rex Attack"
|
||||
msgstr "Tyrannosaurus"
|
||||
|
||||
#: src/SnapOfDisintegration.js:60
|
||||
msgid "Snap of Disintegration"
|
||||
msgstr ""
|
||||
|
||||
#: src/Wisps.js:55
|
||||
msgid "Wisps"
|
||||
msgstr "Obláčky"
|
||||
@@ -97,10 +101,18 @@ msgstr "Studený vánek"
|
||||
msgid "Santa is Coming"
|
||||
msgstr "Santa přichází"
|
||||
|
||||
#: src/Hexagon.js:53
|
||||
msgid "Hexagon"
|
||||
msgstr ""
|
||||
|
||||
#: src/EnergizeA.js:54
|
||||
msgid "Energize A"
|
||||
msgstr "Energizovat A"
|
||||
|
||||
#: src/Apparition.js:57
|
||||
msgid "Apparition"
|
||||
msgstr ""
|
||||
|
||||
#: src/EnergizeB.js:54
|
||||
msgid "Energize B"
|
||||
msgstr "Energizovat B"
|
||||
@@ -133,17 +145,20 @@ msgstr "Přeložit"
|
||||
msgid "Donate"
|
||||
msgstr "Přispět"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:45
|
||||
#: resources/ui/common/main-menu.ui:41
|
||||
msgid "About Burn-My-Windows"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:24 resources/ui/gtk4/BrokenGlass.ui:24
|
||||
#: resources/ui/gtk4/Wisps.ui:24 resources/ui/gtk4/Fire.ui:49
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:24
|
||||
#: resources/ui/gtk4/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/EnergizeB.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/Hexagon.ui:24
|
||||
#: resources/ui/gtk4/EnergizeB.ui:24 resources/ui/gtk4/Apparition.ui:24
|
||||
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
|
||||
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
|
||||
#: resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Hexagon.ui:49 resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Apparition.ui:63
|
||||
msgid "Animation Time [ms]"
|
||||
msgstr "Délka animace [ms]"
|
||||
|
||||
@@ -161,29 +176,43 @@ msgstr "Délka animace [ms]"
|
||||
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
|
||||
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
|
||||
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/Hexagon.ui:52
|
||||
#: resources/ui/gtk4/Hexagon.ui:98 resources/ui/gtk4/Hexagon.ui:144
|
||||
#: resources/ui/gtk4/Hexagon.ui:178 resources/ui/gtk4/Hexagon.ui:212
|
||||
#: resources/ui/gtk4/Hexagon.ui:265 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk3/Wisps.ui:68
|
||||
#: resources/ui/gtk3/Wisps.ui:117 resources/ui/gtk3/Wisps.ui:160
|
||||
#: resources/ui/gtk3/Fire.ui:119 resources/ui/gtk3/Fire.ui:167
|
||||
#: resources/ui/gtk3/Fire.ui:215 resources/ui/gtk3/Fire.ui:277
|
||||
#: resources/ui/gtk3/Fire.ui:345 resources/ui/gtk3/TVEffect.ui:61
|
||||
#: resources/ui/gtk3/TVEffect.ui:104 resources/ui/gtk3/EnergizeA.ui:68
|
||||
#: resources/ui/gtk3/EnergizeA.ui:117 resources/ui/gtk3/EnergizeA.ui:160
|
||||
#: resources/ui/gtk3/EnergizeB.ui:68 resources/ui/gtk3/EnergizeB.ui:117
|
||||
#: resources/ui/gtk3/EnergizeB.ui:160 resources/ui/gtk3/prefs.ui:219
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk4/Apparition.ui:52
|
||||
#: resources/ui/gtk4/Apparition.ui:98 resources/ui/gtk4/Apparition.ui:144
|
||||
#: resources/ui/gtk4/Apparition.ui:190 resources/ui/gtk4/Apparition.ui:236
|
||||
#: resources/ui/gtk3/Wisps.ui:68 resources/ui/gtk3/Wisps.ui:117
|
||||
#: resources/ui/gtk3/Wisps.ui:160 resources/ui/gtk3/Fire.ui:119
|
||||
#: resources/ui/gtk3/Fire.ui:167 resources/ui/gtk3/Fire.ui:215
|
||||
#: resources/ui/gtk3/Fire.ui:277 resources/ui/gtk3/Fire.ui:345
|
||||
#: resources/ui/gtk3/TVEffect.ui:61 resources/ui/gtk3/TVEffect.ui:104
|
||||
#: resources/ui/gtk3/EnergizeA.ui:68 resources/ui/gtk3/EnergizeA.ui:117
|
||||
#: resources/ui/gtk3/EnergizeA.ui:160 resources/ui/gtk3/Hexagon.ui:75
|
||||
#: resources/ui/gtk3/Hexagon.ui:124 resources/ui/gtk3/Hexagon.ui:173
|
||||
#: resources/ui/gtk3/Hexagon.ui:216 resources/ui/gtk3/Hexagon.ui:259
|
||||
#: resources/ui/gtk3/Hexagon.ui:321 resources/ui/gtk3/EnergizeB.ui:68
|
||||
#: resources/ui/gtk3/EnergizeB.ui:117 resources/ui/gtk3/EnergizeB.ui:160
|
||||
#: resources/ui/gtk3/prefs.ui:219 resources/ui/gtk3/Apparition.ui:89
|
||||
#: resources/ui/gtk3/Apparition.ui:138 resources/ui/gtk3/Apparition.ui:187
|
||||
#: resources/ui/gtk3/Apparition.ui:236 resources/ui/gtk3/Apparition.ui:285
|
||||
msgid "Reset to Default Value"
|
||||
msgstr "Obnovit výchozí hodnoty"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
|
||||
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/EnergizeB.ui:70
|
||||
#: resources/ui/gtk3/Wisps.ui:91 resources/ui/gtk3/Fire.ui:141
|
||||
#: resources/ui/gtk3/EnergizeA.ui:91 resources/ui/gtk3/EnergizeB.ui:91
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/Hexagon.ui:70
|
||||
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Wisps.ui:91
|
||||
#: resources/ui/gtk3/Fire.ui:141 resources/ui/gtk3/EnergizeA.ui:91
|
||||
#: resources/ui/gtk3/Hexagon.ui:98 resources/ui/gtk3/EnergizeB.ui:91
|
||||
msgid "Scale"
|
||||
msgstr "Měřítko"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:116
|
||||
#: resources/ui/gtk4/Matrix.ui:116 resources/ui/gtk4/Apparition.ui:70
|
||||
#: resources/ui/gtk3/Apparition.ui:112
|
||||
msgid "Randomness"
|
||||
msgstr "Nahodilost"
|
||||
|
||||
@@ -218,10 +247,11 @@ msgid ""
|
||||
"window."
|
||||
msgstr "Střepy odletí z místa, kde byl ukazatel myši při zavírání okna."
|
||||
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/TVEffect.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:116 resources/ui/gtk4/EnergizeB.ui:116
|
||||
#: resources/ui/gtk3/Wisps.ui:139 resources/ui/gtk3/TVEffect.ui:83
|
||||
#: resources/ui/gtk3/EnergizeA.ui:139 resources/ui/gtk3/EnergizeB.ui:139
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/SnapOfDisintegration.ui:116
|
||||
#: resources/ui/gtk4/TVEffect.ui:70 resources/ui/gtk4/EnergizeA.ui:116
|
||||
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Wisps.ui:139
|
||||
#: resources/ui/gtk3/TVEffect.ui:83 resources/ui/gtk3/EnergizeA.ui:139
|
||||
#: resources/ui/gtk3/EnergizeB.ui:139
|
||||
msgid "Color"
|
||||
msgstr "Barva"
|
||||
|
||||
@@ -265,6 +295,26 @@ msgstr "Barva blesku"
|
||||
msgid "Preview this Effect"
|
||||
msgstr "Náhled efektu"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
|
||||
msgid "Mesh Line Width"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
|
||||
msgid "Line Color"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
|
||||
msgid "Glow Color"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
|
||||
msgid "Additive Blending"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:243 resources/ui/gtk3/Hexagon.ui:294
|
||||
msgid "You may want to enable this for dark window themes."
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
|
||||
msgid "Welcome to Burn-My-Windows!"
|
||||
msgstr "Vítá Vás Burn-My-Windows!"
|
||||
@@ -295,6 +345,18 @@ msgstr "Animace při zavírání okna"
|
||||
msgid "Also Add Effects to Dialogs"
|
||||
msgstr "Použít efekt i na dialogová okna"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
|
||||
msgid "Twirl Intensity"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
|
||||
msgid "Shake Intensity"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
|
||||
msgid "Suction Intensity"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk3/Fire.ui:63
|
||||
msgid "Choose a Preset"
|
||||
msgstr "Vyberte předvolbu"
|
||||
|
||||
@@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Burn-My-Windows\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-18 20:33+0100\n"
|
||||
"PO-Revision-Date: 2022-02-18 19:40+0000\n"
|
||||
"POT-Creation-Date: 2022-04-05 09:22+0200\n"
|
||||
"PO-Revision-Date: 2022-04-05 18:37+0000\n"
|
||||
"Last-Translator: Simon Schneegans <code@simonschneegans.de>\n"
|
||||
"Language-Team: German <https://hosted.weblate.org/projects/burn-my-windows/"
|
||||
"core/de/>\n"
|
||||
@@ -17,17 +17,17 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.11-dev\n"
|
||||
"X-Generator: Weblate 4.12-dev\n"
|
||||
|
||||
#: prefs.js:111
|
||||
#: prefs.js:112
|
||||
msgid "Effect Options"
|
||||
msgstr "Effektoptionen"
|
||||
|
||||
#: prefs.js:139
|
||||
#: prefs.js:140
|
||||
msgid "Go Back"
|
||||
msgstr "Zurück"
|
||||
|
||||
#: prefs.js:181
|
||||
#: prefs.js:182
|
||||
msgid "General Options"
|
||||
msgstr "Allgemeine Optionen"
|
||||
|
||||
@@ -48,12 +48,12 @@ msgid "Past Sponsors"
|
||||
msgstr "Ehemalige Sponsoren"
|
||||
|
||||
#. Translators: %s will be replaced by the effect's name.
|
||||
#: prefs.js:512
|
||||
#: prefs.js:510
|
||||
#, javascript-format
|
||||
msgid "Preview for %s"
|
||||
msgstr "Vorschau für %s"
|
||||
|
||||
#: prefs.js:534
|
||||
#: prefs.js:532
|
||||
msgid "Close this Window to Preview the Effect!"
|
||||
msgstr "Schließen Sie dieses Fenster, um eine Vorschau des Effekts anzuzeigen!"
|
||||
|
||||
@@ -69,6 +69,10 @@ msgstr "TV-Effekt"
|
||||
msgid "T-Rex Attack"
|
||||
msgstr "T-Rex-Angriff"
|
||||
|
||||
#: src/SnapOfDisintegration.js:60
|
||||
msgid "Snap of Disintegration"
|
||||
msgstr "Fingerschnippen des Zerfalls"
|
||||
|
||||
#: src/Wisps.js:55
|
||||
msgid "Wisps"
|
||||
msgstr "Irrlichter"
|
||||
@@ -97,10 +101,18 @@ msgstr "Kalte Brise"
|
||||
msgid "Santa is Coming"
|
||||
msgstr "Weihnachtsgrüße"
|
||||
|
||||
#: src/Hexagon.js:53
|
||||
msgid "Hexagon"
|
||||
msgstr "Hexagon"
|
||||
|
||||
#: src/EnergizeA.js:54
|
||||
msgid "Energize A"
|
||||
msgstr "Energie A"
|
||||
|
||||
#: src/Apparition.js:57
|
||||
msgid "Apparition"
|
||||
msgstr "Apparieren"
|
||||
|
||||
#: src/EnergizeB.js:54
|
||||
msgid "Energize B"
|
||||
msgstr "Energie B"
|
||||
@@ -133,17 +145,20 @@ msgstr "Übersetzen"
|
||||
msgid "Donate"
|
||||
msgstr "Spenden"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:45
|
||||
#: resources/ui/common/main-menu.ui:41
|
||||
msgid "About Burn-My-Windows"
|
||||
msgstr "Über Burn-My-Windows"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:24 resources/ui/gtk4/BrokenGlass.ui:24
|
||||
#: resources/ui/gtk4/Wisps.ui:24 resources/ui/gtk4/Fire.ui:49
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:24
|
||||
#: resources/ui/gtk4/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/EnergizeB.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/Hexagon.ui:24
|
||||
#: resources/ui/gtk4/EnergizeB.ui:24 resources/ui/gtk4/Apparition.ui:24
|
||||
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
|
||||
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
|
||||
#: resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Hexagon.ui:49 resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Apparition.ui:63
|
||||
msgid "Animation Time [ms]"
|
||||
msgstr "Animationszeit [ms]"
|
||||
|
||||
@@ -161,29 +176,43 @@ msgstr "Animationszeit [ms]"
|
||||
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
|
||||
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
|
||||
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/Hexagon.ui:52
|
||||
#: resources/ui/gtk4/Hexagon.ui:98 resources/ui/gtk4/Hexagon.ui:144
|
||||
#: resources/ui/gtk4/Hexagon.ui:178 resources/ui/gtk4/Hexagon.ui:212
|
||||
#: resources/ui/gtk4/Hexagon.ui:265 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk3/Wisps.ui:68
|
||||
#: resources/ui/gtk3/Wisps.ui:117 resources/ui/gtk3/Wisps.ui:160
|
||||
#: resources/ui/gtk3/Fire.ui:119 resources/ui/gtk3/Fire.ui:167
|
||||
#: resources/ui/gtk3/Fire.ui:215 resources/ui/gtk3/Fire.ui:277
|
||||
#: resources/ui/gtk3/Fire.ui:345 resources/ui/gtk3/TVEffect.ui:61
|
||||
#: resources/ui/gtk3/TVEffect.ui:104 resources/ui/gtk3/EnergizeA.ui:68
|
||||
#: resources/ui/gtk3/EnergizeA.ui:117 resources/ui/gtk3/EnergizeA.ui:160
|
||||
#: resources/ui/gtk3/EnergizeB.ui:68 resources/ui/gtk3/EnergizeB.ui:117
|
||||
#: resources/ui/gtk3/EnergizeB.ui:160 resources/ui/gtk3/prefs.ui:219
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk4/Apparition.ui:52
|
||||
#: resources/ui/gtk4/Apparition.ui:98 resources/ui/gtk4/Apparition.ui:144
|
||||
#: resources/ui/gtk4/Apparition.ui:190 resources/ui/gtk4/Apparition.ui:236
|
||||
#: resources/ui/gtk3/Wisps.ui:68 resources/ui/gtk3/Wisps.ui:117
|
||||
#: resources/ui/gtk3/Wisps.ui:160 resources/ui/gtk3/Fire.ui:119
|
||||
#: resources/ui/gtk3/Fire.ui:167 resources/ui/gtk3/Fire.ui:215
|
||||
#: resources/ui/gtk3/Fire.ui:277 resources/ui/gtk3/Fire.ui:345
|
||||
#: resources/ui/gtk3/TVEffect.ui:61 resources/ui/gtk3/TVEffect.ui:104
|
||||
#: resources/ui/gtk3/EnergizeA.ui:68 resources/ui/gtk3/EnergizeA.ui:117
|
||||
#: resources/ui/gtk3/EnergizeA.ui:160 resources/ui/gtk3/Hexagon.ui:75
|
||||
#: resources/ui/gtk3/Hexagon.ui:124 resources/ui/gtk3/Hexagon.ui:173
|
||||
#: resources/ui/gtk3/Hexagon.ui:216 resources/ui/gtk3/Hexagon.ui:259
|
||||
#: resources/ui/gtk3/Hexagon.ui:321 resources/ui/gtk3/EnergizeB.ui:68
|
||||
#: resources/ui/gtk3/EnergizeB.ui:117 resources/ui/gtk3/EnergizeB.ui:160
|
||||
#: resources/ui/gtk3/prefs.ui:219 resources/ui/gtk3/Apparition.ui:89
|
||||
#: resources/ui/gtk3/Apparition.ui:138 resources/ui/gtk3/Apparition.ui:187
|
||||
#: resources/ui/gtk3/Apparition.ui:236 resources/ui/gtk3/Apparition.ui:285
|
||||
msgid "Reset to Default Value"
|
||||
msgstr "Auf Standardwert zurücksetzen"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
|
||||
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/EnergizeB.ui:70
|
||||
#: resources/ui/gtk3/Wisps.ui:91 resources/ui/gtk3/Fire.ui:141
|
||||
#: resources/ui/gtk3/EnergizeA.ui:91 resources/ui/gtk3/EnergizeB.ui:91
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/Hexagon.ui:70
|
||||
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Wisps.ui:91
|
||||
#: resources/ui/gtk3/Fire.ui:141 resources/ui/gtk3/EnergizeA.ui:91
|
||||
#: resources/ui/gtk3/Hexagon.ui:98 resources/ui/gtk3/EnergizeB.ui:91
|
||||
msgid "Scale"
|
||||
msgstr "Größe"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:116
|
||||
#: resources/ui/gtk4/Matrix.ui:116 resources/ui/gtk4/Apparition.ui:70
|
||||
#: resources/ui/gtk3/Apparition.ui:112
|
||||
msgid "Randomness"
|
||||
msgstr "Zufälligkeit"
|
||||
|
||||
@@ -219,10 +248,11 @@ msgstr ""
|
||||
"Die Scherben fliegen von der Stelle weg, an der sich Ihr Mauszeiger beim "
|
||||
"Schließen des Fensters befand."
|
||||
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/TVEffect.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:116 resources/ui/gtk4/EnergizeB.ui:116
|
||||
#: resources/ui/gtk3/Wisps.ui:139 resources/ui/gtk3/TVEffect.ui:83
|
||||
#: resources/ui/gtk3/EnergizeA.ui:139 resources/ui/gtk3/EnergizeB.ui:139
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/SnapOfDisintegration.ui:116
|
||||
#: resources/ui/gtk4/TVEffect.ui:70 resources/ui/gtk4/EnergizeA.ui:116
|
||||
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Wisps.ui:139
|
||||
#: resources/ui/gtk3/TVEffect.ui:83 resources/ui/gtk3/EnergizeA.ui:139
|
||||
#: resources/ui/gtk3/EnergizeB.ui:139
|
||||
msgid "Color"
|
||||
msgstr "Farbe"
|
||||
|
||||
@@ -266,6 +296,26 @@ msgstr "Blitzfarbe"
|
||||
msgid "Preview this Effect"
|
||||
msgstr "Vorschau dieses Effekts"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
|
||||
msgid "Mesh Line Width"
|
||||
msgstr "Gitterlinienstärke"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
|
||||
msgid "Line Color"
|
||||
msgstr "Linienfarbe"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
|
||||
msgid "Glow Color"
|
||||
msgstr "Leuchtfarbe"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
|
||||
msgid "Additive Blending"
|
||||
msgstr "Additives Mischen"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:243 resources/ui/gtk3/Hexagon.ui:294
|
||||
msgid "You may want to enable this for dark window themes."
|
||||
msgstr "Für dunkle Fensterthemen sollten Sie diese Option aktivieren."
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
|
||||
msgid "Welcome to Burn-My-Windows!"
|
||||
msgstr "Willkommen bei Burn-My-Windows!"
|
||||
@@ -296,6 +346,18 @@ msgstr "Fenster-Schließen-Animation"
|
||||
msgid "Also Add Effects to Dialogs"
|
||||
msgstr "Effekte auch zu Dialogen hinzufügen"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
|
||||
msgid "Twirl Intensity"
|
||||
msgstr "Wirbelintensität"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
|
||||
msgid "Shake Intensity"
|
||||
msgstr "Wackelintensität"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
|
||||
msgid "Suction Intensity"
|
||||
msgstr "Saugintensität"
|
||||
|
||||
#: resources/ui/gtk3/Fire.ui:63
|
||||
msgid "Choose a Preset"
|
||||
msgstr "Wählen Sie eine Voreinstellung"
|
||||
|
||||
@@ -7,9 +7,9 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Burn-My-Windows\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-18 20:33+0100\n"
|
||||
"PO-Revision-Date: 2022-03-15 06:54+0000\n"
|
||||
"Last-Translator: Adolfo Jayme Barrientos <fitojb@ubuntu.com>\n"
|
||||
"POT-Creation-Date: 2022-04-05 09:22+0200\n"
|
||||
"PO-Revision-Date: 2022-04-08 07:11+0000\n"
|
||||
"Last-Translator: Óscar Fernández Díaz <oscfdezdz@tuta.io>\n"
|
||||
"Language-Team: Spanish <https://hosted.weblate.org/projects/burn-my-windows/"
|
||||
"core/es/>\n"
|
||||
"Language: es\n"
|
||||
@@ -19,15 +19,15 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.12-dev\n"
|
||||
|
||||
#: prefs.js:111
|
||||
#: prefs.js:112
|
||||
msgid "Effect Options"
|
||||
msgstr "Opciones de efecto"
|
||||
|
||||
#: prefs.js:139
|
||||
#: prefs.js:140
|
||||
msgid "Go Back"
|
||||
msgstr "Volver"
|
||||
|
||||
#: prefs.js:181
|
||||
#: prefs.js:182
|
||||
msgid "General Options"
|
||||
msgstr "Opciones generales"
|
||||
|
||||
@@ -48,12 +48,12 @@ msgid "Past Sponsors"
|
||||
msgstr "Patrocinadores anteriores"
|
||||
|
||||
#. Translators: %s will be replaced by the effect's name.
|
||||
#: prefs.js:512
|
||||
#: prefs.js:510
|
||||
#, javascript-format
|
||||
msgid "Preview for %s"
|
||||
msgstr "Previsualización de %s"
|
||||
|
||||
#: prefs.js:534
|
||||
#: prefs.js:532
|
||||
msgid "Close this Window to Preview the Effect!"
|
||||
msgstr "¡Cierre esta ventana para ver el efecto!"
|
||||
|
||||
@@ -69,6 +69,10 @@ msgstr "Efecto televisor"
|
||||
msgid "T-Rex Attack"
|
||||
msgstr "Ataque de T-Rex"
|
||||
|
||||
#: src/SnapOfDisintegration.js:60
|
||||
msgid "Snap of Disintegration"
|
||||
msgstr "Chasquido de desintegración"
|
||||
|
||||
#: src/Wisps.js:55
|
||||
msgid "Wisps"
|
||||
msgstr "Chispas"
|
||||
@@ -97,10 +101,18 @@ msgstr "Brisa fría"
|
||||
msgid "Santa is Coming"
|
||||
msgstr "Viene Papá Noel"
|
||||
|
||||
#: src/Hexagon.js:53
|
||||
msgid "Hexagon"
|
||||
msgstr "Hexágonos"
|
||||
|
||||
#: src/EnergizeA.js:54
|
||||
msgid "Energize A"
|
||||
msgstr "Energizar A"
|
||||
|
||||
#: src/Apparition.js:57
|
||||
msgid "Apparition"
|
||||
msgstr "Aparición"
|
||||
|
||||
#: src/EnergizeB.js:54
|
||||
msgid "Energize B"
|
||||
msgstr "Energizar B"
|
||||
@@ -133,17 +145,20 @@ msgstr "Traducir"
|
||||
msgid "Donate"
|
||||
msgstr "Donar"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:45
|
||||
#: resources/ui/common/main-menu.ui:41
|
||||
msgid "About Burn-My-Windows"
|
||||
msgstr "Acerca de Burn-My-Windows"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:24 resources/ui/gtk4/BrokenGlass.ui:24
|
||||
#: resources/ui/gtk4/Wisps.ui:24 resources/ui/gtk4/Fire.ui:49
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:24
|
||||
#: resources/ui/gtk4/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/EnergizeB.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/Hexagon.ui:24
|
||||
#: resources/ui/gtk4/EnergizeB.ui:24 resources/ui/gtk4/Apparition.ui:24
|
||||
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
|
||||
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
|
||||
#: resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Hexagon.ui:49 resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Apparition.ui:63
|
||||
msgid "Animation Time [ms]"
|
||||
msgstr "Tiempo de animación [ms]"
|
||||
|
||||
@@ -161,29 +176,43 @@ msgstr "Tiempo de animación [ms]"
|
||||
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
|
||||
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
|
||||
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/Hexagon.ui:52
|
||||
#: resources/ui/gtk4/Hexagon.ui:98 resources/ui/gtk4/Hexagon.ui:144
|
||||
#: resources/ui/gtk4/Hexagon.ui:178 resources/ui/gtk4/Hexagon.ui:212
|
||||
#: resources/ui/gtk4/Hexagon.ui:265 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk3/Wisps.ui:68
|
||||
#: resources/ui/gtk3/Wisps.ui:117 resources/ui/gtk3/Wisps.ui:160
|
||||
#: resources/ui/gtk3/Fire.ui:119 resources/ui/gtk3/Fire.ui:167
|
||||
#: resources/ui/gtk3/Fire.ui:215 resources/ui/gtk3/Fire.ui:277
|
||||
#: resources/ui/gtk3/Fire.ui:345 resources/ui/gtk3/TVEffect.ui:61
|
||||
#: resources/ui/gtk3/TVEffect.ui:104 resources/ui/gtk3/EnergizeA.ui:68
|
||||
#: resources/ui/gtk3/EnergizeA.ui:117 resources/ui/gtk3/EnergizeA.ui:160
|
||||
#: resources/ui/gtk3/EnergizeB.ui:68 resources/ui/gtk3/EnergizeB.ui:117
|
||||
#: resources/ui/gtk3/EnergizeB.ui:160 resources/ui/gtk3/prefs.ui:219
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk4/Apparition.ui:52
|
||||
#: resources/ui/gtk4/Apparition.ui:98 resources/ui/gtk4/Apparition.ui:144
|
||||
#: resources/ui/gtk4/Apparition.ui:190 resources/ui/gtk4/Apparition.ui:236
|
||||
#: resources/ui/gtk3/Wisps.ui:68 resources/ui/gtk3/Wisps.ui:117
|
||||
#: resources/ui/gtk3/Wisps.ui:160 resources/ui/gtk3/Fire.ui:119
|
||||
#: resources/ui/gtk3/Fire.ui:167 resources/ui/gtk3/Fire.ui:215
|
||||
#: resources/ui/gtk3/Fire.ui:277 resources/ui/gtk3/Fire.ui:345
|
||||
#: resources/ui/gtk3/TVEffect.ui:61 resources/ui/gtk3/TVEffect.ui:104
|
||||
#: resources/ui/gtk3/EnergizeA.ui:68 resources/ui/gtk3/EnergizeA.ui:117
|
||||
#: resources/ui/gtk3/EnergizeA.ui:160 resources/ui/gtk3/Hexagon.ui:75
|
||||
#: resources/ui/gtk3/Hexagon.ui:124 resources/ui/gtk3/Hexagon.ui:173
|
||||
#: resources/ui/gtk3/Hexagon.ui:216 resources/ui/gtk3/Hexagon.ui:259
|
||||
#: resources/ui/gtk3/Hexagon.ui:321 resources/ui/gtk3/EnergizeB.ui:68
|
||||
#: resources/ui/gtk3/EnergizeB.ui:117 resources/ui/gtk3/EnergizeB.ui:160
|
||||
#: resources/ui/gtk3/prefs.ui:219 resources/ui/gtk3/Apparition.ui:89
|
||||
#: resources/ui/gtk3/Apparition.ui:138 resources/ui/gtk3/Apparition.ui:187
|
||||
#: resources/ui/gtk3/Apparition.ui:236 resources/ui/gtk3/Apparition.ui:285
|
||||
msgid "Reset to Default Value"
|
||||
msgstr "Restablecer al valor predeterminado"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
|
||||
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/EnergizeB.ui:70
|
||||
#: resources/ui/gtk3/Wisps.ui:91 resources/ui/gtk3/Fire.ui:141
|
||||
#: resources/ui/gtk3/EnergizeA.ui:91 resources/ui/gtk3/EnergizeB.ui:91
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/Hexagon.ui:70
|
||||
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Wisps.ui:91
|
||||
#: resources/ui/gtk3/Fire.ui:141 resources/ui/gtk3/EnergizeA.ui:91
|
||||
#: resources/ui/gtk3/Hexagon.ui:98 resources/ui/gtk3/EnergizeB.ui:91
|
||||
msgid "Scale"
|
||||
msgstr "Escala"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:116
|
||||
#: resources/ui/gtk4/Matrix.ui:116 resources/ui/gtk4/Apparition.ui:70
|
||||
#: resources/ui/gtk3/Apparition.ui:112
|
||||
msgid "Randomness"
|
||||
msgstr "Aleatoriedad"
|
||||
|
||||
@@ -219,10 +248,11 @@ msgstr ""
|
||||
"Los fragmentos saldrán volando desde donde estaba el puntero del ratón al "
|
||||
"cerrar la ventana."
|
||||
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/TVEffect.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:116 resources/ui/gtk4/EnergizeB.ui:116
|
||||
#: resources/ui/gtk3/Wisps.ui:139 resources/ui/gtk3/TVEffect.ui:83
|
||||
#: resources/ui/gtk3/EnergizeA.ui:139 resources/ui/gtk3/EnergizeB.ui:139
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/SnapOfDisintegration.ui:116
|
||||
#: resources/ui/gtk4/TVEffect.ui:70 resources/ui/gtk4/EnergizeA.ui:116
|
||||
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Wisps.ui:139
|
||||
#: resources/ui/gtk3/TVEffect.ui:83 resources/ui/gtk3/EnergizeA.ui:139
|
||||
#: resources/ui/gtk3/EnergizeB.ui:139
|
||||
msgid "Color"
|
||||
msgstr "Color"
|
||||
|
||||
@@ -266,9 +296,29 @@ msgstr "Color del flash"
|
||||
msgid "Preview this Effect"
|
||||
msgstr "Previsualizar este efecto"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
|
||||
msgid "Mesh Line Width"
|
||||
msgstr "Ancho de la línea de malla"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
|
||||
msgid "Line Color"
|
||||
msgstr "Color de línea"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
|
||||
msgid "Glow Color"
|
||||
msgstr "Color del brillo"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
|
||||
msgid "Additive Blending"
|
||||
msgstr "Fundido activo"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:243 resources/ui/gtk3/Hexagon.ui:294
|
||||
msgid "You may want to enable this for dark window themes."
|
||||
msgstr "Puede ser que necesites activar esto para temas oscuros de ventana."
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
|
||||
msgid "Welcome to Burn-My-Windows!"
|
||||
msgstr "Le damos la bienvenida a Burn-My-Windows."
|
||||
msgstr "¡Le damos la bienvenida a Burn-My-Windows!"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:39 resources/ui/gtk3/prefs.ui:46
|
||||
msgid "If you like this extension, recommend it to your friends :)"
|
||||
@@ -296,6 +346,18 @@ msgstr "Animación al cerrar la ventana"
|
||||
msgid "Also Add Effects to Dialogs"
|
||||
msgstr "Añadir también efectos a los diálogos"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
|
||||
msgid "Twirl Intensity"
|
||||
msgstr "Intensidad del giro"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
|
||||
msgid "Shake Intensity"
|
||||
msgstr "Intensidad del temblor"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
|
||||
msgid "Suction Intensity"
|
||||
msgstr "Intensidad de la succión"
|
||||
|
||||
#: resources/ui/gtk3/Fire.ui:63
|
||||
msgid "Choose a Preset"
|
||||
msgstr "Elija una preselección"
|
||||
|
||||
@@ -0,0 +1,362 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR Simon Schneegans
|
||||
# This file is distributed under the same license as the burn-my-windows package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: burn-my-windows\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-04-05 09:22+0200\n"
|
||||
"PO-Revision-Date: 2022-04-08 07:11+0000\n"
|
||||
"Last-Translator: Jiri Grönroos <jiri.gronroos@iki.fi>\n"
|
||||
"Language-Team: Finnish <https://hosted.weblate.org/projects/burn-my-windows/"
|
||||
"core/fi/>\n"
|
||||
"Language: fi\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.12-dev\n"
|
||||
|
||||
#: prefs.js:112
|
||||
msgid "Effect Options"
|
||||
msgstr "Tehostevalinnat"
|
||||
|
||||
#: prefs.js:140
|
||||
msgid "Go Back"
|
||||
msgstr "Takaisin"
|
||||
|
||||
#: prefs.js:182
|
||||
msgid "General Options"
|
||||
msgstr "Yleiset asetukset"
|
||||
|
||||
#: prefs.js:276
|
||||
msgid "Gold Sponsors"
|
||||
msgstr "Kultasponsorit"
|
||||
|
||||
#: prefs.js:279
|
||||
msgid "Silver Sponsors"
|
||||
msgstr "Hopeasponsorit"
|
||||
|
||||
#: prefs.js:282
|
||||
msgid "Bronze Sponsors"
|
||||
msgstr "Pronssisponsorit"
|
||||
|
||||
#: prefs.js:285
|
||||
msgid "Past Sponsors"
|
||||
msgstr "Aiemmat sponsorit"
|
||||
|
||||
#. Translators: %s will be replaced by the effect's name.
|
||||
#: prefs.js:510
|
||||
#, javascript-format
|
||||
msgid "Preview for %s"
|
||||
msgstr "Esikatselu tehosteelle %s"
|
||||
|
||||
#: prefs.js:532
|
||||
msgid "Close this Window to Preview the Effect!"
|
||||
msgstr "Sulje tämä ikkuna esikatsellaksesi tehosteen!"
|
||||
|
||||
#: src/BrokenGlass.js:57
|
||||
msgid "Broken Glass"
|
||||
msgstr "Rikkoutunut lasi"
|
||||
|
||||
#: src/TVEffect.js:56
|
||||
msgid "TV Effect"
|
||||
msgstr "TV-tehoste"
|
||||
|
||||
#: src/TRexAttack.js:56
|
||||
msgid "T-Rex Attack"
|
||||
msgstr "T-Rexin hyökkäys"
|
||||
|
||||
#: src/SnapOfDisintegration.js:60
|
||||
msgid "Snap of Disintegration"
|
||||
msgstr "Hajoamisen napsahdus"
|
||||
|
||||
#: src/Wisps.js:55
|
||||
msgid "Wisps"
|
||||
msgstr "Häiveet"
|
||||
|
||||
#: src/Fire.js:58
|
||||
msgid "Fire"
|
||||
msgstr "Tuli"
|
||||
|
||||
#: src/Fire.js:130
|
||||
msgid "Default Fire"
|
||||
msgstr "Oletustuli"
|
||||
|
||||
#: src/Fire.js:140
|
||||
msgid "Hell Fire"
|
||||
msgstr "Helvetintuli"
|
||||
|
||||
#: src/Fire.js:150
|
||||
msgid "Dark and Smutty"
|
||||
msgstr "Tumma ja likainen"
|
||||
|
||||
#: src/Fire.js:160
|
||||
msgid "Cold Breeze"
|
||||
msgstr "Kylmän tuulahdus"
|
||||
|
||||
#: src/Fire.js:170
|
||||
msgid "Santa is Coming"
|
||||
msgstr "Pukki saapuu"
|
||||
|
||||
#: src/Hexagon.js:53
|
||||
msgid "Hexagon"
|
||||
msgstr "Kuusikulmio"
|
||||
|
||||
#: src/EnergizeA.js:54
|
||||
msgid "Energize A"
|
||||
msgstr ""
|
||||
|
||||
#: src/Apparition.js:57
|
||||
msgid "Apparition"
|
||||
msgstr "Ilmestys"
|
||||
|
||||
#: src/EnergizeB.js:54
|
||||
msgid "Energize B"
|
||||
msgstr ""
|
||||
|
||||
#: src/Matrix.js:58
|
||||
msgid "Matrix"
|
||||
msgstr "Matriisi"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:6
|
||||
msgid "Visit Homepage"
|
||||
msgstr "Käy verkkosivulla"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:10
|
||||
msgid "View Changelog"
|
||||
msgstr "Näytä muutosloki"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:16
|
||||
msgid "Report a Bug"
|
||||
msgstr "Ilmoita ongelmasta"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:20
|
||||
msgid "Create an Effect"
|
||||
msgstr "Luo tehoste"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:24
|
||||
msgid "Translate"
|
||||
msgstr "Käännä"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:28
|
||||
msgid "Donate"
|
||||
msgstr "Lahjoita"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:41
|
||||
msgid "About Burn-My-Windows"
|
||||
msgstr "Tietoja - Burn-My-Windows"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:24 resources/ui/gtk4/BrokenGlass.ui:24
|
||||
#: resources/ui/gtk4/Wisps.ui:24 resources/ui/gtk4/Fire.ui:49
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:24
|
||||
#: resources/ui/gtk4/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/Hexagon.ui:24
|
||||
#: resources/ui/gtk4/EnergizeB.ui:24 resources/ui/gtk4/Apparition.ui:24
|
||||
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
|
||||
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
|
||||
#: resources/ui/gtk3/Hexagon.ui:49 resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Apparition.ui:63
|
||||
msgid "Animation Time [ms]"
|
||||
msgstr "Animaatioaika [ms]"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:52 resources/ui/gtk4/Matrix.ui:98
|
||||
#: resources/ui/gtk4/Matrix.ui:144 resources/ui/gtk4/Matrix.ui:190
|
||||
#: resources/ui/gtk4/Matrix.ui:224 resources/ui/gtk4/Matrix.ui:258
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:52 resources/ui/gtk4/BrokenGlass.ui:98
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:144 resources/ui/gtk4/BrokenGlass.ui:190
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:244 resources/ui/gtk4/Wisps.ui:52
|
||||
#: resources/ui/gtk4/Wisps.ui:98 resources/ui/gtk4/Wisps.ui:132
|
||||
#: resources/ui/gtk4/Fire.ui:77 resources/ui/gtk4/Fire.ui:123
|
||||
#: resources/ui/gtk4/Fire.ui:169 resources/ui/gtk4/Fire.ui:222
|
||||
#: resources/ui/gtk4/Fire.ui:280 resources/ui/gtk4/TRexAttack.ui:52
|
||||
#: resources/ui/gtk4/TRexAttack.ui:98 resources/ui/gtk4/TRexAttack.ui:144
|
||||
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
|
||||
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
|
||||
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/Hexagon.ui:52
|
||||
#: resources/ui/gtk4/Hexagon.ui:98 resources/ui/gtk4/Hexagon.ui:144
|
||||
#: resources/ui/gtk4/Hexagon.ui:178 resources/ui/gtk4/Hexagon.ui:212
|
||||
#: resources/ui/gtk4/Hexagon.ui:265 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk4/Apparition.ui:52
|
||||
#: resources/ui/gtk4/Apparition.ui:98 resources/ui/gtk4/Apparition.ui:144
|
||||
#: resources/ui/gtk4/Apparition.ui:190 resources/ui/gtk4/Apparition.ui:236
|
||||
#: resources/ui/gtk3/Wisps.ui:68 resources/ui/gtk3/Wisps.ui:117
|
||||
#: resources/ui/gtk3/Wisps.ui:160 resources/ui/gtk3/Fire.ui:119
|
||||
#: resources/ui/gtk3/Fire.ui:167 resources/ui/gtk3/Fire.ui:215
|
||||
#: resources/ui/gtk3/Fire.ui:277 resources/ui/gtk3/Fire.ui:345
|
||||
#: resources/ui/gtk3/TVEffect.ui:61 resources/ui/gtk3/TVEffect.ui:104
|
||||
#: resources/ui/gtk3/EnergizeA.ui:68 resources/ui/gtk3/EnergizeA.ui:117
|
||||
#: resources/ui/gtk3/EnergizeA.ui:160 resources/ui/gtk3/Hexagon.ui:75
|
||||
#: resources/ui/gtk3/Hexagon.ui:124 resources/ui/gtk3/Hexagon.ui:173
|
||||
#: resources/ui/gtk3/Hexagon.ui:216 resources/ui/gtk3/Hexagon.ui:259
|
||||
#: resources/ui/gtk3/Hexagon.ui:321 resources/ui/gtk3/EnergizeB.ui:68
|
||||
#: resources/ui/gtk3/EnergizeB.ui:117 resources/ui/gtk3/EnergizeB.ui:160
|
||||
#: resources/ui/gtk3/prefs.ui:219 resources/ui/gtk3/Apparition.ui:89
|
||||
#: resources/ui/gtk3/Apparition.ui:138 resources/ui/gtk3/Apparition.ui:187
|
||||
#: resources/ui/gtk3/Apparition.ui:236 resources/ui/gtk3/Apparition.ui:285
|
||||
msgid "Reset to Default Value"
|
||||
msgstr "Palauta oletusarvoon"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
|
||||
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/Hexagon.ui:70
|
||||
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Wisps.ui:91
|
||||
#: resources/ui/gtk3/Fire.ui:141 resources/ui/gtk3/EnergizeA.ui:91
|
||||
#: resources/ui/gtk3/Hexagon.ui:98 resources/ui/gtk3/EnergizeB.ui:91
|
||||
msgid "Scale"
|
||||
msgstr "Skaala"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:116 resources/ui/gtk4/Apparition.ui:70
|
||||
#: resources/ui/gtk3/Apparition.ui:112
|
||||
msgid "Randomness"
|
||||
msgstr "Satunnaisuus"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:162
|
||||
msgid "Vertical Overshooting"
|
||||
msgstr "Pystysuora ylitys"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:208
|
||||
msgid "Trail Color"
|
||||
msgstr "Polun väri"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:242
|
||||
msgid "Tip Color"
|
||||
msgstr "Vihjeen väri"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:116
|
||||
msgid "Gravity"
|
||||
msgstr "Painovoima"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:162
|
||||
msgid "Blow Force"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:212
|
||||
msgid "Shatter From Pointer Location"
|
||||
msgstr "Särkyminen osoittimen sijainnista"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:221
|
||||
msgid ""
|
||||
"The shards will fly away from where your mouse pointer was when closing the "
|
||||
"window."
|
||||
msgstr ""
|
||||
"Sirpaleet lentävät kauas hiiren osoittimen sijainnista kun suljet ikkunan."
|
||||
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/SnapOfDisintegration.ui:116
|
||||
#: resources/ui/gtk4/TVEffect.ui:70 resources/ui/gtk4/EnergizeA.ui:116
|
||||
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Wisps.ui:139
|
||||
#: resources/ui/gtk3/TVEffect.ui:83 resources/ui/gtk3/EnergizeA.ui:139
|
||||
#: resources/ui/gtk3/EnergizeB.ui:139
|
||||
msgid "Color"
|
||||
msgstr "Väri"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:25 resources/ui/gtk3/Fire.ui:49
|
||||
msgid "Presets"
|
||||
msgstr "Esiasetukset"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:141 resources/ui/gtk3/Fire.ui:189
|
||||
msgid "Speed"
|
||||
msgstr "Nopeus"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:191 resources/ui/gtk3/Fire.ui:241
|
||||
msgid "3D Noise"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:200 resources/ui/gtk3/Fire.ui:250
|
||||
msgid "Creates a more dynamic fire but requires more GPU power."
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:240 resources/ui/gtk3/Fire.ui:300
|
||||
msgid "Gradient"
|
||||
msgstr "Liukuväri"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:70
|
||||
msgid "Claw Scratch Scale"
|
||||
msgstr "Kynnenraapaisun skaala"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:116
|
||||
msgid "Claw Scratch Count"
|
||||
msgstr "Kynnenraapaisujen määrä"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:162
|
||||
msgid "Warp Effect"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:208
|
||||
msgid "Flash Color"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
|
||||
msgid "Preview this Effect"
|
||||
msgstr "Esikatsele tämä tehoste"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
|
||||
msgid "Mesh Line Width"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
|
||||
msgid "Line Color"
|
||||
msgstr "Viivan väri"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
|
||||
msgid "Glow Color"
|
||||
msgstr "Hehkun väri"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
|
||||
msgid "Additive Blending"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:243 resources/ui/gtk3/Hexagon.ui:294
|
||||
msgid "You may want to enable this for dark window themes."
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
|
||||
msgid "Welcome to Burn-My-Windows!"
|
||||
msgstr "Tervetuloa, tämä on Burn-My-Windows!"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:39 resources/ui/gtk3/prefs.ui:46
|
||||
msgid "If you like this extension, recommend it to your friends :)"
|
||||
msgstr "Jos pidä tästä laajennuksesta, suosittele sitä kavereillesi :)"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:66 resources/ui/gtk3/prefs.ui:74
|
||||
msgid "Open Window Animation"
|
||||
msgstr "Ikkunan avaamisen animaatio"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:75 resources/ui/gtk4/prefs.ui:119
|
||||
#: resources/ui/gtk3/prefs.ui:83 resources/ui/gtk3/prefs.ui:147
|
||||
msgid "If multiple are selected, one is chosen randomly."
|
||||
msgstr "Jos useita on valittu, yksi valitaan satunnaisesti."
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:90 resources/ui/gtk4/prefs.ui:134
|
||||
#: resources/ui/gtk3/prefs.ui:104 resources/ui/gtk3/prefs.ui:168
|
||||
msgid "Choose Effects"
|
||||
msgstr "Valitse tehosteet"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:110 resources/ui/gtk3/prefs.ui:138
|
||||
msgid "Close Window Animation"
|
||||
msgstr "Ikkunan sulkemisen animaatio"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:150 resources/ui/gtk3/prefs.ui:198
|
||||
msgid "Also Add Effects to Dialogs"
|
||||
msgstr "Lisää tehosteet myös dialogi-ikkunoihin"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
|
||||
msgid "Twirl Intensity"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
|
||||
msgid "Shake Intensity"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
|
||||
msgid "Suction Intensity"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk3/Fire.ui:63
|
||||
msgid "Choose a Preset"
|
||||
msgstr "Valitse esiasetus"
|
||||
@@ -7,9 +7,9 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Burn-My-Windows\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-18 20:33+0100\n"
|
||||
"PO-Revision-Date: 2022-02-21 11:58+0000\n"
|
||||
"Last-Translator: Nathan <bonnemainsnathan@gmail.com>\n"
|
||||
"POT-Creation-Date: 2022-04-05 09:22+0200\n"
|
||||
"PO-Revision-Date: 2022-05-01 23:10+0000\n"
|
||||
"Last-Translator: matb <perso@mathieu-bousquet.fr>\n"
|
||||
"Language-Team: French <https://hosted.weblate.org/projects/burn-my-windows/"
|
||||
"core/fr/>\n"
|
||||
"Language: fr\n"
|
||||
@@ -17,17 +17,17 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n > 1;\n"
|
||||
"X-Generator: Weblate 4.11-dev\n"
|
||||
"X-Generator: Weblate 4.12.1\n"
|
||||
|
||||
#: prefs.js:111
|
||||
#: prefs.js:112
|
||||
msgid "Effect Options"
|
||||
msgstr "Options de l'effet"
|
||||
|
||||
#: prefs.js:139
|
||||
#: prefs.js:140
|
||||
msgid "Go Back"
|
||||
msgstr "Retour"
|
||||
|
||||
#: prefs.js:181
|
||||
#: prefs.js:182
|
||||
msgid "General Options"
|
||||
msgstr "Options générales"
|
||||
|
||||
@@ -48,12 +48,12 @@ msgid "Past Sponsors"
|
||||
msgstr "Anciens Sponsors"
|
||||
|
||||
#. Translators: %s will be replaced by the effect's name.
|
||||
#: prefs.js:512
|
||||
#: prefs.js:510
|
||||
#, javascript-format
|
||||
msgid "Preview for %s"
|
||||
msgstr "Aperçu pour %s"
|
||||
|
||||
#: prefs.js:534
|
||||
#: prefs.js:532
|
||||
msgid "Close this Window to Preview the Effect!"
|
||||
msgstr "Fermez cette fenêtre pour un aperçu de l'effet !"
|
||||
|
||||
@@ -69,9 +69,13 @@ msgstr "Effet TV"
|
||||
msgid "T-Rex Attack"
|
||||
msgstr "Attaque de T-Rex"
|
||||
|
||||
#: src/SnapOfDisintegration.js:60
|
||||
msgid "Snap of Disintegration"
|
||||
msgstr "Désintégration"
|
||||
|
||||
#: src/Wisps.js:55
|
||||
msgid "Wisps"
|
||||
msgstr "Volutes"
|
||||
msgstr "Feux follets"
|
||||
|
||||
#: src/Fire.js:58
|
||||
msgid "Fire"
|
||||
@@ -97,10 +101,18 @@ msgstr "Brise froide"
|
||||
msgid "Santa is Coming"
|
||||
msgstr "Le Père Noël arrive"
|
||||
|
||||
#: src/Hexagon.js:53
|
||||
msgid "Hexagon"
|
||||
msgstr "Hexagone"
|
||||
|
||||
#: src/EnergizeA.js:54
|
||||
msgid "Energize A"
|
||||
msgstr "Énergie A"
|
||||
|
||||
#: src/Apparition.js:57
|
||||
msgid "Apparition"
|
||||
msgstr "Apparition"
|
||||
|
||||
#: src/EnergizeB.js:54
|
||||
msgid "Energize B"
|
||||
msgstr "Énergie B"
|
||||
@@ -119,7 +131,7 @@ msgstr "Voir le journal des modifications"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:16
|
||||
msgid "Report a Bug"
|
||||
msgstr "Signaler un bug"
|
||||
msgstr "Signaler un bogue"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:20
|
||||
msgid "Create an Effect"
|
||||
@@ -133,17 +145,20 @@ msgstr "Traduire"
|
||||
msgid "Donate"
|
||||
msgstr "Faire un don"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:45
|
||||
#: resources/ui/common/main-menu.ui:41
|
||||
msgid "About Burn-My-Windows"
|
||||
msgstr "À propos de Burn-My-Windows"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:24 resources/ui/gtk4/BrokenGlass.ui:24
|
||||
#: resources/ui/gtk4/Wisps.ui:24 resources/ui/gtk4/Fire.ui:49
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:24
|
||||
#: resources/ui/gtk4/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/EnergizeB.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/Hexagon.ui:24
|
||||
#: resources/ui/gtk4/EnergizeB.ui:24 resources/ui/gtk4/Apparition.ui:24
|
||||
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
|
||||
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
|
||||
#: resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Hexagon.ui:49 resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Apparition.ui:63
|
||||
msgid "Animation Time [ms]"
|
||||
msgstr "Durée de l'animation (ms)"
|
||||
|
||||
@@ -161,29 +176,43 @@ msgstr "Durée de l'animation (ms)"
|
||||
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
|
||||
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
|
||||
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/Hexagon.ui:52
|
||||
#: resources/ui/gtk4/Hexagon.ui:98 resources/ui/gtk4/Hexagon.ui:144
|
||||
#: resources/ui/gtk4/Hexagon.ui:178 resources/ui/gtk4/Hexagon.ui:212
|
||||
#: resources/ui/gtk4/Hexagon.ui:265 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk3/Wisps.ui:68
|
||||
#: resources/ui/gtk3/Wisps.ui:117 resources/ui/gtk3/Wisps.ui:160
|
||||
#: resources/ui/gtk3/Fire.ui:119 resources/ui/gtk3/Fire.ui:167
|
||||
#: resources/ui/gtk3/Fire.ui:215 resources/ui/gtk3/Fire.ui:277
|
||||
#: resources/ui/gtk3/Fire.ui:345 resources/ui/gtk3/TVEffect.ui:61
|
||||
#: resources/ui/gtk3/TVEffect.ui:104 resources/ui/gtk3/EnergizeA.ui:68
|
||||
#: resources/ui/gtk3/EnergizeA.ui:117 resources/ui/gtk3/EnergizeA.ui:160
|
||||
#: resources/ui/gtk3/EnergizeB.ui:68 resources/ui/gtk3/EnergizeB.ui:117
|
||||
#: resources/ui/gtk3/EnergizeB.ui:160 resources/ui/gtk3/prefs.ui:219
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk4/Apparition.ui:52
|
||||
#: resources/ui/gtk4/Apparition.ui:98 resources/ui/gtk4/Apparition.ui:144
|
||||
#: resources/ui/gtk4/Apparition.ui:190 resources/ui/gtk4/Apparition.ui:236
|
||||
#: resources/ui/gtk3/Wisps.ui:68 resources/ui/gtk3/Wisps.ui:117
|
||||
#: resources/ui/gtk3/Wisps.ui:160 resources/ui/gtk3/Fire.ui:119
|
||||
#: resources/ui/gtk3/Fire.ui:167 resources/ui/gtk3/Fire.ui:215
|
||||
#: resources/ui/gtk3/Fire.ui:277 resources/ui/gtk3/Fire.ui:345
|
||||
#: resources/ui/gtk3/TVEffect.ui:61 resources/ui/gtk3/TVEffect.ui:104
|
||||
#: resources/ui/gtk3/EnergizeA.ui:68 resources/ui/gtk3/EnergizeA.ui:117
|
||||
#: resources/ui/gtk3/EnergizeA.ui:160 resources/ui/gtk3/Hexagon.ui:75
|
||||
#: resources/ui/gtk3/Hexagon.ui:124 resources/ui/gtk3/Hexagon.ui:173
|
||||
#: resources/ui/gtk3/Hexagon.ui:216 resources/ui/gtk3/Hexagon.ui:259
|
||||
#: resources/ui/gtk3/Hexagon.ui:321 resources/ui/gtk3/EnergizeB.ui:68
|
||||
#: resources/ui/gtk3/EnergizeB.ui:117 resources/ui/gtk3/EnergizeB.ui:160
|
||||
#: resources/ui/gtk3/prefs.ui:219 resources/ui/gtk3/Apparition.ui:89
|
||||
#: resources/ui/gtk3/Apparition.ui:138 resources/ui/gtk3/Apparition.ui:187
|
||||
#: resources/ui/gtk3/Apparition.ui:236 resources/ui/gtk3/Apparition.ui:285
|
||||
msgid "Reset to Default Value"
|
||||
msgstr "Réinitialiser à la valeur par défaut"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
|
||||
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/EnergizeB.ui:70
|
||||
#: resources/ui/gtk3/Wisps.ui:91 resources/ui/gtk3/Fire.ui:141
|
||||
#: resources/ui/gtk3/EnergizeA.ui:91 resources/ui/gtk3/EnergizeB.ui:91
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/Hexagon.ui:70
|
||||
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Wisps.ui:91
|
||||
#: resources/ui/gtk3/Fire.ui:141 resources/ui/gtk3/EnergizeA.ui:91
|
||||
#: resources/ui/gtk3/Hexagon.ui:98 resources/ui/gtk3/EnergizeB.ui:91
|
||||
msgid "Scale"
|
||||
msgstr "Échelle"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:116
|
||||
#: resources/ui/gtk4/Matrix.ui:116 resources/ui/gtk4/Apparition.ui:70
|
||||
#: resources/ui/gtk3/Apparition.ui:112
|
||||
msgid "Randomness"
|
||||
msgstr "Aléatoire"
|
||||
|
||||
@@ -219,10 +248,11 @@ msgstr ""
|
||||
"Les éclats s'envoleront de l'endroit où se trouvait le pointeur de votre "
|
||||
"souris lorsque vous fermez la fenêtre."
|
||||
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/TVEffect.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:116 resources/ui/gtk4/EnergizeB.ui:116
|
||||
#: resources/ui/gtk3/Wisps.ui:139 resources/ui/gtk3/TVEffect.ui:83
|
||||
#: resources/ui/gtk3/EnergizeA.ui:139 resources/ui/gtk3/EnergizeB.ui:139
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/SnapOfDisintegration.ui:116
|
||||
#: resources/ui/gtk4/TVEffect.ui:70 resources/ui/gtk4/EnergizeA.ui:116
|
||||
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Wisps.ui:139
|
||||
#: resources/ui/gtk3/TVEffect.ui:83 resources/ui/gtk3/EnergizeA.ui:139
|
||||
#: resources/ui/gtk3/EnergizeB.ui:139
|
||||
msgid "Color"
|
||||
msgstr "Couleur"
|
||||
|
||||
@@ -250,11 +280,11 @@ msgstr "Gradient"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:70
|
||||
msgid "Claw Scratch Scale"
|
||||
msgstr "Échelle de griffe"
|
||||
msgstr "Taille de la griffe"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:116
|
||||
msgid "Claw Scratch Count"
|
||||
msgstr "Nombre de coups"
|
||||
msgstr "Nombre de griffures"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:162
|
||||
msgid "Warp Effect"
|
||||
@@ -268,6 +298,26 @@ msgstr "Couleur du flash"
|
||||
msgid "Preview this Effect"
|
||||
msgstr "Voir l'aperçu de cet effet"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
|
||||
msgid "Mesh Line Width"
|
||||
msgstr "Largeur des lignes du maillage"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
|
||||
msgid "Line Color"
|
||||
msgstr "Couleur de ligne"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
|
||||
msgid "Glow Color"
|
||||
msgstr "Couleur de la lueur"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
|
||||
msgid "Additive Blending"
|
||||
msgstr "Mélange additif"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:243 resources/ui/gtk3/Hexagon.ui:294
|
||||
msgid "You may want to enable this for dark window themes."
|
||||
msgstr "Vous voudrez peut-être l'activer pour les thèmes de fenêtre sombre."
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
|
||||
msgid "Welcome to Burn-My-Windows!"
|
||||
msgstr "Bienvenue dans Burn-My-Windows !"
|
||||
@@ -283,7 +333,7 @@ msgstr "Animation d'ouverture de fenêtre"
|
||||
#: resources/ui/gtk4/prefs.ui:75 resources/ui/gtk4/prefs.ui:119
|
||||
#: resources/ui/gtk3/prefs.ui:83 resources/ui/gtk3/prefs.ui:147
|
||||
msgid "If multiple are selected, one is chosen randomly."
|
||||
msgstr "Si plusieurs sont sélectionnés, un est choisi au hasard."
|
||||
msgstr "Si plusieurs effets sont sélectionnés, un est choisi au hasard."
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:90 resources/ui/gtk4/prefs.ui:134
|
||||
#: resources/ui/gtk3/prefs.ui:104 resources/ui/gtk3/prefs.ui:168
|
||||
@@ -298,6 +348,18 @@ msgstr "Animation de fermeture de fenêtre"
|
||||
msgid "Also Add Effects to Dialogs"
|
||||
msgstr "Appliquer également les effets aux boîtes de dialogue"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
|
||||
msgid "Twirl Intensity"
|
||||
msgstr "Intensité du tournoiement"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
|
||||
msgid "Shake Intensity"
|
||||
msgstr "Intensité de la secousse"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
|
||||
msgid "Suction Intensity"
|
||||
msgstr "Intensité de la succion"
|
||||
|
||||
#: resources/ui/gtk3/Fire.ui:63
|
||||
msgid "Choose a Preset"
|
||||
msgstr "Sélectionner un préréglage"
|
||||
|
||||
@@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Burn-My-Windows\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-18 20:33+0100\n"
|
||||
"PO-Revision-Date: 2022-02-28 12:56+0000\n"
|
||||
"POT-Creation-Date: 2022-04-05 09:22+0200\n"
|
||||
"PO-Revision-Date: 2022-04-16 11:14+0000\n"
|
||||
"Last-Translator: albanobattistella <albano_battistella@hotmail.com>\n"
|
||||
"Language-Team: Italian <https://hosted.weblate.org/projects/burn-my-windows/"
|
||||
"core/it/>\n"
|
||||
@@ -17,17 +17,17 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.11.1-dev\n"
|
||||
"X-Generator: Weblate 4.12-dev\n"
|
||||
|
||||
#: prefs.js:111
|
||||
#: prefs.js:112
|
||||
msgid "Effect Options"
|
||||
msgstr "Opzioni effetto"
|
||||
|
||||
#: prefs.js:139
|
||||
#: prefs.js:140
|
||||
msgid "Go Back"
|
||||
msgstr "Indietro"
|
||||
|
||||
#: prefs.js:181
|
||||
#: prefs.js:182
|
||||
msgid "General Options"
|
||||
msgstr "Opzioni generali"
|
||||
|
||||
@@ -48,12 +48,12 @@ msgid "Past Sponsors"
|
||||
msgstr "Sponsor passati"
|
||||
|
||||
#. Translators: %s will be replaced by the effect's name.
|
||||
#: prefs.js:512
|
||||
#: prefs.js:510
|
||||
#, javascript-format
|
||||
msgid "Preview for %s"
|
||||
msgstr "Anteprima per %s"
|
||||
|
||||
#: prefs.js:534
|
||||
#: prefs.js:532
|
||||
msgid "Close this Window to Preview the Effect!"
|
||||
msgstr "Chiudi questa finestra per visualizzare in anteprima l'effetto!"
|
||||
|
||||
@@ -69,6 +69,10 @@ msgstr "Effetto TV"
|
||||
msgid "T-Rex Attack"
|
||||
msgstr "Attacco T-Rex"
|
||||
|
||||
#: src/SnapOfDisintegration.js:60
|
||||
msgid "Snap of Disintegration"
|
||||
msgstr "Scatto di disintegrazione"
|
||||
|
||||
#: src/Wisps.js:55
|
||||
msgid "Wisps"
|
||||
msgstr "Scintille"
|
||||
@@ -97,10 +101,18 @@ msgstr "Brezza Fredda"
|
||||
msgid "Santa is Coming"
|
||||
msgstr "Babbo Natale sta arrivando"
|
||||
|
||||
#: src/Hexagon.js:53
|
||||
msgid "Hexagon"
|
||||
msgstr "Esagono"
|
||||
|
||||
#: src/EnergizeA.js:54
|
||||
msgid "Energize A"
|
||||
msgstr "Energia A"
|
||||
|
||||
#: src/Apparition.js:57
|
||||
msgid "Apparition"
|
||||
msgstr "Apparizione"
|
||||
|
||||
#: src/EnergizeB.js:54
|
||||
msgid "Energize B"
|
||||
msgstr "Energia B"
|
||||
@@ -133,17 +145,20 @@ msgstr "Traduci"
|
||||
msgid "Donate"
|
||||
msgstr "Donare"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:45
|
||||
#: resources/ui/common/main-menu.ui:41
|
||||
msgid "About Burn-My-Windows"
|
||||
msgstr "Informazioni su Burn-My-Windows"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:24 resources/ui/gtk4/BrokenGlass.ui:24
|
||||
#: resources/ui/gtk4/Wisps.ui:24 resources/ui/gtk4/Fire.ui:49
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:24
|
||||
#: resources/ui/gtk4/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/EnergizeB.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/Hexagon.ui:24
|
||||
#: resources/ui/gtk4/EnergizeB.ui:24 resources/ui/gtk4/Apparition.ui:24
|
||||
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
|
||||
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
|
||||
#: resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Hexagon.ui:49 resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Apparition.ui:63
|
||||
msgid "Animation Time [ms]"
|
||||
msgstr "Tempo animazione [ms]"
|
||||
|
||||
@@ -161,29 +176,43 @@ msgstr "Tempo animazione [ms]"
|
||||
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
|
||||
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
|
||||
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/Hexagon.ui:52
|
||||
#: resources/ui/gtk4/Hexagon.ui:98 resources/ui/gtk4/Hexagon.ui:144
|
||||
#: resources/ui/gtk4/Hexagon.ui:178 resources/ui/gtk4/Hexagon.ui:212
|
||||
#: resources/ui/gtk4/Hexagon.ui:265 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk3/Wisps.ui:68
|
||||
#: resources/ui/gtk3/Wisps.ui:117 resources/ui/gtk3/Wisps.ui:160
|
||||
#: resources/ui/gtk3/Fire.ui:119 resources/ui/gtk3/Fire.ui:167
|
||||
#: resources/ui/gtk3/Fire.ui:215 resources/ui/gtk3/Fire.ui:277
|
||||
#: resources/ui/gtk3/Fire.ui:345 resources/ui/gtk3/TVEffect.ui:61
|
||||
#: resources/ui/gtk3/TVEffect.ui:104 resources/ui/gtk3/EnergizeA.ui:68
|
||||
#: resources/ui/gtk3/EnergizeA.ui:117 resources/ui/gtk3/EnergizeA.ui:160
|
||||
#: resources/ui/gtk3/EnergizeB.ui:68 resources/ui/gtk3/EnergizeB.ui:117
|
||||
#: resources/ui/gtk3/EnergizeB.ui:160 resources/ui/gtk3/prefs.ui:219
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk4/Apparition.ui:52
|
||||
#: resources/ui/gtk4/Apparition.ui:98 resources/ui/gtk4/Apparition.ui:144
|
||||
#: resources/ui/gtk4/Apparition.ui:190 resources/ui/gtk4/Apparition.ui:236
|
||||
#: resources/ui/gtk3/Wisps.ui:68 resources/ui/gtk3/Wisps.ui:117
|
||||
#: resources/ui/gtk3/Wisps.ui:160 resources/ui/gtk3/Fire.ui:119
|
||||
#: resources/ui/gtk3/Fire.ui:167 resources/ui/gtk3/Fire.ui:215
|
||||
#: resources/ui/gtk3/Fire.ui:277 resources/ui/gtk3/Fire.ui:345
|
||||
#: resources/ui/gtk3/TVEffect.ui:61 resources/ui/gtk3/TVEffect.ui:104
|
||||
#: resources/ui/gtk3/EnergizeA.ui:68 resources/ui/gtk3/EnergizeA.ui:117
|
||||
#: resources/ui/gtk3/EnergizeA.ui:160 resources/ui/gtk3/Hexagon.ui:75
|
||||
#: resources/ui/gtk3/Hexagon.ui:124 resources/ui/gtk3/Hexagon.ui:173
|
||||
#: resources/ui/gtk3/Hexagon.ui:216 resources/ui/gtk3/Hexagon.ui:259
|
||||
#: resources/ui/gtk3/Hexagon.ui:321 resources/ui/gtk3/EnergizeB.ui:68
|
||||
#: resources/ui/gtk3/EnergizeB.ui:117 resources/ui/gtk3/EnergizeB.ui:160
|
||||
#: resources/ui/gtk3/prefs.ui:219 resources/ui/gtk3/Apparition.ui:89
|
||||
#: resources/ui/gtk3/Apparition.ui:138 resources/ui/gtk3/Apparition.ui:187
|
||||
#: resources/ui/gtk3/Apparition.ui:236 resources/ui/gtk3/Apparition.ui:285
|
||||
msgid "Reset to Default Value"
|
||||
msgstr "Ripristina valore predefinito"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
|
||||
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/EnergizeB.ui:70
|
||||
#: resources/ui/gtk3/Wisps.ui:91 resources/ui/gtk3/Fire.ui:141
|
||||
#: resources/ui/gtk3/EnergizeA.ui:91 resources/ui/gtk3/EnergizeB.ui:91
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/Hexagon.ui:70
|
||||
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Wisps.ui:91
|
||||
#: resources/ui/gtk3/Fire.ui:141 resources/ui/gtk3/EnergizeA.ui:91
|
||||
#: resources/ui/gtk3/Hexagon.ui:98 resources/ui/gtk3/EnergizeB.ui:91
|
||||
msgid "Scale"
|
||||
msgstr "Scala"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:116
|
||||
#: resources/ui/gtk4/Matrix.ui:116 resources/ui/gtk4/Apparition.ui:70
|
||||
#: resources/ui/gtk3/Apparition.ui:112
|
||||
msgid "Randomness"
|
||||
msgstr "Casuale"
|
||||
|
||||
@@ -219,10 +248,11 @@ msgstr ""
|
||||
"I frammenti voleranno fuori dal punto in cui si trovava il puntatore del "
|
||||
"mouse quando chiudi la finestra."
|
||||
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/TVEffect.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:116 resources/ui/gtk4/EnergizeB.ui:116
|
||||
#: resources/ui/gtk3/Wisps.ui:139 resources/ui/gtk3/TVEffect.ui:83
|
||||
#: resources/ui/gtk3/EnergizeA.ui:139 resources/ui/gtk3/EnergizeB.ui:139
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/SnapOfDisintegration.ui:116
|
||||
#: resources/ui/gtk4/TVEffect.ui:70 resources/ui/gtk4/EnergizeA.ui:116
|
||||
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Wisps.ui:139
|
||||
#: resources/ui/gtk3/TVEffect.ui:83 resources/ui/gtk3/EnergizeA.ui:139
|
||||
#: resources/ui/gtk3/EnergizeB.ui:139
|
||||
msgid "Color"
|
||||
msgstr "Colore"
|
||||
|
||||
@@ -266,6 +296,26 @@ msgstr "Colore Flash"
|
||||
msgid "Preview this Effect"
|
||||
msgstr "Anteprima di questo effetto"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
|
||||
msgid "Mesh Line Width"
|
||||
msgstr "Larghezza linea mesh"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
|
||||
msgid "Line Color"
|
||||
msgstr "Colore della linea"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
|
||||
msgid "Glow Color"
|
||||
msgstr "Colore bagliore"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
|
||||
msgid "Additive Blending"
|
||||
msgstr "Miscelazione aggiuntiva"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:243 resources/ui/gtk3/Hexagon.ui:294
|
||||
msgid "You may want to enable this for dark window themes."
|
||||
msgstr "Potresti abilitarlo per i temi delle finestre scure."
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
|
||||
msgid "Welcome to Burn-My-Windows!"
|
||||
msgstr "Benvenuto in Burn-My-Windows!"
|
||||
@@ -296,6 +346,18 @@ msgstr "Animazione alla chiusura della finestra"
|
||||
msgid "Also Add Effects to Dialogs"
|
||||
msgstr "Aggiungi anche effetti ai dialoghi"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
|
||||
msgid "Twirl Intensity"
|
||||
msgstr "Intensità di rotazione"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
|
||||
msgid "Shake Intensity"
|
||||
msgstr "Intensità di scuotimento"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
|
||||
msgid "Suction Intensity"
|
||||
msgstr "Intensità di aspirazione"
|
||||
|
||||
#: resources/ui/gtk3/Fire.ui:63
|
||||
msgid "Choose a Preset"
|
||||
msgstr "Scegli un predefinito"
|
||||
|
||||
@@ -0,0 +1,361 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR Simon Schneegans
|
||||
# This file is distributed under the same license as the burn-my-windows package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: burn-my-windows\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-04-05 09:22+0200\n"
|
||||
"PO-Revision-Date: 2022-05-21 10:15+0000\n"
|
||||
"Last-Translator: Seong-ho Cho <darkcircle.0426@gmail.com>\n"
|
||||
"Language-Team: Korean <https://hosted.weblate.org/projects/burn-my-windows/"
|
||||
"core/ko/>\n"
|
||||
"Language: ko\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 4.13-dev\n"
|
||||
|
||||
#: prefs.js:112
|
||||
msgid "Effect Options"
|
||||
msgstr "효과 옵션"
|
||||
|
||||
#: prefs.js:140
|
||||
msgid "Go Back"
|
||||
msgstr "뒤로 가기"
|
||||
|
||||
#: prefs.js:182
|
||||
msgid "General Options"
|
||||
msgstr "일반 옵션"
|
||||
|
||||
#: prefs.js:276
|
||||
msgid "Gold Sponsors"
|
||||
msgstr "골드 스폰서"
|
||||
|
||||
#: prefs.js:279
|
||||
msgid "Silver Sponsors"
|
||||
msgstr "실버 스폰서"
|
||||
|
||||
#: prefs.js:282
|
||||
msgid "Bronze Sponsors"
|
||||
msgstr "브론즈 스폰서"
|
||||
|
||||
#: prefs.js:285
|
||||
msgid "Past Sponsors"
|
||||
msgstr "이전 스폰서"
|
||||
|
||||
#. Translators: %s will be replaced by the effect's name.
|
||||
#: prefs.js:510
|
||||
#, javascript-format
|
||||
msgid "Preview for %s"
|
||||
msgstr "%s 미리 보기"
|
||||
|
||||
#: prefs.js:532
|
||||
msgid "Close this Window to Preview the Effect!"
|
||||
msgstr "이 창을 닫아 효과를 확인해보세요!"
|
||||
|
||||
#: src/BrokenGlass.js:57
|
||||
msgid "Broken Glass"
|
||||
msgstr "유리 깨짐"
|
||||
|
||||
#: src/TVEffect.js:56
|
||||
msgid "TV Effect"
|
||||
msgstr "TV 효과"
|
||||
|
||||
#: src/TRexAttack.js:56
|
||||
msgid "T-Rex Attack"
|
||||
msgstr "티라노 공격"
|
||||
|
||||
#: src/SnapOfDisintegration.js:60
|
||||
msgid "Snap of Disintegration"
|
||||
msgstr "해체 영상"
|
||||
|
||||
#: src/Wisps.js:55
|
||||
msgid "Wisps"
|
||||
msgstr "도깨비불"
|
||||
|
||||
#: src/Fire.js:58
|
||||
msgid "Fire"
|
||||
msgstr "화염"
|
||||
|
||||
#: src/Fire.js:130
|
||||
msgid "Default Fire"
|
||||
msgstr "기본 화염"
|
||||
|
||||
#: src/Fire.js:140
|
||||
msgid "Hell Fire"
|
||||
msgstr "지옥 화염"
|
||||
|
||||
#: src/Fire.js:150
|
||||
msgid "Dark and Smutty"
|
||||
msgstr "어둡고 찝찝함"
|
||||
|
||||
#: src/Fire.js:160
|
||||
msgid "Cold Breeze"
|
||||
msgstr "냉랭한 바람"
|
||||
|
||||
#: src/Fire.js:170
|
||||
msgid "Santa is Coming"
|
||||
msgstr "산타의 방문"
|
||||
|
||||
#: src/Hexagon.js:53
|
||||
msgid "Hexagon"
|
||||
msgstr "육각형"
|
||||
|
||||
#: src/EnergizeA.js:54
|
||||
msgid "Energize A"
|
||||
msgstr "에너자이즈 A"
|
||||
|
||||
#: src/Apparition.js:57
|
||||
msgid "Apparition"
|
||||
msgstr "혼령"
|
||||
|
||||
#: src/EnergizeB.js:54
|
||||
msgid "Energize B"
|
||||
msgstr "에너자이즈 B"
|
||||
|
||||
#: src/Matrix.js:58
|
||||
msgid "Matrix"
|
||||
msgstr "매트릭스"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:6
|
||||
msgid "Visit Homepage"
|
||||
msgstr "홈페이지 방문"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:10
|
||||
msgid "View Changelog"
|
||||
msgstr "변경 이력 보기"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:16
|
||||
msgid "Report a Bug"
|
||||
msgstr "버그 보고"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:20
|
||||
msgid "Create an Effect"
|
||||
msgstr "효과 만들기"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:24
|
||||
msgid "Translate"
|
||||
msgstr "번역"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:28
|
||||
msgid "Donate"
|
||||
msgstr "기부"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:41
|
||||
msgid "About Burn-My-Windows"
|
||||
msgstr "Burn-My-Windows 정보"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:24 resources/ui/gtk4/BrokenGlass.ui:24
|
||||
#: resources/ui/gtk4/Wisps.ui:24 resources/ui/gtk4/Fire.ui:49
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:24
|
||||
#: resources/ui/gtk4/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/Hexagon.ui:24
|
||||
#: resources/ui/gtk4/EnergizeB.ui:24 resources/ui/gtk4/Apparition.ui:24
|
||||
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
|
||||
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
|
||||
#: resources/ui/gtk3/Hexagon.ui:49 resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Apparition.ui:63
|
||||
msgid "Animation Time [ms]"
|
||||
msgstr "애니메이션 시간 [ms]"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:52 resources/ui/gtk4/Matrix.ui:98
|
||||
#: resources/ui/gtk4/Matrix.ui:144 resources/ui/gtk4/Matrix.ui:190
|
||||
#: resources/ui/gtk4/Matrix.ui:224 resources/ui/gtk4/Matrix.ui:258
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:52 resources/ui/gtk4/BrokenGlass.ui:98
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:144 resources/ui/gtk4/BrokenGlass.ui:190
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:244 resources/ui/gtk4/Wisps.ui:52
|
||||
#: resources/ui/gtk4/Wisps.ui:98 resources/ui/gtk4/Wisps.ui:132
|
||||
#: resources/ui/gtk4/Fire.ui:77 resources/ui/gtk4/Fire.ui:123
|
||||
#: resources/ui/gtk4/Fire.ui:169 resources/ui/gtk4/Fire.ui:222
|
||||
#: resources/ui/gtk4/Fire.ui:280 resources/ui/gtk4/TRexAttack.ui:52
|
||||
#: resources/ui/gtk4/TRexAttack.ui:98 resources/ui/gtk4/TRexAttack.ui:144
|
||||
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
|
||||
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
|
||||
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/Hexagon.ui:52
|
||||
#: resources/ui/gtk4/Hexagon.ui:98 resources/ui/gtk4/Hexagon.ui:144
|
||||
#: resources/ui/gtk4/Hexagon.ui:178 resources/ui/gtk4/Hexagon.ui:212
|
||||
#: resources/ui/gtk4/Hexagon.ui:265 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk4/Apparition.ui:52
|
||||
#: resources/ui/gtk4/Apparition.ui:98 resources/ui/gtk4/Apparition.ui:144
|
||||
#: resources/ui/gtk4/Apparition.ui:190 resources/ui/gtk4/Apparition.ui:236
|
||||
#: resources/ui/gtk3/Wisps.ui:68 resources/ui/gtk3/Wisps.ui:117
|
||||
#: resources/ui/gtk3/Wisps.ui:160 resources/ui/gtk3/Fire.ui:119
|
||||
#: resources/ui/gtk3/Fire.ui:167 resources/ui/gtk3/Fire.ui:215
|
||||
#: resources/ui/gtk3/Fire.ui:277 resources/ui/gtk3/Fire.ui:345
|
||||
#: resources/ui/gtk3/TVEffect.ui:61 resources/ui/gtk3/TVEffect.ui:104
|
||||
#: resources/ui/gtk3/EnergizeA.ui:68 resources/ui/gtk3/EnergizeA.ui:117
|
||||
#: resources/ui/gtk3/EnergizeA.ui:160 resources/ui/gtk3/Hexagon.ui:75
|
||||
#: resources/ui/gtk3/Hexagon.ui:124 resources/ui/gtk3/Hexagon.ui:173
|
||||
#: resources/ui/gtk3/Hexagon.ui:216 resources/ui/gtk3/Hexagon.ui:259
|
||||
#: resources/ui/gtk3/Hexagon.ui:321 resources/ui/gtk3/EnergizeB.ui:68
|
||||
#: resources/ui/gtk3/EnergizeB.ui:117 resources/ui/gtk3/EnergizeB.ui:160
|
||||
#: resources/ui/gtk3/prefs.ui:219 resources/ui/gtk3/Apparition.ui:89
|
||||
#: resources/ui/gtk3/Apparition.ui:138 resources/ui/gtk3/Apparition.ui:187
|
||||
#: resources/ui/gtk3/Apparition.ui:236 resources/ui/gtk3/Apparition.ui:285
|
||||
msgid "Reset to Default Value"
|
||||
msgstr "기본값으로 초기화"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
|
||||
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/Hexagon.ui:70
|
||||
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Wisps.ui:91
|
||||
#: resources/ui/gtk3/Fire.ui:141 resources/ui/gtk3/EnergizeA.ui:91
|
||||
#: resources/ui/gtk3/Hexagon.ui:98 resources/ui/gtk3/EnergizeB.ui:91
|
||||
msgid "Scale"
|
||||
msgstr "비율 조정"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:116 resources/ui/gtk4/Apparition.ui:70
|
||||
#: resources/ui/gtk3/Apparition.ui:112
|
||||
msgid "Randomness"
|
||||
msgstr "임의성 지수"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:162
|
||||
msgid "Vertical Overshooting"
|
||||
msgstr "수직 오버슈팅"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:208
|
||||
msgid "Trail Color"
|
||||
msgstr "끌림 자국 색상"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:242
|
||||
msgid "Tip Color"
|
||||
msgstr "끄트머리 색상"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:116
|
||||
msgid "Gravity"
|
||||
msgstr "중력계수"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:162
|
||||
msgid "Blow Force"
|
||||
msgstr "타격 강도"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:212
|
||||
msgid "Shatter From Pointer Location"
|
||||
msgstr "포인터 위치에서 깨짐"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:221
|
||||
msgid ""
|
||||
"The shards will fly away from where your mouse pointer was when closing the "
|
||||
"window."
|
||||
msgstr "창을 닫을 때 마우스 포인터 위치에서 조각이 날아갑니다."
|
||||
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/SnapOfDisintegration.ui:116
|
||||
#: resources/ui/gtk4/TVEffect.ui:70 resources/ui/gtk4/EnergizeA.ui:116
|
||||
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Wisps.ui:139
|
||||
#: resources/ui/gtk3/TVEffect.ui:83 resources/ui/gtk3/EnergizeA.ui:139
|
||||
#: resources/ui/gtk3/EnergizeB.ui:139
|
||||
msgid "Color"
|
||||
msgstr "색상"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:25 resources/ui/gtk3/Fire.ui:49
|
||||
msgid "Presets"
|
||||
msgstr "사전설정"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:141 resources/ui/gtk3/Fire.ui:189
|
||||
msgid "Speed"
|
||||
msgstr "속도"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:191 resources/ui/gtk3/Fire.ui:241
|
||||
msgid "3D Noise"
|
||||
msgstr "3차원 잡티"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:200 resources/ui/gtk3/Fire.ui:250
|
||||
msgid "Creates a more dynamic fire but requires more GPU power."
|
||||
msgstr "좀 더 역동적인 화염을 만들지만 더 많은 GPU 성능이 필요합니다."
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:240 resources/ui/gtk3/Fire.ui:300
|
||||
msgid "Gradient"
|
||||
msgstr "그레디언트"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:70
|
||||
msgid "Claw Scratch Scale"
|
||||
msgstr "발톱 자국 크기 비율"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:116
|
||||
msgid "Claw Scratch Count"
|
||||
msgstr "발톱 자국 갯수"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:162
|
||||
msgid "Warp Effect"
|
||||
msgstr "왜곡 효과"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:208
|
||||
msgid "Flash Color"
|
||||
msgstr "번쩍임 색상"
|
||||
|
||||
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
|
||||
msgid "Preview this Effect"
|
||||
msgstr "이 효과 미리 보기"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
|
||||
msgid "Mesh Line Width"
|
||||
msgstr "도형 선 굵기"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
|
||||
msgid "Line Color"
|
||||
msgstr "선 색상"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
|
||||
msgid "Glow Color"
|
||||
msgstr "불빛 색상"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
|
||||
msgid "Additive Blending"
|
||||
msgstr "혼합 효과"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:243 resources/ui/gtk3/Hexagon.ui:294
|
||||
msgid "You may want to enable this for dark window themes."
|
||||
msgstr "어두운 창 테마에서 사용하시면 좋습니다."
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
|
||||
msgid "Welcome to Burn-My-Windows!"
|
||||
msgstr "Burn-My-Windows 사용을 환영해요!"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:39 resources/ui/gtk3/prefs.ui:46
|
||||
msgid "If you like this extension, recommend it to your friends :)"
|
||||
msgstr "이 확장이 맘에 든다면 친구에게 추천해주세요 :)"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:66 resources/ui/gtk3/prefs.ui:74
|
||||
msgid "Open Window Animation"
|
||||
msgstr "창 열기 애니메이션"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:75 resources/ui/gtk4/prefs.ui:119
|
||||
#: resources/ui/gtk3/prefs.ui:83 resources/ui/gtk3/prefs.ui:147
|
||||
msgid "If multiple are selected, one is chosen randomly."
|
||||
msgstr "여러 항목을 선택하면 그 중 하나를 임의로 선택합니다."
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:90 resources/ui/gtk4/prefs.ui:134
|
||||
#: resources/ui/gtk3/prefs.ui:104 resources/ui/gtk3/prefs.ui:168
|
||||
msgid "Choose Effects"
|
||||
msgstr "효과 선택"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:110 resources/ui/gtk3/prefs.ui:138
|
||||
msgid "Close Window Animation"
|
||||
msgstr "창 닫기 애니메이션"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:150 resources/ui/gtk3/prefs.ui:198
|
||||
msgid "Also Add Effects to Dialogs"
|
||||
msgstr "대화상자에도 효과 추가"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
|
||||
msgid "Twirl Intensity"
|
||||
msgstr "회전 강도"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
|
||||
msgid "Shake Intensity"
|
||||
msgstr "떨림 강도"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
|
||||
msgid "Suction Intensity"
|
||||
msgstr "흡입 강도"
|
||||
|
||||
#: resources/ui/gtk3/Fire.ui:63
|
||||
msgid "Choose a Preset"
|
||||
msgstr "사전설정 선택"
|
||||
@@ -7,66 +7,72 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Burn-My-Windows\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-18 20:33+0100\n"
|
||||
"PO-Revision-Date: 2022-01-29 12:30+0000\n"
|
||||
"POT-Creation-Date: 2022-04-05 09:22+0200\n"
|
||||
"PO-Revision-Date: 2022-04-11 12:07+0000\n"
|
||||
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
|
||||
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/burn-my-"
|
||||
"windows/core/nb_NO/>\n"
|
||||
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/"
|
||||
"burn-my-windows/core/nb_NO/>\n"
|
||||
"Language: nb_NO\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.11-dev\n"
|
||||
"X-Generator: Weblate 4.12-dev\n"
|
||||
|
||||
#: prefs.js:111
|
||||
#: prefs.js:112
|
||||
msgid "Effect Options"
|
||||
msgstr ""
|
||||
msgstr "Effektalternativer"
|
||||
|
||||
#: prefs.js:139
|
||||
#: prefs.js:140
|
||||
msgid "Go Back"
|
||||
msgstr ""
|
||||
msgstr "Gå tilbake"
|
||||
|
||||
#: prefs.js:181
|
||||
#: prefs.js:182
|
||||
msgid "General Options"
|
||||
msgstr ""
|
||||
msgstr "Generelle innstillinger"
|
||||
|
||||
#: prefs.js:276
|
||||
msgid "Gold Sponsors"
|
||||
msgstr ""
|
||||
msgstr "Gullsponsorer"
|
||||
|
||||
#: prefs.js:279
|
||||
msgid "Silver Sponsors"
|
||||
msgstr ""
|
||||
msgstr "Sølvsponsorer"
|
||||
|
||||
#: prefs.js:282
|
||||
msgid "Bronze Sponsors"
|
||||
msgstr ""
|
||||
msgstr "Bronsesponsorer"
|
||||
|
||||
#: prefs.js:285
|
||||
msgid "Past Sponsors"
|
||||
msgstr ""
|
||||
msgstr "Tidligere sponsorer"
|
||||
|
||||
#. Translators: %s will be replaced by the effect's name.
|
||||
#: prefs.js:512
|
||||
#: prefs.js:510
|
||||
#, javascript-format
|
||||
msgid "Preview for %s"
|
||||
msgstr ""
|
||||
msgstr "Forhåndsvisning for %s"
|
||||
|
||||
#: prefs.js:534
|
||||
#: prefs.js:532
|
||||
#, fuzzy
|
||||
msgid "Close this Window to Preview the Effect!"
|
||||
msgstr ""
|
||||
msgstr "Lukk dette vinduet for å forhåndsvise effekten"
|
||||
|
||||
#: src/BrokenGlass.js:57
|
||||
#, fuzzy
|
||||
msgid "Broken Glass"
|
||||
msgstr ""
|
||||
msgstr "Knust glass"
|
||||
|
||||
#: src/TVEffect.js:56
|
||||
msgid "TV Effect"
|
||||
msgstr ""
|
||||
msgstr "TV-effekt"
|
||||
|
||||
#: src/TRexAttack.js:56
|
||||
msgid "T-Rex Attack"
|
||||
msgstr "T-rex-angrep"
|
||||
|
||||
#: src/SnapOfDisintegration.js:60
|
||||
msgid "Snap of Disintegration"
|
||||
msgstr ""
|
||||
|
||||
#: src/Wisps.js:55
|
||||
@@ -75,11 +81,11 @@ msgstr ""
|
||||
|
||||
#: src/Fire.js:58
|
||||
msgid "Fire"
|
||||
msgstr ""
|
||||
msgstr "Brann"
|
||||
|
||||
#: src/Fire.js:130
|
||||
msgid "Default Fire"
|
||||
msgstr ""
|
||||
msgstr "Forvalgt brann"
|
||||
|
||||
#: src/Fire.js:140
|
||||
msgid "Hell Fire"
|
||||
@@ -91,16 +97,24 @@ msgstr ""
|
||||
|
||||
#: src/Fire.js:160
|
||||
msgid "Cold Breeze"
|
||||
msgstr ""
|
||||
msgstr "Kald bris"
|
||||
|
||||
#: src/Fire.js:170
|
||||
msgid "Santa is Coming"
|
||||
msgstr ""
|
||||
msgstr "Julenissen kommer"
|
||||
|
||||
#: src/Hexagon.js:53
|
||||
msgid "Hexagon"
|
||||
msgstr "Heksagon"
|
||||
|
||||
#: src/EnergizeA.js:54
|
||||
msgid "Energize A"
|
||||
msgstr ""
|
||||
|
||||
#: src/Apparition.js:57
|
||||
msgid "Apparition"
|
||||
msgstr ""
|
||||
|
||||
#: src/EnergizeB.js:54
|
||||
msgid "Energize B"
|
||||
msgstr ""
|
||||
@@ -111,19 +125,19 @@ msgstr ""
|
||||
|
||||
#: resources/ui/common/main-menu.ui:6
|
||||
msgid "Visit Homepage"
|
||||
msgstr ""
|
||||
msgstr "Besøk hjemmesiden"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:10
|
||||
msgid "View Changelog"
|
||||
msgstr ""
|
||||
msgstr "Vis endringslogg"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:16
|
||||
msgid "Report a Bug"
|
||||
msgstr ""
|
||||
msgstr "Rapporter en feil"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:20
|
||||
msgid "Create an Effect"
|
||||
msgstr ""
|
||||
msgstr "Opprett en effekt"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:24
|
||||
msgid "Translate"
|
||||
@@ -133,17 +147,20 @@ msgstr "Oversett"
|
||||
msgid "Donate"
|
||||
msgstr "Doner"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:45
|
||||
#: resources/ui/common/main-menu.ui:41
|
||||
msgid "About Burn-My-Windows"
|
||||
msgstr ""
|
||||
msgstr "Om"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:24 resources/ui/gtk4/BrokenGlass.ui:24
|
||||
#: resources/ui/gtk4/Wisps.ui:24 resources/ui/gtk4/Fire.ui:49
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:24
|
||||
#: resources/ui/gtk4/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/EnergizeB.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/Hexagon.ui:24
|
||||
#: resources/ui/gtk4/EnergizeB.ui:24 resources/ui/gtk4/Apparition.ui:24
|
||||
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
|
||||
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
|
||||
#: resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Hexagon.ui:49 resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Apparition.ui:63
|
||||
msgid "Animation Time [ms]"
|
||||
msgstr "Animasjonstid [ms]"
|
||||
|
||||
@@ -161,31 +178,45 @@ msgstr "Animasjonstid [ms]"
|
||||
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
|
||||
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
|
||||
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/Hexagon.ui:52
|
||||
#: resources/ui/gtk4/Hexagon.ui:98 resources/ui/gtk4/Hexagon.ui:144
|
||||
#: resources/ui/gtk4/Hexagon.ui:178 resources/ui/gtk4/Hexagon.ui:212
|
||||
#: resources/ui/gtk4/Hexagon.ui:265 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk3/Wisps.ui:68
|
||||
#: resources/ui/gtk3/Wisps.ui:117 resources/ui/gtk3/Wisps.ui:160
|
||||
#: resources/ui/gtk3/Fire.ui:119 resources/ui/gtk3/Fire.ui:167
|
||||
#: resources/ui/gtk3/Fire.ui:215 resources/ui/gtk3/Fire.ui:277
|
||||
#: resources/ui/gtk3/Fire.ui:345 resources/ui/gtk3/TVEffect.ui:61
|
||||
#: resources/ui/gtk3/TVEffect.ui:104 resources/ui/gtk3/EnergizeA.ui:68
|
||||
#: resources/ui/gtk3/EnergizeA.ui:117 resources/ui/gtk3/EnergizeA.ui:160
|
||||
#: resources/ui/gtk3/EnergizeB.ui:68 resources/ui/gtk3/EnergizeB.ui:117
|
||||
#: resources/ui/gtk3/EnergizeB.ui:160 resources/ui/gtk3/prefs.ui:219
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk4/Apparition.ui:52
|
||||
#: resources/ui/gtk4/Apparition.ui:98 resources/ui/gtk4/Apparition.ui:144
|
||||
#: resources/ui/gtk4/Apparition.ui:190 resources/ui/gtk4/Apparition.ui:236
|
||||
#: resources/ui/gtk3/Wisps.ui:68 resources/ui/gtk3/Wisps.ui:117
|
||||
#: resources/ui/gtk3/Wisps.ui:160 resources/ui/gtk3/Fire.ui:119
|
||||
#: resources/ui/gtk3/Fire.ui:167 resources/ui/gtk3/Fire.ui:215
|
||||
#: resources/ui/gtk3/Fire.ui:277 resources/ui/gtk3/Fire.ui:345
|
||||
#: resources/ui/gtk3/TVEffect.ui:61 resources/ui/gtk3/TVEffect.ui:104
|
||||
#: resources/ui/gtk3/EnergizeA.ui:68 resources/ui/gtk3/EnergizeA.ui:117
|
||||
#: resources/ui/gtk3/EnergizeA.ui:160 resources/ui/gtk3/Hexagon.ui:75
|
||||
#: resources/ui/gtk3/Hexagon.ui:124 resources/ui/gtk3/Hexagon.ui:173
|
||||
#: resources/ui/gtk3/Hexagon.ui:216 resources/ui/gtk3/Hexagon.ui:259
|
||||
#: resources/ui/gtk3/Hexagon.ui:321 resources/ui/gtk3/EnergizeB.ui:68
|
||||
#: resources/ui/gtk3/EnergizeB.ui:117 resources/ui/gtk3/EnergizeB.ui:160
|
||||
#: resources/ui/gtk3/prefs.ui:219 resources/ui/gtk3/Apparition.ui:89
|
||||
#: resources/ui/gtk3/Apparition.ui:138 resources/ui/gtk3/Apparition.ui:187
|
||||
#: resources/ui/gtk3/Apparition.ui:236 resources/ui/gtk3/Apparition.ui:285
|
||||
msgid "Reset to Default Value"
|
||||
msgstr ""
|
||||
msgstr "Tilbakestill til forvalgt verdi"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
|
||||
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/EnergizeB.ui:70
|
||||
#: resources/ui/gtk3/Wisps.ui:91 resources/ui/gtk3/Fire.ui:141
|
||||
#: resources/ui/gtk3/EnergizeA.ui:91 resources/ui/gtk3/EnergizeB.ui:91
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/Hexagon.ui:70
|
||||
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Wisps.ui:91
|
||||
#: resources/ui/gtk3/Fire.ui:141 resources/ui/gtk3/EnergizeA.ui:91
|
||||
#: resources/ui/gtk3/Hexagon.ui:98 resources/ui/gtk3/EnergizeB.ui:91
|
||||
msgid "Scale"
|
||||
msgstr ""
|
||||
msgstr "Størrelse"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:116
|
||||
#: resources/ui/gtk4/Matrix.ui:116 resources/ui/gtk4/Apparition.ui:70
|
||||
#: resources/ui/gtk3/Apparition.ui:112
|
||||
msgid "Randomness"
|
||||
msgstr ""
|
||||
msgstr "Tilfeldighet"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:162
|
||||
msgid "Vertical Overshooting"
|
||||
@@ -201,44 +232,45 @@ msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:116
|
||||
msgid "Gravity"
|
||||
msgstr ""
|
||||
msgstr "Tyngdekraft"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:162
|
||||
msgid "Blow Force"
|
||||
msgstr ""
|
||||
msgstr "Slagkraft"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:212
|
||||
msgid "Shatter From Pointer Location"
|
||||
msgstr ""
|
||||
msgstr "Knus fra pekerposisjon"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:221
|
||||
msgid ""
|
||||
"The shards will fly away from where your mouse pointer was when closing the "
|
||||
"window."
|
||||
msgstr ""
|
||||
msgstr "Skårene flyr fra der musepekeren var da du lukket vinduet."
|
||||
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/TVEffect.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:116 resources/ui/gtk4/EnergizeB.ui:116
|
||||
#: resources/ui/gtk3/Wisps.ui:139 resources/ui/gtk3/TVEffect.ui:83
|
||||
#: resources/ui/gtk3/EnergizeA.ui:139 resources/ui/gtk3/EnergizeB.ui:139
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/SnapOfDisintegration.ui:116
|
||||
#: resources/ui/gtk4/TVEffect.ui:70 resources/ui/gtk4/EnergizeA.ui:116
|
||||
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Wisps.ui:139
|
||||
#: resources/ui/gtk3/TVEffect.ui:83 resources/ui/gtk3/EnergizeA.ui:139
|
||||
#: resources/ui/gtk3/EnergizeB.ui:139
|
||||
msgid "Color"
|
||||
msgstr ""
|
||||
msgstr "Farge"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:25 resources/ui/gtk3/Fire.ui:49
|
||||
msgid "Presets"
|
||||
msgstr ""
|
||||
msgstr "Forhåndsinnstillinger"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:141 resources/ui/gtk3/Fire.ui:189
|
||||
msgid "Speed"
|
||||
msgstr ""
|
||||
msgstr "Hastighet"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:191 resources/ui/gtk3/Fire.ui:241
|
||||
msgid "3D Noise"
|
||||
msgstr ""
|
||||
msgstr "3D-støy"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:200 resources/ui/gtk3/Fire.ui:250
|
||||
msgid "Creates a more dynamic fire but requires more GPU power."
|
||||
msgstr ""
|
||||
msgstr "Mer dynamisk ild, men krever mer GPU-kraft."
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:240 resources/ui/gtk3/Fire.ui:300
|
||||
msgid "Gradient"
|
||||
@@ -262,6 +294,26 @@ msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
|
||||
msgid "Preview this Effect"
|
||||
msgstr "Forhåndsvis denne effekten"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
|
||||
msgid "Mesh Line Width"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
|
||||
msgid "Line Color"
|
||||
msgstr "Linjefarge"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
|
||||
msgid "Glow Color"
|
||||
msgstr "Glødefarge"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
|
||||
msgid "Additive Blending"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:243 resources/ui/gtk3/Hexagon.ui:294
|
||||
msgid "You may want to enable this for dark window themes."
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
|
||||
@@ -270,7 +322,7 @@ msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:39 resources/ui/gtk3/prefs.ui:46
|
||||
msgid "If you like this extension, recommend it to your friends :)"
|
||||
msgstr ""
|
||||
msgstr "Hvis du liker denne utvidelsen kan du anbefale den til vennene dine :)"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:66 resources/ui/gtk3/prefs.ui:74
|
||||
msgid "Open Window Animation"
|
||||
@@ -279,12 +331,12 @@ msgstr ""
|
||||
#: resources/ui/gtk4/prefs.ui:75 resources/ui/gtk4/prefs.ui:119
|
||||
#: resources/ui/gtk3/prefs.ui:83 resources/ui/gtk3/prefs.ui:147
|
||||
msgid "If multiple are selected, one is chosen randomly."
|
||||
msgstr ""
|
||||
msgstr "Hvis flere blir valgt, velges én tilfeldig."
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:90 resources/ui/gtk4/prefs.ui:134
|
||||
#: resources/ui/gtk3/prefs.ui:104 resources/ui/gtk3/prefs.ui:168
|
||||
msgid "Choose Effects"
|
||||
msgstr ""
|
||||
msgstr "Velg effekter"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:110 resources/ui/gtk3/prefs.ui:138
|
||||
msgid "Close Window Animation"
|
||||
@@ -294,9 +346,21 @@ msgstr ""
|
||||
msgid "Also Add Effects to Dialogs"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
|
||||
msgid "Twirl Intensity"
|
||||
msgstr "Hvirvelintensitet"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
|
||||
msgid "Shake Intensity"
|
||||
msgstr "Ristingsintensitet"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
|
||||
msgid "Suction Intensity"
|
||||
msgstr "Sugeintensitet"
|
||||
|
||||
#: resources/ui/gtk3/Fire.ui:63
|
||||
msgid "Choose a Preset"
|
||||
msgstr ""
|
||||
msgstr "Velg en forhåndsinnstilling"
|
||||
|
||||
#~ msgid "Via PayPal"
|
||||
#~ msgstr "med PayPal"
|
||||
|
||||
@@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Burn-My-Windows\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-18 20:33+0100\n"
|
||||
"PO-Revision-Date: 2022-02-21 11:58+0000\n"
|
||||
"POT-Creation-Date: 2022-04-05 09:22+0200\n"
|
||||
"PO-Revision-Date: 2022-04-05 18:37+0000\n"
|
||||
"Last-Translator: Heimen Stoffels <vistausss@fastmail.com>\n"
|
||||
"Language-Team: Dutch <https://hosted.weblate.org/projects/burn-my-windows/"
|
||||
"core/nl/>\n"
|
||||
@@ -17,17 +17,17 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.11-dev\n"
|
||||
"X-Generator: Weblate 4.12-dev\n"
|
||||
|
||||
#: prefs.js:111
|
||||
#: prefs.js:112
|
||||
msgid "Effect Options"
|
||||
msgstr "Effectvoorkeuren"
|
||||
|
||||
#: prefs.js:139
|
||||
#: prefs.js:140
|
||||
msgid "Go Back"
|
||||
msgstr "Scherm sluiten"
|
||||
|
||||
#: prefs.js:181
|
||||
#: prefs.js:182
|
||||
msgid "General Options"
|
||||
msgstr "Algemene voorkeuren"
|
||||
|
||||
@@ -48,12 +48,12 @@ msgid "Past Sponsors"
|
||||
msgstr "Voormalige sponsoren"
|
||||
|
||||
#. Translators: %s will be replaced by the effect's name.
|
||||
#: prefs.js:512
|
||||
#: prefs.js:510
|
||||
#, javascript-format
|
||||
msgid "Preview for %s"
|
||||
msgstr "%s-voorvertoning"
|
||||
|
||||
#: prefs.js:534
|
||||
#: prefs.js:532
|
||||
msgid "Close this Window to Preview the Effect!"
|
||||
msgstr "Sluit dit venster om het effect voor te vertonen."
|
||||
|
||||
@@ -69,6 +69,10 @@ msgstr "Tv-effect"
|
||||
msgid "T-Rex Attack"
|
||||
msgstr "T-Rex-aanval"
|
||||
|
||||
#: src/SnapOfDisintegration.js:60
|
||||
msgid "Snap of Disintegration"
|
||||
msgstr "Uiteenvallen"
|
||||
|
||||
#: src/Wisps.js:55
|
||||
msgid "Wisps"
|
||||
msgstr "Dwaallicht"
|
||||
@@ -97,10 +101,18 @@ msgstr "Koude wind"
|
||||
msgid "Santa is Coming"
|
||||
msgstr "Kerstmanvuur"
|
||||
|
||||
#: src/Hexagon.js:53
|
||||
msgid "Hexagon"
|
||||
msgstr "Hexagon"
|
||||
|
||||
#: src/EnergizeA.js:54
|
||||
msgid "Energize A"
|
||||
msgstr "Stimulatie A"
|
||||
|
||||
#: src/Apparition.js:57
|
||||
msgid "Apparition"
|
||||
msgstr "Verschijning"
|
||||
|
||||
#: src/EnergizeB.js:54
|
||||
msgid "Energize B"
|
||||
msgstr "Stimulatie B"
|
||||
@@ -133,17 +145,20 @@ msgstr "Vertalen"
|
||||
msgid "Donate"
|
||||
msgstr "Doneren"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:45
|
||||
#: resources/ui/common/main-menu.ui:41
|
||||
msgid "About Burn-My-Windows"
|
||||
msgstr "Over Burn-My-Windows"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:24 resources/ui/gtk4/BrokenGlass.ui:24
|
||||
#: resources/ui/gtk4/Wisps.ui:24 resources/ui/gtk4/Fire.ui:49
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:24
|
||||
#: resources/ui/gtk4/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/EnergizeB.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/Hexagon.ui:24
|
||||
#: resources/ui/gtk4/EnergizeB.ui:24 resources/ui/gtk4/Apparition.ui:24
|
||||
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
|
||||
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
|
||||
#: resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Hexagon.ui:49 resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Apparition.ui:63
|
||||
msgid "Animation Time [ms]"
|
||||
msgstr "Animatieduur [in ms]"
|
||||
|
||||
@@ -161,29 +176,43 @@ msgstr "Animatieduur [in ms]"
|
||||
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
|
||||
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
|
||||
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/Hexagon.ui:52
|
||||
#: resources/ui/gtk4/Hexagon.ui:98 resources/ui/gtk4/Hexagon.ui:144
|
||||
#: resources/ui/gtk4/Hexagon.ui:178 resources/ui/gtk4/Hexagon.ui:212
|
||||
#: resources/ui/gtk4/Hexagon.ui:265 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk3/Wisps.ui:68
|
||||
#: resources/ui/gtk3/Wisps.ui:117 resources/ui/gtk3/Wisps.ui:160
|
||||
#: resources/ui/gtk3/Fire.ui:119 resources/ui/gtk3/Fire.ui:167
|
||||
#: resources/ui/gtk3/Fire.ui:215 resources/ui/gtk3/Fire.ui:277
|
||||
#: resources/ui/gtk3/Fire.ui:345 resources/ui/gtk3/TVEffect.ui:61
|
||||
#: resources/ui/gtk3/TVEffect.ui:104 resources/ui/gtk3/EnergizeA.ui:68
|
||||
#: resources/ui/gtk3/EnergizeA.ui:117 resources/ui/gtk3/EnergizeA.ui:160
|
||||
#: resources/ui/gtk3/EnergizeB.ui:68 resources/ui/gtk3/EnergizeB.ui:117
|
||||
#: resources/ui/gtk3/EnergizeB.ui:160 resources/ui/gtk3/prefs.ui:219
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk4/Apparition.ui:52
|
||||
#: resources/ui/gtk4/Apparition.ui:98 resources/ui/gtk4/Apparition.ui:144
|
||||
#: resources/ui/gtk4/Apparition.ui:190 resources/ui/gtk4/Apparition.ui:236
|
||||
#: resources/ui/gtk3/Wisps.ui:68 resources/ui/gtk3/Wisps.ui:117
|
||||
#: resources/ui/gtk3/Wisps.ui:160 resources/ui/gtk3/Fire.ui:119
|
||||
#: resources/ui/gtk3/Fire.ui:167 resources/ui/gtk3/Fire.ui:215
|
||||
#: resources/ui/gtk3/Fire.ui:277 resources/ui/gtk3/Fire.ui:345
|
||||
#: resources/ui/gtk3/TVEffect.ui:61 resources/ui/gtk3/TVEffect.ui:104
|
||||
#: resources/ui/gtk3/EnergizeA.ui:68 resources/ui/gtk3/EnergizeA.ui:117
|
||||
#: resources/ui/gtk3/EnergizeA.ui:160 resources/ui/gtk3/Hexagon.ui:75
|
||||
#: resources/ui/gtk3/Hexagon.ui:124 resources/ui/gtk3/Hexagon.ui:173
|
||||
#: resources/ui/gtk3/Hexagon.ui:216 resources/ui/gtk3/Hexagon.ui:259
|
||||
#: resources/ui/gtk3/Hexagon.ui:321 resources/ui/gtk3/EnergizeB.ui:68
|
||||
#: resources/ui/gtk3/EnergizeB.ui:117 resources/ui/gtk3/EnergizeB.ui:160
|
||||
#: resources/ui/gtk3/prefs.ui:219 resources/ui/gtk3/Apparition.ui:89
|
||||
#: resources/ui/gtk3/Apparition.ui:138 resources/ui/gtk3/Apparition.ui:187
|
||||
#: resources/ui/gtk3/Apparition.ui:236 resources/ui/gtk3/Apparition.ui:285
|
||||
msgid "Reset to Default Value"
|
||||
msgstr "Standaardwaarde herstellen"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
|
||||
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/EnergizeB.ui:70
|
||||
#: resources/ui/gtk3/Wisps.ui:91 resources/ui/gtk3/Fire.ui:141
|
||||
#: resources/ui/gtk3/EnergizeA.ui:91 resources/ui/gtk3/EnergizeB.ui:91
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/Hexagon.ui:70
|
||||
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Wisps.ui:91
|
||||
#: resources/ui/gtk3/Fire.ui:141 resources/ui/gtk3/EnergizeA.ui:91
|
||||
#: resources/ui/gtk3/Hexagon.ui:98 resources/ui/gtk3/EnergizeB.ui:91
|
||||
msgid "Scale"
|
||||
msgstr "Schaal"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:116
|
||||
#: resources/ui/gtk4/Matrix.ui:116 resources/ui/gtk4/Apparition.ui:70
|
||||
#: resources/ui/gtk3/Apparition.ui:112
|
||||
msgid "Randomness"
|
||||
msgstr "Willekeurigheid"
|
||||
|
||||
@@ -218,10 +247,11 @@ msgid ""
|
||||
msgstr ""
|
||||
"De stukken vliegen weg vanaf de cursorpositie na het sluiten van een venster."
|
||||
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/TVEffect.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:116 resources/ui/gtk4/EnergizeB.ui:116
|
||||
#: resources/ui/gtk3/Wisps.ui:139 resources/ui/gtk3/TVEffect.ui:83
|
||||
#: resources/ui/gtk3/EnergizeA.ui:139 resources/ui/gtk3/EnergizeB.ui:139
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/SnapOfDisintegration.ui:116
|
||||
#: resources/ui/gtk4/TVEffect.ui:70 resources/ui/gtk4/EnergizeA.ui:116
|
||||
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Wisps.ui:139
|
||||
#: resources/ui/gtk3/TVEffect.ui:83 resources/ui/gtk3/EnergizeA.ui:139
|
||||
#: resources/ui/gtk3/EnergizeB.ui:139
|
||||
msgid "Color"
|
||||
msgstr "Kleur"
|
||||
|
||||
@@ -265,6 +295,26 @@ msgstr "Flitskleur"
|
||||
msgid "Preview this Effect"
|
||||
msgstr "Voorvertonen"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
|
||||
msgid "Mesh Line Width"
|
||||
msgstr "Gaaslijnbreedte"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
|
||||
msgid "Line Color"
|
||||
msgstr "Lijnkleur"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
|
||||
msgid "Glow Color"
|
||||
msgstr "Gloeikleur"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
|
||||
msgid "Additive Blending"
|
||||
msgstr "Overvloeien"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:243 resources/ui/gtk3/Hexagon.ui:294
|
||||
msgid "You may want to enable this for dark window themes."
|
||||
msgstr "Dit is mogelijk nuttig bij het gebruik van donkere thema's."
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
|
||||
msgid "Welcome to Burn-My-Windows!"
|
||||
msgstr "Welkom bij ‘Burn-My-Windows’!"
|
||||
@@ -297,6 +347,18 @@ msgstr "Animatie bij sluiten van vensters"
|
||||
msgid "Also Add Effects to Dialogs"
|
||||
msgstr "Dialoogvensters ook voorzien van effecten"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
|
||||
msgid "Twirl Intensity"
|
||||
msgstr "Wervelintensiteit"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
|
||||
msgid "Shake Intensity"
|
||||
msgstr "Schudintensiteit"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
|
||||
msgid "Suction Intensity"
|
||||
msgstr "Zuigintensiteit"
|
||||
|
||||
#: resources/ui/gtk3/Fire.ui:63
|
||||
msgid "Choose a Preset"
|
||||
msgstr "Kies een voorinstelling"
|
||||
|
||||
@@ -0,0 +1,364 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR Simon Schneegans
|
||||
# This file is distributed under the same license as the Burn-My-Windows package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Burn-My-Windows\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-04-05 09:22+0200\n"
|
||||
"PO-Revision-Date: 2022-04-13 13:09+0000\n"
|
||||
"Last-Translator: Егор Ермаков <eg.ermakov2016@gmail.com>\n"
|
||||
"Language-Team: Russian <https://hosted.weblate.org/projects/burn-my-windows/"
|
||||
"core/ru/>\n"
|
||||
"Language: ru\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Generator: Weblate 4.12-dev\n"
|
||||
|
||||
#: prefs.js:112
|
||||
msgid "Effect Options"
|
||||
msgstr "Параметры эффекта"
|
||||
|
||||
#: prefs.js:140
|
||||
msgid "Go Back"
|
||||
msgstr "Назад"
|
||||
|
||||
#: prefs.js:182
|
||||
msgid "General Options"
|
||||
msgstr "Общие настройки"
|
||||
|
||||
#: prefs.js:276
|
||||
msgid "Gold Sponsors"
|
||||
msgstr "Золотые спонсоры"
|
||||
|
||||
#: prefs.js:279
|
||||
msgid "Silver Sponsors"
|
||||
msgstr "Серебряные спонсоры"
|
||||
|
||||
#: prefs.js:282
|
||||
msgid "Bronze Sponsors"
|
||||
msgstr "Бронзовые спонсоры"
|
||||
|
||||
#: prefs.js:285
|
||||
msgid "Past Sponsors"
|
||||
msgstr "Прошлые спонсоры"
|
||||
|
||||
#. Translators: %s will be replaced by the effect's name.
|
||||
#: prefs.js:510
|
||||
#, javascript-format
|
||||
msgid "Preview for %s"
|
||||
msgstr "Предпросмотр %s"
|
||||
|
||||
#: prefs.js:532
|
||||
msgid "Close this Window to Preview the Effect!"
|
||||
msgstr "Закройте это окно для предпросмотра эффекта!"
|
||||
|
||||
#: src/BrokenGlass.js:57
|
||||
msgid "Broken Glass"
|
||||
msgstr "Разбитое стекло"
|
||||
|
||||
#: src/TVEffect.js:56
|
||||
msgid "TV Effect"
|
||||
msgstr "Эффект ЭЛТ"
|
||||
|
||||
#: src/TRexAttack.js:56
|
||||
msgid "T-Rex Attack"
|
||||
msgstr "Атака тираннозавра"
|
||||
|
||||
#: src/SnapOfDisintegration.js:60
|
||||
msgid "Snap of Disintegration"
|
||||
msgstr ""
|
||||
|
||||
#: src/Wisps.js:55
|
||||
msgid "Wisps"
|
||||
msgstr "Огоньки"
|
||||
|
||||
#: src/Fire.js:58
|
||||
msgid "Fire"
|
||||
msgstr "Огонь"
|
||||
|
||||
#: src/Fire.js:130
|
||||
msgid "Default Fire"
|
||||
msgstr "Обычный огонь"
|
||||
|
||||
#: src/Fire.js:140
|
||||
msgid "Hell Fire"
|
||||
msgstr "Адское пламя"
|
||||
|
||||
#: src/Fire.js:150
|
||||
msgid "Dark and Smutty"
|
||||
msgstr "Тёмный и грязный"
|
||||
|
||||
#: src/Fire.js:160
|
||||
msgid "Cold Breeze"
|
||||
msgstr "Холодный бриз"
|
||||
|
||||
#: src/Fire.js:170
|
||||
msgid "Santa is Coming"
|
||||
msgstr "Дед Мороз идёт"
|
||||
|
||||
#: src/Hexagon.js:53
|
||||
msgid "Hexagon"
|
||||
msgstr "Гексагон"
|
||||
|
||||
#: src/EnergizeA.js:54
|
||||
msgid "Energize A"
|
||||
msgstr "Энергия A"
|
||||
|
||||
#: src/Apparition.js:57
|
||||
msgid "Apparition"
|
||||
msgstr ""
|
||||
|
||||
#: src/EnergizeB.js:54
|
||||
msgid "Energize B"
|
||||
msgstr "Энергия B"
|
||||
|
||||
#: src/Matrix.js:58
|
||||
msgid "Matrix"
|
||||
msgstr "Матрица"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:6
|
||||
msgid "Visit Homepage"
|
||||
msgstr "Посетить страницу проекта"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:10
|
||||
msgid "View Changelog"
|
||||
msgstr "Просмотреть список изменений"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:16
|
||||
msgid "Report a Bug"
|
||||
msgstr "Сообщить об ошибке"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:20
|
||||
msgid "Create an Effect"
|
||||
msgstr "Создать эффект"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:24
|
||||
msgid "Translate"
|
||||
msgstr "Перевести"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:28
|
||||
msgid "Donate"
|
||||
msgstr "Пожертвовать"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:41
|
||||
msgid "About Burn-My-Windows"
|
||||
msgstr "О Burn-My-Windows"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:24 resources/ui/gtk4/BrokenGlass.ui:24
|
||||
#: resources/ui/gtk4/Wisps.ui:24 resources/ui/gtk4/Fire.ui:49
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:24
|
||||
#: resources/ui/gtk4/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/Hexagon.ui:24
|
||||
#: resources/ui/gtk4/EnergizeB.ui:24 resources/ui/gtk4/Apparition.ui:24
|
||||
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
|
||||
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
|
||||
#: resources/ui/gtk3/Hexagon.ui:49 resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Apparition.ui:63
|
||||
msgid "Animation Time [ms]"
|
||||
msgstr "Время анимации (мс)"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:52 resources/ui/gtk4/Matrix.ui:98
|
||||
#: resources/ui/gtk4/Matrix.ui:144 resources/ui/gtk4/Matrix.ui:190
|
||||
#: resources/ui/gtk4/Matrix.ui:224 resources/ui/gtk4/Matrix.ui:258
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:52 resources/ui/gtk4/BrokenGlass.ui:98
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:144 resources/ui/gtk4/BrokenGlass.ui:190
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:244 resources/ui/gtk4/Wisps.ui:52
|
||||
#: resources/ui/gtk4/Wisps.ui:98 resources/ui/gtk4/Wisps.ui:132
|
||||
#: resources/ui/gtk4/Fire.ui:77 resources/ui/gtk4/Fire.ui:123
|
||||
#: resources/ui/gtk4/Fire.ui:169 resources/ui/gtk4/Fire.ui:222
|
||||
#: resources/ui/gtk4/Fire.ui:280 resources/ui/gtk4/TRexAttack.ui:52
|
||||
#: resources/ui/gtk4/TRexAttack.ui:98 resources/ui/gtk4/TRexAttack.ui:144
|
||||
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
|
||||
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
|
||||
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/Hexagon.ui:52
|
||||
#: resources/ui/gtk4/Hexagon.ui:98 resources/ui/gtk4/Hexagon.ui:144
|
||||
#: resources/ui/gtk4/Hexagon.ui:178 resources/ui/gtk4/Hexagon.ui:212
|
||||
#: resources/ui/gtk4/Hexagon.ui:265 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk4/Apparition.ui:52
|
||||
#: resources/ui/gtk4/Apparition.ui:98 resources/ui/gtk4/Apparition.ui:144
|
||||
#: resources/ui/gtk4/Apparition.ui:190 resources/ui/gtk4/Apparition.ui:236
|
||||
#: resources/ui/gtk3/Wisps.ui:68 resources/ui/gtk3/Wisps.ui:117
|
||||
#: resources/ui/gtk3/Wisps.ui:160 resources/ui/gtk3/Fire.ui:119
|
||||
#: resources/ui/gtk3/Fire.ui:167 resources/ui/gtk3/Fire.ui:215
|
||||
#: resources/ui/gtk3/Fire.ui:277 resources/ui/gtk3/Fire.ui:345
|
||||
#: resources/ui/gtk3/TVEffect.ui:61 resources/ui/gtk3/TVEffect.ui:104
|
||||
#: resources/ui/gtk3/EnergizeA.ui:68 resources/ui/gtk3/EnergizeA.ui:117
|
||||
#: resources/ui/gtk3/EnergizeA.ui:160 resources/ui/gtk3/Hexagon.ui:75
|
||||
#: resources/ui/gtk3/Hexagon.ui:124 resources/ui/gtk3/Hexagon.ui:173
|
||||
#: resources/ui/gtk3/Hexagon.ui:216 resources/ui/gtk3/Hexagon.ui:259
|
||||
#: resources/ui/gtk3/Hexagon.ui:321 resources/ui/gtk3/EnergizeB.ui:68
|
||||
#: resources/ui/gtk3/EnergizeB.ui:117 resources/ui/gtk3/EnergizeB.ui:160
|
||||
#: resources/ui/gtk3/prefs.ui:219 resources/ui/gtk3/Apparition.ui:89
|
||||
#: resources/ui/gtk3/Apparition.ui:138 resources/ui/gtk3/Apparition.ui:187
|
||||
#: resources/ui/gtk3/Apparition.ui:236 resources/ui/gtk3/Apparition.ui:285
|
||||
msgid "Reset to Default Value"
|
||||
msgstr "Сброс на значение по умолчанию"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
|
||||
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/Hexagon.ui:70
|
||||
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Wisps.ui:91
|
||||
#: resources/ui/gtk3/Fire.ui:141 resources/ui/gtk3/EnergizeA.ui:91
|
||||
#: resources/ui/gtk3/Hexagon.ui:98 resources/ui/gtk3/EnergizeB.ui:91
|
||||
msgid "Scale"
|
||||
msgstr "Масштаб"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:116 resources/ui/gtk4/Apparition.ui:70
|
||||
#: resources/ui/gtk3/Apparition.ui:112
|
||||
msgid "Randomness"
|
||||
msgstr "Случайность"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:162
|
||||
msgid "Vertical Overshooting"
|
||||
msgstr "Вертикальное превышение"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:208
|
||||
msgid "Trail Color"
|
||||
msgstr "Цвет следа"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:242
|
||||
msgid "Tip Color"
|
||||
msgstr "Цвет наконечника"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:116
|
||||
msgid "Gravity"
|
||||
msgstr "Гравитация"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:162
|
||||
msgid "Blow Force"
|
||||
msgstr "Сила удара"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:212
|
||||
msgid "Shatter From Pointer Location"
|
||||
msgstr "Разбить от положения курсора"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:221
|
||||
msgid ""
|
||||
"The shards will fly away from where your mouse pointer was when closing the "
|
||||
"window."
|
||||
msgstr ""
|
||||
"Осколки разлетятся в стороны от того места, где находился курсор мыши при "
|
||||
"закрытии окна."
|
||||
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/SnapOfDisintegration.ui:116
|
||||
#: resources/ui/gtk4/TVEffect.ui:70 resources/ui/gtk4/EnergizeA.ui:116
|
||||
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Wisps.ui:139
|
||||
#: resources/ui/gtk3/TVEffect.ui:83 resources/ui/gtk3/EnergizeA.ui:139
|
||||
#: resources/ui/gtk3/EnergizeB.ui:139
|
||||
msgid "Color"
|
||||
msgstr "Цвет"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:25 resources/ui/gtk3/Fire.ui:49
|
||||
msgid "Presets"
|
||||
msgstr "Пресеты"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:141 resources/ui/gtk3/Fire.ui:189
|
||||
msgid "Speed"
|
||||
msgstr "Скорость"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:191 resources/ui/gtk3/Fire.ui:241
|
||||
msgid "3D Noise"
|
||||
msgstr "3D Шум"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:200 resources/ui/gtk3/Fire.ui:250
|
||||
msgid "Creates a more dynamic fire but requires more GPU power."
|
||||
msgstr "Создает более динамичный огонь, но требует большей мощности GPU."
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:240 resources/ui/gtk3/Fire.ui:300
|
||||
msgid "Gradient"
|
||||
msgstr "Градиент"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:70
|
||||
msgid "Claw Scratch Scale"
|
||||
msgstr "Масштаб царапин"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:116
|
||||
msgid "Claw Scratch Count"
|
||||
msgstr "Количество царапин"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:162
|
||||
msgid "Warp Effect"
|
||||
msgstr "Эффект искривления"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:208
|
||||
msgid "Flash Color"
|
||||
msgstr "Цвет вспышки"
|
||||
|
||||
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
|
||||
msgid "Preview this Effect"
|
||||
msgstr "Предпросмотр этого эффекта"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
|
||||
msgid "Mesh Line Width"
|
||||
msgstr "Ширина линии сетки"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
|
||||
msgid "Line Color"
|
||||
msgstr "Цвет линии"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
|
||||
msgid "Glow Color"
|
||||
msgstr "Цвет свечения"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
|
||||
msgid "Additive Blending"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:243 resources/ui/gtk3/Hexagon.ui:294
|
||||
msgid "You may want to enable this for dark window themes."
|
||||
msgstr "Возможно, вы захотите включить это для тёмной темы."
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
|
||||
msgid "Welcome to Burn-My-Windows!"
|
||||
msgstr "Добро пожаловать в Burn-My-Windows!"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:39 resources/ui/gtk3/prefs.ui:46
|
||||
msgid "If you like this extension, recommend it to your friends :)"
|
||||
msgstr "Если вам нравится это расширение, порекомендуйте его своим друзьям :)"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:66 resources/ui/gtk3/prefs.ui:74
|
||||
msgid "Open Window Animation"
|
||||
msgstr "Анимация открытия окна"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:75 resources/ui/gtk4/prefs.ui:119
|
||||
#: resources/ui/gtk3/prefs.ui:83 resources/ui/gtk3/prefs.ui:147
|
||||
msgid "If multiple are selected, one is chosen randomly."
|
||||
msgstr "Если выбрано несколько, то один выбирается случайным образом."
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:90 resources/ui/gtk4/prefs.ui:134
|
||||
#: resources/ui/gtk3/prefs.ui:104 resources/ui/gtk3/prefs.ui:168
|
||||
msgid "Choose Effects"
|
||||
msgstr "Выберите эффекты"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:110 resources/ui/gtk3/prefs.ui:138
|
||||
msgid "Close Window Animation"
|
||||
msgstr "Анимация закрытия окна"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:150 resources/ui/gtk3/prefs.ui:198
|
||||
msgid "Also Add Effects to Dialogs"
|
||||
msgstr "Также добавить эффекты к диалогам"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
|
||||
msgid "Twirl Intensity"
|
||||
msgstr "Интенсивность вращения"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
|
||||
msgid "Shake Intensity"
|
||||
msgstr "Интенсивность встряски"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
|
||||
msgid "Suction Intensity"
|
||||
msgstr "Интенсивность всасывания"
|
||||
|
||||
#: resources/ui/gtk3/Fire.ui:63
|
||||
msgid "Choose a Preset"
|
||||
msgstr "Выберите пресет"
|
||||
@@ -0,0 +1,363 @@
|
||||
# SOME DESCRIPTIVE TITLE.
|
||||
# Copyright (C) YEAR Simon Schneegans
|
||||
# This file is distributed under the same license as the burn-my-windows package.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: burn-my-windows\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-04-05 09:22+0200\n"
|
||||
"PO-Revision-Date: 2022-05-11 12:17+0000\n"
|
||||
"Last-Translator: obslsessed <obslsessed@duck.com>\n"
|
||||
"Language-Team: Swedish <https://hosted.weblate.org/projects/burn-my-windows/"
|
||||
"core/sv/>\n"
|
||||
"Language: sv\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.12.1\n"
|
||||
|
||||
#: prefs.js:112
|
||||
msgid "Effect Options"
|
||||
msgstr "Effektalternativ"
|
||||
|
||||
#: prefs.js:140
|
||||
msgid "Go Back"
|
||||
msgstr "Gå tillbaka"
|
||||
|
||||
#: prefs.js:182
|
||||
msgid "General Options"
|
||||
msgstr "Generella alternativ"
|
||||
|
||||
#: prefs.js:276
|
||||
msgid "Gold Sponsors"
|
||||
msgstr "Guldsponsorer"
|
||||
|
||||
#: prefs.js:279
|
||||
msgid "Silver Sponsors"
|
||||
msgstr "Silversponsorer"
|
||||
|
||||
#: prefs.js:282
|
||||
msgid "Bronze Sponsors"
|
||||
msgstr "Bronssponsorer"
|
||||
|
||||
#: prefs.js:285
|
||||
msgid "Past Sponsors"
|
||||
msgstr "Sponsorer från förr"
|
||||
|
||||
#. Translators: %s will be replaced by the effect's name.
|
||||
#: prefs.js:510
|
||||
#, javascript-format
|
||||
msgid "Preview for %s"
|
||||
msgstr "Förhandsgranskning för %s"
|
||||
|
||||
#: prefs.js:532
|
||||
msgid "Close this Window to Preview the Effect!"
|
||||
msgstr "Stäng det här fönstret för att förhandsgranska effekten!"
|
||||
|
||||
#: src/BrokenGlass.js:57
|
||||
msgid "Broken Glass"
|
||||
msgstr "Trasigt glas"
|
||||
|
||||
#: src/TVEffect.js:56
|
||||
msgid "TV Effect"
|
||||
msgstr "TV-effekt"
|
||||
|
||||
#: src/TRexAttack.js:56
|
||||
msgid "T-Rex Attack"
|
||||
msgstr "T-Rexattack"
|
||||
|
||||
#: src/SnapOfDisintegration.js:60
|
||||
msgid "Snap of Disintegration"
|
||||
msgstr ""
|
||||
|
||||
#: src/Wisps.js:55
|
||||
msgid "Wisps"
|
||||
msgstr ""
|
||||
|
||||
#: src/Fire.js:58
|
||||
msgid "Fire"
|
||||
msgstr "Eld"
|
||||
|
||||
#: src/Fire.js:130
|
||||
msgid "Default Fire"
|
||||
msgstr "Standardeld"
|
||||
|
||||
#: src/Fire.js:140
|
||||
msgid "Hell Fire"
|
||||
msgstr "Helveteseld"
|
||||
|
||||
#: src/Fire.js:150
|
||||
msgid "Dark and Smutty"
|
||||
msgstr "Mörk och smutsig"
|
||||
|
||||
#: src/Fire.js:160
|
||||
msgid "Cold Breeze"
|
||||
msgstr "Kall bris"
|
||||
|
||||
#: src/Fire.js:170
|
||||
msgid "Santa is Coming"
|
||||
msgstr "Jultomten kommer"
|
||||
|
||||
#: src/Hexagon.js:53
|
||||
msgid "Hexagon"
|
||||
msgstr "Sexhörning"
|
||||
|
||||
#: src/EnergizeA.js:54
|
||||
msgid "Energize A"
|
||||
msgstr ""
|
||||
|
||||
#: src/Apparition.js:57
|
||||
msgid "Apparition"
|
||||
msgstr "Uppenbarelse"
|
||||
|
||||
#: src/EnergizeB.js:54
|
||||
msgid "Energize B"
|
||||
msgstr ""
|
||||
|
||||
#: src/Matrix.js:58
|
||||
msgid "Matrix"
|
||||
msgstr "Matris"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:6
|
||||
msgid "Visit Homepage"
|
||||
msgstr "Besök hemsida"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:10
|
||||
msgid "View Changelog"
|
||||
msgstr "Visa ändringslogg"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:16
|
||||
msgid "Report a Bug"
|
||||
msgstr "Rapportera en bugg"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:20
|
||||
msgid "Create an Effect"
|
||||
msgstr "Skapa en effekt"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:24
|
||||
msgid "Translate"
|
||||
msgstr "Översätt"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:28
|
||||
msgid "Donate"
|
||||
msgstr "Donera"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:41
|
||||
msgid "About Burn-My-Windows"
|
||||
msgstr "Om Bränn-mitt-Windows"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:24 resources/ui/gtk4/BrokenGlass.ui:24
|
||||
#: resources/ui/gtk4/Wisps.ui:24 resources/ui/gtk4/Fire.ui:49
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:24
|
||||
#: resources/ui/gtk4/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/Hexagon.ui:24
|
||||
#: resources/ui/gtk4/EnergizeB.ui:24 resources/ui/gtk4/Apparition.ui:24
|
||||
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
|
||||
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
|
||||
#: resources/ui/gtk3/Hexagon.ui:49 resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Apparition.ui:63
|
||||
msgid "Animation Time [ms]"
|
||||
msgstr "Animationens tid [ms]"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:52 resources/ui/gtk4/Matrix.ui:98
|
||||
#: resources/ui/gtk4/Matrix.ui:144 resources/ui/gtk4/Matrix.ui:190
|
||||
#: resources/ui/gtk4/Matrix.ui:224 resources/ui/gtk4/Matrix.ui:258
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:52 resources/ui/gtk4/BrokenGlass.ui:98
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:144 resources/ui/gtk4/BrokenGlass.ui:190
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:244 resources/ui/gtk4/Wisps.ui:52
|
||||
#: resources/ui/gtk4/Wisps.ui:98 resources/ui/gtk4/Wisps.ui:132
|
||||
#: resources/ui/gtk4/Fire.ui:77 resources/ui/gtk4/Fire.ui:123
|
||||
#: resources/ui/gtk4/Fire.ui:169 resources/ui/gtk4/Fire.ui:222
|
||||
#: resources/ui/gtk4/Fire.ui:280 resources/ui/gtk4/TRexAttack.ui:52
|
||||
#: resources/ui/gtk4/TRexAttack.ui:98 resources/ui/gtk4/TRexAttack.ui:144
|
||||
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
|
||||
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
|
||||
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/Hexagon.ui:52
|
||||
#: resources/ui/gtk4/Hexagon.ui:98 resources/ui/gtk4/Hexagon.ui:144
|
||||
#: resources/ui/gtk4/Hexagon.ui:178 resources/ui/gtk4/Hexagon.ui:212
|
||||
#: resources/ui/gtk4/Hexagon.ui:265 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk4/Apparition.ui:52
|
||||
#: resources/ui/gtk4/Apparition.ui:98 resources/ui/gtk4/Apparition.ui:144
|
||||
#: resources/ui/gtk4/Apparition.ui:190 resources/ui/gtk4/Apparition.ui:236
|
||||
#: resources/ui/gtk3/Wisps.ui:68 resources/ui/gtk3/Wisps.ui:117
|
||||
#: resources/ui/gtk3/Wisps.ui:160 resources/ui/gtk3/Fire.ui:119
|
||||
#: resources/ui/gtk3/Fire.ui:167 resources/ui/gtk3/Fire.ui:215
|
||||
#: resources/ui/gtk3/Fire.ui:277 resources/ui/gtk3/Fire.ui:345
|
||||
#: resources/ui/gtk3/TVEffect.ui:61 resources/ui/gtk3/TVEffect.ui:104
|
||||
#: resources/ui/gtk3/EnergizeA.ui:68 resources/ui/gtk3/EnergizeA.ui:117
|
||||
#: resources/ui/gtk3/EnergizeA.ui:160 resources/ui/gtk3/Hexagon.ui:75
|
||||
#: resources/ui/gtk3/Hexagon.ui:124 resources/ui/gtk3/Hexagon.ui:173
|
||||
#: resources/ui/gtk3/Hexagon.ui:216 resources/ui/gtk3/Hexagon.ui:259
|
||||
#: resources/ui/gtk3/Hexagon.ui:321 resources/ui/gtk3/EnergizeB.ui:68
|
||||
#: resources/ui/gtk3/EnergizeB.ui:117 resources/ui/gtk3/EnergizeB.ui:160
|
||||
#: resources/ui/gtk3/prefs.ui:219 resources/ui/gtk3/Apparition.ui:89
|
||||
#: resources/ui/gtk3/Apparition.ui:138 resources/ui/gtk3/Apparition.ui:187
|
||||
#: resources/ui/gtk3/Apparition.ui:236 resources/ui/gtk3/Apparition.ui:285
|
||||
msgid "Reset to Default Value"
|
||||
msgstr "Återställ till standardvärde"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
|
||||
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/Hexagon.ui:70
|
||||
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Wisps.ui:91
|
||||
#: resources/ui/gtk3/Fire.ui:141 resources/ui/gtk3/EnergizeA.ui:91
|
||||
#: resources/ui/gtk3/Hexagon.ui:98 resources/ui/gtk3/EnergizeB.ui:91
|
||||
msgid "Scale"
|
||||
msgstr "Skala"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:116 resources/ui/gtk4/Apparition.ui:70
|
||||
#: resources/ui/gtk3/Apparition.ui:112
|
||||
msgid "Randomness"
|
||||
msgstr "Slumpmässighet"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:162
|
||||
msgid "Vertical Overshooting"
|
||||
msgstr "Vertikal överskjutning"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:208
|
||||
msgid "Trail Color"
|
||||
msgstr "Spårets färg"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:242
|
||||
msgid "Tip Color"
|
||||
msgstr "Färg på dricksen"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:116
|
||||
msgid "Gravity"
|
||||
msgstr "Tyngdkraft"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:162
|
||||
msgid "Blow Force"
|
||||
msgstr "Blåskraft"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:212
|
||||
msgid "Shatter From Pointer Location"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:221
|
||||
msgid ""
|
||||
"The shards will fly away from where your mouse pointer was when closing the "
|
||||
"window."
|
||||
msgstr ""
|
||||
"Skärvorna kommer att flyga iväg från där din muspekare befann sig när rutan "
|
||||
"stängdes."
|
||||
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/SnapOfDisintegration.ui:116
|
||||
#: resources/ui/gtk4/TVEffect.ui:70 resources/ui/gtk4/EnergizeA.ui:116
|
||||
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Wisps.ui:139
|
||||
#: resources/ui/gtk3/TVEffect.ui:83 resources/ui/gtk3/EnergizeA.ui:139
|
||||
#: resources/ui/gtk3/EnergizeB.ui:139
|
||||
msgid "Color"
|
||||
msgstr "Färg"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:25 resources/ui/gtk3/Fire.ui:49
|
||||
msgid "Presets"
|
||||
msgstr "Förinställningar"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:141 resources/ui/gtk3/Fire.ui:189
|
||||
msgid "Speed"
|
||||
msgstr "Hastighet"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:191 resources/ui/gtk3/Fire.ui:241
|
||||
msgid "3D Noise"
|
||||
msgstr "3D-ljud"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:200 resources/ui/gtk3/Fire.ui:250
|
||||
msgid "Creates a more dynamic fire but requires more GPU power."
|
||||
msgstr "Skapar en mer dynamisk eld, men kräver mer GPU-kraft."
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:240 resources/ui/gtk3/Fire.ui:300
|
||||
msgid "Gradient"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:70
|
||||
msgid "Claw Scratch Scale"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:116
|
||||
msgid "Claw Scratch Count"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:162
|
||||
msgid "Warp Effect"
|
||||
msgstr "Warp-effekt"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:208
|
||||
msgid "Flash Color"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
|
||||
msgid "Preview this Effect"
|
||||
msgstr "Förhandsgranska den här effekten"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
|
||||
msgid "Mesh Line Width"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
|
||||
msgid "Line Color"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
|
||||
msgid "Glow Color"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
|
||||
msgid "Additive Blending"
|
||||
msgstr "Tillsatsblandning"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:243 resources/ui/gtk3/Hexagon.ui:294
|
||||
msgid "You may want to enable this for dark window themes."
|
||||
msgstr "Du kan behöva aktivera det här för mörka fönsterteman."
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
|
||||
msgid "Welcome to Burn-My-Windows!"
|
||||
msgstr "Välkommen till Bränn-mitt-Windows!"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:39 resources/ui/gtk3/prefs.ui:46
|
||||
msgid "If you like this extension, recommend it to your friends :)"
|
||||
msgstr "Rekommendera det här tillägget till dina vänner om du gillar det :)"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:66 resources/ui/gtk3/prefs.ui:74
|
||||
msgid "Open Window Animation"
|
||||
msgstr "Öppna fönsteranimation"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:75 resources/ui/gtk4/prefs.ui:119
|
||||
#: resources/ui/gtk3/prefs.ui:83 resources/ui/gtk3/prefs.ui:147
|
||||
msgid "If multiple are selected, one is chosen randomly."
|
||||
msgstr "Om flera val är gjorda så väljs ett slumpvist."
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:90 resources/ui/gtk4/prefs.ui:134
|
||||
#: resources/ui/gtk3/prefs.ui:104 resources/ui/gtk3/prefs.ui:168
|
||||
msgid "Choose Effects"
|
||||
msgstr "Välj effekter"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:110 resources/ui/gtk3/prefs.ui:138
|
||||
msgid "Close Window Animation"
|
||||
msgstr "Stäng fönsteranimation"
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:150 resources/ui/gtk3/prefs.ui:198
|
||||
msgid "Also Add Effects to Dialogs"
|
||||
msgstr "Lägg också till effekter till dialogrutor"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
|
||||
msgid "Twirl Intensity"
|
||||
msgstr "Virvelns intensitet"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
|
||||
msgid "Shake Intensity"
|
||||
msgstr "Skakningens intensitet"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
|
||||
msgid "Suction Intensity"
|
||||
msgstr "Sugningens intensitet"
|
||||
|
||||
#: resources/ui/gtk3/Fire.ui:63
|
||||
msgid "Choose a Preset"
|
||||
msgstr "Välj en förinställning"
|
||||
@@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Burn-My-Windows\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-18 20:33+0100\n"
|
||||
"PO-Revision-Date: 2022-03-21 05:57+0000\n"
|
||||
"POT-Creation-Date: 2022-04-05 09:22+0200\n"
|
||||
"PO-Revision-Date: 2022-05-11 12:17+0000\n"
|
||||
"Last-Translator: Muha Aliss <muhaaliss@pm.me>\n"
|
||||
"Language-Team: Turkish <https://hosted.weblate.org/projects/burn-my-windows/"
|
||||
"core/tr/>\n"
|
||||
@@ -17,17 +17,17 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=n != 1;\n"
|
||||
"X-Generator: Weblate 4.12-dev\n"
|
||||
"X-Generator: Weblate 4.12.1\n"
|
||||
|
||||
#: prefs.js:111
|
||||
#: prefs.js:112
|
||||
msgid "Effect Options"
|
||||
msgstr "Efekt Seçenekleri"
|
||||
|
||||
#: prefs.js:139
|
||||
#: prefs.js:140
|
||||
msgid "Go Back"
|
||||
msgstr "Geri Dön"
|
||||
|
||||
#: prefs.js:181
|
||||
#: prefs.js:182
|
||||
msgid "General Options"
|
||||
msgstr "Genel Ayarlar"
|
||||
|
||||
@@ -48,12 +48,12 @@ msgid "Past Sponsors"
|
||||
msgstr "Eski Sponsorlar"
|
||||
|
||||
#. Translators: %s will be replaced by the effect's name.
|
||||
#: prefs.js:512
|
||||
#: prefs.js:510
|
||||
#, javascript-format
|
||||
msgid "Preview for %s"
|
||||
msgstr "%s ön izleme"
|
||||
|
||||
#: prefs.js:534
|
||||
#: prefs.js:532
|
||||
msgid "Close this Window to Preview the Effect!"
|
||||
msgstr "Efekti Ön izlemek İçin Bu Pencereyi Kapatın!"
|
||||
|
||||
@@ -69,6 +69,10 @@ msgstr "TV Efekti"
|
||||
msgid "T-Rex Attack"
|
||||
msgstr "T-Rex Saldırısı"
|
||||
|
||||
#: src/SnapOfDisintegration.js:60
|
||||
msgid "Snap of Disintegration"
|
||||
msgstr ""
|
||||
|
||||
#: src/Wisps.js:55
|
||||
msgid "Wisps"
|
||||
msgstr ""
|
||||
@@ -97,10 +101,18 @@ msgstr "Soğuk Esinti"
|
||||
msgid "Santa is Coming"
|
||||
msgstr "Noel Baba Geliyor"
|
||||
|
||||
#: src/Hexagon.js:53
|
||||
msgid "Hexagon"
|
||||
msgstr "Altıgen"
|
||||
|
||||
#: src/EnergizeA.js:54
|
||||
msgid "Energize A"
|
||||
msgstr "Enerji A"
|
||||
|
||||
#: src/Apparition.js:57
|
||||
msgid "Apparition"
|
||||
msgstr ""
|
||||
|
||||
#: src/EnergizeB.js:54
|
||||
msgid "Energize B"
|
||||
msgstr "Enerji B"
|
||||
@@ -133,17 +145,20 @@ msgstr "Çevir"
|
||||
msgid "Donate"
|
||||
msgstr "Bağış"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:45
|
||||
#: resources/ui/common/main-menu.ui:41
|
||||
msgid "About Burn-My-Windows"
|
||||
msgstr "Burn-My-Windows Hakkında"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:24 resources/ui/gtk4/BrokenGlass.ui:24
|
||||
#: resources/ui/gtk4/Wisps.ui:24 resources/ui/gtk4/Fire.ui:49
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:24
|
||||
#: resources/ui/gtk4/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/EnergizeB.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/Hexagon.ui:24
|
||||
#: resources/ui/gtk4/EnergizeB.ui:24 resources/ui/gtk4/Apparition.ui:24
|
||||
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
|
||||
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
|
||||
#: resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Hexagon.ui:49 resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Apparition.ui:63
|
||||
msgid "Animation Time [ms]"
|
||||
msgstr "Animasyon Süresi [ms]"
|
||||
|
||||
@@ -161,29 +176,43 @@ msgstr "Animasyon Süresi [ms]"
|
||||
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
|
||||
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
|
||||
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/Hexagon.ui:52
|
||||
#: resources/ui/gtk4/Hexagon.ui:98 resources/ui/gtk4/Hexagon.ui:144
|
||||
#: resources/ui/gtk4/Hexagon.ui:178 resources/ui/gtk4/Hexagon.ui:212
|
||||
#: resources/ui/gtk4/Hexagon.ui:265 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk3/Wisps.ui:68
|
||||
#: resources/ui/gtk3/Wisps.ui:117 resources/ui/gtk3/Wisps.ui:160
|
||||
#: resources/ui/gtk3/Fire.ui:119 resources/ui/gtk3/Fire.ui:167
|
||||
#: resources/ui/gtk3/Fire.ui:215 resources/ui/gtk3/Fire.ui:277
|
||||
#: resources/ui/gtk3/Fire.ui:345 resources/ui/gtk3/TVEffect.ui:61
|
||||
#: resources/ui/gtk3/TVEffect.ui:104 resources/ui/gtk3/EnergizeA.ui:68
|
||||
#: resources/ui/gtk3/EnergizeA.ui:117 resources/ui/gtk3/EnergizeA.ui:160
|
||||
#: resources/ui/gtk3/EnergizeB.ui:68 resources/ui/gtk3/EnergizeB.ui:117
|
||||
#: resources/ui/gtk3/EnergizeB.ui:160 resources/ui/gtk3/prefs.ui:219
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk4/Apparition.ui:52
|
||||
#: resources/ui/gtk4/Apparition.ui:98 resources/ui/gtk4/Apparition.ui:144
|
||||
#: resources/ui/gtk4/Apparition.ui:190 resources/ui/gtk4/Apparition.ui:236
|
||||
#: resources/ui/gtk3/Wisps.ui:68 resources/ui/gtk3/Wisps.ui:117
|
||||
#: resources/ui/gtk3/Wisps.ui:160 resources/ui/gtk3/Fire.ui:119
|
||||
#: resources/ui/gtk3/Fire.ui:167 resources/ui/gtk3/Fire.ui:215
|
||||
#: resources/ui/gtk3/Fire.ui:277 resources/ui/gtk3/Fire.ui:345
|
||||
#: resources/ui/gtk3/TVEffect.ui:61 resources/ui/gtk3/TVEffect.ui:104
|
||||
#: resources/ui/gtk3/EnergizeA.ui:68 resources/ui/gtk3/EnergizeA.ui:117
|
||||
#: resources/ui/gtk3/EnergizeA.ui:160 resources/ui/gtk3/Hexagon.ui:75
|
||||
#: resources/ui/gtk3/Hexagon.ui:124 resources/ui/gtk3/Hexagon.ui:173
|
||||
#: resources/ui/gtk3/Hexagon.ui:216 resources/ui/gtk3/Hexagon.ui:259
|
||||
#: resources/ui/gtk3/Hexagon.ui:321 resources/ui/gtk3/EnergizeB.ui:68
|
||||
#: resources/ui/gtk3/EnergizeB.ui:117 resources/ui/gtk3/EnergizeB.ui:160
|
||||
#: resources/ui/gtk3/prefs.ui:219 resources/ui/gtk3/Apparition.ui:89
|
||||
#: resources/ui/gtk3/Apparition.ui:138 resources/ui/gtk3/Apparition.ui:187
|
||||
#: resources/ui/gtk3/Apparition.ui:236 resources/ui/gtk3/Apparition.ui:285
|
||||
msgid "Reset to Default Value"
|
||||
msgstr "Varsayılan Değere Sıfırla"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
|
||||
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/EnergizeB.ui:70
|
||||
#: resources/ui/gtk3/Wisps.ui:91 resources/ui/gtk3/Fire.ui:141
|
||||
#: resources/ui/gtk3/EnergizeA.ui:91 resources/ui/gtk3/EnergizeB.ui:91
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/Hexagon.ui:70
|
||||
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Wisps.ui:91
|
||||
#: resources/ui/gtk3/Fire.ui:141 resources/ui/gtk3/EnergizeA.ui:91
|
||||
#: resources/ui/gtk3/Hexagon.ui:98 resources/ui/gtk3/EnergizeB.ui:91
|
||||
msgid "Scale"
|
||||
msgstr "Ölçek"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:116
|
||||
#: resources/ui/gtk4/Matrix.ui:116 resources/ui/gtk4/Apparition.ui:70
|
||||
#: resources/ui/gtk3/Apparition.ui:112
|
||||
msgid "Randomness"
|
||||
msgstr "Rastgelelik"
|
||||
|
||||
@@ -219,10 +248,11 @@ msgstr ""
|
||||
"Parçalar, pencereyi kapatırken fare işaretçinizin bulunduğu yerden uzağa "
|
||||
"uçacaktır."
|
||||
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/TVEffect.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:116 resources/ui/gtk4/EnergizeB.ui:116
|
||||
#: resources/ui/gtk3/Wisps.ui:139 resources/ui/gtk3/TVEffect.ui:83
|
||||
#: resources/ui/gtk3/EnergizeA.ui:139 resources/ui/gtk3/EnergizeB.ui:139
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/SnapOfDisintegration.ui:116
|
||||
#: resources/ui/gtk4/TVEffect.ui:70 resources/ui/gtk4/EnergizeA.ui:116
|
||||
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Wisps.ui:139
|
||||
#: resources/ui/gtk3/TVEffect.ui:83 resources/ui/gtk3/EnergizeA.ui:139
|
||||
#: resources/ui/gtk3/EnergizeB.ui:139
|
||||
msgid "Color"
|
||||
msgstr "Renk"
|
||||
|
||||
@@ -256,7 +286,7 @@ msgstr "Pençe Çizik Sayısı"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:162
|
||||
msgid "Warp Effect"
|
||||
msgstr ""
|
||||
msgstr "Çözgü Etkisi"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:208
|
||||
msgid "Flash Color"
|
||||
@@ -266,6 +296,26 @@ msgstr "Flaş Rengi"
|
||||
msgid "Preview this Effect"
|
||||
msgstr "Bu Efekti Önizle"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
|
||||
msgid "Mesh Line Width"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
|
||||
msgid "Line Color"
|
||||
msgstr "Çizgi rengi"
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
|
||||
msgid "Glow Color"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
|
||||
msgid "Additive Blending"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:243 resources/ui/gtk3/Hexagon.ui:294
|
||||
msgid "You may want to enable this for dark window themes."
|
||||
msgstr "Bunu koyu temalı pencereler için etkinleştirmek isteyebilirsiniz."
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
|
||||
msgid "Welcome to Burn-My-Windows!"
|
||||
msgstr "Burn-My-Windows'a Hoş Geldiniz!"
|
||||
@@ -296,6 +346,18 @@ msgstr "Pencere Animasyonunu Kapat"
|
||||
msgid "Also Add Effects to Dialogs"
|
||||
msgstr "Ayrıca Diyaloglara Efektler Ekle"
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
|
||||
msgid "Twirl Intensity"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
|
||||
msgid "Shake Intensity"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
|
||||
msgid "Suction Intensity"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk3/Fire.ui:63
|
||||
msgid "Choose a Preset"
|
||||
msgstr "Bir Şablon Seçin"
|
||||
|
||||
@@ -7,9 +7,9 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Burn-My-Windows\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2022-02-18 20:33+0100\n"
|
||||
"PO-Revision-Date: 2022-03-01 15:05+0000\n"
|
||||
"Last-Translator: 刘韬 <lyuutau@outlook.com>\n"
|
||||
"POT-Creation-Date: 2022-04-05 09:22+0200\n"
|
||||
"PO-Revision-Date: 2022-04-08 07:11+0000\n"
|
||||
"Last-Translator: merelymyself <poonsters6@gmail.com>\n"
|
||||
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
|
||||
"burn-my-windows/core/zh_Hans/>\n"
|
||||
"Language: zh_Hans\n"
|
||||
@@ -17,82 +17,75 @@ msgstr ""
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: Weblate 4.11.1-dev\n"
|
||||
"X-Generator: Weblate 4.12-dev\n"
|
||||
|
||||
#: prefs.js:111
|
||||
#, fuzzy
|
||||
#: prefs.js:112
|
||||
msgid "Effect Options"
|
||||
msgstr "效果选项"
|
||||
msgstr "特殊效果选项"
|
||||
|
||||
#: prefs.js:139
|
||||
#: prefs.js:140
|
||||
msgid "Go Back"
|
||||
msgstr ""
|
||||
msgstr "返回"
|
||||
|
||||
#: prefs.js:181
|
||||
#, fuzzy
|
||||
#: prefs.js:182
|
||||
msgid "General Options"
|
||||
msgstr "一般选项"
|
||||
msgstr "常规选项"
|
||||
|
||||
#: prefs.js:276
|
||||
#, fuzzy
|
||||
msgid "Gold Sponsors"
|
||||
msgstr "金牌赞助商"
|
||||
|
||||
#: prefs.js:279
|
||||
#, fuzzy
|
||||
msgid "Silver Sponsors"
|
||||
msgstr "银牌赞助商"
|
||||
|
||||
#: prefs.js:282
|
||||
#, fuzzy
|
||||
msgid "Bronze Sponsors"
|
||||
msgstr "铜牌赞助商"
|
||||
|
||||
#: prefs.js:285
|
||||
#, fuzzy
|
||||
msgid "Past Sponsors"
|
||||
msgstr "往届赞助商"
|
||||
|
||||
#. Translators: %s will be replaced by the effect's name.
|
||||
#: prefs.js:512
|
||||
#, fuzzy, javascript-format
|
||||
#: prefs.js:510
|
||||
#, javascript-format
|
||||
msgid "Preview for %s"
|
||||
msgstr "%s 的预览"
|
||||
|
||||
#: prefs.js:534
|
||||
#, fuzzy
|
||||
#: prefs.js:532
|
||||
msgid "Close this Window to Preview the Effect!"
|
||||
msgstr "关闭此窗口,预览效果!"
|
||||
|
||||
#: src/BrokenGlass.js:57
|
||||
#, fuzzy
|
||||
msgid "Broken Glass"
|
||||
msgstr "破碎的玻璃"
|
||||
|
||||
#: src/TVEffect.js:56
|
||||
#, fuzzy
|
||||
msgid "TV Effect"
|
||||
msgstr "电视效果"
|
||||
|
||||
#: src/TRexAttack.js:56
|
||||
#, fuzzy
|
||||
msgid "T-Rex Attack"
|
||||
msgstr "霸王龙攻击"
|
||||
|
||||
#: src/SnapOfDisintegration.js:60
|
||||
msgid "Snap of Disintegration"
|
||||
msgstr "瓦解效果"
|
||||
|
||||
#: src/Wisps.js:55
|
||||
msgid "Wisps"
|
||||
msgstr ""
|
||||
|
||||
#: src/Fire.js:58
|
||||
msgid "Fire"
|
||||
msgstr ""
|
||||
msgstr "火烧效果"
|
||||
|
||||
#: src/Fire.js:130
|
||||
msgid "Default Fire"
|
||||
msgstr ""
|
||||
msgstr "普通火烧效果"
|
||||
|
||||
#: src/Fire.js:140
|
||||
#, fuzzy
|
||||
msgid "Hell Fire"
|
||||
msgstr "地狱之火"
|
||||
|
||||
@@ -102,22 +95,28 @@ msgid "Dark and Smutty"
|
||||
msgstr "黑暗和污秽"
|
||||
|
||||
#: src/Fire.js:160
|
||||
#, fuzzy
|
||||
msgid "Cold Breeze"
|
||||
msgstr "寒风"
|
||||
|
||||
#: src/Fire.js:170
|
||||
#, fuzzy
|
||||
msgid "Santa is Coming"
|
||||
msgstr "圣诞老人来了"
|
||||
|
||||
#: src/Hexagon.js:53
|
||||
msgid "Hexagon"
|
||||
msgstr "六边形"
|
||||
|
||||
#: src/EnergizeA.js:54
|
||||
msgid "Energize A"
|
||||
msgstr "瞬移效果A"
|
||||
|
||||
#: src/Apparition.js:57
|
||||
msgid "Apparition"
|
||||
msgstr ""
|
||||
|
||||
#: src/EnergizeB.js:54
|
||||
msgid "Energize B"
|
||||
msgstr ""
|
||||
msgstr "瞬移效果B"
|
||||
|
||||
#: src/Matrix.js:58
|
||||
msgid "Matrix"
|
||||
@@ -136,7 +135,6 @@ msgid "Report a Bug"
|
||||
msgstr "报告错误"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:20
|
||||
#, fuzzy
|
||||
msgid "Create an Effect"
|
||||
msgstr "创建效果"
|
||||
|
||||
@@ -148,18 +146,20 @@ msgstr "翻译"
|
||||
msgid "Donate"
|
||||
msgstr "捐赠"
|
||||
|
||||
#: resources/ui/common/main-menu.ui:45
|
||||
#: resources/ui/common/main-menu.ui:41
|
||||
msgid "About Burn-My-Windows"
|
||||
msgstr "关于 Burn-My-Windows"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:24 resources/ui/gtk4/BrokenGlass.ui:24
|
||||
#: resources/ui/gtk4/Wisps.ui:24 resources/ui/gtk4/Fire.ui:49
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:24
|
||||
#: resources/ui/gtk4/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/EnergizeB.ui:24
|
||||
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/Hexagon.ui:24
|
||||
#: resources/ui/gtk4/EnergizeB.ui:24 resources/ui/gtk4/Apparition.ui:24
|
||||
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
|
||||
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
|
||||
#: resources/ui/gtk3/EnergizeB.ui:42
|
||||
#, fuzzy
|
||||
#: resources/ui/gtk3/Hexagon.ui:49 resources/ui/gtk3/EnergizeB.ui:42
|
||||
#: resources/ui/gtk3/Apparition.ui:63
|
||||
msgid "Animation Time [ms]"
|
||||
msgstr "动画时间 [毫秒]"
|
||||
|
||||
@@ -177,46 +177,56 @@ msgstr "动画时间 [毫秒]"
|
||||
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
|
||||
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
|
||||
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/Hexagon.ui:52
|
||||
#: resources/ui/gtk4/Hexagon.ui:98 resources/ui/gtk4/Hexagon.ui:144
|
||||
#: resources/ui/gtk4/Hexagon.ui:178 resources/ui/gtk4/Hexagon.ui:212
|
||||
#: resources/ui/gtk4/Hexagon.ui:265 resources/ui/gtk4/EnergizeB.ui:52
|
||||
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk3/Wisps.ui:68
|
||||
#: resources/ui/gtk3/Wisps.ui:117 resources/ui/gtk3/Wisps.ui:160
|
||||
#: resources/ui/gtk3/Fire.ui:119 resources/ui/gtk3/Fire.ui:167
|
||||
#: resources/ui/gtk3/Fire.ui:215 resources/ui/gtk3/Fire.ui:277
|
||||
#: resources/ui/gtk3/Fire.ui:345 resources/ui/gtk3/TVEffect.ui:61
|
||||
#: resources/ui/gtk3/TVEffect.ui:104 resources/ui/gtk3/EnergizeA.ui:68
|
||||
#: resources/ui/gtk3/EnergizeA.ui:117 resources/ui/gtk3/EnergizeA.ui:160
|
||||
#: resources/ui/gtk3/EnergizeB.ui:68 resources/ui/gtk3/EnergizeB.ui:117
|
||||
#: resources/ui/gtk3/EnergizeB.ui:160 resources/ui/gtk3/prefs.ui:219
|
||||
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk4/Apparition.ui:52
|
||||
#: resources/ui/gtk4/Apparition.ui:98 resources/ui/gtk4/Apparition.ui:144
|
||||
#: resources/ui/gtk4/Apparition.ui:190 resources/ui/gtk4/Apparition.ui:236
|
||||
#: resources/ui/gtk3/Wisps.ui:68 resources/ui/gtk3/Wisps.ui:117
|
||||
#: resources/ui/gtk3/Wisps.ui:160 resources/ui/gtk3/Fire.ui:119
|
||||
#: resources/ui/gtk3/Fire.ui:167 resources/ui/gtk3/Fire.ui:215
|
||||
#: resources/ui/gtk3/Fire.ui:277 resources/ui/gtk3/Fire.ui:345
|
||||
#: resources/ui/gtk3/TVEffect.ui:61 resources/ui/gtk3/TVEffect.ui:104
|
||||
#: resources/ui/gtk3/EnergizeA.ui:68 resources/ui/gtk3/EnergizeA.ui:117
|
||||
#: resources/ui/gtk3/EnergizeA.ui:160 resources/ui/gtk3/Hexagon.ui:75
|
||||
#: resources/ui/gtk3/Hexagon.ui:124 resources/ui/gtk3/Hexagon.ui:173
|
||||
#: resources/ui/gtk3/Hexagon.ui:216 resources/ui/gtk3/Hexagon.ui:259
|
||||
#: resources/ui/gtk3/Hexagon.ui:321 resources/ui/gtk3/EnergizeB.ui:68
|
||||
#: resources/ui/gtk3/EnergizeB.ui:117 resources/ui/gtk3/EnergizeB.ui:160
|
||||
#: resources/ui/gtk3/prefs.ui:219 resources/ui/gtk3/Apparition.ui:89
|
||||
#: resources/ui/gtk3/Apparition.ui:138 resources/ui/gtk3/Apparition.ui:187
|
||||
#: resources/ui/gtk3/Apparition.ui:236 resources/ui/gtk3/Apparition.ui:285
|
||||
msgid "Reset to Default Value"
|
||||
msgstr "重置为默认值"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
|
||||
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/EnergizeB.ui:70
|
||||
#: resources/ui/gtk3/Wisps.ui:91 resources/ui/gtk3/Fire.ui:141
|
||||
#: resources/ui/gtk3/EnergizeA.ui:91 resources/ui/gtk3/EnergizeB.ui:91
|
||||
#: resources/ui/gtk4/SnapOfDisintegration.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/Hexagon.ui:70
|
||||
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Wisps.ui:91
|
||||
#: resources/ui/gtk3/Fire.ui:141 resources/ui/gtk3/EnergizeA.ui:91
|
||||
#: resources/ui/gtk3/Hexagon.ui:98 resources/ui/gtk3/EnergizeB.ui:91
|
||||
#, fuzzy
|
||||
msgid "Scale"
|
||||
msgstr "规模"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:116
|
||||
#, fuzzy
|
||||
#: resources/ui/gtk4/Matrix.ui:116 resources/ui/gtk4/Apparition.ui:70
|
||||
#: resources/ui/gtk3/Apparition.ui:112
|
||||
msgid "Randomness"
|
||||
msgstr "随机性"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:162
|
||||
#, fuzzy
|
||||
msgid "Vertical Overshooting"
|
||||
msgstr "垂直过冲"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:208
|
||||
#, fuzzy
|
||||
msgid "Trail Color"
|
||||
msgstr "尾迹颜色"
|
||||
|
||||
#: resources/ui/gtk4/Matrix.ui:242
|
||||
#, fuzzy
|
||||
msgid "Tip Color"
|
||||
msgstr "提示颜色"
|
||||
|
||||
@@ -225,24 +235,25 @@ msgid "Gravity"
|
||||
msgstr "重力"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:162
|
||||
#, fuzzy
|
||||
msgid "Blow Force"
|
||||
msgstr "吹力"
|
||||
msgstr "砸破力"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:212
|
||||
msgid "Shatter From Pointer Location"
|
||||
msgstr ""
|
||||
msgstr "从光标位置破碎"
|
||||
|
||||
#: resources/ui/gtk4/BrokenGlass.ui:221
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"The shards will fly away from where your mouse pointer was when closing the "
|
||||
"window."
|
||||
msgstr ""
|
||||
msgstr "窗口的破碎会从光标位置而开始。"
|
||||
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/TVEffect.ui:70
|
||||
#: resources/ui/gtk4/EnergizeA.ui:116 resources/ui/gtk4/EnergizeB.ui:116
|
||||
#: resources/ui/gtk3/Wisps.ui:139 resources/ui/gtk3/TVEffect.ui:83
|
||||
#: resources/ui/gtk3/EnergizeA.ui:139 resources/ui/gtk3/EnergizeB.ui:139
|
||||
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/SnapOfDisintegration.ui:116
|
||||
#: resources/ui/gtk4/TVEffect.ui:70 resources/ui/gtk4/EnergizeA.ui:116
|
||||
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Wisps.ui:139
|
||||
#: resources/ui/gtk3/TVEffect.ui:83 resources/ui/gtk3/EnergizeA.ui:139
|
||||
#: resources/ui/gtk3/EnergizeB.ui:139
|
||||
msgid "Color"
|
||||
msgstr "颜色"
|
||||
|
||||
@@ -255,25 +266,27 @@ msgid "Speed"
|
||||
msgstr "速度"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:191 resources/ui/gtk3/Fire.ui:241
|
||||
#, fuzzy
|
||||
msgid "3D Noise"
|
||||
msgstr "3D 噪点"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:200 resources/ui/gtk3/Fire.ui:250
|
||||
#, fuzzy
|
||||
msgid "Creates a more dynamic fire but requires more GPU power."
|
||||
msgstr ""
|
||||
msgstr "火会更像真但显卡功耗会增加。"
|
||||
|
||||
#: resources/ui/gtk4/Fire.ui:240 resources/ui/gtk3/Fire.ui:300
|
||||
#, fuzzy
|
||||
msgid "Gradient"
|
||||
msgstr ""
|
||||
msgstr "渐变"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:70
|
||||
#, fuzzy
|
||||
msgid "Claw Scratch Scale"
|
||||
msgstr ""
|
||||
msgstr "爪痕大小"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:116
|
||||
msgid "Claw Scratch Count"
|
||||
msgstr ""
|
||||
msgstr "爪痕数量"
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:162
|
||||
msgid "Warp Effect"
|
||||
@@ -281,12 +294,32 @@ msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/TRexAttack.ui:208
|
||||
msgid "Flash Color"
|
||||
msgstr ""
|
||||
msgstr "爪痕颜色"
|
||||
|
||||
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
|
||||
msgid "Preview this Effect"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
|
||||
msgid "Mesh Line Width"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
|
||||
msgid "Line Color"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
|
||||
msgid "Glow Color"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
|
||||
msgid "Additive Blending"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Hexagon.ui:243 resources/ui/gtk3/Hexagon.ui:294
|
||||
msgid "You may want to enable this for dark window themes."
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
|
||||
msgid "Welcome to Burn-My-Windows!"
|
||||
msgstr ""
|
||||
@@ -317,6 +350,19 @@ msgstr ""
|
||||
msgid "Also Add Effects to Dialogs"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk3/Fire.ui:63
|
||||
msgid "Choose a Preset"
|
||||
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
|
||||
msgid "Twirl Intensity"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
|
||||
msgid "Shake Intensity"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
|
||||
msgid "Suction Intensity"
|
||||
msgstr ""
|
||||
|
||||
#: resources/ui/gtk3/Fire.ui:63
|
||||
#, fuzzy
|
||||
msgid "Choose a Preset"
|
||||
msgstr "选一个预设配置"
|
||||
|
||||
@@ -30,18 +30,6 @@ const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = imports.misc.extensionUtils.getCurrentExtension();
|
||||
const utils = Me.imports.src.utils;
|
||||
|
||||
// New effects must be registered here and in extension.js.
|
||||
const ALL_EFFECTS = [
|
||||
Me.imports.src.EnergizeA.EnergizeA,
|
||||
Me.imports.src.EnergizeB.EnergizeB,
|
||||
Me.imports.src.Fire.Fire,
|
||||
Me.imports.src.Matrix.Matrix,
|
||||
Me.imports.src.BrokenGlass.BrokenGlass,
|
||||
Me.imports.src.TRexAttack.TRexAttack,
|
||||
Me.imports.src.TVEffect.TVEffect,
|
||||
Me.imports.src.Wisps.Wisps,
|
||||
];
|
||||
|
||||
// This template widget class is defined at the bottom of this file.
|
||||
var BurnMyWindowsEffectPage = null;
|
||||
|
||||
@@ -56,6 +44,22 @@ var PreferencesDialog = class PreferencesDialog {
|
||||
// ------------------------------------------------------------ constructor / destructor
|
||||
|
||||
constructor() {
|
||||
|
||||
// New effects must be registered here and in extension.js.
|
||||
this._ALL_EFFECTS = [
|
||||
new Me.imports.src.Apparition.Apparition(),
|
||||
new Me.imports.src.BrokenGlass.BrokenGlass(),
|
||||
new Me.imports.src.EnergizeA.EnergizeA(),
|
||||
new Me.imports.src.EnergizeB.EnergizeB(),
|
||||
new Me.imports.src.Fire.Fire(),
|
||||
new Me.imports.src.Hexagon.Hexagon(),
|
||||
new Me.imports.src.Matrix.Matrix(),
|
||||
new Me.imports.src.SnapOfDisintegration.SnapOfDisintegration(),
|
||||
new Me.imports.src.TRexAttack.TRexAttack(),
|
||||
new Me.imports.src.TVEffect.TVEffect(),
|
||||
new Me.imports.src.Wisps.Wisps(),
|
||||
];
|
||||
|
||||
// Load all of our resources.
|
||||
this._resources = Gio.Resource.load(Me.path + '/resources/burn-my-windows.gresource');
|
||||
Gio.resources_register(this._resources);
|
||||
@@ -93,10 +97,11 @@ var PreferencesDialog = class PreferencesDialog {
|
||||
this.bindSwitch('destroy-dialogs');
|
||||
|
||||
|
||||
// Starting with GNOME Shell 42, the settings dialog uses libadwaita. We have to use a
|
||||
// different layout, as the stack sidebar looks pretty ugly with the included
|
||||
// Adw.Clamp...
|
||||
if (utils.shellVersionIsAtLeast(42, 'beta')) {
|
||||
// Starting with GNOME Shell 42, the settings dialog uses libadwaita (at least most of
|
||||
// the time - it seems that pop!_OS does not support libadwaita even on GNOME 42). We
|
||||
// have to use a different layout, as the stack sidebar looks pretty ugly with the
|
||||
// included Adw.Clamp...
|
||||
if (Adw && utils.shellVersionIsAtLeast(42, 'beta')) {
|
||||
|
||||
// This is our top-level widget which we will return later.
|
||||
this._widget = new Gtk.Box({orientation: Gtk.Orientation.VERTICAL});
|
||||
@@ -109,24 +114,24 @@ var PreferencesDialog = class PreferencesDialog {
|
||||
const group = new Adw.PreferencesGroup({title: _('Effect Options')});
|
||||
this.gtkBoxAppend(this._widget, group);
|
||||
|
||||
ALL_EFFECTS.forEach(Effect => {
|
||||
const [minMajor, minMinor] = Effect.getMinShellVersion();
|
||||
this._ALL_EFFECTS.forEach(effect => {
|
||||
const [minMajor, minMinor] = effect.getMinShellVersion();
|
||||
if (utils.shellVersionIsAtLeast(minMajor, minMinor)) {
|
||||
|
||||
const row = new Adw.ActionRow({title: Effect.getLabel(), activatable: true});
|
||||
const row = new Adw.ActionRow({title: effect.getLabel(), activatable: true});
|
||||
row.add_suffix(new Gtk.Image({icon_name: 'go-next-symbolic'}));
|
||||
|
||||
// Open a subpage with the effect's settings.
|
||||
row.connect('activated', () => {
|
||||
const page = new BurnMyWindowsEffectPage(Effect, this);
|
||||
const page = new BurnMyWindowsEffectPage(effect, this);
|
||||
page.valign = Gtk.Align.CENTER;
|
||||
page.margin_top = 10;
|
||||
page.margin_bottom = 10;
|
||||
page.margin_start = 10;
|
||||
page.margin_end = 10;
|
||||
|
||||
// Add the Effect's preferences (if any).
|
||||
const preferences = Effect.getPreferences(this);
|
||||
// Add the effect's preferences (if any).
|
||||
const preferences = effect.getPreferences(this);
|
||||
if (preferences) {
|
||||
this.gtkBoxAppend(page, preferences);
|
||||
}
|
||||
@@ -182,23 +187,23 @@ var PreferencesDialog = class PreferencesDialog {
|
||||
this.gtkBoxAppend(this._widget, stack);
|
||||
|
||||
// Add all other effect pages.
|
||||
ALL_EFFECTS.forEach(Effect => {
|
||||
const [minMajor, minMinor] = Effect.getMinShellVersion();
|
||||
this._ALL_EFFECTS.forEach(effect => {
|
||||
const [minMajor, minMinor] = effect.getMinShellVersion();
|
||||
if (utils.shellVersionIsAtLeast(minMajor, minMinor)) {
|
||||
|
||||
const page = new BurnMyWindowsEffectPage(Effect, this);
|
||||
const page = new BurnMyWindowsEffectPage(effect, this);
|
||||
page.margin_start = 60;
|
||||
page.margin_end = 60;
|
||||
page.margin_top = 60;
|
||||
page.margin_bottom = 60;
|
||||
|
||||
// Add the Effect's preferences (if any).
|
||||
const preferences = Effect.getPreferences(this);
|
||||
// Add the effect's preferences (if any).
|
||||
const preferences = effect.getPreferences(this);
|
||||
if (preferences) {
|
||||
this.gtkBoxAppend(page, preferences);
|
||||
}
|
||||
|
||||
stack.add_titled(page, Effect.getNick(), Effect.getLabel());
|
||||
stack.add_titled(page, effect.getNick(), effect.getLabel());
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -218,7 +223,7 @@ var PreferencesDialog = class PreferencesDialog {
|
||||
|
||||
// Starting with GNOME Shell 42, we have to hack our way through the widget tree
|
||||
// of the Adw.PreferencesWindow...
|
||||
if (utils.shellVersionIsAtLeast(42, 'beta')) {
|
||||
if (Adw && utils.shellVersionIsAtLeast(42, 'beta')) {
|
||||
const header = this._findWidgetByType(window.get_content(), Adw.HeaderBar);
|
||||
header.pack_end(menu);
|
||||
|
||||
@@ -298,11 +303,11 @@ var PreferencesDialog = class PreferencesDialog {
|
||||
const group = Gio.SimpleActionGroup.new();
|
||||
window.insert_action_group('open-effects', group);
|
||||
|
||||
ALL_EFFECTS.forEach(Effect => {
|
||||
const [minMajor, minMinor] = Effect.getMinShellVersion();
|
||||
this._ALL_EFFECTS.forEach(effect => {
|
||||
const [minMajor, minMinor] = effect.getMinShellVersion();
|
||||
if (utils.shellVersionIsAtLeast(minMajor, minMinor)) {
|
||||
const nick = Effect.getNick();
|
||||
const label = Effect.getLabel();
|
||||
const nick = effect.getNick();
|
||||
const label = effect.getLabel();
|
||||
const actionName = nick + '-open-effect';
|
||||
const fullName = 'open-effects.' + actionName;
|
||||
|
||||
@@ -320,11 +325,11 @@ var PreferencesDialog = class PreferencesDialog {
|
||||
const group = Gio.SimpleActionGroup.new();
|
||||
window.insert_action_group('close-effects', group);
|
||||
|
||||
ALL_EFFECTS.forEach(Effect => {
|
||||
const [minMajor, minMinor] = Effect.getMinShellVersion();
|
||||
this._ALL_EFFECTS.forEach(effect => {
|
||||
const [minMajor, minMinor] = effect.getMinShellVersion();
|
||||
if (utils.shellVersionIsAtLeast(minMajor, minMinor)) {
|
||||
const nick = Effect.getNick();
|
||||
const label = Effect.getLabel();
|
||||
const nick = effect.getNick();
|
||||
const label = effect.getLabel();
|
||||
const actionName = nick + '-close-effect';
|
||||
const fullName = 'close-effects.' + actionName;
|
||||
|
||||
@@ -486,17 +491,17 @@ var PreferencesDialog = class PreferencesDialog {
|
||||
InternalChildren: ['label', 'button'],
|
||||
},
|
||||
class BurnMyWindowsEffectPage extends Gtk.Box { // ------------------------------
|
||||
_init(Effect, dialog) {
|
||||
_init(effect, dialog) {
|
||||
super._init();
|
||||
|
||||
// Set the effect's name as label.
|
||||
this._label.label = Effect.getLabel();
|
||||
this._label.label = effect.getLabel();
|
||||
|
||||
// Open the preview window once the preview button is clicked.
|
||||
this._button.connect('clicked', () => {
|
||||
// Set the to-be-previewed effect.
|
||||
dialog.getSettings().set_string('open-preview-effect', Effect.getNick());
|
||||
dialog.getSettings().set_string('close-preview-effect', Effect.getNick());
|
||||
dialog.getSettings().set_string('open-preview-effect', effect.getNick());
|
||||
dialog.getSettings().set_string('close-preview-effect', effect.getNick());
|
||||
|
||||
// Make sure that the window.show() firther below "sees" this change.
|
||||
Gio.Settings.sync();
|
||||
@@ -504,7 +509,7 @@ var PreferencesDialog = class PreferencesDialog {
|
||||
// Create the preview-window.
|
||||
const window = new Gtk.Window({
|
||||
// Translators: %s will be replaced by the effect's name.
|
||||
title: _('Preview for %s').replace('%s', Effect.getLabel()),
|
||||
title: _('Preview for %s').replace('%s', effect.getLabel()),
|
||||
default_width: 800,
|
||||
default_height: 450,
|
||||
modal: true,
|
||||
|
||||
@@ -3,14 +3,16 @@
|
||||
"<a href='https://github.com/dennis1248'>Dennis ten Hoove</a>"
|
||||
],
|
||||
"silver": [
|
||||
"<a href='https://github.com/danielheadbang'>@danielheadbang</a>",
|
||||
"<a href='https://twitter.com/tjiiik'>tj3k</a>",
|
||||
"<a href='https://github.com/MRR-dev'>@MRR-dev</a>",
|
||||
"<a href='https://github.com/castrojo'>Jorge Castro</a>"
|
||||
],
|
||||
"bronze": [
|
||||
"<a href='https://github.com/danielheadbang'>@danielheadbang</a>"
|
||||
"<a href='https://github.com/AngelBrielez'>Angel Brielez</a>"
|
||||
],
|
||||
"past": [
|
||||
"<a href='https://github.com/MrTomRod'>@MrTomRod</a>",
|
||||
"Pouhiou",
|
||||
"DAPREMONT Christophe",
|
||||
"<a href='https://github.com/manero6'>@manero6</a>",
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
[
|
||||
"epost@anotheragency.no",
|
||||
"Allan Nordh\u00f8y",
|
||||
3
|
||||
50
|
||||
]
|
||||
]
|
||||
},
|
||||
@@ -13,7 +13,44 @@
|
||||
[
|
||||
"vistausss@fastmail.com",
|
||||
"Heimen Stoffels",
|
||||
65
|
||||
76
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"Swedish": [
|
||||
[
|
||||
"obslsessed@duck.com",
|
||||
"obslsessed",
|
||||
1
|
||||
],
|
||||
[
|
||||
"swedishsailfishosuser@tutanota.com",
|
||||
"Kristoffer Grundstr\u00f6m",
|
||||
57
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"Finnish": [
|
||||
[
|
||||
"jiri.gronroos@iki.fi",
|
||||
"Jiri Gr\u00f6nroos",
|
||||
57
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"Russian": [
|
||||
[
|
||||
"eg.ermakov2016@yandex.ru",
|
||||
"\u0415\u0433\u043e\u0440 \u0415\u0440\u043c\u0430\u043a\u043e\u0432",
|
||||
31
|
||||
],
|
||||
[
|
||||
"franigoyt@gmail.com",
|
||||
"ANIGO R. (AR)",
|
||||
59
|
||||
]
|
||||
]
|
||||
},
|
||||
@@ -26,12 +63,21 @@
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"Arabic": [
|
||||
[
|
||||
"fawaz27000@hotmail.com",
|
||||
"fawaz006",
|
||||
79
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"Turkish": [
|
||||
[
|
||||
"muhaaliss@pm.me",
|
||||
"Muha Aliss",
|
||||
57
|
||||
61
|
||||
]
|
||||
]
|
||||
},
|
||||
@@ -45,7 +91,7 @@
|
||||
[
|
||||
"albano_battistella@hotmail.com",
|
||||
"albanobattistella",
|
||||
63
|
||||
74
|
||||
]
|
||||
]
|
||||
},
|
||||
@@ -55,6 +101,11 @@
|
||||
"lyuutau@outlook.com",
|
||||
"\u5218\u97ec",
|
||||
36
|
||||
],
|
||||
[
|
||||
"poonsters6@gmail.com",
|
||||
"merelymyself",
|
||||
41
|
||||
]
|
||||
]
|
||||
},
|
||||
@@ -63,12 +114,17 @@
|
||||
[
|
||||
"code@simonschneegans.de",
|
||||
"Simon Schneegans",
|
||||
59
|
||||
70
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"French": [
|
||||
[
|
||||
"mathieu.bousquet2@gmail.com",
|
||||
"Mathieu B.",
|
||||
9
|
||||
],
|
||||
[
|
||||
"redxxiii@zaclys.net",
|
||||
"Reda",
|
||||
@@ -77,22 +133,36 @@
|
||||
[
|
||||
"theo.remon+weblate@uswery.eu",
|
||||
"Th\u00e9o Remon",
|
||||
24
|
||||
30
|
||||
],
|
||||
[
|
||||
"bonnemainsnathan@gmail.com",
|
||||
"Nathan",
|
||||
42
|
||||
45
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"Korean": [
|
||||
[
|
||||
"darkcircle.0426@gmail.com",
|
||||
"Seong-ho Cho",
|
||||
72
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
"Spanish": [
|
||||
[
|
||||
"ulicesah@gmail.com",
|
||||
"dev.n47os@aleeas.com",
|
||||
"Ulices",
|
||||
7
|
||||
],
|
||||
[
|
||||
"andres.segarra.aparicio@gmail.com",
|
||||
"Andres Segarra",
|
||||
10
|
||||
],
|
||||
[
|
||||
"fitojb@ubuntu.com",
|
||||
"Adolfo Jayme Barrientos",
|
||||
@@ -101,7 +171,7 @@
|
||||
[
|
||||
"oscfdezdz@tuta.io",
|
||||
"\u00d3scar Fern\u00e1ndez D\u00edaz",
|
||||
55
|
||||
58
|
||||
]
|
||||
]
|
||||
}
|
||||
|
||||
|
After Width: | Height: | Size: 434 KiB |
@@ -0,0 +1,49 @@
|
||||
// Inject some common shader snippets. It is only possible to include glsl files from the
|
||||
// "common" directory. Also, the files in the "common" directory are not allowed to
|
||||
// include any further files.
|
||||
#include "common/uniforms.glsl"
|
||||
|
||||
uniform vec2 uSeed;
|
||||
uniform float uShake;
|
||||
uniform float uTwirl;
|
||||
uniform float uSuction;
|
||||
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;
|
||||
|
||||
// Choose a random suction center.
|
||||
vec2 center = uSeed * uRandomness + 0.5 * (1.0 - uRandomness);
|
||||
vec2 coords = cogl_tex_coord_in[0].st * ACTOR_SCALE - PADDING - center;
|
||||
|
||||
// Add some shaking.
|
||||
coords.x +=
|
||||
progress * 0.05 * uShake * sin((progress + uSeed.x) * (1.0 + uSeed.x) * uShake);
|
||||
coords.y +=
|
||||
progress * 0.05 * uShake * cos((progress + uSeed.y) * (1.0 + uSeed.y) * uShake);
|
||||
|
||||
// "Suck" the texture into the center.
|
||||
float dist = length(coords) / sqrt(2);
|
||||
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)));
|
||||
|
||||
// Shell.GLSLEffect uses straight alpha. So we have to convert from premultiplied.
|
||||
cogl_color_out = texture2D(uTexture, coords + center);
|
||||
if (cogl_color_out.a > 0) {
|
||||
cogl_color_out.rgb /= cogl_color_out.a;
|
||||
}
|
||||
|
||||
// Fade out the window texture.
|
||||
cogl_color_out.a *= 1.0 - progress;
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
// Inject some common shader snippets. It is only possible to include glsl files from the
|
||||
// "common" directory. Also, the files in the "common" directory are not allowed to
|
||||
// include any further files.
|
||||
#include "common/uniforms.glsl"
|
||||
|
||||
uniform sampler2D uShardTexture;
|
||||
uniform vec2 uSeed;
|
||||
uniform vec2 uEpicenter;
|
||||
uniform float uShardScale;
|
||||
uniform float uBlowForce;
|
||||
uniform float uGravity;
|
||||
|
||||
const float SHARD_LAYERS = 5;
|
||||
const float ACTOR_SCALE = 2.0;
|
||||
const float PADDING = ACTOR_SCALE / 2.0 - 0.5;
|
||||
|
||||
void main() {
|
||||
cogl_color_out = vec4(0, 0, 0, 0);
|
||||
|
||||
float progress = uForOpening ? 1.0 - uProgress : uProgress;
|
||||
|
||||
// Draw the individual shard layers.
|
||||
for (float i = 0; i < SHARD_LAYERS; ++i) {
|
||||
|
||||
// To enable drawing shards outside of the window bounds, the actor was scaled
|
||||
// by ACTOR_SCALE. Here we scale and move the texture coordinates so that the
|
||||
// window gets drawn at the correct position again.
|
||||
vec2 coords = cogl_tex_coord_in[0].st * ACTOR_SCALE - PADDING;
|
||||
|
||||
// Scale and rotate around our epicenter.
|
||||
coords -= uEpicenter;
|
||||
|
||||
// Scale each layer a bit differently.
|
||||
coords /= mix(1.0, 1.0 + uBlowForce * (i + 2) / SHARD_LAYERS, progress);
|
||||
|
||||
// Rotate each layer a bit differently.
|
||||
float rotation = (mod(i, 2.0) - 0.5) * 0.2 * progress;
|
||||
coords = vec2(coords.x * cos(rotation) - coords.y * sin(rotation),
|
||||
coords.x * sin(rotation) + coords.y * cos(rotation));
|
||||
|
||||
// Move down each layer a bit.
|
||||
float gravity =
|
||||
(uForOpening ? -1.0 : 1.0) * uGravity * 0.1 * (i + 1) * progress * progress;
|
||||
coords += vec2(0, gravity);
|
||||
|
||||
// Restore correct position.
|
||||
coords += uEpicenter;
|
||||
|
||||
// Retrieve information from the shard texture for our layer.
|
||||
vec2 shardCoords = (coords + uSeed) * uSize / uShardScale / 500.0;
|
||||
vec2 shardMap = texture2D(uShardTexture, shardCoords).rg;
|
||||
|
||||
// The green channel contains a random value in [0..1] for each shard. We
|
||||
// discretize this into SHARD_LAYERS bins and check if our layer falls into
|
||||
// the bin of the current shard.
|
||||
float shardGroup = floor(shardMap.g * SHARD_LAYERS * 0.999);
|
||||
|
||||
if (shardGroup == i && (shardMap.x - pow(progress + 0.1, 2)) > 0) {
|
||||
cogl_color_out = texture2D(uTexture, coords);
|
||||
}
|
||||
}
|
||||
|
||||
// Shell.GLSLEffect uses straight alpha. So we have to convert from premultiplied.
|
||||
if (cogl_color_out.a > 0) {
|
||||
cogl_color_out.rgb /= cogl_color_out.a;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
// 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);
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
// This provides some basic easing function. More can be added if required!
|
||||
// Taken from here:
|
||||
// https://gitlab.gnome.org/GNOME/mutter/-/blob/main/clutter/clutter/clutter-easing.c
|
||||
|
||||
float easeOutQuad(float x) { return -1.0 * x * (x - 2); }
|
||||
@@ -0,0 +1,33 @@
|
||||
// This method returns a mask which smoothly transitions towards zero when approaching
|
||||
// the window's borders. There is a variant which takes the transition area width in
|
||||
// pixels and one which takes this as a percentage.
|
||||
float getEdgeMask(vec2 uv, vec2 maxUV, float fadeWidth) {
|
||||
float mask = 1.0;
|
||||
mask *= smoothstep(0, 1, clamp(uv.x / fadeWidth, 0, 1));
|
||||
mask *= smoothstep(0, 1, clamp(uv.y / fadeWidth, 0, 1));
|
||||
mask *= smoothstep(0, 1, clamp((maxUV.x - uv.x) / fadeWidth, 0, 1));
|
||||
mask *= smoothstep(0, 1, clamp((maxUV.y - uv.y) / fadeWidth, 0, 1));
|
||||
|
||||
return mask;
|
||||
}
|
||||
|
||||
// Returns an edge mask which fades to zero at the boundaries of the actor. The width of
|
||||
// the fade zone is given in pixels. This uses the standard uniforms uSize and uPadding.
|
||||
// This means that the fading zone is not actually at the actors boundaries but at the
|
||||
// position of the window border in the texture.
|
||||
// The offset paramter controls whether the fading is placed inside the window borders
|
||||
// (offset = 0), ontop the window borders (offset = 0.5) or outside the window borders
|
||||
// (offset = 1).
|
||||
float getAbsoluteEdgeMask(float fadePixels, float offset) {
|
||||
float padding = max(0, uPadding - fadePixels * offset);
|
||||
vec2 uv = cogl_tex_coord_in[0].st * uSize - padding;
|
||||
return getEdgeMask(uv, uSize - 2.0 * padding, fadePixels);
|
||||
}
|
||||
|
||||
// Returns an edge mask which fades to zero at the boundaries of the actor. The width of
|
||||
// the fade zone is given relative to the actor size. This neither uses uSize and
|
||||
// uPadding.
|
||||
float getRelativeEdgeMask(float fadeAmount) {
|
||||
vec2 uv = cogl_tex_coord_in[0].st;
|
||||
return getEdgeMask(uv, vec2(1.0), fadeAmount);
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
float distToLine(vec2 origin, vec2 direction, vec2 point) {
|
||||
vec2 perpendicular = vec2(direction.y, -direction.x);
|
||||
return abs(dot(normalize(perpendicular), origin - point));
|
||||
}
|
||||
|
||||
float getWinding(vec2 a, vec2 b) { return cross(vec3(a, 0.0), vec3(b, 0.0)).z; }
|
||||
|
||||
vec2 rotate(vec2 a, float angle) {
|
||||
return vec2(a.x * cos(angle) - a.y * sin(angle), a.x * sin(angle) + a.y * cos(angle));
|
||||
}
|
||||
@@ -0,0 +1,207 @@
|
||||
// These noise algorithms are based on implementations by various authors from
|
||||
// shadertoy.com, which are all available under the MIT License. See the respective links
|
||||
// in the comments below.
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Hash without Sine //
|
||||
// MIT License, https://www.shadertoy.com/view/4djSRW //
|
||||
// Copyright (c) 2014 David Hoskins. //
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// 1 out, 1 in...
|
||||
float hash11(float p) {
|
||||
p = fract(p * .1031);
|
||||
p *= p + 33.33;
|
||||
p *= p + p;
|
||||
return fract(p);
|
||||
}
|
||||
|
||||
// 1 out, 2 in...
|
||||
float hash12(vec2 p) {
|
||||
vec3 p3 = fract(vec3(p.xyx) * .1031);
|
||||
p3 += dot(p3, p3.yzx + 33.33);
|
||||
return fract((p3.x + p3.y) * p3.z);
|
||||
}
|
||||
|
||||
// 1 out, 3 in...
|
||||
float hash13(vec3 p3) {
|
||||
p3 = fract(p3 * .1031);
|
||||
p3 += dot(p3, p3.zyx + 31.32);
|
||||
return fract((p3.x + p3.y) * p3.z);
|
||||
}
|
||||
|
||||
// 2 out, 1 in...
|
||||
vec2 hash21(float p) {
|
||||
vec3 p3 = fract(vec3(p) * vec3(.1031, .1030, .0973));
|
||||
p3 += dot(p3, p3.yzx + 33.33);
|
||||
return fract((p3.xx + p3.yz) * p3.zy);
|
||||
}
|
||||
|
||||
// 2 out, 2 in...
|
||||
vec2 hash22(vec2 p) {
|
||||
vec3 p3 = fract(vec3(p.xyx) * vec3(.1031, .1030, .0973));
|
||||
p3 += dot(p3, p3.yzx + 33.33);
|
||||
return fract((p3.xx + p3.yz) * p3.zy);
|
||||
}
|
||||
|
||||
// 2 out, 3 in...
|
||||
vec2 hash23(vec3 p3) {
|
||||
p3 = fract(p3 * vec3(.1031, .1030, .0973));
|
||||
p3 += dot(p3, p3.yzx + 33.33);
|
||||
return fract((p3.xx + p3.yz) * p3.zy);
|
||||
}
|
||||
|
||||
// 3 out, 1 in...
|
||||
vec3 hash31(float p) {
|
||||
vec3 p3 = fract(vec3(p) * vec3(.1031, .1030, .0973));
|
||||
p3 += dot(p3, p3.yzx + 33.33);
|
||||
return fract((p3.xxy + p3.yzz) * p3.zyx);
|
||||
}
|
||||
|
||||
// 3 out, 2 in...
|
||||
vec3 hash32(vec2 p) {
|
||||
vec3 p3 = fract(vec3(p.xyx) * vec3(.1031, .1030, .0973));
|
||||
p3 += dot(p3, p3.yxz + 33.33);
|
||||
return fract((p3.xxy + p3.yzz) * p3.zyx);
|
||||
}
|
||||
|
||||
// 3 out, 3 in...
|
||||
vec3 hash33(vec3 p3) {
|
||||
p3 = fract(p3 * vec3(.1031, .1030, .0973));
|
||||
p3 += dot(p3, p3.yxz + 33.33);
|
||||
return fract((p3.xxy + p3.yxx) * p3.zyx);
|
||||
}
|
||||
|
||||
// 4 out, 1 in...
|
||||
vec4 hash41(float p) {
|
||||
vec4 p4 = fract(vec4(p) * vec4(.1031, .1030, .0973, .1099));
|
||||
p4 += dot(p4, p4.wzxy + 33.33);
|
||||
return fract((p4.xxyz + p4.yzzw) * p4.zywx);
|
||||
}
|
||||
|
||||
// 4 out, 2 in...
|
||||
vec4 hash42(vec2 p) {
|
||||
vec4 p4 = fract(vec4(p.xyxy) * vec4(.1031, .1030, .0973, .1099));
|
||||
p4 += dot(p4, p4.wzxy + 33.33);
|
||||
return fract((p4.xxyz + p4.yzzw) * p4.zywx);
|
||||
}
|
||||
|
||||
// 4 out, 3 in...
|
||||
vec4 hash43(vec3 p) {
|
||||
vec4 p4 = fract(vec4(p.xyzx) * vec4(.1031, .1030, .0973, .1099));
|
||||
p4 += dot(p4, p4.wzxy + 33.33);
|
||||
return fract((p4.xxyz + p4.yzzw) * p4.zywx);
|
||||
}
|
||||
|
||||
// 4 out, 4 in...
|
||||
vec4 hash44(vec4 p4) {
|
||||
p4 = fract(p4 * vec4(.1031, .1030, .0973, .1099));
|
||||
p4 += dot(p4, p4.wzxy + 33.33);
|
||||
return fract((p4.xxyz + p4.yzzw) * p4.zywx);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
// 2D Simplex Noise //
|
||||
// MIT License, https://www.shadertoy.com/view/Msf3WH //
|
||||
// Copyright © 2013 Inigo Quilez //
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
float simplex2D(vec2 p) {
|
||||
const float K1 = 0.366025404; // (sqrt(3)-1)/2;
|
||||
const float K2 = 0.211324865; // (3-sqrt(3))/6;
|
||||
|
||||
vec2 i = floor(p + (p.x + p.y) * K1);
|
||||
vec2 a = p - i + (i.x + i.y) * K2;
|
||||
float m = step(a.y, a.x);
|
||||
vec2 o = vec2(m, 1.0 - m);
|
||||
vec2 b = a - o + K2;
|
||||
vec2 c = a - 1.0 + 2.0 * K2;
|
||||
vec3 h = max(0.5 - vec3(dot(a, a), dot(b, b), dot(c, c)), 0.0);
|
||||
vec3 n = h * h * h * h *
|
||||
vec3(dot(a, -1.0 + 2.0 * hash22(i + 0.0)), dot(b, -1.0 + 2.0 * hash22(i + o)),
|
||||
dot(c, -1.0 + 2.0 * hash22(i + 1.0)));
|
||||
return 0.5 + 0.5 * dot(n, vec3(70.0));
|
||||
}
|
||||
|
||||
float simplex2DFractal(vec2 p) {
|
||||
mat2 m = mat2(1.6, 1.2, -1.2, 1.6);
|
||||
float f = 0.5000 * simplex2D(p);
|
||||
p = m * p;
|
||||
f += 0.2500 * simplex2D(p);
|
||||
p = m * p;
|
||||
f += 0.1250 * simplex2D(p);
|
||||
p = m * p;
|
||||
f += 0.0625 * simplex2D(p);
|
||||
p = m * p;
|
||||
|
||||
return f;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
// 3D Simplex Noise //
|
||||
// MIT License, https://www.shadertoy.com/view/XsX3zB //
|
||||
// Copyright © 2013 Nikita Miropolskiy //
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
float simplex3D(vec3 p) {
|
||||
|
||||
// skew constants for 3D simplex functions
|
||||
const float F3 = 0.3333333;
|
||||
const float G3 = 0.1666667;
|
||||
|
||||
// 1. find current tetrahedron T and it's four vertices
|
||||
// s, s+i1, s+i2, s+1.0 - absolute skewed (integer) coordinates of T vertices
|
||||
// x, x1, x2, x3 - unskewed coordinates of p relative to each of T vertice
|
||||
|
||||
// calculate s and x
|
||||
vec3 s = floor(p + dot(p, vec3(F3)));
|
||||
vec3 x = p - s + dot(s, vec3(G3));
|
||||
|
||||
// calculate i1 and i2
|
||||
vec3 e = step(vec3(0.0), x - x.yzx);
|
||||
vec3 i1 = e * (1.0 - e.zxy);
|
||||
vec3 i2 = 1.0 - e.zxy * (1.0 - e);
|
||||
|
||||
// x1, x2, x3
|
||||
vec3 x1 = x - i1 + G3;
|
||||
vec3 x2 = x - i2 + 2.0 * G3;
|
||||
vec3 x3 = x - 1.0 + 3.0 * G3;
|
||||
|
||||
// 2. find four surflets and store them in d
|
||||
vec4 w, d;
|
||||
|
||||
// calculate surflet weights
|
||||
w.x = dot(x, x);
|
||||
w.y = dot(x1, x1);
|
||||
w.z = dot(x2, x2);
|
||||
w.w = dot(x3, x3);
|
||||
|
||||
// w fades from 0.6 at the center of the surflet to 0.0 at the margin
|
||||
w = max(0.6 - w, 0.0);
|
||||
|
||||
// calculate surflet components
|
||||
d.x = dot(-0.5 + hash33(s), x);
|
||||
d.y = dot(-0.5 + hash33(s + i1), x1);
|
||||
d.z = dot(-0.5 + hash33(s + i2), x2);
|
||||
d.w = dot(-0.5 + hash33(s + 1.0), x3);
|
||||
|
||||
// multiply d by w^4
|
||||
w *= w;
|
||||
w *= w;
|
||||
d *= w;
|
||||
|
||||
// 3. return the sum of the four surflets
|
||||
return dot(d, vec4(52.0)) * 0.5 + 0.5;
|
||||
}
|
||||
|
||||
// directional artifacts can be reduced by rotating each octave
|
||||
float simplex3DFractal(vec3 m) {
|
||||
|
||||
// const matrices for 3D rotation
|
||||
const mat3 rot1 = mat3(-0.37, 0.36, 0.85, -0.14, -0.93, 0.34, 0.92, 0.01, 0.4);
|
||||
const mat3 rot2 = mat3(-0.55, -0.39, 0.74, 0.33, -0.91, -0.24, 0.77, 0.12, 0.63);
|
||||
const mat3 rot3 = mat3(-0.71, 0.52, -0.47, -0.08, -0.72, -0.68, -0.7, -0.45, 0.56);
|
||||
|
||||
return 0.5333333 * simplex3D(m * rot1) + 0.2666667 * simplex3D(2.0 * m * rot2) +
|
||||
0.1333333 * simplex3D(4.0 * m * rot3) + 0.0666667 * simplex3D(8.0 * m);
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
// These should be included in every shader.
|
||||
// uForOpening: True if a window-open animation is ongoing, false otherwise.
|
||||
// uTexture: Contains the texture of the window.
|
||||
// uProgress: A value which transitions from 0 to 1 during the entire animation.
|
||||
// uTime: A steadily increasing value in seconds.
|
||||
// uSize: The size of uTexture in pixels.
|
||||
// uPadding: The empty area around the actual window (e.g. where the shadow is drawn).
|
||||
uniform bool uForOpening;
|
||||
uniform sampler2D uTexture;
|
||||
uniform float uProgress;
|
||||
uniform float uTime;
|
||||
uniform vec2 uSize;
|
||||
uniform float uPadding;
|
||||
@@ -0,0 +1,90 @@
|
||||
// Inject some common shader snippets. It is only possible to include glsl files from the
|
||||
// "common" directory. Also, the files in the "common" directory are not allowed to
|
||||
// include any further files.
|
||||
#include "common/uniforms.glsl"
|
||||
#include "common/noise.glsl"
|
||||
#include "common/edgeMask.glsl"
|
||||
#include "common/easing.glsl"
|
||||
|
||||
uniform vec3 uColor;
|
||||
uniform float uScale;
|
||||
|
||||
const float FADE_IN_TIME = 0.3;
|
||||
const float FADE_OUT_TIME = 0.6;
|
||||
const float HEART_FADE_TIME = 0.3;
|
||||
const float EDGE_FADE_WIDTH = 50;
|
||||
|
||||
// This method returns two values:
|
||||
// result.x: A mask for the particles.
|
||||
// result.y: The opacity of the fading window.
|
||||
vec2 getMasks(float progress) {
|
||||
float fadeInProgress = clamp(progress / FADE_IN_TIME, 0, 1);
|
||||
float fadeOutProgress = clamp((progress - FADE_IN_TIME) / FADE_OUT_TIME, 0, 1);
|
||||
float heartProgress =
|
||||
clamp((progress - (1.0 - HEART_FADE_TIME)) / HEART_FADE_TIME, 0, 1);
|
||||
|
||||
// Compute mask for the "atom" particles.
|
||||
float dist = length(cogl_tex_coord_in[0].st - 0.5) * 4.0;
|
||||
float atomMask = smoothstep(0.0, 1.0, (fadeInProgress * 2.0 - dist + 1.0));
|
||||
atomMask *= fadeInProgress;
|
||||
atomMask *= smoothstep(1.0, 0.0, fadeOutProgress);
|
||||
|
||||
// Fade-out the masks at the window edges.
|
||||
float edgeFade = getAbsoluteEdgeMask(EDGE_FADE_WIDTH, 0.5);
|
||||
atomMask *= edgeFade;
|
||||
|
||||
float heartMask = getRelativeEdgeMask(0.5);
|
||||
heartMask = 3.0 * pow(heartMask, 5);
|
||||
heartMask *= fadeOutProgress;
|
||||
heartMask *= 1.0 - heartProgress;
|
||||
atomMask = clamp(heartMask + atomMask, 0, 1);
|
||||
|
||||
// Compute fading window opacity.
|
||||
float windowMask = pow(1.0 - fadeOutProgress, 2.0);
|
||||
|
||||
if (uForOpening) {
|
||||
windowMask = 1.0 - windowMask;
|
||||
}
|
||||
|
||||
return vec2(atomMask, windowMask);
|
||||
}
|
||||
|
||||
void main() {
|
||||
float progress = easeOutQuad(uProgress);
|
||||
|
||||
vec2 masks = getMasks(progress);
|
||||
vec4 windowColor = texture2D(uTexture, cogl_tex_coord_in[0].st);
|
||||
|
||||
// Shell.GLSLEffect uses straight alpha. So we have to convert from premultiplied.
|
||||
if (windowColor.a > 0) {
|
||||
windowColor.rgb /= windowColor.a;
|
||||
}
|
||||
|
||||
// Dissolve window to effect color / transparency.
|
||||
cogl_color_out.rgb = mix(uColor, windowColor.rgb, 0.2 * masks.y + 0.8);
|
||||
cogl_color_out.a = windowColor.a * masks.y;
|
||||
|
||||
vec2 scaledUV = (cogl_tex_coord_in[0].st - 0.5) * (1.0 + 0.1 * progress);
|
||||
scaledUV /= uScale;
|
||||
|
||||
// Add molecule particles.
|
||||
vec2 uv = scaledUV + vec2(0, 0.1 * uTime);
|
||||
uv *= 0.010598 * vec2(0.5 * uSize.x, uSize.y);
|
||||
float particles = 0.2 * pow((simplex3D(vec3(uv, 0.0 * uTime))), 3.0);
|
||||
|
||||
// Add more molecule particles.
|
||||
for (int i = 1; i <= 3; ++i) {
|
||||
vec2 uv = scaledUV * 0.12154 / pow(1.5, i) * uSize;
|
||||
float atoms = simplex3D(vec3(uv, 2.0 * uTime / i));
|
||||
particles += 0.5 * pow(0.2 * (1.0 / (1.0 - atoms) - 1.0), 2);
|
||||
}
|
||||
|
||||
cogl_color_out.rgb += uColor * particles * masks.x;
|
||||
cogl_color_out.a += particles * masks.x;
|
||||
|
||||
// These are pretty useful for understanding how this works.
|
||||
// cogl_color_out = vec4(masks, 0.0, 1.0);
|
||||
// cogl_color_out = vec4(vec3(masks.x), 1.0);
|
||||
// cogl_color_out = vec4(vec3(masks.y), 1.0);
|
||||
// cogl_color_out = vec4(vec3(particles), 1.0);
|
||||
}
|
||||
@@ -0,0 +1,114 @@
|
||||
// Inject some common shader snippets. It is only possible to include glsl files from the
|
||||
// "common" directory. Also, the files in the "common" directory are not allowed to
|
||||
// include any further files.
|
||||
#include "common/uniforms.glsl"
|
||||
#include "common/noise.glsl"
|
||||
#include "common/edgeMask.glsl"
|
||||
#include "common/easing.glsl"
|
||||
|
||||
uniform vec3 uColor;
|
||||
uniform float uScale;
|
||||
|
||||
const float SHOWER_TIME = 0.3;
|
||||
const float SHOWER_WIDTH = 0.3;
|
||||
const float STREAK_TIME = 0.6;
|
||||
const float EDGE_FADE = 50;
|
||||
|
||||
// This method returns four values:
|
||||
// result.x: A mask for the particles which lead the shower.
|
||||
// result.y: A mask for the streaks which follow the shower particles.
|
||||
// result.z: A mask for the final "atom" particles.
|
||||
// result.w: The opacity of the fading window.
|
||||
vec4 getMasks(float progress) {
|
||||
float showerProgress = progress / SHOWER_TIME;
|
||||
float streakProgress = clamp((progress - SHOWER_TIME) / STREAK_TIME, 0, 1);
|
||||
float fadeProgress = clamp((progress - SHOWER_TIME) / (1.0 - SHOWER_TIME), 0, 1);
|
||||
|
||||
// Gradient from top to bottom.
|
||||
float t = cogl_tex_coord_in[0].t;
|
||||
|
||||
// A smooth gradient which moves to the bottom within the showerProgress.
|
||||
float showerMask =
|
||||
smoothstep(1, 0, abs(showerProgress - t - SHOWER_WIDTH) / SHOWER_WIDTH);
|
||||
|
||||
// This is 1 above the streak mask.
|
||||
float streakMask = (showerProgress - t - SHOWER_WIDTH) > 0 ? 1 : 0;
|
||||
|
||||
// Compute mask for the "atom" particles.
|
||||
float atomMask = getRelativeEdgeMask(0.2);
|
||||
atomMask = max(0, atomMask - showerMask);
|
||||
atomMask *= streakMask;
|
||||
atomMask *= sqrt(1 - fadeProgress * fadeProgress);
|
||||
|
||||
// Make some particles visible in the streaks.
|
||||
showerMask += 0.05 * streakMask;
|
||||
|
||||
// Add shower mask to streak mask.
|
||||
streakMask = max(streakMask, showerMask);
|
||||
|
||||
// Fade-out the masks at the window edges.
|
||||
float edgeFade = getAbsoluteEdgeMask(EDGE_FADE, 0.5);
|
||||
streakMask *= edgeFade;
|
||||
showerMask *= edgeFade;
|
||||
|
||||
// Fade-out the masks from top to bottom.
|
||||
float fade = smoothstep(0.0, 1.0, 1.0 + t - 2.0 * streakProgress);
|
||||
streakMask *= fade;
|
||||
showerMask *= fade;
|
||||
|
||||
// Compute fading window opacity.
|
||||
float windowMask = pow(1.0 - fadeProgress, 2.0);
|
||||
|
||||
if (uForOpening) {
|
||||
windowMask = 1.0 - windowMask;
|
||||
}
|
||||
|
||||
return vec4(showerMask, streakMask, atomMask, windowMask);
|
||||
}
|
||||
|
||||
void main() {
|
||||
float progress = easeOutQuad(uProgress);
|
||||
|
||||
vec4 masks = getMasks(progress);
|
||||
vec4 windowColor = texture2D(uTexture, cogl_tex_coord_in[0].st);
|
||||
|
||||
// Shell.GLSLEffect uses straight alpha. So we have to convert from premultiplied.
|
||||
if (windowColor.a > 0) {
|
||||
windowColor.rgb /= windowColor.a;
|
||||
}
|
||||
|
||||
// Dissolve window to effect color / transparency.
|
||||
cogl_color_out.rgb = mix(uColor, windowColor.rgb, 0.5 * masks.w + 0.5);
|
||||
cogl_color_out.a = windowColor.a * masks.w;
|
||||
|
||||
// Add leading shower particles.
|
||||
vec2 showerUV = cogl_tex_coord_in[0].st + vec2(0, -0.7 * progress / SHOWER_TIME);
|
||||
showerUV *= 0.02 * uSize / uScale;
|
||||
float shower = pow(simplex2D(showerUV), 10.0);
|
||||
cogl_color_out.rgb += uColor * shower * masks.x;
|
||||
cogl_color_out.a += shower * masks.x;
|
||||
|
||||
// Add trailing streak lines.
|
||||
vec2 streakUV = cogl_tex_coord_in[0].st + vec2(0, -progress / SHOWER_TIME);
|
||||
streakUV *= vec2(0.05 * uSize.x, 0.001 * uSize.y) / uScale;
|
||||
float streaks = simplex2DFractal(streakUV) * 0.5;
|
||||
cogl_color_out.rgb += uColor * streaks * masks.y;
|
||||
cogl_color_out.a += streaks * masks.y;
|
||||
|
||||
// Add glimmering atoms.
|
||||
vec2 atomUV = cogl_tex_coord_in[0].st + vec2(0, -0.025 * progress / SHOWER_TIME);
|
||||
atomUV *= 0.2 * uSize / uScale;
|
||||
float atoms = pow((simplex3D(vec3(atomUV, uTime))), 5.0);
|
||||
cogl_color_out.rgb += uColor * atoms * masks.z;
|
||||
cogl_color_out.a += atoms * masks.z;
|
||||
|
||||
// These are pretty useful for understanding how this works.
|
||||
// cogl_color_out = vec4(masks.rgb, 1.0);
|
||||
// cogl_color_out = vec4(vec3(masks.x), 1.0);
|
||||
// cogl_color_out = vec4(vec3(masks.y), 1.0);
|
||||
// cogl_color_out = vec4(vec3(masks.z), 1.0);
|
||||
// cogl_color_out = vec4(vec3(masks.w), 1.0);
|
||||
// cogl_color_out = vec4(vec3(shower), 1.0);
|
||||
// cogl_color_out = vec4(vec3(streaks), 1.0);
|
||||
// cogl_color_out = vec4(vec3(atoms), 1.0);
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
// Inject some common shader snippets. It is only possible to include glsl files from the
|
||||
// "common" directory. Also, the files in the "common" directory are not allowed to
|
||||
// include any further files.
|
||||
#include "common/uniforms.glsl"
|
||||
#include "common/compositing.glsl"
|
||||
#include "common/edgeMask.glsl"
|
||||
#include "common/noise.glsl"
|
||||
#include "common/easing.glsl"
|
||||
|
||||
uniform bool u3DNoise;
|
||||
uniform float uScale;
|
||||
uniform float uMovementSpeed;
|
||||
uniform vec4 uGradient1;
|
||||
uniform vec4 uGradient2;
|
||||
uniform vec4 uGradient3;
|
||||
uniform vec4 uGradient4;
|
||||
uniform vec4 uGradient5;
|
||||
|
||||
// These may be configurable in the future.
|
||||
const float EDGE_FADE = 70;
|
||||
const float FADE_WIDTH = 0.1;
|
||||
const float HIDE_TIME = 0.4;
|
||||
|
||||
// This maps the input value from [0..1] to a color from the gradient.
|
||||
vec4 getFireColor(float v) {
|
||||
const float steps[5] = float[](0.0, 0.2, 0.35, 0.5, 0.8);
|
||||
vec4 colors[5] = vec4[](uGradient1, uGradient2, uGradient3, uGradient4, uGradient5);
|
||||
|
||||
if (v < steps[0]) {
|
||||
return colors[0];
|
||||
}
|
||||
|
||||
for (int i = 0; i < 4; ++i) {
|
||||
if (v <= steps[i + 1]) {
|
||||
return mix(colors[i], colors[i + 1],
|
||||
vec4(v - steps[i]) / (steps[i + 1] - steps[i]));
|
||||
}
|
||||
}
|
||||
|
||||
return colors[4];
|
||||
}
|
||||
|
||||
// This method requires the uniforms from standardUniforms() to be available.
|
||||
// It returns two values: The first is an alpha value which can be used for the window
|
||||
// texture. This gradually dissolves the window from top to bottom. The second can be used
|
||||
// to mask any effect, it will be most opaque where the window is currently fading and
|
||||
// gradually dissolve to zero over time.
|
||||
// hideTime: A value in [0..1]. It determines the percentage of the animation which
|
||||
// is spent for hiding the window. 1-hideTime will be spent thereafter for
|
||||
// dissolving the effect mask.
|
||||
// fadeWidth: The relative size of the window-hiding gradient in [0..1].
|
||||
// edgeFadeWidth: The pixel width of the effect fading range at the edges of the window.
|
||||
vec2 effectMask(float hideTime, float fadeWidth, float edgeFadeWidth) {
|
||||
float progress = easeOutQuad(uProgress);
|
||||
|
||||
float burnProgress = clamp(progress / hideTime, 0, 1);
|
||||
float afterBurnProgress = clamp((progress - hideTime) / (1 - hideTime), 0, 1);
|
||||
|
||||
// Gradient from top to bottom.
|
||||
float t = cogl_tex_coord_in[0].t * (1 - fadeWidth);
|
||||
|
||||
// Visible part of the window. Gradually dissolves towards the bottom.
|
||||
float windowMask = 1 - clamp((burnProgress - t) / fadeWidth, 0, 1);
|
||||
|
||||
// Gradient from top burning window.
|
||||
float effectMask = clamp(t * (1 - windowMask) / burnProgress, 0, 1);
|
||||
|
||||
// Fade-out when the window burned down.
|
||||
if (progress > hideTime) {
|
||||
float fade = sqrt(1 - afterBurnProgress * afterBurnProgress);
|
||||
effectMask *= mix(1, 1 - t, afterBurnProgress) * fade;
|
||||
}
|
||||
|
||||
// Fade at window borders.
|
||||
effectMask *= getAbsoluteEdgeMask(edgeFadeWidth, 0.5);
|
||||
|
||||
if (uForOpening) {
|
||||
windowMask = 1.0 - windowMask;
|
||||
}
|
||||
|
||||
return vec2(windowMask, effectMask);
|
||||
}
|
||||
|
||||
void main() {
|
||||
// Get a noise value which moves vertically in time.
|
||||
vec2 uv = cogl_tex_coord_in[0].st * uSize / vec2(400, 600) / uScale;
|
||||
uv.y += uTime * uMovementSpeed;
|
||||
|
||||
float noise = u3DNoise ? simplex3DFractal(vec3(uv * 4.0, uTime * uMovementSpeed * 1.5))
|
||||
: simplex2DFractal(uv * 4.0);
|
||||
|
||||
// Modulate noise by effect mask.
|
||||
vec2 effectMask = effectMask(HIDE_TIME, FADE_WIDTH, EDGE_FADE);
|
||||
noise *= effectMask.y;
|
||||
|
||||
// Map noise value to color.
|
||||
vec4 fire = getFireColor(noise);
|
||||
|
||||
// Get the window texture.
|
||||
cogl_color_out = texture2D(uTexture, cogl_tex_coord_in[0].st);
|
||||
|
||||
// Shell.GLSLEffect uses straight alpha. So we have to convert from premultiplied.
|
||||
if (cogl_color_out.a > 0) {
|
||||
cogl_color_out.rgb /= cogl_color_out.a;
|
||||
}
|
||||
|
||||
// Fade the window according to the effect mask.
|
||||
cogl_color_out.a *= effectMask.x;
|
||||
|
||||
// Add the fire to the window.
|
||||
cogl_color_out = alphaOver(cogl_color_out, fire);
|
||||
|
||||
// These are pretty useful for understanding how this works.
|
||||
// cogl_color_out = vec4(vec3(noise), 1);
|
||||
// cogl_color_out = vec4(vec3(effectMask.x), 1);
|
||||
// cogl_color_out = vec4(vec3(effectMask.y), 1);
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
// Inject some common shader snippets. It is only possible to include glsl files from the
|
||||
// "common" directory. Also, the files in the "common" directory are not allowed to
|
||||
// include any further files.
|
||||
#include "common/uniforms.glsl"
|
||||
#include "common/noise.glsl"
|
||||
|
||||
uniform bool uAdditiveBlending;
|
||||
uniform vec2 uSeed;
|
||||
uniform float uScale;
|
||||
uniform float uLineWidth;
|
||||
uniform vec4 uGlowColor;
|
||||
uniform vec4 uLineColor;
|
||||
|
||||
// This methods generates a procedural hexagonal pattern. It returns four values:
|
||||
// result.xy: This contains cell-relative coordinates for the given point.
|
||||
// [0, 0] is in the center of a cell, [0, 1] at the upper edge,
|
||||
// [sqrt(4.0 / 3.0), 0] at the right tip and so on.
|
||||
// result.z: This is the distance to the closest edge. This is used for shrinking
|
||||
// of the tiles and the sharp overlay lines.
|
||||
// result.w: This is the distance to the closest cell center. This is used for
|
||||
// the glow effect.
|
||||
vec4 getHexagons(vec2 p) {
|
||||
|
||||
// Length of a cell's edge.
|
||||
const float edgeLength = sqrt(4.0 / 3.0);
|
||||
|
||||
// The hexgrid repeats after this distance.
|
||||
const vec2 scale = vec2(3.0 * edgeLength, 2.0);
|
||||
|
||||
// This is a repeating grid of scale-sized cells. Y-values are in the
|
||||
// interval [-1...1], X-value in [-1.5*edgeLength...1.5*edgeLength].
|
||||
vec2 a = mod(p, scale) - scale * 0.5;
|
||||
vec2 aAbs = abs(a);
|
||||
|
||||
// This is the same as above, but offset by half scale.
|
||||
vec2 b = mod(p + scale * 0.5, scale) - scale * 0.5;
|
||||
vec2 bAbs = abs(b);
|
||||
|
||||
// Distance to closer edge, diagonally or horizontally.
|
||||
// Once for cell set A and once for cell set B.
|
||||
float distA = max(aAbs.x / edgeLength + aAbs.y * 0.5, aAbs.y);
|
||||
float distB = max(bAbs.x / edgeLength + bAbs.y * 0.5, bAbs.y);
|
||||
|
||||
// Minimum of both is distance to closest edge.
|
||||
float dist = 1.0 - min(distA, distB);
|
||||
|
||||
// We use the radial distance to the center for glow.
|
||||
float glow = min(dot(a, a), dot(b, b)) / 1.5;
|
||||
|
||||
// Take cell-relative coordinates from the closer cell.
|
||||
vec2 cellCoords = distA < distB ? a : b;
|
||||
|
||||
return vec4(cellCoords, dist, glow);
|
||||
}
|
||||
|
||||
void main() {
|
||||
// We simply inverse the progress for opening windows.
|
||||
float progress = uForOpening ? 1.0 - uProgress : uProgress;
|
||||
|
||||
// Add some smooth noise to the progress so that not every tile behaves the
|
||||
// same.
|
||||
float noise = simplex2D(cogl_tex_coord_in[0].st + uSeed);
|
||||
progress = clamp(mix(noise - 1.0, noise + 1.0, progress), 0.0, 1.0);
|
||||
|
||||
// glowProgress fades in in the first half of the animation, tileProgress fades
|
||||
// in in the second half.
|
||||
float glowProgress = smoothstep(0, 1, clamp(progress / 0.5, 0, 1));
|
||||
float tileProgress = smoothstep(0, 1, clamp((progress - 0.5) / 0.5, 0, 1));
|
||||
|
||||
vec2 texScale = 0.1 * uSize / uScale;
|
||||
vec4 hex = getHexagons(cogl_tex_coord_in[0].st * texScale);
|
||||
|
||||
if (tileProgress > hex.z) {
|
||||
|
||||
// Crop outer parts of the shrinking tiles.
|
||||
cogl_color_out.a = 0.0;
|
||||
|
||||
} else {
|
||||
|
||||
// Make the tiles shrink by offsetting the texture lookup towards the edge
|
||||
// of the cell.
|
||||
vec2 lookupOffset = tileProgress * hex.xy / texScale / (1.0 - tileProgress);
|
||||
cogl_color_out = texture2D(uTexture, cogl_tex_coord_in[0].st + lookupOffset);
|
||||
|
||||
// Shell.GLSLEffect uses straight alpha. So we have to convert from premultiplied.
|
||||
if (cogl_color_out.a > 0) {
|
||||
cogl_color_out.rgb /= cogl_color_out.a;
|
||||
}
|
||||
|
||||
vec4 glow = uGlowColor;
|
||||
vec4 line = uLineColor;
|
||||
|
||||
// For the glow, we accumulate a few exponentially scaled versions of hex.w.
|
||||
glow.a *= pow(hex.w, 20.0) * 10.0 + pow(hex.w, 10.0) * 5.0 + pow(hex.w, 2.0) * 0.5;
|
||||
|
||||
// Using step(uLineWidth, hex.z) would be simpler, but the below creates some
|
||||
// fake antialiasing.
|
||||
line.a *= 1.0 - smoothstep(uLineWidth * 0.02 * 0.5, uLineWidth * 0.02, hex.z);
|
||||
|
||||
// Fade in the glowing lines.
|
||||
glow.a *= glowProgress;
|
||||
line.a *= glowProgress;
|
||||
|
||||
// Do not add the hexagon lines onto transparent parts of the window.
|
||||
glow *= cogl_color_out.a;
|
||||
line *= cogl_color_out.a;
|
||||
|
||||
if (uAdditiveBlending) {
|
||||
cogl_color_out.rgb += glow.rgb * glow.a;
|
||||
cogl_color_out.rgb += line.rgb * line.a;
|
||||
} else {
|
||||
cogl_color_out.rgb = mix(cogl_color_out.rgb, glow.rgb, glow.a);
|
||||
cogl_color_out.rgb = mix(cogl_color_out.rgb, line.rgb, line.a);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
// Inject some common shader snippets. It is only possible to include glsl files from the
|
||||
// "common" directory. Also, the files in the "common" directory are not allowed to
|
||||
// include any further files.
|
||||
#include "common/uniforms.glsl"
|
||||
#include "common/noise.glsl"
|
||||
#include "common/edgeMask.glsl"
|
||||
#include "common/compositing.glsl"
|
||||
|
||||
uniform sampler2D uFontTexture;
|
||||
uniform vec3 uTrailColor;
|
||||
uniform vec3 uTipColor;
|
||||
uniform float uLetterSize;
|
||||
uniform float uRandomness;
|
||||
uniform float uOverShoot;
|
||||
|
||||
// These may be configurable in the future.
|
||||
const float EDGE_FADE = 30;
|
||||
const float FADE_WIDTH = 150;
|
||||
const float TRAIL_LENGTH = 0.2;
|
||||
const float FINAL_FADE_START_TIME = 0.8;
|
||||
const float LETTER_TILES = 16.0;
|
||||
const float LETTER_FLICKER_SPEED = 2.0;
|
||||
|
||||
// This returns a flickering grid of random letters.
|
||||
float getText(vec2 fragCoord) {
|
||||
vec2 pixelCoords = fragCoord * uSize;
|
||||
vec2 uv = mod(pixelCoords.xy, uLetterSize) / uLetterSize;
|
||||
vec2 block = pixelCoords / uLetterSize - uv;
|
||||
|
||||
// Choose random letter.
|
||||
uv += floor(hash22(floor(hash22(block) * vec2(12.9898, 78.233) +
|
||||
LETTER_FLICKER_SPEED * uTime + 42.254)) *
|
||||
LETTER_TILES);
|
||||
|
||||
return texture2D(uFontTexture, uv / LETTER_TILES).r;
|
||||
}
|
||||
|
||||
// This returns two values: The first are gradients for the "raindrops" which move
|
||||
// from top to bottom. This is used for fading the letters. The second value is set
|
||||
// to one below each drop and to zero above it. This second value is used for fading
|
||||
// the window texture.
|
||||
vec2 getRain(vec2 fragCoord) {
|
||||
float column = cogl_tex_coord_in[0].x * uSize.x;
|
||||
column -= mod(column, uLetterSize);
|
||||
|
||||
float delay = fract(sin(column) * 78.233) * mix(0.0, 1.0, uRandomness);
|
||||
float speed = fract(cos(column) * 12.989) * mix(0.0, 0.3, uRandomness) + 1.5;
|
||||
|
||||
float distToDrop = (uProgress * 2 - delay) * speed - cogl_tex_coord_in[0].y;
|
||||
|
||||
float rainAlpha = distToDrop >= 0 ? exp(-distToDrop / TRAIL_LENGTH) : 0;
|
||||
float windowAlpha = 1 - clamp(uSize.y * distToDrop, 0, FADE_WIDTH) / FADE_WIDTH;
|
||||
|
||||
// Fade at window borders.
|
||||
rainAlpha *= getAbsoluteEdgeMask(EDGE_FADE, 0.5);
|
||||
|
||||
// Add some variation to the drop start and end position.
|
||||
float shorten =
|
||||
fract(sin(column + 42.0) * 33.423) * mix(0.0, uOverShoot * 0.25, uRandomness);
|
||||
rainAlpha *= smoothstep(0, 1, clamp(cogl_tex_coord_in[0].y / shorten, 0, 1));
|
||||
rainAlpha *= smoothstep(0, 1, clamp((1.0 - cogl_tex_coord_in[0].y) / shorten, 0, 1));
|
||||
|
||||
if (uForOpening) {
|
||||
windowAlpha = 1.0 - windowAlpha;
|
||||
}
|
||||
|
||||
return vec2(rainAlpha, windowAlpha);
|
||||
}
|
||||
|
||||
void main() {
|
||||
vec2 coords = cogl_tex_coord_in[0].st;
|
||||
coords.y = coords.y * (uOverShoot + 1.0) - uOverShoot * 0.5;
|
||||
|
||||
// Get a cool matrix effect. See comments for those methods above.
|
||||
vec2 rainMask = getRain(coords);
|
||||
float textMask = getText(coords);
|
||||
|
||||
// Get the window texture.
|
||||
cogl_color_out = texture2D(uTexture, coords);
|
||||
|
||||
// Shell.GLSLEffect uses straight alpha. So we have to convert from premultiplied.
|
||||
if (cogl_color_out.a > 0) {
|
||||
cogl_color_out.rgb /= cogl_color_out.a;
|
||||
}
|
||||
|
||||
// Fade the window according to the effect mask.
|
||||
cogl_color_out.a *= rainMask.y;
|
||||
|
||||
// This is used to fade out the remaining trails in the end.
|
||||
float finalFade =
|
||||
1 - clamp((uProgress - FINAL_FADE_START_TIME) / (1 - FINAL_FADE_START_TIME), 0, 1);
|
||||
float rainAlpha = finalFade * rainMask.x;
|
||||
|
||||
// Add the matrix effect to the window.
|
||||
vec4 text = vec4(mix(uTrailColor, uTipColor, min(1, pow(rainAlpha + 0.1, 4))),
|
||||
rainAlpha * textMask);
|
||||
cogl_color_out = alphaOver(cogl_color_out, text);
|
||||
|
||||
// These are pretty useful for understanding how this works.
|
||||
// cogl_color_out = vec4(vec3(textMask), 1);
|
||||
// cogl_color_out = vec4(vec3(rainMask.x), 1);
|
||||
// cogl_color_out = vec4(vec3(rainMask.y), 1);
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
// Inject some common shader snippets. It is only possible to include glsl files from the
|
||||
// "common" directory. Also, the files in the "common" directory are not allowed to
|
||||
// include any further files.
|
||||
#include "common/uniforms.glsl"
|
||||
#include "common/noise.glsl"
|
||||
#include "common/math2D.glsl"
|
||||
|
||||
uniform sampler2D uDustTexture;
|
||||
uniform vec4 uDustColor;
|
||||
uniform vec2 uSeed;
|
||||
uniform float uDustScale;
|
||||
|
||||
const float DUST_LAYERS = 4;
|
||||
const float GROW_INTENSITY = 0.05;
|
||||
const float SHRINK_INTENSITY = 0.05;
|
||||
const float WIND_INTENSITY = 0.05;
|
||||
const float ACTOR_SCALE = 1.2;
|
||||
const float PADDING = ACTOR_SCALE / 2.0 - 0.5;
|
||||
|
||||
void main() {
|
||||
// We simply inverse the progress for opening windows.
|
||||
float progress = uForOpening ? uProgress : 1.0 - uProgress;
|
||||
|
||||
float gradient = cogl_tex_coord_in[0].t * ACTOR_SCALE - PADDING;
|
||||
progress = 2.0 - gradient - 2.0 * progress;
|
||||
progress = progress + 0.25 - 0.5 * simplex2D((cogl_tex_coord_in[0].st + uSeed) * 2.0);
|
||||
progress = pow(max(0, progress), 2.0);
|
||||
|
||||
// This may help you to understand how this effect works.
|
||||
// cogl_color_out = vec4(progress, 0, 0, 0);
|
||||
// return;
|
||||
|
||||
cogl_color_out = vec4(0, 0, 0, 0);
|
||||
|
||||
for (float i = 0; i < DUST_LAYERS; ++i) {
|
||||
|
||||
// Create a random direction.
|
||||
float factor = DUST_LAYERS == 1 ? 0 : i / (DUST_LAYERS - 1);
|
||||
float angle = 123.123 * (uSeed.x + factor);
|
||||
vec2 direction = vec2(1.0, 0.0);
|
||||
direction = rotate(direction, angle);
|
||||
|
||||
// Flip direction for one side of the window.
|
||||
vec2 coords = cogl_tex_coord_in[0].st * ACTOR_SCALE - PADDING - 0.5;
|
||||
if (getWinding(direction, coords) > 0) {
|
||||
direction *= -1;
|
||||
}
|
||||
|
||||
// Flip direction for half the layers.
|
||||
if (factor > 0.5) {
|
||||
direction *= -1;
|
||||
}
|
||||
|
||||
// We grow the layer along the random direction, shrink it orthogonally to it
|
||||
// and scale it up slightly.
|
||||
float dist = distToLine(vec2(0.0), direction, coords);
|
||||
vec2 grow = direction * dist * mix(0, GROW_INTENSITY, progress);
|
||||
vec2 shrink =
|
||||
vec2(direction.y, -direction.x) * dist * mix(0, SHRINK_INTENSITY, progress);
|
||||
float scale = mix(1.0, 1.05, factor * progress);
|
||||
coords = (coords + grow + shrink) / scale;
|
||||
|
||||
// Add some wind.
|
||||
coords.x += WIND_INTENSITY * progress * (uForOpening ? 1.0 : -1.0);
|
||||
|
||||
// Now check wether there is actually something in the current dust layer at
|
||||
// the coords position.
|
||||
vec2 dustCoords = (coords + uSeed) * uSize / uDustScale / 100.0;
|
||||
vec2 dustMap = texture2D(uDustTexture, dustCoords).rg;
|
||||
float dustGroup = floor(dustMap.g * DUST_LAYERS * 0.999);
|
||||
|
||||
if (dustGroup == i) {
|
||||
|
||||
// Get the window color.
|
||||
vec4 windowColor = texture2D(uTexture, coords + 0.5);
|
||||
|
||||
// Shell.GLSLEffect uses straight alpha. So we have to convert from premultiplied.
|
||||
if (windowColor.a > 0) {
|
||||
windowColor.rgb /= windowColor.a;
|
||||
}
|
||||
|
||||
// Fade the window color to uDustColor.
|
||||
vec3 dustColor = mix(windowColor.rgb, uDustColor.rgb, uDustColor.a);
|
||||
windowColor.rgb = mix(windowColor.rgb, dustColor, progress);
|
||||
|
||||
// Dissolve and blend the layers.
|
||||
if (dustMap.x - progress > 0) {
|
||||
cogl_color_out = windowColor;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
// Inject some common shader snippets. It is only possible to include glsl files from the
|
||||
// "common" directory. Also, the files in the "common" directory are not allowed to
|
||||
// include any further files.
|
||||
#include "common/uniforms.glsl"
|
||||
#include "common/noise.glsl"
|
||||
#include "common/compositing.glsl"
|
||||
#include "common/easing.glsl"
|
||||
|
||||
// See assets/README.md for how this texture was created.
|
||||
uniform sampler2D uClawTexture;
|
||||
uniform vec4 uFlashColor;
|
||||
uniform vec2 uSeed;
|
||||
uniform float uClawSize;
|
||||
uniform float uNumClaws;
|
||||
uniform float uWarpIntensity;
|
||||
|
||||
const float FLASH_INTENSITY = 0.1;
|
||||
const float MAX_SPAWN_TIME =
|
||||
0.6; // Scratches will only start in the first half of the animation.
|
||||
const float FF_TIME = 0.6; // Relative time for the final fade to transparency.
|
||||
|
||||
// This method generates a grid of randomly rotated, slightly shifted and scaled
|
||||
// UV squares. It returns the texture coords of the UV square at the given actor
|
||||
// coordinates. If these do not fall into one of the UV grids, the coordinates of
|
||||
// the closest UV grid will be clamped and returned.
|
||||
vec2 getClawUV(vec2 texCoords, float gridScale, vec2 seed) {
|
||||
|
||||
// Shift coordinates by a random offset and make sure the have a 1:1 aspect ratio.
|
||||
vec2 coords = texCoords + hash22(seed);
|
||||
coords *= uSize.x < uSize.y ? vec2(1.0, 1.0 * uSize.y / uSize.x)
|
||||
: vec2(1.0 * uSize.x / uSize.y, 1.0);
|
||||
|
||||
// Apply global scale.
|
||||
coords *= gridScale;
|
||||
|
||||
// Get grid cell coordinates in [0..1].
|
||||
vec2 cellUV = mod(coords, vec2(1));
|
||||
|
||||
// This is unique for each cell.
|
||||
vec2 cellID = coords - cellUV + vec2(362.456);
|
||||
|
||||
// Add random rotation, scale and offset to each grid cell.
|
||||
float scale = mix(0.8, 1.0, hash12(cellID * seed * 134.451));
|
||||
float offsetX = mix(0.0, 1.0 - scale, hash12(cellID * seed * 54.4129));
|
||||
float offsetY = mix(0.0, 1.0 - scale, hash12(cellID * seed * 25.3089));
|
||||
float rotation = mix(0.0, 2.0 * 3.141, hash12(cellID * seed * 2.99837));
|
||||
|
||||
cellUV -= vec2(offsetX, offsetY);
|
||||
cellUV /= scale;
|
||||
|
||||
cellUV -= 0.5;
|
||||
cellUV = vec2(cellUV.x * cos(rotation) - cellUV.y * sin(rotation),
|
||||
cellUV.x * sin(rotation) + cellUV.y * cos(rotation));
|
||||
cellUV += 0.5;
|
||||
|
||||
// Clamp resulting coordinates.
|
||||
return clamp(cellUV, vec2(0), vec2(1));
|
||||
}
|
||||
|
||||
void main() {
|
||||
float progress = uForOpening ? 1.0 - easeOutQuad(uProgress) : easeOutQuad(uProgress);
|
||||
|
||||
// Warp the texture coordinates to create a blow-up effect.
|
||||
vec2 coords = cogl_tex_coord_in[0].st * 2.0 - 1.0;
|
||||
float dist = length(coords);
|
||||
coords = (coords / dist * pow(dist, 1.0 + uWarpIntensity)) * 0.5 + 0.5;
|
||||
coords = mix(cogl_tex_coord_in[0].st, coords, progress);
|
||||
|
||||
// Scale down the window according to the warp.
|
||||
float scale = 0.5 * uWarpIntensity * (1.0 - progress);
|
||||
coords = coords * (scale + 1.0) - scale * 0.5;
|
||||
|
||||
// Accumulate several random scratches. The color in the scratch map refers to the
|
||||
// relative time when the respective part will become invisible. Therefore we can
|
||||
// add a value to make the scratch appear later.
|
||||
float scratchMap = 1.0;
|
||||
for (int i = 0; i < uNumClaws; ++i) {
|
||||
vec2 uv = getClawUV(coords, 1.0 / uClawSize, uSeed * (i + 1));
|
||||
float delay = i / uNumClaws * MAX_SPAWN_TIME;
|
||||
scratchMap = min(scratchMap, clamp(texture2D(uClawTexture, uv).r + delay, 0, 1));
|
||||
}
|
||||
|
||||
// Get the window texture. We shift the texture lookup by the local derivative of
|
||||
// the claw texture in order to mimic some folding distortion.
|
||||
vec2 offset = vec2(dFdx(scratchMap), dFdy(scratchMap)) * progress * 0.5;
|
||||
cogl_color_out = texture2D(uTexture, coords + offset);
|
||||
|
||||
// Shell.GLSLEffect uses straight alpha. So we have to convert from premultiplied.
|
||||
if (cogl_color_out.a > 0) {
|
||||
cogl_color_out.rgb /= cogl_color_out.a;
|
||||
}
|
||||
|
||||
// Add colorful flashes.
|
||||
float flashIntensity = 1.0 / FLASH_INTENSITY * (scratchMap - progress) + 1;
|
||||
if (flashIntensity < 0 || flashIntensity >= 1) {
|
||||
flashIntensity = 0;
|
||||
}
|
||||
|
||||
// Hide flashes where there is now window.
|
||||
vec4 flash = uFlashColor;
|
||||
flash.a *= flashIntensity * cogl_color_out.a * (1.0 - progress);
|
||||
|
||||
// Hide scratched out parts.
|
||||
cogl_color_out.a *= (scratchMap > progress ? 1 : 0);
|
||||
|
||||
// Add flash color.
|
||||
cogl_color_out = alphaOver(cogl_color_out, flash);
|
||||
|
||||
// Fade out the remaining shards.
|
||||
float fadeProgress = smoothstep(0, 1, (progress - 1.0 + FF_TIME) / FF_TIME);
|
||||
cogl_color_out.a *= sqrt(1 - fadeProgress * fadeProgress);
|
||||
|
||||
// These are pretty useful for understanding how this works.
|
||||
// cogl_color_out = vec4(vec3(flashIntensity), 1);
|
||||
// cogl_color_out = vec4(vec3(scratchMap), 1);
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
// Inject some common shader snippets. It is only possible to include glsl files from the
|
||||
// "common" directory. Also, the files in the "common" directory are not allowed to
|
||||
// include any further files.
|
||||
#include "common/uniforms.glsl"
|
||||
#include "common/easing.glsl"
|
||||
|
||||
uniform vec3 uColor;
|
||||
|
||||
const float BLUR_WIDTH = 0.01; // Width of the gradients.
|
||||
const float TB_TIME = 0.7; // Relative time for the top/bottom animation.
|
||||
const float LR_TIME = 0.4; // Relative time for the left/right animation.
|
||||
const float LR_DELAY = 0.6; // Delay after which the left/right animation starts.
|
||||
const float FF_TIME = 0.1; // Relative time for the final fade to transparency.
|
||||
const float SCALING = 0.5; // Additional vertical scaling of the window.
|
||||
|
||||
void main() {
|
||||
float progress = uForOpening ? 1.0 - easeOutQuad(uProgress) : easeOutQuad(uProgress);
|
||||
|
||||
// Scale down the window vertically.
|
||||
float scale = 1.0 / mix(1.0, SCALING, progress) - 1.0;
|
||||
vec2 coords = cogl_tex_coord_in[0].st;
|
||||
coords.y = coords.y * (scale + 1.0) - scale * 0.5;
|
||||
|
||||
// All of these are in [0..1] during the different stages of the animation.
|
||||
// tb refers to the top-bottom animation.
|
||||
// lr refers to the left-right animation.
|
||||
// ff refers to the final fade animation.
|
||||
float tbProgress = smoothstep(0, 1, clamp(progress / TB_TIME, 0, 1));
|
||||
float lrProgress = smoothstep(0, 1, clamp((progress - LR_DELAY) / LR_TIME, 0, 1));
|
||||
float ffProgress = smoothstep(0, 1, clamp((progress - 1.0 + FF_TIME) / FF_TIME, 0, 1));
|
||||
|
||||
// This is a top-center-bottom gradient in [0..1..0]
|
||||
float tb = coords.y * 2;
|
||||
tb = tb < 1 ? tb : 2 - tb;
|
||||
|
||||
// This is a left-center-right gradient in [0..1..0]
|
||||
float lr = coords.x * 2;
|
||||
lr = lr < 1 ? lr : 2 - lr;
|
||||
|
||||
// Combine the progress values with the gradients to create the alpha masks.
|
||||
float tbMask = 1 - smoothstep(0, 1, clamp((tbProgress - tb) / BLUR_WIDTH, 0, 1));
|
||||
float lrMask = 1 - smoothstep(0, 1, clamp((lrProgress - lr) / BLUR_WIDTH, 0, 1));
|
||||
float ffMask = 1 - smoothstep(0, 1, ffProgress);
|
||||
|
||||
// Assemble the final alpha value.
|
||||
float mask = tbMask * lrMask * ffMask;
|
||||
|
||||
cogl_color_out = texture2D(uTexture, coords);
|
||||
|
||||
// Shell.GLSLEffect uses straight alpha. So we have to convert from premultiplied.
|
||||
if (cogl_color_out.a > 0) {
|
||||
cogl_color_out.rgb /= cogl_color_out.a;
|
||||
}
|
||||
|
||||
cogl_color_out.rgb =
|
||||
mix(cogl_color_out.rgb, uColor * cogl_color_out.a, smoothstep(0, 1, progress));
|
||||
cogl_color_out.a *= mask;
|
||||
|
||||
// These are pretty useful for understanding how this works.
|
||||
// cogl_color_out = vec4(vec3(tbMask), 1);
|
||||
// cogl_color_out = vec4(vec3(lrMask), 1);
|
||||
// cogl_color_out = vec4(vec3(ffMask), 1);
|
||||
// cogl_color_out = vec4(vec3(mask), 1);
|
||||
}
|
||||
@@ -0,0 +1,107 @@
|
||||
// Inject some common shader snippets. It is only possible to include glsl files from the
|
||||
// "common" directory. Also, the files in the "common" directory are not allowed to
|
||||
// include any further files.
|
||||
#include "common/uniforms.glsl"
|
||||
#include "common/noise.glsl"
|
||||
#include "common/edgeMask.glsl"
|
||||
#include "common/compositing.glsl"
|
||||
#include "common/easing.glsl"
|
||||
|
||||
uniform vec2 uSeed;
|
||||
uniform vec3 uColor;
|
||||
uniform float uScale;
|
||||
|
||||
const float WISPS_RADIUS = 20.0;
|
||||
const float WISPS_SPEED = 10.0;
|
||||
const float WISPS_SPACING = 40 + WISPS_RADIUS;
|
||||
const int WISPS_LAYERS = 8;
|
||||
const float WISPS_IN_TIME = 0.5;
|
||||
const float WINDOW_OUT_TIME = 1.0;
|
||||
const float SCALING = 0.9;
|
||||
|
||||
// Returns a grid of randomly moving points. Each grid cell contains one point which
|
||||
// moves on an ellipse.
|
||||
float getWisps(vec2 texCoords, float gridSize, vec2 seed) {
|
||||
|
||||
// Shift coordinates by a random offset and make sure the have a 1:1 aspect ratio.
|
||||
vec2 coords = (texCoords + hash22(seed)) * uSize;
|
||||
|
||||
// Apply global scale.
|
||||
coords /= gridSize;
|
||||
|
||||
// Get grid cell coordinates in [0..1].
|
||||
vec2 cellUV = mod(coords, vec2(1));
|
||||
|
||||
// This is unique for each cell.
|
||||
vec2 cellID = coords - cellUV + vec2(362.456);
|
||||
|
||||
// Add random rotation, scale and offset to each grid cell.
|
||||
float speed = mix(10.0, 15.0, hash12(cellID * seed * 134.451)) / gridSize * WISPS_SPEED;
|
||||
float rotation = mix(0.0, 6.283, hash12(cellID * seed * 54.4129));
|
||||
float radius = mix(0.5, 1.0, hash12(cellID * seed * 19.1249)) * WISPS_RADIUS;
|
||||
float roundness = mix(-1.0, 1.0, hash12(cellID * seed * 7.51949));
|
||||
|
||||
vec2 offset = vec2(sin(speed * (uTime + 1)) * roundness, cos(speed * (uTime + 1)));
|
||||
offset *= 0.5 - 0.5 * radius / gridSize;
|
||||
offset = vec2(offset.x * cos(rotation) - offset.y * sin(rotation),
|
||||
offset.x * sin(rotation) + offset.y * cos(rotation));
|
||||
|
||||
cellUV += offset;
|
||||
|
||||
// Use distance to center of shifted / rotated UV coordinates to draw a glaring point.
|
||||
float dist = length(cellUV - 0.5) * gridSize / radius;
|
||||
if (dist < 1.0) {
|
||||
return min(5, 0.01 / pow(dist, 2.0));
|
||||
}
|
||||
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
void main() {
|
||||
float progress = uForOpening ? 1.0 - easeOutQuad(uProgress) : easeOutQuad(uProgress);
|
||||
|
||||
// Scale down the window slightly.
|
||||
float scale = 1.0 / mix(1.0, SCALING, progress) - 1.0;
|
||||
vec2 coords = cogl_tex_coord_in[0].st * (scale + 1.0) - scale * 0.5;
|
||||
|
||||
// Get the color of the window.
|
||||
cogl_color_out = texture2D(uTexture, coords);
|
||||
|
||||
// Shell.GLSLEffect uses straight alpha. So we have to convert from premultiplied.
|
||||
if (cogl_color_out.a > 0) {
|
||||
cogl_color_out.rgb /= cogl_color_out.a;
|
||||
}
|
||||
|
||||
// Compute several layers of moving wisps.
|
||||
vec2 uv = (cogl_tex_coord_in[0].st - 0.5) / mix(1.0, 0.5, progress) + 0.5;
|
||||
uv /= uScale;
|
||||
float wisps = 0;
|
||||
for (int i = 0; i < WISPS_LAYERS; ++i) {
|
||||
wisps += getWisps(uv * 0.3, WISPS_SPACING, uSeed * (i + 1));
|
||||
}
|
||||
|
||||
// Compute shrinking edge mask.
|
||||
float mask = getRelativeEdgeMask(mix(0.01, 0.5, progress));
|
||||
|
||||
// Compute three different progress values.
|
||||
float wispsIn = smoothstep(0, 1, clamp(progress / WISPS_IN_TIME, 0, 1));
|
||||
float wispsOut =
|
||||
smoothstep(0, 1, clamp((progress - WISPS_IN_TIME) / (1.0 - WISPS_IN_TIME), 0, 1));
|
||||
float windowOut = smoothstep(0, 1, clamp(progress / WINDOW_OUT_TIME, 0, 1));
|
||||
|
||||
// Use a noise function to dissolve the window.
|
||||
float noise = smoothstep(1.0, 0.0, abs(2.0 * simplex2DFractal(uv * uSize / 250) - 1.0));
|
||||
float windowMask = 1.0 - (windowOut < 0.5 ? mix(0.0, noise, windowOut * 2.0)
|
||||
: mix(noise, 1.0, windowOut * 2.0 - 1.0));
|
||||
cogl_color_out.a *= windowMask * mask;
|
||||
|
||||
// Add the wisps.
|
||||
vec4 wispColor = wisps * vec4(uColor, min(wispsIn, 1.0 - wispsOut) * mask);
|
||||
cogl_color_out = alphaOver(cogl_color_out, wispColor);
|
||||
|
||||
// These are pretty useful for understanding how this works.
|
||||
// cogl_color_out = vec4(vec3(windowMask), 1.0);
|
||||
// cogl_color_out = vec4(vec3(wisps), 1.0);
|
||||
// cogl_color_out = vec4(vec3(noise), 1.0);
|
||||
// cogl_color_out = vec4(vec3(mask*min(wispsIn, 1.0 - wispsOut)), 1.0);
|
||||
}
|
||||
@@ -0,0 +1,304 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface domain="burn-my-windows">
|
||||
|
||||
<object class="GtkAdjustment" id="apparition-animation-time">
|
||||
<property name="upper">2000</property>
|
||||
<property name="lower">100</property>
|
||||
<property name="step-increment">10</property>
|
||||
<property name="page-increment">100</property>
|
||||
</object>
|
||||
|
||||
<object class="GtkAdjustment" id="apparition-randomness">
|
||||
<property name="upper">1</property>
|
||||
<property name="lower">0</property>
|
||||
<property name="step-increment">0.01</property>
|
||||
<property name="page-increment">0.1</property>
|
||||
</object>
|
||||
|
||||
<object class="GtkAdjustment" id="apparition-twirl-intensity">
|
||||
<property name="upper">10</property>
|
||||
<property name="lower">-10</property>
|
||||
<property name="step-increment">0.1</property>
|
||||
<property name="page-increment">1</property>
|
||||
</object>
|
||||
|
||||
<object class="GtkAdjustment" id="apparition-shake-intensity">
|
||||
<property name="upper">10</property>
|
||||
<property name="lower">0</property>
|
||||
<property name="step-increment">0.1</property>
|
||||
<property name="page-increment">1</property>
|
||||
</object>
|
||||
|
||||
<object class="GtkAdjustment" id="apparition-suction-intensity">
|
||||
<property name="upper">1</property>
|
||||
<property name="lower">0</property>
|
||||
<property name="step-increment">0.01</property>
|
||||
<property name="page-increment">0.1</property>
|
||||
</object>
|
||||
|
||||
<object class="GtkBox" id="apparition-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">apparition-animation-time</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-apparition-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">Randomness</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">apparition-randomness</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-apparition-randomness">
|
||||
<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">Twirl Intensity</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">apparition-twirl-intensity</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-apparition-twirl-intensity">
|
||||
<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">Shake Intensity</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">apparition-shake-intensity</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-apparition-shake-intensity">
|
||||
<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">Suction Intensity</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">apparition-suction-intensity</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-apparition-suction-intensity">
|
||||
<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>
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
<object class="GtkAdjustment" id="energize-a-animation-time">
|
||||
<property name="upper">10000</property>
|
||||
<property name="lower">500</property>
|
||||
<property name="step-increment">10</property>
|
||||
<property name="lower">100</property>
|
||||
<property name="step-increment">1</property>
|
||||
<property name="page-increment">100</property>
|
||||
</object>
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
<object class="GtkAdjustment" id="energize-b-animation-time">
|
||||
<property name="upper">10000</property>
|
||||
<property name="lower">500</property>
|
||||
<property name="step-increment">10</property>
|
||||
<property name="lower">100</property>
|
||||
<property name="step-increment">1</property>
|
||||
<property name="page-increment">100</property>
|
||||
</object>
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
<object class="GtkAdjustment" id="fire-animation-time">
|
||||
<property name="upper">10000</property>
|
||||
<property name="lower">500</property>
|
||||
<property name="step-increment">10</property>
|
||||
<property name="lower">100</property>
|
||||
<property name="step-increment">1</property>
|
||||
<property name="page-increment">100</property>
|
||||
</object>
|
||||
|
||||
|
||||
@@ -0,0 +1,340 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface domain="burn-my-windows">
|
||||
|
||||
<object class="GtkAdjustment" id="hexagon-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>
|
||||
|
||||
<object class="GtkAdjustment" id="hexagon-scale">
|
||||
<property name="upper">10</property>
|
||||
<property name="lower">0.1</property>
|
||||
<property name="step-increment">0.01</property>
|
||||
<property name="page-increment">0.1</property>
|
||||
</object>
|
||||
|
||||
<object class="GtkAdjustment" id="hexagon-line-width">
|
||||
<property name="upper">10</property>
|
||||
<property name="lower">0</property>
|
||||
<property name="step-increment">0.1</property>
|
||||
<property name="page-increment">1</property>
|
||||
</object>
|
||||
|
||||
<object class="GtkBox" id="hexagon-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">hexagon-animation-time</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-hexagon-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">Scale</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">hexagon-scale</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-hexagon-scale">
|
||||
<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">Mesh Line Width</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">hexagon-line-width</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-hexagon-line-width">
|
||||
<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">Line 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="hexagon-line-color">
|
||||
<property name="use_alpha">1</property>
|
||||
<property name="show_editor">1</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-hexagon-line-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>
|
||||
|
||||
<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">Glow 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="hexagon-glow-color">
|
||||
<property name="use_alpha">1</property>
|
||||
<property name="show_editor">1</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-hexagon-glow-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>
|
||||
|
||||
<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="GtkBox">
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">3</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="label" translatable="yes">Additive Blending</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="GtkLabel">
|
||||
<property name="label" translatable="yes">You may want to enable this for dark window themes.</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="hexpand">1</property>
|
||||
<style>
|
||||
<class name="dim-label" />
|
||||
<class name="caption" />
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSwitch" id="hexagon-additive-blending">
|
||||
<property name="halign">end</property>
|
||||
<property name="valign">center</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-hexagon-additive-blending">
|
||||
<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>
|
||||
@@ -2,9 +2,9 @@
|
||||
<interface domain="burn-my-windows">
|
||||
|
||||
<object class="GtkAdjustment" id="tv-animation-time">
|
||||
<property name="upper">5000</property>
|
||||
<property name="upper">10000</property>
|
||||
<property name="lower">100</property>
|
||||
<property name="step-increment">10</property>
|
||||
<property name="step-increment">1</property>
|
||||
<property name="page-increment">100</property>
|
||||
</object>
|
||||
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
|
||||
<object class="GtkAdjustment" id="wisps-animation-time">
|
||||
<property name="upper">10000</property>
|
||||
<property name="lower">500</property>
|
||||
<property name="step-increment">10</property>
|
||||
<property name="lower">100</property>
|
||||
<property name="step-increment">1</property>
|
||||
<property name="page-increment">100</property>
|
||||
</object>
|
||||
|
||||
|
||||
@@ -0,0 +1,255 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface domain="burn-my-windows">
|
||||
|
||||
<object class="GtkBox" id="apparition-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="apparition-animation-time">
|
||||
<property name="upper">2000</property>
|
||||
<property name="lower">100</property>
|
||||
<property name="step-increment">10</property>
|
||||
<property name="page-increment">100</property>
|
||||
</object>
|
||||
</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-apparition-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">Randomness</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="apparition-randomness">
|
||||
<property name="upper">1</property>
|
||||
<property name="lower">0</property>
|
||||
<property name="step-increment">0.01</property>
|
||||
<property name="page-increment">0.1</property>
|
||||
</object>
|
||||
</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-apparition-randomness">
|
||||
<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">Twirl Intensity</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="apparition-twirl-intensity">
|
||||
<property name="upper">10</property>
|
||||
<property name="lower">-10</property>
|
||||
<property name="step-increment">0.1</property>
|
||||
<property name="page-increment">1</property>
|
||||
</object>
|
||||
</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-apparition-twirl-intensity">
|
||||
<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">Shake Intensity</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="apparition-shake-intensity">
|
||||
<property name="upper">10</property>
|
||||
<property name="lower">0</property>
|
||||
<property name="step-increment">0.1</property>
|
||||
<property name="page-increment">1</property>
|
||||
</object>
|
||||
</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-apparition-shake-intensity">
|
||||
<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">Suction Intensity</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="apparition-suction-intensity">
|
||||
<property name="upper">1</property>
|
||||
<property name="lower">0</property>
|
||||
<property name="step-increment">0.01</property>
|
||||
<property name="page-increment">0.1</property>
|
||||
</object>
|
||||
</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-apparition-suction-intensity">
|
||||
<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>
|
||||
@@ -39,8 +39,8 @@
|
||||
<property name="adjustment">
|
||||
<object class="GtkAdjustment" id="broken-glass-animation-time">
|
||||
<property name="upper">10000</property>
|
||||
<property name="lower">500</property>
|
||||
<property name="step-increment">10</property>
|
||||
<property name="lower">100</property>
|
||||
<property name="step-increment">1</property>
|
||||
<property name="page-increment">100</property>
|
||||
</object>
|
||||
</property>
|
||||
|
||||
@@ -39,8 +39,8 @@
|
||||
<property name="adjustment">
|
||||
<object class="GtkAdjustment" id="energize-a-animation-time">
|
||||
<property name="upper">10000</property>
|
||||
<property name="lower">500</property>
|
||||
<property name="step-increment">10</property>
|
||||
<property name="lower">100</property>
|
||||
<property name="step-increment">1</property>
|
||||
<property name="page-increment">100</property>
|
||||
</object>
|
||||
</property>
|
||||
|
||||
@@ -39,8 +39,8 @@
|
||||
<property name="adjustment">
|
||||
<object class="GtkAdjustment" id="energize-b-animation-time">
|
||||
<property name="upper">10000</property>
|
||||
<property name="lower">500</property>
|
||||
<property name="step-increment">10</property>
|
||||
<property name="lower">100</property>
|
||||
<property name="step-increment">1</property>
|
||||
<property name="page-increment">100</property>
|
||||
</object>
|
||||
</property>
|
||||
|
||||
@@ -64,8 +64,8 @@
|
||||
<property name="adjustment">
|
||||
<object class="GtkAdjustment" id="fire-animation-time">
|
||||
<property name="upper">10000</property>
|
||||
<property name="lower">500</property>
|
||||
<property name="step-increment">10</property>
|
||||
<property name="lower">100</property>
|
||||
<property name="step-increment">1</property>
|
||||
<property name="page-increment">100</property>
|
||||
</object>
|
||||
</property>
|
||||
|
||||
@@ -0,0 +1,284 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface domain="burn-my-windows">
|
||||
|
||||
<object class="GtkBox" id="hexagon-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="hexagon-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-hexagon-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">Scale</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="hexagon-scale">
|
||||
<property name="upper">10</property>
|
||||
<property name="lower">0.1</property>
|
||||
<property name="step-increment">0.01</property>
|
||||
<property name="page-increment">0.1</property>
|
||||
</object>
|
||||
</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-hexagon-scale">
|
||||
<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">Mesh Line Width</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="hexagon-line-width">
|
||||
<property name="upper">10</property>
|
||||
<property name="lower">0</property>
|
||||
<property name="step-increment">0.1</property>
|
||||
<property name="page-increment">1</property>
|
||||
</object>
|
||||
</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-hexagon-line-width">
|
||||
<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">Line 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="hexagon-line-color">
|
||||
<property name="use_alpha">1</property>
|
||||
<property name="show_editor">1</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-hexagon-line-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>
|
||||
|
||||
<child>
|
||||
<object class="GtkListBoxRow">
|
||||
<property name="activatable">0</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="label" translatable="yes">Glow 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="hexagon-glow-color">
|
||||
<property name="use_alpha">1</property>
|
||||
<property name="show_editor">1</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-hexagon-glow-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>
|
||||
|
||||
<child>
|
||||
<object class="GtkListBoxRow">
|
||||
<property name="activatable">0</property>
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="orientation">vertical</property>
|
||||
<property name="spacing">3</property>
|
||||
<child>
|
||||
<object class="GtkLabel">
|
||||
<property name="label" translatable="yes">Additive Blending</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="GtkLabel">
|
||||
<property name="label" translatable="yes">You may want to enable this for dark window themes.</property>
|
||||
<property name="xalign">0</property>
|
||||
<property name="halign">start</property>
|
||||
<property name="valign">center</property>
|
||||
<property name="hexpand">1</property>
|
||||
<style>
|
||||
<class name="dim-label" />
|
||||
<class name="caption" />
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkSwitch" id="hexagon-additive-blending">
|
||||
<property name="halign">end</property>
|
||||
<property name="valign">center</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-hexagon-additive-blending">
|
||||
<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>
|
||||
@@ -39,8 +39,8 @@
|
||||
<property name="adjustment">
|
||||
<object class="GtkAdjustment" id="matrix-animation-time">
|
||||
<property name="upper">10000</property>
|
||||
<property name="lower">500</property>
|
||||
<property name="step-increment">10</property>
|
||||
<property name="lower">100</property>
|
||||
<property name="step-increment">1</property>
|
||||
<property name="page-increment">100</property>
|
||||
</object>
|
||||
</property>
|
||||
|
||||
@@ -0,0 +1,151 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<interface>
|
||||
|
||||
<object class="GtkBox" id="snap-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="snap-animation-time">
|
||||
<property name="upper">10000</property>
|
||||
<property name="lower">500</property>
|
||||
<property name="step-increment">10</property>
|
||||
<property name="page-increment">100</property>
|
||||
</object>
|
||||
</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-snap-animation-time">
|
||||
<property name="icon-name">edit-clear-symbolic</property>
|
||||
<property name="tooltip-text">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">Scale</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="snap-scale">
|
||||
<property name="upper">20</property>
|
||||
<property name="lower">0.1</property>
|
||||
<property name="step-increment">0.01</property>
|
||||
<property name="page-increment">0.1</property>
|
||||
</object>
|
||||
</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-snap-scale">
|
||||
<property name="icon-name">edit-clear-symbolic</property>
|
||||
<property name="tooltip-text">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="snap-color">
|
||||
<property name="use_alpha">1</property>
|
||||
<property name="show_editor">1</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="reset-snap-color">
|
||||
<property name="icon-name">edit-clear-symbolic</property>
|
||||
<property name="tooltip-text">Reset to Default Value</property>
|
||||
<style>
|
||||
<class name="flat" />
|
||||
</style>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
|
||||
|
||||
</object>
|
||||
|
||||
</interface>
|
||||
@@ -39,8 +39,8 @@
|
||||
<property name="adjustment">
|
||||
<object class="GtkAdjustment" id="trex-animation-time">
|
||||
<property name="upper">10000</property>
|
||||
<property name="lower">500</property>
|
||||
<property name="step-increment">10</property>
|
||||
<property name="lower">100</property>
|
||||
<property name="step-increment">1</property>
|
||||
<property name="page-increment">100</property>
|
||||
</object>
|
||||
</property>
|
||||
|
||||
@@ -38,9 +38,9 @@
|
||||
<property name="width-request">300</property>
|
||||
<property name="adjustment">
|
||||
<object class="GtkAdjustment" id="tv-animation-time">
|
||||
<property name="upper">5000</property>
|
||||
<property name="upper">10000</property>
|
||||
<property name="lower">100</property>
|
||||
<property name="step-increment">10</property>
|
||||
<property name="step-increment">1</property>
|
||||
<property name="page-increment">100</property>
|
||||
</object>
|
||||
</property>
|
||||
|
||||
@@ -39,8 +39,8 @@
|
||||
<property name="adjustment">
|
||||
<object class="GtkAdjustment" id="wisps-animation-time">
|
||||
<property name="upper">10000</property>
|
||||
<property name="lower">500</property>
|
||||
<property name="step-increment">10</property>
|
||||
<property name="lower">100</property>
|
||||
<property name="step-increment">1</property>
|
||||
<property name="page-increment">100</property>
|
||||
</object>
|
||||
</property>
|
||||
|
||||
@@ -31,6 +31,52 @@
|
||||
<description>If set to true, all animations will show only one still frame to allow for continuous integration tests.</description>
|
||||
</key>
|
||||
|
||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
||||
<!-- Apparition Effect Options -->
|
||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
||||
|
||||
<key name="apparition-open-effect" type="b">
|
||||
<default>false</default>
|
||||
<summary>Apparition Open Effect</summary>
|
||||
<description>Use the apparition effect for window openeing.</description>
|
||||
</key>
|
||||
|
||||
<key name="apparition-close-effect" type="b">
|
||||
<default>false</default>
|
||||
<summary>Apparition Close Effect</summary>
|
||||
<description>Use the apparition effect for window closing.</description>
|
||||
</key>
|
||||
|
||||
<key name="apparition-animation-time" type="i">
|
||||
<default>300</default>
|
||||
<summary>Apparition Animation Time</summary>
|
||||
<description>The time the apparition effect takes.</description>
|
||||
</key>
|
||||
|
||||
<key name="apparition-randomness" type="d">
|
||||
<default>0.5</default>
|
||||
<summary>Apparition Randomness</summary>
|
||||
<description>The amount of randomness of the apparition effect.</description>
|
||||
</key>
|
||||
|
||||
<key name="apparition-twirl-intensity" type="d">
|
||||
<default>5.0</default>
|
||||
<summary>Apparition Twirl Intensity</summary>
|
||||
<description>The amount of twirling of the apparition effect.</description>
|
||||
</key>
|
||||
|
||||
<key name="apparition-shake-intensity" type="d">
|
||||
<default>3.0</default>
|
||||
<summary>Apparition Shake Intensity</summary>
|
||||
<description>The amount of shaking of the apparition effect.</description>
|
||||
</key>
|
||||
|
||||
<key name="apparition-suction-intensity" type="d">
|
||||
<default>0.75</default>
|
||||
<summary>Apparition Suction Intensity</summary>
|
||||
<description>The amount of suction of the apparition effect.</description>
|
||||
</key>
|
||||
|
||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
||||
<!-- Fire Options -->
|
||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
||||
@@ -227,6 +273,58 @@
|
||||
<description>Number of claw scratches drawn on top of each other.</description>
|
||||
</key>
|
||||
|
||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
||||
<!-- Hexagon Options -->
|
||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
||||
|
||||
<key name="hexagon-close-effect" type="b">
|
||||
<default>false</default>
|
||||
<summary>Hexagon Close Effect</summary>
|
||||
<description>Use the Hexagon effect for window closing.</description>
|
||||
</key>
|
||||
|
||||
<key name="hexagon-open-effect" type="b">
|
||||
<default>false</default>
|
||||
<summary>Hexagon Open Effect</summary>
|
||||
<description>Use the Hexagon effect for window opening.</description>
|
||||
</key>
|
||||
|
||||
<key name="hexagon-animation-time" type="i">
|
||||
<default>1500</default>
|
||||
<summary>Hexagon Animation Time</summary>
|
||||
<description>The time the Hexagon effect takes.</description>
|
||||
</key>
|
||||
|
||||
<key name="hexagon-scale" type="d">
|
||||
<default>3.0</default>
|
||||
<summary>Hexagon Scale</summary>
|
||||
<description>The size of the effect.</description>
|
||||
</key>
|
||||
|
||||
<key name="hexagon-line-width" type="d">
|
||||
<default>2.0</default>
|
||||
<summary>Hexagon Line Width</summary>
|
||||
<description>The width of the lines.</description>
|
||||
</key>
|
||||
|
||||
<key name="hexagon-line-color" type="s">
|
||||
<default>"rgba(200, 255, 255, 0.5)"</default>
|
||||
<summary>Hexagon Line Color</summary>
|
||||
<description>The color of the lines.</description>
|
||||
</key>
|
||||
|
||||
<key name="hexagon-glow-color" type="s">
|
||||
<default>"rgba(20, 80, 255, 0.5)"</default>
|
||||
<summary>Hexagon Glow Color</summary>
|
||||
<description>The color of the glow effect.</description>
|
||||
</key>
|
||||
|
||||
<key name="hexagon-additive-blending" type="b">
|
||||
<default>true</default>
|
||||
<summary>Hexagon Additive Blending</summary>
|
||||
<description>Use additive blending for the line and the glow.</description>
|
||||
</key>
|
||||
|
||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
||||
<!-- Energize A Options -->
|
||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
||||
@@ -375,6 +473,40 @@
|
||||
<description>Use the pointer location for the broken glass effect.</description>
|
||||
</key>
|
||||
|
||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
||||
<!-- Snap of Disintegration Effect Options -->
|
||||
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
|
||||
|
||||
<key name="snap-open-effect" type="b">
|
||||
<default>false</default>
|
||||
<summary>Snap Open Effect</summary>
|
||||
<description>Use the snap effect for window openeing.</description>
|
||||
</key>
|
||||
|
||||
<key name="snap-close-effect" type="b">
|
||||
<default>false</default>
|
||||
<summary>Snap Close Effect</summary>
|
||||
<description>Use the snap effect for window closing.</description>
|
||||
</key>
|
||||
|
||||
<key name="snap-animation-time" type="i">
|
||||
<default>1500</default>
|
||||
<summary>Snap Animation Time</summary>
|
||||
<description>The time the snap effect takes.</description>
|
||||
</key>
|
||||
|
||||
<key name="snap-scale" type="d">
|
||||
<default>3.0</default>
|
||||
<summary>Snap Scale</summary>
|
||||
<description>The size of the snap effect.</description>
|
||||
</key>
|
||||
|
||||
<key name="snap-color" type="s">
|
||||
<default>"rgb(50, 40, 35)"</default>
|
||||
<summary>Snap Effect Color</summary>
|
||||
<description>The color of the dust.</description>
|
||||
</key>
|
||||
|
||||
</schema>
|
||||
|
||||
</schemalist>
|
||||
@@ -32,7 +32,7 @@ cd "$( cd "$( dirname "$0" )" && pwd )/.." || \
|
||||
|
||||
# Run cloc - this counts code lines, blank lines and comment lines for the specified
|
||||
# languages. We are only interested in the summary, therefore the tail -1
|
||||
SUMMARY="$(cloc . --include-lang="JavaScript" --md | tail -1)"
|
||||
SUMMARY="$(cloc . --include-lang="JavaScript,GLSL" --md | tail -1)"
|
||||
|
||||
# The $SUMMARY is one line of a markdown table and looks like this:
|
||||
# SUM:|101|3123|2238|10783
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// ) ( //
|
||||
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
|
||||
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
|
||||
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
|
||||
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
|
||||
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
|
||||
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
|
||||
// |__/ //
|
||||
// Copyright (c) 2021 Simon Schneegans //
|
||||
// Released under the GPLv3 or later. See LICENSE file for details. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
'use strict';
|
||||
|
||||
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 hides the actor by violently sucking it into the void of magic. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// 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 Apparition = 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) => {
|
||||
// Store uniform locations of newly created shaders.
|
||||
shader._uSeed = shader.get_uniform_location('uSeed');
|
||||
shader._uShake = shader.get_uniform_location('uShake');
|
||||
shader._uTwirl = shader.get_uniform_location('uTwirl');
|
||||
shader._uSuction = shader.get_uniform_location('uSuction');
|
||||
shader._uRandomness = shader.get_uniform_location('uRandomness');
|
||||
|
||||
// Write all uniform values at the start of each animation.
|
||||
shader.connect('begin-animation', (shader, settings) => {
|
||||
// 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._uShake, 1, [settings.get_double('apparition-shake-intensity')]);
|
||||
shader.set_uniform_float(shader._uTwirl, 1, [settings.get_double('apparition-twirl-intensity')]);
|
||||
shader.set_uniform_float(shader._uSuction, 1, [settings.get_double('apparition-suction-intensity')]);
|
||||
shader.set_uniform_float(shader._uRandomness, 1, [settings.get_double('apparition-randomness')]);
|
||||
// clang-format on
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------- metadata
|
||||
|
||||
// The effect is not available on GNOME Shell 3.36 as it requires scaling of the window
|
||||
// actor.
|
||||
getMinShellVersion() {
|
||||
return [3, 38];
|
||||
}
|
||||
|
||||
// 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 'apparition';
|
||||
}
|
||||
|
||||
// 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 _('Apparition');
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------- 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.getGTKString()}/Apparition.ui`);
|
||||
|
||||
// Bind all properties.
|
||||
dialog.bindAdjustment('apparition-randomness');
|
||||
dialog.bindAdjustment('apparition-animation-time');
|
||||
dialog.bindAdjustment('apparition-twirl-intensity');
|
||||
dialog.bindAdjustment('apparition-shake-intensity');
|
||||
dialog.bindAdjustment('apparition-suction-intensity');
|
||||
|
||||
// Finally, return the new settings page.
|
||||
return dialog.getBuilder().get_object('apparition-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: 2.0, y: 2.0};
|
||||
}
|
||||
}
|
||||
@@ -13,33 +13,114 @@
|
||||
|
||||
'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 shatters the window into pieces. For an explanation how this works, look //
|
||||
// further down in this file into the documentation of the Shader class. 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. //
|
||||
// This shader creates a complex-looking effect with rather simple means. Here is how //
|
||||
// it works: The window is drawn five times on top of each other (see the SHARD_LAYERS //
|
||||
// constant in the GLSL code). Each layer only draws some of the shards, all layers //
|
||||
// combined make up the entire window. The layers are then scaled, rotated, and moved //
|
||||
// independently from each other - this creates the impression that all shards are //
|
||||
// moving independently. In reality, there are only five groups of shards! Which shard //
|
||||
// belongs to which layer is defined by the green channel of the texture //
|
||||
// resources/img/shards.png. The red channel of the texture contains the distance to //
|
||||
// the shard edges. This information is used to fade out the shards. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// The shader class for this effect is registered further down in this file.
|
||||
let Shader = null;
|
||||
// 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 BrokenGlass = class {
|
||||
|
||||
// The effect class is completely static. It 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 BrokenGlass = class BrokenGlass {
|
||||
// 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._shardTexture) {
|
||||
const shardData = GdkPixbuf.Pixbuf.new_from_resource('/img/shards.png');
|
||||
this._shardTexture = new Clutter.Image();
|
||||
this._shardTexture.set_data(shardData.get_pixels(), Cogl.PixelFormat.RGB_888,
|
||||
shardData.width, shardData.height,
|
||||
shardData.rowstride);
|
||||
}
|
||||
|
||||
// Store all uniform locations.
|
||||
shader._uShardTexture = shader.get_uniform_location('uShardTexture');
|
||||
shader._uSeed = shader.get_uniform_location('uSeed');
|
||||
shader._uEpicenter = shader.get_uniform_location('uEpicenter');
|
||||
shader._uShardScale = shader.get_uniform_location('uShardScale');
|
||||
shader._uBlowForce = shader.get_uniform_location('uBlowForce');
|
||||
shader._uGravity = shader.get_uniform_location('uGravity');
|
||||
|
||||
// And update all uniforms at the start of each animation.
|
||||
shader.connect('begin-animation', (shader, settings, forOpening, actor) => {
|
||||
// Usually, the shards fly away from the center of the window.
|
||||
let epicenterX = 0.5;
|
||||
let epicenterY = 0.5;
|
||||
|
||||
// However, if this option is set, we use the mouse pointer position.
|
||||
if (!forOpening && settings.get_boolean('broken-glass-use-pointer')) {
|
||||
const [x, y] = global.get_pointer();
|
||||
const [ok, localX, localY] = actor.transform_stage_point(x, y);
|
||||
|
||||
if (ok) {
|
||||
epicenterX = localX / actor.width;
|
||||
epicenterY = localY / actor.height;
|
||||
}
|
||||
}
|
||||
|
||||
// If we are currently performing integration test, the animation uses 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._uEpicenter, 2, [epicenterX, epicenterY]);
|
||||
shader.set_uniform_float(shader._uShardScale, 1, [settings.get_double('broken-glass-scale')]);
|
||||
shader.set_uniform_float(shader._uBlowForce, 1, [settings.get_double('broken-glass-blow-force')]);
|
||||
shader.set_uniform_float(shader._uGravity, 1, [settings.get_double('broken-glass-gravity')]);
|
||||
// clang-format on
|
||||
});
|
||||
|
||||
// This is required to bind the shard 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 shard texture.
|
||||
pipeline.set_layer_texture(1, this._shardTexture.get_texture());
|
||||
pipeline.set_layer_wrap_mode(1, Cogl.PipelineWrapMode.REPEAT);
|
||||
pipeline.set_uniform_1i(shader._uShardTexture, 1);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------- metadata
|
||||
|
||||
// This effect is only available on GNOME Shell 40+.
|
||||
static getMinShellVersion() {
|
||||
getMinShellVersion() {
|
||||
return [40, 0];
|
||||
}
|
||||
|
||||
@@ -47,22 +128,21 @@ var BrokenGlass = class BrokenGlass {
|
||||
// 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').
|
||||
static getNick() {
|
||||
getNick() {
|
||||
return 'broken-glass';
|
||||
}
|
||||
|
||||
// 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.
|
||||
static getLabel() {
|
||||
getLabel() {
|
||||
return _('Broken Glass');
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------- API for prefs.js
|
||||
|
||||
// This is called by the preferences dialog. It loads the settings page for this effect,
|
||||
// binds all properties to the settings and appends the page to the main stack of the
|
||||
// preferences dialog.
|
||||
static getPreferences(dialog) {
|
||||
// and binds all properties to the settings.
|
||||
getPreferences(dialog) {
|
||||
|
||||
// Add the settings page to the builder.
|
||||
dialog.getBuilder().add_from_resource('/ui/gtk4/BrokenGlass.ui');
|
||||
@@ -80,166 +160,10 @@ var BrokenGlass = class BrokenGlass {
|
||||
|
||||
// ---------------------------------------------------------------- API for extension.js
|
||||
|
||||
// This is called from extension.js whenever a window is closed with this effect.
|
||||
static createShader(actor, settings, forOpening) {
|
||||
return new Shader(actor, settings, forOpening);
|
||||
}
|
||||
|
||||
// The tweakTransition() is called from extension.js to tweak a window's open / close
|
||||
// transitions - usually windows are faded in / out and scaled up / down by GNOME Shell.
|
||||
// The parameter 'forOpening' is set to true if this is called for a window-open
|
||||
// transition, for a window-close transition it is set to false. The modes can be set to
|
||||
// any value from here: https://gjs-docs.gnome.org/clutter8~8_api/clutter.animationmode.
|
||||
// The only required property is 'opacity', even if it transitions from 1.0 to 1.0. The
|
||||
// current value of the opacity transition is passed as uProgress to the shader.
|
||||
// Tweaking the actor's scale during the transition only works properly for GNOME 3.38+.
|
||||
|
||||
// For this effect, windows are set to twice their original size, so that
|
||||
// we have some space to draw the shards. We also set the animation mode to "Linear".
|
||||
static tweakTransition(actor, settings, forOpening) {
|
||||
return {
|
||||
'opacity': {from: 255, to: 255, mode: 1},
|
||||
'scale-x': {from: 2.0, to: 2.0, mode: 1},
|
||||
'scale-y': {from: 2.0, to: 2.0, mode: 1}
|
||||
};
|
||||
// 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: 2.0, y: 2.0};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// The shader class for this effect will only be registered in GNOME Shell's process //
|
||||
// (not in the preferences process). It's done this way as Clutter may not be installed //
|
||||
// on the system and therefore the preferences would crash. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
if (utils.isInShellProcess()) {
|
||||
|
||||
const {Clutter, GdkPixbuf, Cogl} = imports.gi;
|
||||
const shaderSnippets = Me.imports.src.shaderSnippets;
|
||||
|
||||
// This shader creates a complex-looking effect with rather simple means. Here is how it
|
||||
// works: The window is drawn five times on top of each other (see the SHARD_LAYERS
|
||||
// constant in the GLSL code). Each layer only draws some of the shards, all layers
|
||||
// combined make up the entire window. The layers are then scaled, rotated, and moved
|
||||
// independently from each other - this creates the impression that all shards are
|
||||
// moving independently. In reality, there are only five groups of shards! Which shard
|
||||
// belongs to which layer is defined by the green channel of the texture
|
||||
// resources/img/shards.png. The red channel of the texture contains the distance to the
|
||||
// shard edges. This information is used to fade out the shards.
|
||||
Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect {
|
||||
_init(actor, settings, forOpening) {
|
||||
super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
|
||||
|
||||
// Load the shards texture. As the shader is re-created for each window animation,
|
||||
// this texture is also re-created each time. This could be improved in the future!
|
||||
const shardData = GdkPixbuf.Pixbuf.new_from_resource('/img/shards.png');
|
||||
this._shardTexture = new Clutter.Image();
|
||||
this._shardTexture.set_data(shardData.get_pixels(), Cogl.PixelFormat.RGB_888,
|
||||
shardData.width, shardData.height, shardData.rowstride);
|
||||
|
||||
// Usually, the shards fly away from the center of the window.
|
||||
let epicenterX = 0.5;
|
||||
let epicenterY = 0.5;
|
||||
|
||||
// However, if this option is set, we use the mouse pointer position.
|
||||
if (settings.get_boolean('broken-glass-use-pointer')) {
|
||||
const [x, y] = global.get_pointer();
|
||||
const [ok, localX, localY] = actor.transform_stage_point(x, y);
|
||||
epicenterX = localX / actor.width;
|
||||
epicenterY = localY / actor.height;
|
||||
}
|
||||
|
||||
// If we are currently performing integration test, the animation uses a fixed seed.
|
||||
const testMode = settings.get_boolean('test-mode');
|
||||
|
||||
this.set_shader_source(`
|
||||
|
||||
// Inject some common shader snippets.
|
||||
${shaderSnippets.standardUniforms()}
|
||||
|
||||
uniform sampler2D uShardTexture;
|
||||
|
||||
const vec2 SEED = vec2(${testMode ? 0 : Math.random()},
|
||||
${testMode ? 0 : Math.random()});
|
||||
const float SHARD_SCALE = ${settings.get_double('broken-glass-scale')};
|
||||
const float SHARD_LAYERS = 5;
|
||||
const float BLOW_FORCE = ${settings.get_double('broken-glass-blow-force')};
|
||||
const float ACTOR_SCALE = 2.0;
|
||||
const float PADDING = ACTOR_SCALE / 2.0 - 0.5;
|
||||
const vec2 EPICENTER = vec2(${epicenterX}, ${epicenterY});
|
||||
const float GRAVITY = ${forOpening ? '-1.0' : '1.0'} *
|
||||
${settings.get_double('broken-glass-gravity')};
|
||||
|
||||
void main() {
|
||||
|
||||
cogl_color_out = vec4(0, 0, 0, 0);
|
||||
|
||||
float progress = ${forOpening ? '1.0-uProgress' : 'uProgress'};
|
||||
|
||||
// Draw the individual shard layers.
|
||||
for (float i=0; i<SHARD_LAYERS; ++i) {
|
||||
|
||||
// To enable drawing shards outside of the window bounds, the actor was scaled
|
||||
// by ACTOR_SCALE. Here we scale and move the texture coordinates so that the
|
||||
// window gets drawn at the correct position again.
|
||||
vec2 coords = cogl_tex_coord_in[0].st * ACTOR_SCALE - PADDING;
|
||||
|
||||
// Scale and rotate around our epicenter.
|
||||
coords -= EPICENTER;
|
||||
|
||||
// Scale each layer a bit differently.
|
||||
coords /= mix(1.0, 1.0 + BLOW_FORCE*(i+2)/SHARD_LAYERS, progress);
|
||||
|
||||
// Rotate each layer a bit differently.
|
||||
float rotation = (mod(i, 2.0)-0.5)*0.2*progress;
|
||||
coords = vec2(coords.x * cos(rotation) - coords.y * sin(rotation),
|
||||
coords.x * sin(rotation) + coords.y * cos(rotation));
|
||||
|
||||
// Move down each layer a bit.
|
||||
float gravity = GRAVITY*0.1*(i+1)*progress*progress;
|
||||
coords += vec2(0, gravity);
|
||||
|
||||
// Restore correct position.
|
||||
coords += EPICENTER;
|
||||
|
||||
// Retrieve information from the shard texture for our layer.
|
||||
vec2 shardCoords = (coords + SEED) * vec2(uSizeX, uSizeY) / SHARD_SCALE / 500.0;
|
||||
vec2 shardMap = texture2D(uShardTexture, shardCoords).rg;
|
||||
|
||||
// The green channel contains a random value in [0..1] for each shard. We
|
||||
// discretize this into SHARD_LAYERS bins and check if our layer falls into
|
||||
// the bin of the current shard.
|
||||
float shardGroup = floor(shardMap.g * SHARD_LAYERS * 0.999);
|
||||
|
||||
if (shardGroup == i) {
|
||||
vec4 windowColor = texture2D(uTexture, coords);
|
||||
|
||||
// Dissolve the shard by using distance information from the red channel.
|
||||
float dissolve = (shardMap.x - pow(progress+0.1, 2)) > 0 ? 1: 0;
|
||||
cogl_color_out = mix(cogl_color_out, windowColor, dissolve);
|
||||
}
|
||||
}
|
||||
}
|
||||
`);
|
||||
};
|
||||
|
||||
// This is overridden to bind the shard 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
|
||||
vfunc_paint_target(node, paint_context) {
|
||||
const pipeline = this.get_pipeline();
|
||||
|
||||
// Use linear filtering for the window texture.
|
||||
pipeline.set_layer_filters(0, Cogl.PipelineFilter.LINEAR,
|
||||
Cogl.PipelineFilter.LINEAR);
|
||||
|
||||
// Bind the shard texture.
|
||||
pipeline.set_layer_texture(1, this._shardTexture.get_texture());
|
||||
pipeline.set_layer_wrap_mode(1, Cogl.PipelineWrapMode.REPEAT);
|
||||
this.set_uniform_value('uShardTexture', 1);
|
||||
|
||||
super.vfunc_paint_target(node, paint_context);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -20,23 +20,48 @@ 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 looks a bit like the transporter effect from TOS. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// The shader class for this effect is registered further down in this file.
|
||||
let Shader = null;
|
||||
// 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 EnergizeA = class {
|
||||
|
||||
// The effect class is completely static. It 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 EnergizeA = class EnergizeA {
|
||||
// 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._uColor = shader.get_uniform_location('uColor');
|
||||
shader._uScale = shader.get_uniform_location('uScale');
|
||||
|
||||
// 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('energize-a-color'))[1];
|
||||
|
||||
// clang-format off
|
||||
shader.set_uniform_float(shader._uColor, 3, [c.red / 255, c.green / 255, c.blue / 255]);
|
||||
shader.set_uniform_float(shader._uScale, 1, [settings.get_double('energize-a-scale')]);
|
||||
// clang-format on
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------- metadata
|
||||
|
||||
// The effect is available on all GNOME Shell versions supported by this extension.
|
||||
static getMinShellVersion() {
|
||||
getMinShellVersion() {
|
||||
return [3, 36];
|
||||
}
|
||||
|
||||
@@ -44,22 +69,21 @@ var EnergizeA = class EnergizeA {
|
||||
// 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').
|
||||
static getNick() {
|
||||
getNick() {
|
||||
return 'energize-a';
|
||||
}
|
||||
|
||||
// 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.
|
||||
static getLabel() {
|
||||
getLabel() {
|
||||
return _('Energize A');
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------- API for prefs.js
|
||||
|
||||
// This is called by the preferences dialog. It loads the settings page for this effect,
|
||||
// binds all properties to the settings and appends the page to the main stack of the
|
||||
// preferences dialog.
|
||||
static getPreferences(dialog) {
|
||||
// and binds all properties to the settings.
|
||||
getPreferences(dialog) {
|
||||
|
||||
// Add the settings page to the builder.
|
||||
dialog.getBuilder().add_from_resource(`/ui/${utils.getGTKString()}/EnergizeA.ui`);
|
||||
@@ -75,134 +99,10 @@ var EnergizeA = class EnergizeA {
|
||||
|
||||
// ---------------------------------------------------------------- API for extension.js
|
||||
|
||||
// This is called from extension.js whenever a window is closed with this effect.
|
||||
static createShader(actor, settings, forOpening) {
|
||||
return new Shader(settings, forOpening);
|
||||
// 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};
|
||||
}
|
||||
|
||||
// The tweakTransition() is called from extension.js to tweak a window's open / close
|
||||
// transitions - usually windows are faded in / out and scaled up / down by GNOME Shell.
|
||||
// The parameter 'forOpening' is set to true if this is called for a window-open
|
||||
// transition, for a window-close transition it is set to false. The modes can be set to
|
||||
// any value from here: https://gjs-docs.gnome.org/clutter8~8_api/clutter.animationmode.
|
||||
// The only required property is 'opacity', even if it transitions from 1.0 to 1.0. The
|
||||
// current value of the opacity transition is passed as uProgress to the shader.
|
||||
// Tweaking the actor's scale during the transition only works properly for GNOME 3.38+.
|
||||
|
||||
// For this effect, windows should neither be scaled nor faded.
|
||||
static tweakTransition(actor, settings, forOpening) {
|
||||
return {
|
||||
'opacity': {from: 255, to: 255, mode: 3},
|
||||
'scale-x': {from: 1.0, to: 1.0, mode: 3},
|
||||
'scale-y': {from: 1.0, to: 1.0, mode: 3}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// The shader class for this effect will only be registered in GNOME Shell's process //
|
||||
// (not in the preferences process). It's done this way as Clutter may not be installed //
|
||||
// on the system and therefore the preferences would crash. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
if (utils.isInShellProcess()) {
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const shaderSnippets = Me.imports.src.shaderSnippets;
|
||||
|
||||
Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect {
|
||||
_init(settings, forOpening) {
|
||||
super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
|
||||
|
||||
const color = Clutter.Color.from_string(settings.get_string('energize-a-color'))[1];
|
||||
|
||||
// If we are currently performing integration test, the animation uses a fixed seed.
|
||||
const testMode = settings.get_boolean('test-mode');
|
||||
|
||||
this.set_shader_source(`
|
||||
|
||||
// Inject some common shader snippets.
|
||||
${shaderSnippets.standardUniforms()}
|
||||
${shaderSnippets.noise()}
|
||||
${shaderSnippets.edgeMask()}
|
||||
|
||||
const vec2 SEED = vec2(${testMode ? 0 : Math.random()},
|
||||
${testMode ? 0 : Math.random()});
|
||||
const float FADE_IN_TIME = 0.3;
|
||||
const float FADE_OUT_TIME = 0.6;
|
||||
const float HEART_FADE_TIME = 0.3;
|
||||
const float EDGE_FADE_WIDTH = 50;
|
||||
|
||||
// This method returns two values:
|
||||
// result.x: A mask for the particles.
|
||||
// result.y: The opacity of the fading window.
|
||||
vec2 getMasks() {
|
||||
float fadeInProgress = clamp(uProgress/FADE_IN_TIME, 0, 1);
|
||||
float fadeOutProgress = clamp((uProgress-FADE_IN_TIME)/FADE_OUT_TIME, 0, 1);
|
||||
float heartProgress = clamp((uProgress-(1.0-HEART_FADE_TIME))/HEART_FADE_TIME, 0, 1);
|
||||
|
||||
// Compute mask for the "atom" particles.
|
||||
float dist = length(cogl_tex_coord_in[0].st - 0.5) * 4.0;
|
||||
float atomMask = smoothstep(0.0, 1.0, (fadeInProgress * 2.0 - dist + 1.0));
|
||||
atomMask *= fadeInProgress;
|
||||
atomMask *= smoothstep(1.0, 0.0, fadeOutProgress);
|
||||
|
||||
// Fade-out the masks at the window edges.
|
||||
float edgeFade = getAbsoluteEdgeMask(EDGE_FADE_WIDTH);
|
||||
atomMask *= edgeFade;
|
||||
|
||||
float heartMask = getRelativeEdgeMask(0.5);
|
||||
heartMask = 3.0 * pow(heartMask, 5);
|
||||
heartMask *= fadeOutProgress;
|
||||
heartMask *= 1.0 - heartProgress;
|
||||
atomMask = clamp(heartMask+atomMask, 0, 1);
|
||||
|
||||
// Compute fading window opacity.
|
||||
float windowMask = pow(1.0 - fadeOutProgress, 2.0);
|
||||
|
||||
#if ${forOpening ? '1' : '0'}
|
||||
windowMask = 1.0 - windowMask;
|
||||
#endif
|
||||
|
||||
return vec2(atomMask, windowMask);
|
||||
}
|
||||
|
||||
void main() {
|
||||
|
||||
vec2 masks = getMasks();
|
||||
vec4 windowColor = texture2D(uTexture, cogl_tex_coord_in[0].st);
|
||||
vec3 effectColor = vec3(${color.red / 255},
|
||||
${color.green / 255},
|
||||
${color.blue / 255});
|
||||
|
||||
// Dissolve window to effect color / transparency.
|
||||
cogl_color_out = mix(vec4(effectColor, 1.0) * windowColor.a, windowColor, 0.2 * masks.y + 0.8) * masks.y;
|
||||
|
||||
vec2 scaledUV = (cogl_tex_coord_in[0].st-0.5) * (1.0 + 0.1*uProgress);
|
||||
scaledUV /= ${settings.get_double('energize-a-scale')};
|
||||
|
||||
// Add molecule particles.
|
||||
vec2 uv = scaledUV + vec2(0, 0.1*uTime);
|
||||
uv *= 0.010598 * vec2(0.5*uSizeX, uSizeY);
|
||||
float particles = 0.2 * pow((simplex3D(vec3(uv, 0.0*uTime))), 3.0);
|
||||
|
||||
// Add more molecule particles.
|
||||
for (int i=1; i<=3;++i) {
|
||||
vec2 uv = scaledUV * 0.12154 / pow(1.5, i) * vec2(uSizeX, uSizeY);
|
||||
float atoms = simplex3D(vec3(uv, 2.0*uTime/i));
|
||||
particles += 0.5 * pow(0.2 * (1.0 / (1.0 - atoms)-1.0), 2);
|
||||
}
|
||||
|
||||
cogl_color_out.rgb += effectColor * particles * masks.x;
|
||||
|
||||
// These are pretty useful for understanding how this works.
|
||||
// cogl_color_out = vec4(masks, 0.0, 1.0);
|
||||
// cogl_color_out = vec4(vec3(masks.x), 1.0);
|
||||
// cogl_color_out = vec4(vec3(masks.y), 1.0);
|
||||
// cogl_color_out = vec4(vec3(particles), 1.0);
|
||||
}
|
||||
`);
|
||||
};
|
||||
});
|
||||
}
|
||||
@@ -20,23 +20,49 @@ 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 looks a bit like the transporter effect from TNG. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// The shader class for this effect is registered further down in this file.
|
||||
let Shader = null;
|
||||
// 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 EnergizeB = 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._uColor = shader.get_uniform_location('uColor');
|
||||
shader._uScale = shader.get_uniform_location('uScale');
|
||||
|
||||
// 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('energize-b-color'))[1];
|
||||
|
||||
// clang-format off
|
||||
shader.set_uniform_float(shader._uColor, 3, [c.red / 255, c.green / 255, c.blue / 255]);
|
||||
shader.set_uniform_float(shader._uScale, 1, [settings.get_double('energize-b-scale')]);
|
||||
// clang-format on
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// The effect class is completely static. It 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 EnergizeB = class EnergizeB {
|
||||
|
||||
// ---------------------------------------------------------------------------- metadata
|
||||
|
||||
// The effect is available on all GNOME Shell versions supported by this extension.
|
||||
static getMinShellVersion() {
|
||||
getMinShellVersion() {
|
||||
return [3, 36];
|
||||
}
|
||||
|
||||
@@ -44,22 +70,21 @@ var EnergizeB = class EnergizeB {
|
||||
// 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').
|
||||
static getNick() {
|
||||
getNick() {
|
||||
return 'energize-b';
|
||||
}
|
||||
|
||||
// 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.
|
||||
static getLabel() {
|
||||
getLabel() {
|
||||
return _('Energize B');
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------- API for prefs.js
|
||||
|
||||
// This is called by the preferences dialog. It loads the settings page for this effect,
|
||||
// binds all properties to the settings and appends the page to the main stack of the
|
||||
// preferences dialog.
|
||||
static getPreferences(dialog) {
|
||||
// and binds all properties to the settings.
|
||||
getPreferences(dialog) {
|
||||
|
||||
// Add the settings page to the builder.
|
||||
dialog.getBuilder().add_from_resource(`/ui/${utils.getGTKString()}/EnergizeB.ui`);
|
||||
@@ -75,157 +100,10 @@ var EnergizeB = class EnergizeB {
|
||||
|
||||
// ---------------------------------------------------------------- API for extension.js
|
||||
|
||||
// This is called from extension.js whenever a window is closed with this effect.
|
||||
static createShader(actor, settings, forOpening) {
|
||||
return new Shader(settings, forOpening);
|
||||
}
|
||||
|
||||
// The tweakTransition() is called from extension.js to tweak a window's open / close
|
||||
// transitions - usually windows are faded in / out and scaled up / down by GNOME Shell.
|
||||
// The parameter 'forOpening' is set to true if this is called for a window-open
|
||||
// transition, for a window-close transition it is set to false. The modes can be set to
|
||||
// any value from here: https://gjs-docs.gnome.org/clutter8~8_api/clutter.animationmode.
|
||||
// The only required property is 'opacity', even if it transitions from 1.0 to 1.0. The
|
||||
// current value of the opacity transition is passed as uProgress to the shader.
|
||||
// Tweaking the actor's scale during the transition only works properly for GNOME 3.38+.
|
||||
|
||||
// For this effect, windows should neither be scaled nor faded.
|
||||
static tweakTransition(actor, settings, forOpening) {
|
||||
return {
|
||||
'opacity': {from: 255, to: 255, mode: 3},
|
||||
'scale-x': {from: 1.0, to: 1.0, mode: 3},
|
||||
'scale-y': {from: 1.0, to: 1.0, mode: 3}
|
||||
};
|
||||
// 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};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// The shader class for this effect will only be registered in GNOME Shell's process //
|
||||
// (not in the preferences process). It's done this way as Clutter may not be installed //
|
||||
// on the system and therefore the preferences would crash. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
if (utils.isInShellProcess()) {
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const shaderSnippets = Me.imports.src.shaderSnippets;
|
||||
|
||||
Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect {
|
||||
_init(settings, forOpening) {
|
||||
super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
|
||||
|
||||
const color = Clutter.Color.from_string(settings.get_string('energize-b-color'))[1];
|
||||
|
||||
// If we are currently performing integration test, the animation uses a fixed seed.
|
||||
const testMode = settings.get_boolean('test-mode');
|
||||
|
||||
this.set_shader_source(`
|
||||
|
||||
// Inject some common shader snippets.
|
||||
${shaderSnippets.standardUniforms()}
|
||||
${shaderSnippets.noise()}
|
||||
${shaderSnippets.edgeMask()}
|
||||
|
||||
const vec2 SEED = vec2(${testMode ? 0 : Math.random()},
|
||||
${testMode ? 0 : Math.random()});
|
||||
const float SHOWER_TIME = 0.3;
|
||||
const float SHOWER_WIDTH = 0.3;
|
||||
const float STREAK_TIME = 0.6;
|
||||
const float EDGE_FADE = 50;
|
||||
const float SCALE = ${settings.get_double('energize-b-scale')};
|
||||
|
||||
// This method returns four values:
|
||||
// result.x: A mask for the particles which lead the shower.
|
||||
// result.y: A mask for the streaks which follow the shower particles.
|
||||
// result.z: A mask for the final "atom" particles.
|
||||
// result.w: The opacity of the fading window.
|
||||
vec4 getMasks() {
|
||||
float showerProgress = uProgress/SHOWER_TIME;
|
||||
float streakProgress = clamp((uProgress-SHOWER_TIME)/STREAK_TIME, 0, 1);
|
||||
float fadeProgress = clamp((uProgress-SHOWER_TIME)/(1.0 - SHOWER_TIME), 0, 1);
|
||||
|
||||
// Gradient from top to bottom.
|
||||
float t = cogl_tex_coord_in[0].t;
|
||||
|
||||
// A smooth gradient which moves to the bottom within the showerProgress.
|
||||
float showerMask = smoothstep(1, 0, abs(showerProgress - t - SHOWER_WIDTH) / SHOWER_WIDTH);
|
||||
|
||||
// This is 1 above the streak mask.
|
||||
float streakMask = (showerProgress - t - SHOWER_WIDTH) > 0 ? 1 : 0;
|
||||
|
||||
// Compute mask for the "atom" particles.
|
||||
float atomMask = getRelativeEdgeMask(0.2);
|
||||
atomMask = max(0, atomMask - showerMask);
|
||||
atomMask *= streakMask;
|
||||
atomMask *= sqrt(1-fadeProgress*fadeProgress);
|
||||
|
||||
// Make some particles visible in the streaks.
|
||||
showerMask += 0.05 * streakMask;
|
||||
|
||||
// Add shower mask to streak mask.
|
||||
streakMask = max(streakMask, showerMask);
|
||||
|
||||
// Fade-out the masks at the window edges.
|
||||
float edgeFade = getAbsoluteEdgeMask(EDGE_FADE);
|
||||
streakMask *= edgeFade;
|
||||
showerMask *= edgeFade;
|
||||
|
||||
// Fade-out the masks from top to bottom.
|
||||
float fade = smoothstep(0.0, 1.0, 1.0 + t - 2.0 * streakProgress);
|
||||
streakMask *= fade;
|
||||
showerMask *= fade;
|
||||
|
||||
// Compute fading window opacity.
|
||||
float windowMask = pow(1.0 - fadeProgress, 2.0);
|
||||
|
||||
#if ${forOpening ? '1' : '0'}
|
||||
windowMask = 1.0 - windowMask;
|
||||
#endif
|
||||
|
||||
return vec4(showerMask, streakMask, atomMask, windowMask);
|
||||
}
|
||||
|
||||
void main() {
|
||||
|
||||
vec4 masks = getMasks();
|
||||
vec4 windowColor = texture2D(uTexture, cogl_tex_coord_in[0].st);
|
||||
vec3 effectColor = vec3(${color.red / 255},
|
||||
${color.green / 255},
|
||||
${color.blue / 255});
|
||||
|
||||
// Dissolve window to effect color / transparency.
|
||||
cogl_color_out = mix(vec4(effectColor, 1.0) * windowColor.a, windowColor, 0.5 * masks.w + 0.5) * masks.w;
|
||||
|
||||
// Add leading shower particles.
|
||||
vec2 showerUV = cogl_tex_coord_in[0].st + vec2(0, -0.7*uProgress/SHOWER_TIME);
|
||||
showerUV *= 0.02 * vec2(uSizeX, uSizeY) / SCALE;
|
||||
float shower = pow(simplex2D(showerUV), 10.0);
|
||||
cogl_color_out.rgb += effectColor * shower * masks.x;
|
||||
|
||||
// Add trailing streak lines.
|
||||
vec2 streakUV = cogl_tex_coord_in[0].st + vec2(0, -uProgress/SHOWER_TIME);
|
||||
streakUV *= vec2(0.05 * uSizeX, 0.001 * uSizeY) / SCALE;
|
||||
float streaks = simplex2DFractal(streakUV) * 0.5;
|
||||
cogl_color_out.rgb += effectColor * streaks * masks.y;
|
||||
|
||||
// Add glimmering atoms.
|
||||
vec2 atomUV = cogl_tex_coord_in[0].st + vec2(0, -0.025*uProgress/SHOWER_TIME);
|
||||
atomUV *= 0.2 * vec2(uSizeX, uSizeY) / SCALE;
|
||||
float atoms = pow((simplex3D(vec3(atomUV, uTime))), 5.0);
|
||||
cogl_color_out.rgb += effectColor * atoms * masks.z;
|
||||
|
||||
// These are pretty useful for understanding how this works.
|
||||
// cogl_color_out = vec4(masks.rgb, 1.0);
|
||||
// cogl_color_out = vec4(vec3(masks.x), 1.0);
|
||||
// cogl_color_out = vec4(vec3(masks.y), 1.0);
|
||||
// cogl_color_out = vec4(vec3(masks.z), 1.0);
|
||||
// cogl_color_out = vec4(vec3(masks.w), 1.0);
|
||||
// cogl_color_out = vec4(vec3(shower), 1.0);
|
||||
// cogl_color_out = vec4(vec3(streaks), 1.0);
|
||||
// cogl_color_out = vec4(vec3(atoms), 1.0);
|
||||
}
|
||||
`);
|
||||
};
|
||||
});
|
||||
}
|
||||
@@ -13,34 +13,75 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
const {Gio, GObject} = imports.gi;
|
||||
const {Gio} = imports.gi;
|
||||
|
||||
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 is a homage to the good old Compiz days. However, it is implemented //
|
||||
// quite differently. While Compiz used a particle system, this effect uses a noise //
|
||||
// shader. The noise is moved vertically over time and mapped to a configurable color //
|
||||
// shader. The noise is moved vertically over time and mapped to a configurable color //
|
||||
// gradient. It is faded to transparency towards the edges of the window. In addition, //
|
||||
// there are a couple of moving gradients which fade-in or fade-out the fire effect. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// The shader class for this effect is registered further down in this file.
|
||||
let Shader = null;
|
||||
// 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 Fire = class {
|
||||
|
||||
// The effect class is completely static. It 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 Fire = class Fire {
|
||||
|
||||
// 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 all uniform locations.
|
||||
shader._uGradient = [
|
||||
shader.get_uniform_location('uGradient1'),
|
||||
shader.get_uniform_location('uGradient2'),
|
||||
shader.get_uniform_location('uGradient3'),
|
||||
shader.get_uniform_location('uGradient4'),
|
||||
shader.get_uniform_location('uGradient5'),
|
||||
];
|
||||
|
||||
shader._u3DNoise = shader.get_uniform_location('u3DNoise');
|
||||
shader._uScale = shader.get_uniform_location('uScale');
|
||||
shader._uMovementSpeed = shader.get_uniform_location('uMovementSpeed');
|
||||
|
||||
// And update all uniforms at the start of each animation.
|
||||
shader.connect('begin-animation', (shader, settings) => {
|
||||
for (let i = 1; i <= 5; i++) {
|
||||
const c = Clutter.Color.from_string(settings.get_string('fire-color-' + i))[1];
|
||||
shader.set_uniform_float(
|
||||
shader._uGradient[i - 1], 4,
|
||||
[c.red / 255, c.green / 255, c.blue / 255, c.alpha / 255]);
|
||||
}
|
||||
|
||||
// clang-format off
|
||||
shader.set_uniform_float(shader._u3DNoise, 1, [settings.get_boolean('flame-3d-noise')]);
|
||||
shader.set_uniform_float(shader._uScale, 1, [settings.get_double('flame-scale')]);
|
||||
shader.set_uniform_float(shader._uMovementSpeed, 1, [settings.get_double('flame-movement-speed')]);
|
||||
// clang-format on
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------- metadata
|
||||
|
||||
// The effect is available on all GNOME Shell versions supported by this extension.
|
||||
static getMinShellVersion() {
|
||||
getMinShellVersion() {
|
||||
return [3, 36];
|
||||
}
|
||||
|
||||
@@ -48,22 +89,21 @@ var Fire = class Fire {
|
||||
// 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').
|
||||
static getNick() {
|
||||
getNick() {
|
||||
return 'fire';
|
||||
}
|
||||
|
||||
// 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.
|
||||
static getLabel() {
|
||||
getLabel() {
|
||||
return _('Fire');
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------- API for prefs.js
|
||||
|
||||
// This is called by the preferences dialog. It loads the settings page for this effect,
|
||||
// binds all properties to the settings and appends the page to the main stack of the
|
||||
// preferences dialog.
|
||||
static getPreferences(dialog) {
|
||||
// and binds all properties to the settings.
|
||||
getPreferences(dialog) {
|
||||
|
||||
// Add the settings page to the builder.
|
||||
dialog.getBuilder().add_from_resource(`/ui/${utils.getGTKString()}/Fire.ui`);
|
||||
@@ -89,7 +129,7 @@ var Fire = class Fire {
|
||||
});
|
||||
|
||||
// Initialize the fire-preset dropdown.
|
||||
Fire._createFirePresets(dialog);
|
||||
this._createFirePresets(dialog);
|
||||
|
||||
// Finally, return the new settings page.
|
||||
return dialog.getBuilder().get_object('fire-prefs');
|
||||
@@ -97,33 +137,17 @@ var Fire = class Fire {
|
||||
|
||||
// ---------------------------------------------------------------- API for extension.js
|
||||
|
||||
// This is called from extension.js whenever a window is closed with this effect.
|
||||
static createShader(actor, settings, forOpening) {
|
||||
return new Shader(settings, forOpening);
|
||||
}
|
||||
|
||||
// The tweakTransition() is called from extension.js to tweak a window's open / close
|
||||
// transitions - usually windows are faded in / out and scaled up / down by GNOME Shell.
|
||||
// The parameter 'forOpening' is set to true if this is called for a window-open
|
||||
// transition, for a window-close transition it is set to false. The modes can be set to
|
||||
// any value from here: https://gjs-docs.gnome.org/clutter8~8_api/clutter.animationmode.
|
||||
// The only required property is 'opacity', even if it transitions from 1.0 to 1.0. The
|
||||
// current value of the opacity transition is passed as uProgress to the shader.
|
||||
// Tweaking the actor's scale during the transition only works properly for GNOME 3.38+.
|
||||
|
||||
// For this effect, windows should neither be scaled nor faded.
|
||||
static tweakTransition(actor, settings, forOpening) {
|
||||
return {
|
||||
'opacity': {from: 255, to: 255, mode: 3},
|
||||
'scale-x': {from: 1.0, to: 1.0, mode: 3},
|
||||
'scale-y': {from: 1.0, to: 1.0, mode: 3}
|
||||
};
|
||||
// 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};
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------- private stuff
|
||||
|
||||
// This populates the preset dropdown menu for the fire options.
|
||||
static _createFirePresets(dialog) {
|
||||
_createFirePresets(dialog) {
|
||||
dialog.getBuilder().get_object('fire-prefs').connect('realize', (widget) => {
|
||||
const presets = [
|
||||
{
|
||||
@@ -209,144 +233,3 @@ var Fire = class Fire {
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// The shader class for this effect will only be registered in GNOME Shell's process //
|
||||
// (not in the preferences process). It's done this way as Clutter may not be installed //
|
||||
// on the system and therefore the preferences would crash. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
if (utils.isInShellProcess()) {
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const shaderSnippets = Me.imports.src.shaderSnippets;
|
||||
|
||||
Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect {
|
||||
_init(settings, forOpening) {
|
||||
super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
|
||||
|
||||
// Load the gradient values from the settings. We directly inject the values in the
|
||||
// GLSL code below. The shader is compiled once for each window-closing anyways. In
|
||||
// the future, we may want to prevent this frequent recompilations of shaders,
|
||||
// though.
|
||||
const gradient = [];
|
||||
for (let i = 1; i <= 5; i++) {
|
||||
const color =
|
||||
Clutter.Color.from_string(settings.get_string('fire-color-' + i))[1];
|
||||
gradient.push(`vec4(${color.red / 255}, ${color.green / 255}, ${
|
||||
color.blue / 255}, ${color.alpha / 255})`);
|
||||
}
|
||||
|
||||
this.set_shader_source(`
|
||||
|
||||
// Inject some common shader snippets.
|
||||
${shaderSnippets.standardUniforms()}
|
||||
${shaderSnippets.noise()}
|
||||
${shaderSnippets.edgeMask()}
|
||||
|
||||
// These may be configurable in the future.
|
||||
const float EDGE_FADE = 70;
|
||||
const float FADE_WIDTH = 0.1;
|
||||
const float HIDE_TIME = 0.4;
|
||||
const vec2 FIRE_SCALE = vec2(400, 600) * ${settings.get_double('flame-scale')};
|
||||
const float FIRE_SPEED = ${settings.get_double('flame-movement-speed')};
|
||||
|
||||
// This maps the input value from [0..1] to a color from the gradient.
|
||||
vec4 getFireColor(float v) {
|
||||
const float steps[5] = float[](0.0, 0.2, 0.35, 0.5, 0.8);
|
||||
const vec4 colors[5] = vec4[](
|
||||
${gradient[0]},
|
||||
${gradient[1]},
|
||||
${gradient[2]},
|
||||
${gradient[3]},
|
||||
${gradient[4]}
|
||||
);
|
||||
|
||||
if (v < steps[0]) {
|
||||
return colors[0];
|
||||
}
|
||||
|
||||
for (int i=0; i<4; ++i) {
|
||||
if (v <= steps[i+1]) {
|
||||
return mix(colors[i], colors[i+1], vec4(v - steps[i])/(steps[i+1]-steps[i]));
|
||||
}
|
||||
}
|
||||
|
||||
return colors[4];
|
||||
}
|
||||
|
||||
// This method requires the uniforms from standardUniforms() to be available.
|
||||
// It returns two values: The first is an alpha value which can be used for the window
|
||||
// texture. This gradually dissolves the window from top to bottom. The second can be used
|
||||
// to mask any effect, it will be most opaque where the window is currently fading and
|
||||
// gradually dissolve to zero over time.
|
||||
// hideTime: A value in [0..1]. It determines the percentage of the animation which
|
||||
// is spent for hiding the window. 1-hideTime will be spent thereafter for
|
||||
// dissolving the effect mask.
|
||||
// fadeWidth: The relative size of the window-hiding gradient in [0..1].
|
||||
// edgeFadeWidth: The pixel width of the effect fading range at the edges of the window.
|
||||
vec2 effectMask(float hideTime, float fadeWidth, float edgeFadeWidth) {
|
||||
float burnProgress = clamp(uProgress/hideTime, 0, 1);
|
||||
float afterBurnProgress = clamp((uProgress-hideTime)/(1-hideTime), 0, 1);
|
||||
|
||||
// Gradient from top to bottom.
|
||||
float t = cogl_tex_coord_in[0].t * (1 - fadeWidth);
|
||||
|
||||
// Visible part of the window. Gradually dissolves towards the bottom.
|
||||
float windowMask = 1 - clamp((burnProgress - t) / fadeWidth, 0, 1);
|
||||
|
||||
// Gradient from top burning window.
|
||||
float effectMask = clamp(t*(1-windowMask)/burnProgress, 0, 1);
|
||||
|
||||
// Fade-out when the window burned down.
|
||||
if (uProgress > hideTime) {
|
||||
float fade = sqrt(1-afterBurnProgress*afterBurnProgress);
|
||||
effectMask *= mix(1, 1-t, afterBurnProgress) * fade;
|
||||
}
|
||||
|
||||
// Fade at window borders.
|
||||
effectMask *= getAbsoluteEdgeMask(edgeFadeWidth);
|
||||
|
||||
#if ${forOpening ? '1' : '0'}
|
||||
windowMask = 1.0 - windowMask;
|
||||
#endif
|
||||
|
||||
return vec2(windowMask, effectMask);
|
||||
}
|
||||
|
||||
void main() {
|
||||
|
||||
// Get a noise value which moves vertically in time.
|
||||
vec2 uv = cogl_tex_coord_in[0].st * vec2(uSizeX, uSizeY) / FIRE_SCALE;
|
||||
uv.y += uTime * FIRE_SPEED;
|
||||
|
||||
#if ${settings.get_boolean('flame-3d-noise') ? 1 : 0}
|
||||
float noise = simplex3DFractal(vec3(uv*4.0, uTime*FIRE_SPEED*1.5));
|
||||
#else
|
||||
float noise = simplex2DFractal(uv * 4.0);
|
||||
#endif
|
||||
|
||||
// Modulate noise by effect mask.
|
||||
vec2 effectMask = effectMask(HIDE_TIME, FADE_WIDTH, EDGE_FADE);
|
||||
noise *= effectMask.y;
|
||||
|
||||
// Map noise value to color.
|
||||
vec4 fire = getFireColor(noise);
|
||||
fire.rgb *= fire.a;
|
||||
|
||||
// Get the window texture and fade it according to the effect mask.
|
||||
cogl_color_out = texture2D(uTexture, cogl_tex_coord_in[0].st) * effectMask.x;
|
||||
|
||||
// Add the fire to the window.
|
||||
cogl_color_out = cogl_color_out * (1.0 - fire.a) + fire;
|
||||
|
||||
// These are pretty useful for understanding how this works.
|
||||
// cogl_color_out = vec4(vec3(noise), 1);
|
||||
// cogl_color_out = vec4(vec3(effectMask.x), 1);
|
||||
// cogl_color_out = vec4(vec3(effectMask.y), 1);
|
||||
}
|
||||
`);
|
||||
};
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,129 @@
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// ) ( //
|
||||
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
|
||||
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
|
||||
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
|
||||
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
|
||||
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
|
||||
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
|
||||
// |__/ //
|
||||
// Copyright (c) 2021 Simon Schneegans //
|
||||
// Released under the GPLv3 or later. See LICENSE file for details. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
'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 overlays a glowing hexagonal grid over the window. The grid cells then //
|
||||
// gradually shrink until the window is fully dissolved. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// 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 Hexagon = 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._uAdditiveBlending = shader.get_uniform_location('uAdditiveBlending');
|
||||
shader._uSeed = shader.get_uniform_location('uSeed');
|
||||
shader._uScale = shader.get_uniform_location('uScale');
|
||||
shader._uLineWidth = shader.get_uniform_location('uLineWidth');
|
||||
shader._uGlowColor = shader.get_uniform_location('uGlowColor');
|
||||
shader._uLineColor = shader.get_uniform_location('uLineColor');
|
||||
|
||||
// Write all uniform values at the start of each animation.
|
||||
shader.connect('begin-animation', (shader, settings) => {
|
||||
// Get the two configurable colors. They are directly injected into the shader
|
||||
// code below.
|
||||
const gc =
|
||||
Clutter.Color.from_string(settings.get_string('hexagon-glow-color'))[1];
|
||||
const lc =
|
||||
Clutter.Color.from_string(settings.get_string('hexagon-line-color'))[1];
|
||||
|
||||
// If we are currently performing integration test, the animation uses a fixed
|
||||
// seed.
|
||||
const testMode = settings.get_boolean('test-mode');
|
||||
|
||||
// clang-format off
|
||||
shader.set_uniform_float(shader._uAdditiveBlending, 1, [settings.get_boolean('hexagon-additive-blending')]);
|
||||
shader.set_uniform_float(shader._uSeed, 2, [testMode ? 0 : Math.random(), testMode ? 0 : Math.random()]);
|
||||
shader.set_uniform_float(shader._uScale, 1, [settings.get_double('hexagon-scale')]);
|
||||
shader.set_uniform_float(shader._uLineWidth, 1, [settings.get_double('hexagon-line-width')]);
|
||||
shader.set_uniform_float(shader._uGlowColor, 4, [gc.red / 255, gc.green / 255, gc.blue / 255, gc.alpha / 255]);
|
||||
shader.set_uniform_float(shader._uLineColor, 4, [lc.red / 255, lc.green / 255, lc.blue / 255, lc.alpha / 255]);
|
||||
// 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 'hexagon';
|
||||
}
|
||||
|
||||
// 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 _('Hexagon');
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------- 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.getGTKString()}/Hexagon.ui`);
|
||||
|
||||
// Bind all properties.
|
||||
dialog.bindAdjustment('hexagon-animation-time');
|
||||
dialog.bindAdjustment('hexagon-scale');
|
||||
dialog.bindAdjustment('hexagon-line-width');
|
||||
dialog.bindColorButton('hexagon-line-color');
|
||||
dialog.bindColorButton('hexagon-glow-color');
|
||||
dialog.bindSwitch('hexagon-additive-blending');
|
||||
|
||||
// Finally, return the new settings page.
|
||||
return dialog.getBuilder().get_object('hexagon-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};
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@ 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 Matrix shader multiplies a grid of random letters with some gradients which are //
|
||||
@@ -29,18 +30,72 @@ const utils = Me.imports.src.utils;
|
||||
// documentation of vfunc_paint_target further down in this file. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// The shader class for this effect is registered further down in this file.
|
||||
let Shader = null;
|
||||
// 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 Matrix = class {
|
||||
|
||||
// The effect class is completely static. It 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 Matrix = class Matrix {
|
||||
// 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._fontTexture) {
|
||||
const fontData = GdkPixbuf.Pixbuf.new_from_resource('/img/matrixFont.png');
|
||||
this._fontTexture = new Clutter.Image();
|
||||
this._fontTexture.set_data(
|
||||
fontData.get_pixels(),
|
||||
fontData.has_alpha ? Cogl.PixelFormat.RGBA_8888 : Cogl.PixelFormat.RGB_888,
|
||||
fontData.width, fontData.height, fontData.rowstride);
|
||||
}
|
||||
|
||||
// Store uniform locations of newly created shaders.
|
||||
shader._uFontTexture = shader.get_uniform_location('uFontTexture');
|
||||
shader._uTrailColor = shader.get_uniform_location('uTrailColor');
|
||||
shader._uTipColor = shader.get_uniform_location('uTipColor');
|
||||
shader._uLetterSize = shader.get_uniform_location('uLetterSize');
|
||||
shader._uRandomness = shader.get_uniform_location('uRandomness');
|
||||
shader._uOverShoot = shader.get_uniform_location('uOverShoot');
|
||||
|
||||
// Write all uniform values at the start of each animation.
|
||||
shader.connect('begin-animation', (shader, settings) => {
|
||||
const c1 =
|
||||
Clutter.Color.from_string(settings.get_string('matrix-trail-color'))[1];
|
||||
const c2 = Clutter.Color.from_string(settings.get_string('matrix-tip-color'))[1];
|
||||
|
||||
// clang-format off
|
||||
shader.set_uniform_float(shader._uTrailColor, 3, [c1.red / 255, c1.green / 255, c1.blue / 255]);
|
||||
shader.set_uniform_float(shader._uTipColor, 3, [c2.red / 255, c2.green / 255, c2.blue / 255]);
|
||||
shader.set_uniform_float(shader._uLetterSize, 1, [settings.get_int('matrix-scale')]);
|
||||
shader.set_uniform_float(shader._uRandomness, 1, [settings.get_double('matrix-randomness')]);
|
||||
shader.set_uniform_float(shader._uOverShoot, 1, [settings.get_double('matrix-overshoot')]);
|
||||
// clang-format on
|
||||
});
|
||||
|
||||
// This is required to bind the font 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();
|
||||
|
||||
// Bind the font texture.
|
||||
pipeline.set_layer_texture(1, this._fontTexture.get_texture());
|
||||
pipeline.set_uniform_1i(shader._uFontTexture, 1);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------- metadata
|
||||
|
||||
// This effect is only available on GNOME Shell 40+.
|
||||
static getMinShellVersion() {
|
||||
getMinShellVersion() {
|
||||
return [40, 0];
|
||||
}
|
||||
|
||||
@@ -48,22 +103,21 @@ var Matrix = class Matrix {
|
||||
// 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').
|
||||
static getNick() {
|
||||
getNick() {
|
||||
return 'matrix';
|
||||
}
|
||||
|
||||
// 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.
|
||||
static getLabel() {
|
||||
getLabel() {
|
||||
return _('Matrix');
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------- API for prefs.js
|
||||
|
||||
// This is called by the preferences dialog. It loads the settings page for this effect,
|
||||
// binds all properties to the settings and appends the page to the main stack of the
|
||||
// preferences dialog.
|
||||
static getPreferences(dialog) {
|
||||
// and binds all properties to the settings.
|
||||
getPreferences(dialog) {
|
||||
|
||||
// Add the settings page to the builder.
|
||||
dialog.getBuilder().add_from_resource('/ui/gtk4/Matrix.ui');
|
||||
@@ -82,171 +136,10 @@ var Matrix = class Matrix {
|
||||
|
||||
// ---------------------------------------------------------------- API for extension.js
|
||||
|
||||
// This is called from extension.js whenever a window is closed with this effect.
|
||||
static createShader(actor, settings, forOpening) {
|
||||
return new Shader(settings, forOpening);
|
||||
}
|
||||
|
||||
// The tweakTransition() is called from extension.js to tweak a window's open / close
|
||||
// transitions - usually windows are faded in / out and scaled up / down by GNOME Shell.
|
||||
// The parameter 'forOpening' is set to true if this is called for a window-open
|
||||
// transition, for a window-close transition it is set to false. The modes can be set to
|
||||
// any value from here: https://gjs-docs.gnome.org/clutter8~8_api/clutter.animationmode.
|
||||
// The only required property is 'opacity', even if it transitions from 1.0 to 1.0. The
|
||||
// current value of the opacity transition is passed as uProgress to the shader.
|
||||
// Tweaking the actor's scale during the transition only works properly for GNOME 3.38+.
|
||||
|
||||
// For this effect, windows should not be faded but scaled vertically to allow for some
|
||||
// overshooting.
|
||||
static tweakTransition(actor, settings, forOpening) {
|
||||
const yScale = 1.0 + settings.get_double('matrix-overshoot');
|
||||
return {
|
||||
'opacity': {from: 255, to: 255, mode: 1},
|
||||
'scale-x': {from: 1.0, to: 1.0, mode: 1},
|
||||
'scale-y': {from: yScale, to: yScale, mode: 1}
|
||||
};
|
||||
// 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 + settings.get_double('matrix-overshoot')};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// The shader class for this effect will only be registered in GNOME Shell's process //
|
||||
// (not in the preferences process). It's done this way as Clutter may not be installed //
|
||||
// on the system and therefore the preferences would crash. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
if (utils.isInShellProcess()) {
|
||||
|
||||
const {Clutter, GdkPixbuf, Cogl} = imports.gi;
|
||||
const shaderSnippets = Me.imports.src.shaderSnippets;
|
||||
|
||||
Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect {
|
||||
_init(settings, forOpening) {
|
||||
super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
|
||||
|
||||
// Load the font texture. As the shader is re-created for each window animation,
|
||||
// this texture is also re-created each time. This could be improved in the future!
|
||||
const fontData = GdkPixbuf.Pixbuf.new_from_resource('/img/matrixFont.png');
|
||||
this._fontTexture = new Clutter.Image();
|
||||
this._fontTexture.set_data(
|
||||
fontData.get_pixels(),
|
||||
fontData.has_alpha ? Cogl.PixelFormat.RGBA_8888 : Cogl.PixelFormat.RGB_888,
|
||||
fontData.width, fontData.height, fontData.rowstride);
|
||||
|
||||
const trailColor =
|
||||
Clutter.Color.from_string(settings.get_string('matrix-trail-color'))[1];
|
||||
const tipColor =
|
||||
Clutter.Color.from_string(settings.get_string('matrix-tip-color'))[1];
|
||||
|
||||
// The technique for this effect was inspired by
|
||||
// https://www.shadertoy.com/view/ldccW4, however the implementation is quite
|
||||
// different as the letters drop only once and there is no need for a noise texture.
|
||||
this.set_shader_source(`
|
||||
|
||||
// Inject some common shader snippets.
|
||||
${shaderSnippets.standardUniforms()}
|
||||
${shaderSnippets.noise()}
|
||||
${shaderSnippets.edgeMask()}
|
||||
|
||||
uniform sampler2D uFontTexture;
|
||||
|
||||
// These may be configurable in the future.
|
||||
const float EDGE_FADE = 30;
|
||||
const float FADE_WIDTH = 150;
|
||||
const float TRAIL_LENGTH = 0.2;
|
||||
const float FINAL_FADE_START_TIME = 0.8;
|
||||
const float LETTER_TILES = 16.0;
|
||||
const float LETTER_SIZE = ${settings.get_int('matrix-scale')};
|
||||
const float LETTER_FLICKER_SPEED = 2.0;
|
||||
const float RANDOMNESS = ${settings.get_double('matrix-randomness')};
|
||||
const float OVERSHOOT = ${settings.get_double('matrix-overshoot')};
|
||||
|
||||
// This returns a flickering grid of random letters.
|
||||
float getText(vec2 fragCoord) {
|
||||
vec2 pixelCoords = fragCoord * vec2(uSizeX, uSizeY);
|
||||
vec2 uv = mod(pixelCoords.xy, LETTER_SIZE)/LETTER_SIZE;
|
||||
vec2 block = pixelCoords/LETTER_SIZE - uv;
|
||||
|
||||
// Choose random letter.
|
||||
uv += floor(hash22(floor(hash22(block)*vec2(12.9898,78.233) + LETTER_FLICKER_SPEED*uTime + 42.254))*LETTER_TILES);
|
||||
|
||||
return texture2D(uFontTexture, uv/LETTER_TILES).r;
|
||||
}
|
||||
|
||||
// This returns two values: The first are gradients for the "raindrops" which move
|
||||
// from top to bottom. This is used for fading the letters. The second value is set
|
||||
// to one below each drop and to zero above it. This second value is used for fading
|
||||
// the window texture.
|
||||
vec2 getRain(vec2 fragCoord) {
|
||||
float column = cogl_tex_coord_in[0].x * uSizeX;
|
||||
column -= mod(column, LETTER_SIZE);
|
||||
|
||||
float delay = fract(sin(column)*78.233) * mix(0.0, 1.0, RANDOMNESS);
|
||||
float speed = fract(cos(column)*12.989) * mix(0.0, 0.3, RANDOMNESS) + 1.5;
|
||||
|
||||
float distToDrop = (uProgress*2-delay)*speed - cogl_tex_coord_in[0].y;
|
||||
|
||||
float rainAlpha = distToDrop >= 0 ? exp(-distToDrop/TRAIL_LENGTH) : 0;
|
||||
float windowAlpha = 1 - clamp(uSizeY*distToDrop, 0, FADE_WIDTH) / FADE_WIDTH;
|
||||
|
||||
// Fade at window borders.
|
||||
rainAlpha *= getAbsoluteEdgeMask(EDGE_FADE);
|
||||
|
||||
// Add some variation to the drop start and end position.
|
||||
float shorten = fract(sin(column+42.0)*33.423) * mix(0.0, OVERSHOOT*0.25, RANDOMNESS);
|
||||
rainAlpha *= smoothstep(0, 1, clamp(cogl_tex_coord_in[0].y / shorten, 0, 1));
|
||||
rainAlpha *= smoothstep(0, 1, clamp((1.0 - cogl_tex_coord_in[0].y) / shorten, 0, 1));
|
||||
|
||||
#if ${forOpening ? '1' : '0'}
|
||||
windowAlpha = 1.0 - windowAlpha;
|
||||
#endif
|
||||
|
||||
return vec2(rainAlpha, windowAlpha);
|
||||
}
|
||||
|
||||
void main() {
|
||||
|
||||
vec2 coords = cogl_tex_coord_in[0].st;
|
||||
coords.y = coords.y * (OVERSHOOT + 1.0) - OVERSHOOT * 0.5;
|
||||
|
||||
// Get a cool matrix effect. See comments for those methods above.
|
||||
vec2 rain = getRain(coords);
|
||||
float text = getText(coords);
|
||||
|
||||
// Get the window texture and fade it according to the effect mask.
|
||||
cogl_color_out = texture2D(uTexture, coords) * rain.y;
|
||||
|
||||
// This is used to fade out the remaining trails in the end.
|
||||
float finalFade = 1-clamp((uProgress-FINAL_FADE_START_TIME)/
|
||||
(1-FINAL_FADE_START_TIME), 0, 1);
|
||||
float rainAlpha = finalFade * rain.x;
|
||||
|
||||
// Add the matrix effect to the window.
|
||||
vec3 trailColor = vec3(${trailColor.red / 255},
|
||||
${trailColor.green / 255},
|
||||
${trailColor.blue / 255});
|
||||
vec3 tipColor = vec3(${tipColor.red / 255},
|
||||
${tipColor.green / 255},
|
||||
${tipColor.blue / 255});
|
||||
cogl_color_out.rgb += mix(trailColor, tipColor, min(1, pow(rainAlpha+0.1, 4))) * rainAlpha * text;
|
||||
|
||||
// These are pretty useful for understanding how this works.
|
||||
// cogl_color_out = vec4(vec3(text), 1);
|
||||
// cogl_color_out = vec4(vec3(rain.x), 1);
|
||||
// cogl_color_out = vec4(vec3(rain.y), 1);
|
||||
}
|
||||
`);
|
||||
};
|
||||
|
||||
// This is overridden to bind the font 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
|
||||
vfunc_paint_target(node, paint_context) {
|
||||
const pipeline = this.get_pipeline();
|
||||
pipeline.set_layer_texture(1, this._fontTexture.get_texture());
|
||||
this.set_uniform_value('uFontTexture', 1);
|
||||
super.vfunc_paint_target(node, paint_context);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,155 @@
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// ) ( //
|
||||
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
|
||||
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
|
||||
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
|
||||
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
|
||||
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
|
||||
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
|
||||
// |__/ //
|
||||
// Copyright (c) 2021 Simon Schneegans //
|
||||
// Released under the GPLv3 or later. See LICENSE file for details. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
'use strict';
|
||||
|
||||
const {Gio, Shell, GObject, Clutter} = imports.gi;
|
||||
const ByteArray = imports.byteArray;
|
||||
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = imports.misc.extensionUtils.getCurrentExtension();
|
||||
const utils = Me.imports.src.utils;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// This is the base class for all shaders of Burn-My-Windows. It automagically loads //
|
||||
// the shader's source code from the resource file resources/shaders/<nick>.glsl and //
|
||||
// ensures that some standard uniforms are always updated. //
|
||||
// Using Shell.GLSLEffect as a base class has some benefits and some drawbacks. The //
|
||||
// main benefit when compared to Clutter.ShaderEffect is that setting uniforms of types //
|
||||
// vec2, vec3 or vec4 is supported via the API (with Clutter.ShaderEffect the GJS //
|
||||
// binding does not work properly). However, there are two drawbacks: On the one hand, //
|
||||
// the shader source code is cached statically - this mean if we want to have a //
|
||||
// different shader, we have to derive a new class. Therefore, each effect has to //
|
||||
// derive its own class from the class below. This is encapsulated in the //
|
||||
// ShaderFactory, however it is some really awkward code. The other drawback is the //
|
||||
// hard-coded use of straight alpha (as opposed to premultiplied). This makes the //
|
||||
// shaders a bit more complicated than required. //
|
||||
// //
|
||||
// The Shader fires two signals: //
|
||||
// * begin-animation: This is called each time a new animation is started. It can //
|
||||
// be used to set uniform values which do not change during the //
|
||||
// animation. //
|
||||
// * update-animation: This is called at each frame during the animation. It can be //
|
||||
// used to set uniforms which change during the animation. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
var Shader = GObject.registerClass(
|
||||
{
|
||||
Signals: {
|
||||
'begin-animation':
|
||||
{param_types: [Gio.Settings.$gtype, GObject.TYPE_BOOLEAN, Clutter.Actor.$gtype]},
|
||||
'update-animation': {param_types: [GObject.TYPE_DOUBLE, GObject.TYPE_DOUBLE]}
|
||||
}
|
||||
},
|
||||
class Shader extends Shell.GLSLEffect { // --------------------------------------------
|
||||
// The constructor automagically loads the shader's source code (in
|
||||
// vfunc_build_pipeline()) from the resource file resources/shaders/<nick>.glsl
|
||||
// resolving any #includes in this file.
|
||||
_init(nick) {
|
||||
this._nick = nick;
|
||||
|
||||
// This will call vfunc_build_pipeline().
|
||||
super._init();
|
||||
|
||||
// These will be updated during the animation.
|
||||
this._progress = 0;
|
||||
this._time = 0;
|
||||
|
||||
// Store standard uniform locations.
|
||||
this._uForOpening = this.get_uniform_location('uForOpening');
|
||||
this._uProgress = this.get_uniform_location('uProgress');
|
||||
this._uTime = this.get_uniform_location('uTime');
|
||||
this._uSize = this.get_uniform_location('uSize');
|
||||
this._uPadding = this.get_uniform_location('uPadding');
|
||||
}
|
||||
|
||||
// This is called once each time the shader is used.
|
||||
beginAnimation(settings, forOpening, actor) {
|
||||
|
||||
// Reset progress values.
|
||||
this._progress = 0;
|
||||
this._time = 0;
|
||||
|
||||
// This is not necessarily symmetric, but I haven't figured out a way to
|
||||
// get the actual values...
|
||||
const padding = (actor.width - actor.meta_window.get_frame_rect().width) / 2;
|
||||
|
||||
this.set_uniform_float(this._uPadding, 1, [padding]);
|
||||
this.set_uniform_float(this._uForOpening, 1, [forOpening]);
|
||||
this.set_uniform_float(this._uSize, 2, [actor.width, actor.height]);
|
||||
|
||||
this.emit('begin-animation', settings, forOpening, actor);
|
||||
}
|
||||
|
||||
// This is called at each frame during the animation.
|
||||
updateAnimation(progress, time) {
|
||||
// Store the current time and progress values. The corresponding signal is emitted
|
||||
// each frame in vfunc_paint_target.
|
||||
this._progress = progress;
|
||||
this._time = time;
|
||||
}
|
||||
|
||||
// This is called by the constructor. This means, it's only called when the
|
||||
// effect is used for the first time.
|
||||
vfunc_build_pipeline() {
|
||||
|
||||
// Shell.GLSLEffect requires the declarations and the main source code as separate
|
||||
// strings. As it's more convenient to store the in one GLSL file, we use a regex
|
||||
// here to split the source code in two parts.
|
||||
const code = this._loadGLSLResource(`/shaders/${this._nick}.glsl`);
|
||||
|
||||
// Match anything between the curly brackets of "void main() {...}".
|
||||
const regex = RegExp('void main *\\(\\) *\\{([\\S\\s]+)\\}');
|
||||
const match = regex.exec(code);
|
||||
|
||||
const declarations = code.substr(0, match.index);
|
||||
const main = match[1];
|
||||
|
||||
this.add_glsl_snippet(Shell.SnippetHook.FRAGMENT, declarations, main, true);
|
||||
}
|
||||
|
||||
// We use this vfunc to trigger the update as it allows calling this.get_pipeline() in
|
||||
// the handler. This could still be null if called from the updateAnimation() above.
|
||||
vfunc_paint_target(...params) {
|
||||
this.emit('update-animation', this._progress, this._time);
|
||||
this.set_uniform_float(this._uProgress, 1, [this._progress]);
|
||||
this.set_uniform_float(this._uTime, 1, [this._time]);
|
||||
super.vfunc_paint_target(...params);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------- private stuff
|
||||
|
||||
// This loads the file at 'path' contained in the extension's resources to a
|
||||
// JavaScript string.
|
||||
_loadStringResource(path) {
|
||||
const data = Gio.resources_lookup_data(path, 0);
|
||||
return ByteArray.toString(ByteArray.fromGBytes(data));
|
||||
}
|
||||
|
||||
// This loads a GLSL file from the extension's resources to a JavaScript string. Any
|
||||
// #include statements in this file are replaced with the corresponding file contents.
|
||||
_loadGLSLResource(path) {
|
||||
let code = this._loadStringResource(path);
|
||||
|
||||
// This regex matches either #include "..." or #include <...>. The part between the
|
||||
// brackets is captured in the capture group.
|
||||
const regex = RegExp('#include ["<](.+)[">]', 'g');
|
||||
|
||||
code = code.replace(regex, (m, file) => {
|
||||
return this._loadStringResource('/shaders/' + file);
|
||||
});
|
||||
|
||||
// Add a trailing newline. Else the GLSL compiler complains...
|
||||
return code + '\n';
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,95 @@
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// ) ( //
|
||||
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
|
||||
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
|
||||
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
|
||||
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
|
||||
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
|
||||
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
|
||||
// |__/ //
|
||||
// Copyright (c) 2021 Simon Schneegans //
|
||||
// Released under the GPLv3 or later. See LICENSE file for details. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
'use strict';
|
||||
|
||||
const GObject = imports.gi.GObject;
|
||||
|
||||
const ExtensionUtils = imports.misc.extensionUtils;
|
||||
const Me = imports.misc.extensionUtils.getCurrentExtension();
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Each effect of Burn-My-Windows owns an instance of this class. It is used to created //
|
||||
// shaders whenever a new one is required. It tries to re-use old shaders as much as //
|
||||
// possible in order to avoid memory leaks. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
var ShaderFactory = class {
|
||||
|
||||
// Creates a new ShaderFactory. Requires the nick of the effect and a callback function
|
||||
// which will be called whenever a new shader is created.
|
||||
constructor(nick, setupFunc) {
|
||||
// The _freeShaders array contains previously created shaders which are not currently
|
||||
// in use.
|
||||
this._freeShaders = [];
|
||||
|
||||
// The nick of the effect is required when creating new shaders as it's part of the
|
||||
// GLSL source code file name.
|
||||
this._nick = nick;
|
||||
|
||||
// Store the setup callback.
|
||||
this._setupFunc = setupFunc;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------- API for extension.js
|
||||
|
||||
// This is called from extension.js whenever a window is opened or closed. It returns an
|
||||
// instance of the shader class, trying to reuse previously created shaders. If a new
|
||||
// shader instance is required, it calls creates a new one and calls the setupFunc
|
||||
// thereafter.
|
||||
getShader() {
|
||||
let shader;
|
||||
|
||||
// If there are currently no free shaders, we have to create a new one.
|
||||
if (this._freeShaders.length == 0) {
|
||||
|
||||
// Since Shell.GLSLEffect caches the shader source per class (not per instance), we
|
||||
// have to derive a new shader type for each effect. The type name contains the nick
|
||||
// of the effect to make it unique.
|
||||
const typeName = `BurnMyWindowsShader_${this._nick}`;
|
||||
|
||||
// Only try to register the new type once.
|
||||
if (GObject.type_from_name(typeName) == null) {
|
||||
const outerThis = this;
|
||||
GObject.registerClass({GTypeName: typeName},
|
||||
class Shader extends Me.imports.src.Shader.Shader {
|
||||
// This will actually load the GLSL source code from the resources.
|
||||
_init() {
|
||||
super._init(outerThis._nick);
|
||||
}
|
||||
|
||||
// This can be called to mark this instance to be re-usable.
|
||||
returnToFactory() {
|
||||
outerThis._freeShaders.push(this);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Now create a niew instance of the newly registered shader type.
|
||||
// GObject.Object.new is only available with newer versions of GJS.
|
||||
if (GObject.Object.new) {
|
||||
shader = GObject.Object.new(GObject.type_from_name(typeName), {});
|
||||
} else {
|
||||
shader = GObject.Object.newv(GObject.type_from_name(typeName), []);
|
||||
}
|
||||
|
||||
// Call the provided setup callback.
|
||||
this._setupFunc(shader);
|
||||
|
||||
} else {
|
||||
shader = this._freeShaders.pop();
|
||||
}
|
||||
|
||||
return shader;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// ) ( //
|
||||
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
|
||||
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
|
||||
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
|
||||
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
|
||||
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
|
||||
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
|
||||
// |__/ //
|
||||
// Copyright (c) 2021 Simon Schneegans //
|
||||
// Released under the GPLv3 or later. See LICENSE file for details. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
'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 effects dissolves your windows into a cloud of dust. For this, it uses an //
|
||||
// approach similar to the Broken Glass effect. A dust texture is used to segment the //
|
||||
// window texture into a set of layers. Each layer is then moved, sheared and scaled //
|
||||
// randomly. Just a few layers are sufficient to create the illusion of many individual //
|
||||
// dust particles. //
|
||||
// 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 SnapOfDisintegration = 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._dustTexture) {
|
||||
const dustData = GdkPixbuf.Pixbuf.new_from_resource('/img/dust.png');
|
||||
this._dustTexture = new Clutter.Image();
|
||||
this._dustTexture.set_data(dustData.get_pixels(), Cogl.PixelFormat.RGB_888,
|
||||
dustData.width, dustData.height, dustData.rowstride);
|
||||
}
|
||||
|
||||
// Store uniform locations of newly created shaders.
|
||||
shader._uDustTexture = shader.get_uniform_location('uDustTexture');
|
||||
shader._uDustColor = shader.get_uniform_location('uDustColor');
|
||||
shader._uSeed = shader.get_uniform_location('uSeed');
|
||||
shader._uDustScale = shader.get_uniform_location('uDustScale');
|
||||
|
||||
// Write all uniform values at the start of each animation.
|
||||
shader.connect('begin-animation', (shader, settings) => {
|
||||
// The dust particles will fade to this color over time.
|
||||
const c = Clutter.Color.from_string(settings.get_string('snap-color'))[1];
|
||||
|
||||
// If we are currently performing integration test, the animation uses a fixed
|
||||
// seed.
|
||||
const testMode = settings.get_boolean('test-mode');
|
||||
|
||||
// clang-format off
|
||||
shader.set_uniform_float(shader._uDustColor, 4, [c.red / 255, c.green / 255, c.blue / 255, c.alpha / 255]);
|
||||
shader.set_uniform_float(shader._uSeed, 2, [testMode ? 0 : Math.random(), testMode ? 0 : Math.random()]);
|
||||
shader.set_uniform_float(shader._uDustScale, 1, [settings.get_double('snap-scale')]);
|
||||
// clang-format on
|
||||
});
|
||||
|
||||
// This is required to bind the dust 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 dust texture.
|
||||
pipeline.set_layer_texture(1, this._dustTexture.get_texture());
|
||||
pipeline.set_layer_wrap_mode(1, Cogl.PipelineWrapMode.REPEAT);
|
||||
pipeline.set_uniform_1i(shader._uDustTexture, 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. '*-close-effect'), and its animation time
|
||||
// (e.g. '*-animation-time').
|
||||
getNick() {
|
||||
return 'snap';
|
||||
}
|
||||
|
||||
// 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 _('Snap of Disintegration');
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------- 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/gtk4/SnapOfDisintegration.ui');
|
||||
|
||||
// Bind all properties.
|
||||
dialog.bindAdjustment('snap-animation-time');
|
||||
dialog.bindAdjustment('snap-scale');
|
||||
dialog.bindColorButton('snap-color');
|
||||
|
||||
// Finally, return the new settings page.
|
||||
return dialog.getBuilder().get_object('snap-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.2, y: 1.2};
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@ 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 tears your windows apart with a series of violent scratches! //
|
||||
@@ -27,18 +28,76 @@ const utils = Me.imports.src.utils;
|
||||
// documentation of vfunc_paint_target further down in this file. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// The shader class for this effect is registered further down in this file.
|
||||
let Shader = null;
|
||||
// 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 TRexAttack = class {
|
||||
|
||||
// The effect class is completely static. It 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 TRexAttack = class TRexAttack {
|
||||
// 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._clawTexture) {
|
||||
const clawData = GdkPixbuf.Pixbuf.new_from_resource('/img/claws.png');
|
||||
this._clawTexture = new Clutter.Image();
|
||||
this._clawTexture.set_data(clawData.get_pixels(), Cogl.PixelFormat.RGB_888,
|
||||
clawData.width, clawData.height, clawData.rowstride);
|
||||
}
|
||||
|
||||
// Store uniform locations of newly created shaders.
|
||||
shader._uClawTexture = shader.get_uniform_location('uClawTexture');
|
||||
shader._uFlashColor = shader.get_uniform_location('uFlashColor');
|
||||
shader._uSeed = shader.get_uniform_location('uSeed');
|
||||
shader._uClawSize = shader.get_uniform_location('uClawSize');
|
||||
shader._uNumClaws = shader.get_uniform_location('uNumClaws');
|
||||
shader._uWarpIntensity = shader.get_uniform_location('uWarpIntensity');
|
||||
|
||||
// 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('claw-scratch-color'))[1];
|
||||
|
||||
// If we are currently performing integration test, the animation uses a fixed
|
||||
// seed.
|
||||
const testMode = settings.get_boolean('test-mode');
|
||||
|
||||
// clang-format off
|
||||
shader.set_uniform_float(shader._uFlashColor, 4, [c.red / 255, c.green / 255, c.blue / 255, c.alpha / 255]);
|
||||
shader.set_uniform_float(shader._uSeed, 2, [testMode ? 0 : Math.random(), testMode ? 0 : Math.random()]);
|
||||
shader.set_uniform_float(shader._uClawSize, 1, [settings.get_double('claw-scratch-scale')]);
|
||||
shader.set_uniform_float(shader._uNumClaws, 1, [settings.get_int('claw-scratch-count')]);
|
||||
shader.set_uniform_float(shader._uWarpIntensity, 1, [settings.get_double('claw-scratch-warp')]);
|
||||
// clang-format on
|
||||
});
|
||||
|
||||
// This is required to bind the claw 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 claw texture.
|
||||
pipeline.set_layer_texture(1, this._clawTexture.get_texture());
|
||||
pipeline.set_uniform_1i(shader._uClawTexture, 1);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------- metadata
|
||||
|
||||
// This effect is only available on GNOME Shell 40+.
|
||||
static getMinShellVersion() {
|
||||
getMinShellVersion() {
|
||||
return [40, 0];
|
||||
}
|
||||
|
||||
@@ -46,22 +105,21 @@ var TRexAttack = class TRexAttack {
|
||||
// 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').
|
||||
static getNick() {
|
||||
getNick() {
|
||||
return 'trex';
|
||||
}
|
||||
|
||||
// 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.
|
||||
static getLabel() {
|
||||
getLabel() {
|
||||
return _('T-Rex Attack');
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------- API for prefs.js
|
||||
|
||||
// This is called by the preferences dialog. It loads the settings page for this effect,
|
||||
// binds all properties to the settings and appends the page to the main stack of the
|
||||
// preferences dialog.
|
||||
static getPreferences(dialog) {
|
||||
// and binds all properties to the settings.
|
||||
getPreferences(dialog) {
|
||||
|
||||
// Add the settings page to the builder.
|
||||
dialog.getBuilder().add_from_resource('/ui/gtk4/TRexAttack.ui');
|
||||
@@ -79,179 +137,11 @@ var TRexAttack = class TRexAttack {
|
||||
|
||||
// ---------------------------------------------------------------- API for extension.js
|
||||
|
||||
// This is called from extension.js whenever a window is closed with this effect.
|
||||
static createShader(actor, settings, forOpening) {
|
||||
return new Shader(settings, forOpening);
|
||||
}
|
||||
|
||||
// The tweakTransition() is called from extension.js to tweak a window's open / close
|
||||
// transitions - usually windows are faded in / out and scaled up / down by GNOME Shell.
|
||||
// The parameter 'forOpening' is set to true if this is called for a window-open
|
||||
// transition, for a window-close transition it is set to false. The modes can be set to
|
||||
// any value from here: https://gjs-docs.gnome.org/clutter8~8_api/clutter.animationmode.
|
||||
// The only required property is 'opacity', even if it transitions from 1.0 to 1.0. The
|
||||
// current value of the opacity transition is passed as uProgress to the shader.
|
||||
// Tweaking the actor's scale during the transition only works properly for GNOME 3.38+.
|
||||
|
||||
// For this effect, we slightly increase the window's scale as part of the warp effect.
|
||||
static tweakTransition(actor, settings, forOpening) {
|
||||
const warp = 1.0 + 0.5 * settings.get_double('claw-scratch-warp');
|
||||
return {
|
||||
'opacity': {from: 255, to: 255, mode: 3},
|
||||
'scale-x': {from: forOpening ? warp : 1.0, to: forOpening ? 1.0 : warp, mode: 3},
|
||||
'scale-y': {from: forOpening ? warp : 1.0, to: forOpening ? 1.0 : warp, mode: 3}
|
||||
};
|
||||
// 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) {
|
||||
const scale = 1.0 + 0.5 * settings.get_double('claw-scratch-warp');
|
||||
return {x: scale, y: scale};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// The shader class for this effect will only be registered in GNOME Shell's process //
|
||||
// (not in the preferences process). It's done this way as Clutter may not be installed //
|
||||
// on the system and therefore the preferences would crash. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
if (utils.isInShellProcess()) {
|
||||
|
||||
const {Clutter, GdkPixbuf, Cogl} = imports.gi;
|
||||
const shaderSnippets = Me.imports.src.shaderSnippets;
|
||||
|
||||
Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect {
|
||||
_init(settings, forOpening) {
|
||||
super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
|
||||
|
||||
// Load the claw texture. As the shader is re-created for each window animation,
|
||||
// this texture is also re-created each time. This could be improved in the future!
|
||||
// See assets/README.md for how this texture was created.
|
||||
const clawData = GdkPixbuf.Pixbuf.new_from_resource('/img/claws.png');
|
||||
this._clawTexture = new Clutter.Image();
|
||||
this._clawTexture.set_data(clawData.get_pixels(), Cogl.PixelFormat.RGB_888,
|
||||
clawData.width, clawData.height, clawData.rowstride);
|
||||
|
||||
const color =
|
||||
Clutter.Color.from_string(settings.get_string('claw-scratch-color'))[1];
|
||||
|
||||
// If we are currently performing integration test, the animation uses a fixed seed.
|
||||
const testMode = settings.get_boolean('test-mode');
|
||||
|
||||
this.set_shader_source(`
|
||||
|
||||
// Inject some common shader snippets.
|
||||
${shaderSnippets.standardUniforms()}
|
||||
${shaderSnippets.noise()}
|
||||
|
||||
// See assets/README.md for how this texture was created.
|
||||
uniform sampler2D uClawTexture;
|
||||
|
||||
const vec2 SEED = vec2(${testMode ? 0 : Math.random()},
|
||||
${testMode ? 0 : Math.random()});
|
||||
const float CLAW_SIZE = ${settings.get_double('claw-scratch-scale')};
|
||||
const float NUM_CLAWS = ${settings.get_int('claw-scratch-count')};
|
||||
const float WARP_INTENSITY = 1.0 + ${settings.get_double('claw-scratch-warp')};
|
||||
const float FLASH_INTENSITY = 0.1;
|
||||
const float MAX_SPAWN_TIME = 0.6; // Scratches will only start in the first half of the animation.
|
||||
const float FF_TIME = 0.6; // Relative time for the final fade to transparency.
|
||||
|
||||
// This method generates a grid of randomly rotated, slightly shifted and scaled
|
||||
// UV squares. It returns the texture coords of the UV square at the given actor
|
||||
// coordinates. If these do not fall into one of the UV grids, the coordinates of
|
||||
// the closest UV grid will be clamped and returned.
|
||||
vec2 getClawUV(vec2 texCoords, float gridScale, vec2 seed) {
|
||||
|
||||
// Shift coordinates by a random offset and make sure the have a 1:1 aspect ratio.
|
||||
vec2 coords = texCoords + hash22(seed);
|
||||
coords *= uSizeX < uSizeY ? vec2(1.0, 1.0 * uSizeY / uSizeX) : vec2(1.0 * uSizeX / uSizeY, 1.0);
|
||||
|
||||
// Apply global scale.
|
||||
coords *= gridScale;
|
||||
|
||||
// Get grid cell coordinates in [0..1].
|
||||
vec2 cellUV = mod(coords, vec2(1));
|
||||
|
||||
// This is unique for each cell.
|
||||
vec2 cellID = coords-cellUV + vec2(362.456);
|
||||
|
||||
// Add random rotation, scale and offset to each grid cell.
|
||||
float scale = mix(0.8, 1.0, hash12(cellID*seed*134.451));
|
||||
float offsetX = mix(0.0, 1.0 - scale, hash12(cellID*seed*54.4129));
|
||||
float offsetY = mix(0.0, 1.0 - scale, hash12(cellID*seed*25.3089));
|
||||
float rotation = mix(0.0, 2.0 * 3.141, hash12(cellID*seed*2.99837));
|
||||
|
||||
cellUV -= vec2(offsetX, offsetY);
|
||||
cellUV /= scale;
|
||||
|
||||
cellUV -= 0.5;
|
||||
cellUV = vec2(cellUV.x * cos(rotation) - cellUV.y * sin(rotation),
|
||||
cellUV.x * sin(rotation) + cellUV.y * cos(rotation));
|
||||
cellUV += 0.5;
|
||||
|
||||
// Clamp resulting coordinates.
|
||||
return clamp(cellUV, vec2(0), vec2(1));
|
||||
}
|
||||
|
||||
void main() {
|
||||
|
||||
float progress = ${forOpening ? '1.0-uProgress' : 'uProgress'};
|
||||
|
||||
// Warp the texture coordinates to create a blow-up effect.
|
||||
vec2 coords = cogl_tex_coord_in[0].st * 2.0 - 1.0;
|
||||
float dist = length(coords);
|
||||
coords = (coords/dist * pow(dist, WARP_INTENSITY)) * 0.5 + 0.5;
|
||||
coords = mix(cogl_tex_coord_in[0].st, coords, progress);
|
||||
|
||||
// Accumulate several random scratches. The color in the scratch map refers to the
|
||||
// relative time when the respective part will become invisible. Therefore we can
|
||||
// add a value to make the scratch appear later.
|
||||
float scratchMap = 1.0;
|
||||
for (int i=0; i<NUM_CLAWS; ++i) {
|
||||
vec2 uv = getClawUV(coords, 1.0/CLAW_SIZE, SEED*(i+1));
|
||||
float delay = i/NUM_CLAWS * MAX_SPAWN_TIME;
|
||||
scratchMap = min(scratchMap, clamp(texture2D(uClawTexture, uv).r + delay, 0, 1));
|
||||
}
|
||||
|
||||
// Get the window texture. We shift the texture lookup by the local derivative of
|
||||
// the claw texture in order to mimic some folding distortion.
|
||||
vec2 offset = vec2(dFdx(scratchMap), dFdy(scratchMap)) * progress * 0.5;
|
||||
cogl_color_out = texture2D(uTexture, coords + offset);
|
||||
|
||||
// Add colorful flashes.
|
||||
float flashIntensity = 1.0 / FLASH_INTENSITY * (scratchMap - progress) + 1;
|
||||
if (flashIntensity < 0 || flashIntensity >= 1) {
|
||||
flashIntensity = 0;
|
||||
}
|
||||
|
||||
// Hide flashes where there is now window.
|
||||
flashIntensity *= cogl_color_out.a;
|
||||
|
||||
// Hide scratched out parts.
|
||||
cogl_color_out *= (scratchMap > progress ? 1 : 0);
|
||||
|
||||
vec3 flashColor = vec3(${color.red / 255},
|
||||
${color.green / 255},
|
||||
${color.blue / 255}) * ${color.alpha / 255};
|
||||
|
||||
cogl_color_out.rgb += flashIntensity * mix(flashColor, vec3(0), progress);
|
||||
|
||||
// Fade out the remaining shards.
|
||||
float fadeProgress = smoothstep(0, 1, (progress - 1.0 + FF_TIME)/FF_TIME);
|
||||
cogl_color_out *= sqrt(1-fadeProgress*fadeProgress);
|
||||
|
||||
// These are pretty useful for understanding how this works.
|
||||
// cogl_color_out = vec4(vec3(flashIntensity), 1);
|
||||
// cogl_color_out = vec4(vec3(scratchMap), 1);
|
||||
}
|
||||
`);
|
||||
};
|
||||
|
||||
// This is overridden to bind the claw 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
|
||||
vfunc_paint_target(node, paint_context) {
|
||||
const pipeline = this.get_pipeline();
|
||||
pipeline.set_layer_texture(1, this._clawTexture.get_texture());
|
||||
this.set_uniform_value('uClawTexture', 1);
|
||||
super.vfunc_paint_target(node, paint_context);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -20,6 +20,7 @@ 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 hides the actor by making it first transparent from top and bottom //
|
||||
@@ -27,18 +28,38 @@ const utils = Me.imports.src.utils;
|
||||
// the center. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// The shader class for this effect is registered further down in this file.
|
||||
let Shader = null;
|
||||
// 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 TVEffect = class {
|
||||
|
||||
// The effect class is completely static. It 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 TVEffect = class TVEffect {
|
||||
// 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._uColor = shader.get_uniform_location('uColor');
|
||||
|
||||
// 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('tv-effect-color'))[1];
|
||||
shader.set_uniform_float(shader._uColor, 3,
|
||||
[c.red / 255, c.green / 255, c.blue / 255]);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------- metadata
|
||||
|
||||
// The effect is available on all GNOME Shell versions supported by this extension.
|
||||
static getMinShellVersion() {
|
||||
getMinShellVersion() {
|
||||
return [3, 36];
|
||||
}
|
||||
|
||||
@@ -46,22 +67,21 @@ var TVEffect = class TVEffect {
|
||||
// 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').
|
||||
static getNick() {
|
||||
getNick() {
|
||||
return 'tv';
|
||||
}
|
||||
|
||||
// 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.
|
||||
static getLabel() {
|
||||
getLabel() {
|
||||
return _('TV Effect');
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------- API for prefs.js
|
||||
|
||||
// This is called by the preferences dialog. It loads the settings page for this effect,
|
||||
// binds all properties to the settings and appends the page to the main stack of the
|
||||
// preferences dialog.
|
||||
static getPreferences(dialog) {
|
||||
// and binds all properties to the settings.
|
||||
getPreferences(dialog) {
|
||||
|
||||
// Add the settings page to the builder.
|
||||
dialog.getBuilder().add_from_resource(`/ui/${utils.getGTKString()}/TVEffect.ui`);
|
||||
@@ -76,103 +96,10 @@ var TVEffect = class TVEffect {
|
||||
|
||||
// ---------------------------------------------------------------- API for extension.js
|
||||
|
||||
// This is called from extension.js whenever a window is closed with this effect.
|
||||
static createShader(actor, settings, forOpening) {
|
||||
return new Shader(settings, forOpening);
|
||||
}
|
||||
|
||||
// The tweakTransition() is called from extension.js to tweak a window's open / close
|
||||
// transitions - usually windows are faded in / out and scaled up / down by GNOME Shell.
|
||||
// The parameter 'forOpening' is set to true if this is called for a window-open
|
||||
// transition, for a window-close transition it is set to false. The modes can be set to
|
||||
// any value from here: https://gjs-docs.gnome.org/clutter8~8_api/clutter.animationmode.
|
||||
// The only required property is 'opacity', even if it transitions from 1.0 to 1.0. The
|
||||
// current value of the opacity transition is passed as uProgress to the shader.
|
||||
// Tweaking the actor's scale during the transition only works properly for GNOME 3.38+.
|
||||
|
||||
// For this effect, windows are scaled down vertically.
|
||||
static tweakTransition(actor, settings, forOpening) {
|
||||
return {
|
||||
'opacity': {from: 255, to: 255, mode: 3},
|
||||
'scale-x': {from: 1.0, to: 1.0, mode: 3},
|
||||
'scale-y': {from: forOpening ? 0.5 : 1.0, to: forOpening ? 1.0 : 0.5, mode: 3}
|
||||
};
|
||||
// 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};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// The shader class for this effect will only be registered in GNOME Shell's process //
|
||||
// (not in the preferences process). It's done this way as Clutter may not be installed //
|
||||
// on the system and therefore the preferences would crash. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
if (utils.isInShellProcess()) {
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const shaderSnippets = Me.imports.src.shaderSnippets;
|
||||
|
||||
Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect {
|
||||
_init(settings, forOpening) {
|
||||
super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
|
||||
|
||||
const color = Clutter.Color.from_string(settings.get_string('tv-effect-color'))[1];
|
||||
|
||||
this.set_shader_source(`
|
||||
|
||||
// Inject some common shader snippets.
|
||||
${shaderSnippets.standardUniforms()}
|
||||
|
||||
const float BLUR_WIDTH = 0.01; // Width of the gradients.
|
||||
const float TB_TIME = 0.7; // Relative time for the top/bottom animation.
|
||||
const float LR_TIME = 0.4; // Relative time for the left/right animation.
|
||||
const float LR_DELAY = 0.6; // Delay after which the left/right animation starts.
|
||||
const float FF_TIME = 0.1; // Relative time for the final fade to transparency.
|
||||
|
||||
void main() {
|
||||
|
||||
float progress = ${forOpening ? '1.0-uProgress' : 'uProgress'};
|
||||
|
||||
// All of these are in [0..1] during the different stages of the animation.
|
||||
// tb refers to the top-bottom animation.
|
||||
// lr refers to the left-right animation.
|
||||
// ff refers to the final fade animation.
|
||||
float tbProgress = smoothstep(0, 1, clamp(progress/TB_TIME, 0, 1));
|
||||
float lrProgress = smoothstep(0, 1, clamp((progress - LR_DELAY)/LR_TIME, 0, 1));
|
||||
float ffProgress = smoothstep(0, 1, clamp((progress - 1.0 + FF_TIME)/FF_TIME, 0, 1));
|
||||
|
||||
// This is a top-center-bottom gradient in [0..1..0]
|
||||
float tb = cogl_tex_coord_in[0].t * 2;
|
||||
tb = tb < 1 ? tb : 2 - tb;
|
||||
|
||||
// This is a left-center-right gradient in [0..1..0]
|
||||
float lr = cogl_tex_coord_in[0].s * 2;
|
||||
lr = lr < 1 ? lr : 2 - lr;
|
||||
|
||||
// Combine the progress values with the gradients to create the alpha masks.
|
||||
float tbMask = 1 - smoothstep(0, 1, clamp((tbProgress - tb) / BLUR_WIDTH, 0, 1));
|
||||
float lrMask = 1 - smoothstep(0, 1, clamp((lrProgress - lr) / BLUR_WIDTH, 0, 1));
|
||||
float ffMask = 1 - smoothstep(0, 1, ffProgress);
|
||||
|
||||
// Assemble the final alpha value.
|
||||
float mask = tbMask * lrMask * ffMask;
|
||||
|
||||
vec4 windowColor = texture2D(uTexture, cogl_tex_coord_in[0].st);
|
||||
vec4 effectColor = vec4(${color.red / 255},
|
||||
${color.green / 255},
|
||||
${color.blue / 255}, 1.0) * windowColor.a;
|
||||
|
||||
windowColor.rgb = mix(windowColor.rgb, effectColor.rgb, smoothstep(0, 1, progress));
|
||||
|
||||
cogl_color_out = windowColor * mask;
|
||||
|
||||
// These are pretty useful for understanding how this works.
|
||||
// cogl_color_out = vec4(vec3(tbMask), 1);
|
||||
// cogl_color_out = vec4(vec3(lrMask), 1);
|
||||
// cogl_color_out = vec4(vec3(ffMask), 1);
|
||||
// cogl_color_out = vec4(vec3(mask), 1);
|
||||
}
|
||||
`);
|
||||
};
|
||||
});
|
||||
}
|
||||
@@ -20,47 +20,76 @@ 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 lets your windows be carried to the realm of dreams by some little //
|
||||
// fairies. It's implemented with several overlaid grids of randomly moving points. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// The shader class for this effect is registered further down in this file.
|
||||
let Shader = null;
|
||||
// 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 Wisps = class {
|
||||
|
||||
// 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').
|
||||
var Wisps = class Wisps {
|
||||
// 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._uScale = shader.get_uniform_location('uScale');
|
||||
|
||||
// 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('wisps-color'))[1];
|
||||
|
||||
// If we are currently performing integration test, the animation uses 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._uScale, 1, [settings.get_double('wisps-scale')]);
|
||||
// clang-format on
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------- metadata
|
||||
|
||||
// The effect is available on all GNOME Shell versions supported by this extension.
|
||||
static getMinShellVersion() {
|
||||
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. the '*-close-effect').
|
||||
static getNick() {
|
||||
getNick() {
|
||||
return 'wisps';
|
||||
}
|
||||
|
||||
// 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.
|
||||
static getLabel() {
|
||||
getLabel() {
|
||||
return _('Wisps');
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------- API for prefs.js
|
||||
|
||||
// This is called by the preferences dialog. It loads the settings page for this effect,
|
||||
// binds all properties to the settings and appends the page to the main stack of the
|
||||
// preferences dialog.
|
||||
static getPreferences(dialog) {
|
||||
// and binds all properties to the settings.
|
||||
getPreferences(dialog) {
|
||||
|
||||
// Add the settings page to the builder.
|
||||
dialog.getBuilder().add_from_resource(`/ui/${utils.getGTKString()}/Wisps.ui`);
|
||||
@@ -76,146 +105,10 @@ var Wisps = class Wisps {
|
||||
|
||||
// ---------------------------------------------------------------- API for extension.js
|
||||
|
||||
// This is called from extension.js whenever a window is closed with this effect.
|
||||
static createShader(actor, settings, forOpening) {
|
||||
return new Shader(settings, forOpening);
|
||||
}
|
||||
|
||||
// The tweakTransition() is called from extension.js to tweak a window's open / close
|
||||
// transitions - usually windows are faded in / out and scaled up / down by GNOME Shell.
|
||||
// The parameter 'forOpening' is set to true if this is called for a window-open
|
||||
// transition, for a window-close transition it is set to false. The modes can be set to
|
||||
// any value from here: https://gjs-docs.gnome.org/clutter8~8_api/clutter.animationmode.
|
||||
// The only required property is 'opacity', even if it transitions from 1.0 to 1.0. The
|
||||
// current value of the opacity transition is passed as uProgress to the shader.
|
||||
// Tweaking the actor's scale during the transition only works properly for GNOME 3.38+.
|
||||
|
||||
// For this effect, windows should be scaled down slightly but not faded.
|
||||
static tweakTransition(actor, settings, forOpening) {
|
||||
return {
|
||||
'opacity': {from: 255, to: 255, mode: 3},
|
||||
'scale-x': {from: forOpening ? 0.9 : 1.0, to: forOpening ? 1.0 : 0.9, mode: 3},
|
||||
'scale-y': {from: forOpening ? 0.9 : 1.0, to: forOpening ? 1.0 : 0.9, mode: 3}
|
||||
};
|
||||
// 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};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// The shader class for this effect will only be registered in GNOME Shell's process //
|
||||
// (not in the preferences process). It's done this way as Clutter may not be installed //
|
||||
// on the system and therefore the preferences would crash. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
if (utils.isInShellProcess()) {
|
||||
|
||||
const Clutter = imports.gi.Clutter;
|
||||
const shaderSnippets = Me.imports.src.shaderSnippets;
|
||||
|
||||
Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect {
|
||||
_init(settings, forOpening) {
|
||||
super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
|
||||
|
||||
const color = Clutter.Color.from_string(settings.get_string('wisps-color'))[1];
|
||||
|
||||
// If we are currently performing integration test, the animation uses a fixed seed.
|
||||
const testMode = settings.get_boolean('test-mode');
|
||||
|
||||
this.set_shader_source(`
|
||||
|
||||
// Inject some common shader snippets.
|
||||
${shaderSnippets.standardUniforms()}
|
||||
${shaderSnippets.noise()}
|
||||
${shaderSnippets.edgeMask()}
|
||||
|
||||
const vec2 SEED = vec2(${testMode ? 0 : Math.random()},
|
||||
${testMode ? 0 : Math.random()});
|
||||
const float WISPS_RADIUS = 20.0;
|
||||
const float WISPS_SPEED = 10.0;
|
||||
const float WISPS_SPACING = 40 + WISPS_RADIUS;
|
||||
const int WISPS_LAYERS = 8;
|
||||
const float WISPS_IN_TIME = 0.5;
|
||||
const float WINDOW_OUT_TIME = 1.0;
|
||||
|
||||
// Returns a grid of randomly moving points. Each grid cell contains one point which
|
||||
// moves on an ellipse.
|
||||
float getWisps(vec2 texCoords, float gridSize, vec2 seed) {
|
||||
|
||||
// Shift coordinates by a random offset and make sure the have a 1:1 aspect ratio.
|
||||
vec2 coords = (texCoords + hash22(seed)) * vec2(uSizeX, uSizeY);
|
||||
|
||||
// Apply global scale.
|
||||
coords /= gridSize;
|
||||
|
||||
// Get grid cell coordinates in [0..1].
|
||||
vec2 cellUV = mod(coords, vec2(1));
|
||||
|
||||
// This is unique for each cell.
|
||||
vec2 cellID = coords-cellUV + vec2(362.456);
|
||||
|
||||
// Add random rotation, scale and offset to each grid cell.
|
||||
float speed = mix(10.0, 15.0, hash12(cellID*seed*134.451)) / gridSize * WISPS_SPEED;
|
||||
float rotation = mix( 0.0, 6.283, hash12(cellID*seed*54.4129));
|
||||
float radius = mix( 0.5, 1.0, hash12(cellID*seed*19.1249)) * WISPS_RADIUS;
|
||||
float roundness = mix(-1.0, 1.0, hash12(cellID*seed*7.51949));
|
||||
|
||||
vec2 offset = vec2(sin(speed * (uTime+1)) * roundness, cos(speed * (uTime+1)));
|
||||
offset *= 0.5 - 0.5 * radius / gridSize;
|
||||
offset = vec2(offset.x * cos(rotation) - offset.y * sin(rotation),
|
||||
offset.x * sin(rotation) + offset.y * cos(rotation));
|
||||
|
||||
cellUV += offset;
|
||||
|
||||
// Use distance to center of shifted / rotated UV coordinates to draw a glaring point.
|
||||
float dist = length(cellUV - 0.5) * gridSize / radius;
|
||||
if (dist < 1.0) {
|
||||
return min(10, 0.01 / pow(dist, 2.0));
|
||||
}
|
||||
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
void main() {
|
||||
|
||||
float progress = ${forOpening ? '1.0-uProgress' : 'uProgress'};
|
||||
|
||||
// Get the color of the window.
|
||||
vec4 windowColor = texture2D(uTexture, cogl_tex_coord_in[0].st);
|
||||
vec4 effectColor = vec4(${color.red / 255},
|
||||
${color.green / 255},
|
||||
${color.blue / 255}, 1.0) * windowColor.a;
|
||||
|
||||
// Compute several layers of moving wisps.
|
||||
vec2 uv = (cogl_tex_coord_in[0].st-0.5) / mix(1.0, 0.5, progress) + 0.5;
|
||||
uv /= ${settings.get_double('wisps-scale')};
|
||||
float wisps = 0;
|
||||
for (int i=0; i<WISPS_LAYERS; ++i) {
|
||||
wisps += getWisps(uv*0.3, WISPS_SPACING, SEED * (i+1));
|
||||
}
|
||||
|
||||
// Compute shrinking edge mask.
|
||||
float mask = getRelativeEdgeMask(mix(0.01, 0.5, progress));
|
||||
|
||||
// Compute three different progress values.
|
||||
float wispsIn = smoothstep(0, 1, clamp(progress/WISPS_IN_TIME, 0, 1));
|
||||
float wispsOut = smoothstep(0, 1, clamp((progress - WISPS_IN_TIME)/(1.0 - WISPS_IN_TIME), 0, 1));
|
||||
float windowOut = smoothstep(0, 1, clamp(progress/WINDOW_OUT_TIME, 0, 1));
|
||||
|
||||
// Use a noise function to dissolve the window.
|
||||
float noise = smoothstep(1.0, 0.0, abs(2.0 * simplex2DFractal(uv * vec2(uSizeX, uSizeY) / 250) - 1.0));
|
||||
float windowMask = 1.0 - (windowOut < 0.5 ? mix(0.0, noise, windowOut * 2.0) : mix(noise, 1.0, windowOut * 2.0 - 1.0));
|
||||
cogl_color_out = windowColor * windowMask * mask;
|
||||
|
||||
// Add the wisps.
|
||||
cogl_color_out += min(wispsIn, 1.0 - wispsOut) * wisps * effectColor * mask;
|
||||
|
||||
// These are pretty useful for understanding how this works.
|
||||
// cogl_color_out = vec4(vec3(windowMask), 1.0);
|
||||
// cogl_color_out = vec4(vec3(wisps), 1.0);
|
||||
// cogl_color_out = vec4(vec3(noise), 1.0);
|
||||
// cogl_color_out = vec4(vec3(mask*min(wispsIn, 1.0 - wispsOut)), 1.0);
|
||||
}
|
||||
`);
|
||||
};
|
||||
});
|
||||
}
|
||||
@@ -1,275 +0,0 @@
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// ) ( //
|
||||
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
|
||||
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
|
||||
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
|
||||
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
|
||||
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
|
||||
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
|
||||
// |__/ //
|
||||
// Copyright (c) 2021 Simon Schneegans //
|
||||
// Released under the GPLv3 or later. See LICENSE file for details. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
'use strict';
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
// These functions return strings which can be injected to GLSL shader code. //
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// These should be included in every shader.
|
||||
// uTexture: Contains the texture of the window.
|
||||
// uProgress: A value which transitions from 0 to 1 during the entire animation.
|
||||
// uTime: A steadily increasing value in seconds.
|
||||
// uSizeX: The horizontal size of uTexture in pixels.
|
||||
// uSizeY: The vertical size of uTexture in pixels.
|
||||
function standardUniforms() {
|
||||
return `
|
||||
uniform sampler2D uTexture;
|
||||
uniform float uProgress;
|
||||
uniform float uTime;
|
||||
uniform int uSizeX;
|
||||
uniform int uSizeY;
|
||||
`;
|
||||
}
|
||||
|
||||
// This method returns a mask which smoothly transitions towards zero when approaching
|
||||
// the window's borders. There is a variant which takes the transition area width in
|
||||
// pixels and one which takes this as a percentage.
|
||||
function edgeMask() {
|
||||
return `
|
||||
float getEdgeMask(vec2 uv, vec2 maxUV, float fadeWidth) {
|
||||
float mask = 1.0;
|
||||
mask *= smoothstep(0, 1, clamp(uv.x / fadeWidth, 0, 1));
|
||||
mask *= smoothstep(0, 1, clamp(uv.y / fadeWidth, 0, 1));
|
||||
mask *= smoothstep(0, 1, clamp((maxUV.x - uv.x) / fadeWidth, 0, 1));
|
||||
mask *= smoothstep(0, 1, clamp((maxUV.y - uv.y) / fadeWidth, 0, 1));
|
||||
|
||||
return mask;
|
||||
}
|
||||
|
||||
float getAbsoluteEdgeMask(float fadePixels) {
|
||||
vec2 uv = cogl_tex_coord_in[0].st * vec2(uSizeX, uSizeY);
|
||||
return getEdgeMask(uv, vec2(uSizeX, uSizeY), fadePixels);
|
||||
}
|
||||
|
||||
float getRelativeEdgeMask(float fadeAmount) {
|
||||
vec2 uv = cogl_tex_coord_in[0].st;
|
||||
return getEdgeMask(uv, vec2(1.0), fadeAmount);
|
||||
}
|
||||
`;
|
||||
}
|
||||
|
||||
// These noise algorithms are based on implementations by various authors from
|
||||
// shadertoy.com, which are all available under the MIT License. See the respective links
|
||||
// in the comments below.
|
||||
function noise() {
|
||||
return `
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
// Hash without Sine //
|
||||
// MIT License, https://www.shadertoy.com/view/4djSRW //
|
||||
// Copyright (c) 2014 David Hoskins. //
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// 1 out, 1 in...
|
||||
float hash11(float p) {
|
||||
p = fract(p * .1031);
|
||||
p *= p + 33.33;
|
||||
p *= p + p;
|
||||
return fract(p);
|
||||
}
|
||||
|
||||
// 1 out, 2 in...
|
||||
float hash12(vec2 p) {
|
||||
vec3 p3 = fract(vec3(p.xyx) * .1031);
|
||||
p3 += dot(p3, p3.yzx + 33.33);
|
||||
return fract((p3.x + p3.y) * p3.z);
|
||||
}
|
||||
|
||||
// 1 out, 3 in...
|
||||
float hash13(vec3 p3) {
|
||||
p3 = fract(p3 * .1031);
|
||||
p3 += dot(p3, p3.zyx + 31.32);
|
||||
return fract((p3.x + p3.y) * p3.z);
|
||||
}
|
||||
|
||||
// 2 out, 1 in...
|
||||
vec2 hash21(float p) {
|
||||
vec3 p3 = fract(vec3(p) * vec3(.1031, .1030, .0973));
|
||||
p3 += dot(p3, p3.yzx + 33.33);
|
||||
return fract((p3.xx+p3.yz)*p3.zy);
|
||||
}
|
||||
|
||||
// 2 out, 2 in...
|
||||
vec2 hash22(vec2 p) {
|
||||
vec3 p3 = fract(vec3(p.xyx) * vec3(.1031, .1030, .0973));
|
||||
p3 += dot(p3, p3.yzx+33.33);
|
||||
return fract((p3.xx+p3.yz)*p3.zy);
|
||||
}
|
||||
|
||||
// 2 out, 3 in...
|
||||
vec2 hash23(vec3 p3) {
|
||||
p3 = fract(p3 * vec3(.1031, .1030, .0973));
|
||||
p3 += dot(p3, p3.yzx+33.33);
|
||||
return fract((p3.xx+p3.yz)*p3.zy);
|
||||
}
|
||||
|
||||
// 3 out, 1 in...
|
||||
vec3 hash31(float p) {
|
||||
vec3 p3 = fract(vec3(p) * vec3(.1031, .1030, .0973));
|
||||
p3 += dot(p3, p3.yzx+33.33);
|
||||
return fract((p3.xxy+p3.yzz)*p3.zyx);
|
||||
}
|
||||
|
||||
// 3 out, 2 in...
|
||||
vec3 hash32(vec2 p) {
|
||||
vec3 p3 = fract(vec3(p.xyx) * vec3(.1031, .1030, .0973));
|
||||
p3 += dot(p3, p3.yxz+33.33);
|
||||
return fract((p3.xxy+p3.yzz)*p3.zyx);
|
||||
}
|
||||
|
||||
// 3 out, 3 in...
|
||||
vec3 hash33(vec3 p3) {
|
||||
p3 = fract(p3 * vec3(.1031, .1030, .0973));
|
||||
p3 += dot(p3, p3.yxz+33.33);
|
||||
return fract((p3.xxy + p3.yxx)*p3.zyx);
|
||||
}
|
||||
|
||||
// 4 out, 1 in...
|
||||
vec4 hash41(float p) {
|
||||
vec4 p4 = fract(vec4(p) * vec4(.1031, .1030, .0973, .1099));
|
||||
p4 += dot(p4, p4.wzxy+33.33);
|
||||
return fract((p4.xxyz+p4.yzzw)*p4.zywx);
|
||||
}
|
||||
|
||||
// 4 out, 2 in...
|
||||
vec4 hash42(vec2 p) {
|
||||
vec4 p4 = fract(vec4(p.xyxy) * vec4(.1031, .1030, .0973, .1099));
|
||||
p4 += dot(p4, p4.wzxy+33.33);
|
||||
return fract((p4.xxyz+p4.yzzw)*p4.zywx);
|
||||
}
|
||||
|
||||
// 4 out, 3 in...
|
||||
vec4 hash43(vec3 p) {
|
||||
vec4 p4 = fract(vec4(p.xyzx) * vec4(.1031, .1030, .0973, .1099));
|
||||
p4 += dot(p4, p4.wzxy+33.33);
|
||||
return fract((p4.xxyz+p4.yzzw)*p4.zywx);
|
||||
}
|
||||
|
||||
// 4 out, 4 in...
|
||||
vec4 hash44(vec4 p4) {
|
||||
p4 = fract(p4 * vec4(.1031, .1030, .0973, .1099));
|
||||
p4 += dot(p4, p4.wzxy+33.33);
|
||||
return fract((p4.xxyz+p4.yzzw)*p4.zywx);
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
// 2D Simplex Noise //
|
||||
// MIT License, https://www.shadertoy.com/view/Msf3WH //
|
||||
// Copyright © 2013 Inigo Quilez //
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
float simplex2D(vec2 p) {
|
||||
const float K1 = 0.366025404; // (sqrt(3)-1)/2;
|
||||
const float K2 = 0.211324865; // (3-sqrt(3))/6;
|
||||
|
||||
vec2 i = floor( p + (p.x+p.y)*K1 );
|
||||
vec2 a = p - i + (i.x+i.y)*K2;
|
||||
float m = step(a.y,a.x);
|
||||
vec2 o = vec2(m,1.0-m);
|
||||
vec2 b = a - o + K2;
|
||||
vec2 c = a - 1.0 + 2.0*K2;
|
||||
vec3 h = max( 0.5-vec3(dot(a,a), dot(b,b), dot(c,c) ), 0.0 );
|
||||
vec3 n = h*h*h*h*vec3( dot(a,-1.0 + 2.0 * hash22(i+0.0)),
|
||||
dot(b,-1.0 + 2.0 * hash22(i+o)),
|
||||
dot(c,-1.0 + 2.0 * hash22(i+1.0)));
|
||||
return 0.5 + 0.5 * dot( n, vec3(70.0) );
|
||||
}
|
||||
|
||||
float simplex2DFractal(vec2 p) {
|
||||
mat2 m = mat2( 1.6, 1.2, -1.2, 1.6 );
|
||||
float f = 0.5000*simplex2D( p ); p = m*p;
|
||||
f += 0.2500*simplex2D( p ); p = m*p;
|
||||
f += 0.1250*simplex2D( p ); p = m*p;
|
||||
f += 0.0625*simplex2D( p ); p = m*p;
|
||||
|
||||
return f;
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
// 3D Simplex Noise //
|
||||
// MIT License, https://www.shadertoy.com/view/XsX3zB //
|
||||
// Copyright © 2013 Nikita Miropolskiy //
|
||||
////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
float simplex3D(vec3 p) {
|
||||
|
||||
// skew constants for 3D simplex functions
|
||||
const float F3 = 0.3333333;
|
||||
const float G3 = 0.1666667;
|
||||
|
||||
// 1. find current tetrahedron T and it's four vertices
|
||||
// s, s+i1, s+i2, s+1.0 - absolute skewed (integer) coordinates of T vertices
|
||||
// x, x1, x2, x3 - unskewed coordinates of p relative to each of T vertice
|
||||
|
||||
// calculate s and x
|
||||
vec3 s = floor(p + dot(p, vec3(F3)));
|
||||
vec3 x = p - s + dot(s, vec3(G3));
|
||||
|
||||
// calculate i1 and i2
|
||||
vec3 e = step(vec3(0.0), x - x.yzx);
|
||||
vec3 i1 = e*(1.0 - e.zxy);
|
||||
vec3 i2 = 1.0 - e.zxy*(1.0 - e);
|
||||
|
||||
// x1, x2, x3
|
||||
vec3 x1 = x - i1 + G3;
|
||||
vec3 x2 = x - i2 + 2.0*G3;
|
||||
vec3 x3 = x - 1.0 + 3.0*G3;
|
||||
|
||||
// 2. find four surflets and store them in d
|
||||
vec4 w, d;
|
||||
|
||||
// calculate surflet weights
|
||||
w.x = dot(x, x);
|
||||
w.y = dot(x1, x1);
|
||||
w.z = dot(x2, x2);
|
||||
w.w = dot(x3, x3);
|
||||
|
||||
// w fades from 0.6 at the center of the surflet to 0.0 at the margin
|
||||
w = max(0.6 - w, 0.0);
|
||||
|
||||
// calculate surflet components
|
||||
d.x = dot(-0.5 + hash33(s), x);
|
||||
d.y = dot(-0.5 + hash33(s + i1), x1);
|
||||
d.z = dot(-0.5 + hash33(s + i2), x2);
|
||||
d.w = dot(-0.5 + hash33(s + 1.0), x3);
|
||||
|
||||
// multiply d by w^4
|
||||
w *= w;
|
||||
w *= w;
|
||||
d *= w;
|
||||
|
||||
// 3. return the sum of the four surflets
|
||||
return dot(d, vec4(52.0)) * 0.5 + 0.5;
|
||||
}
|
||||
|
||||
|
||||
// directional artifacts can be reduced by rotating each octave
|
||||
float simplex3DFractal(vec3 m) {
|
||||
|
||||
// const matrices for 3D rotation
|
||||
const mat3 rot1 = mat3(-0.37, 0.36, 0.85,-0.14,-0.93, 0.34,0.92, 0.01,0.4);
|
||||
const mat3 rot2 = mat3(-0.55,-0.39, 0.74, 0.33,-0.91,-0.24,0.77, 0.12,0.63);
|
||||
const mat3 rot3 = mat3(-0.71, 0.52,-0.47,-0.08,-0.72,-0.68,-0.7,-0.45,0.56);
|
||||
|
||||
return 0.5333333*simplex3D(m*rot1)
|
||||
+0.2666667*simplex3D(2.0*m*rot2)
|
||||
+0.1333333*simplex3D(4.0*m*rot3)
|
||||
+0.0666667*simplex3D(8.0*m);
|
||||
}
|
||||
|
||||
`;
|
||||
}
|
||||
@@ -15,10 +15,18 @@
|
||||
|
||||
const {Gtk} = imports.gi;
|
||||
|
||||
// Returns the given argument, except for "alpha" and "beta". In these cases -2 and -1 are
|
||||
// returned respectively.
|
||||
// Returns the given argument, except for "alpha", "beta", and "rc". In these cases -3,
|
||||
// -2, and -1 are returned respectively.
|
||||
function toNumericVersion(x) {
|
||||
return x == 'alpha' ? -2 : x == 'beta' ? -1 : x;
|
||||
switch (x) {
|
||||
case 'alpha':
|
||||
return -3;
|
||||
case 'beta':
|
||||
return -2;
|
||||
case 'rc':
|
||||
return -1;
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
const Config = imports.misc.config;
|
||||
@@ -57,12 +65,6 @@ function getGTKString() {
|
||||
return isGTK4() ? 'gtk4' : 'gtk3';
|
||||
}
|
||||
|
||||
// This method returns true if called in GNOME Shell's process, false if called in the
|
||||
// preferences process.
|
||||
function isInShellProcess() {
|
||||
return window.global && global.stage;
|
||||
}
|
||||
|
||||
// This method returns true if the current GNOME Shell version matches the given
|
||||
// arguments.
|
||||
function shellVersionIs(major, minor) {
|
||||
|
||||
@@ -110,14 +110,12 @@ capture_effect() {
|
||||
set_setting "open-preview-effect" "${1}"
|
||||
set_setting "close-preview-effect" "${1}"
|
||||
|
||||
sleep 2
|
||||
do_in_pod gnome-extensions prefs "${EXTENSION}"
|
||||
sleep 2
|
||||
sleep 3
|
||||
capture "tests/references/${1}-open-${SESSION}-${FEDORA_VERSION}.png"
|
||||
send_keystroke "Alt+F4"
|
||||
sleep 2
|
||||
sleep 3
|
||||
capture "tests/references/${1}-close-${SESSION}-${FEDORA_VERSION}.png"
|
||||
sleep 2
|
||||
}
|
||||
|
||||
# ----------------------------------------------------- wait for the container to start up
|
||||
@@ -171,13 +169,19 @@ do_in_pod gsettings set org.gnome.mutter center-new-windows true
|
||||
capture_effect "energize-a"
|
||||
capture_effect "energize-b"
|
||||
capture_effect "fire"
|
||||
capture_effect "hexagon"
|
||||
capture_effect "tv"
|
||||
capture_effect "wisps"
|
||||
|
||||
if [[ "${FEDORA_VERSION}" -gt 32 ]]; then
|
||||
capture_effect "apparition"
|
||||
fi
|
||||
|
||||
if [[ "${FEDORA_VERSION}" -gt 33 ]]; then
|
||||
capture_effect "trex"
|
||||
capture_effect "broken-glass"
|
||||
capture_effect "matrix"
|
||||
capture_effect "snap"
|
||||
fi
|
||||
|
||||
echo "All reference images generated successfully."
|
||||
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 967 B |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 685 B |
|
After Width: | Height: | Size: 685 B |
|
After Width: | Height: | Size: 1021 B |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 967 B |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 685 B |
|
After Width: | Height: | Size: 685 B |