Compare commits

...

274 Commits

Author SHA1 Message Date
Simon Schneegans 2ca8e2ed17 📝 Set release date
Deploy / Bundle GNOME Shell Extension (push) Has been cancelled
Deploy / Bundle KWin Effect (push) Has been cancelled
2022-08-18 06:29:43 +02:00
Simon Schneegans 74e34e9fdf 🔧 Fix shellcheck issues 2022-08-18 06:29:17 +02:00
Simon Schneegans 426eb96b60 🎉 Add an archive for each kwin effect to the releases 2022-08-18 06:24:02 +02:00
Simon Schneegans 4998eb948f 💞 Update sponsors 2022-08-17 21:19:23 +02:00
Simon Schneegans 902173cb19 💞 Update sponsors 2022-08-17 21:16:58 +02:00
Simon Schneegans fcda6e082b 📝 Add changelog entry 2022-08-17 20:58:26 +02:00
Kristoffer Grundström be77e4283b 🌐 Translated using Weblate (Swedish) 2022-08-17 15:46:29 +02:00
Luna Jernberg d931672770 🌐 Translated using Weblate (Swedish) 2022-08-17 15:46:29 +02:00
obslsessed 90ee16ca75 🌐 Translated using Weblate (Swedish) 2022-08-17 15:46:29 +02:00
Simon Schneegans fbeb40c2d0 💞 Add new sponsor 2022-07-28 05:29:21 +02:00
Simon Schneegans a0121f4300 🔀 Merge pull request #196 from Schneegans/feature/incinerate-from-pointer-kwin 2022-07-21 16:59:12 +02:00
Simon Schneegans 784bf9ff6a 📝 Add changelog entry 2022-07-21 16:53:49 +02:00
Simon Schneegans 8b86ed5f7e 🪲 Fix kwin fire effect configuration ui 2022-07-21 16:52:03 +02:00
Simon Schneegans 69bc84189c 🔧 Add toggle to enable the start-from-pointer on kwin 2022-07-21 16:39:42 +02:00
Simon Schneegans 41dee16c12 🎉 Incinerate from pointer on kwin 2022-07-21 16:32:59 +02:00
Simon Schneegans ec1da1a3ea 🔀 Merge pull request #195 from Schneegans/feature/incinerate-from-pointer 2022-07-21 13:11:07 +02:00
Simon Schneegans 476fc39b3a 🔧 Update test references 2022-07-21 12:58:50 +02:00
Simon Schneegans 8e59c66cb2 📝 Add changelog entry 2022-07-20 17:08:03 +02:00
Simon Schneegans 144fc16634 🎉 Start incinerate effect at pointer location 2022-07-20 17:06:04 +02:00
Simon Schneegans 355a9eb395 🎉 Add end-animation signal 2022-07-20 16:51:44 +02:00
Jose Riha a3ba8cc97d 🌐 Translated using Weblate (Slovak) 2022-07-18 20:19:48 +02:00
joe d7cbdc8670 🌐 Translated using Weblate (Chinese (Simplified)) 2022-07-18 20:19:48 +02:00
phlostically b87162cfe3 🌐 Translated using Weblate (Esperanto) 2022-07-13 21:07:09 +02:00
phlostically b44f1381ac 🌐 Added translation using Weblate (Esperanto) 2022-07-09 12:34:00 +02:00
Егор Ермаков 38ddf17d07 🌐 Translated using Weblate (Russian) 2022-07-09 07:20:32 +02:00
Егор Ермаков a6466e140b 🌐 Translated using Weblate (Russian) 2022-07-09 07:20:32 +02:00
Óscar Fernández Díaz 6d85a22b57 🌐 Translated using Weblate (Spanish) 2022-07-09 07:20:32 +02:00
Simon Schneegans f8c3654d37 💞 Add new sponsor 2022-07-09 07:02:33 +02:00
יהודה אליסף f02f2fa772 🌐 Translated using Weblate (Hebrew) 2022-07-04 06:11:07 +02:00
Paweł Rzońca b145ea5ab2 🌐 Translated using Weblate (Polish) 2022-07-04 06:11:07 +02:00
Jorge C a2bf9292bc 🌐 Translated using Weblate (Spanish) 2022-07-04 06:11:07 +02:00
dyegoaurelio 81b785e348 🌐 Translated using Weblate (Portuguese) 2022-07-04 06:11:07 +02:00
KrulesExGamer d8a7cb3523 🌐 Translated using Weblate (Portuguese) 2022-07-04 06:11:07 +02:00
יהודה אליסף 00a1ed5270 🌐 Added translation using Weblate (Hebrew) 2022-07-04 06:11:07 +02:00
KrulesExGamer 0d592827f7 🌐 Added translation using Weblate (Portuguese) 2022-07-04 06:11:07 +02:00
Mathieu B a6c106697b 🌐 Translated using Weblate (French) 2022-07-04 06:11:07 +02:00
Simon Schneegans 27b3ee03f4 🎉 Bump version number 2022-06-30 05:28:38 +02:00
Simon Schneegans 9d660a4808 🎉 Bump version number
Deploy / Bundle GNOME Shell Extension (push) Has been cancelled
Deploy / Bundle KWin Effect (push) Has been cancelled
2022-06-30 05:24:09 +02:00
Simon Schneegans dc633ef78f 📝 Add changelog entry 2022-06-30 05:23:59 +02:00
Simon Schneegans 94c3dfacd0 🔧 Do not include kwin files in GNOME package 2022-06-30 05:21:18 +02:00
Simon Schneegans 74f759e5a3 📝 Set release date
Deploy / Bundle GNOME Shell Extension (push) Has been cancelled
Deploy / Bundle KWin Effect (push) Has been cancelled
2022-06-30 05:12:33 +02:00
Simon Schneegans 75e4a9c94d 💞 Update credits 2022-06-30 05:03:56 +02:00
albanobattistella 7c194e0b65 🌐 Translated using Weblate (Italian) 2022-06-29 21:44:21 +02:00
Heimen Stoffels c87f088f7d 🌐 Translated using Weblate (Dutch) 2022-06-29 21:44:21 +02:00
Simon Schneegans 3e33953fdd 📝 Add changelog entry 2022-06-26 09:48:30 +02:00
Simon Schneegans 79a3e2241a 💞 Update credits 2022-06-26 08:03:58 +02:00
Simon Schneegans 4aef62b07c 🪲 Fix incinerate random seed on kwin 2022-06-25 21:03:23 +02:00
Simon Schneegans 6b3a6a60b3 🌐 Translated using Weblate (German) 2022-06-25 05:56:53 +02:00
Hosted Weblate 3728660047 🌐 Update translation files 2022-06-25 05:56:53 +02:00
Simon Schneegans 0a4c83a80c 🔀 Merge pull request #174 from Schneegans/feature/incinerate 2022-06-25 05:42:43 +02:00
Simon Schneegans 772c1dc15a 🔧 Disable X11 tests again... 2022-06-25 05:38:30 +02:00
Simon Schneegans 88bf8a9a9e 🔧 Update test references 2022-06-25 05:29:33 +02:00
Simon Schneegans 6135bef34e 🔧 Add incinerate effect to test suite 2022-06-25 05:29:15 +02:00
Simon Schneegans 9a74b9d874 🔧 Attempt to run xsession tests 2022-06-25 05:06:43 +02:00
Simon Schneegans 19f03dddf6 🌐 Update translation template 2022-06-25 05:05:28 +02:00
Simon Schneegans 4201a9ea35 🔧 Do not yet attempt to translate KWin effects 2022-06-25 05:05:19 +02:00
Simon Schneegans 85246135af 📝 Add more comments 2022-06-25 05:02:07 +02:00
Simon Schneegans 573613c2d7 📝 Add some comments 2022-06-21 22:29:09 +02:00
jagfwajgf 9b7822a245 🌐 Translated using Weblate (German) 2022-06-21 18:03:51 +02:00
Simon Schneegans d32d02e07b 📝 Use more precise version number 2022-06-21 07:44:12 +02:00
Simon Schneegans 4106167c49 💞 Add new sponsor 2022-06-21 07:43:32 +02:00
Simon Schneegans 395f2702e8 📝 Add changelog entry 2022-06-21 07:20:59 +02:00
Simon Schneegans 1b09955fef 🔧 Tweak default turbulence of incinerate effect 2022-06-21 07:20:40 +02:00
Simon Schneegans a17fbfd114 🔧 Tweak scale of incinerate effect 2022-06-21 07:12:52 +02:00
Simon Schneegans b40d0f068b 🔧 MAke iTexCoord behave the same on KWin and GNOME 2022-06-21 07:12:34 +02:00
Simon Schneegans c84530931d 🔧 Set seed for incinerate on kwin 2022-06-20 06:01:10 +02:00
Simon Schneegans ae072bf427 🔧 KWin fixes 2022-06-20 05:58:51 +02:00
Simon Schneegans e4b16ba599 🔧 KWin fixes 2022-06-20 05:57:57 +02:00
Simon Schneegans 3ec64ec585 🔧 Remove implicit casts 2022-06-20 05:56:46 +02:00
Simon Schneegans 0f22ac4915 🔧 Remove implicit casts 2022-06-20 05:55:26 +02:00
Simon Schneegans 746cb29ef3 💄 Tweak ui of kwin incinerate settings 2022-06-20 05:55:17 +02:00
Simon Schneegans 48abc8b598 🎉 Add incinerate kwin effect 2022-06-20 05:43:21 +02:00
Simon Schneegans 1ba580943b 📝 Fix indentation 2022-06-20 05:43:10 +02:00
Simon Schneegans fc2424ffb4 🔧 Add incinerate gtk3 ui 2022-06-20 05:39:32 +02:00
Simon Schneegans 1a20ee94cd 🔧 Tweak incinerate effect 2022-06-20 05:37:06 +02:00
Simon Schneegans cc18efd9e0 📝 Add incinerate effect to the README 2022-06-20 05:36:53 +02:00
Simon Schneegans 3323cbf66d 🔧 Tweak incinerate effect 2022-06-18 13:54:56 +02:00
Simon Schneegans 15702cf3da 🔧 Tweak incinerate effect 2022-06-18 09:44:38 +02:00
Simon Schneegans 86dd1131fc 🔧 Improve incinerate effect 2022-06-17 21:17:23 +02:00
Simon Schneegans 2e3bd0bfbb Merge branch 'main' into feature/incinerate 2022-06-17 05:58:36 +02:00
Simon Schneegans bb44d4bd81 🔥 Remove empty file 2022-06-16 05:29:25 +02:00
Simon Schneegans 1cd69b4cbb 🔀 Merge pull request #169 from Schneegans/feature/kde 2022-06-16 05:26:49 +02:00
Simon Schneegans 3afbf6d93b 📝 Add changelog entry 2022-06-16 05:25:54 +02:00
Simon Schneegans 4e5ddfdcc6 🔧 Do not build the apparition effect for KWin for now 2022-06-16 05:19:55 +02:00
Simon Schneegans caec83a391 📝 Fix archive name 2022-06-14 06:20:49 +02:00
Simon Schneegans fdad5f6c89 🔧 Fix job name 2022-06-14 06:20:42 +02:00
Simon Schneegans 4ab87d1257 🔧 Create kwin package on tags 2022-06-14 06:17:06 +02:00
Simon Schneegans 9057f8cceb 🔧 Put all effects into one archive 2022-06-14 06:13:05 +02:00
Simon Schneegans b31a166b22 📝 Update kwin instructions 2022-06-14 06:11:08 +02:00
Simon Schneegans b3568d9be5 📝 Add disclaimer to tutorial 2022-06-14 05:53:32 +02:00
Simon Schneegans ca4484727f 🔧 Use RGB for wisps color 2022-06-13 06:27:10 +02:00
Simon Schneegans d76aea4fc8 🔧 Use rgba color config readers 2022-06-13 06:24:38 +02:00
Simon Schneegans fda91e69bb 🔧 Use RGB for TV color 2022-06-13 06:22:27 +02:00
Simon Schneegans 8d6b844def 🔧 Use RGB for energize b color 2022-06-13 06:20:17 +02:00
Simon Schneegans 87209db9bd 🔧 Fix typo 2022-06-13 06:18:28 +02:00
Simon Schneegans ad76fff308 🔧 Use RGB for energize a color 2022-06-13 06:16:59 +02:00
Simon Schneegans ee902debe1 🔧 Add helpers to read color settings 2022-06-13 06:15:20 +02:00
Simon Schneegans 7e91b9c1f7 📝 Update README 2022-06-12 18:13:49 +02:00
Simon Schneegans c769677328 📝 Add some comments 2022-06-10 17:21:41 +02:00
Simon Schneegans fabe1999ad 🔧 Set duration uniforms 2022-06-10 17:09:22 +02:00
Simon Schneegans 611ba14230 🔧 Fix kwin fire 2022-06-10 16:19:30 +02:00
Simon Schneegans 5c58ccf2cf 🎉 Add fire kwin effect 2022-06-10 16:08:05 +02:00
Simon Schneegans ef746c20e6 🔧 Remove implicit conversions 2022-06-10 15:58:10 +02:00
Simon Schneegans 149e91f06d 🔧 Add BMW to effect names 2022-06-10 15:43:11 +02:00
Simon Schneegans a2fdf05431 🔧 Tweak UI 2022-06-10 15:42:58 +02:00
Simon Schneegans 2571c60d6b 🔧 Remove implicit conversions 2022-06-10 15:42:46 +02:00
Simon Schneegans 55e46b501b 🎉 Add apparition kwin effect 2022-06-10 15:28:42 +02:00
Simon Schneegans 97a4226898 🎉 Add wisps kwin effect 2022-06-10 15:24:54 +02:00
Simon Schneegans 79fe1feb5c 🔧 Fix shellcheck issues 2022-06-10 15:15:38 +02:00
Simon Schneegans d4e0ee95c9 🔧 Build archives for effects 2022-06-10 15:13:49 +02:00
Simon Schneegans 4e2edc1492 🔧 Fix kwin default colors 2022-06-10 14:53:38 +02:00
Simon Schneegans d5bf63b99c 🔧 Update kwin default colors 2022-06-10 14:50:38 +02:00
Simon Schneegans 2bd67c0d37 🔧 Tweak kwin config GUI 2022-06-10 14:38:34 +02:00
Simon Schneegans d4165b4b62 🔧 Fix GLSL compiler issue 2022-06-10 14:38:14 +02:00
Simon Schneegans b4455d5f48 🔧 Only set duration if required 2022-06-10 14:13:29 +02:00
Simon Schneegans cc86b16817 🎉 Add kwin hexagon effect 2022-06-10 14:07:20 +02:00
Simon Schneegans d08c318b7d 🔧 Tweak kwin build process 2022-06-10 13:57:21 +02:00
Simon Schneegans 192719739c 🔧 Flip texture coordinates for kwin 2022-06-10 11:48:31 +02:00
Simon Schneegans 4d77635e78 🔧 Fix implicit conversion 2022-06-10 11:45:59 +02:00
Simon Schneegans e84ec002a3 🔧 Fix typo 2022-06-10 11:10:10 +02:00
Simon Schneegans 46fb61b96c 🎉 Add new kwin effect 2022-06-10 11:07:56 +02:00
Simon Schneegans 6a764b6552 🔧 Load defaults from settings 2022-06-10 11:07:41 +02:00
Simon Schneegans d7859145c3 🔧 Update kwin settings ui 2022-06-10 11:04:03 +02:00
Simon Schneegans 15a622d7b7 🔧 Fix shellcheck issues 2022-06-10 10:42:59 +02:00
Simon Schneegans 2056130e98 🔧 Fixes for kwin 2022-06-10 10:42:04 +02:00
Simon Schneegans bfc3467e33 🔧 Fixes for kwin 2022-06-10 10:29:47 +02:00
Simon Schneegans 9f8258b9f8 🔧 Fix setting of window size 2022-06-10 10:29:29 +02:00
Simon Schneegans 4e5084bdba 🔧 Use correct duration 2022-06-10 10:29:12 +02:00
Simon Schneegans 6fb56612e2 🔧 Reduce number of implicit calls 2022-06-10 08:24:42 +02:00
Simon Schneegans f44d0ae5b6 🔧 Add new kwin effect 2022-06-10 08:13:35 +02:00
Simon Schneegans 3cbbd63629 📝 Fix typo 2022-06-10 07:34:14 +02:00
Simon Schneegans a182f247cb 🔧 Pass duration to kwin shaders 2022-06-10 07:33:06 +02:00
Simon Schneegans 46a1729e54 🔧 Use uDuration instead of uTime 2022-06-10 07:30:44 +02:00
Simon Schneegans 0bd0fb27b9 🔧 Use new global methods for shader I/O 2022-06-10 07:20:21 +02:00
Simon Schneegans 25f2261ad6 📝 Update tutorial 2022-06-10 07:20:02 +02:00
Ulices af9cdb6459 🌐 Translated using Weblate (Spanish) 2022-06-09 22:54:04 +02:00
Simon Schneegans e9e51adbf4 🔧 Fix shellcheck issues 2022-06-09 14:09:50 +02:00
Simon Schneegans ba9f1c91f5 🔧 Generate JS code for kwin 2022-06-09 14:03:00 +02:00
Simon Schneegans bf3aa0af93 🔧 Use methods shader I/O 2022-06-09 11:34:18 +02:00
Simon Schneegans b8335dd4e6 🔧 Fix function call 2022-06-09 10:59:03 +02:00
Simon Schneegans bbd7d6ea64 🔧 Use consistent class names 2022-06-09 10:46:45 +02:00
Simon Schneegans 03a6d9263a 🔧 Make class name unique 2022-06-09 08:29:04 +02:00
Simon Schneegans 3360b45c18 🔧 Use vec4 for color 2022-06-09 08:28:48 +02:00
Simon Schneegans 67d6df0a70 🔧 Fix incompatibilites with OpenGL 1.0 2022-06-09 08:06:43 +02:00
Simon Schneegans e96b42a3f7 🔧 Support different profiles for kwin 2022-06-09 07:47:12 +02:00
Simon Schneegans 1e665f0db3 🔧 Tweak shader 2022-05-31 05:55:19 +02:00
Simon Schneegans d6e46d951c 🚚 Rename burn effect 2022-05-28 21:05:52 +02:00
Simon Schneegans d114c68422 Merge branch 'main' into feature/incinerate 2022-05-28 20:56:38 +02:00
Simon Schneegans 9a68af1676 🔧 Make ShellCheck happy 2022-05-28 06:01:01 +02:00
Simon Schneegans bf0feae117 🔧 Make ShellCheck happy 2022-05-28 05:57:41 +02:00
Simon Schneegans 74bd7cdef8 🔧 Use generic i/o names 2022-05-28 05:56:04 +02:00
Simon Schneegans c635336a7e 🔧 Append common.glsl to kwin shaders 2022-05-28 05:52:25 +02:00
Simon Schneegans 6807be6f35 Merge branch 'main' into feature/kde 2022-05-27 21:29:45 +02:00
Simon Schneegans 8aafd57b2f 🔀 Merge pull request #161 from Schneegans/feature/simplify-includes 2022-05-27 21:28:40 +02:00
Simon Schneegans b99c80a343 📝 Add changelog entry 2022-05-27 21:23:54 +02:00
Simon Schneegans 6a65d59144 🚚 Rename shader files 2022-05-27 21:21:05 +02:00
Simon Schneegans c90f3a1c97 🚚 Move common includes to one file 2022-05-27 21:18:18 +02:00
Simon Schneegans 18c46f58c2 📝 Add some comments 2022-05-27 21:06:44 +02:00
albanobattistella 75d5b6ddd5 🌐 Translated using Weblate (Italian) 2022-05-27 20:23:57 +02:00
Simon Schneegans 411a87d7fc 🔧 Ignore kwin build directory 2022-05-27 20:16:24 +02:00
Simon Schneegans c92f3b5574 🎉 Add some initial kwin files 2022-05-27 20:16:09 +02:00
Heimen Stoffels eb2fb8b523 🌐 Translated using Weblate (Dutch) 2022-05-26 21:18:11 +02:00
Hosted Weblate de056a56df 🌐 Update translation files 2022-05-26 21:18:11 +02:00
Simon Schneegans fb38d883c9 🔀 Merge pull request #158 from Schneegans/feature/disable-on-battery 2022-05-25 16:59:06 +02:00
Simon Schneegans ee10cdf9ad 🔧 Update test references 2022-05-25 13:26:14 +02:00
Simon Schneegans 96a7b91706 📝 Add changelog entry 2022-05-25 13:00:59 +02:00
Simon Schneegans 10deeb584f 🌐 Update translation template 2022-05-25 12:59:37 +02:00
Simon Schneegans b215379dac 🎉 Add option to disable effects if on battery power 2022-05-25 12:59:03 +02:00
Paweł Rzońca 8dc73ff9f6 🌐 Translated using Weblate (Polish) 2022-05-25 05:35:53 +02:00
Jose Riha 630149d571 🌐 Translated using Weblate (Slovak) 2022-05-23 11:52:01 +02:00
Eshagh Shahedany 8a669cda3b 🌐 Translated using Weblate (Persian) 2022-05-23 11:52:01 +02:00
Seong-ho Cho f58aa95859 🌐 Translated using Weblate (Korean) 2022-05-23 11:52:01 +02:00
Jose Riha aa7aad7910 🌐 Translated using Weblate (Czech) 2022-05-23 11:52:01 +02:00
Paweł Rzońca b3229e9b6e 🌐 Added translation using Weblate (Polish) 2022-05-23 11:52:01 +02:00
Simon Schneegans c4aa0cd92a 📝 Fix tutorial 2022-05-23 06:03:25 +02:00
Jose Riha e90e64656d 🌐 Added translation using Weblate (Slovak) 2022-05-23 06:00:04 +02:00
Eshagh Shahedany 29a811884b 🌐 Added translation using Weblate (Persian) 2022-05-23 06:00:04 +02:00
Simon Schneegans a89f16c767 🎉 Bump version number 2022-05-21 13:12:32 +02:00
Simon Schneegans 9ed471a1c6 📝 Set release date
Deploy / Extension Bundle (push) Has been cancelled
2022-05-21 13:10:39 +02:00
Simon Schneegans badd1fd2c3 📝 Add changelog entry 2022-05-21 13:08:40 +02:00
Simon Schneegans 2f4d9ade01 💞 Update credits 2022-05-21 12:40:40 +02:00
Seong-ho Cho 2d386e3620 🌐 Translated using Weblate (Korean) 2022-05-21 12:37:51 +02:00
Simon Schneegans b7306b9feb 📝 Tweak changelog 2022-05-21 11:30:15 +02:00
Simon Schneegans 020fbc9332 🔧 Make sure to reset progress uniforms before drawing 2022-05-21 11:29:24 +02:00
Simon Schneegans 48aa96312f 🎉 Add initial incinerate effect 2022-05-21 11:08:24 +02:00
Seong-ho Cho 20b9086464 🌐 Added translation using Weblate (Korean) 2022-05-20 20:11:13 +02:00
Simon Schneegans 703f990f7f ♻️ Remove redundant class names 2022-05-19 08:21:20 +02:00
fawaz006 8d8779130c 🌐 Translated using Weblate (Arabic) 2022-05-19 08:11:39 +02:00
fawaz006 83658510af 🌐 Added translation using Weblate (Arabic) 2022-05-19 08:11:39 +02:00
Simon Schneegans 76aa003d99 🔀 Merge pull request #149 from Schneegans/fix/#63 2022-05-16 07:50:16 +02:00
Simon Schneegans 1a14b8bd56 📝 Add changelog entry 2022-05-16 07:41:05 +02:00
Simon Schneegans de190b4fd9 🔧 Pass window padding to the shaders 2022-05-16 07:38:09 +02:00
Simon Schneegans 812fa6612a 🔀 Merge pull request #148 from Schneegans/refactor/base-classes 2022-05-16 05:30:07 +02:00
Simon Schneegans 18a43390b6 🔧 Temporarily disable X11 tests 2022-05-15 21:29:26 +02:00
Simon Schneegans 6af87f727d 🔧 PAss all arguments of vfunc 2022-05-15 21:23:30 +02:00
Simon Schneegans 8dbfa5fdb1 🔧 Add debug output 2022-05-15 21:12:28 +02:00
Simon Schneegans e0d9ed5677 🔧 Try tweaking test timings 2022-05-15 20:58:40 +02:00
Simon Schneegans 6e65f29bb3 🔧 Update test references 2022-05-15 14:17:34 +02:00
Simon Schneegans eb597cffbe 🔧 Fix test time 2022-05-15 14:17:25 +02:00
Simon Schneegans be88a682b9 🔧 Update test references 2022-05-15 13:31:42 +02:00
Simon Schneegans fa09a1f40a 🔧 Try fix CI 2022-05-15 12:55:30 +02:00
Simon Schneegans 1262089e82 📝 Update tutorial 2022-05-14 21:09:19 +02:00
Simon Schneegans 0da73cf675 ✨ Format code 2022-05-14 20:53:25 +02:00
Simon Schneegans a228dc7b2e 🔥 Remove obsolete class 2022-05-14 20:51:09 +02:00
Simon Schneegans e6a6a0d831 🔧 Update test references 2022-05-14 20:48:45 +02:00
Simon Schneegans 0fb05c66eb 🔧 Remove paint-target signal 2022-05-14 20:48:34 +02:00
Simon Schneegans e1017b7707 🔧 Use factory to create shaders 2022-05-14 13:58:28 +02:00
Simon Schneegans cb4b87811e ♻️ Add base classes for the effects and shaders 2022-05-13 20:39:45 +02:00
Simon Schneegans 1ccc34f766 🔀 Merge pull request #146 from Schneegans/refactor/shader-resources
Move shader code to GLSL files
2022-05-13 09:49:59 +02:00
Simon Schneegans 1fe20971f8 🔧 Replace replaceAll() by replace() 2022-05-13 09:36:24 +02:00
Simon Schneegans 7ee6e2c58c 🪲 Fix regex 2022-05-13 09:24:47 +02:00
Simon Schneegans 7b8d6e18b2 ♻️ Use a single GLSL files for each effect 2022-05-13 09:17:26 +02:00
Simon Schneegans 84d5ad9caf 🔀 Merge branch 'main' into refactor/shader-resources 2022-05-13 08:38:14 +02:00
Simon Schneegans 46cc997e2a 🚚 Move shader code to GLSL files 2022-05-13 08:27:09 +02:00
Simon Schneegans 829cc49e3c 🔀 Merge pull request #145 from Schneegans/refactor/transition-tweaking 2022-05-13 05:45:41 +02:00
Simon Schneegans a134449706 🔧 Update test references 2022-05-13 05:40:36 +02:00
Simon Schneegans 5b89db0c4b 📝 Add changelog entry 2022-05-12 21:14:25 +02:00
Simon Schneegans 351838b121 🔧 Update test references 2022-05-12 21:12:25 +02:00
Simon Schneegans f59d354729 🔧 Use clutter version of easing 2022-05-12 21:07:23 +02:00
Simon Schneegans 9d7d912261 ♻️ Simplify transition tweaking 2022-05-12 05:48:14 +02:00
obslsessed 77d5de7b8e 🌐 Translated using Weblate (Swedish) 2022-05-11 20:23:49 +02:00
Kristoffer Grundström 2238a744f3 🌐 Translated using Weblate (Swedish) 2022-05-11 20:23:49 +02:00
Muha Aliss 539fd59e9b 🌐 Translated using Weblate (Turkish) 2022-05-11 20:23:49 +02:00
Simon Schneegans a42e2736db 🔀 Merge pull request #143 from Schneegans/feature/refactor-common-uniforms 2022-05-11 05:51:17 +02:00
Simon Schneegans 2eca2c7374 🚚 Move uForOpening to standard uniforms 2022-05-11 05:44:36 +02:00
Simon Schneegans 2bd897fe0e 📝 Update tutorial 2022-05-11 05:33:37 +02:00
Simon Schneegans 1347fc4d11 🔧 Use vec2 for size uniform 2022-05-11 05:33:25 +02:00
Simon Schneegans afaeebd0ab 🔀 Merge pull request #139 from Schneegans/feature/reuse-shaders 2022-05-11 05:30:36 +02:00
Simon Schneegans 7e33e1ce4a 🔧 Update test reference files 2022-05-11 05:26:07 +02:00
Simon Schneegans 2f1c38afc2 🔧 Update test reference files 2022-05-11 05:19:14 +02:00
Simon Schneegans 295aa1e362 📝 Add changelog entry 2022-05-11 05:07:18 +02:00
Simon Schneegans d224d14db1 🔧 Convert window texture alpha from premultiplied to straight 2022-05-11 04:59:58 +02:00
Simon Schneegans 478ba77288 📝 Update tutorial 2022-05-11 04:57:19 +02:00
Simon Schneegans 3175c289b5 🔧 Remove old shader if a new one is to be applied 2022-05-11 04:57:07 +02:00
Simon Schneegans 78679ef139 🔧 Fix straight alpha 2022-05-08 20:49:29 +02:00
Simon Schneegans fa8e3a17c1 🔧 Add compositing snippet 2022-05-08 14:15:54 +02:00
Simon Schneegans 88a56998d6 🔧 Fix straight alpha 2022-05-08 14:15:43 +02:00
Simon Schneegans 6555a8f02c 🔧 Fix straight alpha 2022-05-08 13:56:21 +02:00
Simon Schneegans a28e406da4 🔧 Fix straight alpha 2022-05-08 13:52:16 +02:00
Simon Schneegans 317eaa2969 🔧 Fix memory leaks of more effects 2022-05-08 13:09:02 +02:00
Simon Schneegans 61bea04018 🔧 Fix memory leaks of more effects 2022-05-08 12:31:20 +02:00
Simon Schneegans 6ebc975a20 📝 Add changelog entry 2022-05-07 21:09:19 +02:00
Simon Schneegans 9f8f2afead 🪲 Fix close-animation of windows which were opened before the session was started 2022-05-07 21:07:50 +02:00
Simon Schneegans 472317612c ♻️ Rename some variables 2022-05-07 20:52:07 +02:00
Simon Schneegans e9b82d0b78 🔧 Prevent non-fatal error message 2022-05-07 20:45:20 +02:00
Simon Schneegans 07929e1775 🔧 Use float for window size uniforms 2022-05-07 12:35:52 +02:00
Simon Schneegans e20bcd46d7 🔧 Use an array of effect instances 2022-05-05 21:17:03 +02:00
Simon Schneegans 3b0be6236c ♻️ Make it possible to reuse the hexagon shader 2022-05-04 21:32:21 +02:00
Simon Schneegans 27d2a43c99 ♻️ Make it possible to reuse the fire shader 2022-05-04 21:10:04 +02:00
matb 06aa705f43 🌐 Translated using Weblate (French) 2022-05-02 15:44:54 +02:00
Simon Schneegans fa9941ce5b 🔧 Set uniforms only once 2022-05-01 13:25:37 +02:00
Simon Schneegans c0b1115b23 💞 Add new sponsor 2022-04-29 20:02:25 +02:00
Muha Aliss 2ba7b181da 🌐 Translated using Weblate (Turkish) 2022-04-23 12:57:06 +02:00
matb e2e3425720 🌐 Translated using Weblate (French) 2022-04-23 12:57:06 +02:00
Simon Schneegans b7d72d35ed 🔧 Use tagged version of dynamic-badges-action 2022-04-18 14:00:34 +02:00
Simon Schneegans 256e6db158 🔧 Use new color range feature of dynamic-badges-action 2022-04-18 13:41:28 +02:00
albanobattistella e0aebca055 🌐 Translated using Weblate (Italian) 2022-04-16 13:15:32 +02:00
Егор Ермаков cde4e73645 🌐 Translated using Weblate (Russian) 2022-04-16 13:15:32 +02:00
Simon Schneegans 83b583dd13 📝 Update links in source code 2022-04-16 13:14:40 +02:00
Simon Schneegans c459d06f53 💞 Update sponsors 2022-04-13 21:17:10 +02:00
Kristoffer Grundström c49615a504 🌐 Translated using Weblate (Swedish) 2022-04-11 20:48:04 +02:00
Allan Nordhøy 6605fd0cae 🌐 Translated using Weblate (Norwegian Bokmål) 2022-04-11 20:48:04 +02:00
Kristoffer Grundström 6bf5970b90 🌐 Added translation using Weblate (Swedish) 2022-04-10 07:11:21 +02:00
Simon Schneegans 57e8e0384b 📝 Fix typo 2022-04-09 13:48:40 +02:00
Simon Schneegans c82f5dabd8 📝 Add changelog entry 2022-04-09 13:15:39 +02:00
Simon Schneegans 7cecc9e160 🪲 Ceck for presence of libadwaita 2022-04-09 13:13:39 +02:00
Jiri Grönroos 9b2e57cba0 🌐 Translated using Weblate (Finnish) 2022-04-09 12:54:07 +02:00
merelymyself 2dac407959 🌐 Translated using Weblate (Chinese (Simplified)) 2022-04-09 12:54:07 +02:00
Óscar Fernández Díaz 9c1139b3af 🌐 Translated using Weblate (Spanish) 2022-04-09 12:54:07 +02:00
Théo Remon ab990b1a05 🌐 Translated using Weblate (French) 2022-04-09 12:54:07 +02:00
Nathan d0f624ab5f 🌐 Translated using Weblate (French) 2022-04-09 12:54:07 +02:00
Andres Segarra b2a4aec1c3 🌐 Translated using Weblate (Spanish) 2022-04-06 20:09:12 +02:00
Jiri Grönroos 999b6800a9 🌐 Added translation using Weblate (Finnish) 2022-04-06 13:13:37 +02:00
Simon Schneegans 77505c5aa9 🎉 Bump version number 2022-04-06 07:40:42 +02:00
289 changed files with 10290 additions and 3126 deletions
+1
View File
@@ -3,4 +3,5 @@ AlignConsecutiveAssignments: true
AlignAfterOpenBracket: Align
ContinuationIndentWidth: 2
KeepEmptyLinesAtTheStartOfBlocks: true
SortIncludes: false
ColumnLimit: 90
+7 -5
View File
@@ -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
+1 -1
View File
@@ -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
+24 -2
View File
@@ -6,8 +6,8 @@ on:
- '**'
jobs:
extension_bundle:
name: Extension Bundle
gnome_bundle:
name: Bundle GNOME Shell Extension
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
@@ -26,3 +26,25 @@ jobs:
file: burn-my-windows@schneegans.github.com.zip
tag: ${{ github.ref }}
overwrite: true
kwin_bundle:
name: Bundle KWin Effect
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Install Dependencies
run: |
sudo apt-get update -q
sudo apt-get install clang-format
- name: Create Release
run: |
./kwin/build.sh
- name: Upload Release
uses: svenstaro/upload-release-action@2.2.1
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: kwin/*.tar.gz
tag: ${{ github.ref }}
overwrite: true
file_glob: true
+2
View File
@@ -7,3 +7,5 @@
/schemas/gschemas.compiled
/resources/burn-my-windows.gresource
/resources/burn-my-windows.gresource.xml
kwin/_build
kwin/*.tar.gz
+2 -2
View File
@@ -6,8 +6,8 @@ DOMAIN := schneegans.github.com
ZIP_NAME := $(NAME)@$(DOMAIN).zip
# Some of the recipes below depend on some of these files.
JS_FILES = $(shell find -type f -and \( -name "*.js" \))
UI_FILES = $(shell find -type f -and \( -name "*.ui" \))
JS_FILES = $(wildcard src/*.js extension.js prefs.js)
UI_FILES = $(shell find resources -type f -and \( -name "*.ui" \))
RESOURCE_FILES = $(shell find resources -mindepth 2 -type f)
LOCALES_PO = $(wildcard po/*.po)
LOCALES_MO = $(patsubst po/%.po,locale/%/LC_MESSAGES/$(NAME).mo,$(LOCALES_PO))
+89 -12
View File
@@ -3,6 +3,7 @@
</p>
<h1 align="center">🔥 Set GNOME Shell on Fire!</h1>
<p align="center">(and KWin as well)</p>
<p align="center">
<a href="https://extensions.gnome.org/extension/4679/burn-my-windows/"><img src="https://img.shields.io/badge/Download-extensions.gnome.org-e67f4d.svg?logo=gnome&logoColor=lightgrey&labelColor=303030" /></a><br/>
@@ -13,27 +14,54 @@
<a href="scripts/cloc.sh"><img src="https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/Schneegans/8cf45f23253ff09b21196e7271378762/raw/comments.json" /></a>
</p>
When I released the [Desktop Cube Extension](https://github.com/Schneegans/Desktop-Cube/), many people requested to revive one of the most useless features of Linux desktop history: Setting windows on fire!
When I released the [Desktop Cube Extension](https://github.com/Schneegans/Desktop-Cube/) for GNOME, many people requested to revive one of the most useless features of Linux desktop history: Setting windows on fire!
This extension is not only more useless than the cube, but it is also much more hacky. So I expect some bug! [Let's incinerate them all](https://github.com/Schneegans/Burn-My-Windows/issues)!
For a list of things changed in previous releases, you can have a look at the [changelog](docs/changelog.md)!
Burn-My-Windows is not only available for **GNOME** but also includes some basic support for **KDE Plasma's KWin**.
Further down in this file you'll find installation instructions for both.
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" />
**Apparition** <br> This effect hides your windows by violently sucking them into the void of magic! | <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!| <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" />
**Incinerate** <br> A less snappy but definitely more fancy take on the fire effect. | <img src ="docs/pics/incinerate.gif" />
**Matrix** <br> Turn your windows into a shower of green letters! The color is actually configurable.| <img src ="docs/pics/matrix.gif" />
**Snap of Disintegration** <br> Dissolve your windows into a cloud of dust.| <img src ="docs/pics/snap.gif" />
**T-Rex Attack** <br> Destroy your windows with a series of violent slashes!| <img src ="docs/pics/trex.gif" />
**TV-Effect** <br> This is a very simple effect to demonstrate that this extension could also be used in a more professional environment. | <img src ="docs/pics/tv.gif" />
**Wisps** <br> Let your windows be carried away to the realm of dreams by these little fairies! | <img src ="docs/pics/wisps.gif" />
**Your Effect!** <br> The extension is very modular and with a bit of creativity and GLSL knowledge, [you can easily create your own effects](docs/how-to-create-new-effects.md). | [![Create your own effects](docs/pics/custom.jpg)](docs/how-to-create-new-effects.md)
## ✅ Supported Versions
Not every effect is available on each version of GNOME or KWin.
Below is a table which summarizes the current availability for all effects.
<table width="100%">
<tr>
<td></td>
<td colspan="5"><strong>GNOME</strong></td>
<td colspan="1"><strong>KWin</strong></td>
</tr>
<tr><td></td> <td>3.36</td><td>3.38</td><td>40</td><td>41</td><td>42</td><td>5.25.0</td></tr>
<tr><td>Apparition</td> <td> </td> <td>✅</td> <td>✅</td><td>✅</td><td>✅</td><td> </td> </tr>
<tr><td>Broken Glass</td> <td> </td> <td> </td> <td>✅</td><td>✅</td><td>✅</td><td> </td> </tr>
<tr><td>Energize A</td> <td>✅</td> <td>✅</td> <td>✅</td><td>✅</td><td>✅</td><td>✅</td> </tr>
<tr><td>Energize B</td> <td>✅</td> <td>✅</td> <td>✅</td><td>✅</td><td>✅</td><td>✅</td> </tr>
<tr><td>Fire</td> <td>✅</td> <td>✅</td> <td>✅</td><td>✅</td><td>✅</td><td>✅</td> </tr>
<tr><td>Hexagon</td> <td>✅</td> <td>✅</td> <td>✅</td><td>✅</td><td>✅</td><td>✅</td> </tr>
<tr><td>Incinerate</td> <td>✅</td> <td>✅</td> <td>✅</td><td>✅</td><td>✅</td><td>✅</td> </tr>
<tr><td>Matrix</td> <td> </td> <td> </td> <td>✅</td><td>✅</td><td>✅</td><td> </td> </tr>
<tr><td>Snap of Disintegration</td> <td> </td> <td> </td> <td>✅</td><td>✅</td><td>✅</td><td> </td> </tr>
<tr><td>T-Rex Attack</td> <td> </td> <td> </td> <td>✅</td><td>✅</td><td>✅</td><td> </td> </tr>
<tr><td>TV-Effect</td> <td>✅</td> <td>✅</td> <td>✅</td><td>✅</td><td>✅</td><td>✅</td> </tr>
<tr><td>Wisps</td> <td>✅</td> <td>✅</td> <td>✅</td><td>✅</td><td>✅</td><td>✅</td> </tr>
</table>
## 💞 These People _love_ this Extension
@@ -41,23 +69,28 @@ While [coding new features](docs/how-to-create-new-effects.md) or [translating t
<h3 align="center">🥇 Current Gold Sponsors</h3>
<p align="center">
<a href="https://github.com/D3vil0per">D3vil0per</a><br>
Maxence Sebald<br>
<a href="https://github.com/dennis1248">Dennis ten Hoove</a><br>
</p>
<h3 align="center">🥈 Current Silver Sponsors</h3>
<p align="center">
<a href="https://twitter.com/tjiiik">tj3k</a><br>
<a href="https://github.com/danielheadbang">@danielheadbang</a><br>
<a href="https://github.com/MRR-dev">@MRR-dev</a><br>
<a href="https://github.com/castrojo">Jorge Castro</a><br>
</p>
<h3 align="center">🥉 Current Bronze Sponsors</h3>
<p align="center">
<a href="https://github.com/danielheadbang">@danielheadbang</a><br>
<a href="https://github.com/sponsors/Schneegans">Become the first!</a><br>
</p>
<h3 align="center">🏅 Previous Sponsors and One-Time Donators</h3>
<p align="center">
<a href="https://twitter.com/tjiiik">tj3k</a><br>
<a href='https://github.com/AngelBrielez'>Angel Brielez</a><br>
<a href="https://github.com/wolfyrion">@wolfyrion</a><br>
<a href="https://github.com/MrTomRod">@MrTomRod</a><br>
Pouhiou<br>
DAPREMONT Christophe<br>
@@ -67,9 +100,9 @@ While [coding new features](docs/how-to-create-new-effects.md) or [translating t
Do you want to show that you love it too? You may <a href="https://github.com/sponsors/Schneegans">become a sponsor for as little as 1$ / month</a>!
If you like this extension, you may also want to try one of my other extensions: [🧊 Desktop-Cube](https://github.com/Schneegans/Desktop-Cube) or [🍰 Fly-Pie](https://github.com/Schneegans/Fly-Pie/)!
If you like this extension, you may also want to try one of my other GNOME extensions: [🧊 Desktop-Cube](https://github.com/Schneegans/Desktop-Cube) or [🍰 Fly-Pie](https://github.com/Schneegans/Fly-Pie/)!
## ⬇️ Installation
## ⬇️ Installation (GNOME)
You can either install the Burn-My-Windows extension from extensions.gnome.org (a), download a stable release
from GitHub (b) or clone the latest version directly with `git` (c).
@@ -128,6 +161,50 @@ Then you can enable the extension with the *Gnome Tweak Tool*, the *Extensions*
gnome-extensions enable burn-my-windows@schneegans.github.com
```
## ⬇️ Installation (KWin)
You can either download a stable version from GitHub (a) or clone the latest version directly with `git` (b).
### a) Downloading a Stable Release
Execute this command to download the latest stable release:
```bash
wget https://github.com/Schneegans/Burn-My-Windows/releases/latest/download/burn_my_windows_kwin4.tar.gz
```
Install it by executing the following commands.
```bash
mkdir -p ~/.local/share/kwin/effects
tar -xf burn_my_windows_kwin4.tar.gz -C ~/.local/share/kwin/effects
```
Then select the desired effects in the system settings under "Desktop Effects".
### b) Cloning the Latest Version with `git`
Execute the clone command below where you want to have the source code of the extension.
```bash
git clone https://github.com/Schneegans/Burn-My-Windows.git
cd Burn-My-Windows
```
Now you will have to build the effects and copy them to your KWin effect directory.
```bash
./kwin/build.sh
mkdir -p ~/.local/share/kwin/effects
tar -xf kwin/burn_my_windows_kwin4.tar.gz -C ~/.local/share/kwin/effects
```
That's it!
You can now select the desired effects in the system settings under "Desktop Effects".
## :octocat: I want to contribute!
That's great!
+58
View File
@@ -1,5 +1,63 @@
# Changelog of the Burn-My-Windows Extension
## [Burn My Windows 19](https://github.com/schneegans/Burn-My-Windows/releases/tag/v19)
**Release Date:** 2022-08-18
#### New Features
* The incinerate effect now uses the current mouse pointer position as starting position of the burn effect. The old random behaviour can be enabled in the settings. This works both on GNOME and KDE.
#### Enhancements
* Many translation updates, including a completely new Portuguese, Esperanto, and Hebrew translation. A BIG THANKS to all translators!
* On GNOME, effects can now execute code whenever an animation ended. This is useful for cleaning up resources.
* The KWin build script now generates a separate archive for each effect as well as a combined archive for all effects.
#### Fixes
* Fixed the effect configuration dialog of the Fire effect on KDE.
## [Burn My Windows 18](https://github.com/schneegans/Burn-My-Windows/releases/tag/v18)
**Release Date:** 2022-06-30
#### Fixes
* The GNOME extension package now does not include the KWin JavaScript files anymore.
## [Burn My Windows 17](https://github.com/schneegans/Burn-My-Windows/releases/tag/v17)
**Release Date:** 2022-06-30
#### New Features
* **New Effect: Incinerate.** This is a completely new take on the fire effect. It is a bit more demanding in terms of GPU power, but at the same time it looks much more awesome!
* **Initial KDE Support.** Thanks to the [awesome work](https://invent.kde.org/plasma/kwin/-/merge_requests/2227) of Martin Flöser, it has become possible to port some of its effects to KDE Plasma! For now, only the most simple effects can be ported, but hopefully this list can be improved in the future.
* An option has been added which allows to automatically disable all effects if running on battery power.
#### Enhancements
* Many translation updates, including a completely new Persian, Polish, and Slovak translation. A BIG THANKS to all translators!
* The shader include system has been simplified. There's now just one "common.glsl" which is automatically loaded into each shader.
## [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
+87 -89
View File
@@ -3,6 +3,8 @@
The extension is very modular and with a bit of creativity and GLSL knowledge, you can easily create your own effects.
If you are happy with your results, please open a pull request so that we can include your effect in the next version of Burn-My-Windows!
_:warning: For now, this guide is only for GNOME Shell (and not for KWin). As soon as the API for KWin is more stable, this guide will be updated._
### Before you Start
First you should [fork the repository](https://github.com/Schneegans/Burn-My-Windows/fork) and clone it to your PC.
@@ -77,11 +79,60 @@ 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.frag` 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 content from common.glsl is automatically prepended to each shader effect. This
// provides the standard input:
// vec2 iTexCoord: Texture coordinates for retrieving the window input color.
// bool uForOpening: True if a window-open animation is ongoing, false otherwise.
// float uProgress: A value which transitions from 0 to 1 during the animation.
// float uDuration: The duration of the current animation 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). For now, this will only be set on GNOME.
// Furthermore, there are two global methods for reading the window input color and
// setting the shader output color. Both methods assume straight alpha:
// vec4 getInputColor(vec2 coords)
// void setOutputColor(vec4 outColor)
// The width of the fading effect is loaded from the settings.
uniform float uFadeWidth;
void main() {
// Get the color from the window texture.
vec4 oColor = getInputColor(iTexCoord.st);
// Radial distance from window edge to the window's center.
float dist = length(iTexCoord.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.
oColor.a *= mask;
setOutputColor(oColor);
}
```
</details>
<details>
<summary>Expand this to show the JavaScript code.</summary>
```javascript
//////////////////////////////////////////////////////////////////////////////////////////
@@ -101,27 +152,44 @@ 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) => {
// Store uniform locations of newly created shaders.
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._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(),
...
];
```
Binary file not shown.

After

Width:  |  Height:  |  Size: 975 KiB

+113 -63
View File
@@ -31,21 +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.Apparition.Apparition,
Me.imports.src.BrokenGlass.BrokenGlass,
Me.imports.src.EnergizeA.EnergizeA,
Me.imports.src.EnergizeB.EnergizeB,
Me.imports.src.Fire.Fire,
Me.imports.src.Hexagon.Hexagon,
Me.imports.src.Matrix.Matrix,
Me.imports.src.SnapOfDisintegration.SnapOfDisintegration,
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 //
@@ -63,6 +48,22 @@ 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.Incinerate.Incinerate(),
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);
@@ -70,19 +71,22 @@ 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;
// This is used to get the battery state.
const UPowerProxy = Gio.DBusProxy.makeProxyWrapper(
utils.getStringResource('/interfaces/org.freedesktop.UPower.xml'));
this._upowerProxy = new UPowerProxy(Gio.DBus.system, 'org.freedesktop.UPower',
'/org/freedesktop/UPower');
// We will monkey-patch these methods. Let's store the original ones.
this._origAddWindowClone = Workspace.prototype._addWindowClone;
this._origWindowRemoved = Workspace.prototype._windowRemoved;
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;
@@ -98,7 +102,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
@@ -172,7 +176,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));
}
@@ -192,7 +196,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@')) {
@@ -204,18 +208,36 @@ 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.endAnimation();
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
@@ -223,14 +245,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]);
@@ -291,6 +313,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);
@@ -303,6 +328,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;
@@ -337,7 +363,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');
@@ -347,16 +373,31 @@ class Extension {
return;
}
// We may have to do nothing if running on battery power.
if (this._settings.get_boolean('disable-on-battery') && this._upowerProxy.OnBattery &&
previewNick == '') {
this._fixAnimationTimes(isDialogWindow, forOpening, null);
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.endAnimation();
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', '');
@@ -366,18 +407,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;
}
@@ -389,19 +430,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);
@@ -424,11 +470,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);
}
}
@@ -445,9 +490,8 @@ 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');
@@ -457,25 +501,31 @@ class Extension {
return;
}
// First remove any old effect.
actor.remove_effect_by_name(`burn-my-windows-effect`);
actor.add_effect_with_name(`burn-my-windows-effect`, shader);
// Assign the effect to the window actor!
actor.add_effect_with_name('burn-my-windows-effect', shader);
// Update uniforms at each frame.
// Set one-time uniforms.
shader.beginAnimation(this._settings, forOpening, duration * 0.001, actor);
// Set other uniforms 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);
if (testMode) {
shader.updateAnimation(0.5);
} else {
shader.updateAnimation(t.get_progress());
}
});
// Remove the effect if the animation finished or was interrupted.
if (forOpening) {
transition.connect('stopped', () => {
actor.remove_effect_by_name(`burn-my-windows-effect`);
});
const oldShader = actor.get_effect('burn-my-windows-effect');
if (oldShader) {
actor.remove_effect(oldShader);
oldShader.endAnimation();
oldShader.returnToFactory();
}
});
}
// Finally, ensure that all animation times are set properly so that other extensions
+121
View File
@@ -0,0 +1,121 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>BMWConfigForm</class>
<widget class="QWidget" name="BMWConfigForm">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>562</width>
<height>365</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="4" column="1">
<widget class="QDoubleSpinBox" name="kcfg_Randomness">
<property name="minimum">
<double>0.000000000000000</double>
</property>
<property name="maximum">
<double>1.000000000000000</double>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="kcfg_Duration">
<property name="suffix">
<string> milliseconds</string>
</property>
<property name="minimum">
<number>100</number>
</property>
<property name="maximum">
<number>9999</number>
</property>
<property name="singleStep">
<number>100</number>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Suction:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Twirl:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Randomness:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Shake:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QDoubleSpinBox" name="kcfg_Suction">
<property name="minimum">
<double>0.000000000000000</double>
</property>
<property name="maximum">
<double>1.000000000000000</double>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Duration:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QDoubleSpinBox" name="kcfg_Twirl">
<property name="minimum">
<double>-10.000000000000000</double>
</property>
<property name="maximum">
<double>10.000000000000000</double>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="kcfg_Shake">
<property name="maximum">
<double>10.000000000000000</double>
</property>
</widget>
</item>
</layout>
</widget>
<resources />
<connections />
</ui>
+22
View File
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd">
<kcfgfile name="" />
<group name="">
<entry name="Duration" type="UInt">
<default>300</default>
</entry>
<entry name="Shake" type="Double">
<default>3</default>
</entry>
<entry name="Twirl" type="Double">
<default>5</default>
</entry>
<entry name="Suction" type="Double">
<default>0.75</default>
</entry>
<entry name="Randomness" type="Double">
<default>0.5</default>
</entry>
</group>
</kcfg>
+4
View File
@@ -0,0 +1,4 @@
// This part is automatically included in the effect's source during the build process.
// The code below is called whenever a window is closed or opened.
effect.setUniform(this.shader, 'uSeed', [Math.random(), Math.random()]);
+8
View File
@@ -0,0 +1,8 @@
// This part is automatically included in the effect's source during the build process.
// The code below is called whenever the user changes something in the configuration of
// the effect.
effect.setUniform(this.shader, 'uShake', effect.readConfig('Shake', 1.0));
effect.setUniform(this.shader, 'uTwirl', effect.readConfig('Twirl', 1.0));
effect.setUniform(this.shader, 'uSuction', effect.readConfig('Suction', 1.0));
effect.setUniform(this.shader, 'uRandomness', effect.readConfig('Randomness', 1.0));
Executable
+141
View File
@@ -0,0 +1,141 @@
#!/bin/bash
# -------------------------------------------------------------------------------------- #
# ) ( #
# ( /( ( ( ) ( ( ( ( )\ ) ( ( #
# )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( #
# ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ #
# | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) #
# | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< #
# |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ #
# |__/ #
# Copyright (c) 2021 Simon Schneegans #
# Released under the GPLv3 or later. See LICENSE file for details. #
# -------------------------------------------------------------------------------------- #
# This scripts takes the shaders of Burn-My-Windows as well as some other input files from
# the directories next to this script and creates effect for KDE's Kwin.
# Exit the script when one command fails.
set -e
# Go to the script's directory.
cd "$( cd "$( dirname "$0" )" && pwd )" || \
{ echo "ERROR: Could not find kwin directory."; exit 1; }
# We will store the effect directories in this directory.
BUILD_DIR="_build"
# Create it if it's not there yet.
mkdir -p "$BUILD_DIR"
# This method is called one for each effect. The parameters are as follows:
# $1: The nick of the effect (e.g. "energize-a")
# $2: The name of the effect (e.g. "Energize A")
# $3: A short description of the effect (e.g. "Beam your windows away")
generate() {
# We use the nick for the effect's directory name by replacing dashes with underscoares.
DIR_NAME="kwin4_effect_$(echo "$1" | tr '-' '_')"
# We transform the nick to CamelCase for the JavaScript class name.
EFFECT_CLASS="BurnMyWindows$(sed -r 's/(^|-)(\w)/\U\2/g' <<<"$1")Effect"
# Now create all required resource directories.
mkdir -p "$BUILD_DIR/$DIR_NAME/contents/shaders"
mkdir -p "$BUILD_DIR/$DIR_NAME/contents/code"
mkdir -p "$BUILD_DIR/$DIR_NAME/contents/config"
mkdir -p "$BUILD_DIR/$DIR_NAME/contents/ui"
# Copy the config file if it exists.
if [ -f "$1/main.xml" ]; then
cp "$1/main.xml" "$BUILD_DIR/$DIR_NAME/contents/config"
fi
# Copy the ui file if it exists.
if [ -f "$1/config.ui" ]; then
cp "$1/config.ui" "$BUILD_DIR/$DIR_NAME/contents/ui"
fi
# Now we create the effect's JavaScript source file. This is done by taking main.js.in
# and replacing some placeholders with effect-specific files and values.
ON_SETTINGS_CHANGE=""
ON_ANIMATION_BEGIN=""
# If the effect's directory contains a onSettingsChanged.js, we replace the
# corresponding placeholder with it's content. We replace all occurences of / temporily
# so that the REGEX works.
if [ -f "$1/onSettingsChanged.js" ]; then
ON_SETTINGS_CHANGE=$(tr '/' '\f' < "$1/onSettingsChanged.js")
fi
# Similarily, we will inject the contents of onAnimationBegin.js.
if [ -f "$1/onAnimationBegin.js" ]; then
ON_ANIMATION_BEGIN=$(tr '/' '\f' < "$1/onAnimationBegin.js")
fi
cp main.js.in "$BUILD_DIR/$DIR_NAME/contents/code/main.js"
perl -pi -e "s/%ON_SETTINGS_CHANGE%/$ON_SETTINGS_CHANGE/g;" "$BUILD_DIR/$DIR_NAME/contents/code/main.js"
perl -pi -e "s/%ON_ANIMATION_BEGIN%/$ON_ANIMATION_BEGIN/g;" "$BUILD_DIR/$DIR_NAME/contents/code/main.js"
perl -pi -e "s/%EFFECT_CLASS%/$EFFECT_CLASS/g;" "$BUILD_DIR/$DIR_NAME/contents/code/main.js"
perl -pi -e "s/%SHADER_NAME%/$1/g;" "$BUILD_DIR/$DIR_NAME/contents/code/main.js"
perl -pi -e "s/\f/\//g;" "$BUILD_DIR/$DIR_NAME/contents/code/main.js"
# Now create the metadata.desktop file. Again, we replace some placeholders.
cp metadata.desktop.in "$BUILD_DIR/$DIR_NAME/metadata.desktop"
perl -pi -e "s/%ICON%/$1/g;" "$BUILD_DIR/$DIR_NAME/metadata.desktop"
perl -pi -e "s/%NAME%/$2/g;" "$BUILD_DIR/$DIR_NAME/metadata.desktop"
perl -pi -e "s/%DESCRIPTION%/$3/g;" "$BUILD_DIR/$DIR_NAME/metadata.desktop"
perl -pi -e "s/%DIR_NAME%/$DIR_NAME/g;" "$BUILD_DIR/$DIR_NAME/metadata.desktop"
# Now create the two required shader files. We prepend the common.glsl to each shader.
# We also define KWIN and KWIN_LEGACY. The code in common.glsl takes some different
# paths based on these defines.
{
echo "#version 140"
echo "#define KWIN"
echo ""
echo "// This file is automatically generated during the build process."
echo ""
cat "../resources/shaders/common.glsl"
cat "../resources/shaders/$1.frag"
} > "$BUILD_DIR/$DIR_NAME/contents/shaders/$1_core.frag"
{
echo "#define KWIN_LEGACY"
echo ""
echo "// This file is automatically generated during the build process."
echo ""
cat "../resources/shaders/common.glsl"
cat "../resources/shaders/$1.frag"
} > "$BUILD_DIR/$DIR_NAME/contents/shaders/$1.frag"
# If clang-format is installed, try to beautify the code a bit.
if command -v clang-format &> /dev/null
then
clang-format -i "$BUILD_DIR/$DIR_NAME/contents/code/main.js"
fi
# Create an archive which can be uploaded to https://store.kde.org.
# shellcheck disable=SC2046
tar -cjf "$DIR_NAME.tar.gz" -C "$BUILD_DIR/$DIR_NAME" $(ls "$BUILD_DIR/$DIR_NAME")
}
# Now run the above method for all supported effects.
# The apparition effect is disabled for now. I have not yet found a way to upscale the
# window canvas during the animation.
#generate "apparition" "[BMW] Apparition" "This effect hides your windows by violently sucking them into the void of magic"
generate "energize-a" "[BMW] Energize A" "Beam your windows away"
generate "energize-b" "[BMW] Energize B" "Using different transporter technology results in an alternative visual effect"
generate "fire" "[BMW] Fire" "The classic effect inspired by Compiz"
generate "hexagon" "[BMW] Hexagon" "With glowing lines and hexagon-shaped tiles, this effect looks very sci-fi"
generate "incinerate" "[BMW] Incinerate" "A less snappy but definitely more fancy take on the fire effect"
generate "tv" "[BMW] TV Effect" "Make windows close like turning off a TV"
generate "wisps" "[BMW] Wisps" "Let your windows be carried away to the realm of dreams by these little fairies"
# Finally, create an archive for the effects.
# shellcheck disable=SC2046
tar -cjf "burn_my_windows_kwin4.tar.gz" -C "$BUILD_DIR" $(ls "$BUILD_DIR")
+94
View File
@@ -0,0 +1,94 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>BMWConfigForm</class>
<widget class="QWidget" name="BMWConfigForm">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>562</width>
<height>365</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Duration:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Color:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>kcfg_Color</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="KColorButton" name="kcfg_Color">
<property name="alphaChannelEnabled">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Scale:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>kcfg_Color</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QDoubleSpinBox" name="kcfg_Scale">
<property name="minimum">
<double>0.100000000000000</double>
</property>
<property name="maximum">
<double>10.000000000000000</double>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="kcfg_Duration">
<property name="suffix">
<string> milliseconds</string>
</property>
<property name="minimum">
<number>100</number>
</property>
<property name="maximum">
<number>9999</number>
</property>
<property name="singleStep">
<number>100</number>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KColorButton</class>
<extends>QPushButton</extends>
<header>kcolorbutton.h</header>
</customwidget>
</customwidgets>
<resources />
<connections />
</ui>
+16
View File
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd">
<kcfgfile name="" />
<group name="">
<entry name="Duration" type="UInt">
<default>2000</default>
</entry>
<entry name="Scale" type="Double">
<default>1</default>
</entry>
<entry name="Color" type="Color">
<default>#FFC832</default>
</entry>
</group>
</kcfg>
+7
View File
@@ -0,0 +1,7 @@
// This part is automatically included in the effect's source during the build process.
// The code below is called whenever the user changes something in the configuration of
// the effect.
effect.setUniform(this.shader, 'uDuration', this.duration * 0.001);
effect.setUniform(this.shader, 'uColor', this.readRGBConfig('Color'));
effect.setUniform(this.shader, 'uScale', effect.readConfig('Scale', 1.0));
+94
View File
@@ -0,0 +1,94 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>BMWConfigForm</class>
<widget class="QWidget" name="BMWConfigForm">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>562</width>
<height>365</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Duration:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Color:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>kcfg_Color</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="KColorButton" name="kcfg_Color">
<property name="alphaChannelEnabled">
<bool>true</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Scale:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>kcfg_Color</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QDoubleSpinBox" name="kcfg_Scale">
<property name="minimum">
<double>0.100000000000000</double>
</property>
<property name="maximum">
<double>10.000000000000000</double>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="kcfg_Duration">
<property name="suffix">
<string> milliseconds</string>
</property>
<property name="minimum">
<number>100</number>
</property>
<property name="maximum">
<number>9999</number>
</property>
<property name="singleStep">
<number>100</number>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KColorButton</class>
<extends>QPushButton</extends>
<header>kcolorbutton.h</header>
</customwidget>
</customwidgets>
<resources />
<connections />
</ui>
+16
View File
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd">
<kcfgfile name="" />
<group name="">
<entry name="Duration" type="UInt">
<default>1000</default>
</entry>
<entry name="Scale" type="Double">
<default>1</default>
</entry>
<entry name="Color" type="Color">
<default>#A0B4FF</default>
</entry>
</group>
</kcfg>
+7
View File
@@ -0,0 +1,7 @@
// This part is automatically included in the effect's source during the build process.
// The code below is called whenever the user changes something in the configuration of
// the effect.
effect.setUniform(this.shader, 'uDuration', this.duration * 0.001);
effect.setUniform(this.shader, 'uColor', this.readRGBConfig('Color'));
effect.setUniform(this.shader, 'uScale', effect.readConfig('Scale', 1.0));
+147
View File
@@ -0,0 +1,147 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>BMWConfigForm</class>
<widget class="QWidget" name="BMWConfigForm">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>562</width>
<height>365</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="4" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Gradient:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="kcfg_Duration">
<property name="suffix">
<string> milliseconds</string>
</property>
<property name="minimum">
<number>100</number>
</property>
<property name="maximum">
<number>9999</number>
</property>
<property name="singleStep">
<number>100</number>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QDoubleSpinBox" name="kcfg_Scale">
<property name="minimum">
<double>0.100000000000000</double>
</property>
<property name="maximum">
<double>10.000000000000000</double>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Movement Speed:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QDoubleSpinBox" name="kcfg_MovementSpeed">
<property name="minimum">
<double>-5.000000000000000</double>
</property>
<property name="maximum">
<double>5.000000000000000</double>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Scale:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="4" column="1">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="KColorButton" name="kcfg_Gradient1">
<property name="alphaChannelEnabled">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="KColorButton" name="kcfg_Gradient2">
<property name="alphaChannelEnabled">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="KColorButton" name="kcfg_Gradient3">
<property name="alphaChannelEnabled">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="KColorButton" name="kcfg_Gradient4">
<property name="alphaChannelEnabled">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="KColorButton" name="kcfg_Gradient5">
<property name="alphaChannelEnabled">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item row="7" column="1">
<widget class="QCheckBox" name="kcfg_3DNoise">
<property name="text">
<string>3D Noise</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Duration:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KColorButton</class>
<extends>QPushButton</extends>
<header>kcolorbutton.h</header>
</customwidget>
</customwidgets>
<resources />
<connections />
</ui>
+34
View File
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd">
<kcfgfile name="" />
<group name="">
<entry name="Duration" type="UInt">
<default>1500</default>
</entry>
<entry name="Scale" type="Double">
<default>1</default>
</entry>
<entry name="MovementSpeed" type="Double">
<default>0.5</default>
</entry>
<entry name="Gradient1" type="Color">
<default>#004c3319</default>
</entry>
<entry name="Gradient2" type="Color">
<default>#a0b4371e</default>
</entry>
<entry name="Gradient3" type="Color">
<default>#b5ff4c26</default>
</entry>
<entry name="Gradient4" type="Color">
<default>#ffffa619</default>
</entry>
<entry name="Gradient5" type="Color">
<default>#ffffffff</default>
</entry>
<entry name="3DNoise" type="Bool">
<default>false</default>
</entry>
</group>
</kcfg>
+14
View File
@@ -0,0 +1,14 @@
// This part is automatically included in the effect's source during the build process.
// The code below is called whenever the user changes something in the configuration of
// the effect.
effect.setUniform(this.shader, 'uDuration', this.duration * 0.001);
effect.setUniform(this.shader, 'u3DNoise',
effect.readConfig('3DNoise', true) ? 1.0 : 0.0);
effect.setUniform(this.shader, 'uScale', effect.readConfig('Scale', 1.0));
effect.setUniform(this.shader, 'uMovementSpeed', effect.readConfig('MovementSpeed', 1.0));
effect.setUniform(this.shader, 'uGradient1', this.readRGBAConfig('Gradient1'));
effect.setUniform(this.shader, 'uGradient2', this.readRGBAConfig('Gradient2'));
effect.setUniform(this.shader, 'uGradient3', this.readRGBAConfig('Gradient3'));
effect.setUniform(this.shader, 'uGradient4', this.readRGBAConfig('Gradient4'));
effect.setUniform(this.shader, 'uGradient5', this.readRGBAConfig('Gradient5'));
+132
View File
@@ -0,0 +1,132 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>BMWConfigForm</class>
<widget class="QWidget" name="BMWConfigForm">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>562</width>
<height>365</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Line Color:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QDoubleSpinBox" name="kcfg_LineWidth">
<property name="minimum">
<double>1.000000000000000</double>
</property>
<property name="maximum">
<double>5.000000000000000</double>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QDoubleSpinBox" name="kcfg_Scale">
<property name="minimum">
<double>0.100000000000000</double>
</property>
<property name="maximum">
<double>10.000000000000000</double>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="kcfg_Duration">
<property name="suffix">
<string> milliseconds</string>
</property>
<property name="minimum">
<number>100</number>
</property>
<property name="maximum">
<number>9999</number>
</property>
<property name="singleStep">
<number>100</number>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Glow Color:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Line Width:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Duration:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Scale:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="kcfg_AdditiveBlending">
<property name="text">
<string>Additive Blending</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="KColorButton" name="kcfg_GlowColor">
<property name="alphaChannelEnabled">
<bool>true</bool>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="KColorButton" name="kcfg_LineColor">
<property name="alphaChannelEnabled">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KColorButton</class>
<extends>QPushButton</extends>
<header>kcolorbutton.h</header>
</customwidget>
</customwidgets>
<resources />
<connections />
</ui>
+25
View File
@@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd">
<kcfgfile name="" />
<group name="">
<entry name="Duration" type="UInt">
<default>1500</default>
</entry>
<entry name="Scale" type="Double">
<default>3</default>
</entry>
<entry name="LineWidth" type="Double">
<default>2</default>
</entry>
<entry name="LineColor" type="Color">
<default>#80C8FFFF</default>
</entry>
<entry name="GlowColor" type="Color">
<default>#801450FF</default>
</entry>
<entry name="AdditiveBlending" type="Bool">
<default>true</default>
</entry>
</group>
</kcfg>
+4
View File
@@ -0,0 +1,4 @@
// This part is automatically included in the effect's source during the build process.
// The code below is called whenever a window is closed or opened.
effect.setUniform(this.shader, 'uSeed', [Math.random(), Math.random()]);
+10
View File
@@ -0,0 +1,10 @@
// This part is automatically included in the effect's source during the build process.
// The code below is called whenever the user changes something in the configuration of
// the effect.
effect.setUniform(this.shader, 'uAdditiveBlending',
effect.readConfig('AdditiveBlending', true) ? 1.0 : 0.0);
effect.setUniform(this.shader, 'uScale', effect.readConfig('Scale', 1.0));
effect.setUniform(this.shader, 'uLineWidth', effect.readConfig('LineWidth', 1.0));
effect.setUniform(this.shader, 'uGlowColor', this.readRGBAConfig('GlowColor'));
effect.setUniform(this.shader, 'uLineColor', this.readRGBAConfig('LineColor'));
+124
View File
@@ -0,0 +1,124 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>BMWConfigForm</class>
<widget class="QWidget" name="BMWConfigForm">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>562</width>
<height>365</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Scale:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>kcfg_Color</cstring>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="kcfg_Duration">
<property name="suffix">
<string> milliseconds</string>
</property>
<property name="minimum">
<number>100</number>
</property>
<property name="maximum">
<number>9999</number>
</property>
<property name="singleStep">
<number>100</number>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QDoubleSpinBox" name="kcfg_Turbulence">
<property name="maximum">
<double>1.000000000000000</double>
</property>
<property name="singleStep">
<double>0.000000000000000</double>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Duration:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Turbulence:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QDoubleSpinBox" name="kcfg_Scale">
<property name="minimum">
<double>0.100000000000000</double>
</property>
<property name="maximum">
<double>10.000000000000000</double>
</property>
<property name="singleStep">
<double>0.000000000000000</double>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Color:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>kcfg_Color</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="KColorButton" name="kcfg_Color">
<property name="alphaChannelEnabled">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="kcfg_UsePointer">
<property name="text">
<string>Start from Pointer Location</string>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KColorButton</class>
<extends>QPushButton</extends>
<header>kcolorbutton.h</header>
</customwidget>
</customwidgets>
<resources />
<connections />
</ui>
+22
View File
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd">
<kcfgfile name="" />
<group name="">
<entry name="Duration" type="UInt">
<default>2000</default>
</entry>
<entry name="Scale" type="Double">
<default>1</default>
</entry>
<entry name="Turbulence" type="Double">
<default>0.3</default>
</entry>
<entry name="Color" type="Color">
<default>#ffb47f</default>
</entry>
<entry name="UsePointer" type="Bool">
<default>true</default>
</entry>
</group>
</kcfg>
+16
View File
@@ -0,0 +1,16 @@
// This part is automatically included in the effect's source during the build process.
// The code below is called whenever a window is closed or opened.
let seed = [Math.random(), Math.random()];
let startPos = seed[0] > seed[1] ? [seed[0], Math.floor(seed[1] + 0.5)] :
[Math.floor(seed[0] + 0.5), seed[1]];
if (effect.readConfig('UsePointer', true)) {
startPos = [
(effects.cursorPos.x - window.x) / window.width,
(effects.cursorPos.y - window.y) / window.height
];
}
effect.setUniform(this.shader, 'uSeed', seed);
effect.setUniform(this.shader, 'uStartPos', startPos);
+8
View File
@@ -0,0 +1,8 @@
// This part is automatically included in the effect's source during the build process.
// The code below is called whenever the user changes something in the configuration of
// the effect.
effect.setUniform(this.shader, 'uDuration', this.duration * 0.001);
effect.setUniform(this.shader, 'uColor', this.readRGBConfig('Color'));
effect.setUniform(this.shader, 'uScale', effect.readConfig('Scale', 1.0));
effect.setUniform(this.shader, 'uTurbulence', effect.readConfig('Turbulence', 1.0));
+202
View File
@@ -0,0 +1,202 @@
/*
This file is part of the Burn-My-Windows project.
SPDX-FileCopyrightText: 2018, 2021, 2022 Vlad Zahorodnii <vlad.zahorodnii@kde.org>, Martin Flöser <mgraesslin@kde.org>, Simon Schneegans <code@simonschneegans.de>
SPDX-License-Identifier: GPL-3.0-or-later
*/
"use strict";
const blacklist = [
// The logout screen has to be animated only by the logout effect.
"ksmserver ksmserver",
"ksmserver-logout-greeter ksmserver-logout-greeter",
// KDE Plasma splash screen has to be animated only by the login effect.
"ksplashqml ksplashqml"
];
class %EFFECT_CLASS% {
constructor() {
effect.configChanged.connect(this.loadConfig.bind(this));
effect.animationEnded.connect(this.cleanupForcedRoles.bind(this));
effects.windowAdded.connect(this.slotWindowAdded.bind(this));
effects.windowClosed.connect(this.slotWindowClosed.bind(this));
effects.windowDataChanged.connect(this.slotWindowDataChanged.bind(this));
this.shader = effect.addFragmentShader(Effect.MapTexture, "%SHADER_NAME%.frag");
this.loadConfig();
}
// A small helper which can be used to read a hex color string (e.g. #ff3244) from the
// settings. This method will return an array of four floating point values
// [r, g, b, a]. If the settings key only refers to an rgb value, the alpha component
// will be set to 1.0.
readRGBAConfig(key) {
const color = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})?([a-f\d]{2})?$/i
.exec(effect.readConfig(key, '#ffffff'))
.slice(1)
.filter(x => x !== undefined)
.map(x => parseInt(x, 16) / 255);
return color.length == 3 ? [color[0], color[1], color[2], 1.0] :
[color[1], color[2], color[3], color[0]];
}
// A small helper which can be used to read a hex color string (e.g. #ff3244) from the
// settings. This method will return an array of three floating point values [r, g, b]
// regardless of whether the settings key actually refers to an argb hex string.
readRGBConfig(key) {
const color = this.readRGBAConfig(key);
color.pop();
return color;
}
loadConfig() {
this.duration = animationTime(effect.readConfig('Duration', 1000));
%ON_SETTINGS_CHANGE%
}
static isScaleWindow(window) {
// We don't want to animate most of plasmashell's windows, yet, some
// of them we want to, for example, Task Manager Settings window.
// The problem is that all those window share single window class.
// So, the only way to decide whether a window should be animated is
// to use a heuristic: if a window has decoration, then it's most
// likely a dialog or a settings window so we have to animate it.
if (window.windowClass == "plasmashell plasmashell"
|| window.windowClass == "plasmashell org.kde.plasmashell") {
return window.hasDecoration;
}
if (blacklist.indexOf(window.windowClass) != -1) {
return false;
}
if (window.hasDecoration) {
return true;
}
// Don't animate combobox popups, tooltips, popup menus, etc.
if (window.popupWindow) {
return false;
}
// Dont't animate the outline and the screenlocker as it looks bad.
if (window.lockScreen || window.outline) {
return false;
}
// Override-redirect windows are usually used for user interface
// concepts that are not expected to be animated by this effect.
if (!window.managed) {
return false;
}
return window.normalWindow || window.dialog;
}
setupForcedRoles(window) {
window.setData(Effect.WindowForceBackgroundContrastRole, true);
window.setData(Effect.WindowForceBlurRole, true);
}
cleanupForcedRoles(window) {
window.setData(Effect.WindowForceBackgroundContrastRole, null);
window.setData(Effect.WindowForceBlurRole, null);
}
slotWindowAdded(window) {
if (effects.hasActiveFullScreenEffect) {
return;
}
if (!%EFFECT_CLASS%.isScaleWindow(window)) {
return;
}
if (!window.visible) {
return;
}
if (effect.isGrabbed(window, Effect.WindowAddedGrabRole)) {
return;
}
this.setupForcedRoles(window);
effect.setUniform(this.shader, 'uForOpening', 1.0);
%ON_ANIMATION_BEGIN%
window.scaleInAnimation = animate({
window: window,
curve: QEasingCurve.Linear,
duration: this.duration,
animations: [
{
type: Effect.ShaderUniform,
fragmentShader: this.shader,
uniform: "uProgress",
from: 0.0,
to: 1.0
}
]
});
}
slotWindowClosed(window) {
if (effects.hasActiveFullScreenEffect) {
return;
}
if (!%EFFECT_CLASS%.isScaleWindow(window)) {
return;
}
if (!window.visible || window.skipsCloseAnimation) {
return;
}
if (effect.isGrabbed(window, Effect.WindowClosedGrabRole)) {
return;
}
if (window.scaleInAnimation) {
cancel(window.scaleInAnimation);
delete window.scaleInAnimation;
}
this.setupForcedRoles(window);
effect.setUniform(this.shader, 'uForOpening', 0.0);
%ON_ANIMATION_BEGIN%
window.scaleOutAnimation = animate({
window: window,
curve: QEasingCurve.Linear,
duration: this.duration,
animations: [
{
type: Effect.ShaderUniform,
fragmentShader: this.shader,
uniform: "uProgress",
from: 0.0,
to: 1.0
}
]
});
}
slotWindowDataChanged(window, role) {
if (role == Effect.WindowAddedGrabRole) {
if (window.scaleInAnimation && effect.isGrabbed(window, role)) {
cancel(window.scaleInAnimation);
delete window.scaleInAnimation;
this.cleanupForcedRoles(window);
}
} else if (role == Effect.WindowClosedGrabRole) {
if (window.scaleOutAnimation && effect.isGrabbed(window, role)) {
cancel(window.scaleOutAnimation);
delete window.scaleOutAnimation;
this.cleanupForcedRoles(window);
}
}
}
}
new %EFFECT_CLASS%();
+21
View File
@@ -0,0 +1,21 @@
[Desktop Entry]
Name=%NAME%
Icon=preferences-system-windows-effect-%ICON%
Comment=%DESCRIPTION%
Type=Service
X-KDE-ServiceTypes=KWin/Effect,KCModule
X-KDE-PluginInfo-Author=Vlad Zahorodnii, Martin Flöser, Simon Schneegans
X-KDE-PluginInfo-Email=vlad.zahorodnii@kde.org, mgraesslin@kde.org, code@simonschneegans.de
X-KDE-PluginInfo-Name=%DIR_NAME%
X-KDE-PluginInfo-Version=1
X-KDE-PluginInfo-Category=Window Open/Close Animation
X-KDE-PluginInfo-License=GPLv3
X-KDE-PluginInfo-EnabledByDefault=false
X-KDE-Ordering=60
X-Plasma-API=javascript
X-Plasma-MainScript=code/main.js
X-KDE-PluginKeyword=%DIR_NAME%
X-KDE-Library=kcm_kwin4_genericscripted
X-KWin-Config-TranslationDomain=kwin_effects
X-KWin-Exclusive-Category=toplevel-open-close-animation
+71
View File
@@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>BMWConfigForm</class>
<widget class="QWidget" name="BMWConfigForm">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>562</width>
<height>365</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="1">
<widget class="QSpinBox" name="kcfg_Duration">
<property name="suffix">
<string> milliseconds</string>
</property>
<property name="minimum">
<number>100</number>
</property>
<property name="maximum">
<number>9999</number>
</property>
<property name="singleStep">
<number>100</number>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="KColorButton" name="kcfg_Color">
<property name="alphaChannelEnabled">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Duration:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Color:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
<property name="buddy">
<cstring>kcfg_Color</cstring>
</property>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KColorButton</class>
<extends>QPushButton</extends>
<header>kcolorbutton.h</header>
</customwidget>
</customwidgets>
<resources />
<connections />
</ui>
+13
View File
@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd">
<kcfgfile name="" />
<group name="">
<entry name="Duration" type="UInt">
<default>400</default>
</entry>
<entry name="Color" type="Color">
<default>#ffffff</default>
</entry>
</group>
</kcfg>
+5
View File
@@ -0,0 +1,5 @@
// This part is automatically included in the effect's source during the build process.
// The code below is called whenever the user changes something in the configuration of
// the effect.
effect.setUniform(this.shader, 'uColor', this.readRGBConfig('Color'));
+84
View File
@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>BMWConfigForm</class>
<widget class="QWidget" name="BMWConfigForm">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>562</width>
<height>365</height>
</rect>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="2" column="1">
<widget class="QDoubleSpinBox" name="kcfg_Scale">
<property name="minimum">
<double>0.100000000000000</double>
</property>
<property name="maximum">
<double>10.000000000000000</double>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QSpinBox" name="kcfg_Duration">
<property name="suffix">
<string> milliseconds</string>
</property>
<property name="minimum">
<number>100</number>
</property>
<property name="maximum">
<number>9999</number>
</property>
<property name="singleStep">
<number>100</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Color:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Duration:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Scale:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="KColorButton" name="kcfg_Color"></widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>KColorButton</class>
<extends>QPushButton</extends>
<header>kcolorbutton.h</header>
</customwidget>
</customwidgets>
<resources />
<connections />
</ui>
+16
View File
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<kcfg xmlns="http://www.kde.org/standards/kcfg/1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.kde.org/standards/kcfg/1.0
http://www.kde.org/standards/kcfg/1.0/kcfg.xsd">
<kcfgfile name="" />
<group name="">
<entry name="Duration" type="UInt">
<default>1500</default>
</entry>
<entry name="Scale" type="Double">
<default>1</default>
</entry>
<entry name="Color" type="Color">
<default>#ff64c8</default>
</entry>
</group>
</kcfg>
+4
View File
@@ -0,0 +1,4 @@
// This part is automatically included in the effect's source during the build process.
// The code below is called whenever a window is closed or opened.
effect.setUniform(this.shader, 'uSeed', [Math.random(), Math.random()]);
+7
View File
@@ -0,0 +1,7 @@
// This part is automatically included in the effect's source during the build process.
// The code below is called whenever the user changes something in the configuration of
// the effect.
effect.setUniform(this.shader, 'uDuration', this.duration * 0.001);
effect.setUniform(this.shader, 'uScale', effect.readConfig('Scale', 1.0));
effect.setUniform(this.shader, 'uColor', this.readRGBConfig('Color'));
+1 -1
View File
@@ -12,5 +12,5 @@
"42"
],
"url": "https://github.com/Schneegans/Burn-My-Windows",
"version": 15
"version": 19
}
+382
View File
@@ -0,0 +1,382 @@
# 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-06-25 05:04+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:114
msgid "Effect Options"
msgstr "خيارات التأثير"
#: prefs.js:142
msgid "Go Back"
msgstr "عُد"
#: prefs.js:184
msgid "General Options"
msgstr "خيارات عامة"
#: prefs.js:278
msgid "Gold Sponsors"
msgstr "الرعاة الذهبيون"
#: prefs.js:281
msgid "Silver Sponsors"
msgstr "الرعاة الفضيون"
#: prefs.js:284
msgid "Bronze Sponsors"
msgstr "الرعاة البرونزيون"
#: prefs.js:287
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:138
msgid "Broken Glass"
msgstr "زجاج المكسور"
#: src/TVEffect.js:77
msgid "TV Effect"
msgstr "تأثير التلفزيون"
#: src/TRexAttack.js:115
msgid "T-Rex Attack"
msgstr "هجوم تي ريكس"
#: src/SnapOfDisintegration.js:117
msgid "Snap of Disintegration"
msgstr "الانفجار القطع"
#: src/Incinerate.js:87
msgid "Incinerate"
msgstr ""
#: src/Wisps.js:85
msgid "Wisps"
msgstr "قطع"
#: src/Fire.js:99
msgid "Fire"
msgstr "نار"
#: src/Fire.js:154
msgid "Default Fire"
msgstr "النار الافتراضية"
#: src/Fire.js:164
msgid "Hell Fire"
msgstr "نار حارقة"
#: src/Fire.js:174
msgid "Dark and Smutty"
msgstr "داكن وقذر"
#: src/Fire.js:184
msgid "Cold Breeze"
msgstr "نسيم بارد"
#: src/Fire.js:194
msgid "Santa is Coming"
msgstr "سانتا قادم"
#: src/Hexagon.js:97
msgid "Hexagon"
msgstr "سداسي الزوايا"
#: src/EnergizeA.js:79
msgid "Energize A"
msgstr "تنشيط أ"
#: src/Apparition.js:80
msgid "Apparition"
msgstr "شبح"
#: src/EnergizeB.js:80
msgid "Energize B"
msgstr "تنشيط ب"
#: src/Matrix.js:113
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/Incinerate.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/Incinerate.ui:49 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/Incinerate.ui:52
#: resources/ui/gtk4/Incinerate.ui:98 resources/ui/gtk4/Incinerate.ui:144
#: resources/ui/gtk4/Incinerate.ui:178 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/prefs.ui:200
#: 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/Incinerate.ui:75
#: resources/ui/gtk3/Incinerate.ui:124 resources/ui/gtk3/Incinerate.ui:173
#: resources/ui/gtk3/Incinerate.ui:216 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/prefs.ui:263 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/Incinerate.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/Incinerate.ui:98
#: 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/Incinerate.ui:116 resources/ui/gtk3/Incinerate.ui:147
msgid "Turbulence"
msgstr ""
#: resources/ui/gtk4/Incinerate.ui:162 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/Incinerate.ui:195
#: 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/prefs.ui:184 resources/ui/gtk3/prefs.ui:242
msgid "Disable on Battery Power"
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 "اختر إعدادًا مسبقًا"
+74 -55
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: burn-my-windows\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-04-05 09:22+0200\n"
"POT-Creation-Date: 2022-06-25 05:04+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,31 +17,31 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: prefs.js:112
#: prefs.js:114
msgid "Effect Options"
msgstr ""
#: prefs.js:140
#: prefs.js:142
msgid "Go Back"
msgstr ""
#: prefs.js:182
#: prefs.js:184
msgid "General Options"
msgstr ""
#: prefs.js:276
#: prefs.js:278
msgid "Gold Sponsors"
msgstr ""
#: prefs.js:279
#: prefs.js:281
msgid "Silver Sponsors"
msgstr ""
#: prefs.js:282
#: prefs.js:284
msgid "Bronze Sponsors"
msgstr ""
#: prefs.js:285
#: prefs.js:287
msgid "Past Sponsors"
msgstr ""
@@ -55,67 +55,71 @@ msgstr ""
msgid "Close this Window to Preview the Effect!"
msgstr ""
#: src/BrokenGlass.js:57
#: src/BrokenGlass.js:138
msgid "Broken Glass"
msgstr ""
#: src/TVEffect.js:56
#: src/TVEffect.js:77
msgid "TV Effect"
msgstr ""
#: src/TRexAttack.js:56
#: src/TRexAttack.js:115
msgid "T-Rex Attack"
msgstr ""
#: src/SnapOfDisintegration.js:60
#: src/SnapOfDisintegration.js:117
msgid "Snap of Disintegration"
msgstr ""
#: src/Wisps.js:55
#: src/Incinerate.js:87
msgid "Incinerate"
msgstr ""
#: src/Wisps.js:85
msgid "Wisps"
msgstr ""
#: src/Fire.js:58
#: src/Fire.js:99
msgid "Fire"
msgstr ""
#: src/Fire.js:130
#: src/Fire.js:154
msgid "Default Fire"
msgstr ""
#: src/Fire.js:140
#: src/Fire.js:164
msgid "Hell Fire"
msgstr ""
#: src/Fire.js:150
#: src/Fire.js:174
msgid "Dark and Smutty"
msgstr ""
#: src/Fire.js:160
#: src/Fire.js:184
msgid "Cold Breeze"
msgstr ""
#: src/Fire.js:170
#: src/Fire.js:194
msgid "Santa is Coming"
msgstr ""
#: src/Hexagon.js:53
#: src/Hexagon.js:97
msgid "Hexagon"
msgstr ""
#: src/EnergizeA.js:54
#: src/EnergizeA.js:79
msgid "Energize A"
msgstr ""
#: src/Apparition.js:57
#: src/Apparition.js:80
msgid "Apparition"
msgstr ""
#: src/EnergizeB.js:54
#: src/EnergizeB.js:80
msgid "Energize B"
msgstr ""
#: src/Matrix.js:58
#: src/Matrix.js:113
msgid "Matrix"
msgstr ""
@@ -148,15 +152,15 @@ 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/Incinerate.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
#: resources/ui/gtk3/Incinerate.ui:49 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 ""
@@ -165,7 +169,9 @@ msgstr ""
#: 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/BrokenGlass.ui:244 resources/ui/gtk4/Incinerate.ui:52
#: resources/ui/gtk4/Incinerate.ui:98 resources/ui/gtk4/Incinerate.ui:144
#: resources/ui/gtk4/Incinerate.ui:178 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
@@ -179,33 +185,37 @@ msgstr ""
#: 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/gtk4/prefs.ui:166 resources/ui/gtk4/prefs.ui:200
#: 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/Incinerate.ui:75
#: resources/ui/gtk3/Incinerate.ui:124 resources/ui/gtk3/Incinerate.ui:173
#: resources/ui/gtk3/Incinerate.ui:216 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/prefs.ui:263 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/Incinerate.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
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Incinerate.ui:98
#: 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 ""
@@ -244,11 +254,16 @@ msgid ""
"window."
msgstr ""
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/SnapOfDisintegration.ui:116
#: resources/ui/gtk4/Incinerate.ui:116 resources/ui/gtk3/Incinerate.ui:147
msgid "Turbulence"
msgstr ""
#: resources/ui/gtk4/Incinerate.ui:162 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
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Incinerate.ui:195
#: 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 ""
@@ -342,6 +357,10 @@ msgstr ""
msgid "Also Add Effects to Dialogs"
msgstr ""
#: resources/ui/gtk4/prefs.ui:184 resources/ui/gtk3/prefs.ui:242
msgid "Disable on Battery Power"
msgstr ""
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
msgid "Twirl Intensity"
msgstr ""
+77 -58
View File
@@ -7,9 +7,9 @@ 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-02-02 19:55+0000\n"
"Last-Translator: Jiří Doubravský <jiri.doubravsky@gmail.com>\n"
"POT-Creation-Date: 2022-06-25 05:04+0200\n"
"PO-Revision-Date: 2022-05-23 08:18+0000\n"
"Last-Translator: Jose Riha <jose1711@gmail.com>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/burn-my-windows/"
"core/cs/>\n"
"Language: cs\n"
@@ -17,33 +17,33 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Weblate 4.11-dev\n"
"X-Generator: Weblate 4.13-dev\n"
#: prefs.js:112
#: prefs.js:114
msgid "Effect Options"
msgstr ""
#: prefs.js:140
#: prefs.js:142
msgid "Go Back"
msgstr ""
#: prefs.js:182
#: prefs.js:184
msgid "General Options"
msgstr "Obecné možnosti"
#: prefs.js:276
#: prefs.js:278
msgid "Gold Sponsors"
msgstr ""
#: prefs.js:279
#: prefs.js:281
msgid "Silver Sponsors"
msgstr ""
#: prefs.js:282
#: prefs.js:284
msgid "Bronze Sponsors"
msgstr ""
#: prefs.js:285
#: prefs.js:287
msgid "Past Sponsors"
msgstr ""
@@ -57,67 +57,71 @@ msgstr "Náhled %s"
msgid "Close this Window to Preview the Effect!"
msgstr "Zavřete toto okno, pokud chcete vidět efekt!"
#: src/BrokenGlass.js:57
#: src/BrokenGlass.js:138
msgid "Broken Glass"
msgstr "Střepy"
#: src/TVEffect.js:56
#: src/TVEffect.js:77
msgid "TV Effect"
msgstr "Televize"
#: src/TRexAttack.js:56
#: src/TRexAttack.js:115
msgid "T-Rex Attack"
msgstr "Tyrannosaurus"
#: src/SnapOfDisintegration.js:60
#: src/SnapOfDisintegration.js:117
msgid "Snap of Disintegration"
msgstr ""
#: src/Wisps.js:55
#: src/Incinerate.js:87
msgid "Incinerate"
msgstr ""
#: src/Wisps.js:85
msgid "Wisps"
msgstr "Obláčky"
#: src/Fire.js:58
#: src/Fire.js:99
msgid "Fire"
msgstr "Oheň"
#: src/Fire.js:130
#: src/Fire.js:154
msgid "Default Fire"
msgstr "Výchozí oheň"
#: src/Fire.js:140
#: src/Fire.js:164
msgid "Hell Fire"
msgstr "Pekelný oheň"
#: src/Fire.js:150
#: src/Fire.js:174
msgid "Dark and Smutty"
msgstr "Temný"
#: src/Fire.js:160
#: src/Fire.js:184
msgid "Cold Breeze"
msgstr "Studený vánek"
#: src/Fire.js:170
#: src/Fire.js:194
msgid "Santa is Coming"
msgstr "Santa přichází"
#: src/Hexagon.js:53
#: src/Hexagon.js:97
msgid "Hexagon"
msgstr ""
#: src/EnergizeA.js:54
#: src/EnergizeA.js:79
msgid "Energize A"
msgstr "Energizovat A"
#: src/Apparition.js:57
#: src/Apparition.js:80
msgid "Apparition"
msgstr ""
#: src/EnergizeB.js:54
#: src/EnergizeB.js:80
msgid "Energize B"
msgstr "Energizovat B"
#: src/Matrix.js:58
#: src/Matrix.js:113
msgid "Matrix"
msgstr "Matrix"
@@ -150,15 +154,15 @@ 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/Incinerate.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
#: resources/ui/gtk3/Incinerate.ui:49 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 "Délka animace [ms]"
@@ -167,7 +171,9 @@ msgstr "Délka animace [ms]"
#: 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/BrokenGlass.ui:244 resources/ui/gtk4/Incinerate.ui:52
#: resources/ui/gtk4/Incinerate.ui:98 resources/ui/gtk4/Incinerate.ui:144
#: resources/ui/gtk4/Incinerate.ui:178 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
@@ -181,33 +187,37 @@ msgstr "Délka animace [ms]"
#: 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/gtk4/prefs.ui:166 resources/ui/gtk4/prefs.ui:200
#: 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/Incinerate.ui:75
#: resources/ui/gtk3/Incinerate.ui:124 resources/ui/gtk3/Incinerate.ui:173
#: resources/ui/gtk3/Incinerate.ui:216 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/prefs.ui:263 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/SnapOfDisintegration.ui:70
#: resources/ui/gtk4/Incinerate.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
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Incinerate.ui:98
#: 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"
@@ -247,11 +257,16 @@ 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/SnapOfDisintegration.ui:116
#: resources/ui/gtk4/Incinerate.ui:116 resources/ui/gtk3/Incinerate.ui:147
msgid "Turbulence"
msgstr ""
#: resources/ui/gtk4/Incinerate.ui:162 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
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Incinerate.ui:195
#: 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"
@@ -345,6 +360,10 @@ 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/prefs.ui:184 resources/ui/gtk3/prefs.ui:242
msgid "Disable on Battery Power"
msgstr ""
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
msgid "Twirl Intensity"
msgstr ""
+76 -57
View File
@@ -7,8 +7,8 @@ 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-05 18:37+0000\n"
"POT-Creation-Date: 2022-06-25 05:04+0200\n"
"PO-Revision-Date: 2022-06-25 03:56+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,33 +17,33 @@ 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.13.1-dev\n"
#: prefs.js:112
#: prefs.js:114
msgid "Effect Options"
msgstr "Effektoptionen"
#: prefs.js:140
#: prefs.js:142
msgid "Go Back"
msgstr "Zurück"
#: prefs.js:182
#: prefs.js:184
msgid "General Options"
msgstr "Allgemeine Optionen"
#: prefs.js:276
#: prefs.js:278
msgid "Gold Sponsors"
msgstr "Gold-Sponsoren"
#: prefs.js:279
#: prefs.js:281
msgid "Silver Sponsors"
msgstr "Silber-Sponsoren"
#: prefs.js:282
#: prefs.js:284
msgid "Bronze Sponsors"
msgstr "Bronze-Sponsoren"
#: prefs.js:285
#: prefs.js:287
msgid "Past Sponsors"
msgstr "Ehemalige Sponsoren"
@@ -57,67 +57,71 @@ msgstr "Vorschau für %s"
msgid "Close this Window to Preview the Effect!"
msgstr "Schließen Sie dieses Fenster, um eine Vorschau des Effekts anzuzeigen!"
#: src/BrokenGlass.js:57
#: src/BrokenGlass.js:138
msgid "Broken Glass"
msgstr "Glassplitter"
#: src/TVEffect.js:56
#: src/TVEffect.js:77
msgid "TV Effect"
msgstr "TV-Effekt"
#: src/TRexAttack.js:56
#: src/TRexAttack.js:115
msgid "T-Rex Attack"
msgstr "T-Rex-Angriff"
#: src/SnapOfDisintegration.js:60
#: src/SnapOfDisintegration.js:117
msgid "Snap of Disintegration"
msgstr "Fingerschnippen des Zerfalls"
#: src/Wisps.js:55
#: src/Incinerate.js:87
msgid "Incinerate"
msgstr "Einäschern"
#: src/Wisps.js:85
msgid "Wisps"
msgstr "Irrlichter"
#: src/Fire.js:58
#: src/Fire.js:99
msgid "Fire"
msgstr "Feuer"
#: src/Fire.js:130
#: src/Fire.js:154
msgid "Default Fire"
msgstr "Standardfeuer"
#: src/Fire.js:140
#: src/Fire.js:164
msgid "Hell Fire"
msgstr "Höllenfeuer"
#: src/Fire.js:150
#: src/Fire.js:174
msgid "Dark and Smutty"
msgstr "Dunkel und schmutzig"
#: src/Fire.js:160
#: src/Fire.js:184
msgid "Cold Breeze"
msgstr "Kalte Brise"
#: src/Fire.js:170
#: src/Fire.js:194
msgid "Santa is Coming"
msgstr "Weihnachtsgrüße"
#: src/Hexagon.js:53
#: src/Hexagon.js:97
msgid "Hexagon"
msgstr "Hexagon"
#: src/EnergizeA.js:54
#: src/EnergizeA.js:79
msgid "Energize A"
msgstr "Energie A"
#: src/Apparition.js:57
#: src/Apparition.js:80
msgid "Apparition"
msgstr "Apparieren"
#: src/EnergizeB.js:54
#: src/EnergizeB.js:80
msgid "Energize B"
msgstr "Energie B"
#: src/Matrix.js:58
#: src/Matrix.js:113
msgid "Matrix"
msgstr "Matrix"
@@ -150,15 +154,15 @@ 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/Incinerate.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
#: resources/ui/gtk3/Incinerate.ui:49 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 "Animationszeit [ms]"
@@ -167,7 +171,9 @@ msgstr "Animationszeit [ms]"
#: 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/BrokenGlass.ui:244 resources/ui/gtk4/Incinerate.ui:52
#: resources/ui/gtk4/Incinerate.ui:98 resources/ui/gtk4/Incinerate.ui:144
#: resources/ui/gtk4/Incinerate.ui:178 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
@@ -181,33 +187,37 @@ msgstr "Animationszeit [ms]"
#: 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/gtk4/prefs.ui:166 resources/ui/gtk4/prefs.ui:200
#: 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/Incinerate.ui:75
#: resources/ui/gtk3/Incinerate.ui:124 resources/ui/gtk3/Incinerate.ui:173
#: resources/ui/gtk3/Incinerate.ui:216 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/prefs.ui:263 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/SnapOfDisintegration.ui:70
#: resources/ui/gtk4/Incinerate.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
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Incinerate.ui:98
#: 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"
@@ -248,11 +258,16 @@ 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/SnapOfDisintegration.ui:116
#: resources/ui/gtk4/Incinerate.ui:116 resources/ui/gtk3/Incinerate.ui:147
msgid "Turbulence"
msgstr "Turbulenz"
#: resources/ui/gtk4/Incinerate.ui:162 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
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Incinerate.ui:195
#: 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"
@@ -346,6 +361,10 @@ msgstr "Fenster-Schließen-Animation"
msgid "Also Add Effects to Dialogs"
msgstr "Effekte auch zu Dialogen hinzufügen"
#: resources/ui/gtk4/prefs.ui:184 resources/ui/gtk3/prefs.ui:242
msgid "Disable on Battery Power"
msgstr "Im Akkubetrieb deaktivieren"
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
msgid "Twirl Intensity"
msgstr "Wirbelintensität"
+382
View File
@@ -0,0 +1,382 @@
# 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-06-25 05:04+0200\n"
"PO-Revision-Date: 2022-07-10 11:19+0000\n"
"Last-Translator: phlostically <phlostically@mailinator.com>\n"
"Language-Team: Esperanto <https://hosted.weblate.org/projects/"
"burn-my-windows/core/eo/>\n"
"Language: eo\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.13.1-dev\n"
#: prefs.js:114
msgid "Effect Options"
msgstr "Opcioj pri efekto"
#: prefs.js:142
msgid "Go Back"
msgstr "Reen"
#: prefs.js:184
msgid "General Options"
msgstr "Ĝeneralaj opcioj"
#: prefs.js:278
msgid "Gold Sponsors"
msgstr "Oraj sponsoroj"
#: prefs.js:281
msgid "Silver Sponsors"
msgstr "Arĝentaj sponsoroj"
#: prefs.js:284
msgid "Bronze Sponsors"
msgstr "Bronzaj sponsoroj"
#: prefs.js:287
msgid "Past Sponsors"
msgstr "Pasintaj sponsoroj"
#. Translators: %s will be replaced by the effect's name.
#: prefs.js:510
#, javascript-format
msgid "Preview for %s"
msgstr "Antaŭrigardi efekton %s"
#: prefs.js:532
msgid "Close this Window to Preview the Effect!"
msgstr "Fermu ĉi tiun fenestron por antaŭrigardi la efekton!"
#: src/BrokenGlass.js:138
msgid "Broken Glass"
msgstr "Rompita vitro"
#: src/TVEffect.js:77
msgid "TV Effect"
msgstr "Televida efekto"
#: src/TRexAttack.js:115
msgid "T-Rex Attack"
msgstr "Tiranosaŭra atako"
#: src/SnapOfDisintegration.js:117
msgid "Snap of Disintegration"
msgstr "Fingroklako de malintegriĝo"
#: src/Incinerate.js:87
msgid "Incinerate"
msgstr "Forbruligi"
#: src/Wisps.js:85
msgid "Wisps"
msgstr "Vaglumo"
#: src/Fire.js:99
msgid "Fire"
msgstr "Fajro"
#: src/Fire.js:154
msgid "Default Fire"
msgstr "Implicita fajro"
#: src/Fire.js:164
msgid "Hell Fire"
msgstr "Infera fajro"
#: src/Fire.js:174
msgid "Dark and Smutty"
msgstr "Malhela kaj karba"
#: src/Fire.js:184
msgid "Cold Breeze"
msgstr "Malvarma vento"
#: src/Fire.js:194
msgid "Santa is Coming"
msgstr "Kristnasko venas"
#: src/Hexagon.js:97
msgid "Hexagon"
msgstr "Sesangulo"
#: src/EnergizeA.js:79
msgid "Energize A"
msgstr "Energii A"
#: src/Apparition.js:80
msgid "Apparition"
msgstr "Apero de fantomo"
#: src/EnergizeB.js:80
msgid "Energize B"
msgstr "Energii B"
#: src/Matrix.js:113
msgid "Matrix"
msgstr "Matrico"
#: resources/ui/common/main-menu.ui:6
msgid "Visit Homepage"
msgstr "Viziti retejon"
#: resources/ui/common/main-menu.ui:10
msgid "View Changelog"
msgstr "Vidi historion de ŝanĝoj"
#: resources/ui/common/main-menu.ui:16
msgid "Report a Bug"
msgstr "Raporti cimon"
#: resources/ui/common/main-menu.ui:20
msgid "Create an Effect"
msgstr "Krei efekton"
#: resources/ui/common/main-menu.ui:24
msgid "Translate"
msgstr "Traduki"
#: resources/ui/common/main-menu.ui:28
msgid "Donate"
msgstr "Donaci"
#: resources/ui/common/main-menu.ui:41
msgid "About Burn-My-Windows"
msgstr "Pri Burn-My-Windows"
#: resources/ui/gtk4/Matrix.ui:24 resources/ui/gtk4/BrokenGlass.ui:24
#: resources/ui/gtk4/Incinerate.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/Incinerate.ui:49 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 "Daŭro de efekto [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/Incinerate.ui:52
#: resources/ui/gtk4/Incinerate.ui:98 resources/ui/gtk4/Incinerate.ui:144
#: resources/ui/gtk4/Incinerate.ui:178 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/prefs.ui:200
#: 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/Incinerate.ui:75
#: resources/ui/gtk3/Incinerate.ui:124 resources/ui/gtk3/Incinerate.ui:173
#: resources/ui/gtk3/Incinerate.ui:216 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/prefs.ui:263 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 "Restarigi al apriora valoro"
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
#: resources/ui/gtk4/Incinerate.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/Incinerate.ui:98
#: 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 "Skalo"
#: resources/ui/gtk4/Matrix.ui:116 resources/ui/gtk4/Apparition.ui:70
#: resources/ui/gtk3/Apparition.ui:112
msgid "Randomness"
msgstr "Hazardeco"
#: resources/ui/gtk4/Matrix.ui:162
msgid "Vertical Overshooting"
msgstr "Vertikala troirado"
#: resources/ui/gtk4/Matrix.ui:208
msgid "Trail Color"
msgstr "Koloro de strio"
#: resources/ui/gtk4/Matrix.ui:242
msgid "Tip Color"
msgstr "Koloro de pinto"
#: resources/ui/gtk4/BrokenGlass.ui:116
msgid "Gravity"
msgstr "Gravito"
#: resources/ui/gtk4/BrokenGlass.ui:162
msgid "Blow Force"
msgstr "Forto de eksplodado"
#: resources/ui/gtk4/BrokenGlass.ui:212
msgid "Shatter From Pointer Location"
msgstr "Frakasi de montrila loko"
#: resources/ui/gtk4/BrokenGlass.ui:221
msgid ""
"The shards will fly away from where your mouse pointer was when closing the "
"window."
msgstr ""
"La pecetoj forflugos de la loko de la musmontrilo dum fermado de la fenestro."
#: resources/ui/gtk4/Incinerate.ui:116 resources/ui/gtk3/Incinerate.ui:147
msgid "Turbulence"
msgstr "Turbuleco"
#: resources/ui/gtk4/Incinerate.ui:162 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/Incinerate.ui:195
#: 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 "Koloro"
#: resources/ui/gtk4/Fire.ui:25 resources/ui/gtk3/Fire.ui:49
msgid "Presets"
msgstr "Antaŭagordoj"
#: resources/ui/gtk4/Fire.ui:141 resources/ui/gtk3/Fire.ui:189
msgid "Speed"
msgstr "Rapido"
#: resources/ui/gtk4/Fire.ui:191 resources/ui/gtk3/Fire.ui:241
msgid "3D Noise"
msgstr "Tridimensia bruo"
#: resources/ui/gtk4/Fire.ui:200 resources/ui/gtk3/Fire.ui:250
msgid "Creates a more dynamic fire but requires more GPU power."
msgstr ""
"Tio plidinamikigas fajron sed postulas pli potencan grafikan procesoron."
#: resources/ui/gtk4/Fire.ui:240 resources/ui/gtk3/Fire.ui:300
msgid "Gradient"
msgstr "Gradiento"
#: resources/ui/gtk4/TRexAttack.ui:70
msgid "Claw Scratch Scale"
msgstr "Skalo de ungego"
#: resources/ui/gtk4/TRexAttack.ui:116
msgid "Claw Scratch Count"
msgstr "Nombro de ungegoj"
#: resources/ui/gtk4/TRexAttack.ui:162
msgid "Warp Effect"
msgstr "Efekto de deformado"
#: resources/ui/gtk4/TRexAttack.ui:208
msgid "Flash Color"
msgstr "Koloro de ekbrilo"
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
msgid "Preview this Effect"
msgstr "Antaŭrigardi ĉi tiun efekton"
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
msgid "Mesh Line Width"
msgstr "Larĝo de krada linio"
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
msgid "Line Color"
msgstr "Koloro de linio"
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
msgid "Glow Color"
msgstr "Koloro de brilado"
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
msgid "Additive Blending"
msgstr "Adicia miksado"
#: resources/ui/gtk4/Hexagon.ui:243 resources/ui/gtk3/Hexagon.ui:294
msgid "You may want to enable this for dark window themes."
msgstr "Vi eble volas ŝalti ĉi tion por malhelaj etosoj."
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
msgid "Welcome to Burn-My-Windows!"
msgstr "Bonvenon al 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 "Se vi ŝatas ĉi tiun etendaĵon, rekomendu ĝin al viaj amikoj ☺"
#: resources/ui/gtk4/prefs.ui:66 resources/ui/gtk3/prefs.ui:74
msgid "Open Window Animation"
msgstr "Efekto por malfermi fenestron"
#: 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 "Se vi ŝaltas plurajn, unu elektiĝos hazarde."
#: 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 "Elekti efektojn"
#: resources/ui/gtk4/prefs.ui:110 resources/ui/gtk3/prefs.ui:138
msgid "Close Window Animation"
msgstr "Efekto por fermi fenestron"
#: resources/ui/gtk4/prefs.ui:150 resources/ui/gtk3/prefs.ui:198
msgid "Also Add Effects to Dialogs"
msgstr "Ankaŭ uzi efektojn por dialogoj"
#: resources/ui/gtk4/prefs.ui:184 resources/ui/gtk3/prefs.ui:242
msgid "Disable on Battery Power"
msgstr "Malŝalti dum uzado de la baterio"
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
msgid "Twirl Intensity"
msgstr "Intenso de tordado"
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
msgid "Shake Intensity"
msgstr "Intenso de skuado"
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
msgid "Suction Intensity"
msgstr "Intenso de suĉado"
#: resources/ui/gtk3/Fire.ui:63
msgid "Choose a Preset"
msgstr "Elekti antaŭagordon"
+92 -73
View File
@@ -7,9 +7,9 @@ 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-03-15 06:54+0000\n"
"Last-Translator: Adolfo Jayme Barrientos <fitojb@ubuntu.com>\n"
"POT-Creation-Date: 2022-06-25 05:04+0200\n"
"PO-Revision-Date: 2022-07-06 13:20+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"
@@ -17,33 +17,33 @@ 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.13.1-dev\n"
#: prefs.js:112
#: prefs.js:114
msgid "Effect Options"
msgstr "Opciones de efecto"
#: prefs.js:140
#: prefs.js:142
msgid "Go Back"
msgstr "Volver"
#: prefs.js:182
#: prefs.js:184
msgid "General Options"
msgstr "Opciones generales"
#: prefs.js:276
#: prefs.js:278
msgid "Gold Sponsors"
msgstr "Patrocinadores de oro"
msgstr "Patrocinadores Oro"
#: prefs.js:279
#: prefs.js:281
msgid "Silver Sponsors"
msgstr "Patrocinadores de plata"
#: prefs.js:282
#: prefs.js:284
msgid "Bronze Sponsors"
msgstr "Patrocinadores de bronce"
#: prefs.js:285
#: prefs.js:287
msgid "Past Sponsors"
msgstr "Patrocinadores anteriores"
@@ -55,69 +55,73 @@ msgstr "Previsualización de %s"
#: prefs.js:532
msgid "Close this Window to Preview the Effect!"
msgstr "¡Cierre esta ventana para ver el efecto!"
msgstr "¡Cierre esta ventana para probar el efecto!"
#: src/BrokenGlass.js:57
#: src/BrokenGlass.js:138
msgid "Broken Glass"
msgstr "Cristales rotos"
#: src/TVEffect.js:56
#: src/TVEffect.js:77
msgid "TV Effect"
msgstr "Efecto televisor"
msgstr "Efecto TV"
#: src/TRexAttack.js:56
#: src/TRexAttack.js:115
msgid "T-Rex Attack"
msgstr "Ataque de T-Rex"
#: src/SnapOfDisintegration.js:60
#: src/SnapOfDisintegration.js:117
msgid "Snap of Disintegration"
msgstr ""
msgstr "Chasquido de desintegración"
#: src/Wisps.js:55
#: src/Incinerate.js:87
msgid "Incinerate"
msgstr "Incinerar"
#: src/Wisps.js:85
msgid "Wisps"
msgstr "Chispas"
#: src/Fire.js:58
#: src/Fire.js:99
msgid "Fire"
msgstr "Fuego"
#: src/Fire.js:130
#: src/Fire.js:154
msgid "Default Fire"
msgstr "Fuego predeterminado"
#: src/Fire.js:140
#: src/Fire.js:164
msgid "Hell Fire"
msgstr "Fuego infernal"
#: src/Fire.js:150
#: src/Fire.js:174
msgid "Dark and Smutty"
msgstr "Oscuro y obsceno"
#: src/Fire.js:160
#: src/Fire.js:184
msgid "Cold Breeze"
msgstr "Brisa fría"
#: src/Fire.js:170
#: src/Fire.js:194
msgid "Santa is Coming"
msgstr "Viene Papá Noel"
#: src/Hexagon.js:53
#: src/Hexagon.js:97
msgid "Hexagon"
msgstr ""
msgstr "Hexágonos"
#: src/EnergizeA.js:54
#: src/EnergizeA.js:79
msgid "Energize A"
msgstr "Energizar A"
#: src/Apparition.js:57
#: src/Apparition.js:80
msgid "Apparition"
msgstr ""
msgstr "Aparición"
#: src/EnergizeB.js:54
#: src/EnergizeB.js:80
msgid "Energize B"
msgstr "Energizar B"
#: src/Matrix.js:58
#: src/Matrix.js:113
msgid "Matrix"
msgstr "Matrix"
@@ -150,15 +154,15 @@ 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/Incinerate.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
#: resources/ui/gtk3/Incinerate.ui:49 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 "Tiempo de animación [ms]"
@@ -167,7 +171,9 @@ msgstr "Tiempo de animación [ms]"
#: 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/BrokenGlass.ui:244 resources/ui/gtk4/Incinerate.ui:52
#: resources/ui/gtk4/Incinerate.ui:98 resources/ui/gtk4/Incinerate.ui:144
#: resources/ui/gtk4/Incinerate.ui:178 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
@@ -181,33 +187,37 @@ msgstr "Tiempo de animación [ms]"
#: 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/gtk4/prefs.ui:166 resources/ui/gtk4/prefs.ui:200
#: 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/Incinerate.ui:75
#: resources/ui/gtk3/Incinerate.ui:124 resources/ui/gtk3/Incinerate.ui:173
#: resources/ui/gtk3/Incinerate.ui:216 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/prefs.ui:263 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/SnapOfDisintegration.ui:70
#: resources/ui/gtk4/Incinerate.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
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Incinerate.ui:98
#: 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"
@@ -248,11 +258,16 @@ 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/SnapOfDisintegration.ui:116
#: resources/ui/gtk4/Incinerate.ui:116 resources/ui/gtk3/Incinerate.ui:147
msgid "Turbulence"
msgstr "Turbulencia"
#: resources/ui/gtk4/Incinerate.ui:162 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
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Incinerate.ui:195
#: 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"
@@ -298,27 +313,27 @@ msgstr "Previsualizar este efecto"
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
msgid "Mesh Line Width"
msgstr ""
msgstr "Ancho de la línea de malla"
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
msgid "Line Color"
msgstr ""
msgstr "Color de línea"
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
msgid "Glow Color"
msgstr ""
msgstr "Color del brillo"
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
msgid "Additive Blending"
msgstr ""
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 ""
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 :)"
@@ -346,17 +361,21 @@ 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/prefs.ui:184 resources/ui/gtk3/prefs.ui:242
msgid "Disable on Battery Power"
msgstr "Desactivar en alimentación con batería"
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
msgid "Twirl Intensity"
msgstr ""
msgstr "Intensidad del giro"
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
msgid "Shake Intensity"
msgstr ""
msgstr "Intensidad del temblor"
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
msgid "Suction Intensity"
msgstr ""
msgstr "Intensidad de la succión"
#: resources/ui/gtk3/Fire.ui:63
msgid "Choose a Preset"
+381
View File
@@ -0,0 +1,381 @@
# 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-06-25 05:04+0200\n"
"PO-Revision-Date: 2022-05-23 08:18+0000\n"
"Last-Translator: Eshagh Shahedany <eshagh094@gmail.com>\n"
"Language-Team: Persian <https://hosted.weblate.org/projects/burn-my-windows/"
"core/fa/>\n"
"Language: fa\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.13-dev\n"
#: prefs.js:114
msgid "Effect Options"
msgstr "انتخاب‌های جلوه"
#: prefs.js:142
msgid "Go Back"
msgstr "بازگشت"
#: prefs.js:184
msgid "General Options"
msgstr "انتخاب‌های عمومی"
#: prefs.js:278
msgid "Gold Sponsors"
msgstr "حامیان طلایی"
#: prefs.js:281
msgid "Silver Sponsors"
msgstr "حامیان نقره‌ای"
#: prefs.js:284
msgid "Bronze Sponsors"
msgstr "حامیان برنزی"
#: prefs.js:287
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:138
msgid "Broken Glass"
msgstr "شیشهٔ شکسته"
#: src/TVEffect.js:77
msgid "TV Effect"
msgstr "جلوهٔ تلویزیون"
#: src/TRexAttack.js:115
msgid "T-Rex Attack"
msgstr "حملهٔ تی‌رکس"
#: src/SnapOfDisintegration.js:117
msgid "Snap of Disintegration"
msgstr "ضربهٔ فروپاشی"
#: src/Incinerate.js:87
msgid "Incinerate"
msgstr ""
#: src/Wisps.js:85
msgid "Wisps"
msgstr "جرقه‌ها"
#: src/Fire.js:99
msgid "Fire"
msgstr "آتش"
#: src/Fire.js:154
msgid "Default Fire"
msgstr "آتش پیش‌گزیده"
#: src/Fire.js:164
msgid "Hell Fire"
msgstr "آتش جهنمی"
#: src/Fire.js:174
msgid "Dark and Smutty"
msgstr "تاریک و دودی"
#: src/Fire.js:184
msgid "Cold Breeze"
msgstr "نسیم سرد"
#: src/Fire.js:194
msgid "Santa is Coming"
msgstr "بابانوئل می‌آید"
#: src/Hexagon.js:97
msgid "Hexagon"
msgstr "شش ضلعی"
#: src/EnergizeA.js:79
msgid "Energize A"
msgstr "انرژی آ"
#: src/Apparition.js:80
msgid "Apparition"
msgstr "تجسم"
#: src/EnergizeB.js:80
msgid "Energize B"
msgstr "انرژی ب"
#: src/Matrix.js:113
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 "دربارهٔ پنجره‌هایم را بسوزان"
#: resources/ui/gtk4/Matrix.ui:24 resources/ui/gtk4/BrokenGlass.ui:24
#: resources/ui/gtk4/Incinerate.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/Incinerate.ui:49 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/Incinerate.ui:52
#: resources/ui/gtk4/Incinerate.ui:98 resources/ui/gtk4/Incinerate.ui:144
#: resources/ui/gtk4/Incinerate.ui:178 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/prefs.ui:200
#: 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/Incinerate.ui:75
#: resources/ui/gtk3/Incinerate.ui:124 resources/ui/gtk3/Incinerate.ui:173
#: resources/ui/gtk3/Incinerate.ui:216 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/prefs.ui:263 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/Incinerate.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/Incinerate.ui:98
#: 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/Incinerate.ui:116 resources/ui/gtk3/Incinerate.ui:147
msgid "Turbulence"
msgstr ""
#: resources/ui/gtk4/Incinerate.ui:162 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/Incinerate.ui:195
#: 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 "به پنجره‌هایم را بسوزان، خوش آمدید!"
#: 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/prefs.ui:184 resources/ui/gtk3/prefs.ui:242
msgid "Disable on Battery Power"
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 "یک پیش تنظیم را انتخاب کنید"
+381
View File
@@ -0,0 +1,381 @@
# 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-06-25 05:04+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:114
msgid "Effect Options"
msgstr "Tehostevalinnat"
#: prefs.js:142
msgid "Go Back"
msgstr "Takaisin"
#: prefs.js:184
msgid "General Options"
msgstr "Yleiset asetukset"
#: prefs.js:278
msgid "Gold Sponsors"
msgstr "Kultasponsorit"
#: prefs.js:281
msgid "Silver Sponsors"
msgstr "Hopeasponsorit"
#: prefs.js:284
msgid "Bronze Sponsors"
msgstr "Pronssisponsorit"
#: prefs.js:287
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:138
msgid "Broken Glass"
msgstr "Rikkoutunut lasi"
#: src/TVEffect.js:77
msgid "TV Effect"
msgstr "TV-tehoste"
#: src/TRexAttack.js:115
msgid "T-Rex Attack"
msgstr "T-Rexin hyökkäys"
#: src/SnapOfDisintegration.js:117
msgid "Snap of Disintegration"
msgstr "Hajoamisen napsahdus"
#: src/Incinerate.js:87
msgid "Incinerate"
msgstr ""
#: src/Wisps.js:85
msgid "Wisps"
msgstr "Häiveet"
#: src/Fire.js:99
msgid "Fire"
msgstr "Tuli"
#: src/Fire.js:154
msgid "Default Fire"
msgstr "Oletustuli"
#: src/Fire.js:164
msgid "Hell Fire"
msgstr "Helvetintuli"
#: src/Fire.js:174
msgid "Dark and Smutty"
msgstr "Tumma ja likainen"
#: src/Fire.js:184
msgid "Cold Breeze"
msgstr "Kylmän tuulahdus"
#: src/Fire.js:194
msgid "Santa is Coming"
msgstr "Pukki saapuu"
#: src/Hexagon.js:97
msgid "Hexagon"
msgstr "Kuusikulmio"
#: src/EnergizeA.js:79
msgid "Energize A"
msgstr ""
#: src/Apparition.js:80
msgid "Apparition"
msgstr "Ilmestys"
#: src/EnergizeB.js:80
msgid "Energize B"
msgstr ""
#: src/Matrix.js:113
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/Incinerate.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/Incinerate.ui:49 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/Incinerate.ui:52
#: resources/ui/gtk4/Incinerate.ui:98 resources/ui/gtk4/Incinerate.ui:144
#: resources/ui/gtk4/Incinerate.ui:178 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/prefs.ui:200
#: 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/Incinerate.ui:75
#: resources/ui/gtk3/Incinerate.ui:124 resources/ui/gtk3/Incinerate.ui:173
#: resources/ui/gtk3/Incinerate.ui:216 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/prefs.ui:263 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/Incinerate.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/Incinerate.ui:98
#: 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/Incinerate.ui:116 resources/ui/gtk3/Incinerate.ui:147
msgid "Turbulence"
msgstr ""
#: resources/ui/gtk4/Incinerate.ui:162 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/Incinerate.ui:195
#: 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/prefs.ui:184 resources/ui/gtk3/prefs.ui:242
msgid "Disable on Battery Power"
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 "Valitse esiasetus"
+93 -74
View File
@@ -7,9 +7,9 @@ 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-02-21 11:58+0000\n"
"Last-Translator: Nathan <bonnemainsnathan@gmail.com>\n"
"POT-Creation-Date: 2022-06-25 05:04+0200\n"
"PO-Revision-Date: 2022-06-30 22:19+0000\n"
"Last-Translator: Mathieu B. <mathieu.bousquet2@gmail.com>\n"
"Language-Team: French <https://hosted.weblate.org/projects/burn-my-windows/"
"core/fr/>\n"
"Language: fr\n"
@@ -17,33 +17,33 @@ 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.13.1-dev\n"
#: prefs.js:112
#: prefs.js:114
msgid "Effect Options"
msgstr "Options de l'effet"
#: prefs.js:140
#: prefs.js:142
msgid "Go Back"
msgstr "Retour"
#: prefs.js:182
#: prefs.js:184
msgid "General Options"
msgstr "Options générales"
#: prefs.js:276
#: prefs.js:278
msgid "Gold Sponsors"
msgstr "Sponsors Or"
#: prefs.js:279
#: prefs.js:281
msgid "Silver Sponsors"
msgstr "Sponsors Argent"
#: prefs.js:282
#: prefs.js:284
msgid "Bronze Sponsors"
msgstr "Sponsors Bronze"
#: prefs.js:285
#: prefs.js:287
msgid "Past Sponsors"
msgstr "Anciens Sponsors"
@@ -57,67 +57,71 @@ msgstr "Aperçu pour %s"
msgid "Close this Window to Preview the Effect!"
msgstr "Fermez cette fenêtre pour un aperçu de l'effet !"
#: src/BrokenGlass.js:57
#: src/BrokenGlass.js:138
msgid "Broken Glass"
msgstr "Verre brisé"
#: src/TVEffect.js:56
#: src/TVEffect.js:77
msgid "TV Effect"
msgstr "Effet TV"
#: src/TRexAttack.js:56
#: src/TRexAttack.js:115
msgid "T-Rex Attack"
msgstr "Attaque de T-Rex"
#: src/SnapOfDisintegration.js:60
#: src/SnapOfDisintegration.js:117
msgid "Snap of Disintegration"
msgstr ""
msgstr "Désintégration"
#: src/Wisps.js:55
#: src/Incinerate.js:87
msgid "Incinerate"
msgstr "Incinération"
#: src/Wisps.js:85
msgid "Wisps"
msgstr "Volutes"
msgstr "Feux follets"
#: src/Fire.js:58
#: src/Fire.js:99
msgid "Fire"
msgstr "Feu"
#: src/Fire.js:130
#: src/Fire.js:154
msgid "Default Fire"
msgstr "Feu par défaut"
#: src/Fire.js:140
#: src/Fire.js:164
msgid "Hell Fire"
msgstr "Feu de l'enfer"
#: src/Fire.js:150
#: src/Fire.js:174
msgid "Dark and Smutty"
msgstr "Sombre et ténébreux"
#: src/Fire.js:160
#: src/Fire.js:184
msgid "Cold Breeze"
msgstr "Brise froide"
#: src/Fire.js:170
#: src/Fire.js:194
msgid "Santa is Coming"
msgstr "Le Père Noël arrive"
#: src/Hexagon.js:53
#: src/Hexagon.js:97
msgid "Hexagon"
msgstr ""
msgstr "Hexagone"
#: src/EnergizeA.js:54
#: src/EnergizeA.js:79
msgid "Energize A"
msgstr "Énergie A"
#: src/Apparition.js:57
#: src/Apparition.js:80
msgid "Apparition"
msgstr ""
msgstr "Apparition"
#: src/EnergizeB.js:54
#: src/EnergizeB.js:80
msgid "Energize B"
msgstr "Énergie B"
#: src/Matrix.js:58
#: src/Matrix.js:113
msgid "Matrix"
msgstr "Matrix"
@@ -131,7 +135,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"
@@ -150,15 +154,15 @@ 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/Incinerate.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
#: resources/ui/gtk3/Incinerate.ui:49 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 "Durée de l'animation (ms)"
@@ -167,7 +171,9 @@ msgstr "Durée de l'animation (ms)"
#: 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/BrokenGlass.ui:244 resources/ui/gtk4/Incinerate.ui:52
#: resources/ui/gtk4/Incinerate.ui:98 resources/ui/gtk4/Incinerate.ui:144
#: resources/ui/gtk4/Incinerate.ui:178 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
@@ -181,33 +187,37 @@ msgstr "Durée de l'animation (ms)"
#: 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/gtk4/prefs.ui:166 resources/ui/gtk4/prefs.ui:200
#: 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/Incinerate.ui:75
#: resources/ui/gtk3/Incinerate.ui:124 resources/ui/gtk3/Incinerate.ui:173
#: resources/ui/gtk3/Incinerate.ui:216 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/prefs.ui:263 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/SnapOfDisintegration.ui:70
#: resources/ui/gtk4/Incinerate.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
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Incinerate.ui:98
#: 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"
@@ -248,11 +258,16 @@ 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/SnapOfDisintegration.ui:116
#: resources/ui/gtk4/Incinerate.ui:116 resources/ui/gtk3/Incinerate.ui:147
msgid "Turbulence"
msgstr "Turbulence"
#: resources/ui/gtk4/Incinerate.ui:162 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
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Incinerate.ui:195
#: 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"
@@ -280,11 +295,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"
@@ -300,23 +315,23 @@ 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 ""
msgstr "Largeur des lignes du maillage"
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
msgid "Line Color"
msgstr ""
msgstr "Couleur de ligne"
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
msgid "Glow Color"
msgstr ""
msgstr "Couleur de la lueur"
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
msgid "Additive Blending"
msgstr ""
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 ""
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!"
@@ -333,7 +348,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
@@ -348,17 +363,21 @@ 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/prefs.ui:184 resources/ui/gtk3/prefs.ui:242
msgid "Disable on Battery Power"
msgstr "Désactiver sur batterie"
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
msgid "Twirl Intensity"
msgstr ""
msgstr "Intensité du tournoiement"
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
msgid "Shake Intensity"
msgstr ""
msgstr "Intensité de la secousse"
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
msgid "Suction Intensity"
msgstr ""
msgstr "Intensité de la succion"
#: resources/ui/gtk3/Fire.ui:63
msgid "Choose a Preset"
+381
View File
@@ -0,0 +1,381 @@
# 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-06-25 05:04+0200\n"
"PO-Revision-Date: 2022-07-02 21:20+0000\n"
"Last-Translator: יהודה אליסף <hvusvvnkl12345@gmail.com>\n"
"Language-Team: Hebrew <https://hosted.weblate.org/projects/burn-my-windows/"
"core/he/>\n"
"Language: he\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && "
"n % 10 == 0) ? 2 : 3));\n"
"X-Generator: Weblate 4.13.1-dev\n"
#: prefs.js:114
msgid "Effect Options"
msgstr "אפשרויות אפקט"
#: prefs.js:142
msgid "Go Back"
msgstr "חזור"
#: prefs.js:184
msgid "General Options"
msgstr "אפשרויות"
#: prefs.js:278
msgid "Gold Sponsors"
msgstr "תורמים ראשיים"
#: prefs.js:281
msgid "Silver Sponsors"
msgstr "תורמי משנה"
#: prefs.js:284
msgid "Bronze Sponsors"
msgstr "תורמים נוספים"
#: prefs.js:287
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:138
msgid "Broken Glass"
msgstr "זכוכית נשברת"
#: src/TVEffect.js:77
msgid "TV Effect"
msgstr "טלוויזיה"
#: src/TRexAttack.js:115
msgid "T-Rex Attack"
msgstr "תקיפת טירקס"
#: src/SnapOfDisintegration.js:117
msgid "Snap of Disintegration"
msgstr "התפוררות"
#: src/Incinerate.js:87
msgid "Incinerate"
msgstr "בעירה"
#: src/Wisps.js:85
msgid "Wisps"
msgstr "קרצוף"
#: src/Fire.js:99
msgid "Fire"
msgstr "להבות"
#: src/Fire.js:154
msgid "Default Fire"
msgstr "להבות - defalut"
#: src/Fire.js:164
msgid "Hell Fire"
msgstr "אש הגיהנום"
#: src/Fire.js:174
msgid "Dark and Smutty"
msgstr "אפלה"
#: src/Fire.js:184
msgid "Cold Breeze"
msgstr "רוח קרה"
#: src/Fire.js:194
msgid "Santa is Coming"
msgstr "סנטה קלאוס"
#: src/Hexagon.js:97
msgid "Hexagon"
msgstr "משושה"
#: src/EnergizeA.js:79
msgid "Energize A"
msgstr "אנרגיה 1"
#: src/Apparition.js:80
msgid "Apparition"
msgstr "הופעה פתאומית"
#: src/EnergizeB.js:80
msgid "Energize B"
msgstr "אנרגיה 2"
#: src/Matrix.js:113
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/Incinerate.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/Incinerate.ui:49 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/Incinerate.ui:52
#: resources/ui/gtk4/Incinerate.ui:98 resources/ui/gtk4/Incinerate.ui:144
#: resources/ui/gtk4/Incinerate.ui:178 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/prefs.ui:200
#: 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/Incinerate.ui:75
#: resources/ui/gtk3/Incinerate.ui:124 resources/ui/gtk3/Incinerate.ui:173
#: resources/ui/gtk3/Incinerate.ui:216 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/prefs.ui:263 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/Incinerate.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/Incinerate.ui:98
#: 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/Incinerate.ui:116 resources/ui/gtk3/Incinerate.ui:147
msgid "Turbulence"
msgstr ""
#: resources/ui/gtk4/Incinerate.ui:162 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/Incinerate.ui:195
#: 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 ""
#: 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/prefs.ui:184 resources/ui/gtk3/prefs.ui:242
msgid "Disable on Battery Power"
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 ""
+87 -68
View File
@@ -7,8 +7,8 @@ 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-02-28 12:56+0000\n"
"POT-Creation-Date: 2022-06-25 05:04+0200\n"
"PO-Revision-Date: 2022-06-29 17:16+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,33 +17,33 @@ 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.13.1-dev\n"
#: prefs.js:112
#: prefs.js:114
msgid "Effect Options"
msgstr "Opzioni effetto"
#: prefs.js:140
#: prefs.js:142
msgid "Go Back"
msgstr "Indietro"
#: prefs.js:182
#: prefs.js:184
msgid "General Options"
msgstr "Opzioni generali"
#: prefs.js:276
#: prefs.js:278
msgid "Gold Sponsors"
msgstr "Sponsor d'oro"
#: prefs.js:279
#: prefs.js:281
msgid "Silver Sponsors"
msgstr "Sponsor d'argento"
#: prefs.js:282
#: prefs.js:284
msgid "Bronze Sponsors"
msgstr "Sponsor di bronzo"
#: prefs.js:285
#: prefs.js:287
msgid "Past Sponsors"
msgstr "Sponsor passati"
@@ -57,67 +57,71 @@ msgstr "Anteprima per %s"
msgid "Close this Window to Preview the Effect!"
msgstr "Chiudi questa finestra per visualizzare in anteprima l'effetto!"
#: src/BrokenGlass.js:57
#: src/BrokenGlass.js:138
msgid "Broken Glass"
msgstr "Vetro rotto"
#: src/TVEffect.js:56
#: src/TVEffect.js:77
msgid "TV Effect"
msgstr "Effetto TV"
#: src/TRexAttack.js:56
#: src/TRexAttack.js:115
msgid "T-Rex Attack"
msgstr "Attacco T-Rex"
#: src/SnapOfDisintegration.js:60
#: src/SnapOfDisintegration.js:117
msgid "Snap of Disintegration"
msgstr ""
msgstr "Scatto di disintegrazione"
#: src/Wisps.js:55
#: src/Incinerate.js:87
msgid "Incinerate"
msgstr "Incenerire"
#: src/Wisps.js:85
msgid "Wisps"
msgstr "Scintille"
#: src/Fire.js:58
#: src/Fire.js:99
msgid "Fire"
msgstr "Fuoco"
#: src/Fire.js:130
#: src/Fire.js:154
msgid "Default Fire"
msgstr "Fuoco predefinito"
#: src/Fire.js:140
#: src/Fire.js:164
msgid "Hell Fire"
msgstr "Fuoco Infernale"
#: src/Fire.js:150
#: src/Fire.js:174
msgid "Dark and Smutty"
msgstr "Scuro e Tenebroso"
#: src/Fire.js:160
#: src/Fire.js:184
msgid "Cold Breeze"
msgstr "Brezza Fredda"
#: src/Fire.js:170
#: src/Fire.js:194
msgid "Santa is Coming"
msgstr "Babbo Natale sta arrivando"
#: src/Hexagon.js:53
#: src/Hexagon.js:97
msgid "Hexagon"
msgstr ""
msgstr "Esagono"
#: src/EnergizeA.js:54
#: src/EnergizeA.js:79
msgid "Energize A"
msgstr "Energia A"
#: src/Apparition.js:57
#: src/Apparition.js:80
msgid "Apparition"
msgstr ""
msgstr "Apparizione"
#: src/EnergizeB.js:54
#: src/EnergizeB.js:80
msgid "Energize B"
msgstr "Energia B"
#: src/Matrix.js:58
#: src/Matrix.js:113
msgid "Matrix"
msgstr "Matrix"
@@ -150,15 +154,15 @@ 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/Incinerate.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
#: resources/ui/gtk3/Incinerate.ui:49 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 "Tempo animazione [ms]"
@@ -167,7 +171,9 @@ msgstr "Tempo animazione [ms]"
#: 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/BrokenGlass.ui:244 resources/ui/gtk4/Incinerate.ui:52
#: resources/ui/gtk4/Incinerate.ui:98 resources/ui/gtk4/Incinerate.ui:144
#: resources/ui/gtk4/Incinerate.ui:178 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
@@ -181,33 +187,37 @@ msgstr "Tempo animazione [ms]"
#: 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/gtk4/prefs.ui:166 resources/ui/gtk4/prefs.ui:200
#: 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/Incinerate.ui:75
#: resources/ui/gtk3/Incinerate.ui:124 resources/ui/gtk3/Incinerate.ui:173
#: resources/ui/gtk3/Incinerate.ui:216 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/prefs.ui:263 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/SnapOfDisintegration.ui:70
#: resources/ui/gtk4/Incinerate.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
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Incinerate.ui:98
#: 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"
@@ -248,11 +258,16 @@ 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/SnapOfDisintegration.ui:116
#: resources/ui/gtk4/Incinerate.ui:116 resources/ui/gtk3/Incinerate.ui:147
msgid "Turbulence"
msgstr "Turbolenza"
#: resources/ui/gtk4/Incinerate.ui:162 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
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Incinerate.ui:195
#: 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"
@@ -298,23 +313,23 @@ msgstr "Anteprima di questo effetto"
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
msgid "Mesh Line Width"
msgstr ""
msgstr "Larghezza linea mesh"
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
msgid "Line Color"
msgstr ""
msgstr "Colore della linea"
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
msgid "Glow Color"
msgstr ""
msgstr "Colore bagliore"
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
msgid "Additive Blending"
msgstr ""
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 ""
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!"
@@ -346,17 +361,21 @@ msgstr "Animazione alla chiusura della finestra"
msgid "Also Add Effects to Dialogs"
msgstr "Aggiungi anche effetti ai dialoghi"
#: resources/ui/gtk4/prefs.ui:184 resources/ui/gtk3/prefs.ui:242
msgid "Disable on Battery Power"
msgstr "Disattiva con alimentazione a batteria"
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
msgid "Twirl Intensity"
msgstr ""
msgstr "Intensità di rotazione"
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
msgid "Shake Intensity"
msgstr ""
msgstr "Intensità di scuotimento"
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
msgid "Suction Intensity"
msgstr ""
msgstr "Intensità di aspirazione"
#: resources/ui/gtk3/Fire.ui:63
msgid "Choose a Preset"
+380
View File
@@ -0,0 +1,380 @@
# 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-06-25 05:04+0200\n"
"PO-Revision-Date: 2022-05-23 08:18+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:114
msgid "Effect Options"
msgstr "효과 옵션"
#: prefs.js:142
msgid "Go Back"
msgstr "뒤로 가기"
#: prefs.js:184
msgid "General Options"
msgstr "일반 옵션"
#: prefs.js:278
msgid "Gold Sponsors"
msgstr "골드 스폰서"
#: prefs.js:281
msgid "Silver Sponsors"
msgstr "실버 스폰서"
#: prefs.js:284
msgid "Bronze Sponsors"
msgstr "브론즈 스폰서"
#: prefs.js:287
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:138
msgid "Broken Glass"
msgstr "유리 깨짐"
#: src/TVEffect.js:77
msgid "TV Effect"
msgstr "TV 효과"
#: src/TRexAttack.js:115
msgid "T-Rex Attack"
msgstr "티라노 공격"
#: src/SnapOfDisintegration.js:117
msgid "Snap of Disintegration"
msgstr "해체 영상"
#: src/Incinerate.js:87
msgid "Incinerate"
msgstr ""
#: src/Wisps.js:85
msgid "Wisps"
msgstr "도깨비불"
#: src/Fire.js:99
msgid "Fire"
msgstr "화염"
#: src/Fire.js:154
msgid "Default Fire"
msgstr "기본 화염"
#: src/Fire.js:164
msgid "Hell Fire"
msgstr "지옥 화염"
#: src/Fire.js:174
msgid "Dark and Smutty"
msgstr "어둡고 찝찝함"
#: src/Fire.js:184
msgid "Cold Breeze"
msgstr "냉랭한 바람"
#: src/Fire.js:194
msgid "Santa is Coming"
msgstr "산타의 방문"
#: src/Hexagon.js:97
msgid "Hexagon"
msgstr "육각형"
#: src/EnergizeA.js:79
msgid "Energize A"
msgstr "에너자이즈 A"
#: src/Apparition.js:80
msgid "Apparition"
msgstr "혼령"
#: src/EnergizeB.js:80
msgid "Energize B"
msgstr "에너자이즈 B"
#: src/Matrix.js:113
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/Incinerate.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/Incinerate.ui:49 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/Incinerate.ui:52
#: resources/ui/gtk4/Incinerate.ui:98 resources/ui/gtk4/Incinerate.ui:144
#: resources/ui/gtk4/Incinerate.ui:178 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/prefs.ui:200
#: 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/Incinerate.ui:75
#: resources/ui/gtk3/Incinerate.ui:124 resources/ui/gtk3/Incinerate.ui:173
#: resources/ui/gtk3/Incinerate.ui:216 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/prefs.ui:263 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/Incinerate.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/Incinerate.ui:98
#: 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/Incinerate.ui:116 resources/ui/gtk3/Incinerate.ui:147
msgid "Turbulence"
msgstr ""
#: resources/ui/gtk4/Incinerate.ui:162 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/Incinerate.ui:195
#: 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/prefs.ui:184 resources/ui/gtk3/prefs.ui:242
msgid "Disable on Battery Power"
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 "사전설정 선택"
+121 -100
View File
@@ -7,8 +7,8 @@ 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-01-29 12:30+0000\n"
"POT-Creation-Date: 2022-06-25 05:04+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"
@@ -17,125 +17,131 @@ 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:112
#: prefs.js:114
msgid "Effect Options"
msgstr ""
msgstr "Effektalternativer"
#: prefs.js:140
#: prefs.js:142
msgid "Go Back"
msgstr ""
msgstr "Gå tilbake"
#: prefs.js:182
#: prefs.js:184
msgid "General Options"
msgstr ""
msgstr "Generelle innstillinger"
#: prefs.js:276
#: prefs.js:278
msgid "Gold Sponsors"
msgstr ""
msgstr "Gullsponsorer"
#: prefs.js:279
#: prefs.js:281
msgid "Silver Sponsors"
msgstr ""
msgstr "Sølvsponsorer"
#: prefs.js:282
#: prefs.js:284
msgid "Bronze Sponsors"
msgstr ""
msgstr "Bronsesponsorer"
#: prefs.js:285
#: prefs.js:287
msgid "Past Sponsors"
msgstr ""
msgstr "Tidligere sponsorer"
#. Translators: %s will be replaced by the effect's name.
#: prefs.js:510
#, javascript-format
msgid "Preview for %s"
msgstr ""
msgstr "Forhåndsvisning for %s"
#: 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
#: src/BrokenGlass.js:138
#, fuzzy
msgid "Broken Glass"
msgstr ""
msgstr "Knust glass"
#: src/TVEffect.js:56
#: src/TVEffect.js:77
msgid "TV Effect"
msgstr ""
msgstr "TV-effekt"
#: src/TRexAttack.js:56
#: src/TRexAttack.js:115
msgid "T-Rex Attack"
msgstr ""
msgstr "T-rex-angrep"
#: src/SnapOfDisintegration.js:60
#: src/SnapOfDisintegration.js:117
msgid "Snap of Disintegration"
msgstr ""
#: src/Wisps.js:55
#: src/Incinerate.js:87
msgid "Incinerate"
msgstr ""
#: src/Wisps.js:85
msgid "Wisps"
msgstr ""
#: src/Fire.js:58
#: src/Fire.js:99
msgid "Fire"
msgstr ""
msgstr "Brann"
#: src/Fire.js:130
#: src/Fire.js:154
msgid "Default Fire"
msgstr ""
msgstr "Forvalgt brann"
#: src/Fire.js:140
#: src/Fire.js:164
msgid "Hell Fire"
msgstr ""
#: src/Fire.js:150
#: src/Fire.js:174
msgid "Dark and Smutty"
msgstr ""
#: src/Fire.js:160
#: src/Fire.js:184
msgid "Cold Breeze"
msgstr ""
msgstr "Kald bris"
#: src/Fire.js:170
#: src/Fire.js:194
msgid "Santa is Coming"
msgstr ""
msgstr "Julenissen kommer"
#: src/Hexagon.js:53
#: src/Hexagon.js:97
msgid "Hexagon"
msgstr ""
msgstr "Heksagon"
#: src/EnergizeA.js:54
#: src/EnergizeA.js:79
msgid "Energize A"
msgstr ""
#: src/Apparition.js:57
#: src/Apparition.js:80
msgid "Apparition"
msgstr ""
#: src/EnergizeB.js:54
#: src/EnergizeB.js:80
msgid "Energize B"
msgstr ""
#: src/Matrix.js:58
#: src/Matrix.js:113
msgid "Matrix"
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"
@@ -147,18 +153,18 @@ msgstr "Doner"
#: 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/Incinerate.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
#: resources/ui/gtk3/Incinerate.ui:49 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 "Animasjonstid [ms]"
@@ -167,7 +173,9 @@ msgstr "Animasjonstid [ms]"
#: 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/BrokenGlass.ui:244 resources/ui/gtk4/Incinerate.ui:52
#: resources/ui/gtk4/Incinerate.ui:98 resources/ui/gtk4/Incinerate.ui:144
#: resources/ui/gtk4/Incinerate.ui:178 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
@@ -181,40 +189,44 @@ msgstr "Animasjonstid [ms]"
#: 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/gtk4/prefs.ui:166 resources/ui/gtk4/prefs.ui:200
#: 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/Incinerate.ui:75
#: resources/ui/gtk3/Incinerate.ui:124 resources/ui/gtk3/Incinerate.ui:173
#: resources/ui/gtk3/Incinerate.ui:216 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/prefs.ui:263 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/SnapOfDisintegration.ui:70
#: resources/ui/gtk4/Incinerate.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
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Incinerate.ui:98
#: 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/Apparition.ui:70
#: resources/ui/gtk3/Apparition.ui:112
msgid "Randomness"
msgstr ""
msgstr "Tilfeldighet"
#: resources/ui/gtk4/Matrix.ui:162
msgid "Vertical Overshooting"
@@ -230,45 +242,50 @@ 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 "Skårene flyr fra der musepekeren var da du lukket vinduet."
#: resources/ui/gtk4/Incinerate.ui:116 resources/ui/gtk3/Incinerate.ui:147
msgid "Turbulence"
msgstr ""
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/SnapOfDisintegration.ui:116
#: resources/ui/gtk4/Incinerate.ui:162 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
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Incinerate.ui:195
#: 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"
@@ -292,7 +309,7 @@ msgstr ""
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
msgid "Preview this Effect"
msgstr ""
msgstr "Forhåndsvis denne effekten"
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
msgid "Mesh Line Width"
@@ -300,11 +317,11 @@ msgstr ""
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
msgid "Line Color"
msgstr ""
msgstr "Linjefarge"
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
msgid "Glow Color"
msgstr ""
msgstr "Glødefarge"
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
msgid "Additive Blending"
@@ -320,7 +337,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"
@@ -329,12 +346,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"
@@ -344,21 +361,25 @@ msgstr ""
msgid "Also Add Effects to Dialogs"
msgstr ""
#: resources/ui/gtk4/prefs.ui:184 resources/ui/gtk3/prefs.ui:242
msgid "Disable on Battery Power"
msgstr ""
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
msgid "Twirl Intensity"
msgstr ""
msgstr "Hvirvelintensitet"
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
msgid "Shake Intensity"
msgstr ""
msgstr "Ristingsintensitet"
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
msgid "Suction Intensity"
msgstr ""
msgstr "Sugeintensitet"
#: resources/ui/gtk3/Fire.ui:63
msgid "Choose a Preset"
msgstr ""
msgstr "Velg en forhåndsinnstilling"
#~ msgid "Via PayPal"
#~ msgstr "med PayPal"
+76 -57
View File
@@ -7,8 +7,8 @@ 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-05 18:37+0000\n"
"POT-Creation-Date: 2022-06-25 05:04+0200\n"
"PO-Revision-Date: 2022-06-27 13:20+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,33 +17,33 @@ 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.13.1-dev\n"
#: prefs.js:112
#: prefs.js:114
msgid "Effect Options"
msgstr "Effectvoorkeuren"
#: prefs.js:140
#: prefs.js:142
msgid "Go Back"
msgstr "Scherm sluiten"
#: prefs.js:182
#: prefs.js:184
msgid "General Options"
msgstr "Algemene voorkeuren"
#: prefs.js:276
#: prefs.js:278
msgid "Gold Sponsors"
msgstr "Gouden sponsoren"
#: prefs.js:279
#: prefs.js:281
msgid "Silver Sponsors"
msgstr "Zilveren sponsoren"
#: prefs.js:282
#: prefs.js:284
msgid "Bronze Sponsors"
msgstr "Bronzen sponsoren"
#: prefs.js:285
#: prefs.js:287
msgid "Past Sponsors"
msgstr "Voormalige sponsoren"
@@ -57,67 +57,71 @@ msgstr "%s-voorvertoning"
msgid "Close this Window to Preview the Effect!"
msgstr "Sluit dit venster om het effect voor te vertonen."
#: src/BrokenGlass.js:57
#: src/BrokenGlass.js:138
msgid "Broken Glass"
msgstr "Gebroken glas"
#: src/TVEffect.js:56
#: src/TVEffect.js:77
msgid "TV Effect"
msgstr "Tv-effect"
#: src/TRexAttack.js:56
#: src/TRexAttack.js:115
msgid "T-Rex Attack"
msgstr "T-Rex-aanval"
#: src/SnapOfDisintegration.js:60
#: src/SnapOfDisintegration.js:117
msgid "Snap of Disintegration"
msgstr "Uiteenvallen"
#: src/Wisps.js:55
#: src/Incinerate.js:87
msgid "Incinerate"
msgstr "Verbranden"
#: src/Wisps.js:85
msgid "Wisps"
msgstr "Dwaallicht"
#: src/Fire.js:58
#: src/Fire.js:99
msgid "Fire"
msgstr "Vuur"
#: src/Fire.js:130
#: src/Fire.js:154
msgid "Default Fire"
msgstr "Normaal vuur"
#: src/Fire.js:140
#: src/Fire.js:164
msgid "Hell Fire"
msgstr "Hellevuur"
#: src/Fire.js:150
#: src/Fire.js:174
msgid "Dark and Smutty"
msgstr "Donker en zwart"
#: src/Fire.js:160
#: src/Fire.js:184
msgid "Cold Breeze"
msgstr "Koude wind"
#: src/Fire.js:170
#: src/Fire.js:194
msgid "Santa is Coming"
msgstr "Kerstmanvuur"
#: src/Hexagon.js:53
#: src/Hexagon.js:97
msgid "Hexagon"
msgstr "Hexagon"
#: src/EnergizeA.js:54
#: src/EnergizeA.js:79
msgid "Energize A"
msgstr "Stimulatie A"
#: src/Apparition.js:57
#: src/Apparition.js:80
msgid "Apparition"
msgstr "Verschijning"
#: src/EnergizeB.js:54
#: src/EnergizeB.js:80
msgid "Energize B"
msgstr "Stimulatie B"
#: src/Matrix.js:58
#: src/Matrix.js:113
msgid "Matrix"
msgstr "Matrix"
@@ -150,15 +154,15 @@ 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/Incinerate.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
#: resources/ui/gtk3/Incinerate.ui:49 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 "Animatieduur [in ms]"
@@ -167,7 +171,9 @@ msgstr "Animatieduur [in ms]"
#: 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/BrokenGlass.ui:244 resources/ui/gtk4/Incinerate.ui:52
#: resources/ui/gtk4/Incinerate.ui:98 resources/ui/gtk4/Incinerate.ui:144
#: resources/ui/gtk4/Incinerate.ui:178 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
@@ -181,33 +187,37 @@ msgstr "Animatieduur [in ms]"
#: 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/gtk4/prefs.ui:166 resources/ui/gtk4/prefs.ui:200
#: 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/Incinerate.ui:75
#: resources/ui/gtk3/Incinerate.ui:124 resources/ui/gtk3/Incinerate.ui:173
#: resources/ui/gtk3/Incinerate.ui:216 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/prefs.ui:263 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/SnapOfDisintegration.ui:70
#: resources/ui/gtk4/Incinerate.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
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Incinerate.ui:98
#: 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"
@@ -247,11 +257,16 @@ msgid ""
msgstr ""
"De stukken vliegen weg vanaf de cursorpositie na het sluiten van een venster."
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/SnapOfDisintegration.ui:116
#: resources/ui/gtk4/Incinerate.ui:116 resources/ui/gtk3/Incinerate.ui:147
msgid "Turbulence"
msgstr "Turbulentie"
#: resources/ui/gtk4/Incinerate.ui:162 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
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Incinerate.ui:195
#: 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"
@@ -347,6 +362,10 @@ msgstr "Animatie bij sluiten van vensters"
msgid "Also Add Effects to Dialogs"
msgstr "Dialoogvensters ook voorzien van effecten"
#: resources/ui/gtk4/prefs.ui:184 resources/ui/gtk3/prefs.ui:242
msgid "Disable on Battery Power"
msgstr "Uitschakelen bij gebruik van accu"
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
msgid "Twirl Intensity"
msgstr "Wervelintensiteit"
+383
View File
@@ -0,0 +1,383 @@
# 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-06-25 05:04+0200\n"
"PO-Revision-Date: 2022-07-02 21:20+0000\n"
"Last-Translator: Paweł Rzońca <pwrzonca@gmail.com>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/burn-my-windows/"
"core/pl/>\n"
"Language: pl\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==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
"|| n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.13.1-dev\n"
#: prefs.js:114
msgid "Effect Options"
msgstr "Opcje Efektów"
#: prefs.js:142
msgid "Go Back"
msgstr "Wstecz"
#: prefs.js:184
msgid "General Options"
msgstr "Opcje Ogólne"
#: prefs.js:278
msgid "Gold Sponsors"
msgstr "Złoci Sponsorzy"
#: prefs.js:281
msgid "Silver Sponsors"
msgstr "Srebrni Sponsorzy"
#: prefs.js:284
msgid "Bronze Sponsors"
msgstr "Brązowi Sponsorzy"
#: prefs.js:287
msgid "Past Sponsors"
msgstr "Byli Sponsorzy"
#. Translators: %s will be replaced by the effect's name.
#: prefs.js:510
#, javascript-format
msgid "Preview for %s"
msgstr "Podgląd dla %s"
#: prefs.js:532
msgid "Close this Window to Preview the Effect!"
msgstr "Zamknij to Okno, aby zobaczyć Efekt!"
#: src/BrokenGlass.js:138
msgid "Broken Glass"
msgstr "Rozbicie Szkła"
#: src/TVEffect.js:77
msgid "TV Effect"
msgstr "Efekt TV"
#: src/TRexAttack.js:115
msgid "T-Rex Attack"
msgstr "Atak T-Rex-a"
#: src/SnapOfDisintegration.js:117
msgid "Snap of Disintegration"
msgstr "Pstryknięcie Dezintegracji"
#: src/Incinerate.js:87
msgid "Incinerate"
msgstr "Spopielenie"
#: src/Wisps.js:85
msgid "Wisps"
msgstr "Ogniki"
#: src/Fire.js:99
msgid "Fire"
msgstr "Ogień"
#: src/Fire.js:154
msgid "Default Fire"
msgstr "Domyślny Ogień"
#: src/Fire.js:164
msgid "Hell Fire"
msgstr "Ogień Piekielny"
#: src/Fire.js:174
msgid "Dark and Smutty"
msgstr "Ciemny i Brudny"
#: src/Fire.js:184
msgid "Cold Breeze"
msgstr "Zimna Bryza"
#: src/Fire.js:194
msgid "Santa is Coming"
msgstr "Nadchodzi Święty Mikołaj"
#: src/Hexagon.js:97
msgid "Hexagon"
msgstr "Sześciokąt"
#: src/EnergizeA.js:79
msgid "Energize A"
msgstr "Energetyzacja A"
#: src/Apparition.js:80
msgid "Apparition"
msgstr "Teleportacja"
#: src/EnergizeB.js:80
msgid "Energize B"
msgstr "Energetyzacja B"
#: src/Matrix.js:113
msgid "Matrix"
msgstr "Matrix"
#: resources/ui/common/main-menu.ui:6
msgid "Visit Homepage"
msgstr "Odwiedź Stronę Główną"
#: resources/ui/common/main-menu.ui:10
msgid "View Changelog"
msgstr "Pokaż Dziennik Zmian"
#: resources/ui/common/main-menu.ui:16
msgid "Report a Bug"
msgstr "Zgłoś Błąd"
#: resources/ui/common/main-menu.ui:20
msgid "Create an Effect"
msgstr "Stwórz Efekt"
#: resources/ui/common/main-menu.ui:24
msgid "Translate"
msgstr "Przetłumacz"
#: resources/ui/common/main-menu.ui:28
msgid "Donate"
msgstr "Wspomóż"
#: resources/ui/common/main-menu.ui:41
msgid "About Burn-My-Windows"
msgstr "Informacje o Burn-My-Windows"
#: resources/ui/gtk4/Matrix.ui:24 resources/ui/gtk4/BrokenGlass.ui:24
#: resources/ui/gtk4/Incinerate.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/Incinerate.ui:49 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 "Czas Animacji [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/Incinerate.ui:52
#: resources/ui/gtk4/Incinerate.ui:98 resources/ui/gtk4/Incinerate.ui:144
#: resources/ui/gtk4/Incinerate.ui:178 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/prefs.ui:200
#: 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/Incinerate.ui:75
#: resources/ui/gtk3/Incinerate.ui:124 resources/ui/gtk3/Incinerate.ui:173
#: resources/ui/gtk3/Incinerate.ui:216 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/prefs.ui:263 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 "Zresetuj do Domyślnej Wartości"
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
#: resources/ui/gtk4/Incinerate.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/Incinerate.ui:98
#: 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 "Losowość"
#: resources/ui/gtk4/Matrix.ui:162
msgid "Vertical Overshooting"
msgstr "Przestrzelenie Pionowe"
#: resources/ui/gtk4/Matrix.ui:208
msgid "Trail Color"
msgstr "Kolor Śladu"
#: resources/ui/gtk4/Matrix.ui:242
msgid "Tip Color"
msgstr "Kolor Końcówki"
#: resources/ui/gtk4/BrokenGlass.ui:116
msgid "Gravity"
msgstr "Grawitacja"
#: resources/ui/gtk4/BrokenGlass.ui:162
msgid "Blow Force"
msgstr "Siła Uderzenia"
#: resources/ui/gtk4/BrokenGlass.ui:212
msgid "Shatter From Pointer Location"
msgstr "Roztrzaskaj z Pozycji Kursora"
#: resources/ui/gtk4/BrokenGlass.ui:221
msgid ""
"The shards will fly away from where your mouse pointer was when closing the "
"window."
msgstr ""
"Odłamki odlecą z miejsca, w którym znajdował się wskaźnik myszy podczas "
"zamykania okna."
#: resources/ui/gtk4/Incinerate.ui:116 resources/ui/gtk3/Incinerate.ui:147
msgid "Turbulence"
msgstr "Turbulencja"
#: resources/ui/gtk4/Incinerate.ui:162 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/Incinerate.ui:195
#: 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 "Kolor"
#: resources/ui/gtk4/Fire.ui:25 resources/ui/gtk3/Fire.ui:49
msgid "Presets"
msgstr "Predefiniowane"
#: resources/ui/gtk4/Fire.ui:141 resources/ui/gtk3/Fire.ui:189
msgid "Speed"
msgstr "Szybkość"
#: resources/ui/gtk4/Fire.ui:191 resources/ui/gtk3/Fire.ui:241
msgid "3D Noise"
msgstr "Szum 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 "Tworzy bardziej dynamiczny ogień, ale wymaga większej mocy GPU."
#: resources/ui/gtk4/Fire.ui:240 resources/ui/gtk3/Fire.ui:300
msgid "Gradient"
msgstr "Gradient"
#: resources/ui/gtk4/TRexAttack.ui:70
msgid "Claw Scratch Scale"
msgstr "Skala Drapnięć Pazurów"
#: resources/ui/gtk4/TRexAttack.ui:116
msgid "Claw Scratch Count"
msgstr "Liczba Drapnięć Pazurów"
#: resources/ui/gtk4/TRexAttack.ui:162
msgid "Warp Effect"
msgstr "Efekt Wypaczenia"
#: resources/ui/gtk4/TRexAttack.ui:208
msgid "Flash Color"
msgstr "Kolor Błysku"
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
msgid "Preview this Effect"
msgstr "Podgląd Efektu"
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
msgid "Mesh Line Width"
msgstr "Szerokość Linii Siatki"
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
msgid "Line Color"
msgstr "Kolor Linii"
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
msgid "Glow Color"
msgstr "Kolor Poświaty"
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
msgid "Additive Blending"
msgstr "Mieszanie Addytywne"
#: resources/ui/gtk4/Hexagon.ui:243 resources/ui/gtk3/Hexagon.ui:294
msgid "You may want to enable this for dark window themes."
msgstr "Możesz chcieć to włączyć w przypadku ciemnych motywów okien."
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
msgid "Welcome to Burn-My-Windows!"
msgstr "Witaj w 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 "Jeśli podoba Ci się to rozszerzenie, poleć je znajomym :)"
#: resources/ui/gtk4/prefs.ui:66 resources/ui/gtk3/prefs.ui:74
msgid "Open Window Animation"
msgstr "Animacja Otwierania Okna"
#: 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 "Jeśli wybrano kilka, efekt jest wybierany losowo."
#: 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 "Wybierz Efekty"
#: resources/ui/gtk4/prefs.ui:110 resources/ui/gtk3/prefs.ui:138
msgid "Close Window Animation"
msgstr "Animacja Zamykania Okna"
#: resources/ui/gtk4/prefs.ui:150 resources/ui/gtk3/prefs.ui:198
msgid "Also Add Effects to Dialogs"
msgstr "Dodaj Efekty również do Okien Dialogowych"
#: resources/ui/gtk4/prefs.ui:184 resources/ui/gtk3/prefs.ui:242
msgid "Disable on Battery Power"
msgstr "Wyłącz na Zasilaniu Bateryjnym"
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
msgid "Twirl Intensity"
msgstr "Intensywność Wirowania"
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
msgid "Shake Intensity"
msgstr "Intensywność Wstrząsania"
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
msgid "Suction Intensity"
msgstr "Intensywność Ssania"
#: resources/ui/gtk3/Fire.ui:63
msgid "Choose a Preset"
msgstr "Wybierz Obecny"
+382
View File
@@ -0,0 +1,382 @@
# 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-06-25 05:04+0200\n"
"PO-Revision-Date: 2022-07-01 21:16+0000\n"
"Last-Translator: dyegoaurelio <dyegoaurelio@gmail.com>\n"
"Language-Team: Portuguese <https://hosted.weblate.org/projects/"
"burn-my-windows/core/pt/>\n"
"Language: pt\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.13.1-dev\n"
#: prefs.js:114
msgid "Effect Options"
msgstr "Opções de Efeito"
#: prefs.js:142
msgid "Go Back"
msgstr "Voltar"
#: prefs.js:184
msgid "General Options"
msgstr "Opções Gerais"
#: prefs.js:278
msgid "Gold Sponsors"
msgstr "Patrocinadores Ouro"
#: prefs.js:281
msgid "Silver Sponsors"
msgstr "Patrocinadores Prata"
#: prefs.js:284
msgid "Bronze Sponsors"
msgstr "Patrocinadores Bronze"
#: prefs.js:287
msgid "Past Sponsors"
msgstr "Antigos Patrocinadores"
#. Translators: %s will be replaced by the effect's name.
#: prefs.js:510
#, javascript-format
msgid "Preview for %s"
msgstr "Pré-visualização de %s"
#: prefs.js:532
msgid "Close this Window to Preview the Effect!"
msgstr "Feche essa Janela para Pré-visualizar o Efeito!"
#: src/BrokenGlass.js:138
msgid "Broken Glass"
msgstr "Vidro Quebrado"
#: src/TVEffect.js:77
msgid "TV Effect"
msgstr "Efeito de TV"
#: src/TRexAttack.js:115
msgid "T-Rex Attack"
msgstr "Ataque de T-Rex"
#: src/SnapOfDisintegration.js:117
msgid "Snap of Disintegration"
msgstr "O Estalo da Desintegração"
#: src/Incinerate.js:87
msgid "Incinerate"
msgstr "Incinerar"
#: src/Wisps.js:85
msgid "Wisps"
msgstr "Faíscas"
#: src/Fire.js:99
msgid "Fire"
msgstr "Fogo"
#: src/Fire.js:154
msgid "Default Fire"
msgstr "Fogo Padrão"
#: src/Fire.js:164
msgid "Hell Fire"
msgstr "Fogo Infernal"
#: src/Fire.js:174
msgid "Dark and Smutty"
msgstr "Sombrio e Sujo"
#: src/Fire.js:184
msgid "Cold Breeze"
msgstr "Brisa Gelada"
#: src/Fire.js:194
msgid "Santa is Coming"
msgstr "Papai Noel está Vindo"
#: src/Hexagon.js:97
msgid "Hexagon"
msgstr "Hexágono"
#: src/EnergizeA.js:79
msgid "Energize A"
msgstr "Energizar A"
#: src/Apparition.js:80
msgid "Apparition"
msgstr "Aparição"
#: src/EnergizeB.js:80
msgid "Energize B"
msgstr "Energizar B"
#: src/Matrix.js:113
msgid "Matrix"
msgstr "Matrix"
#: resources/ui/common/main-menu.ui:6
msgid "Visit Homepage"
msgstr "Visite o Site"
#: resources/ui/common/main-menu.ui:10
msgid "View Changelog"
msgstr "Veja as Mudanças"
#: resources/ui/common/main-menu.ui:16
msgid "Report a Bug"
msgstr "Reporte um Erro"
#: resources/ui/common/main-menu.ui:20
msgid "Create an Effect"
msgstr "Crie um Efeito"
#: resources/ui/common/main-menu.ui:24
msgid "Translate"
msgstr "Traduza"
#: resources/ui/common/main-menu.ui:28
msgid "Donate"
msgstr "Doê"
#: resources/ui/common/main-menu.ui:41
msgid "About Burn-My-Windows"
msgstr "Sobre o Burn-My-Windows"
#: resources/ui/gtk4/Matrix.ui:24 resources/ui/gtk4/BrokenGlass.ui:24
#: resources/ui/gtk4/Incinerate.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/Incinerate.ui:49 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 "Tempo de Animação [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/Incinerate.ui:52
#: resources/ui/gtk4/Incinerate.ui:98 resources/ui/gtk4/Incinerate.ui:144
#: resources/ui/gtk4/Incinerate.ui:178 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/prefs.ui:200
#: 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/Incinerate.ui:75
#: resources/ui/gtk3/Incinerate.ui:124 resources/ui/gtk3/Incinerate.ui:173
#: resources/ui/gtk3/Incinerate.ui:216 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/prefs.ui:263 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 "Restaurar ao Padrão"
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
#: resources/ui/gtk4/Incinerate.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/Incinerate.ui:98
#: 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/Apparition.ui:70
#: resources/ui/gtk3/Apparition.ui:112
msgid "Randomness"
msgstr "Aleatoriedade"
#: resources/ui/gtk4/Matrix.ui:162
msgid "Vertical Overshooting"
msgstr "Excedente Vertical"
#: resources/ui/gtk4/Matrix.ui:208
msgid "Trail Color"
msgstr "Cor do Rastro"
#: resources/ui/gtk4/Matrix.ui:242
msgid "Tip Color"
msgstr "Cor da Ponta"
#: resources/ui/gtk4/BrokenGlass.ui:116
msgid "Gravity"
msgstr "Gravidade"
#: resources/ui/gtk4/BrokenGlass.ui:162
msgid "Blow Force"
msgstr "Força da Explosão"
#: resources/ui/gtk4/BrokenGlass.ui:212
msgid "Shatter From Pointer Location"
msgstr "Estilhaçar a partir da Localização do Ponteiro"
#: resources/ui/gtk4/BrokenGlass.ui:221
msgid ""
"The shards will fly away from where your mouse pointer was when closing the "
"window."
msgstr ""
"O estilhaços vão voar para longe de onde o ponteiro do mouse estava quando a "
"janela foi fechada."
#: resources/ui/gtk4/Incinerate.ui:116 resources/ui/gtk3/Incinerate.ui:147
msgid "Turbulence"
msgstr "Turbulência"
#: resources/ui/gtk4/Incinerate.ui:162 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/Incinerate.ui:195
#: 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 "Cor"
#: resources/ui/gtk4/Fire.ui:25 resources/ui/gtk3/Fire.ui:49
msgid "Presets"
msgstr "Predefinições"
#: resources/ui/gtk4/Fire.ui:141 resources/ui/gtk3/Fire.ui:189
msgid "Speed"
msgstr "Velocidade"
#: resources/ui/gtk4/Fire.ui:191 resources/ui/gtk3/Fire.ui:241
msgid "3D Noise"
msgstr "Efeito 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 "Cria um fogo mais dinâmico, mas requer mais poder da Placa de Vídeo."
#: resources/ui/gtk4/Fire.ui:240 resources/ui/gtk3/Fire.ui:300
msgid "Gradient"
msgstr "Gradiente"
#: resources/ui/gtk4/TRexAttack.ui:70
msgid "Claw Scratch Scale"
msgstr "Escala dos Rasgos das Garras"
#: resources/ui/gtk4/TRexAttack.ui:116
msgid "Claw Scratch Count"
msgstr "Quantidade de Rasgos das Garras"
#: resources/ui/gtk4/TRexAttack.ui:162
msgid "Warp Effect"
msgstr "Efeito de Distorção"
#: resources/ui/gtk4/TRexAttack.ui:208
msgid "Flash Color"
msgstr "Cor do Brilho da Garra"
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
msgid "Preview this Effect"
msgstr "Pré-visualize esse Efeito"
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
msgid "Mesh Line Width"
msgstr "Largura das Linhas da Malha"
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
msgid "Line Color"
msgstr "Cor das Linhas"
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
msgid "Glow Color"
msgstr "Cor do Brilho"
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
msgid "Additive Blending"
msgstr "Fusão Aditiva"
#: resources/ui/gtk4/Hexagon.ui:243 resources/ui/gtk3/Hexagon.ui:294
msgid "You may want to enable this for dark window themes."
msgstr "Você talvez queira habilitar isso para janelas com temas escuros."
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
msgid "Welcome to Burn-My-Windows!"
msgstr "Bem-vindo 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 :)"
msgstr "Se você gostou dessa extensão, recomende ela para seus amigos :)"
#: resources/ui/gtk4/prefs.ui:66 resources/ui/gtk3/prefs.ui:74
msgid "Open Window Animation"
msgstr "Animação ao Abrir Janela"
#: 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 "Se mais de uma estiver selecionada, uma aleatória será escolhida."
#: 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 "Efeitos Escolhidos"
#: resources/ui/gtk4/prefs.ui:110 resources/ui/gtk3/prefs.ui:138
msgid "Close Window Animation"
msgstr "Animação ao Fechar Janela"
#: resources/ui/gtk4/prefs.ui:150 resources/ui/gtk3/prefs.ui:198
msgid "Also Add Effects to Dialogs"
msgstr "Adicionar Efeitos aos Diálogos Também"
#: resources/ui/gtk4/prefs.ui:184 resources/ui/gtk3/prefs.ui:242
msgid "Disable on Battery Power"
msgstr "Desabilitar ao Usar a Bateria"
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
msgid "Twirl Intensity"
msgstr "Intensidade da Rotação"
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
msgid "Shake Intensity"
msgstr "Intensidade do Balanço"
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
msgid "Suction Intensity"
msgstr "Intensidade da Sucção"
#: resources/ui/gtk3/Fire.ui:63
msgid "Choose a Preset"
msgstr "Escolha uma Predefinição"
+88 -69
View File
@@ -7,9 +7,9 @@ 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-03-31 11:07+0000\n"
"Last-Translator: Егор Ермаков <eg.ermakov2016@gmail.com>\n"
"POT-Creation-Date: 2022-06-25 05:04+0200\n"
"PO-Revision-Date: 2022-07-09 05:03+0000\n"
"Last-Translator: Егор Ермаков <eg.ermakov2016@yandex.ru>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/burn-my-windows/"
"core/ru/>\n"
"Language: ru\n"
@@ -18,33 +18,33 @@ msgstr ""
"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"
"X-Generator: Weblate 4.13.1-dev\n"
#: prefs.js:112
#: prefs.js:114
msgid "Effect Options"
msgstr "Параметры эффекта"
#: prefs.js:140
#: prefs.js:142
msgid "Go Back"
msgstr "Назад"
#: prefs.js:182
#: prefs.js:184
msgid "General Options"
msgstr "Общие настройки"
#: prefs.js:276
#: prefs.js:278
msgid "Gold Sponsors"
msgstr "Золотые спонсоры"
#: prefs.js:279
#: prefs.js:281
msgid "Silver Sponsors"
msgstr "Серебряные спонсоры"
#: prefs.js:282
#: prefs.js:284
msgid "Bronze Sponsors"
msgstr "Бронзовые спонсоры"
#: prefs.js:285
#: prefs.js:287
msgid "Past Sponsors"
msgstr "Прошлые спонсоры"
@@ -58,67 +58,71 @@ msgstr "Предпросмотр %s"
msgid "Close this Window to Preview the Effect!"
msgstr "Закройте это окно для предпросмотра эффекта!"
#: src/BrokenGlass.js:57
#: src/BrokenGlass.js:138
msgid "Broken Glass"
msgstr "Разбитое стекло"
#: src/TVEffect.js:56
#: src/TVEffect.js:77
msgid "TV Effect"
msgstr "Эффект ЭЛТ"
#: src/TRexAttack.js:56
#: src/TRexAttack.js:115
msgid "T-Rex Attack"
msgstr "Атака тираннозавра"
#: src/SnapOfDisintegration.js:60
#: src/SnapOfDisintegration.js:117
msgid "Snap of Disintegration"
msgstr ""
msgstr "Щелчок распада"
#: src/Wisps.js:55
#: src/Incinerate.js:87
msgid "Incinerate"
msgstr "Сжигание"
#: src/Wisps.js:85
msgid "Wisps"
msgstr "Огоньки"
#: src/Fire.js:58
#: src/Fire.js:99
msgid "Fire"
msgstr "Огонь"
#: src/Fire.js:130
#: src/Fire.js:154
msgid "Default Fire"
msgstr "Обычный огонь"
#: src/Fire.js:140
#: src/Fire.js:164
msgid "Hell Fire"
msgstr "Адское пламя"
#: src/Fire.js:150
#: src/Fire.js:174
msgid "Dark and Smutty"
msgstr "Тёмный и грязный"
#: src/Fire.js:160
#: src/Fire.js:184
msgid "Cold Breeze"
msgstr "Холодный бриз"
#: src/Fire.js:170
#: src/Fire.js:194
msgid "Santa is Coming"
msgstr "Дед Мороз идёт"
#: src/Hexagon.js:53
#: src/Hexagon.js:97
msgid "Hexagon"
msgstr ""
msgstr "Гексагон"
#: src/EnergizeA.js:54
#: src/EnergizeA.js:79
msgid "Energize A"
msgstr "Энергия A"
#: src/Apparition.js:57
#: src/Apparition.js:80
msgid "Apparition"
msgstr ""
msgstr "Привидение"
#: src/EnergizeB.js:54
#: src/EnergizeB.js:80
msgid "Energize B"
msgstr "Энергия B"
#: src/Matrix.js:58
#: src/Matrix.js:113
msgid "Matrix"
msgstr "Матрица"
@@ -151,15 +155,15 @@ 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/Incinerate.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
#: resources/ui/gtk3/Incinerate.ui:49 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 "Время анимации (мс)"
@@ -168,7 +172,9 @@ msgstr "Время анимации (мс)"
#: 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/BrokenGlass.ui:244 resources/ui/gtk4/Incinerate.ui:52
#: resources/ui/gtk4/Incinerate.ui:98 resources/ui/gtk4/Incinerate.ui:144
#: resources/ui/gtk4/Incinerate.ui:178 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
@@ -182,33 +188,37 @@ msgstr "Время анимации (мс)"
#: 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/gtk4/prefs.ui:166 resources/ui/gtk4/prefs.ui:200
#: 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/Incinerate.ui:75
#: resources/ui/gtk3/Incinerate.ui:124 resources/ui/gtk3/Incinerate.ui:173
#: resources/ui/gtk3/Incinerate.ui:216 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/prefs.ui:263 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/Incinerate.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
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Incinerate.ui:98
#: 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 "Масштаб"
@@ -249,11 +259,16 @@ msgstr ""
"Осколки разлетятся в стороны от того места, где находился курсор мыши при "
"закрытии окна."
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/SnapOfDisintegration.ui:116
#: resources/ui/gtk4/Incinerate.ui:116 resources/ui/gtk3/Incinerate.ui:147
msgid "Turbulence"
msgstr "Турбулентность"
#: resources/ui/gtk4/Incinerate.ui:162 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
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Incinerate.ui:195
#: 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 "Цвет"
@@ -299,23 +314,23 @@ msgstr "Предпросмотр этого эффекта"
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
msgid "Mesh Line Width"
msgstr ""
msgstr "Ширина линии сетки"
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
msgid "Line Color"
msgstr ""
msgstr "Цвет линии"
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
msgid "Glow Color"
msgstr ""
msgstr "Цвет свечения"
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
msgid "Additive Blending"
msgstr ""
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 ""
msgstr "Возможно, вы захотите включить это для тёмной темы."
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
msgid "Welcome to Burn-My-Windows!"
@@ -347,17 +362,21 @@ msgstr "Анимация закрытия окна"
msgid "Also Add Effects to Dialogs"
msgstr "Также добавить эффекты к диалогам"
#: resources/ui/gtk4/prefs.ui:184 resources/ui/gtk3/prefs.ui:242
msgid "Disable on Battery Power"
msgstr "Отключать при питании от батареи"
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
msgid "Twirl Intensity"
msgstr ""
msgstr "Интенсивность вращения"
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
msgid "Shake Intensity"
msgstr ""
msgstr "Интенсивность встряски"
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
msgid "Suction Intensity"
msgstr ""
msgstr "Интенсивность всасывания"
#: resources/ui/gtk3/Fire.ui:63
msgid "Choose a Preset"
+380
View File
@@ -0,0 +1,380 @@
# 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-06-25 05:04+0200\n"
"PO-Revision-Date: 2022-07-17 19:20+0000\n"
"Last-Translator: Jose Riha <jose1711@gmail.com>\n"
"Language-Team: Slovak <https://hosted.weblate.org/projects/burn-my-windows/"
"core/sk/>\n"
"Language: sk\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==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Weblate 4.14-dev\n"
#: prefs.js:114
msgid "Effect Options"
msgstr "Možnosti efektov"
#: prefs.js:142
msgid "Go Back"
msgstr "Prejsť naspäť"
#: prefs.js:184
msgid "General Options"
msgstr "Všeobecné možnosti"
#: prefs.js:278
msgid "Gold Sponsors"
msgstr "Zlatí sponzori"
#: prefs.js:281
msgid "Silver Sponsors"
msgstr "Strieborní sponzori"
#: prefs.js:284
msgid "Bronze Sponsors"
msgstr "Bronzoví sponzori"
#: prefs.js:287
msgid "Past Sponsors"
msgstr "Bývalí sponzori"
#. Translators: %s will be replaced by the effect's name.
#: prefs.js:510
#, javascript-format
msgid "Preview for %s"
msgstr "Náhľad %s"
#: prefs.js:532
msgid "Close this Window to Preview the Effect!"
msgstr "Zatvorte toto okno, ak chcete vidieť efekt!"
#: src/BrokenGlass.js:138
msgid "Broken Glass"
msgstr "Črepiny"
#: src/TVEffect.js:77
msgid "TV Effect"
msgstr "Televízor"
#: src/TRexAttack.js:115
msgid "T-Rex Attack"
msgstr "Tyrannosaurus"
#: src/SnapOfDisintegration.js:117
msgid "Snap of Disintegration"
msgstr "Thanosove lusknutie"
#: src/Incinerate.js:87
msgid "Incinerate"
msgstr "Spálenie"
#: src/Wisps.js:85
msgid "Wisps"
msgstr "Obláčiky"
#: src/Fire.js:99
msgid "Fire"
msgstr "Oheň"
#: src/Fire.js:154
msgid "Default Fire"
msgstr "Predvolený oheň"
#: src/Fire.js:164
msgid "Hell Fire"
msgstr "Pekelný oheň"
#: src/Fire.js:174
msgid "Dark and Smutty"
msgstr "Tmavý a zafúľaný"
#: src/Fire.js:184
msgid "Cold Breeze"
msgstr "Studený vánok"
#: src/Fire.js:194
msgid "Santa is Coming"
msgstr "Santa prichádza"
#: src/Hexagon.js:97
msgid "Hexagon"
msgstr "Šesťhran"
#: src/EnergizeA.js:79
msgid "Energize A"
msgstr "Nabudenie A"
#: src/Apparition.js:80
msgid "Apparition"
msgstr "Prízrak"
#: src/EnergizeB.js:80
msgid "Energize B"
msgstr "Nabudenie B"
#: src/Matrix.js:113
msgid "Matrix"
msgstr "Matrix"
#: resources/ui/common/main-menu.ui:6
msgid "Visit Homepage"
msgstr "Navštíviť webovú stránku"
#: resources/ui/common/main-menu.ui:10
msgid "View Changelog"
msgstr "Zobraziť históriu zmien"
#: resources/ui/common/main-menu.ui:16
msgid "Report a Bug"
msgstr "Nahlásiť chybu"
#: resources/ui/common/main-menu.ui:20
msgid "Create an Effect"
msgstr "Vytvoriť efekt"
#: resources/ui/common/main-menu.ui:24
msgid "Translate"
msgstr "Preložiť"
#: resources/ui/common/main-menu.ui:28
msgid "Donate"
msgstr "Prispieť"
#: resources/ui/common/main-menu.ui:41
msgid "About Burn-My-Windows"
msgstr "O Burn-My-Windows"
#: resources/ui/gtk4/Matrix.ui:24 resources/ui/gtk4/BrokenGlass.ui:24
#: resources/ui/gtk4/Incinerate.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/Incinerate.ui:49 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 "Trvanie animácie [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/Incinerate.ui:52
#: resources/ui/gtk4/Incinerate.ui:98 resources/ui/gtk4/Incinerate.ui:144
#: resources/ui/gtk4/Incinerate.ui:178 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/prefs.ui:200
#: 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/Incinerate.ui:75
#: resources/ui/gtk3/Incinerate.ui:124 resources/ui/gtk3/Incinerate.ui:173
#: resources/ui/gtk3/Incinerate.ui:216 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/prefs.ui:263 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 "Obnoviť predvolené hodnoty"
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
#: resources/ui/gtk4/Incinerate.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/Incinerate.ui:98
#: 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 "Priblíženie"
#: resources/ui/gtk4/Matrix.ui:116 resources/ui/gtk4/Apparition.ui:70
#: resources/ui/gtk3/Apparition.ui:112
msgid "Randomness"
msgstr "Náhodnosť"
#: resources/ui/gtk4/Matrix.ui:162
msgid "Vertical Overshooting"
msgstr "Zvislé prestrelenie"
#: resources/ui/gtk4/Matrix.ui:208
msgid "Trail Color"
msgstr "Farba chvosta"
#: resources/ui/gtk4/Matrix.ui:242
msgid "Tip Color"
msgstr "Farba špicu"
#: resources/ui/gtk4/BrokenGlass.ui:116
msgid "Gravity"
msgstr "Gravitácia"
#: resources/ui/gtk4/BrokenGlass.ui:162
msgid "Blow Force"
msgstr "Sila úderu"
#: resources/ui/gtk4/BrokenGlass.ui:212
msgid "Shatter From Pointer Location"
msgstr "Roztrieštenie od polohy kurzora"
#: resources/ui/gtk4/BrokenGlass.ui:221
msgid ""
"The shards will fly away from where your mouse pointer was when closing the "
"window."
msgstr "Črepiny odletia z miesta, kde bol kurzor myši pri zatváraní okna."
#: resources/ui/gtk4/Incinerate.ui:116 resources/ui/gtk3/Incinerate.ui:147
msgid "Turbulence"
msgstr "Turbulencia"
#: resources/ui/gtk4/Incinerate.ui:162 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/Incinerate.ui:195
#: 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 "Farba"
#: resources/ui/gtk4/Fire.ui:25 resources/ui/gtk3/Fire.ui:49
msgid "Presets"
msgstr "Predvoľby"
#: resources/ui/gtk4/Fire.ui:141 resources/ui/gtk3/Fire.ui:189
msgid "Speed"
msgstr "Rýchlosť"
#: resources/ui/gtk4/Fire.ui:191 resources/ui/gtk3/Fire.ui:241
msgid "3D Noise"
msgstr "3D šum"
#: resources/ui/gtk4/Fire.ui:200 resources/ui/gtk3/Fire.ui:250
msgid "Creates a more dynamic fire but requires more GPU power."
msgstr "Vytvorí dynamickejší efekt ohňa, ale vyžaduje na to viac GPU."
#: resources/ui/gtk4/Fire.ui:240 resources/ui/gtk3/Fire.ui:300
msgid "Gradient"
msgstr "Prechod"
#: resources/ui/gtk4/TRexAttack.ui:70
msgid "Claw Scratch Scale"
msgstr "Veľkosť škrabancov od pazúrov"
#: resources/ui/gtk4/TRexAttack.ui:116
msgid "Claw Scratch Count"
msgstr "Počet škrabancov"
#: resources/ui/gtk4/TRexAttack.ui:162
msgid "Warp Effect"
msgstr "Efekt zakrivenia"
#: resources/ui/gtk4/TRexAttack.ui:208
msgid "Flash Color"
msgstr "Farba blesku"
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
msgid "Preview this Effect"
msgstr "Náhľad efektu"
#: resources/ui/gtk4/Hexagon.ui:116 resources/ui/gtk3/Hexagon.ui:147
msgid "Mesh Line Width"
msgstr "Šírka čiar v sieti"
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
msgid "Line Color"
msgstr "Farba čiar"
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
msgid "Glow Color"
msgstr "Farba žiary"
#: resources/ui/gtk4/Hexagon.ui:234 resources/ui/gtk3/Hexagon.ui:285
msgid "Additive Blending"
msgstr "Prídavné miešanie"
#: resources/ui/gtk4/Hexagon.ui:243 resources/ui/gtk3/Hexagon.ui:294
msgid "You may want to enable this for dark window themes."
msgstr "Možno túto voľbu budete chcieť zapnúť pri tmavých motívoch."
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
msgid "Welcome to Burn-My-Windows!"
msgstr "Víta Vás 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 "Ak sa vám toto rozšírenie páči, odporučte ho priateľom :-)"
#: resources/ui/gtk4/prefs.ui:66 resources/ui/gtk3/prefs.ui:74
msgid "Open Window Animation"
msgstr "Animácia pri otváraní okna"
#: 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 "Ak ich vyberiete viac, budú sa náhodne striedať."
#: 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 "Vyberte efekty"
#: resources/ui/gtk4/prefs.ui:110 resources/ui/gtk3/prefs.ui:138
msgid "Close Window Animation"
msgstr "Animácia pri zatváraní okna"
#: resources/ui/gtk4/prefs.ui:150 resources/ui/gtk3/prefs.ui:198
msgid "Also Add Effects to Dialogs"
msgstr "Použiť efekt aj na dialógové okná"
#: resources/ui/gtk4/prefs.ui:184 resources/ui/gtk3/prefs.ui:242
msgid "Disable on Battery Power"
msgstr "Vypnúť pri napájaní z batérie"
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
msgid "Twirl Intensity"
msgstr "Intenzita vírenia"
#: resources/ui/gtk4/Apparition.ui:162 resources/ui/gtk3/Apparition.ui:210
msgid "Shake Intensity"
msgstr "Intenzita otrasov"
#: resources/ui/gtk4/Apparition.ui:208 resources/ui/gtk3/Apparition.ui:259
msgid "Suction Intensity"
msgstr "Intenzita odsatia"
#: resources/ui/gtk3/Fire.ui:63
msgid "Choose a Preset"
msgstr "Vyberte predvoľbu"
+382
View File
@@ -0,0 +1,382 @@
# 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-06-25 05:04+0200\n"
"PO-Revision-Date: 2022-08-08 14:16+0000\n"
"Last-Translator: Kristoffer Grundström <swedishsailfishosuser@tutanota.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.14-dev\n"
#: prefs.js:114
msgid "Effect Options"
msgstr "Effektalternativ"
#: prefs.js:142
msgid "Go Back"
msgstr "Gå tillbaka"
#: prefs.js:184
msgid "General Options"
msgstr "Generella alternativ"
#: prefs.js:278
msgid "Gold Sponsors"
msgstr "Guldsponsorer"
#: prefs.js:281
msgid "Silver Sponsors"
msgstr "Silversponsorer"
#: prefs.js:284
msgid "Bronze Sponsors"
msgstr "Bronssponsorer"
#: prefs.js:287
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:138
msgid "Broken Glass"
msgstr "Trasigt glas"
#: src/TVEffect.js:77
msgid "TV Effect"
msgstr "TV-effekt"
#: src/TRexAttack.js:115
msgid "T-Rex Attack"
msgstr "T-Rexattack"
#: src/SnapOfDisintegration.js:117
msgid "Snap of Disintegration"
msgstr "Sönderfallsknäppning"
#: src/Incinerate.js:87
msgid "Incinerate"
msgstr "Bränna"
#: src/Wisps.js:85
msgid "Wisps"
msgstr "Feer"
#: src/Fire.js:99
msgid "Fire"
msgstr "Eld"
#: src/Fire.js:154
msgid "Default Fire"
msgstr "Standardeld"
#: src/Fire.js:164
msgid "Hell Fire"
msgstr "Helveteseld"
#: src/Fire.js:174
msgid "Dark and Smutty"
msgstr "Mörk och smutsig"
#: src/Fire.js:184
msgid "Cold Breeze"
msgstr "Kall bris"
#: src/Fire.js:194
msgid "Santa is Coming"
msgstr "Jultomten kommer"
#: src/Hexagon.js:97
msgid "Hexagon"
msgstr "Sexhörning"
#: src/EnergizeA.js:79
msgid "Energize A"
msgstr "Stråla A"
#: src/Apparition.js:80
msgid "Apparition"
msgstr "Uppenbarelse"
#: src/EnergizeB.js:80
msgid "Energize B"
msgstr "Stråla B"
#: src/Matrix.js:113
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/Incinerate.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/Incinerate.ui:49 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/Incinerate.ui:52
#: resources/ui/gtk4/Incinerate.ui:98 resources/ui/gtk4/Incinerate.ui:144
#: resources/ui/gtk4/Incinerate.ui:178 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/prefs.ui:200
#: 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/Incinerate.ui:75
#: resources/ui/gtk3/Incinerate.ui:124 resources/ui/gtk3/Incinerate.ui:173
#: resources/ui/gtk3/Incinerate.ui:216 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/prefs.ui:263 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/Incinerate.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/Incinerate.ui:98
#: 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 "Spränga från muspekarens plats"
#: 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/Incinerate.ui:116 resources/ui/gtk3/Incinerate.ui:147
msgid "Turbulence"
msgstr "Turbulens"
#: resources/ui/gtk4/Incinerate.ui:162 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/Incinerate.ui:195
#: 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 "Gradient"
#: resources/ui/gtk4/TRexAttack.ui:70
msgid "Claw Scratch Scale"
msgstr "Klo riva skala"
#: resources/ui/gtk4/TRexAttack.ui:116
msgid "Claw Scratch Count"
msgstr "Klo riva räknare"
#: resources/ui/gtk4/TRexAttack.ui:162
msgid "Warp Effect"
msgstr "Warp-effekt"
#: resources/ui/gtk4/TRexAttack.ui:208
msgid "Flash Color"
msgstr "Färg för bränningen"
#: 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 "Mesh linjebredd"
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
msgid "Line Color"
msgstr "Linje färg"
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
msgid "Glow Color"
msgstr "Glöd färg"
#: 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/prefs.ui:184 resources/ui/gtk3/prefs.ui:242
msgid "Disable on Battery Power"
msgstr "Inaktivera på batteriström"
#: 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"
+80 -61
View File
@@ -7,8 +7,8 @@ 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-03-21 05:57+0000\n"
"POT-Creation-Date: 2022-06-25 05:04+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,33 +17,33 @@ 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:112
#: prefs.js:114
msgid "Effect Options"
msgstr "Efekt Seçenekleri"
#: prefs.js:140
#: prefs.js:142
msgid "Go Back"
msgstr "Geri Dön"
#: prefs.js:182
#: prefs.js:184
msgid "General Options"
msgstr "Genel Ayarlar"
#: prefs.js:276
#: prefs.js:278
msgid "Gold Sponsors"
msgstr "Altın Sponsorlar"
#: prefs.js:279
#: prefs.js:281
msgid "Silver Sponsors"
msgstr "Gümüş Sponsorlar"
#: prefs.js:282
#: prefs.js:284
msgid "Bronze Sponsors"
msgstr "Bronz Sponsorlar"
#: prefs.js:285
#: prefs.js:287
msgid "Past Sponsors"
msgstr "Eski Sponsorlar"
@@ -57,67 +57,71 @@ msgstr "%s ön izleme"
msgid "Close this Window to Preview the Effect!"
msgstr "Efekti Ön izlemek İçin Bu Pencereyi Kapatın!"
#: src/BrokenGlass.js:57
#: src/BrokenGlass.js:138
msgid "Broken Glass"
msgstr "Kırılan Cam"
#: src/TVEffect.js:56
#: src/TVEffect.js:77
msgid "TV Effect"
msgstr "TV Efekti"
#: src/TRexAttack.js:56
#: src/TRexAttack.js:115
msgid "T-Rex Attack"
msgstr "T-Rex Saldırısı"
#: src/SnapOfDisintegration.js:60
#: src/SnapOfDisintegration.js:117
msgid "Snap of Disintegration"
msgstr ""
#: src/Wisps.js:55
#: src/Incinerate.js:87
msgid "Incinerate"
msgstr ""
#: src/Wisps.js:85
msgid "Wisps"
msgstr ""
#: src/Fire.js:58
#: src/Fire.js:99
msgid "Fire"
msgstr "Ateş"
#: src/Fire.js:130
#: src/Fire.js:154
msgid "Default Fire"
msgstr "Varsayılan Ateş"
#: src/Fire.js:140
#: src/Fire.js:164
msgid "Hell Fire"
msgstr "Cehennem Ateşi"
#: src/Fire.js:150
#: src/Fire.js:174
msgid "Dark and Smutty"
msgstr "Karanlık ve Sürmeli"
#: src/Fire.js:160
#: src/Fire.js:184
msgid "Cold Breeze"
msgstr "Soğuk Esinti"
#: src/Fire.js:170
#: src/Fire.js:194
msgid "Santa is Coming"
msgstr "Noel Baba Geliyor"
#: src/Hexagon.js:53
#: src/Hexagon.js:97
msgid "Hexagon"
msgstr ""
msgstr "Altıgen"
#: src/EnergizeA.js:54
#: src/EnergizeA.js:79
msgid "Energize A"
msgstr "Enerji A"
#: src/Apparition.js:57
#: src/Apparition.js:80
msgid "Apparition"
msgstr ""
#: src/EnergizeB.js:54
#: src/EnergizeB.js:80
msgid "Energize B"
msgstr "Enerji B"
#: src/Matrix.js:58
#: src/Matrix.js:113
msgid "Matrix"
msgstr "Matrix"
@@ -150,15 +154,15 @@ 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/Incinerate.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
#: resources/ui/gtk3/Incinerate.ui:49 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 "Animasyon Süresi [ms]"
@@ -167,7 +171,9 @@ msgstr "Animasyon Süresi [ms]"
#: 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/BrokenGlass.ui:244 resources/ui/gtk4/Incinerate.ui:52
#: resources/ui/gtk4/Incinerate.ui:98 resources/ui/gtk4/Incinerate.ui:144
#: resources/ui/gtk4/Incinerate.ui:178 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
@@ -181,33 +187,37 @@ msgstr "Animasyon Süresi [ms]"
#: 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/gtk4/prefs.ui:166 resources/ui/gtk4/prefs.ui:200
#: 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/Incinerate.ui:75
#: resources/ui/gtk3/Incinerate.ui:124 resources/ui/gtk3/Incinerate.ui:173
#: resources/ui/gtk3/Incinerate.ui:216 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/prefs.ui:263 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/SnapOfDisintegration.ui:70
#: resources/ui/gtk4/Incinerate.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
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Incinerate.ui:98
#: 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"
@@ -248,11 +258,16 @@ 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/SnapOfDisintegration.ui:116
#: resources/ui/gtk4/Incinerate.ui:116 resources/ui/gtk3/Incinerate.ui:147
msgid "Turbulence"
msgstr ""
#: resources/ui/gtk4/Incinerate.ui:162 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
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Incinerate.ui:195
#: 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"
@@ -286,7 +301,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"
@@ -302,7 +317,7 @@ msgstr ""
#: resources/ui/gtk4/Hexagon.ui:162 resources/ui/gtk3/Hexagon.ui:195
msgid "Line Color"
msgstr ""
msgstr "Çizgi rengi"
#: resources/ui/gtk4/Hexagon.ui:196 resources/ui/gtk3/Hexagon.ui:238
msgid "Glow Color"
@@ -314,7 +329,7 @@ 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 ""
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!"
@@ -346,6 +361,10 @@ msgstr "Pencere Animasyonunu Kapat"
msgid "Also Add Effects to Dialogs"
msgstr "Ayrıca Diyaloglara Efektler Ekle"
#: resources/ui/gtk4/prefs.ui:184 resources/ui/gtk3/prefs.ui:242
msgid "Disable on Battery Power"
msgstr ""
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
msgid "Twirl Intensity"
msgstr ""
+101 -98
View File
@@ -7,9 +7,9 @@ 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-03-01 15:05+0000\n"
"Last-Translator: 刘韬 <lyuutau@outlook.com>\n"
"POT-Creation-Date: 2022-06-25 05:04+0200\n"
"PO-Revision-Date: 2022-07-14 04:21+0000\n"
"Last-Translator: joe <ourmicroid@outlook.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"burn-my-windows/core/zh_Hans/>\n"
"Language: zh_Hans\n"
@@ -17,121 +17,112 @@ 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.14-dev\n"
#: prefs.js:112
#, fuzzy
#: prefs.js:114
msgid "Effect Options"
msgstr "效果选项"
msgstr "特殊效果选项"
#: prefs.js:140
#: prefs.js:142
msgid "Go Back"
msgstr ""
msgstr "返回"
#: prefs.js:182
#, fuzzy
#: prefs.js:184
msgid "General Options"
msgstr "一般选项"
msgstr "常规选项"
#: prefs.js:276
#, fuzzy
#: prefs.js:278
msgid "Gold Sponsors"
msgstr "金牌赞助商"
#: prefs.js:279
#, fuzzy
#: prefs.js:281
msgid "Silver Sponsors"
msgstr "银牌赞助商"
#: prefs.js:282
#, fuzzy
#: prefs.js:284
msgid "Bronze Sponsors"
msgstr "铜牌赞助商"
#: prefs.js:285
#, fuzzy
#: prefs.js:287
msgid "Past Sponsors"
msgstr "往届赞助商"
#. Translators: %s will be replaced by the effect's name.
#: prefs.js:510
#, fuzzy, javascript-format
#, javascript-format
msgid "Preview for %s"
msgstr "%s 的预览"
#: prefs.js:532
#, fuzzy
msgid "Close this Window to Preview the Effect!"
msgstr "关闭此窗口,预览效果!"
#: src/BrokenGlass.js:57
#, fuzzy
#: src/BrokenGlass.js:138
msgid "Broken Glass"
msgstr "破碎的玻璃"
#: src/TVEffect.js:56
#, fuzzy
#: src/TVEffect.js:77
msgid "TV Effect"
msgstr "电视效果"
#: src/TRexAttack.js:56
#, fuzzy
#: src/TRexAttack.js:115
msgid "T-Rex Attack"
msgstr "霸王龙攻击"
#: src/SnapOfDisintegration.js:60
#: src/SnapOfDisintegration.js:117
msgid "Snap of Disintegration"
msgstr "瓦解效果"
#: src/Incinerate.js:87
msgid "Incinerate"
msgstr ""
#: src/Wisps.js:55
#: src/Wisps.js:85
msgid "Wisps"
msgstr ""
#: src/Fire.js:58
#: src/Fire.js:99
msgid "Fire"
msgstr ""
msgstr "火烧效果"
#: src/Fire.js:130
#: src/Fire.js:154
msgid "Default Fire"
msgstr ""
msgstr "普通火烧效果"
#: src/Fire.js:140
#, fuzzy
#: src/Fire.js:164
msgid "Hell Fire"
msgstr "地狱之火"
#: src/Fire.js:150
#: src/Fire.js:174
#, fuzzy
msgid "Dark and Smutty"
msgstr "黑暗和污秽"
#: src/Fire.js:160
#, fuzzy
#: src/Fire.js:184
msgid "Cold Breeze"
msgstr "寒风"
#: src/Fire.js:170
#, fuzzy
#: src/Fire.js:194
msgid "Santa is Coming"
msgstr "圣诞老人来了"
#: src/Hexagon.js:53
#: src/Hexagon.js:97
msgid "Hexagon"
msgstr ""
msgstr "六边形"
#: src/EnergizeA.js:54
#: src/EnergizeA.js:79
msgid "Energize A"
msgstr ""
msgstr "瞬移效果A"
#: src/Apparition.js:57
#: src/Apparition.js:80
msgid "Apparition"
msgstr ""
#: src/EnergizeB.js:54
#: src/EnergizeB.js:80
msgid "Energize B"
msgstr ""
msgstr "瞬移效果B"
#: src/Matrix.js:58
#: src/Matrix.js:113
msgid "Matrix"
msgstr "矩阵"
@@ -148,7 +139,6 @@ msgid "Report a Bug"
msgstr "报告错误"
#: resources/ui/common/main-menu.ui:20
#, fuzzy
msgid "Create an Effect"
msgstr "创建效果"
@@ -165,16 +155,15 @@ 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/Incinerate.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
#, fuzzy
#: resources/ui/gtk3/Incinerate.ui:49 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 "动画时间 [毫秒]"
@@ -183,7 +172,9 @@ msgstr "动画时间 [毫秒]"
#: 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/BrokenGlass.ui:244 resources/ui/gtk4/Incinerate.ui:52
#: resources/ui/gtk4/Incinerate.ui:98 resources/ui/gtk4/Incinerate.ui:144
#: resources/ui/gtk4/Incinerate.ui:178 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
@@ -197,55 +188,55 @@ msgstr "动画时间 [毫秒]"
#: 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/gtk4/prefs.ui:166 resources/ui/gtk4/prefs.ui:200
#: 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/Incinerate.ui:75
#: resources/ui/gtk3/Incinerate.ui:124 resources/ui/gtk3/Incinerate.ui:173
#: resources/ui/gtk3/Incinerate.ui:216 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/prefs.ui:263 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/Incinerate.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
#: resources/ui/gtk4/EnergizeB.ui:70 resources/ui/gtk3/Incinerate.ui:98
#: 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 resources/ui/gtk4/Apparition.ui:70
#: resources/ui/gtk3/Apparition.ui:112
#, fuzzy
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 "提示颜色"
@@ -254,25 +245,30 @@ 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 "窗口的破碎会从光标位置而开始。"
#: resources/ui/gtk4/Incinerate.ui:116 resources/ui/gtk3/Incinerate.ui:147
msgid "Turbulence"
msgstr ""
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/SnapOfDisintegration.ui:116
#: resources/ui/gtk4/Incinerate.ui:162 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
#: resources/ui/gtk4/EnergizeB.ui:116 resources/ui/gtk3/Incinerate.ui:195
#: 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 "颜色"
@@ -285,25 +281,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"
@@ -311,7 +309,7 @@ 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"
@@ -339,11 +337,11 @@ msgstr ""
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
msgid "Welcome to Burn-My-Windows!"
msgstr ""
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 ""
msgstr "如果你喜欢这个扩展,请将其推荐给您的朋友:)‎"
#: resources/ui/gtk4/prefs.ui:66 resources/ui/gtk3/prefs.ui:74
msgid "Open Window Animation"
@@ -367,6 +365,10 @@ msgstr ""
msgid "Also Add Effects to Dialogs"
msgstr ""
#: resources/ui/gtk4/prefs.ui:184 resources/ui/gtk3/prefs.ui:242
msgid "Disable on Battery Power"
msgstr ""
#: resources/ui/gtk4/Apparition.ui:116 resources/ui/gtk3/Apparition.ui:161
msgid "Twirl Intensity"
msgstr ""
@@ -380,5 +382,6 @@ msgid "Suction Intensity"
msgstr ""
#: resources/ui/gtk3/Fire.ui:63
#, fuzzy
msgid "Choose a Preset"
msgstr ""
msgstr "选一个预设配置"
+50 -50
View File
@@ -14,7 +14,6 @@
'use strict';
const {Gio, Gtk, Gdk, GLib, GObject} = imports.gi;
const ByteArray = imports.byteArray;
// libadwaita is available starting with GNOME Shell 42.
let Adw = null;
@@ -30,21 +29,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.Apparition.Apparition,
Me.imports.src.BrokenGlass.BrokenGlass,
Me.imports.src.EnergizeA.EnergizeA,
Me.imports.src.EnergizeB.EnergizeB,
Me.imports.src.Fire.Fire,
Me.imports.src.Hexagon.Hexagon,
Me.imports.src.Matrix.Matrix,
Me.imports.src.SnapOfDisintegration.SnapOfDisintegration,
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;
@@ -59,6 +43,23 @@ 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.Incinerate.Incinerate(),
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);
@@ -94,12 +95,13 @@ var PreferencesDialog = class PreferencesDialog {
// Bind general options properties.
this.bindSwitch('destroy-dialogs');
this.bindSwitch('disable-on-battery');
// 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});
@@ -112,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);
}
@@ -185,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());
}
});
}
@@ -221,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);
@@ -301,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;
@@ -323,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;
@@ -458,9 +460,7 @@ var PreferencesDialog = class PreferencesDialog {
// Reads the contents of a JSON file contained in the global resources archive. The data
// is parsed and returned as a JavaScript object / array.
_getJSONResource(path) {
const data = Gio.resources_lookup_data(path, 0);
const string = ByteArray.toString(ByteArray.fromGBytes(data));
return JSON.parse(string);
return JSON.parse(utils.getStringResource(path));
}
// This traverses the widget tree below the given parent recursively and returns the
@@ -489,17 +489,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();
@@ -507,7 +507,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,
+7 -4
View File
@@ -1,16 +1,19 @@
{
"gold": [
"<a href='https://github.com/D3vil0per'>D3vil0per</a>",
"Maxence Sebald",
"<a href='https://github.com/dennis1248'>Dennis ten Hoove</a>"
],
"silver": [
"<a href='https://twitter.com/tjiiik'>tj3k</a>",
"<a href='https://github.com/danielheadbang'>@danielheadbang</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>"
],
"bronze": [],
"past": [
"<a href='https://twitter.com/tjiiik'>tj3k</a>",
"<a href='https://github.com/AngelBrielez'>Angel Brielez</a>",
"<a href='https://github.com/wolfyrion'>@wolfyrion</a>",
"<a href='https://github.com/MrTomRod'>@MrTomRod</a>",
"Pouhiou",
"DAPREMONT Christophe",
+160 -62
View File
@@ -1,45 +1,14 @@
[
{
"Norwegian Bokm\u00e5l": [
"Swedish": [
[
"epost@anotheragency.no",
"Allan Nordh\u00f8y",
3
]
]
},
{
"Dutch": [
"obslsessed@duck.com",
"obslsessed",
1
],
[
"vistausss@fastmail.com",
"Heimen Stoffels",
65
]
]
},
{
"Russian": [
[
"franigoyt@gmail.com",
"ANIGO R. (AR)",
59
]
]
},
{
"Czech": [
[
"jiri.doubravsky@gmail.com",
"Ji\u0159\u00ed Doubravsk\u00fd",
70
]
]
},
{
"Turkish": [
[
"muhaaliss@pm.me",
"Muha Aliss",
"swedishsailfishosuser@tutanota.com",
"Kristoffer Grundstr\u00f6m",
57
]
]
@@ -54,25 +23,7 @@
[
"albano_battistella@hotmail.com",
"albanobattistella",
63
]
]
},
{
"Chinese (Simplified)": [
[
"lyuutau@outlook.com",
"\u5218\u97ec",
36
]
]
},
{
"German": [
[
"code@simonschneegans.de",
"Simon Schneegans",
59
77
]
]
},
@@ -83,24 +34,34 @@
"Reda",
13
],
[
"mathieu.bousquet2@gmail.com",
"Mathieu B.",
13
],
[
"theo.remon+weblate@uswery.eu",
"Th\u00e9o Remon",
24
30
],
[
"bonnemainsnathan@gmail.com",
"Nathan",
42
45
]
]
},
{
"Spanish": [
[
"ulicesah@gmail.com",
"dev.n47os@aleeas.com",
"Ulices",
7
8
],
[
"andres.segarra.aparicio@gmail.com",
"Andres Segarra",
10
],
[
"fitojb@ubuntu.com",
@@ -110,7 +71,144 @@
[
"oscfdezdz@tuta.io",
"\u00d3scar Fern\u00e1ndez D\u00edaz",
55
58
]
]
},
{
"Persian": [
[
"eshagh094@gmail.com",
"Eshagh Shahedany",
73
]
]
},
{
"Polish": [
[
"pwrzonca@gmail.com",
"Pawe\u0142 Rzo\u0144ca",
72
]
]
},
{
"Korean": [
[
"darkcircle.0426@gmail.com",
"Seong-ho Cho",
73
]
]
},
{
"Turkish": [
[
"muhaaliss@pm.me",
"Muha Aliss",
61
]
]
},
{
"Chinese (Simplified)": [
[
"lyuutau@outlook.com",
"\u5218\u97ec",
36
],
[
"poonsters6@gmail.com",
"merelymyself",
41
]
]
},
{
"Czech": [
[
"jose1711@gmail.com",
"Jose Riha",
4
],
[
"jiri.doubravsky@gmail.com",
"Ji\u0159\u00ed Doubravsk\u00fd",
70
]
]
},
{
"Norwegian Bokm\u00e5l": [
[
"epost@anotheragency.no",
"Allan Nordh\u00f8y",
50
]
]
},
{
"Arabic": [
[
"fawaz27000@hotmail.com",
"fawaz006",
79
]
]
},
{
"German": [
[
"juri26@outlook.de",
"jagfwajgf",
1
],
[
"code@simonschneegans.de",
"Simon Schneegans",
72
]
]
},
{
"Russian": [
[
"eg.ermakov2016@yandex.ru",
"\u0415\u0433\u043e\u0440 \u0415\u0440\u043c\u0430\u043a\u043e\u0432",
31
],
[
"franigoyt@gmail.com",
"ANIGO R. (AR)",
59
]
]
},
{
"Slovak": [
[
"jose1711@gmail.com",
"Jose Riha",
71
]
]
},
{
"Finnish": [
[
"jiri.gronroos@iki.fi",
"Jiri Gr\u00f6nroos",
57
]
]
},
{
"Dutch": [
[
"vistausss@fastmail.com",
"Heimen Stoffels",
80
]
]
}
@@ -0,0 +1,6 @@
<node>
<interface name="org.freedesktop.UPower">
<property name="OnBattery" type="b" access="read" />
</interface>
</node>
+55
View File
@@ -0,0 +1,55 @@
//////////////////////////////////////////////////////////////////////////////////////////
// ) ( //
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
// |__/ //
// Copyright (c) 2021 Simon Schneegans //
// Released under the GPLv3 or later. See LICENSE file for details. //
//////////////////////////////////////////////////////////////////////////////////////////
// The content from common.glsl is automatically prepended to each shader effect.
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 = iTexCoord.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.0);
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)));
// Fade out the window texture.
vec4 oColor = getInputColor(coords + center);
oColor.a *= 1.0 - progress;
setOutputColor(oColor);
}
+74
View File
@@ -0,0 +1,74 @@
//////////////////////////////////////////////////////////////////////////////////////////
// ) ( //
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
// |__/ //
// Copyright (c) 2021 Simon Schneegans //
// Released under the GPLv3 or later. See LICENSE file for details. //
//////////////////////////////////////////////////////////////////////////////////////////
// The content from common.glsl is automatically prepended to each shader effect.
uniform sampler2D uShardTexture;
uniform vec2 uSeed;
uniform vec2 uEpicenter;
uniform float uShardScale;
uniform float uBlowForce;
uniform float uGravity;
const float SHARD_LAYERS = 5.0;
const float ACTOR_SCALE = 2.0;
const float PADDING = ACTOR_SCALE / 2.0 - 0.5;
void main() {
vec4 oColor = vec4(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 = iTexCoord.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.0) / 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.0) {
oColor = getInputColor(coords);
}
}
setOutputColor(oColor);
}
+395
View File
@@ -0,0 +1,395 @@
//////////////////////////////////////////////////////////////////////////////////////////
// ) ( //
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
// |__/ //
// Copyright (c) 2021 Simon Schneegans //
// Released under the GPLv3 or later. See LICENSE file for details. //
//////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
// This file is automatically included in each shader. //
//////////////////////////////////////////////////////////////////////////////////////////
// --------------------------------------------------------------------- standard uniforms
// Each shader can access these standard input values:
// vec2 iTexCoord: Texture coordinates for retrieving the window input color.
// bool uForOpening: True if a window-open animation is ongoing, false otherwise.
// float uProgress: A value which transitions from 0 to 1 during the animation.
// float uDuration: The duration of the current animation 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). For now, this will only be set on GNOME.
// Furthermore, there are two global methods for reading the window input color and
// setting the shader output color. Both methods assume straight alpha:
// vec4 getInputColor(vec2 coords)
// void setOutputColor(vec4 outColor)
uniform bool uForOpening;
uniform float uProgress;
uniform float uDuration;
#if defined(KWIN) // --------------------------------------------------------------------
uniform sampler2D sampler;
uniform int textureWidth;
uniform int textureHeight;
in vec2 texcoord0;
out vec4 fragColor;
vec2 uSize = vec2(textureWidth, textureHeight);
vec2 iTexCoord = vec2(texcoord0.x, 1.0 - texcoord0.y);
float uPadding = 0.0;
vec4 getInputColor(vec2 coords) {
vec4 color = texture2D(sampler, vec2(coords.x, 1.0 - coords.y));
if (color.a > 0.0) {
color.rgb /= color.a;
}
return color;
}
void setOutputColor(vec4 outColor) {
fragColor = vec4(outColor.rgb * outColor.a, outColor.a);
}
#elif defined(KWIN_LEGACY) // -----------------------------------------------------------
uniform sampler2D sampler;
uniform int textureWidth;
uniform int textureHeight;
varying vec2 texcoord0;
vec2 uSize = vec2(textureWidth, textureHeight);
vec2 iTexCoord = vec2(texcoord0.x, 1.0 - texcoord0.y);
float uPadding = 0.0;
vec4 getInputColor(vec2 coords) {
vec4 color = texture2D(sampler, vec2(coords.x, 1.0 - coords.y));
if (color.a > 0.0) {
color.rgb /= color.a;
}
return color;
}
void setOutputColor(vec4 outColor) {
gl_FragColor = vec4(outColor.rgb * outColor.a, outColor.a);
}
#else // GNOME --------------------------------------------------------------------------
// On GNOME, the uniforms are just normal uniforms.
uniform sampler2D uTexture;
uniform vec2 uSize;
uniform float uPadding;
// On GNOME, we set iTexCoord to be an alias for the cogl variables.
vec2 iTexCoord = cogl_tex_coord_in[0].st;
// Shell.GLSLEffect uses straight alpha. So we have to convert from premultiplied.
vec4 getInputColor(vec2 coords) {
vec4 color = texture2D(uTexture, coords);
if (color.a > 0.0) {
color.rgb /= color.a;
}
return color;
}
void setOutputColor(vec4 outColor) { cogl_color_out = outColor; }
#endif // -------------------------------------------------------------------------------
// ----------------------------------------------------------------- compositing operators
// 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);
}
// ------------------------------------------------------------------------- color helpers
// Maps the given value from [0..1] to the given colors.
vec3 tritone(float val, vec3 shadows, vec3 midtones, vec3 highlights) {
if (val < 0.5) {
return mix(shadows, midtones, smoothstep(0.0, 1.0, val * 2.0));
}
return mix(midtones, highlights, smoothstep(0.0, 1.0, val * 2.0 - 1.0));
}
// ---------------------------------------------------------------------- easing functions
// Here are 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); }
// --------------------------------------------------------------------- edge mask helpers
// 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.0, 1.0, clamp(uv.x / fadeWidth, 0.0, 1.0));
mask *= smoothstep(0.0, 1.0, clamp(uv.y / fadeWidth, 0.0, 1.0));
mask *= smoothstep(0.0, 1.0, clamp((maxUV.x - uv.x) / fadeWidth, 0.0, 1.0));
mask *= smoothstep(0.0, 1.0, clamp((maxUV.y - uv.y) / fadeWidth, 0.0, 1.0));
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.0, uPadding - fadePixels * offset);
vec2 uv = iTexCoord.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 = iTexCoord.st;
return getEdgeMask(uv, vec2(1.0), fadeAmount);
}
// ------------------------------------------------------------------------------- 2D math
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));
}
// --------------------------------------------------------------------------------- noise
// 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 functions
// 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);
}
+94
View File
@@ -0,0 +1,94 @@
//////////////////////////////////////////////////////////////////////////////////////////
// ) ( //
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
// |__/ //
// Copyright (c) 2021 Simon Schneegans //
// Released under the GPLv3 or later. See LICENSE file for details. //
//////////////////////////////////////////////////////////////////////////////////////////
// The content from common.glsl is automatically prepended to each shader effect.
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.0;
// 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.0, 1.0);
float fadeOutProgress = clamp((progress - FADE_IN_TIME) / FADE_OUT_TIME, 0.0, 1.0);
float heartProgress =
clamp((progress - (1.0 - HEART_FADE_TIME)) / HEART_FADE_TIME, 0.0, 1.0);
// Compute mask for the "atom" particles.
float dist = length(iTexCoord.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.0);
heartMask *= fadeOutProgress;
heartMask *= 1.0 - heartProgress;
atomMask = clamp(heartMask + atomMask, 0.0, 1.0);
// 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 oColor = getInputColor(iTexCoord.st);
// Dissolve window to effect color / transparency.
oColor.rgb = mix(uColor, oColor.rgb, 0.2 * masks.y + 0.8);
oColor.a = oColor.a * masks.y;
vec2 scaledUV = (iTexCoord.st - 0.5) * (1.0 + 0.1 * progress);
scaledUV /= uScale;
// Add molecule particles.
vec2 uv = scaledUV + vec2(0.0, 0.1 * uProgress * uDuration);
uv *= 0.010598 * vec2(0.5 * uSize.x, uSize.y);
float particles = 0.2 * pow((simplex3D(vec3(uv, 0.0 * uProgress * uDuration))), 3.0);
// Add more molecule particles.
for (float i = 1.0; i <= 3.0; ++i) {
vec2 uv = scaledUV * 0.12154 / pow(1.5, i) * uSize;
float atoms = simplex3D(vec3(uv, 2.0 * uProgress * uDuration / i));
particles += 0.5 * pow(0.2 * (1.0 / (1.0 - atoms) - 1.0), 2.0);
}
oColor.rgb += uColor * particles * masks.x;
oColor.a += particles * masks.x;
// These are pretty useful for understanding how this works.
// oColor = vec4(masks, 0.0, 1.0);
// oColor = vec4(vec3(masks.x), 1.0);
// oColor = vec4(vec3(masks.y), 1.0);
// oColor = vec4(vec3(particles), 1.0);
setOutputColor(oColor);
}
+118
View File
@@ -0,0 +1,118 @@
//////////////////////////////////////////////////////////////////////////////////////////
// ) ( //
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
// |__/ //
// Copyright (c) 2021 Simon Schneegans //
// Released under the GPLv3 or later. See LICENSE file for details. //
//////////////////////////////////////////////////////////////////////////////////////////
// The content from common.glsl is automatically prepended to each shader effect.
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.0;
// 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.0, 1.0);
float fadeProgress = clamp((progress - SHOWER_TIME) / (1.0 - SHOWER_TIME), 0.0, 1.0);
// Gradient from top to bottom.
float t = iTexCoord.t;
// A smooth gradient which moves to the bottom within the showerProgress.
float showerMask =
smoothstep(1.0, 0.0, abs(showerProgress - t - SHOWER_WIDTH) / SHOWER_WIDTH);
// This is 1 above the streak mask.
float streakMask = (showerProgress - t - SHOWER_WIDTH) > 0.0 ? 1.0 : 0.0;
// Compute mask for the "atom" particles.
float atomMask = getRelativeEdgeMask(0.2);
atomMask = max(0.0, atomMask - showerMask);
atomMask *= streakMask;
atomMask *= sqrt(1.0 - 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 oColor = getInputColor(iTexCoord.st);
// Dissolve window to effect color / transparency.
oColor.rgb = mix(uColor, oColor.rgb, 0.5 * masks.w + 0.5);
oColor.a = oColor.a * masks.w;
// Add leading shower particles.
vec2 showerUV = iTexCoord.st + vec2(0.0, -0.7 * progress / SHOWER_TIME);
showerUV *= 0.02 * uSize / uScale;
float shower = pow(simplex2D(showerUV), 10.0);
oColor.rgb += uColor * shower * masks.x;
oColor.a += shower * masks.x;
// Add trailing streak lines.
vec2 streakUV = iTexCoord.st + vec2(0.0, -progress / SHOWER_TIME);
streakUV *= vec2(0.05 * uSize.x, 0.001 * uSize.y) / uScale;
float streaks = simplex2DFractal(streakUV) * 0.5;
oColor.rgb += uColor * streaks * masks.y;
oColor.a += streaks * masks.y;
// Add glimmering atoms.
vec2 atomUV = iTexCoord.st + vec2(0.0, -0.025 * progress / SHOWER_TIME);
atomUV *= 0.2 * uSize / uScale;
float atoms = pow((simplex3D(vec3(atomUV, uProgress * uDuration))), 5.0);
oColor.rgb += uColor * atoms * masks.z;
oColor.a += atoms * masks.z;
// These are pretty useful for understanding how this works.
// oColor = vec4(masks.rgb, 1.0);
// oColor = vec4(vec3(masks.x), 1.0);
// oColor = vec4(vec3(masks.y), 1.0);
// oColor = vec4(vec3(masks.z), 1.0);
// oColor = vec4(vec3(masks.w), 1.0);
// oColor = vec4(vec3(shower), 1.0);
// oColor = vec4(vec3(streaks), 1.0);
// oColor = vec4(vec3(atoms), 1.0);
setOutputColor(oColor);
}
+133
View File
@@ -0,0 +1,133 @@
//////////////////////////////////////////////////////////////////////////////////////////
// ) ( //
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
// |__/ //
// Copyright (c) 2021 Simon Schneegans //
// Released under the GPLv3 or later. See LICENSE file for details. //
//////////////////////////////////////////////////////////////////////////////////////////
// The content from common.glsl is automatically prepended to each shader effect.
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.0;
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) {
float steps[5];
steps[0] = 0.0;
steps[1] = 0.2;
steps[2] = 0.35;
steps[3] = 0.5;
steps[4] = 0.8;
vec4 colors[5];
colors[0] = uGradient1;
colors[1] = uGradient2;
colors[2] = uGradient3;
colors[3] = uGradient4;
colors[4] = 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.0, 1.0);
float afterBurnProgress = clamp((progress - hideTime) / (1.0 - hideTime), 0.0, 1.0);
// Gradient from top to bottom.
float t = iTexCoord.t * (1.0 - fadeWidth);
// Visible part of the window. Gradually dissolves towards the bottom.
float windowMask = 1.0 - clamp((burnProgress - t) / fadeWidth, 0.0, 1.0);
// Gradient from top burning window.
float effectMask = clamp(t * (1.0 - windowMask) / burnProgress, 0.0, 1.0);
// Fade-out when the window burned down.
if (progress > hideTime) {
float fade = sqrt(1.0 - afterBurnProgress * afterBurnProgress);
effectMask *= mix(1.0, 1.0 - 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 = iTexCoord.st * uSize / vec2(400, 600) / uScale;
uv.y += uProgress * uDuration * uMovementSpeed;
float noise =
u3DNoise
? simplex3DFractal(vec3(uv * 4.0, uProgress * uDuration * 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.
vec4 oColor = getInputColor(iTexCoord.st);
// Fade the window according to the effect mask.
oColor.a *= effectMask.x;
// Add the fire to the window.
oColor = alphaOver(oColor, fire);
// These are pretty useful for understanding how this works.
// oColor = vec4(vec3(noise), 1);
// oColor = vec4(vec3(effectMask.x), 1);
// oColor = vec4(vec3(effectMask.y), 1);
setOutputColor(oColor);
}
+120
View File
@@ -0,0 +1,120 @@
//////////////////////////////////////////////////////////////////////////////////////////
// ) ( //
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
// |__/ //
// Copyright (c) 2021 Simon Schneegans //
// Released under the GPLv3 or later. See LICENSE file for details. //
//////////////////////////////////////////////////////////////////////////////////////////
// The content from common.glsl is automatically prepended to each shader effect.
uniform bool uAdditiveBlending;
uniform vec2 uSeed;
uniform float uScale;
uniform float uLineWidth;
uniform vec4 uGlowColor;
uniform vec4 uLineColor;
// This method 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.
float edgeLength = sqrt(4.0 / 3.0);
// The hexgrid repeats after this distance.
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(iTexCoord.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.0, 1.0, clamp(progress / 0.5, 0.0, 1.0));
float tileProgress = smoothstep(0.0, 1.0, clamp((progress - 0.5) / 0.5, 0.0, 1.0));
vec2 texScale = 0.1 * uSize / uScale;
vec4 hex = getHexagons(iTexCoord.st * texScale);
vec4 oColor = vec4(0.0);
// Crop outer parts of the shrinking tiles.
if (tileProgress < hex.z) {
// Make the tiles shrink by offsetting the texture lookup towards the edge
// of the cell.
vec2 lookupOffset = tileProgress * hex.xy / texScale / (1.0 - tileProgress);
oColor = getInputColor(iTexCoord.st + lookupOffset);
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 *= oColor.a;
line *= oColor.a;
if (uAdditiveBlending) {
oColor.rgb += glow.rgb * glow.a;
oColor.rgb += line.rgb * line.a;
} else {
oColor.rgb = mix(oColor.rgb, glow.rgb, glow.a);
oColor.rgb = mix(oColor.rgb, line.rgb, line.a);
}
}
setOutputColor(oColor);
}
+156
View File
@@ -0,0 +1,156 @@
//////////////////////////////////////////////////////////////////////////////////////////
// ) ( //
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
// |__/ //
// Copyright (c) 2021 Simon Schneegans //
// Released under the GPLv3 or later. See LICENSE file for details. //
//////////////////////////////////////////////////////////////////////////////////////////
// The content from common.glsl is automatically prepended to each shader effect.
uniform vec2 uSeed;
uniform vec3 uColor;
uniform float uScale;
uniform float uTurbulence;
uniform vec2 uStartPos;
// This maps a given value in [0..1] to a color from the rgba color ramp
// [transparent black ... semi-transparent uColor ... opaque white].
vec4 getFireColor(float val) {
return vec4(tritone(val, vec3(0.0), uColor, vec3(1.0)), val);
}
void main() {
// The burning fire edge is composed of multiple regions. The width of all regions is
// defined below. If a window is closed and the burning direction happens to be from top
// to bottom, the different zones are arragned like this:
//
// . . . . ^
// . : .: . | smokeRange: In this zone, smoke and little ember
// . : : .. : : . | particles are drawn.
// : . .:.: .: :.. |
// ...:: ..: :: : . .. |
// :: ) .. : : ..: : . | ^
// ( /( ( ( . .::. | | flameRange: Flames are drawn in this zone.
// )\()) ))\ )( . ( . | |
// ((_)\ /((_|()\ )\ ) | | ^
// | |(_|_))( ((_)_(_/( v v | burnRange: In
// ///////////////////// <- hideThreshold: From here on, | this zone, a
// | / / / / / / / / / | ^ the window is hidden. | firery edge is
// | / / / / / / | | v drawn.
// | / / / / / | v scorchRange: The window becomes
// | | brownish and a subtle
// | | heat distortion effect
// | | kicks in.
// | |
// \___________________/
//
// If a window is opened, the window texture is visible on the other side of the
// hideThreshold and the scorchRange is also flipped to the other side (so it is drawn
// below the flames and the smoke).
// All widths depend on the configured scale of the effect.
float SCORCH_WIDTH = 0.2 * uScale;
float BURN_WIDTH = 0.03 * uScale;
float SMOKE_WIDTH = 0.9 * uScale;
float FLAME_WIDTH = 0.2 * uScale;
// During the animation, the hideThreshold transitions from a small value to a larger
// value, so that all the above ranges are covered.
float hideThreshold =
mix(uForOpening ? 0.0 : -SCORCH_WIDTH, 1.0 + SMOKE_WIDTH, uProgress);
// The individual ranges are now given by the current hideThreshold and the widths of
// the zones.
vec2 scorchRange = uForOpening ? vec2(hideThreshold - SCORCH_WIDTH, hideThreshold)
: vec2(hideThreshold, hideThreshold + SCORCH_WIDTH);
vec2 burnRange = vec2(hideThreshold - BURN_WIDTH, hideThreshold + BURN_WIDTH);
vec2 flameRange = vec2(hideThreshold - FLAME_WIDTH, hideThreshold);
vec2 smokeRange = vec2(hideThreshold - SMOKE_WIDTH, hideThreshold);
// Now we compute a 2D gradient in [0..1] which covers the entire window. The dark
// regions will be burned first, the bright regions in the end. We mix a radial gradient
// with some noise. The center of the radial gradient is positioned at uStartPos.
float circle = length(iTexCoord - uStartPos);
vec2 uv = iTexCoord / uScale * uSize / 1.5;
float smokeNoise =
simplex2DFractal(uv * 0.01 + uSeed + uProgress * vec2(0.0, 0.3 * uDuration));
float gradient =
mix(circle, smokeNoise, 200.0 * uTurbulence * uScale / max(uSize.x, uSize.y));
// Now, based on the gradient and the ranges, we can compute masks for the individual
// zones.
float smokeMask = smoothstep(0.0, 1.0, (gradient - smokeRange.x) / SMOKE_WIDTH) *
getAbsoluteEdgeMask(100.0, 0.3);
float flameMask = smoothstep(0.0, 1.0, (gradient - flameRange.x) / FLAME_WIDTH) *
getAbsoluteEdgeMask(20.0, 0.0);
float fireMask = smoothstep(1.0, 0.0, abs(gradient - hideThreshold) / BURN_WIDTH);
float scorchMask = smoothstep(1.0, 0.0, (gradient - scorchRange.x) / SCORCH_WIDTH);
if (uForOpening) {
scorchMask = 1.0 - scorchMask;
}
// Now we retrieve the window color. We only show the window when the burning edge has
// passed.
vec4 oColor = vec4(0.0);
if ((!uForOpening && gradient > hideThreshold) ||
(uForOpening && gradient < hideThreshold)) {
// We add some distortion in the scorch zone
vec2 distort = vec2(0.0);
if (scorchRange.x < gradient && gradient < scorchRange.y) {
distort = vec2(dFdx(gradient), dFdy(gradient)) * scorchMask * 5.0;
}
oColor = getInputColor(iTexCoord + distort);
}
// Add smoke and embers.
if (smokeRange.x < gradient && gradient < smokeRange.y) {
float smoke = smokeMask * smokeNoise;
oColor = alphaOver(oColor, vec4(0.5 * vec3(smoke), smoke));
float emberNoise = simplex2DFractal(
uv * 0.05 + uSeed - smokeNoise * vec2(0.0, 0.3 * smokeMask * uDuration));
float embers = clamp(pow(emberNoise + 0.3, 100.0), 0.0, 2.0) * smoke;
oColor += getFireColor(embers);
}
// Add scorch effect.
if (scorchRange.x < gradient && gradient < scorchRange.y) {
oColor.rgb = mix(oColor.rgb, mix(oColor.rgb, vec3(0.1, 0.05, 0.02), 0.4), scorchMask);
}
// Add trailing flames.
if (min(burnRange.x, flameRange.x) < gradient &&
gradient < max(burnRange.y, flameRange.y)) {
float flameNoise =
simplex2DFractal(uv * 0.02 + uSeed + smokeNoise * vec2(0.0, 1.0 * uDuration) +
vec2(0.0, uProgress * uDuration));
if (flameRange.x < gradient && gradient < flameRange.y) {
float flame = clamp(pow(flameNoise + 0.3, 20.0), 0.0, 2.0) * flameMask;
flame += clamp(pow(flameNoise + 0.4, 10.0), 0.0, 2.0) * flameMask * flameMask * 0.1;
oColor += getFireColor(flame);
}
// Add burning edge.
if (burnRange.x < gradient && gradient < burnRange.y) {
float fire = fireMask * pow(flameNoise + 0.4, 4.0) * oColor.a;
oColor += getFireColor(fire);
}
}
setOutputColor(oColor);
}
+108
View File
@@ -0,0 +1,108 @@
//////////////////////////////////////////////////////////////////////////////////////////
// ) ( //
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
// |__/ //
// Copyright (c) 2021 Simon Schneegans //
// Released under the GPLv3 or later. See LICENSE file for details. //
//////////////////////////////////////////////////////////////////////////////////////////
// The content from common.glsl is automatically prepended to each shader effect.
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.0;
const float FADE_WIDTH = 150.0;
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 * uProgress * uDuration + 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 = iTexCoord.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 - iTexCoord.y;
float rainAlpha = distToDrop >= 0.0 ? exp(-distToDrop / TRAIL_LENGTH) : 0.0;
float windowAlpha = 1.0 - clamp(uSize.y * distToDrop, 0.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.0, 1.0, clamp(iTexCoord.y / shorten, 0.0, 1.0));
rainAlpha *= smoothstep(0.0, 1.0, clamp((1.0 - iTexCoord.y) / shorten, 0.0, 1.0));
if (uForOpening) {
windowAlpha = 1.0 - windowAlpha;
}
return vec2(rainAlpha, windowAlpha);
}
void main() {
vec2 coords = iTexCoord.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.
vec4 oColor = getInputColor(coords);
// Fade the window according to the effect mask.
oColor.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.0 - FINAL_FADE_START_TIME), 0.0, 1.0);
float rainAlpha = finalFade * rainMask.x;
// Add the matrix effect to the window.
vec4 text = vec4(mix(uTrailColor, uTipColor, min(1.0, pow(rainAlpha + 0.1, 4.0))),
rainAlpha * textMask);
oColor = alphaOver(oColor, text);
// These are pretty useful for understanding how this works.
// oColor = vec4(vec3(textMask), 1);
// oColor = vec4(vec3(rainMask.x), 1);
// oColor = vec4(vec3(rainMask.y), 1);
setOutputColor(oColor);
}
+96
View File
@@ -0,0 +1,96 @@
//////////////////////////////////////////////////////////////////////////////////////////
// ) ( //
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
// |__/ //
// Copyright (c) 2021 Simon Schneegans //
// Released under the GPLv3 or later. See LICENSE file for details. //
//////////////////////////////////////////////////////////////////////////////////////////
// The content from common.glsl is automatically prepended to each shader effect.
uniform sampler2D uDustTexture;
uniform vec4 uDustColor;
uniform vec2 uSeed;
uniform float uDustScale;
const float DUST_LAYERS = 4.0;
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 = iTexCoord.t * ACTOR_SCALE - PADDING;
progress = 2.0 - gradient - 2.0 * progress;
progress = progress + 0.25 - 0.5 * simplex2D((iTexCoord.st + uSeed) * 2.0);
progress = pow(max(0.0, progress), 2.0);
vec4 oColor = vec4(0.0);
for (float i = 0; i < DUST_LAYERS; ++i) {
// Create a random direction.
float factor = DUST_LAYERS == 1.0 ? 0.0 : i / (DUST_LAYERS - 1.0);
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 = iTexCoord.st * ACTOR_SCALE - PADDING - 0.5;
if (getWinding(direction, coords) > 0.0) {
direction *= -1.0;
}
// Flip direction for half the layers.
if (factor > 0.5) {
direction *= -1.0;
}
// 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.0, GROW_INTENSITY, progress);
vec2 shrink =
vec2(direction.y, -direction.x) * dist * mix(0.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 = getInputColor(coords + 0.5);
// 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) {
oColor = windowColor;
}
}
}
// This may help you to understand how this effect works.
// oColor = vec4(progress, 0, 0, 0);
setOutputColor(oColor);
}
+120
View File
@@ -0,0 +1,120 @@
//////////////////////////////////////////////////////////////////////////////////////////
// ) ( //
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
// |__/ //
// Copyright (c) 2021 Simon Schneegans //
// Released under the GPLv3 or later. See LICENSE file for details. //
//////////////////////////////////////////////////////////////////////////////////////////
// The content from common.glsl is automatically prepended to each shader effect.
// 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.0));
// 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.0), vec2(1.0));
}
void main() {
float progress = uForOpening ? 1.0 - easeOutQuad(uProgress) : easeOutQuad(uProgress);
// Warp the texture coordinates to create a blow-up effect.
vec2 coords = iTexCoord.st * 2.0 - 1.0;
float dist = length(coords);
coords = (coords / dist * pow(dist, 1.0 + uWarpIntensity)) * 0.5 + 0.5;
coords = mix(iTexCoord.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.0, 1.0));
}
// 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;
vec4 oColor = getInputColor(coords + offset);
// Add colorful flashes.
float flashIntensity = 1.0 / FLASH_INTENSITY * (scratchMap - progress) + 1.0;
if (flashIntensity < 0.0 || flashIntensity >= 1.0) {
flashIntensity = 0.0;
}
// Hide flashes where there is now window.
vec4 flash = uFlashColor;
flash.a *= flashIntensity * oColor.a * (1.0 - progress);
// Hide scratched out parts.
oColor.a *= (scratchMap > progress ? 1.0 : 0.0);
// Add flash color.
oColor = alphaOver(oColor, flash);
// Fade out the remaining shards.
float fadeProgress = smoothstep(0.0, 1.0, (progress - 1.0 + FF_TIME) / FF_TIME);
oColor.a *= sqrt(1.0 - fadeProgress * fadeProgress);
// These are pretty useful for understanding how this works.
// oColor = vec4(vec3(flashIntensity), 1);
// oColor = vec4(vec3(scratchMap), 1);
setOutputColor(oColor);
}
+68
View File
@@ -0,0 +1,68 @@
//////////////////////////////////////////////////////////////////////////////////////////
// ) ( //
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
// |__/ //
// Copyright (c) 2021 Simon Schneegans //
// Released under the GPLv3 or later. See LICENSE file for details. //
//////////////////////////////////////////////////////////////////////////////////////////
// The content from common.glsl is automatically prepended to each shader effect.
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 prog = uForOpening ? 1.0 - easeOutQuad(uProgress) : easeOutQuad(uProgress);
// Scale down the window vertically.
float scale = 1.0 / mix(1.0, SCALING, prog) - 1.0;
vec2 coords = iTexCoord.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 tbProg = smoothstep(0.0, 1.0, clamp(prog / TB_TIME, 0.0, 1.0));
float lrProg = smoothstep(0.0, 1.0, clamp((prog - LR_DELAY) / LR_TIME, 0.0, 1.0));
float ffProg = smoothstep(0.0, 1.0, clamp((prog - 1.0 + FF_TIME) / FF_TIME, 0.0, 1.0));
// This is a top-center-bottom gradient in [0..1..0]
float tb = coords.y * 2.0;
tb = tb < 1.0 ? tb : 2.0 - tb;
// This is a left-center-right gradient in [0..1..0]
float lr = coords.x * 2.0;
lr = lr < 1.0 ? lr : 2.0 - lr;
// Combine the progress values with the gradients to create the alpha masks.
float tbMask = 1.0 - smoothstep(0.0, 1.0, clamp((tbProg - tb) / BLUR_WIDTH, 0.0, 1.0));
float lrMask = 1.0 - smoothstep(0.0, 1.0, clamp((lrProg - lr) / BLUR_WIDTH, 0.0, 1.0));
float ffMask = 1.0 - smoothstep(0.0, 1.0, ffProg);
// Assemble the final alpha value.
float mask = tbMask * lrMask * ffMask;
vec4 oColor = getInputColor(coords);
oColor.rgb = mix(oColor.rgb, uColor * oColor.a, smoothstep(0.0, 1.0, prog));
oColor.a *= mask;
// These are pretty useful for understanding how this works.
// oColor = vec4(vec3(tbMask), 1);
// oColor = vec4(vec3(lrMask), 1);
// oColor = vec4(vec3(ffMask), 1);
// oColor = vec4(vec3(mask), 1);
setOutputColor(oColor);
}
+112
View File
@@ -0,0 +1,112 @@
//////////////////////////////////////////////////////////////////////////////////////////
// ) ( //
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
// | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< //
// |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ //
// |__/ //
// Copyright (c) 2021 Simon Schneegans //
// Released under the GPLv3 or later. See LICENSE file for details. //
//////////////////////////////////////////////////////////////////////////////////////////
// The content from common.glsl is automatically prepended to each shader effect.
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.0 + WISPS_RADIUS;
const float WISPS_LAYERS = 8.0;
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.0));
// 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 * (uProgress * uDuration + 1.0)) * roundness,
cos(speed * (uProgress * uDuration + 1.0)));
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, 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 = iTexCoord.st * (scale + 1.0) - scale * 0.5;
// Get the color of the window.
vec4 oColor = getInputColor(coords);
// Compute several layers of moving wisps.
vec2 uv = (iTexCoord.st - 0.5) / mix(1.0, 0.5, progress) + 0.5;
uv /= uScale;
float wisps = 0.0;
for (float i = 0.0; i < WISPS_LAYERS; ++i) {
wisps += getWisps(uv * 0.3, WISPS_SPACING, uSeed * (i + 1.0));
}
// Compute shrinking edge mask.
float mask = getRelativeEdgeMask(mix(0.01, 0.5, progress));
// Compute three different progress values.
float wispsIn = smoothstep(0.0, 1.0, clamp(progress / WISPS_IN_TIME, 0.0, 1.0));
float wispsOut = smoothstep(
0.0, 1.0, clamp((progress - WISPS_IN_TIME) / (1.0 - WISPS_IN_TIME), 0.0, 1.0));
float windowOut = smoothstep(0.0, 1.0, clamp(progress / WINDOW_OUT_TIME, 0.0, 1.0));
// Use a noise function to dissolve the window.
float noise =
smoothstep(1.0, 0.0, abs(2.0 * simplex2DFractal(uv * uSize / 250.0) - 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));
oColor.a *= windowMask * mask;
// Add the wisps.
vec4 wispColor = wisps * vec4(uColor, min(wispsIn, 1.0 - wispsOut) * mask);
oColor = alphaOver(oColor, wispColor);
// These are pretty useful for understanding how this works.
// oColor = vec4(vec3(windowMask), 1.0);
// oColor = vec4(vec3(wisps), 1.0);
// oColor = vec4(vec3(noise), 1.0);
// oColor = vec4(vec3(mask*min(wispsIn, 1.0 - wispsOut)), 1.0);
setOutputColor(oColor);
}
+297
View File
@@ -0,0 +1,297 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface domain="burn-my-windows">
<object class="GtkAdjustment" id="incinerate-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="incinerate-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="incinerate-turbulence">
<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="incinerate-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">incinerate-animation-time</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset-incinerate-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">incinerate-scale</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset-incinerate-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">Turbulence</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">incinerate-turbulence</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset-incinerate-turbulence">
<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">Start at Pointer</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">If disabled, a random location will be chosen.</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="incinerate-use-pointer">
<property name="halign">end</property>
<property name="valign">center</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset-incinerate-use-pointer">
<child>
<object class="GtkImage">
<property name="icon-name">edit-clear-symbolic</property>
<property name="icon-size">1</property>
</object>
</child>
<property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style>
<class name="flat" />
</style>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkListBoxRow">
<property name="margin-start">10</property>
<property name="margin-end">10</property>
<property name="margin-top">10</property>
<property name="margin-bottom">10</property>
<property name="activatable">0</property>
<child>
<object class="GtkBox">
<child>
<object class="GtkLabel">
<property name="label" translatable="yes">Color</property>
<property name="xalign">0</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="hexpand">1</property>
</object>
</child>
<child>
<object class="GtkColorButton" id="incinerate-color">
<property name="use_alpha">0</property>
<property name="show_editor">1</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset-incinerate-color">
<child>
<object class="GtkImage">
<property name="icon-name">edit-clear-symbolic</property>
<property name="icon-size">1</property>
</object>
</child>
<property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style>
<class name="flat" />
</style>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>
+44
View File
@@ -227,6 +227,50 @@
</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">Disable on Battery Power</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="GtkSwitch" id="disable-on-battery">
<property name="halign">end</property>
<property name="valign">center</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset-disable-on-battery">
<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>
+250
View File
@@ -0,0 +1,250 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface domain="burn-my-windows">
<object class="GtkBox" id="incinerate-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="incinerate-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-incinerate-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="incinerate-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-incinerate-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">Turbulence</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="incinerate-turbulence">
<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-incinerate-turbulence">
<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">Start at Pointer</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">If disabled, a random location will be chosen.</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="incinerate-use-pointer">
<property name="halign">end</property>
<property name="valign">center</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset-incinerate-use-pointer">
<property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style>
<class name="flat" />
</style>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkListBoxRow">
<property name="activatable">0</property>
<child>
<object class="GtkBox">
<child>
<object class="GtkLabel">
<property name="label" translatable="yes">Color</property>
<property name="xalign">0</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="hexpand">1</property>
</object>
</child>
<child>
<object class="GtkColorButton" id="incinerate-color">
<property name="use_alpha">0</property>
<property name="show_editor">1</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset-incinerate-color">
<property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style>
<class name="flat" />
</style>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>
+34
View File
@@ -174,6 +174,40 @@
</object>
</child>
<child>
<object class="GtkListBoxRow">
<property name="activatable">0</property>
<child>
<object class="GtkBox">
<child>
<object class="GtkLabel">
<property name="label" translatable="yes">Disable on Battery Power</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="GtkSwitch" id="disable-on-battery">
<property name="halign">end</property>
<property name="valign">center</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset-disable-on-battery">
<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>
@@ -13,6 +13,12 @@
<description>Set to true to burn dialogs as well.</description>
</key>
<key name="disable-on-battery" type="b">
<default>false</default>
<summary>Disable on Battery</summary>
<description>Enable effects only if plugged in.</description>
</key>
<key name="close-preview-effect" type="s">
<default>""</default>
<summary>Close Preview Effect</summary>
@@ -325,6 +331,52 @@
<description>Use additive blending for the line and the glow.</description>
</key>
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
<!-- Incinerate Options -->
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
<key name="incinerate-close-effect" type="b">
<default>false</default>
<summary>Incinerate Close Effect</summary>
<description>Use the Incinerate effect for window closing.</description>
</key>
<key name="incinerate-open-effect" type="b">
<default>false</default>
<summary>Incinerate Open Effect</summary>
<description>Use the Incinerate effect for window opening.</description>
</key>
<key name="incinerate-animation-time" type="i">
<default>2000</default>
<summary>Incinerate Animation Time</summary>
<description>The time the Incinerate effect takes.</description>
</key>
<key name="incinerate-scale" type="d">
<default>1.0</default>
<summary>Incinerate Scale</summary>
<description>The scale of the effect.</description>
</key>
<key name="incinerate-turbulence" type="d">
<default>0.3</default>
<summary>Incinerate Turbulence</summary>
<description>The turbulence of the effect.</description>
</key>
<key name="incinerate-color" type="s">
<default>"rgb(255, 180, 127)"</default>
<summary>Incinerate Color</summary>
<description>The color of the effect.</description>
</key>
<key name="incinerate-use-pointer" type="b">
<default>true</default>
<summary>Incinerate Use Pointer</summary>
<description>Use the pointer location for the incinerate effect.</description>
</key>
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
<!-- Energize A Options -->
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
+1 -1
View File
@@ -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
+43 -104
View File
@@ -13,33 +13,56 @@
'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 hides the actor by violently sucking it into the void of magic. //
// towards the middle and then hiding the resulting line from left and right towards //
// 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 Apparition = 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 Apparition = class Apparition {
// 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.
static getMinShellVersion() {
getMinShellVersion() {
return [3, 38];
}
@@ -47,22 +70,21 @@ var Apparition = class Apparition {
// 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 '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.
static getLabel() {
getLabel() {
return _('Apparition');
}
// -------------------------------------------------------------------- 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()}/Apparition.ui`);
@@ -80,93 +102,10 @@ var Apparition = class Apparition {
// ---------------------------------------------------------------- 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 animation. 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 = imports.gi.Clutter;
const shaderSnippets = Me.imports.src.shaderSnippets;
Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect {
_init(actor, settings, forOpening) {
super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
// If we are currently performing integration test, the animation uses a fixed seed.
const testMode = settings.get_boolean('test-mode');
// The math for the whirling is inspired by this post:
// http://www.geeks3d.com/20110428/shader-library-swirl-post-processing-filter-in-glsl
this.set_shader_source(`
// Inject some common shader snippets.
${shaderSnippets.standardUniforms()}
const vec2 SEED = vec2(${testMode ? 0 : Math.random()},
${testMode ? 0 : Math.random()});
const float SHAKE = ${settings.get_double('apparition-shake-intensity')};
const float TWIRL = ${settings.get_double('apparition-twirl-intensity')};
const float SUCTION = ${settings.get_double('apparition-suction-intensity')};
const float RANDOMNESS = ${settings.get_double('apparition-randomness')};
const float ACTOR_SCALE = 2.0;
const float PADDING = ACTOR_SCALE / 2.0 - 0.5;
void main() {
// We simply inverse the progress for opening windows.
float progress = ${forOpening ? '1.0-uProgress' : 'uProgress'};
// Choose a random suction center.
vec2 center = SEED * RANDOMNESS + 0.5 * (1.0 - RANDOMNESS);
vec2 coords = cogl_tex_coord_in[0].st * ACTOR_SCALE - PADDING - center;
// Add some shaking.
coords.x += progress * 0.05 * SHAKE * sin((progress + SEED.x) * (1.0 + SEED.x) * SHAKE);
coords.y += progress * 0.05 * SHAKE * cos((progress + SEED.y) * (1.0 + SEED.y) * SHAKE);
// "Suck" the texture into the center.
float dist = length(coords) / sqrt(2);
coords += progress * coords / dist * 0.5 * SUCTION;
// Apply some whirling.
float angle = pow(1.0 - dist, 2.0) * TWIRL * progress;
float s = sin(angle);
float c = cos(angle);
coords = vec2(dot(coords, vec2(c, -s)), dot(coords, vec2(s, c)));
// Fade out the window texture.
cogl_color_out = texture2D(uTexture, coords + center) * (1.0 - progress);
}
`);
};
});
}
+99 -178
View File
@@ -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,169 +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 (!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');
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);
}
});
}
+41 -141
View File
@@ -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 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-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);
}
`);
};
});
}
+42 -164
View File
@@ -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);
}
`);
};
});
}
+60 -177
View File
@@ -13,13 +13,14 @@
'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 //
@@ -29,18 +30,58 @@ const utils = Me.imports.src.utils;
// 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);
}
`);
};
});
}
+58 -179
View File
@@ -20,24 +20,66 @@ 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 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 Hexagon = 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 Hexagon = class Hexagon {
// 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.
static getMinShellVersion() {
getMinShellVersion() {
return [3, 36];
}
@@ -45,22 +87,21 @@ var Hexagon = class Hexagon {
// 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 '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.
static getLabel() {
getLabel() {
return _('Hexagon');
}
// -------------------------------------------------------------------- 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()}/Hexagon.ui`);
@@ -79,172 +120,10 @@ var Hexagon = class Hexagon {
// ---------------------------------------------------------------- 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: 1},
'scale-x': {from: 1.0, to: 1.0, mode: 1},
'scale-y': {from: 1.0, to: 1.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: 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});
// Get the two configurable colors. They are directly injected into the shader code
// below.
const glowColor =
Clutter.Color.from_string(settings.get_string('hexagon-glow-color'))[1];
const lineColor =
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');
// Feel free to read the inline comments below to learn how this shader works.
this.set_shader_source(`
// Inject some common shader snippets.
${shaderSnippets.standardUniforms()}
${shaderSnippets.noise()}
const vec2 SEED = vec2(${testMode ? 0 : Math.random()},
${testMode ? 0 : Math.random()});
const float SCALE = 10.0 * ${settings.get_double('hexagon-scale')};
const float LINE_WIDTH = 0.02 * ${settings.get_double('hexagon-line-width')};
// 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 = ${forOpening ? '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 + SEED);
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 = vec2(uSizeX, uSizeY) / SCALE;
vec4 hex = getHexagons(cogl_tex_coord_in[0].st * texScale);
if (tileProgress > hex.z) {
// Crop outer parts of the shrinking tiles.
cogl_color_out *= vec4(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);
vec4 glow = vec4(${glowColor.red / 255}, ${glowColor.green / 255},
${glowColor.blue / 255}, ${glowColor.alpha / 255});
vec4 line = vec4(${lineColor.red / 255}, ${lineColor.green / 255},
${lineColor.blue / 255}, ${lineColor.alpha / 255});
// 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(LINE_WIDTH, hex.z) would be simpler, but the below creates some
// fake antialiasing.
line.a *= 1.0 - smoothstep(LINE_WIDTH*0.5, LINE_WIDTH, 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 (${settings.get_boolean('hexagon-additive-blending')}) {
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);
}
}
}
`);
};
});
}
+161
View File
@@ -0,0 +1,161 @@
//////////////////////////////////////////////////////////////////////////////////////////
// ) ( //
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
// | '_ \ || | '_| ' \)) | ' \()| || | \ 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 burns windows to ashes. The fire starts at a random position at the //
// window's boundary and then burns through the window in a circular shape. //
//////////////////////////////////////////////////////////////////////////////////////////
// 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 Incinerate = 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} = imports.gi;
// 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');
shader._uTurbulence = shader.get_uniform_location('uTurbulence');
shader._uStartPos = shader.get_uniform_location('uStartPos');
// Write all uniform values at the start of each animation.
shader.connect('begin-animation', (shader, settings, forOpening, actor) => {
// If we are currently performing integration test, the animation uses a fixed
// seed.
const testMode = settings.get_boolean('test-mode');
let seed = [testMode ? 0 : Math.random(), testMode ? 0 : Math.random()];
// If this option is set, we use the mouse pointer position. Because the actor
// position may change after the begin-animation signal is called, we set the
// uStartPos uniform during the update callback.
if (settings.get_boolean('incinerate-use-pointer')) {
this._startPointerPos = global.get_pointer();
this._actor = actor;
} else {
// Else, a random position along the window boundary is used as start position
// for the incinerate effect.
let startPos = seed[0] > seed[1] ? [seed[0], Math.floor(seed[1] + 0.5)] :
[Math.floor(seed[0] + 0.5), seed[1]];
shader.set_uniform_float(shader._uStartPos, 2, startPos);
this._startPointerPos = null;
}
const c = Clutter.Color.from_string(settings.get_string('incinerate-color'))[1];
// clang-format off
shader.set_uniform_float(shader._uSeed, 2, seed);
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('incinerate-scale')]);
shader.set_uniform_float(shader._uTurbulence, 1, [settings.get_double('incinerate-turbulence')]);
// clang-format on
});
// If the mouse pointer position is used as start position, we set the uStartPos
// uniform during the update callback as the actor position may not be set up
// properly before the begin animation callback.
shader.connect('update-animation', (shader) => {
if (this._startPointerPos) {
const [x, y] = this._startPointerPos;
const [ok, localX, localY] = this._actor.transform_stage_point(x, y);
if (ok) {
let startPos = [
Math.max(0.0, Math.min(1.0, localX / this._actor.width)),
Math.max(0.0, Math.min(1.0, localY / this._actor.height))
];
shader.set_uniform_float(shader._uStartPos, 2, startPos);
}
}
});
// Make sure to drop the reference to the actor.
shader.connect('end-animation', (shader) => {
shader._actor = null;
});
});
}
// ---------------------------------------------------------------------------- metadata
// This effect is available on all supported GNOME Shell versions.
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 'incinerate';
}
// 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 _('Incinerate');
}
// -------------------------------------------------------------------- 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()}/Incinerate.ui`);
// Bind all properties.
dialog.bindAdjustment('incinerate-animation-time');
dialog.bindAdjustment('incinerate-scale');
dialog.bindAdjustment('incinerate-turbulence');
dialog.bindSwitch('incinerate-use-pointer');
dialog.bindColorButton('incinerate-color');
// Finally, return the new settings page.
return dialog.getBuilder().get_object('incinerate-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};
}
}
+71 -178
View File
@@ -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);
}
});
}
+154
View File
@@ -0,0 +1,154 @@
//////////////////////////////////////////////////////////////////////////////////////////
// ) ( //
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
// | '_ \ || | '_| ' \)) | ' \()| || | \ 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]},
'end-animation': {}
}
},
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._uDuration = this.get_uniform_location('uDuration');
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, duration, actor) {
// Reset progress value.
this._progress = 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._uDuration, 1, [duration]);
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) {
// Store the current progress value. The corresponding signal is emitted each frame
// in vfunc_paint_target. We do not emit it here, as the pipeline which may be used
// by handlers must not have been created yet.
this._progress = progress;
}
// This will just emit the end-animation signal. It can be used to clean up any
// resources required during the animation.
endAnimation() {
this.emit('end-animation');
}
// 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._loadShaderResource(`/shaders/${this._nick}.frag`);
// 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.set_uniform_float(this._uProgress, 1, [this._progress]);
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. The
// code from "common.glsl" is prepended automatically.
_loadShaderResource(path) {
let common = this._loadStringResource('/shaders/common.glsl');
let code = this._loadStringResource(path);
// Add a trailing newline. Else the GLSL compiler complains...
return common + '\n' + code + '\n';
}
});
+95
View File
@@ -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;
}
}
+73 -170
View File
@@ -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 effects dissolves your windows into a cloud of dust. For this, it uses an //
@@ -31,18 +32,74 @@ 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 SnapOfDisintegration = 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 SnapOfDisintegration = class SnapOfDisintegration {
// 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+.
static getMinShellVersion() {
getMinShellVersion() {
return [40, 0];
}
@@ -50,22 +107,21 @@ var SnapOfDisintegration = class SnapOfDisintegration {
// 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 '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.
static getLabel() {
getLabel() {
return _('Snap of Disintegration');
}
// -------------------------------------------------------------------- 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/SnapOfDisintegration.ui');
@@ -81,163 +137,10 @@ var SnapOfDisintegration = class SnapOfDisintegration {
// ---------------------------------------------------------------- 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 1.2 times their original size, so that we have
// some space to draw the dust particles. We also set the animation mode to "Linear".
static tweakTransition(actor, settings, forOpening) {
return {
'opacity': {from: 255, to: 255, mode: 1},
'scale-x': {from: 1.2, to: 1.2, mode: 1},
'scale-y': {from: 1.2, to: 1.2, 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.2, y: 1.2};
}
}
//////////////////////////////////////////////////////////////////////////////////////////
// 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(actor, settings, forOpening) {
super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
// Load the dust 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 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);
// The dust particles will fade to this color over time.
const color = 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');
this.set_shader_source(`
// Inject some common shader snippets.
${shaderSnippets.standardUniforms()}
${shaderSnippets.noise()}
${shaderSnippets.math2D()}
uniform sampler2D uDustTexture;
const vec2 SEED = vec2(${testMode ? 0 : Math.random()},
${testMode ? 0 : Math.random()});
const float DUST_SCALE = ${settings.get_double('snap-scale')};
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;
const vec4 DUST_COLOR = vec4(${color.red / 255}, ${color.green / 255},
${color.blue / 255}, ${color.alpha / 255});
void main() {
// We simply inverse the progress for opening windows.
float progress = ${forOpening ? '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 + SEED) * 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 * (SEED.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 = coords.x ${forOpening ? ' + ' : ' - '} progress * WIND_INTENSITY;
// Now check wether there is actually something in the current dust layer at
// the coords position.
vec2 dustCoords = (coords + SEED) * vec2(uSizeX, uSizeY) / DUST_SCALE / 100.0;
vec2 dustMap = texture2D(uDustTexture, dustCoords).rg;
float dustGroup = floor(dustMap.g * DUST_LAYERS * 0.999);
if (dustGroup == i) {
// Fade the window color to DUST_COLOR.
vec4 windowColor = texture2D(uTexture, coords + 0.5);
vec3 dustColor = mix(windowColor.rgb, DUST_COLOR.rgb, DUST_COLOR.a);
windowColor.rgb = mix(windowColor.rgb, dustColor*windowColor.a, progress);
// Dissolve the dust particles.
float dissolve = (dustMap.x - progress) > 0 ? 1 : 0;
windowColor *= dissolve;
// Blend the layers.
cogl_color_out = mix(cogl_color_out, windowColor, windowColor.a);
}
}
}
`);
};
// This is overridden 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
vfunc_paint_target(node, paint_context) {
const pipeline = this.get_pipeline();
pipeline.set_layer_filters(0, Cogl.PipelineFilter.LINEAR,
Cogl.PipelineFilter.LINEAR);
pipeline.set_layer_texture(1, this._dustTexture.get_texture());
pipeline.set_layer_wrap_mode(1, Cogl.PipelineWrapMode.REPEAT);
this.set_uniform_value('uDustTexture', 1);
super.vfunc_paint_target(node, paint_context);
}
});
}
+76 -186
View File
@@ -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);
}
});
}
+37 -110
View File
@@ -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);
}
`);
};
});
}

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