Compare commits

...

210 Commits
v9 ... v14

Author SHA1 Message Date
ANIGO R. (AR) a0d087be33 🌐 Translated using Weblate (Russian)
Deploy / Extension Bundle (push) Has been cancelled
2022-03-29 20:28:04 +02:00
ANIGO R. (AR) dd80db09e9 🌐 Added translation using Weblate (Russian) 2022-03-29 20:28:04 +02:00
Simon Schneegans 653d680347 💞 Update credits 2022-03-29 20:26:41 +02:00
Simon Schneegans ee584ab15e 📝 Add changelog entry 2022-03-29 20:26:25 +02:00
Simon Schneegans 82e2738f33 💞 Add new sponsor 2022-03-29 17:02:49 +02:00
Simon Schneegans 45d52842cf 📝 Add changelog entries 2022-03-29 11:57:28 +02:00
Simon Schneegans f738f648d8 🔧 Resolve #115 2022-03-29 11:54:39 +02:00
Simon Schneegans 0cf53c5a5d 🪲 Fix #118 (again) 2022-03-29 11:53:54 +02:00
Simon Schneegans 6f5bcc6681 🎉 Bump version number 2022-03-27 13:49:39 +02:00
Simon Schneegans 1a84ad337d 🔥 Undo commit
Deploy / Extension Bundle (push) Has been cancelled
2022-03-27 13:48:08 +02:00
Simon Schneegans 6a003f8bfb 📝 Add changelog entry 2022-03-27 13:45:07 +02:00
Simon Schneegans adc906006b 💞 Update credits 2022-03-27 13:44:17 +02:00
Simon Schneegans 9b46b9b009 📝 Set release date 2022-03-27 13:38:08 +02:00
Simon Schneegans d24dc6030d 📝 Add changelog entry 2022-03-27 13:23:23 +02:00
Simon Schneegans 26e4a32fe4 🪲 Fix version check 2022-03-27 13:23:12 +02:00
Simon Schneegans 376a3899e9 🔥 Remove liberapay donation option 2022-03-27 07:32:46 +02:00
Simon Schneegans 486f6b4c74 🔧 Use new version of dynamic badges action 2022-03-27 06:56:10 +02:00
Muha Aliss c43579974d 🌐 Translated using Weblate (Turkish) 2022-03-21 07:25:53 +01:00
Muha Aliss fbd02bb22c 🌐 Added translation using Weblate (Turkish) 2022-03-21 07:25:53 +01:00
Adolfo Jayme Barrientos beddd689c7 🌐 Translated using Weblate (Spanish) 2022-03-16 10:54:50 +01:00
Simon Schneegans 77310f9e65 ✨ Tweak clang-format style 2022-03-04 20:39:12 +01:00
刘韬 28c1cb6d72 🌐 Translated using Weblate (Chinese (Simplified)) 2022-03-04 05:04:22 +01:00
刘韬 9bdcea1dea 🌐 Translated using Weblate (Chinese (Simplified)) 2022-03-04 05:04:22 +01:00
刘韬 5e737ffd3a 🌐 Added translation using Weblate (Chinese (Simplified)) 2022-03-04 05:04:22 +01:00
Simon Schneegans 474f6cff25 🔀 Merge pull request #113 from Schneegans/feature/advanced-ci 2022-03-04 04:53:36 +01:00
Simon Schneegans 35c91cf925 🔧 Fix shellcheck issue [run-ci] 2022-03-03 21:31:51 +01:00
Simon Schneegans 0facae304b 🔧 Use imagemagick for comparisons [run-ci] 2022-03-03 21:25:47 +01:00
Simon Schneegans 31fa0f54bd 📝 Fix comment 2022-03-03 21:25:25 +01:00
Simon Schneegans 6c2f9d1553 🎉 Add reference generator script [run-ci] 2022-03-03 20:20:57 +01:00
Simon Schneegans 81a0e18c79 🔧 Tweak fuzzyness 2022-03-03 20:20:38 +01:00
Simon Schneegans 3caf2a176d 🎉 Add advanced CI tests [run-ci] 2022-03-03 20:01:37 +01:00
Simon Schneegans b48b6bb39b 📝 Add changelog entry 2022-03-03 20:00:36 +01:00
Simon Schneegans 69aadfd643 🎉 Add test mode 2022-03-03 20:00:24 +01:00
Simon Schneegans 59c01999b2 🔧 Update action version 2022-03-01 20:45:55 +01:00
Simon Schneegans c431437c34 🔧 Use more generic makefile 2022-03-01 16:05:09 +01:00
Simon Schneegans 312be215a0 🎉 Run tests on GNOME 42 as well 2022-02-28 21:21:33 +01:00
albanobattistella e1fcfb5d25 🌐 Translated using Weblate (Italian) 2022-02-28 20:04:14 +01:00
Simon Schneegans 4410aeac3b 📝 Add video teaser 2022-02-27 21:31:17 +01:00
Simon Schneegans f77aeded5e 🎨 Add teaser image 2022-02-27 21:30:55 +01:00
Heimen Stoffels 1d0dd3e8da 🌐 Translated using Weblate (Dutch) 2022-02-23 07:44:05 +01:00
Ulices cc916886c5 🌐 Translated using Weblate (Spanish) 2022-02-23 07:44:05 +01:00
albanobattistella 41648f2496 🌐 Translated using Weblate (Italian) 2022-02-23 07:44:05 +01:00
Nathan 8b79995723 🌐 Translated using Weblate (French) 2022-02-23 07:44:05 +01:00
Simon Schneegans f35cda20a8 📝 Set release date 2022-02-19 13:20:16 +01:00
Simon Schneegans 73c237aaa4 🎉 Bump version number 2022-02-19 13:19:40 +01:00
Simon Schneegans 2cc1c9655e 💞 Update credits
Deploy / Extension Bundle (push) Has been cancelled
2022-02-19 12:58:51 +01:00
Simon Schneegans e47c85e365 🌐 Translated using Weblate (German) 2022-02-18 20:40:36 +01:00
Hosted Weblate b8a0a158d8 🌐 Update translation files 2022-02-18 20:40:36 +01:00
Simon Schneegans 29ea1de206 🌐 Update translation template 2022-02-18 20:34:38 +01:00
Simon Schneegans 2637390557 📝 Add changelog entry 2022-02-18 20:32:48 +01:00
Simon Schneegans 9b513f7e2b 🔀 Merge pull request #104 from Schneegans/feature/gnome-42
GNOME Shell 42
2022-02-18 20:31:17 +01:00
Simon Schneegans 97fe06a98f 📝 Add changelog entry 2022-02-18 20:23:25 +01:00
Simon Schneegans 1a3568e80d 💄 Fix margin 2022-02-18 20:21:10 +01:00
Simon Schneegans 62363d7bd9 Merge branch 'main' into feature/gnome-42 2022-02-18 20:18:10 +01:00
Simon Schneegans ecdb6d605f 🔧 Add liberapay link 2022-02-18 20:17:51 +01:00
Simon Schneegans 41fcaf04ff 🔧 Use libadwaita for the settings dialog 2022-02-18 17:43:40 +01:00
Simon Schneegans 0886007e98 🔧 Support alpha and beta versions in version check 2022-02-18 17:24:10 +01:00
Simon Schneegans 4a82e7f580 🔧 Add liberapay funding method 2022-02-17 13:58:33 +01:00
Mario 78d30e82c6 🌐 Translated using Weblate (Italian) 2022-02-14 13:05:55 +01:00
Simon Schneegans 664bd3b5dc 💞 Add new sponsor 2022-02-14 13:02:38 +01:00
Ulices 737e88a23b 🌐 Translated using Weblate (Spanish) 2022-02-09 20:03:30 +01:00
Heimen Stoffels 6d10c6f031 🌐 Translated using Weblate (Dutch) 2022-02-05 13:55:25 +01:00
albanobattistella 1fb5e8584a 🌐 Translated using Weblate (Italian) 2022-02-05 13:55:25 +01:00
Reda 563d72531e 🌐 Translated using Weblate (French) 2022-02-05 13:55:25 +01:00
Simon Schneegans 39baed1b29 💞 Add new sponsor 2022-02-04 20:42:02 +01:00
Simon Schneegans 318558240c 🔀 Merge pull request #96 from shemgp/patch-1 2022-02-04 14:09:46 +01:00
Shem Pasamba bda68175a0 Add version 42 since it works there 2022-02-04 13:55:35 +08:00
Simon Schneegans 3a37aa3dce 🎉 Bump version number 2022-02-03 13:20:36 +01:00
Simon Schneegans ef2bef9f87 📝 Set release date
Deploy / Extension Bundle (push) Has been cancelled
2022-02-03 13:16:38 +01:00
Simon Schneegans c99ea6617e 🌐 Translated using Weblate (German) 2022-02-03 13:14:27 +01:00
Hosted Weblate c7c4f18af6 🌐 Update translation files 2022-02-03 13:14:27 +01:00
Simon Schneegans ff1490f8c6 🌐 Update translation template 2022-02-03 13:11:47 +01:00
Simon Schneegans 0be73d8b2f 💄 Remove tagline 2022-02-03 13:11:36 +01:00
Simon Schneegans 9266655493 🔀 Merge pull request #94 from Schneegans/feature/better-templates 2022-02-03 13:06:12 +01:00
Simon Schneegans 513bbd8b85 📝 Add changelog entry 2022-02-03 12:56:23 +01:00
Simon Schneegans 6c891a60e7 📝 Add new-effect template 2022-02-03 12:56:12 +01:00
Simon Schneegans 2115c31359 📝 Improve feature request template 2022-02-03 12:46:02 +01:00
Simon Schneegans 855f8870e3 📝 Improve bug report template 2022-02-03 12:42:08 +01:00
Ulices 16d7e3c195 🌐 Translated using Weblate (Spanish) 2022-02-03 09:56:29 +01:00
Heimen Stoffels 5133f82041 🌐 Translated using Weblate (Dutch) 2022-02-03 09:56:29 +01:00
Jiří Doubravský 91a60e9813 🌐 Translated using Weblate (Czech) 2022-02-03 09:56:29 +01:00
Óscar Fernández Díaz 511e447f24 🌐 Translated using Weblate (Spanish) 2022-02-03 09:56:29 +01:00
albanobattistella 31e8cf9405 🌐 Translated using Weblate (Italian) 2022-02-03 09:56:29 +01:00
Reda 0fd8832b36 🌐 Translated using Weblate (French) 2022-02-03 09:56:29 +01:00
Simon Schneegans f111a6c3bb 💞 Add new sponsor 2022-02-02 15:53:51 +01:00
Simon Schneegans eb1d8f6ac6 📝 Add changelog entry 2022-02-02 14:43:47 +01:00
Simon Schneegans d05635b9c2 Merge branch 'main' of github.com:Schneegans/Burn-My-Windows 2022-02-02 14:42:57 +01:00
Simon Schneegans dad19c5505 🔀 Merge pull request #87 from Schneegans/fix/#86 2022-02-02 14:42:36 +01:00
Simon Schneegans 5406c88a7b 🔧 Add about dialog 2022-02-02 14:40:38 +01:00
Simon Schneegans 39f79507ac 🔧 Tweak tagline 2022-02-02 14:39:08 +01:00
Simon Schneegans 78ff080dce 💞 Add credits files 2022-02-02 14:38:54 +01:00
Simon Schneegans 6d85ce893b 📝 Add changelog entry 2022-02-02 13:13:29 +01:00
Simon Schneegans f9b82c6086 🪲 Try fixing #86 2022-02-02 13:13:16 +01:00
Heimen Stoffels 432a0a7998 🌐 Added translation using Weblate (Dutch) 2022-02-02 13:08:23 +01:00
Simon Schneegans e22eb79ccd 📝 Add trailer link 2022-02-01 16:06:41 +01:00
Jiří Doubravský d92183eff4 🌐 Added translation using Weblate (Czech) 2022-02-01 15:58:36 +01:00
Nathan 92fe4d0179 🌐 Translated using Weblate (French) 2022-02-01 15:58:36 +01:00
Reda 6e1a643e22 🌐 Translated using Weblate (French) 2022-02-01 15:58:36 +01:00
Óscar Fernández Díaz 207d79c66c 🌐 Added translation using Weblate (Spanish) 2022-02-01 15:58:36 +01:00
Théo Remon 88c9dacb31 🌐 Translated using Weblate (French) 2022-02-01 15:58:36 +01:00
Nathan a9493a6765 🌐 Translated using Weblate (French) 2022-02-01 15:58:36 +01:00
Théo Remon fdea3cd148 🌐 Translated using Weblate (French) 2022-02-01 15:58:36 +01:00
Nathan 79851e9eca 🌐 Translated using Weblate (French) 2022-02-01 15:58:36 +01:00
Théo Remon c993e02447 🌐 Translated using Weblate (French) 2022-02-01 15:58:36 +01:00
Simon Schneegans ee12f50d85 🎉 Bump version number 2022-01-31 05:59:55 +01:00
Simon Schneegans 784e2f3d9e 📝 Tweak changelog
Deploy / Extension Bundle (push) Has been cancelled
2022-01-31 05:58:04 +01:00
Simon Schneegans 1128370b83 Merge branch 'main' of github.com:Schneegans/Burn-My-Windows 2022-01-31 05:56:26 +01:00
Simon Schneegans 289bf81046 📝 Set release date 2022-01-31 05:56:21 +01:00
albanobattistella 11030d4552 🌐 Translated using Weblate (Italian) 2022-01-31 05:49:22 +01:00
albanobattistella 013d2fbcdf 🌐 Added translation using Weblate (Italian) 2022-01-31 05:41:48 +01:00
Simon Schneegans 98724af986 📝 Rephrase some changelog entries 2022-01-30 05:43:20 +01:00
Simon Schneegans bd05a3c6b6 📝 Update guide 2022-01-30 05:40:14 +01:00
Allan Nordhøy 28916e4901 🌐 Translated using Weblate (Norwegian Bokmål) 2022-01-30 05:21:32 +01:00
Allan Nordhøy 3ad2ddd516 🌐 Added translation using Weblate (Norwegian Bokmål) 2022-01-30 05:21:32 +01:00
Simon Schneegans 3f41dd0f94 🎉 Add advanced CI tests 2022-01-29 13:52:27 +01:00
Simon Schneegans fa6c7b566a 🔧 Attempt to fix occasionally corrupted windows 2022-01-29 13:30:34 +01:00
Simon Schneegans 531dfdb162 📝 Fix typo 2022-01-29 06:07:31 +01:00
Simon Schneegans 571af02170 📝 Show loc badges in README 2022-01-29 06:05:08 +01:00
Simon Schneegans 4aaf6a1823 Merge branch 'main' of github.com:Schneegans/Burn-My-Windows 2022-01-29 05:59:44 +01:00
Simon Schneegans 086f17f8b6 🎉 Add badges workflow 2022-01-29 05:59:39 +01:00
Simon Schneegans 7d1e175f54 🌐 Translated using Weblate (German) 2022-01-29 05:43:59 +01:00
Hosted Weblate 321df91031 🌐 Update translation files 2022-01-29 05:43:59 +01:00
Simon Schneegans e9e34c4984 🌐 Update translation template 2022-01-29 05:41:11 +01:00
Simon Schneegans d627048146 Merge branch 'feature/locales' 2022-01-29 05:40:35 +01:00
Simon Schneegans e56a56d11c 🔧 Add translation link to menu 2022-01-29 05:40:07 +01:00
Simon Schneegans 5a858b3270 🔀 Merge pull request #76 from Schneegans/feature/locales 2022-01-29 05:32:28 +01:00
Simon Schneegans 58a97d03a3 📝 Add some README links 2022-01-29 05:30:16 +01:00
Simon Schneegans 87b6fb7bd2 📝 Add changelog entry 2022-01-29 05:28:32 +01:00
Simon Schneegans 47580a5935 📝 Add weblate badge 2022-01-29 05:27:21 +01:00
Simon Schneegans 50c86229c0 🪲 Fix CI 2022-01-29 05:23:43 +01:00
Simon Schneegans 805680b4e5 🌐 Translated using Weblate (German) 2022-01-28 21:28:37 +01:00
Hosted Weblate 4e0c7a312d 🌐 Update translation files 2022-01-28 21:28:37 +01:00
Simon Schneegans c3949f961d 🌐 Update translation template 2022-01-28 21:26:24 +01:00
Simon Schneegans 3b164d5128 🔧 Make more strings translatable 2022-01-28 21:26:13 +01:00
Simon Schneegans 27305238df 🌐 Translated using Weblate (German) 2022-01-28 21:20:06 +01:00
Hosted Weblate 3894e4c97a 🌐 Update translation files 2022-01-28 21:20:06 +01:00
Hosted Weblate 0c4ed02e26 🌐 Update translation files 2022-01-28 21:20:06 +01:00
Simon Schneegans 95d7e4932b 🌐 Update translation template 2022-01-28 20:54:56 +01:00
Simon Schneegans 1dadccd9b5 🔧 Make fire preset names translatable 2022-01-28 20:54:36 +01:00
Simon Schneegans 57960ef0c8 🌐 Update translation template 2022-01-28 20:41:07 +01:00
Simon Schneegans fea441000d 🔧 MAke effect names translatable 2022-01-28 20:40:46 +01:00
Simon Schneegans 65969ce7a6 🔧 Add translation domains 2022-01-28 20:29:38 +01:00
Simon Schneegans e92ab9fe18 💄 Improve appearance of preview window 2022-01-28 20:26:28 +01:00
Simon Schneegans b92c4613c1 🌐 Translated using Weblate (German) 2022-01-28 20:11:11 +01:00
Hosted Weblate 59cf2f89ca 🌐 Update translation files 2022-01-28 20:11:11 +01:00
Hosted Weblate 58244cfbb4 🌐 Update translation files 2022-01-28 20:11:11 +01:00
J. Lavoie 9d324bfff3 🌐 Added translation using Weblate (French) 2022-01-28 20:11:11 +01:00
Simon Schneegans 357c506370 🔧 Add another translatable string 2022-01-28 20:09:19 +01:00
Simon Schneegans b95fbac409 🌐 Translated using Weblate (German) 2022-01-28 15:08:05 +01:00
Simon Schneegans a3fa8254f7 🌐 Added translation using Weblate (German) 2022-01-28 15:08:05 +01:00
Simon Schneegans f9b6f1ffbc 🔧 Load translations 2022-01-28 15:00:35 +01:00
Simon Schneegans fc902f2a73 🌐 Update translation template 2022-01-28 15:00:22 +01:00
Simon Schneegans 1692be778c 🌐 Add initial translation template 2022-01-28 14:35:23 +01:00
Simon Schneegans d014ec2841 🔧 Compile locales 2022-01-28 14:35:04 +01:00
Simon Schneegans 6ff16dc693 🔀 Merge pull request #71 from Schneegans/feature/fixes 2022-01-28 14:05:45 +01:00
Simon Schneegans c41bef6413 🪲 Fix occasional empty window 2022-01-28 14:04:40 +01:00
Simon Schneegans bcb7619d37 🔧 Disconnect from transitions-completed 2022-01-28 07:54:20 +01:00
Simon Schneegans f87a0a649b 🔧 Use opacity transition for uProgress 2022-01-28 07:50:10 +01:00
Simon Schneegans 51ba0d06ab 📝 Improve comments 2022-01-28 07:49:48 +01:00
Simon Schneegans dcaa28c200 🔧 Improve timing of energize b 2022-01-27 21:43:55 +01:00
Simon Schneegans 765cf6d54c 🔧 Improve timing of tv effect 2022-01-27 21:40:58 +01:00
Simon Schneegans 7b7b5cbb46 🔧 Improve timing of trex attack 2022-01-27 21:34:11 +01:00
Simon Schneegans bc2f39fac8 🔧 Improve timing of energize b 2022-01-27 21:33:53 +01:00
Simon Schneegans c9000fcad7 🪲 Fix blending of fire shader 2022-01-27 21:33:33 +01:00
Simon Schneegans 6914771bb5 🔀 Merge pull request #69 from Schneegans/feature/reverse 2022-01-27 21:01:10 +01:00
Simon Schneegans e2d9015490 📝 Add plenty of comments 2022-01-27 20:59:02 +01:00
Simon Schneegans acff1da6c2 🪲 Prevent registering the same type twice 2022-01-27 06:53:30 +01:00
Simon Schneegans 68712fb842 📝 Add changelog entry 2022-01-27 06:16:07 +01:00
Simon Schneegans 5ff2632499 🔧 Reduce default energize b time 2022-01-27 06:09:18 +01:00
Simon Schneegans 1b79cd4aa4 🔧 Remove debug print 2022-01-27 05:53:13 +01:00
Simon Schneegans a8d75de4c9 💄 Only add headerbar on GTK4 2022-01-27 05:52:49 +01:00
Simon Schneegans 38458e4a4c 🪲 Fix some GNOME 3.36 and 3.38 issues 2022-01-27 05:47:59 +01:00
Simon Schneegans c107083cde 🪲 Fix some GNOME 3.36 issues 2022-01-27 05:46:10 +01:00
Simon Schneegans f5e58b100f 🪲 Fix some GNOME 3.36 issues 2022-01-27 05:31:38 +01:00
Simon Schneegans bf95e349da 🪲 Fix some GNOME 3.36 issues 2022-01-27 05:24:32 +01:00
Simon Schneegans f1b764062b 🪲 Fix some GNOME 3.36 issues 2022-01-27 05:21:15 +01:00
Simon Schneegans 6b218d049f 🔨 Initial attempt on window-opening animation 2022-01-27 05:07:30 +01:00
Simon Schneegans b6cb78330d 💄 Add headerbar to preview windows 2022-01-27 05:07:00 +01:00
Simon Schneegans 28754a93c2 🔧 Reduce default animation time of some effects 2022-01-24 20:36:23 +01:00
Simon Schneegans ba79b5b611 🎉 Make it possible to select window open effects 2022-01-24 20:34:50 +01:00
Simon Schneegans 7875060375 🔀 Merge pull request #68 from Schneegans/feature/fix-35 2022-01-23 16:43:25 +01:00
Simon Schneegans 14ba603f22 🎉 Add matrix overshooting option 2022-01-23 16:42:02 +01:00
Simon Schneegans 982a2c76c3 🔀 Merge pull request #67 from Schneegans/feature/preview 2022-01-23 13:49:56 +01:00
Simon Schneegans 799e1e6b24 📝 Add changelog entry 2022-01-23 13:48:30 +01:00
Simon Schneegans 3c046bd2ef 🪲 Fix dialog handling 2022-01-23 13:44:19 +01:00
Simon Schneegans 0f9103d1f0 💄 Tweak preview button 2022-01-23 13:43:51 +01:00
Simon Schneegans 783f5c695d 🔧 GTK3 fixes 2022-01-23 13:19:18 +01:00
Simon Schneegans 8475ae29ba 🔧 Use more robust preview logic 2022-01-23 13:13:55 +01:00
Simon Schneegans 242625ee9f 🎉 Add a preview button to each effect page 2022-01-23 06:44:28 +01:00
Simon Schneegans b2f11f494d 🔧 Add custom gtk style sheet 2022-01-23 06:34:37 +01:00
Simon Schneegans fd5871b924 💄 Add new menu entry 2022-01-23 06:33:39 +01:00
Simon Schneegans a5f7769e58 ♻️ Refactor how preferences pages are set up 2022-01-22 20:24:38 +01:00
Simon Schneegans 55727f7c2b 🔀 Merge pull request #64 from Schneegans/feature/broken-glass 2022-01-22 12:45:03 +01:00
Simon Schneegans 33ac6fa80c 🔧 Use 'unmanged' signal to adjust window clone transitions 2022-01-22 12:38:14 +01:00
Simon Schneegans 07cbe89ffd 💞 Add new sponsor 2022-01-21 21:38:43 +01:00
Simon Schneegans 61fbdcbc49 🪲 Try fix accessing deleted window previews 2022-01-21 21:36:56 +01:00
Simon Schneegans 8bdfb822a1 📝 Add version disclaimer 2022-01-21 21:13:55 +01:00
Simon Schneegans ff97d7292c 📝 Add new effect 2022-01-21 21:09:07 +01:00
Simon Schneegans c998896cc1 🔧 Tweak defaults 2022-01-21 21:00:09 +01:00
Simon Schneegans 98fc36d039 📝 Add changelog entry 2022-01-21 20:57:41 +01:00
Simon Schneegans cf0b268019 💄 Tweak label 2022-01-21 20:55:05 +01:00
Simon Schneegans e2153bece1 🪲 Fix error message 2022-01-21 20:54:53 +01:00
Simon Schneegans c7001de666 📝 Add comments 2022-01-21 20:46:36 +01:00
Simon Schneegans 3985697573 🎉 Add broken glass effect 2022-01-21 20:18:11 +01:00
Simon Schneegans 8f8f4dc7c0 🎉 Allow setting actor transitions in overview 2022-01-21 20:17:24 +01:00
Simon Schneegans 156cefcd1d 🔧 Ignore temporary blender files 2022-01-21 19:29:45 +01:00
Simon Schneegans 0b9c2a252f 🔧 Pass actor to shader creation method 2022-01-21 19:29:26 +01:00
Simon Schneegans 627b1c5bfe 🎨 Add shards texture 2022-01-21 19:27:44 +01:00
Simon Schneegans 4409337cc3 💞 Add new sponsor 2022-01-19 21:02:35 +01:00
Simon Schneegans c91a1203fb 🎉 Bump version number 2022-01-18 20:38:13 +01:00
204 changed files with 65266 additions and 927 deletions
+2
View File
@@ -1,4 +1,6 @@
BasedOnStyle: Google BasedOnStyle: Google
AlignConsecutiveAssignments: true AlignConsecutiveAssignments: true
AlignAfterOpenBracket: Align
ContinuationIndentWidth: 2
KeepEmptyLinesAtTheStartOfBlocks: true KeepEmptyLinesAtTheStartOfBlocks: true
ColumnLimit: 90 ColumnLimit: 90
+1 -1
View File
@@ -6,7 +6,7 @@ open_collective: # Replace with a single Open Collective username
ko_fi: # Replace with a single Ko-fi username ko_fi: # Replace with a single Ko-fi username
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username liberapay: # Schneegans
issuehunt: # Replace with a single IssueHunt username issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username otechie: # Replace with a single Otechie username
custom: ['https://www.paypal.com/donate/?hosted_button_id=3F7UFL8KLVPXE'] custom: ['https://www.paypal.com/donate/?hosted_button_id=3F7UFL8KLVPXE']
+3 -4
View File
@@ -17,14 +17,13 @@ Steps to reproduce the behavior:
4. See error 4. See error
You may also check the output of GNOME Shell for any error messages. You may also check the output of GNOME Shell for any error messages.
This can be done with the following terminal command: This can be done with the following terminal command.
Execute this in a terminal and observe the output while reproducing the bug.
```bash
journalctl -f -o cat | grep -E 'burn-my-windows|' journalctl -f -o cat | grep -E 'burn-my-windows|'
``` ```
## Expected Behavior
A clear and concise description of what you expected to happen.
## System ## System
_Please complete the following information:_ _Please complete the following information:_
- Linux distribution [e.g. Ubuntu 21.04] - Linux distribution [e.g. Ubuntu 21.04]
+6 -8
View File
@@ -1,16 +1,14 @@
--- ---
name: Feature Request name: General Feature Request
about: Suggest an idea for the Burn-My-Windows Extension. about: Suggest an idea for the Burn-My-Windows Extension.
title: '' title: ''
labels: enhancement labels: 'feature request'
assignees: '' assignees: ''
--- ---
## The Motivation ## The Idea
A clear and concise description of use-case. A clear and concise description of your idea.
If applicable, feel free to add screenshots or mock-ups to illustrate your idea!
## The Solution
A clear and concise description of what you want to happen.
## The Alternatives ## The Alternatives
A clear and concise description of any alternative solutions or features you've considered. Are there alternative solutions or features you've considered?
+17
View File
@@ -0,0 +1,17 @@
---
name: New Effect
about: Suggest a new effect for the Burn-My-Windows Extension.
title: ''
labels: 'new effect'
assignees: ''
---
## The Idea
Please describe your idea as detailed as possible.
It would be great if you could add a drawing or any other kind of mock-up to illustrate your idea!
## Window Closing vs. Window Opening
Make sure to describe how the effect could be reversed, so how should a window disappear and how should it appear.
## References
It would be great if you could provide some video references (e.g. YouTube links) if your idea is based on something which - for example - exists in movies.
+40
View File
@@ -0,0 +1,40 @@
name: Badges
on:
push:
branches:
- main
jobs:
update-badges:
name: Update Badges
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v2
- name: Download cloc
run: sudo apt-get update -y && sudo apt-get install -y cloc
- name: Get the Numbers
run: |
echo "CODE_LINES=$(scripts/cloc.sh --loc)" >> $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
with:
auth: ${{ secrets.GIST_SECRET }}
gistID: 8cf45f23253ff09b21196e7271378762
filename: loc.json
label: Lines of Code
message: ${{ env.CODE_LINES }}
color: lightgrey
labelColor: 303030
- name: Create Comments-Badge
uses: schneegans/dynamic-badges-action@v1.2.0
with:
auth: ${{ secrets.GIST_SECRET }}
gistID: 8cf45f23253ff09b21196e7271378762
filename: comments.json
label: Comments
message: ${{ env.COMMENT_LINES }}
color: green
labelColor: 303030
+28
View File
@@ -76,7 +76,35 @@ jobs:
( contains(github.ref, 'main') && !contains(github.event.head_commit.message, '[no-ci]') ) || ( contains(github.ref, 'main') && !contains(github.event.head_commit.message, '[no-ci]') ) ||
( contains(github.ref, 'develop') && !contains(github.event.head_commit.message, '[no-ci]') ) || ( contains(github.ref, 'develop') && !contains(github.event.head_commit.message, '[no-ci]') ) ||
contains(github.event.head_commit.message, '[run-ci]') contains(github.event.head_commit.message, '[run-ci]')
strategy:
fail-fast: false
matrix:
version:
- '32'
- '33'
- '34'
- '35'
- '36'
session:
- 'gnome-xsession'
- 'gnome-wayland-nested'
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Download Dependencies
run: |
sudo apt update -qq
sudo apt install gettext -qq
- name: Build Burn-My-Windows - name: Build Burn-My-Windows
run: make run: make
- name: Test Burn-My-Windows
run: sudo $GITHUB_WORKSPACE/tests/run-test.sh -v ${{ matrix.version }} -s ${{ matrix.session }}
- uses: actions/upload-artifact@v2
if: failure()
with:
name: log_${{ matrix.version }}_${{ matrix.session }}
path: fail.log
- uses: actions/upload-artifact@v2
if: failure()
with:
name: screen_${{ matrix.version }}_${{ matrix.session }}
path: fail.png
+2 -3
View File
@@ -6,7 +6,7 @@ on:
- '**' - '**'
jobs: jobs:
source_code: extension_bundle:
name: Extension Bundle name: Extension Bundle
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
@@ -20,10 +20,9 @@ jobs:
run: | run: |
make zip make zip
- name: Upload Release - name: Upload Release
uses: svenstaro/upload-release-action@v1-release uses: svenstaro/upload-release-action@2.2.1
with: with:
repo_token: ${{ secrets.GITHUB_TOKEN }} repo_token: ${{ secrets.GITHUB_TOKEN }}
file: burn-my-windows@schneegans.github.com.zip file: burn-my-windows@schneegans.github.com.zip
asset_name: burn-my-windows@schneegans.github.com.zip
tag: ${{ github.ref }} tag: ${{ github.ref }}
overwrite: true overwrite: true
+4
View File
@@ -1,5 +1,9 @@
*~ *~
*.zip *.zip
*.blend1
*.blend2
*.blend3
/locale
/schemas/gschemas.compiled /schemas/gschemas.compiled
/resources/burn-my-windows.gresource /resources/burn-my-windows.gresource
/resources/burn-my-windows.gresource.xml /resources/burn-my-windows.gresource.xml
+91 -31
View File
@@ -1,51 +1,111 @@
SHELL := /bin/bash SHELL := /bin/bash
# We define these here to make the makefile easier to port to another extension.
NAME := burn-my-windows
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" \)) JS_FILES = $(shell find -type f -and \( -name "*.js" \))
UI_FILES = $(shell find -type f -and \( -name "*.ui" \))
RESOURCE_FILES = $(shell find resources -mindepth 2 -type f) 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))
.PHONY: zip install uninstall clean # These files will be included in the extension zip file.
ZIP_CONTENT = $(JS_FILES) $(LOCALES_MO) resources/$(NAME).gresource \
schemas/gschemas.compiled metadata.json LICENSE
zip: burn-my-windows@schneegans.github.com.zip # These seven recipes can be invoked by the user.
.PHONY: zip install uninstall pot clean test references
install: burn-my-windows@schneegans.github.com.zip # The zip recipes only bundles the extension without installing it.
gnome-extensions install "burn-my-windows@schneegans.github.com.zip" --force zip: $(ZIP_NAME)
# The install recipes creates the extension zip and installs it.
install: $(ZIP_NAME)
gnome-extensions install "$(ZIP_NAME)" --force
@echo "Extension installed successfully! Now restart the Shell ('Alt'+'F2', then 'r')." @echo "Extension installed successfully! Now restart the Shell ('Alt'+'F2', then 'r')."
# This uninstalls the previously installed extension.
uninstall: uninstall:
gnome-extensions uninstall "burn-my-windows@schneegans.github.com" gnome-extensions uninstall "$(NAME)@$(DOMAIN)"
# Use gettext to generate a translation template file.
pot: $(JS_FILES) $(UI_FILES)
@echo "Generating '$(NAME).pot'..."
@xgettext --from-code=UTF-8 \
--add-comments=Translators \
--copyright-holder="Simon Schneegans" \
--package-name="$(NAME)" \
--output=po/$(NAME).pot \
$(JS_FILES) $(UI_FILES)
# This runs several tests in containerized versions of GNOME Shell.
test:
@ for version in 32 33 34 35 36 ; do \
for session in "gnome-xsession" "gnome-wayland-nested" ; do \
echo ; \
echo "Running Tests on Fedora $$version ($$session)." ; \
echo ; \
./tests/run-test.sh -s $$session -v $$version ; \
done \
done
# This re-generates all reference images required by the tests.
references:
@ for version in 32 33 34 35 36 ; do \
for session in "gnome-xsession" "gnome-wayland-nested" ; do \
echo ; \
echo "Generating References for Fedora $$version ($$session)." ; \
echo ; \
./tests/generate-references.sh -s $$session -v $$version ; \
done \
done
# This removes all temporary files created with the other recipes.
clean: clean:
rm -rf \ rm -rf $(ZIP_NAME) \
burn-my-windows@schneegans.github.com.zip \ resources/$(NAME).gresource \
resources/burn-my-windows.gresource \ resources/$(NAME).gresource.xml \
resources/burn-my-windows.gresource.xml \ schemas/gschemas.compiled \
schemas/gschemas.compiled locale
burn-my-windows@schneegans.github.com.zip: schemas/gschemas.compiled resources/burn-my-windows.gresource $(JS_FILES)
@# Check if the VERSION variable was passed and set version to it
@if [[ "$(VERSION)" != "" ]]; then \
sed -i "s| \"version\":.*| \"version\": $(VERSION)|g" metadata.json; \
fi
@# TODO Maybe echo version number of the release that was built, in order to facilitate double-checking before publishing it?
# This bundles the extension and checks whether it is small enough to be uploaded to
# extensions.gnome.org. We do not use "gnome-extensions pack" for this, as this is not
# readily available on the GitHub runners.
$(ZIP_NAME): $(ZIP_CONTENT)
@echo "Packing zip file..." @echo "Packing zip file..."
@rm --force burn-my-windows@schneegans.github.com.zip @rm --force $(ZIP_NAME)
@zip -r burn-my-windows@schneegans.github.com.zip -- *.js src/*.js resources/burn-my-windows.gresource schemas/gschemas.compiled metadata.json LICENSE @zip $(ZIP_NAME) -- $(ZIP_CONTENT)
@#Check if the zip size is too big to be uploaded @#Check if the zip size is too big to be uploaded
@if [[ "$$(stat -c %s burn-my-windows@schneegans.github.com.zip)" -gt 4096000 ]]; then \ @SIZE=$$(unzip -Zt $(ZIP_NAME) | awk '{print $$3}') ; \
echo "ERROR! The extension is too big to be uploaded to the extensions website, keep it smaller than 4096 KB!"; exit 1; \ if [[ $$SIZE -gt 5242880 ]]; then \
echo "ERROR! The extension is too big to be uploaded to" \
"the extensions website, keep it smaller than 5 MB!"; \
exit 1; \
fi fi
resources/burn-my-windows.gresource: resources/burn-my-windows.gresource.xml # Compiles the gschemas.compiled file from the gschema.xml file.
@echo "Compiling resources..." schemas/gschemas.compiled: schemas/org.gnome.shell.extensions.$(NAME).gschema.xml
@glib-compile-resources --sourcedir="resources" --generate resources/burn-my-windows.gresource.xml
resources/burn-my-windows.gresource.xml: $(RESOURCE_FILES)
@echo "Creating resources xml..."
@FILES=$$(find "resources" -mindepth 2 -type f -printf "%P\n" | xargs -i echo "<file>{}</file>") ; \
echo "<?xml version='1.0' encoding='UTF-8'?><gresources><gresource> $$FILES </gresource></gresources>" > resources/burn-my-windows.gresource.xml
schemas/gschemas.compiled: schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml
@echo "Compiling schemas..." @echo "Compiling schemas..."
@glib-compile-schemas schemas @glib-compile-schemas schemas
# Compiles the gresource file from the gresources.xml.
resources/$(NAME).gresource: resources/$(NAME).gresource.xml
@echo "Compiling resources..."
@glib-compile-resources --sourcedir="resources" --generate resources/$(NAME).gresource.xml
# Generates the gresources.xml based on all files in the resources subdirectory.
resources/$(NAME).gresource.xml: $(RESOURCE_FILES)
@echo "Creating resources xml..."
@FILES=$$(find "resources" -mindepth 2 -type f -printf "%P\n" | xargs -i echo "<file>{}</file>") ; \
echo "<?xml version='1.0' encoding='UTF-8'?><gresources><gresource> $$FILES </gresource></gresources>" \
> resources/$(NAME).gresource.xml
# Compiles all *.po files to *.mo files.
locale/%/LC_MESSAGES/$(NAME).mo: po/%.po
@echo "Compiling $@"
@mkdir -p locale/$*/LC_MESSAGES
@msgfmt -c -o $@ $<
+20 -5
View File
@@ -1,8 +1,17 @@
# 🔥 Set GNOME Shell on Fire! <p align="center">
<a href="https://www.youtube.com/watch?v=L2aaNF_rPHo"><img src ="docs/pics/teaser.jpg" /></a>
</p>
<h1 align="center">🔥 Set GNOME Shell on Fire!</h1>
<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/>
<a href="https://github.com/Schneegans/Burn-My-Windows/actions"><img src="https://github.com/Schneegans/Burn-My-Windows/workflows/Checks/badge.svg?branch=main" /></a> <a href="https://github.com/Schneegans/Burn-My-Windows/actions"><img src="https://github.com/Schneegans/Burn-My-Windows/workflows/Checks/badge.svg?branch=main" /></a>
<a href="LICENSE"><img src="https://img.shields.io/badge/License-GPLv3-blue.svg?labelColor=303030" /></a> <a href="LICENSE"><img src="https://img.shields.io/badge/License-GPLv3-blue.svg?labelColor=303030" /></a>
<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> <a href="https://hosted.weblate.org/engage/burn-my-windows/"><img src="https://img.shields.io/weblate/progress/burn-my-windows?label=Translated&logo=weblate&logoColor=lightgray&labelColor=303030" /></a>
<a href="scripts/cloc.sh"><img src="https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/Schneegans/8cf45f23253ff09b21196e7271378762/raw/loc.json" /></a>
<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/), 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)! 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)!
@@ -12,6 +21,7 @@ For a list of things changed in previous releases, you can have a look at the [c
Effect | Preview Effect | Preview
-----|-------- -----|--------
**Broken Glass** <br> Shatter your windows into a shower sharp shards! This effect can be configured so that the shards fly away from your mouse pointer position! <br><br> _Only available in GNOME Shell 40+_ | <img src ="docs/pics/glass.gif" />
**Energize A** <br> Beam your windows away! | <img src ="docs/pics/energizeA.gif" /> **Energize 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" /> **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" /> **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" />
@@ -24,7 +34,7 @@ Effect | Preview
## 💞 These People _love_ this Extension ## 💞 These People _love_ this Extension
While coding new features is the most awesome way to contribute, providing financial support will help me stay motivated to invest my spare time to keep the project alive in the future. While [coding new features](docs/how-to-create-new-effects.md) or [translating the extension](https://hosted.weblate.org/engage/burn-my-windows/) are the most awesome ways to contribute, providing financial support will help me stay motivated to invest my spare time to keep the project alive in the future.
<h3 align="center">🥇 Current Gold Sponsors</h3> <h3 align="center">🥇 Current Gold Sponsors</h3>
<p align="center"> <p align="center">
@@ -33,17 +43,22 @@ While coding new features is the most awesome way to contribute, providing finan
<h3 align="center">🥈 Current Silver Sponsors</h3> <h3 align="center">🥈 Current Silver Sponsors</h3>
<p align="center"> <p align="center">
<a href="https://twitter.com/tjiiik">tj3k</a><br>
<a href="https://github.com/MRR-dev">@MRR-dev</a><br> <a href="https://github.com/MRR-dev">@MRR-dev</a><br>
<a href="https://github.com/castrojo">Jorge Castro</a><br> <a href="https://github.com/castrojo">Jorge Castro</a><br>
</p> </p>
<h3 align="center">🥉 Current Bronze Sponsors</h3> <h3 align="center">🥉 Current Bronze Sponsors</h3>
<p align="center"> <p align="center">
<a href="https://github.com/sponsors/Schneegans">Be the first!</a> <a href="https://github.com/danielheadbang">@danielheadbang</a><br>
</p> </p>
<h3 align="center">🏅 Previous Sponsors and One-Time Donators</h3> <h3 align="center">🏅 Previous Sponsors and One-Time Donators</h3>
<p align="center"> <p align="center">
<a href="https://github.com/MrTomRod">@MrTomRod</a><br>
Pouhiou<br>
DAPREMONT Christophe<br>
<a href="https://github.com/manero6">@manero6</a><br>
<a href="https://github.com/RickStanley">@RickStanley</a><br> <a href="https://github.com/RickStanley">@RickStanley</a><br>
</p> </p>
@@ -113,7 +128,7 @@ gnome-extensions enable burn-my-windows@schneegans.github.com
## :octocat: I want to contribute! ## :octocat: I want to contribute!
That's great! That's great!
Most likely, you want to [create a new effect](docs/how-to-create-new-effects.md)? Most likely, you want to [create a new effect](docs/how-to-create-new-effects.md) or to [translate the extension](https://hosted.weblate.org/engage/burn-my-windows/)?
Here are some basic rules to get you started: Here are some basic rules to get you started:
Commits should start with a Capital letter and should be written in present tense (e.g. __:tada: Add cool new feature__ instead of __:tada: Added cool new feature__). Commits should start with a Capital letter and should be written in present tense (e.g. __:tada: Add cool new feature__ instead of __:tada: Added cool new feature__).
You should also start your commit message with **one** applicable emoji. You should also start your commit message with **one** applicable emoji.
+3795
View File
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 968 KiB

Binary file not shown.
+54986
View File
File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 4.1 MiB

+90
View File
@@ -1,5 +1,95 @@
# Changelog of the Burn-My-Windows Extension # Changelog of the Burn-My-Windows Extension
## [Burn My Window 14](https://github.com/schneegans/Burn-My-Windows/releases/tag/v14)
**Release Date:** 2022-03-29
#### Enhancements
* Reduced the lower animation time limits for all effects to 100 ms. This should now allow for very snappy animations!
* A completely new Russian translation. Thank you, ANIGO R.!
#### Bug Fixes
* Fixed the version check for GNOME Shell `42.rc` (before it only worked on `42.alpha` and `42.beta`)
## [Burn My Window 13](https://github.com/schneegans/Burn-My-Windows/releases/tag/v13)
**Release Date:** 2022-03-27
#### Enhancements
* The continuous integration tests have been significantly enhanced. Now, all window-open and window-close animations are visually tested on all supported GNOME versions and on X11 / Wayland (summing up to a total of 136 test cases).
* Many translation updates, including a completely new Turkish and Chinese translation. A BIG THANKS to all translators!
#### Other Changes
* Removed the Liberapay donation option as it does not work properly.
#### Bug Fixes
* Fixed the version check for GNOME Shell 42.
## [Burn My Window 12](https://github.com/schneegans/Burn-My-Windows/releases/tag/v12)
**Release Date:** 2022-02-19
#### New Features
* Added initial support for GNOME Shell 42.
* The preferences dialog now uses libadwaita on GNOME Shell 42.
#### Enhancements
* Added [Liberapay](https://liberapay.com/Schneegans) to the sponsorship options.
## [Burn My Window 11](https://github.com/schneegans/Burn-My-Windows/releases/tag/v11)
**Release Date:** 2022-02-03
#### New Features
* Added an about-dialog which shows all translators and sponsors.
#### Enhancements
* There are several new translations! Thanks a lot to all the translators! We now have translations for:
* German
* English
* Czech
* Dutch
* French
* Italian
* Norwegian Bokmål
* Spanish
* A new issue template for suggesting new effects has been added.
#### Fixes
* Fixed an issue which caused corrupted windows when trying to maximize windows while the window-open animation was still running (#82, #86, #91).
## [Burn My Window 10](https://github.com/schneegans/Burn-My-Windows/releases/tag/v10)
**Release Date:** 2022-01-31
#### New Features
<a href="https://youtu.be/L2aaNF_rPHo"><img align="right" src ="pics/bmw10.jpg" /></a>
* **Effects for Window Opening.** You can now select effects which are applied on newly opened windows! I expect that there are some bugs left, so please [report any issue you find](https://github.com/Schneegans/Burn-My-Windows/issues)!
* **New Effect: Broken Glass.** Shatter your windows into a shower sharp shards! This effect can be configured so that the shards fly away from your mouse pointer position!
* **Preview Buttons** have been added to the effect-configuration pages of the preferences dialog. These can be used to, well, preview the current settings (without having to enable the effect first).
* **Translations!** It is now possible to [translate the preferences dialog](https://hosted.weblate.org/engage/burn-my-windows/). There is already a finished German translation, and in-progress translations to Italian and Norwegian Bokmål.
* **A "Vertical Overshooting" option** was added to the Matrix Effect: This can add some vertical variation to the start and end position of the letter drops.
#### Other Enhancements
* Added a menu entry with a link to the guide for creating new effect types.
* Thanks to improved timing, the default animation time of several effects could be reduced.
* The README now shows the current lines of code and the current comment percentage using my [dynamic-badges-action](https://github.com/Schneegans/dynamic-badges-action).
* **Add advanced CI tests:** For each commit to `main`, it is now tested whether the extension can be installed and if the preferences dialog can be shown on GNOME Shell 3.36, 3.38, 40, and 41. Both, X11 and Wayland are checked.
## [Burn My Window 9](https://github.com/schneegans/Burn-My-Windows/releases/tag/v9) ## [Burn My Window 9](https://github.com/schneegans/Burn-My-Windows/releases/tag/v9)
**Release Date:** 2022-01-18 **Release Date:** 2022-01-18
+43 -46
View File
@@ -34,14 +34,14 @@ Of course, you can replace any occurrence of this name and its nick `simple-fade
Three simple steps are required to create a new effect. Three simple steps are required to create a new effect.
You will have to ... You will have to ...
1. add a preferences key for enabling the effect, 1. add preferences keys for enabling the effect,
2. create an additional effects class, and finally 2. create an additional effects class, and finally
3. register the new effect in two places. 3. register the new effect in two places.
### 1. Expanding the Schema ### 1. Expanding the Schema
For enabling the new effect, the boolean settings key `simple-fade-close-effect` is required. For enabling the new effect, the boolean settings keys `simple-fade-open-effect`, `simple-fade-close-effect`, and `simple-fade-animation-time` are required.
In this example, we also add an integer valued settings key for storing the animation time of the new effect and a floating point value for storing another property of the effect - we will use them later in the tutorial. In this example, we also add a floating point value for storing another property of the effect - we will use them later in the tutorial.
Just copy the XML code below to the file [`schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml`](../schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml). Just copy the XML code below to the file [`schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml`](../schemas/org.gnome.shell.extensions.burn-my-windows.gschema.xml).
Just remember to replace `simple-fade` with your custom name! Just remember to replace `simple-fade` with your custom name!
@@ -56,6 +56,12 @@ Just remember to replace `simple-fade` with your custom name!
<description>Use the Simple Fade effect for window closing.</description> <description>Use the Simple Fade effect for window closing.</description>
</key> </key>
<key name="simple-fade-open-effect" type="b">
<default>false</default>
<summary>Simple Fade Open Effect</summary>
<description>Use the Simple Fade effect for window opening.</description>
</key>
<key name="simple-fade-animation-time" type="i"> <key name="simple-fade-animation-time" type="i">
<default>1500</default> <default>1500</default>
<summary>Simple Fade Animation Time</summary> <summary>Simple Fade Animation Time</summary>
@@ -121,7 +127,8 @@ var SimpleFade = class SimpleFade {
// This will be called in various places where a unique identifier for this effect is // 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 // required. It should match the prefix of the settings keys which store whether the
// effect is enabled currently (e.g. the '*-close-effect'). // effect is enabled currently (e.g. '*-close-effect'), and its animation time
// (e.g. '*-animation-time').
static getNick() { static getNick() {
return 'simple-fade'; return 'simple-fade';
} }
@@ -137,35 +144,34 @@ var SimpleFade = class SimpleFade {
// This is called by the preferences dialog. It loads the settings page for this effect, // 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 // binds all properties to the settings and appends the page to the main stack of the
// preferences dialog. // preferences dialog.
static initPreferences(dialog) { static getPreferences(dialog) {
// Empty for now... Code is added here later in the tutorial! // Empty for now... Code is added here later in the tutorial!
return null;
} }
// ---------------------------------------------------------------- API for extension.js // ---------------------------------------------------------------- API for extension.js
// This is called from extension.js whenever a window is closed with this effect. // This is called from extension.js whenever a window is closed with this effect.
static createShader(settings) { static createShader(actor, settings, forOpening) {
return new Shader(settings); return new Shader(settings, forOpening);
} }
// This is also called from extension.js. It is used to tweak the ongoing transitions of // The tweakTransition() is called from extension.js to tweak a window's open / close
// the actor - usually windows are faded to transparency and scaled down slightly by // transitions - usually windows are faded in / out and scaled up / down by GNOME Shell.
// GNOME Shell. Here, we modify this behavior as well as the transition duration. // The parameter 'forOpening' is set to true if this is called for a window-open
static tweakTransitions(actor, settings) { // transition, for a window-close transition it is set to false. The modes can be set to
const animationTime = settings.get_int('simple-fade-animation-time'); // 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+.
const tweakTransition = (property, value) => { // For this effect, windows should neither be scaled nor faded.
const transition = actor.get_transition(property); static tweakTransition(actor, settings, forOpening) {
if (transition) { return {
transition.set_to(value); 'opacity': {from: 255, to: 255, mode: 4},
transition.set_duration(animationTime); 'scale-x': {from: 1.0, to: 1.0, mode: 4},
} 'scale-y': {from: 1.0, to: 1.0, mode: 4}
}; };
// We re-target these transitions so that the window is neither scaled nor faded.
tweakTransition('opacity', 255);
tweakTransition('scale-x', 1);
tweakTransition('scale-y', 1);
} }
} }
@@ -182,7 +188,7 @@ if (utils.isInShellProcess()) {
const shaderSnippets = Me.imports.src.shaderSnippets; const shaderSnippets = Me.imports.src.shaderSnippets;
Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect { Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect {
_init(settings) { _init(settings, forOpening) {
super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER}); super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
this.set_shader_source(` this.set_shader_source(`
@@ -207,8 +213,10 @@ if (utils.isInShellProcess()) {
// Radial distance from window edge to the window's center. // 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); 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. // This gradually dissolves from [1..0] from the outside to the center. We
float mask = (1.0 - uProgress * (1.0 + FADE_WIDTH) - dist + FADE_WIDTH) / FADE_WIDTH; // 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. // Make the mask smoother.
mask = smoothstep(0, 1, mask); mask = smoothstep(0, 1, mask);
@@ -259,7 +267,7 @@ There should be two sliders in this example: The animation duration and the widt
If your effect supports GNOME Shell 3.3x _and_ GNOME Shell 40+, you will have to provide two `*.ui` files for this. If your effect supports GNOME Shell 3.3x _and_ GNOME Shell 40+, you will have to provide two `*.ui` files for this.
This is because starting with GNOME Shell 40, the preference dialog uses GTK4, before it used to use GTK3. This is because starting with GNOME Shell 40, the preference dialog uses GTK4, before it used to use GTK3.
Usually, there are only a few minor differences between the two files. Usually, there are only a few minor differences between the two files.
We will load the respective file in the `initPreferences()` method of your new effect class. We will load the respective file in the `getPreferences()` method of your new effect class.
Just save the code below to `resources/ui/gtk3/SimpleFade.ui` and `resources/ui/gtk4/SimpleFade.ui` respectively. Just save the code below to `resources/ui/gtk3/SimpleFade.ui` and `resources/ui/gtk4/SimpleFade.ui` respectively.
Remember to replace any occurrence of `simple-fade` with your effect's nick-name! Remember to replace any occurrence of `simple-fade` with your effect's nick-name!
@@ -287,10 +295,6 @@ Remember to replace any occurrence of `simple-fade` with your effect's nick-name
<object class="GtkBox" id="simple-fade-prefs"> <object class="GtkBox" id="simple-fade-prefs">
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="margin-start">60</property>
<property name="margin-end">60</property>
<property name="margin-top">60</property>
<property name="margin-bottom">60</property>
<child> <child>
<object class="GtkFrame"> <object class="GtkFrame">
@@ -338,7 +342,7 @@ Remember to replace any occurrence of `simple-fade` with your effect's nick-name
<property name="icon-size">1</property> <property name="icon-size">1</property>
</object> </object>
</child> </child>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -386,7 +390,7 @@ Remember to replace any occurrence of `simple-fade` with your effect's nick-name
<property name="icon-size">1</property> <property name="icon-size">1</property>
</object> </object>
</child> </child>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -432,10 +436,6 @@ Remember to replace any occurrence of `simple-fade` with your effect's nick-name
<object class="GtkBox" id="simple-fade-prefs"> <object class="GtkBox" id="simple-fade-prefs">
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="margin-start">60</property>
<property name="margin-end">60</property>
<property name="margin-top">60</property>
<property name="margin-bottom">60</property>
<child> <child>
<object class="GtkFrame"> <object class="GtkFrame">
@@ -475,7 +475,7 @@ Remember to replace any occurrence of `simple-fade` with your effect's nick-name
<child> <child>
<object class="GtkButton" id="reset-simple-fade-animation-time"> <object class="GtkButton" id="reset-simple-fade-animation-time">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -514,7 +514,7 @@ Remember to replace any occurrence of `simple-fade` with your effect's nick-name
<child> <child>
<object class="GtkButton" id="reset-simple-fade-width"> <object class="GtkButton" id="reset-simple-fade-width">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -539,10 +539,10 @@ Remember to replace any occurrence of `simple-fade` with your effect's nick-name
### Loading the Preferences Page ### Loading the Preferences Page
In order to load the above `*.ui` files, add the following code to your effect's `initPreferences()` method. In order to load the above `*.ui` files, add the following code to your effect's `getPreferences()` method.
```javascript ```javascript
static initPreferences(dialog) { static getPreferences(dialog) {
// Add the settings page to the builder. // Add the settings page to the builder.
dialog.getBuilder().add_from_resource(`/ui/${utils.getGTKString()}/SimpleFade.ui`); dialog.getBuilder().add_from_resource(`/ui/${utils.getGTKString()}/SimpleFade.ui`);
@@ -552,11 +552,8 @@ static initPreferences(dialog) {
dialog.bindAdjustment('simple-fade-animation-time'); dialog.bindAdjustment('simple-fade-animation-time');
dialog.bindAdjustment('simple-fade-width'); dialog.bindAdjustment('simple-fade-width');
// Finally, append the settings page to the main stack. // Finally, return the new settings page.
const stack = dialog.getBuilder().get_object('main-stack'); return dialog.getBuilder().get_object('simple-fade-prefs');
stack.add_titled(
dialog.getBuilder().get_object(SimpleFade.getNick() + '-prefs'),
SimpleFade.getNick(), SimpleFade.getLabel());
} }
``` ```
Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

+371 -110
View File
@@ -15,6 +15,7 @@
const {Clutter, Gio, Meta} = imports.gi; const {Clutter, Gio, Meta} = imports.gi;
const Main = imports.ui.main;
const Workspace = imports.ui.workspace.Workspace; const Workspace = imports.ui.workspace.Workspace;
const WindowManager = imports.ui.windowManager.WindowManager; const WindowManager = imports.ui.windowManager.WindowManager;
@@ -36,19 +37,19 @@ const ALL_EFFECTS = [
Me.imports.src.EnergizeB.EnergizeB, Me.imports.src.EnergizeB.EnergizeB,
Me.imports.src.Fire.Fire, Me.imports.src.Fire.Fire,
Me.imports.src.Matrix.Matrix, Me.imports.src.Matrix.Matrix,
Me.imports.src.BrokenGlass.BrokenGlass,
Me.imports.src.TRexAttack.TRexAttack, Me.imports.src.TRexAttack.TRexAttack,
Me.imports.src.TVEffect.TVEffect, Me.imports.src.TVEffect.TVEffect,
Me.imports.src.Wisps.Wisps, Me.imports.src.Wisps.Wisps,
]; ];
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
// This extensions modifies the window-close animation to look like the window was set // // This extensions modifies the window-close and window-open animations with all kinds //
// on fire. There are also a few other effects available. All of them are implemented // // of effects. The effects are implemented using GLSL shaders which are applied to the //
// using GLSL shaders which are applied to the window's Clutter.Actor. The extension is // // window's Clutter.Actor. The extension is actually very simple, much of the //
// actually very simple, most of the complexity comes from the fact that GNOME Shell // // complexity comes from the fact that GNOME Shell usually does not show an animation //
// usually does not show an animation when a window is closed in the overview. Several // // when a window is closed in the overview. Several methods need to be monkey-patched //
// methods need to be monkey-patched to get this working. For more details, read the // // to get this working. For more details, read the other comments in this file... //
// other comments in this file... //
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
class Extension { class Extension {
@@ -66,53 +67,159 @@ class Extension {
// Store a reference to the settings object. // Store a reference to the settings object.
this._settings = ExtensionUtils.getSettings(); this._settings = ExtensionUtils.getSettings();
// We will monkey-patch these three methods. Let's store the original ones. // 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;
// We will monkey-patch these methods. Let's store the original ones.
this._origAddWindowClone = Workspace.prototype._addWindowClone;
this._origWindowRemoved = Workspace.prototype._windowRemoved; this._origWindowRemoved = Workspace.prototype._windowRemoved;
this._origDoRemoveWindow = Workspace.prototype._doRemoveWindow; this._origDoRemoveWindow = Workspace.prototype._doRemoveWindow;
this._origAddWindowClone = Workspace.prototype._addWindowClone;
this._origShouldAnimateActor = WindowManager.prototype._shouldAnimateActor; this._origShouldAnimateActor = WindowManager.prototype._shouldAnimateActor;
this._origWaitForOverviewToHide = WindowManager.prototype._waitForOverviewToHide;
// We will also override these animation times. // We will also override these animation times.
this._origWindowTime = imports.ui.windowManager.DESTROY_WINDOW_ANIMATION_TIME; this._origWindowTime = imports.ui.windowManager.DESTROY_WINDOW_ANIMATION_TIME;
this._origDialogTime = imports.ui.windowManager.DIALOG_DESTROY_WINDOW_ANIMATION_TIME; this._origDialogTime = imports.ui.windowManager.DIALOG_DESTROY_WINDOW_ANIMATION_TIME;
// We will use extensionThis to refer to the extension inside the patched methods of
// the WorkspacesView.
const extensionThis = this;
// Do not attempt to close windows twice. Due to the animation in the overview, the // ------------------------------------------------ patching the window-open animation
// close button can be clicked twice which normally would lead to a crash.
if (WindowPreview) {
this._origDeleteAll = WindowPreview.prototype._deleteAll;
WindowPreview.prototype._deleteAll = function() { // Here we add an effect to the window-open animation. This is done whenever a new
if (!this._closeRequested) { // window is created. Usually, there is no real window animation for opening windows
extensionThis._origDeleteAll.apply(this); // in the overview - only the window's clone is animated - but thanks to the hacks
// below, we can show the real animations in the overview.
// 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
// 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
// called by the _mapWindow(), we will intercept it!
this._windowCreatedConnection =
global.display.connect('window-created', (d, metaWin) => {
let actor = metaWin.get_compositor_private();
const orig = actor.ease;
actor.ease = function(...params) {
orig.apply(actor, params);
actor.ease = orig;
// There are cases where the ease() is called prior to mapping the actor. If
// the actor is not yet mapped, we defer the effect creation.
if (actor.mapped) {
extensionThis._setupEffect(actor, true);
} else {
const connectionID = actor.connect('notify::mapped', () => {
extensionThis._setupEffect(actor, true);
actor.disconnect(connectionID);
});
} }
}; };
});
// Some of the effects require that the window's actor is enlarged to provide a bigger
// canvas to draw the effects. Outside the overview we can simply increase the scale
// of the actor. However, if we are in the overview, we have to enlarge the clone of
// the window as well.
Workspace.prototype._addWindowClone = function(...params) {
const result = extensionThis._origAddWindowClone.apply(this, params);
// The parameters of this method changed a bit through the versions...
let realWindow, clone;
if (utils.shellVersionIs(3, 36)) {
clone = result[0];
realWindow = clone.realWindow;
} else if (utils.shellVersionIs(3, 38)) {
clone = result._windowContainer;
realWindow = params[0].get_compositor_private();
} else {
clone = result.window_container;
realWindow = params[0].get_compositor_private();
} }
// Syncing the real window's scale with the scale of its clone only works on GNOME
// Shell 3.38+. So effects cannot scale windows in the overview of GNOME 3.36...
if (utils.shellVersionIsAtLeast(3, 38)) {
const xID = realWindow.connect('notify::scale-x', () => {
if (realWindow.scale_x > 0 && clone.allocation.get_size()[0] > 0) {
clone.scale_x = realWindow.scale_x;
}
});
const yID = realWindow.connect('notify::scale-y', () => {
if (realWindow.scale_y > 0 && clone.allocation.get_size()[1] > 0) {
clone.scale_y = realWindow.scale_y;
}
});
clone.connect('destroy', () => {
realWindow.disconnect(xID);
realWindow.disconnect(yID);
});
}
// This is actually needed for the window-close animation on GNOME Shell 3.36.
// On GNOME 3.36, the window clone's 'destroy' handler only calls _removeWindowClone // On GNOME 3.36, the window clone's 'destroy' handler only calls _removeWindowClone
// but not _doRemoveWindow. The latter is required to trigger the repositioning of the // but not _doRemoveWindow. The latter is required to trigger the repositioning of
// overview window layout. Therefore we call this method in addition. // 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/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#L1415
if (utils.shellVersionIs(3, 36)) { if (utils.shellVersionIs(3, 36)) {
Workspace.prototype._addWindowClone = function(...params) {
const [clone, overlay] = extensionThis._origAddWindowClone.apply(this, params);
clone.connect('destroy', () => this._doRemoveWindow(clone.metaWindow)); clone.connect('destroy', () => this._doRemoveWindow(clone.metaWindow));
return [clone, overlay];
};
} }
// These three method overrides are mega-hacky! They are only required to make the return result;
// fire animation work in the overview. 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 whether there // Usually, windows are faded in after the overview is completely hidden. We enable
// is a transition ongoing (via extensionThis._shouldDestroy). If that's the case, // window-open animations by not waiting for this.
// these methods do nothing. Are the actors removed in the end? I hope so. The WindowManager.prototype._waitForOverviewToHide = async function() {
// _destroyWindow of the WindowManager sets the transitions up and should take care of return Promise.resolve();
// removing the actors at the end of the transitions. };
// Here comes the ULTRA-HACK: The method below is called (amongst others) by the
// _destroyWindow and _mapWindow methods of the WindowManager. Usually, it returns
// false when we are in the overview. This prevents the window animations. As we
// 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
WindowManager.prototype._shouldAnimateActor = function(...params) {
const caller = (new Error()).stack.split('\n')[1];
if (caller.includes('_destroyWindow@') || caller.includes('_mapWindow@')) {
return true;
}
return extensionThis._origShouldAnimateActor.apply(this, params);
};
// ----------------------------------------------- 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 close animation is set up in WindowManager's _destroyWindow:
// https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/windowManager.js#L1549
// 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);
});
// 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
// whether there is a transition ongoing (via extensionThis._shouldDestroy). If that's
// 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#L1299
Workspace.prototype._windowRemoved = function(ws, metaWin) { Workspace.prototype._windowRemoved = function(ws, metaWin) {
if (extensionThis._shouldDestroy(this, metaWin)) { if (extensionThis._shouldDestroy(this, metaWin)) {
@@ -127,88 +234,54 @@ class Extension {
} }
}; };
// Here comes the ULTRA-HACK: The method below is called (amongst others) by the // With the code below, we hide the window-overlay (icon, label, close button) in the
// _destroyWindow method of the WindowManager. Usually, it returns false when we are // overview once the close-animation is running. As the WindowPreview class is only
// in the overview. This prevents the window-close animation. As we cannot // available on GNOME 3.38 and beyond, we cannot hide the overlay on GNOME 3.36.
// monkey-patch the _destroyWindow method itself, we check inside the method below if (WindowPreview) {
// whether it was called by _destroyWindow. If so, we return true. Let's see if this
// breaks stuff left and right... // We will monkey-patch these methods.
// https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/windowManager.js#L1125 this._origDeleteAll = WindowPreview.prototype._deleteAll;
WindowManager.prototype._shouldAnimateActor = function(...params) { this._origRestack = WindowPreview.prototype._restack;
if ((new Error()).stack.split('\n')[1].includes('_destroyWindow@')) { this._origInit = WindowPreview.prototype._init;
return true;
// Whenever a WindowPreview is created, we connect to the referenced Meta.Window's
// 'unmanaged' signal to hide the overlay.
WindowPreview.prototype._init = function(...params) {
extensionThis._origInit.apply(this, params);
// Hide the window's icon, name, and close button.
const connectionID = this.metaWindow.connect('unmanaged', () => {
if (this.window_container) {
this.overlayEnabled = false;
this._icon.visible = false;
} }
return extensionThis._origShouldAnimateActor.apply(this, params); });
// Make sure to not call the callback above if the Meta.Window was not unmanaged
// before leaving the overview.
this.connect('destroy', () => {
this.metaWindow.disconnect(connectionID);
});
}; };
// The close animation is set up in WindowManager's _destroyWindow: // The _deleteAll is called when the user clicks the X in the overview. We should
// https://gitlab.gnome.org/GNOME/gnome-shell/-/blob/main/js/ui/windowManager.js#L1549 // not attempt to close windows twice. Due to the animation in the overview, the
// As we cannot monkey-patch the _destroyWindow itself, we connect to the 'destroy' // close button can be clicked twice which normally would lead to a crash.
// signal of the window manager and tweak the animation to our needs. WindowPreview.prototype._deleteAll = function() {
this._destroyConnection = global.window_manager.connect('destroy', (wm, actor) => { if (!this._closeRequested) {
// The _destroyWindow method of WindowManager, which was called right before this extensionThis._origDeleteAll.apply(this);
// one, set up the window close animation. This usually fades-out the window and
// scales it a bit down. If no transition is in progress, something unexpected
// happened. We rather try not to burn the window!
const transition = actor.get_transition('scale-y');
if (!transition) {
return;
} }
};
// We do nothing if a dialog got closed and we should not burn them. // This is required, else WindowPreview's _restack() which is called by the
const isDialogWindow = // "this.overlayEnabled = false", sometimes tries to access an already delete
actor.meta_window.window_type == Meta.WindowType.MODAL_DIALOG || // WindowPreview.
actor.meta_window.window_type == Meta.WindowType.DIALOG; WindowPreview.prototype._restack = function() {
if (!this._closeRequested) {
if (!this._settings.get_boolean('destroy-dialogs') && isDialogWindow) { extensionThis._origRestack.apply(this);
return;
} }
};
// Create a list of all currently enabled effects.
const enabledEffects = ALL_EFFECTS.filter(Effect => {
return this._settings.get_boolean(`${Effect.getNick()}-close-effect`);
});
// Nothing is enabled...
if (enabledEffects.length == 0) {
return;
} }
// Choose a random effect.
const Effect = enabledEffects[Math.floor(Math.random() * enabledEffects.length)];
// The effect usually will choose to override the present transitions on the actor.
Effect.tweakTransitions(actor, this._settings);
// Add a cool shader to our window actor!
const shader = Effect.createShader(this._settings);
if (shader) {
actor.add_effect(shader);
// Update uniforms at each frame.
transition.connect('new-frame', (t) => {
shader.set_uniform_value('uProgress', t.get_progress());
shader.set_uniform_value('uTime', 0.001 * t.get_elapsed_time());
shader.set_uniform_value('uSizeX', actor.width);
shader.set_uniform_value('uSizeY', actor.height);
});
}
// The code below is not necessary for Burn-My-Windows to function. However, there
// are some extensions such as "Show Application View When Workspace Empty"
// https://extensions.gnome.org/extension/2036/show-application-view-when-workspace-empty/
// which do something *after* a window was closed. As the window-close animation
// duration depends on the used effect, this may vary each time a window is closed.
// We set the currently used time here, so that others can get an idea how long this
// will take...
const duration = transition.get_duration();
if (isDialogWindow) {
imports.ui.windowManager.DIALOG_DESTROY_WINDOW_ANIMATION_TIME = duration;
} else {
imports.ui.windowManager.DESTROY_WINDOW_ANIMATION_TIME = duration;
}
});
} }
// This function could be called after the extension is uninstalled, disabled in GNOME // This function could be called after the extension is uninstalled, disabled in GNOME
@@ -218,19 +291,23 @@ class Extension {
// Unregister our resources. // Unregister our resources.
Gio.resources_unregister(this._resources); Gio.resources_unregister(this._resources);
// Restore the original behavior. // Restore the original window-open and window-close animations.
global.window_manager.disconnect(this._destroyConnection); global.window_manager.disconnect(this._destroyConnection);
global.display.disconnect(this._windowCreatedConnection);
Workspace.prototype._addWindowClone = this._origAddWindowClone;
Workspace.prototype._windowRemoved = this._origWindowRemoved; Workspace.prototype._windowRemoved = this._origWindowRemoved;
Workspace.prototype._doRemoveWindow = this._origDoRemoveWindow; Workspace.prototype._doRemoveWindow = this._origDoRemoveWindow;
Workspace.prototype._addWindowClone = this._origAddWindowClone;
WindowManager.prototype._shouldAnimateActor = this._origShouldAnimateActor; WindowManager.prototype._shouldAnimateActor = this._origShouldAnimateActor;
WindowManager.prototype._waitForOverviewToHide = this._origWaitForOverviewToHide;
imports.ui.windowManager.DESTROY_WINDOW_ANIMATION_TIME = this._origWindowTime; imports.ui.windowManager.DESTROY_WINDOW_ANIMATION_TIME = this._origWindowTime;
imports.ui.windowManager.DIALOG_DESTROY_WINDOW_ANIMATION_TIME = this._origDialogTime; imports.ui.windowManager.DIALOG_DESTROY_WINDOW_ANIMATION_TIME = this._origDialogTime;
if (WindowPreview) { if (WindowPreview) {
WindowPreview.prototype._deleteAll = this._origDeleteAll; WindowPreview.prototype._deleteAll = this._origDeleteAll;
WindowPreview.prototype._restack = this._origRestack;
WindowPreview.prototype._init = this._origInit;
} }
this._settings = null; this._settings = null;
@@ -238,6 +315,190 @@ class Extension {
// ----------------------------------------------------------------------- private stuff // ----------------------------------------------------------------------- private stuff
// This method adds one of the configured effects to the given actor. If forOpening is
// set to true, a effect from the enabled window-open animations is chosen, else an
// enabled window-close animation is used. This will also tweak the transitions of the
// given actor (e.g. scale it up if required).
_setupEffect(actor, forOpening) {
// Only add effects to normal windows and dialog windows.
const isNormalWindow = actor.meta_window.window_type == Meta.WindowType.NORMAL;
const isDialogWindow =
actor.meta_window.window_type == Meta.WindowType.MODAL_DIALOG ||
actor.meta_window.window_type == Meta.WindowType.DIALOG;
if (!isNormalWindow && !isDialogWindow) {
return;
}
// 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
// because the preview window is a dialog window...
const action = forOpening ? 'open' : 'close';
const previewNick = this._settings.get_string(action + '-preview-effect');
if (isDialogWindow && !shouldDestroyDialogs && previewNick == '') {
this._fixAnimationTimes(isDialogWindow, forOpening, null);
return;
}
// ------------------------------------------------------------------ choose an effect
// Now we chose a random effect from all enabled effects.
this._currentEffect = null;
// First we check if an effect is to be previewed.
if (previewNick != '') {
this._currentEffect = ALL_EFFECTS.find(Effect => {
return Effect.getNick() == previewNick;
});
// Only preview the effect once.
this._settings.set_string(action + '-preview-effect', '');
}
// Else we choose a random effect from all enabled effects.
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`);
});
// And then choose a random effect.
if (enabled.length > 0) {
this._currentEffect = enabled[Math.floor(Math.random() * enabled.length)];
}
}
// If nothing was enabled, we have to do nothing :)
if (this._currentEffect == null) {
this._fixAnimationTimes(isDialogWindow, forOpening, null);
return;
}
// ----------------------------------------------------------- tweak actor transitions
// If we are currently performing integration test, all animations are set to a fixed
// duration and show a fixed frame from the middle of the animation.
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');
// 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.
for (const property in config) {
let transition = actor.get_transition(property);
// If there is currently no ongoing transition, we create a new one. Clutter does
// not like to create transitions with the same start and end value - however, we
// need at least one transition for our progress value in the shader. So we trick
// Clutter by creating an arbitrary transition first and then modifying the start
// and end values according to our config object.
if (!transition) {
actor.set_property(property, 0);
actor.save_easing_state();
actor.set_easing_duration(1000);
actor.set_property(property, 1);
actor.restore_easing_state();
// Now there should be a transition!
transition = actor.get_transition(property);
}
// 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);
}
}
// Once the transitions are finished, we restore the original actor size.
if (forOpening) {
const connectionID = actor.connect('transitions-completed', () => {
actor.scale_x = 1.0;
actor.scale_y = 1.0;
actor.disconnect(connectionID);
});
}
// -------------------------------------------------------------------- add the shader
// Now add a cool shader to our window actor!
const shader = this._currentEffect.createShader(actor, this._settings, forOpening);
if (shader) {
// There should always be an opacity transition going on...
const transition = actor.get_transition('opacity');
if (!transition) {
this._fixAnimationTimes(isDialogWindow, forOpening, null);
utils.debug('Cannot setup shader without opacity transition.')
return;
}
// First remove any old effect.
actor.remove_effect_by_name(`burn-my-windows-effect`);
actor.add_effect_with_name(`burn-my-windows-effect`, shader);
// Update uniforms at each frame.
transition.connect('new-frame', (t) => {
shader.set_uniform_value('uProgress', testMode ? 0.5 : t.get_progress());
shader.set_uniform_value('uTime',
testMode ? duration / 2 : 0.001 * t.get_elapsed_time());
shader.set_uniform_value('uSizeX', actor.width);
shader.set_uniform_value('uSizeY', actor.height);
});
// Remove the effect if the animation finished or was interrupted.
if (forOpening) {
transition.connect('stopped', () => {
actor.remove_effect_by_name(`burn-my-windows-effect`);
});
}
}
// Finally, ensure that all animation times are set properly so that other extensions
// may guess how long it will take until windows are gone :)
this._fixAnimationTimes(isDialogWindow, forOpening, duration);
}
// The code below is not necessary for Burn-My-Windows to function. However, there
// are some extensions such as "Show Application View When Workspace Empty"
// https://extensions.gnome.org/extension/2036/show-application-view-when-workspace-empty/
// which do something *after* a window was closed. As the window-close animation
// duration depends on the used effect, this may vary each time a window is
// closed. We set the currently used time here, so that others can get an idea how
// long this will take...
_fixAnimationTimes(isDialogWindow, forOpening, duration) {
if (!forOpening) {
if (isDialogWindow) {
imports.ui.windowManager.DIALOG_DESTROY_WINDOW_ANIMATION_TIME =
duration != null ? duration : this._origDialogTime;
} else {
imports.ui.windowManager.DESTROY_WINDOW_ANIMATION_TIME =
duration != null ? duration : this._origWindowTime;
}
}
}
// This is required to enable window-close animations in the overview. See the comment // This is required to enable window-close animations in the overview. See the comment
// for Workspace.prototype._windowRemoved above for an explanation. // for Workspace.prototype._windowRemoved above for an explanation.
_shouldDestroy(workspace, metaWindow) { _shouldDestroy(workspace, metaWindow) {
+4 -3
View File
@@ -1,6 +1,6 @@
{ {
"uuid": "burn-my-windows@schneegans.github.com", "uuid": "burn-my-windows@schneegans.github.com",
"description": "Disintegrate your apps with style.", "description": "Disintegrate your windows with style.",
"name": "Burn My Windows", "name": "Burn My Windows",
"gettext-domain": "burn-my-windows", "gettext-domain": "burn-my-windows",
"settings-schema": "org.gnome.shell.extensions.burn-my-windows", "settings-schema": "org.gnome.shell.extensions.burn-my-windows",
@@ -8,8 +8,9 @@
"3.36", "3.36",
"3.38", "3.38",
"40", "40",
"41" "41",
"42"
], ],
"url": "https://github.com/Schneegans/Burn-My-Windows", "url": "https://github.com/Schneegans/Burn-My-Windows",
"version": 9 "version": 14
} }
+297
View File
@@ -0,0 +1,297 @@
# 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.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: Burn-My-Windows\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2022-02-18 20:33+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: prefs.js:111
msgid "Effect Options"
msgstr ""
#: prefs.js:139
msgid "Go Back"
msgstr ""
#: prefs.js:181
msgid "General Options"
msgstr ""
#: prefs.js:276
msgid "Gold Sponsors"
msgstr ""
#: prefs.js:279
msgid "Silver Sponsors"
msgstr ""
#: prefs.js:282
msgid "Bronze Sponsors"
msgstr ""
#: prefs.js:285
msgid "Past Sponsors"
msgstr ""
#. Translators: %s will be replaced by the effect's name.
#: prefs.js:512
#, javascript-format
msgid "Preview for %s"
msgstr ""
#: prefs.js:534
msgid "Close this Window to Preview the Effect!"
msgstr ""
#: src/BrokenGlass.js:57
msgid "Broken Glass"
msgstr ""
#: src/TVEffect.js:56
msgid "TV Effect"
msgstr ""
#: src/TRexAttack.js:56
msgid "T-Rex Attack"
msgstr ""
#: src/Wisps.js:55
msgid "Wisps"
msgstr ""
#: src/Fire.js:58
msgid "Fire"
msgstr ""
#: src/Fire.js:130
msgid "Default Fire"
msgstr ""
#: src/Fire.js:140
msgid "Hell Fire"
msgstr ""
#: src/Fire.js:150
msgid "Dark and Smutty"
msgstr ""
#: src/Fire.js:160
msgid "Cold Breeze"
msgstr ""
#: src/Fire.js:170
msgid "Santa is Coming"
msgstr ""
#: src/EnergizeA.js:54
msgid "Energize A"
msgstr ""
#: src/EnergizeB.js:54
msgid "Energize B"
msgstr ""
#: src/Matrix.js:58
msgid "Matrix"
msgstr ""
#: resources/ui/common/main-menu.ui:6
msgid "Visit Homepage"
msgstr ""
#: resources/ui/common/main-menu.ui:10
msgid "View Changelog"
msgstr ""
#: 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:45
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/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/EnergizeB.ui:24
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
#: resources/ui/gtk3/EnergizeB.ui:42
msgid "Animation Time [ms]"
msgstr ""
#: resources/ui/gtk4/Matrix.ui:52 resources/ui/gtk4/Matrix.ui:98
#: resources/ui/gtk4/Matrix.ui:144 resources/ui/gtk4/Matrix.ui:190
#: resources/ui/gtk4/Matrix.ui:224 resources/ui/gtk4/Matrix.ui:258
#: resources/ui/gtk4/BrokenGlass.ui:52 resources/ui/gtk4/BrokenGlass.ui:98
#: resources/ui/gtk4/BrokenGlass.ui:144 resources/ui/gtk4/BrokenGlass.ui:190
#: resources/ui/gtk4/BrokenGlass.ui:244 resources/ui/gtk4/Wisps.ui:52
#: resources/ui/gtk4/Wisps.ui:98 resources/ui/gtk4/Wisps.ui:132
#: resources/ui/gtk4/Fire.ui:77 resources/ui/gtk4/Fire.ui:123
#: resources/ui/gtk4/Fire.ui:169 resources/ui/gtk4/Fire.ui:222
#: resources/ui/gtk4/Fire.ui:280 resources/ui/gtk4/TRexAttack.ui:52
#: resources/ui/gtk4/TRexAttack.ui:98 resources/ui/gtk4/TRexAttack.ui:144
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/EnergizeB.ui:52
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk3/Wisps.ui:68
#: resources/ui/gtk3/Wisps.ui:117 resources/ui/gtk3/Wisps.ui:160
#: resources/ui/gtk3/Fire.ui:119 resources/ui/gtk3/Fire.ui:167
#: resources/ui/gtk3/Fire.ui:215 resources/ui/gtk3/Fire.ui:277
#: resources/ui/gtk3/Fire.ui:345 resources/ui/gtk3/TVEffect.ui:61
#: resources/ui/gtk3/TVEffect.ui:104 resources/ui/gtk3/EnergizeA.ui:68
#: resources/ui/gtk3/EnergizeA.ui:117 resources/ui/gtk3/EnergizeA.ui:160
#: resources/ui/gtk3/EnergizeB.ui:68 resources/ui/gtk3/EnergizeB.ui:117
#: resources/ui/gtk3/EnergizeB.ui:160 resources/ui/gtk3/prefs.ui:219
msgid "Reset to Default Value"
msgstr ""
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/EnergizeB.ui:70
#: resources/ui/gtk3/Wisps.ui:91 resources/ui/gtk3/Fire.ui:141
#: resources/ui/gtk3/EnergizeA.ui:91 resources/ui/gtk3/EnergizeB.ui:91
msgid "Scale"
msgstr ""
#: resources/ui/gtk4/Matrix.ui:116
msgid "Randomness"
msgstr ""
#: resources/ui/gtk4/Matrix.ui:162
msgid "Vertical Overshooting"
msgstr ""
#: resources/ui/gtk4/Matrix.ui:208
msgid "Trail Color"
msgstr ""
#: resources/ui/gtk4/Matrix.ui:242
msgid "Tip Color"
msgstr ""
#: resources/ui/gtk4/BrokenGlass.ui:116
msgid "Gravity"
msgstr ""
#: resources/ui/gtk4/BrokenGlass.ui:162
msgid "Blow Force"
msgstr ""
#: resources/ui/gtk4/BrokenGlass.ui:212
msgid "Shatter From Pointer Location"
msgstr ""
#: resources/ui/gtk4/BrokenGlass.ui:221
msgid ""
"The shards will fly away from where your mouse pointer was when closing the "
"window."
msgstr ""
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/TVEffect.ui:70
#: resources/ui/gtk4/EnergizeA.ui:116 resources/ui/gtk4/EnergizeB.ui:116
#: resources/ui/gtk3/Wisps.ui:139 resources/ui/gtk3/TVEffect.ui:83
#: resources/ui/gtk3/EnergizeA.ui:139 resources/ui/gtk3/EnergizeB.ui:139
msgid "Color"
msgstr ""
#: resources/ui/gtk4/Fire.ui:25 resources/ui/gtk3/Fire.ui:49
msgid "Presets"
msgstr ""
#: resources/ui/gtk4/Fire.ui:141 resources/ui/gtk3/Fire.ui:189
msgid "Speed"
msgstr ""
#: resources/ui/gtk4/Fire.ui:191 resources/ui/gtk3/Fire.ui:241
msgid "3D Noise"
msgstr ""
#: resources/ui/gtk4/Fire.ui:200 resources/ui/gtk3/Fire.ui:250
msgid "Creates a more dynamic fire but requires more GPU power."
msgstr ""
#: resources/ui/gtk4/Fire.ui:240 resources/ui/gtk3/Fire.ui:300
msgid "Gradient"
msgstr ""
#: resources/ui/gtk4/TRexAttack.ui:70
msgid "Claw Scratch Scale"
msgstr ""
#: resources/ui/gtk4/TRexAttack.ui:116
msgid "Claw Scratch Count"
msgstr ""
#: resources/ui/gtk4/TRexAttack.ui:162
msgid "Warp Effect"
msgstr ""
#: resources/ui/gtk4/TRexAttack.ui:208
msgid "Flash Color"
msgstr ""
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
msgid "Preview this Effect"
msgstr ""
#: resources/ui/gtk4/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/gtk3/Fire.ui:63
msgid "Choose a Preset"
msgstr ""
+306
View File
@@ -0,0 +1,306 @@
# 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-02-18 20:33+0100\n"
"PO-Revision-Date: 2022-02-02 19:55+0000\n"
"Last-Translator: Jiří Doubravský <jiri.doubravsky@gmail.com>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/burn-my-windows/"
"core/cs/>\n"
"Language: cs\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.11-dev\n"
#: prefs.js:111
msgid "Effect Options"
msgstr ""
#: prefs.js:139
msgid "Go Back"
msgstr ""
#: prefs.js:181
msgid "General Options"
msgstr "Obecné možnosti"
#: prefs.js:276
msgid "Gold Sponsors"
msgstr ""
#: prefs.js:279
msgid "Silver Sponsors"
msgstr ""
#: prefs.js:282
msgid "Bronze Sponsors"
msgstr ""
#: prefs.js:285
msgid "Past Sponsors"
msgstr ""
#. Translators: %s will be replaced by the effect's name.
#: prefs.js:512
#, javascript-format
msgid "Preview for %s"
msgstr "Náhled %s"
#: prefs.js:534
msgid "Close this Window to Preview the Effect!"
msgstr "Zavřete toto okno, pokud chcete vidět efekt!"
#: src/BrokenGlass.js:57
msgid "Broken Glass"
msgstr "Střepy"
#: src/TVEffect.js:56
msgid "TV Effect"
msgstr "Televize"
#: src/TRexAttack.js:56
msgid "T-Rex Attack"
msgstr "Tyrannosaurus"
#: src/Wisps.js:55
msgid "Wisps"
msgstr "Obláčky"
#: src/Fire.js:58
msgid "Fire"
msgstr "Oheň"
#: src/Fire.js:130
msgid "Default Fire"
msgstr "Výchozí oheň"
#: src/Fire.js:140
msgid "Hell Fire"
msgstr "Pekelný oheň"
#: src/Fire.js:150
msgid "Dark and Smutty"
msgstr "Temný"
#: src/Fire.js:160
msgid "Cold Breeze"
msgstr "Studený vánek"
#: src/Fire.js:170
msgid "Santa is Coming"
msgstr "Santa přichází"
#: src/EnergizeA.js:54
msgid "Energize A"
msgstr "Energizovat A"
#: src/EnergizeB.js:54
msgid "Energize B"
msgstr "Energizovat B"
#: src/Matrix.js:58
msgid "Matrix"
msgstr "Matrix"
#: resources/ui/common/main-menu.ui:6
msgid "Visit Homepage"
msgstr "Navštívit web"
#: resources/ui/common/main-menu.ui:10
msgid "View Changelog"
msgstr "Zobrazit historii změn"
#: resources/ui/common/main-menu.ui:16
msgid "Report a Bug"
msgstr "Ohlásit chybu"
#: resources/ui/common/main-menu.ui:20
msgid "Create an Effect"
msgstr "Vytvořit efekt"
#: resources/ui/common/main-menu.ui:24
msgid "Translate"
msgstr "Přeložit"
#: resources/ui/common/main-menu.ui:28
msgid "Donate"
msgstr "Přispět"
#: resources/ui/common/main-menu.ui:45
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/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/EnergizeB.ui:24
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
#: resources/ui/gtk3/EnergizeB.ui:42
msgid "Animation Time [ms]"
msgstr "Délka animace [ms]"
#: resources/ui/gtk4/Matrix.ui:52 resources/ui/gtk4/Matrix.ui:98
#: resources/ui/gtk4/Matrix.ui:144 resources/ui/gtk4/Matrix.ui:190
#: resources/ui/gtk4/Matrix.ui:224 resources/ui/gtk4/Matrix.ui:258
#: resources/ui/gtk4/BrokenGlass.ui:52 resources/ui/gtk4/BrokenGlass.ui:98
#: resources/ui/gtk4/BrokenGlass.ui:144 resources/ui/gtk4/BrokenGlass.ui:190
#: resources/ui/gtk4/BrokenGlass.ui:244 resources/ui/gtk4/Wisps.ui:52
#: resources/ui/gtk4/Wisps.ui:98 resources/ui/gtk4/Wisps.ui:132
#: resources/ui/gtk4/Fire.ui:77 resources/ui/gtk4/Fire.ui:123
#: resources/ui/gtk4/Fire.ui:169 resources/ui/gtk4/Fire.ui:222
#: resources/ui/gtk4/Fire.ui:280 resources/ui/gtk4/TRexAttack.ui:52
#: resources/ui/gtk4/TRexAttack.ui:98 resources/ui/gtk4/TRexAttack.ui:144
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/EnergizeB.ui:52
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk3/Wisps.ui:68
#: resources/ui/gtk3/Wisps.ui:117 resources/ui/gtk3/Wisps.ui:160
#: resources/ui/gtk3/Fire.ui:119 resources/ui/gtk3/Fire.ui:167
#: resources/ui/gtk3/Fire.ui:215 resources/ui/gtk3/Fire.ui:277
#: resources/ui/gtk3/Fire.ui:345 resources/ui/gtk3/TVEffect.ui:61
#: resources/ui/gtk3/TVEffect.ui:104 resources/ui/gtk3/EnergizeA.ui:68
#: resources/ui/gtk3/EnergizeA.ui:117 resources/ui/gtk3/EnergizeA.ui:160
#: resources/ui/gtk3/EnergizeB.ui:68 resources/ui/gtk3/EnergizeB.ui:117
#: resources/ui/gtk3/EnergizeB.ui:160 resources/ui/gtk3/prefs.ui:219
msgid "Reset to Default Value"
msgstr "Obnovit výchozí hodnoty"
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/EnergizeB.ui:70
#: resources/ui/gtk3/Wisps.ui:91 resources/ui/gtk3/Fire.ui:141
#: resources/ui/gtk3/EnergizeA.ui:91 resources/ui/gtk3/EnergizeB.ui:91
msgid "Scale"
msgstr "Měřítko"
#: resources/ui/gtk4/Matrix.ui:116
msgid "Randomness"
msgstr "Nahodilost"
#: resources/ui/gtk4/Matrix.ui:162
#, fuzzy
msgid "Vertical Overshooting"
msgstr "Vertikální přestřelení"
#: resources/ui/gtk4/Matrix.ui:208
msgid "Trail Color"
msgstr "Barva ohonu"
#: resources/ui/gtk4/Matrix.ui:242
msgid "Tip Color"
msgstr "Barva hrotu"
#: resources/ui/gtk4/BrokenGlass.ui:116
msgid "Gravity"
msgstr "Gravitace"
#: resources/ui/gtk4/BrokenGlass.ui:162
msgid "Blow Force"
msgstr "Síla úderu"
#: resources/ui/gtk4/BrokenGlass.ui:212
msgid "Shatter From Pointer Location"
msgstr "Roztříštění od místa ukazatele"
#: resources/ui/gtk4/BrokenGlass.ui:221
msgid ""
"The shards will fly away from where your mouse pointer was when closing the "
"window."
msgstr "Střepy odletí z místa, kde byl ukazatel myši při zavírání okna."
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/TVEffect.ui:70
#: resources/ui/gtk4/EnergizeA.ui:116 resources/ui/gtk4/EnergizeB.ui:116
#: resources/ui/gtk3/Wisps.ui:139 resources/ui/gtk3/TVEffect.ui:83
#: resources/ui/gtk3/EnergizeA.ui:139 resources/ui/gtk3/EnergizeB.ui:139
msgid "Color"
msgstr "Barva"
#: resources/ui/gtk4/Fire.ui:25 resources/ui/gtk3/Fire.ui:49
msgid "Presets"
msgstr "Předvolby"
#: resources/ui/gtk4/Fire.ui:141 resources/ui/gtk3/Fire.ui:189
msgid "Speed"
msgstr "Rychlost"
#: 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 "Vytvoří dynamičtejší efekt, ale potřebuje k tomu silnější GPU"
#: resources/ui/gtk4/Fire.ui:240 resources/ui/gtk3/Fire.ui:300
msgid "Gradient"
msgstr "Přechod"
#: resources/ui/gtk4/TRexAttack.ui:70
msgid "Claw Scratch Scale"
msgstr "Velikost škrábanců od drápů"
#: resources/ui/gtk4/TRexAttack.ui:116
msgid "Claw Scratch Count"
msgstr "Počet škrábanců"
#: resources/ui/gtk4/TRexAttack.ui:162
msgid "Warp Effect"
msgstr "Efekt zakřivení"
#: resources/ui/gtk4/TRexAttack.ui:208
msgid "Flash Color"
msgstr "Barva blesku"
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
msgid "Preview this Effect"
msgstr "Náhled efektu"
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
msgid "Welcome to Burn-My-Windows!"
msgstr "Vítá Vás Burn-My-Windows!"
#: resources/ui/gtk4/prefs.ui:39 resources/ui/gtk3/prefs.ui:46
msgid "If you like this extension, recommend it to your friends :)"
msgstr "Pokud se vám líbí tento doplňek, doporučte jej přátelům :-)"
#: resources/ui/gtk4/prefs.ui:66 resources/ui/gtk3/prefs.ui:74
msgid "Open Window Animation"
msgstr "Animace při otevírání 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 "Pokud vyberete více, budou se střídat náhodně."
#: 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 "Animace při zavírání okna"
#: resources/ui/gtk4/prefs.ui:150 resources/ui/gtk3/prefs.ui:198
msgid "Also Add Effects to Dialogs"
msgstr "Použít efekt i na dialogová okna"
#: resources/ui/gtk3/Fire.ui:63
msgid "Choose a Preset"
msgstr "Vyberte předvolbu"
#~ msgid "Via PayPal"
#~ msgstr "skrze PayPal"
#~ msgid "Via GitHub"
#~ msgstr "skrze GitHub"
+310
View File
@@ -0,0 +1,310 @@
# 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-02-18 20:33+0100\n"
"PO-Revision-Date: 2022-02-18 19:40+0000\n"
"Last-Translator: Simon Schneegans <code@simonschneegans.de>\n"
"Language-Team: German <https://hosted.weblate.org/projects/burn-my-windows/"
"core/de/>\n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.11-dev\n"
#: prefs.js:111
msgid "Effect Options"
msgstr "Effektoptionen"
#: prefs.js:139
msgid "Go Back"
msgstr "Zurück"
#: prefs.js:181
msgid "General Options"
msgstr "Allgemeine Optionen"
#: prefs.js:276
msgid "Gold Sponsors"
msgstr "Gold-Sponsoren"
#: prefs.js:279
msgid "Silver Sponsors"
msgstr "Silber-Sponsoren"
#: prefs.js:282
msgid "Bronze Sponsors"
msgstr "Bronze-Sponsoren"
#: prefs.js:285
msgid "Past Sponsors"
msgstr "Ehemalige Sponsoren"
#. Translators: %s will be replaced by the effect's name.
#: prefs.js:512
#, javascript-format
msgid "Preview for %s"
msgstr "Vorschau für %s"
#: prefs.js:534
msgid "Close this Window to Preview the Effect!"
msgstr "Schließen Sie dieses Fenster, um eine Vorschau des Effekts anzuzeigen!"
#: src/BrokenGlass.js:57
msgid "Broken Glass"
msgstr "Glassplitter"
#: src/TVEffect.js:56
msgid "TV Effect"
msgstr "TV-Effekt"
#: src/TRexAttack.js:56
msgid "T-Rex Attack"
msgstr "T-Rex-Angriff"
#: src/Wisps.js:55
msgid "Wisps"
msgstr "Irrlichter"
#: src/Fire.js:58
msgid "Fire"
msgstr "Feuer"
#: src/Fire.js:130
msgid "Default Fire"
msgstr "Standardfeuer"
#: src/Fire.js:140
msgid "Hell Fire"
msgstr "Höllenfeuer"
#: src/Fire.js:150
msgid "Dark and Smutty"
msgstr "Dunkel und schmutzig"
#: src/Fire.js:160
msgid "Cold Breeze"
msgstr "Kalte Brise"
#: src/Fire.js:170
msgid "Santa is Coming"
msgstr "Weihnachtsgrüße"
#: src/EnergizeA.js:54
msgid "Energize A"
msgstr "Energie A"
#: src/EnergizeB.js:54
msgid "Energize B"
msgstr "Energie B"
#: src/Matrix.js:58
msgid "Matrix"
msgstr "Matrix"
#: resources/ui/common/main-menu.ui:6
msgid "Visit Homepage"
msgstr "Homepage besuchen"
#: resources/ui/common/main-menu.ui:10
msgid "View Changelog"
msgstr "Changelog anzeigen"
#: resources/ui/common/main-menu.ui:16
msgid "Report a Bug"
msgstr "Fehler melden"
#: resources/ui/common/main-menu.ui:20
msgid "Create an Effect"
msgstr "Einen Effekt hinzufügen"
#: resources/ui/common/main-menu.ui:24
msgid "Translate"
msgstr "Übersetzen"
#: resources/ui/common/main-menu.ui:28
msgid "Donate"
msgstr "Spenden"
#: resources/ui/common/main-menu.ui:45
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/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/EnergizeB.ui:24
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
#: resources/ui/gtk3/EnergizeB.ui:42
msgid "Animation Time [ms]"
msgstr "Animationszeit [ms]"
#: resources/ui/gtk4/Matrix.ui:52 resources/ui/gtk4/Matrix.ui:98
#: resources/ui/gtk4/Matrix.ui:144 resources/ui/gtk4/Matrix.ui:190
#: resources/ui/gtk4/Matrix.ui:224 resources/ui/gtk4/Matrix.ui:258
#: resources/ui/gtk4/BrokenGlass.ui:52 resources/ui/gtk4/BrokenGlass.ui:98
#: resources/ui/gtk4/BrokenGlass.ui:144 resources/ui/gtk4/BrokenGlass.ui:190
#: resources/ui/gtk4/BrokenGlass.ui:244 resources/ui/gtk4/Wisps.ui:52
#: resources/ui/gtk4/Wisps.ui:98 resources/ui/gtk4/Wisps.ui:132
#: resources/ui/gtk4/Fire.ui:77 resources/ui/gtk4/Fire.ui:123
#: resources/ui/gtk4/Fire.ui:169 resources/ui/gtk4/Fire.ui:222
#: resources/ui/gtk4/Fire.ui:280 resources/ui/gtk4/TRexAttack.ui:52
#: resources/ui/gtk4/TRexAttack.ui:98 resources/ui/gtk4/TRexAttack.ui:144
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/EnergizeB.ui:52
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk3/Wisps.ui:68
#: resources/ui/gtk3/Wisps.ui:117 resources/ui/gtk3/Wisps.ui:160
#: resources/ui/gtk3/Fire.ui:119 resources/ui/gtk3/Fire.ui:167
#: resources/ui/gtk3/Fire.ui:215 resources/ui/gtk3/Fire.ui:277
#: resources/ui/gtk3/Fire.ui:345 resources/ui/gtk3/TVEffect.ui:61
#: resources/ui/gtk3/TVEffect.ui:104 resources/ui/gtk3/EnergizeA.ui:68
#: resources/ui/gtk3/EnergizeA.ui:117 resources/ui/gtk3/EnergizeA.ui:160
#: resources/ui/gtk3/EnergizeB.ui:68 resources/ui/gtk3/EnergizeB.ui:117
#: resources/ui/gtk3/EnergizeB.ui:160 resources/ui/gtk3/prefs.ui:219
msgid "Reset to Default Value"
msgstr "Auf Standardwert zurücksetzen"
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/EnergizeB.ui:70
#: resources/ui/gtk3/Wisps.ui:91 resources/ui/gtk3/Fire.ui:141
#: resources/ui/gtk3/EnergizeA.ui:91 resources/ui/gtk3/EnergizeB.ui:91
msgid "Scale"
msgstr "Größe"
#: resources/ui/gtk4/Matrix.ui:116
msgid "Randomness"
msgstr "Zufälligkeit"
#: resources/ui/gtk4/Matrix.ui:162
msgid "Vertical Overshooting"
msgstr "Vertikales Überschießen"
#: resources/ui/gtk4/Matrix.ui:208
msgid "Trail Color"
msgstr "Farbe der Spur"
#: resources/ui/gtk4/Matrix.ui:242
msgid "Tip Color"
msgstr "Farbe der Spitze"
#: resources/ui/gtk4/BrokenGlass.ui:116
msgid "Gravity"
msgstr "Schwerkraft"
#: resources/ui/gtk4/BrokenGlass.ui:162
msgid "Blow Force"
msgstr "Schlagkraft"
#: resources/ui/gtk4/BrokenGlass.ui:212
msgid "Shatter From Pointer Location"
msgstr "Von Mauszeigerposition zerbrechen"
#: resources/ui/gtk4/BrokenGlass.ui:221
msgid ""
"The shards will fly away from where your mouse pointer was when closing the "
"window."
msgstr ""
"Die Scherben fliegen von der Stelle weg, an der sich Ihr Mauszeiger beim "
"Schließen des Fensters befand."
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/TVEffect.ui:70
#: resources/ui/gtk4/EnergizeA.ui:116 resources/ui/gtk4/EnergizeB.ui:116
#: resources/ui/gtk3/Wisps.ui:139 resources/ui/gtk3/TVEffect.ui:83
#: resources/ui/gtk3/EnergizeA.ui:139 resources/ui/gtk3/EnergizeB.ui:139
msgid "Color"
msgstr "Farbe"
#: resources/ui/gtk4/Fire.ui:25 resources/ui/gtk3/Fire.ui:49
msgid "Presets"
msgstr "Voreinstellungen"
#: resources/ui/gtk4/Fire.ui:141 resources/ui/gtk3/Fire.ui:189
msgid "Speed"
msgstr "Geschwindigkeit"
#: resources/ui/gtk4/Fire.ui:191 resources/ui/gtk3/Fire.ui:241
msgid "3D Noise"
msgstr "3D-Rauschen"
#: resources/ui/gtk4/Fire.ui:200 resources/ui/gtk3/Fire.ui:250
msgid "Creates a more dynamic fire but requires more GPU power."
msgstr "Erzeugt ein dynamischeres Feuer, erfordert jedoch mehr GPU-Leistung."
#: resources/ui/gtk4/Fire.ui:240 resources/ui/gtk3/Fire.ui:300
msgid "Gradient"
msgstr "Farbverlauf"
#: resources/ui/gtk4/TRexAttack.ui:70
msgid "Claw Scratch Scale"
msgstr "Kratzergröße"
#: resources/ui/gtk4/TRexAttack.ui:116
msgid "Claw Scratch Count"
msgstr "Kratzeranzahl"
#: resources/ui/gtk4/TRexAttack.ui:162
msgid "Warp Effect"
msgstr "Warp-Effekt"
#: resources/ui/gtk4/TRexAttack.ui:208
msgid "Flash Color"
msgstr "Blitzfarbe"
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
msgid "Preview this Effect"
msgstr "Vorschau dieses Effekts"
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
msgid "Welcome to Burn-My-Windows!"
msgstr "Willkommen bei 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 "Wenn Sie diese Erweiterung mögen, empfehlen Sie sie Ihren Freunden :)"
#: resources/ui/gtk4/prefs.ui:66 resources/ui/gtk3/prefs.ui:74
msgid "Open Window Animation"
msgstr "Fenster-Öffnen-Animation"
#: 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 "Wenn mehrere ausgewählt sind, wird eine zufällig ausgewählt."
#: 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 "Effekte auswählen"
#: resources/ui/gtk4/prefs.ui:110 resources/ui/gtk3/prefs.ui:138
msgid "Close Window Animation"
msgstr "Fenster-Schließen-Animation"
#: resources/ui/gtk4/prefs.ui:150 resources/ui/gtk3/prefs.ui:198
msgid "Also Add Effects to Dialogs"
msgstr "Effekte auch zu Dialogen hinzufügen"
#: resources/ui/gtk3/Fire.ui:63
msgid "Choose a Preset"
msgstr "Wählen Sie eine Voreinstellung"
#~ msgid "Via PayPal"
#~ msgstr "Mit PayPal"
#~ msgid "Via GitHub"
#~ msgstr "Mit GitHub"
#~ msgid "Create a Custom Effect"
#~ msgstr "Einen neuen Effekt erstellen"
+307
View File
@@ -0,0 +1,307 @@
# 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-02-18 20:33+0100\n"
"PO-Revision-Date: 2022-03-15 06:54+0000\n"
"Last-Translator: Adolfo Jayme Barrientos <fitojb@ubuntu.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/burn-my-windows/"
"core/es/>\n"
"Language: es\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:111
msgid "Effect Options"
msgstr "Opciones de efecto"
#: prefs.js:139
msgid "Go Back"
msgstr "Volver"
#: prefs.js:181
msgid "General Options"
msgstr "Opciones generales"
#: prefs.js:276
msgid "Gold Sponsors"
msgstr "Patrocinadores de oro"
#: prefs.js:279
msgid "Silver Sponsors"
msgstr "Patrocinadores de plata"
#: prefs.js:282
msgid "Bronze Sponsors"
msgstr "Patrocinadores de bronce"
#: prefs.js:285
msgid "Past Sponsors"
msgstr "Patrocinadores anteriores"
#. Translators: %s will be replaced by the effect's name.
#: prefs.js:512
#, javascript-format
msgid "Preview for %s"
msgstr "Previsualización de %s"
#: prefs.js:534
msgid "Close this Window to Preview the Effect!"
msgstr "¡Cierre esta ventana para ver el efecto!"
#: src/BrokenGlass.js:57
msgid "Broken Glass"
msgstr "Cristales rotos"
#: src/TVEffect.js:56
msgid "TV Effect"
msgstr "Efecto televisor"
#: src/TRexAttack.js:56
msgid "T-Rex Attack"
msgstr "Ataque de T-Rex"
#: src/Wisps.js:55
msgid "Wisps"
msgstr "Chispas"
#: src/Fire.js:58
msgid "Fire"
msgstr "Fuego"
#: src/Fire.js:130
msgid "Default Fire"
msgstr "Fuego predeterminado"
#: src/Fire.js:140
msgid "Hell Fire"
msgstr "Fuego infernal"
#: src/Fire.js:150
msgid "Dark and Smutty"
msgstr "Oscuro y obsceno"
#: src/Fire.js:160
msgid "Cold Breeze"
msgstr "Brisa fría"
#: src/Fire.js:170
msgid "Santa is Coming"
msgstr "Viene Papá Noel"
#: src/EnergizeA.js:54
msgid "Energize A"
msgstr "Energizar A"
#: src/EnergizeB.js:54
msgid "Energize B"
msgstr "Energizar B"
#: src/Matrix.js:58
msgid "Matrix"
msgstr "Matrix"
#: resources/ui/common/main-menu.ui:6
msgid "Visit Homepage"
msgstr "Visitar la página web"
#: resources/ui/common/main-menu.ui:10
msgid "View Changelog"
msgstr "Ver registro de cambios"
#: resources/ui/common/main-menu.ui:16
msgid "Report a Bug"
msgstr "Informar de un error"
#: resources/ui/common/main-menu.ui:20
msgid "Create an Effect"
msgstr "Crear un efecto"
#: resources/ui/common/main-menu.ui:24
msgid "Translate"
msgstr "Traducir"
#: resources/ui/common/main-menu.ui:28
msgid "Donate"
msgstr "Donar"
#: resources/ui/common/main-menu.ui:45
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/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/EnergizeB.ui:24
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
#: resources/ui/gtk3/EnergizeB.ui:42
msgid "Animation Time [ms]"
msgstr "Tiempo de animación [ms]"
#: resources/ui/gtk4/Matrix.ui:52 resources/ui/gtk4/Matrix.ui:98
#: resources/ui/gtk4/Matrix.ui:144 resources/ui/gtk4/Matrix.ui:190
#: resources/ui/gtk4/Matrix.ui:224 resources/ui/gtk4/Matrix.ui:258
#: resources/ui/gtk4/BrokenGlass.ui:52 resources/ui/gtk4/BrokenGlass.ui:98
#: resources/ui/gtk4/BrokenGlass.ui:144 resources/ui/gtk4/BrokenGlass.ui:190
#: resources/ui/gtk4/BrokenGlass.ui:244 resources/ui/gtk4/Wisps.ui:52
#: resources/ui/gtk4/Wisps.ui:98 resources/ui/gtk4/Wisps.ui:132
#: resources/ui/gtk4/Fire.ui:77 resources/ui/gtk4/Fire.ui:123
#: resources/ui/gtk4/Fire.ui:169 resources/ui/gtk4/Fire.ui:222
#: resources/ui/gtk4/Fire.ui:280 resources/ui/gtk4/TRexAttack.ui:52
#: resources/ui/gtk4/TRexAttack.ui:98 resources/ui/gtk4/TRexAttack.ui:144
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/EnergizeB.ui:52
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk3/Wisps.ui:68
#: resources/ui/gtk3/Wisps.ui:117 resources/ui/gtk3/Wisps.ui:160
#: resources/ui/gtk3/Fire.ui:119 resources/ui/gtk3/Fire.ui:167
#: resources/ui/gtk3/Fire.ui:215 resources/ui/gtk3/Fire.ui:277
#: resources/ui/gtk3/Fire.ui:345 resources/ui/gtk3/TVEffect.ui:61
#: resources/ui/gtk3/TVEffect.ui:104 resources/ui/gtk3/EnergizeA.ui:68
#: resources/ui/gtk3/EnergizeA.ui:117 resources/ui/gtk3/EnergizeA.ui:160
#: resources/ui/gtk3/EnergizeB.ui:68 resources/ui/gtk3/EnergizeB.ui:117
#: resources/ui/gtk3/EnergizeB.ui:160 resources/ui/gtk3/prefs.ui:219
msgid "Reset to Default Value"
msgstr "Restablecer al valor predeterminado"
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/EnergizeB.ui:70
#: resources/ui/gtk3/Wisps.ui:91 resources/ui/gtk3/Fire.ui:141
#: resources/ui/gtk3/EnergizeA.ui:91 resources/ui/gtk3/EnergizeB.ui:91
msgid "Scale"
msgstr "Escala"
#: resources/ui/gtk4/Matrix.ui:116
msgid "Randomness"
msgstr "Aleatoriedad"
#: resources/ui/gtk4/Matrix.ui:162
msgid "Vertical Overshooting"
msgstr "Superposición vertical"
#: resources/ui/gtk4/Matrix.ui:208
msgid "Trail Color"
msgstr "Color de la estela"
#: resources/ui/gtk4/Matrix.ui:242
msgid "Tip Color"
msgstr "Color de la punta"
#: resources/ui/gtk4/BrokenGlass.ui:116
msgid "Gravity"
msgstr "Gravedad"
#: resources/ui/gtk4/BrokenGlass.ui:162
msgid "Blow Force"
msgstr "Fuerza del golpe"
#: resources/ui/gtk4/BrokenGlass.ui:212
msgid "Shatter From Pointer Location"
msgstr "Fragmentar desde la ubicación del puntero"
#: resources/ui/gtk4/BrokenGlass.ui:221
msgid ""
"The shards will fly away from where your mouse pointer was when closing the "
"window."
msgstr ""
"Los fragmentos saldrán volando desde donde estaba el puntero del ratón al "
"cerrar la ventana."
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/TVEffect.ui:70
#: resources/ui/gtk4/EnergizeA.ui:116 resources/ui/gtk4/EnergizeB.ui:116
#: resources/ui/gtk3/Wisps.ui:139 resources/ui/gtk3/TVEffect.ui:83
#: resources/ui/gtk3/EnergizeA.ui:139 resources/ui/gtk3/EnergizeB.ui:139
msgid "Color"
msgstr "Color"
#: resources/ui/gtk4/Fire.ui:25 resources/ui/gtk3/Fire.ui:49
msgid "Presets"
msgstr "Preselecciones"
#: resources/ui/gtk4/Fire.ui:141 resources/ui/gtk3/Fire.ui:189
msgid "Speed"
msgstr "Velocidad"
#: resources/ui/gtk4/Fire.ui:191 resources/ui/gtk3/Fire.ui:241
msgid "3D Noise"
msgstr "Ruido 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 "Crea un fuego más dinámico pero requiere más potencia de la GPU."
#: resources/ui/gtk4/Fire.ui:240 resources/ui/gtk3/Fire.ui:300
msgid "Gradient"
msgstr "Degradado"
#: resources/ui/gtk4/TRexAttack.ui:70
msgid "Claw Scratch Scale"
msgstr "Escala de arañazos de garras"
#: resources/ui/gtk4/TRexAttack.ui:116
msgid "Claw Scratch Count"
msgstr "Número de arañazos de garras"
#: resources/ui/gtk4/TRexAttack.ui:162
msgid "Warp Effect"
msgstr "Efecto distorsión"
#: resources/ui/gtk4/TRexAttack.ui:208
msgid "Flash Color"
msgstr "Color del flash"
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
msgid "Preview this Effect"
msgstr "Previsualizar este efecto"
#: 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."
#: resources/ui/gtk4/prefs.ui:39 resources/ui/gtk3/prefs.ui:46
msgid "If you like this extension, recommend it to your friends :)"
msgstr "Si le gusta esta extensión, recomiéndela a sus amistades :)"
#: resources/ui/gtk4/prefs.ui:66 resources/ui/gtk3/prefs.ui:74
msgid "Open Window Animation"
msgstr "Animación al abrir la ventana"
#: 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 se seleccionan varios, se elige uno al azar."
#: 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 "Elegir efectos"
#: resources/ui/gtk4/prefs.ui:110 resources/ui/gtk3/prefs.ui:138
msgid "Close Window Animation"
msgstr "Animación al cerrar la ventana"
#: resources/ui/gtk4/prefs.ui:150 resources/ui/gtk3/prefs.ui:198
msgid "Also Add Effects to Dialogs"
msgstr "Añadir también efectos a los diálogos"
#: resources/ui/gtk3/Fire.ui:63
msgid "Choose a Preset"
msgstr "Elija una preselección"
#~ msgid "Via PayPal"
#~ msgstr "Vía PayPal"
#~ msgid "Via GitHub"
#~ msgstr "Vía GitHub"
+309
View File
@@ -0,0 +1,309 @@
# 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-02-18 20:33+0100\n"
"PO-Revision-Date: 2022-02-21 11:58+0000\n"
"Last-Translator: Nathan <bonnemainsnathan@gmail.com>\n"
"Language-Team: French <https://hosted.weblate.org/projects/burn-my-windows/"
"core/fr/>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.11-dev\n"
#: prefs.js:111
msgid "Effect Options"
msgstr "Options de l'effet"
#: prefs.js:139
msgid "Go Back"
msgstr "Retour"
#: prefs.js:181
msgid "General Options"
msgstr "Options générales"
#: prefs.js:276
msgid "Gold Sponsors"
msgstr "Sponsors Or"
#: prefs.js:279
msgid "Silver Sponsors"
msgstr "Sponsors Argent"
#: prefs.js:282
msgid "Bronze Sponsors"
msgstr "Sponsors Bronze"
#: prefs.js:285
msgid "Past Sponsors"
msgstr "Anciens Sponsors"
#. Translators: %s will be replaced by the effect's name.
#: prefs.js:512
#, javascript-format
msgid "Preview for %s"
msgstr "Aperçu pour %s"
#: prefs.js:534
msgid "Close this Window to Preview the Effect!"
msgstr "Fermez cette fenêtre pour un aperçu de l'effet !"
#: src/BrokenGlass.js:57
msgid "Broken Glass"
msgstr "Verre brisé"
#: src/TVEffect.js:56
msgid "TV Effect"
msgstr "Effet TV"
#: src/TRexAttack.js:56
msgid "T-Rex Attack"
msgstr "Attaque de T-Rex"
#: src/Wisps.js:55
msgid "Wisps"
msgstr "Volutes"
#: src/Fire.js:58
msgid "Fire"
msgstr "Feu"
#: src/Fire.js:130
msgid "Default Fire"
msgstr "Feu par défaut"
#: src/Fire.js:140
msgid "Hell Fire"
msgstr "Feu de l'enfer"
#: src/Fire.js:150
msgid "Dark and Smutty"
msgstr "Sombre et ténébreux"
#: src/Fire.js:160
msgid "Cold Breeze"
msgstr "Brise froide"
#: src/Fire.js:170
msgid "Santa is Coming"
msgstr "Le Père Noël arrive"
#: src/EnergizeA.js:54
msgid "Energize A"
msgstr "Énergie A"
#: src/EnergizeB.js:54
msgid "Energize B"
msgstr "Énergie B"
#: src/Matrix.js:58
msgid "Matrix"
msgstr "Matrix"
#: resources/ui/common/main-menu.ui:6
msgid "Visit Homepage"
msgstr "Visiter la page d'accueil"
#: resources/ui/common/main-menu.ui:10
msgid "View Changelog"
msgstr "Voir le journal des modifications"
#: resources/ui/common/main-menu.ui:16
msgid "Report a Bug"
msgstr "Signaler un bug"
#: resources/ui/common/main-menu.ui:20
msgid "Create an Effect"
msgstr "Créer un effet"
#: resources/ui/common/main-menu.ui:24
msgid "Translate"
msgstr "Traduire"
#: resources/ui/common/main-menu.ui:28
msgid "Donate"
msgstr "Faire un don"
#: resources/ui/common/main-menu.ui:45
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/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/EnergizeB.ui:24
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
#: resources/ui/gtk3/EnergizeB.ui:42
msgid "Animation Time [ms]"
msgstr "Durée de l'animation (ms)"
#: resources/ui/gtk4/Matrix.ui:52 resources/ui/gtk4/Matrix.ui:98
#: resources/ui/gtk4/Matrix.ui:144 resources/ui/gtk4/Matrix.ui:190
#: resources/ui/gtk4/Matrix.ui:224 resources/ui/gtk4/Matrix.ui:258
#: resources/ui/gtk4/BrokenGlass.ui:52 resources/ui/gtk4/BrokenGlass.ui:98
#: resources/ui/gtk4/BrokenGlass.ui:144 resources/ui/gtk4/BrokenGlass.ui:190
#: resources/ui/gtk4/BrokenGlass.ui:244 resources/ui/gtk4/Wisps.ui:52
#: resources/ui/gtk4/Wisps.ui:98 resources/ui/gtk4/Wisps.ui:132
#: resources/ui/gtk4/Fire.ui:77 resources/ui/gtk4/Fire.ui:123
#: resources/ui/gtk4/Fire.ui:169 resources/ui/gtk4/Fire.ui:222
#: resources/ui/gtk4/Fire.ui:280 resources/ui/gtk4/TRexAttack.ui:52
#: resources/ui/gtk4/TRexAttack.ui:98 resources/ui/gtk4/TRexAttack.ui:144
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/EnergizeB.ui:52
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk3/Wisps.ui:68
#: resources/ui/gtk3/Wisps.ui:117 resources/ui/gtk3/Wisps.ui:160
#: resources/ui/gtk3/Fire.ui:119 resources/ui/gtk3/Fire.ui:167
#: resources/ui/gtk3/Fire.ui:215 resources/ui/gtk3/Fire.ui:277
#: resources/ui/gtk3/Fire.ui:345 resources/ui/gtk3/TVEffect.ui:61
#: resources/ui/gtk3/TVEffect.ui:104 resources/ui/gtk3/EnergizeA.ui:68
#: resources/ui/gtk3/EnergizeA.ui:117 resources/ui/gtk3/EnergizeA.ui:160
#: resources/ui/gtk3/EnergizeB.ui:68 resources/ui/gtk3/EnergizeB.ui:117
#: resources/ui/gtk3/EnergizeB.ui:160 resources/ui/gtk3/prefs.ui:219
msgid "Reset to Default Value"
msgstr "Réinitialiser à la valeur par défaut"
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/EnergizeB.ui:70
#: resources/ui/gtk3/Wisps.ui:91 resources/ui/gtk3/Fire.ui:141
#: resources/ui/gtk3/EnergizeA.ui:91 resources/ui/gtk3/EnergizeB.ui:91
msgid "Scale"
msgstr "Échelle"
#: resources/ui/gtk4/Matrix.ui:116
msgid "Randomness"
msgstr "Aléatoire"
#: resources/ui/gtk4/Matrix.ui:162
msgid "Vertical Overshooting"
msgstr "Dépassement vertical"
#: resources/ui/gtk4/Matrix.ui:208
msgid "Trail Color"
msgstr "Couleur de la traîne"
#: resources/ui/gtk4/Matrix.ui:242
msgid "Tip Color"
msgstr "Couleur de la pointe"
#: resources/ui/gtk4/BrokenGlass.ui:116
msgid "Gravity"
msgstr "Gravité"
#: resources/ui/gtk4/BrokenGlass.ui:162
msgid "Blow Force"
msgstr "Force d'explosion"
#: resources/ui/gtk4/BrokenGlass.ui:212
msgid "Shatter From Pointer Location"
msgstr "Briser à partir de la position du curseur"
#: resources/ui/gtk4/BrokenGlass.ui:221
msgid ""
"The shards will fly away from where your mouse pointer was when closing the "
"window."
msgstr ""
"Les éclats s'envoleront de l'endroit où se trouvait le pointeur de votre "
"souris lorsque vous fermez la fenêtre."
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/TVEffect.ui:70
#: resources/ui/gtk4/EnergizeA.ui:116 resources/ui/gtk4/EnergizeB.ui:116
#: resources/ui/gtk3/Wisps.ui:139 resources/ui/gtk3/TVEffect.ui:83
#: resources/ui/gtk3/EnergizeA.ui:139 resources/ui/gtk3/EnergizeB.ui:139
msgid "Color"
msgstr "Couleur"
#: resources/ui/gtk4/Fire.ui:25 resources/ui/gtk3/Fire.ui:49
msgid "Presets"
msgstr "Préréglages"
#: resources/ui/gtk4/Fire.ui:141 resources/ui/gtk3/Fire.ui:189
msgid "Speed"
msgstr "Vitesse"
#: resources/ui/gtk4/Fire.ui:191 resources/ui/gtk3/Fire.ui:241
msgid "3D Noise"
msgstr "Bruit 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 ""
"Crée un feu plus dynamique mais demande plus de puissance de la carte "
"graphique."
#: 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 "Échelle de griffe"
#: resources/ui/gtk4/TRexAttack.ui:116
msgid "Claw Scratch Count"
msgstr "Nombre de coups"
#: resources/ui/gtk4/TRexAttack.ui:162
msgid "Warp Effect"
msgstr "Effet de distorsion"
#: resources/ui/gtk4/TRexAttack.ui:208
msgid "Flash Color"
msgstr "Couleur du flash"
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
msgid "Preview this Effect"
msgstr "Voir l'aperçu de cet effet"
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
msgid "Welcome to Burn-My-Windows!"
msgstr "Bienvenue dans 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 "Si vous aimez cette extension, recommandez-la à vos amis :)"
#: resources/ui/gtk4/prefs.ui:66 resources/ui/gtk3/prefs.ui:74
msgid "Open Window Animation"
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."
#: 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 "Choisir les effets"
#: resources/ui/gtk4/prefs.ui:110 resources/ui/gtk3/prefs.ui:138
msgid "Close Window Animation"
msgstr "Animation de fermeture de fenêtre"
#: resources/ui/gtk4/prefs.ui:150 resources/ui/gtk3/prefs.ui:198
msgid "Also Add Effects to Dialogs"
msgstr "Appliquer également les effets aux boîtes de dialogue"
#: resources/ui/gtk3/Fire.ui:63
msgid "Choose a Preset"
msgstr "Sélectionner un préréglage"
#~ msgid "Via PayPal"
#~ msgstr "Via PayPal"
#~ msgid "Via GitHub"
#~ msgstr "Via GitHub"
+307
View File
@@ -0,0 +1,307 @@
# 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-02-18 20:33+0100\n"
"PO-Revision-Date: 2022-02-28 12:56+0000\n"
"Last-Translator: albanobattistella <albano_battistella@hotmail.com>\n"
"Language-Team: Italian <https://hosted.weblate.org/projects/burn-my-windows/"
"core/it/>\n"
"Language: it\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.11.1-dev\n"
#: prefs.js:111
msgid "Effect Options"
msgstr "Opzioni effetto"
#: prefs.js:139
msgid "Go Back"
msgstr "Indietro"
#: prefs.js:181
msgid "General Options"
msgstr "Opzioni generali"
#: prefs.js:276
msgid "Gold Sponsors"
msgstr "Sponsor d'oro"
#: prefs.js:279
msgid "Silver Sponsors"
msgstr "Sponsor d'argento"
#: prefs.js:282
msgid "Bronze Sponsors"
msgstr "Sponsor di bronzo"
#: prefs.js:285
msgid "Past Sponsors"
msgstr "Sponsor passati"
#. Translators: %s will be replaced by the effect's name.
#: prefs.js:512
#, javascript-format
msgid "Preview for %s"
msgstr "Anteprima per %s"
#: prefs.js:534
msgid "Close this Window to Preview the Effect!"
msgstr "Chiudi questa finestra per visualizzare in anteprima l'effetto!"
#: src/BrokenGlass.js:57
msgid "Broken Glass"
msgstr "Vetro rotto"
#: src/TVEffect.js:56
msgid "TV Effect"
msgstr "Effetto TV"
#: src/TRexAttack.js:56
msgid "T-Rex Attack"
msgstr "Attacco T-Rex"
#: src/Wisps.js:55
msgid "Wisps"
msgstr "Scintille"
#: src/Fire.js:58
msgid "Fire"
msgstr "Fuoco"
#: src/Fire.js:130
msgid "Default Fire"
msgstr "Fuoco predefinito"
#: src/Fire.js:140
msgid "Hell Fire"
msgstr "Fuoco Infernale"
#: src/Fire.js:150
msgid "Dark and Smutty"
msgstr "Scuro e Tenebroso"
#: src/Fire.js:160
msgid "Cold Breeze"
msgstr "Brezza Fredda"
#: src/Fire.js:170
msgid "Santa is Coming"
msgstr "Babbo Natale sta arrivando"
#: src/EnergizeA.js:54
msgid "Energize A"
msgstr "Energia A"
#: src/EnergizeB.js:54
msgid "Energize B"
msgstr "Energia B"
#: src/Matrix.js:58
msgid "Matrix"
msgstr "Matrix"
#: resources/ui/common/main-menu.ui:6
msgid "Visit Homepage"
msgstr "Visita la home page"
#: resources/ui/common/main-menu.ui:10
msgid "View Changelog"
msgstr "Visualizza Changelog"
#: resources/ui/common/main-menu.ui:16
msgid "Report a Bug"
msgstr "Segnala un bug"
#: resources/ui/common/main-menu.ui:20
msgid "Create an Effect"
msgstr "Crea un effetto"
#: resources/ui/common/main-menu.ui:24
msgid "Translate"
msgstr "Traduci"
#: resources/ui/common/main-menu.ui:28
msgid "Donate"
msgstr "Donare"
#: resources/ui/common/main-menu.ui:45
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/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/EnergizeB.ui:24
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
#: resources/ui/gtk3/EnergizeB.ui:42
msgid "Animation Time [ms]"
msgstr "Tempo animazione [ms]"
#: resources/ui/gtk4/Matrix.ui:52 resources/ui/gtk4/Matrix.ui:98
#: resources/ui/gtk4/Matrix.ui:144 resources/ui/gtk4/Matrix.ui:190
#: resources/ui/gtk4/Matrix.ui:224 resources/ui/gtk4/Matrix.ui:258
#: resources/ui/gtk4/BrokenGlass.ui:52 resources/ui/gtk4/BrokenGlass.ui:98
#: resources/ui/gtk4/BrokenGlass.ui:144 resources/ui/gtk4/BrokenGlass.ui:190
#: resources/ui/gtk4/BrokenGlass.ui:244 resources/ui/gtk4/Wisps.ui:52
#: resources/ui/gtk4/Wisps.ui:98 resources/ui/gtk4/Wisps.ui:132
#: resources/ui/gtk4/Fire.ui:77 resources/ui/gtk4/Fire.ui:123
#: resources/ui/gtk4/Fire.ui:169 resources/ui/gtk4/Fire.ui:222
#: resources/ui/gtk4/Fire.ui:280 resources/ui/gtk4/TRexAttack.ui:52
#: resources/ui/gtk4/TRexAttack.ui:98 resources/ui/gtk4/TRexAttack.ui:144
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/EnergizeB.ui:52
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk3/Wisps.ui:68
#: resources/ui/gtk3/Wisps.ui:117 resources/ui/gtk3/Wisps.ui:160
#: resources/ui/gtk3/Fire.ui:119 resources/ui/gtk3/Fire.ui:167
#: resources/ui/gtk3/Fire.ui:215 resources/ui/gtk3/Fire.ui:277
#: resources/ui/gtk3/Fire.ui:345 resources/ui/gtk3/TVEffect.ui:61
#: resources/ui/gtk3/TVEffect.ui:104 resources/ui/gtk3/EnergizeA.ui:68
#: resources/ui/gtk3/EnergizeA.ui:117 resources/ui/gtk3/EnergizeA.ui:160
#: resources/ui/gtk3/EnergizeB.ui:68 resources/ui/gtk3/EnergizeB.ui:117
#: resources/ui/gtk3/EnergizeB.ui:160 resources/ui/gtk3/prefs.ui:219
msgid "Reset to Default Value"
msgstr "Ripristina valore predefinito"
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/EnergizeB.ui:70
#: resources/ui/gtk3/Wisps.ui:91 resources/ui/gtk3/Fire.ui:141
#: resources/ui/gtk3/EnergizeA.ui:91 resources/ui/gtk3/EnergizeB.ui:91
msgid "Scale"
msgstr "Scala"
#: resources/ui/gtk4/Matrix.ui:116
msgid "Randomness"
msgstr "Casuale"
#: resources/ui/gtk4/Matrix.ui:162
msgid "Vertical Overshooting"
msgstr "Sovrapposizione Verticale"
#: resources/ui/gtk4/Matrix.ui:208
msgid "Trail Color"
msgstr "Colore della pista"
#: resources/ui/gtk4/Matrix.ui:242
msgid "Tip Color"
msgstr "Colore della Punta"
#: resources/ui/gtk4/BrokenGlass.ui:116
msgid "Gravity"
msgstr "Gravità"
#: resources/ui/gtk4/BrokenGlass.ui:162
msgid "Blow Force"
msgstr "Forza Esplosiva"
#: resources/ui/gtk4/BrokenGlass.ui:212
msgid "Shatter From Pointer Location"
msgstr "Frammento dalla posizione del puntatore"
#: resources/ui/gtk4/BrokenGlass.ui:221
msgid ""
"The shards will fly away from where your mouse pointer was when closing the "
"window."
msgstr ""
"I frammenti voleranno fuori dal punto in cui si trovava il puntatore del "
"mouse quando chiudi la finestra."
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/TVEffect.ui:70
#: resources/ui/gtk4/EnergizeA.ui:116 resources/ui/gtk4/EnergizeB.ui:116
#: resources/ui/gtk3/Wisps.ui:139 resources/ui/gtk3/TVEffect.ui:83
#: resources/ui/gtk3/EnergizeA.ui:139 resources/ui/gtk3/EnergizeB.ui:139
msgid "Color"
msgstr "Colore"
#: resources/ui/gtk4/Fire.ui:25 resources/ui/gtk3/Fire.ui:49
msgid "Presets"
msgstr "Preimpostazioni"
#: resources/ui/gtk4/Fire.ui:141 resources/ui/gtk3/Fire.ui:189
msgid "Speed"
msgstr "Velocità"
#: resources/ui/gtk4/Fire.ui:191 resources/ui/gtk3/Fire.ui:241
msgid "3D Noise"
msgstr "Rumore 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 "Crea un fuoco più dinamico ma richiede più potenza della GPU."
#: 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 "Scala ad Artiglio"
#: resources/ui/gtk4/TRexAttack.ui:116
msgid "Claw Scratch Count"
msgstr "Numero di colpi"
#: resources/ui/gtk4/TRexAttack.ui:162
msgid "Warp Effect"
msgstr "Effetto Distorsione"
#: resources/ui/gtk4/TRexAttack.ui:208
msgid "Flash Color"
msgstr "Colore Flash"
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
msgid "Preview this Effect"
msgstr "Anteprima di questo effetto"
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
msgid "Welcome to Burn-My-Windows!"
msgstr "Benvenuto in 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 ti piace questa estensione, consigliala ai tuoi amici :)"
#: resources/ui/gtk4/prefs.ui:66 resources/ui/gtk3/prefs.ui:74
msgid "Open Window Animation"
msgstr "Animazione all'apertura della finestra"
#: 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 ne vengono selezionati multipli, uno viene scelto a caso."
#: 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 "Scegli Effetti"
#: resources/ui/gtk4/prefs.ui:110 resources/ui/gtk3/prefs.ui:138
msgid "Close Window Animation"
msgstr "Animazione alla chiusura della finestra"
#: resources/ui/gtk4/prefs.ui:150 resources/ui/gtk3/prefs.ui:198
msgid "Also Add Effects to Dialogs"
msgstr "Aggiungi anche effetti ai dialoghi"
#: resources/ui/gtk3/Fire.ui:63
msgid "Choose a Preset"
msgstr "Scegli un predefinito"
#~ msgid "Via PayPal"
#~ msgstr "Tramite PayPal"
#~ msgid "Via GitHub"
#~ msgstr "Tramite GitHub"
+305
View File
@@ -0,0 +1,305 @@
# 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-02-18 20:33+0100\n"
"PO-Revision-Date: 2022-01-29 12:30+0000\n"
"Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
"Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/burn-my-"
"windows/core/nb_NO/>\n"
"Language: nb_NO\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.11-dev\n"
#: prefs.js:111
msgid "Effect Options"
msgstr ""
#: prefs.js:139
msgid "Go Back"
msgstr ""
#: prefs.js:181
msgid "General Options"
msgstr ""
#: prefs.js:276
msgid "Gold Sponsors"
msgstr ""
#: prefs.js:279
msgid "Silver Sponsors"
msgstr ""
#: prefs.js:282
msgid "Bronze Sponsors"
msgstr ""
#: prefs.js:285
msgid "Past Sponsors"
msgstr ""
#. Translators: %s will be replaced by the effect's name.
#: prefs.js:512
#, javascript-format
msgid "Preview for %s"
msgstr ""
#: prefs.js:534
msgid "Close this Window to Preview the Effect!"
msgstr ""
#: src/BrokenGlass.js:57
msgid "Broken Glass"
msgstr ""
#: src/TVEffect.js:56
msgid "TV Effect"
msgstr ""
#: src/TRexAttack.js:56
msgid "T-Rex Attack"
msgstr ""
#: src/Wisps.js:55
msgid "Wisps"
msgstr ""
#: src/Fire.js:58
msgid "Fire"
msgstr ""
#: src/Fire.js:130
msgid "Default Fire"
msgstr ""
#: src/Fire.js:140
msgid "Hell Fire"
msgstr ""
#: src/Fire.js:150
msgid "Dark and Smutty"
msgstr ""
#: src/Fire.js:160
msgid "Cold Breeze"
msgstr ""
#: src/Fire.js:170
msgid "Santa is Coming"
msgstr ""
#: src/EnergizeA.js:54
msgid "Energize A"
msgstr ""
#: src/EnergizeB.js:54
msgid "Energize B"
msgstr ""
#: src/Matrix.js:58
msgid "Matrix"
msgstr ""
#: resources/ui/common/main-menu.ui:6
msgid "Visit Homepage"
msgstr ""
#: resources/ui/common/main-menu.ui:10
msgid "View Changelog"
msgstr ""
#: 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 "Oversett"
#: resources/ui/common/main-menu.ui:28
msgid "Donate"
msgstr "Doner"
#: resources/ui/common/main-menu.ui:45
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/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/EnergizeB.ui:24
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
#: resources/ui/gtk3/EnergizeB.ui:42
msgid "Animation Time [ms]"
msgstr "Animasjonstid [ms]"
#: resources/ui/gtk4/Matrix.ui:52 resources/ui/gtk4/Matrix.ui:98
#: resources/ui/gtk4/Matrix.ui:144 resources/ui/gtk4/Matrix.ui:190
#: resources/ui/gtk4/Matrix.ui:224 resources/ui/gtk4/Matrix.ui:258
#: resources/ui/gtk4/BrokenGlass.ui:52 resources/ui/gtk4/BrokenGlass.ui:98
#: resources/ui/gtk4/BrokenGlass.ui:144 resources/ui/gtk4/BrokenGlass.ui:190
#: resources/ui/gtk4/BrokenGlass.ui:244 resources/ui/gtk4/Wisps.ui:52
#: resources/ui/gtk4/Wisps.ui:98 resources/ui/gtk4/Wisps.ui:132
#: resources/ui/gtk4/Fire.ui:77 resources/ui/gtk4/Fire.ui:123
#: resources/ui/gtk4/Fire.ui:169 resources/ui/gtk4/Fire.ui:222
#: resources/ui/gtk4/Fire.ui:280 resources/ui/gtk4/TRexAttack.ui:52
#: resources/ui/gtk4/TRexAttack.ui:98 resources/ui/gtk4/TRexAttack.ui:144
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/EnergizeB.ui:52
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk3/Wisps.ui:68
#: resources/ui/gtk3/Wisps.ui:117 resources/ui/gtk3/Wisps.ui:160
#: resources/ui/gtk3/Fire.ui:119 resources/ui/gtk3/Fire.ui:167
#: resources/ui/gtk3/Fire.ui:215 resources/ui/gtk3/Fire.ui:277
#: resources/ui/gtk3/Fire.ui:345 resources/ui/gtk3/TVEffect.ui:61
#: resources/ui/gtk3/TVEffect.ui:104 resources/ui/gtk3/EnergizeA.ui:68
#: resources/ui/gtk3/EnergizeA.ui:117 resources/ui/gtk3/EnergizeA.ui:160
#: resources/ui/gtk3/EnergizeB.ui:68 resources/ui/gtk3/EnergizeB.ui:117
#: resources/ui/gtk3/EnergizeB.ui:160 resources/ui/gtk3/prefs.ui:219
msgid "Reset to Default Value"
msgstr ""
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/EnergizeB.ui:70
#: resources/ui/gtk3/Wisps.ui:91 resources/ui/gtk3/Fire.ui:141
#: resources/ui/gtk3/EnergizeA.ui:91 resources/ui/gtk3/EnergizeB.ui:91
msgid "Scale"
msgstr ""
#: resources/ui/gtk4/Matrix.ui:116
msgid "Randomness"
msgstr ""
#: resources/ui/gtk4/Matrix.ui:162
msgid "Vertical Overshooting"
msgstr ""
#: resources/ui/gtk4/Matrix.ui:208
msgid "Trail Color"
msgstr ""
#: resources/ui/gtk4/Matrix.ui:242
msgid "Tip Color"
msgstr ""
#: resources/ui/gtk4/BrokenGlass.ui:116
msgid "Gravity"
msgstr ""
#: resources/ui/gtk4/BrokenGlass.ui:162
msgid "Blow Force"
msgstr ""
#: resources/ui/gtk4/BrokenGlass.ui:212
msgid "Shatter From Pointer Location"
msgstr ""
#: resources/ui/gtk4/BrokenGlass.ui:221
msgid ""
"The shards will fly away from where your mouse pointer was when closing the "
"window."
msgstr ""
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/TVEffect.ui:70
#: resources/ui/gtk4/EnergizeA.ui:116 resources/ui/gtk4/EnergizeB.ui:116
#: resources/ui/gtk3/Wisps.ui:139 resources/ui/gtk3/TVEffect.ui:83
#: resources/ui/gtk3/EnergizeA.ui:139 resources/ui/gtk3/EnergizeB.ui:139
msgid "Color"
msgstr ""
#: resources/ui/gtk4/Fire.ui:25 resources/ui/gtk3/Fire.ui:49
msgid "Presets"
msgstr ""
#: resources/ui/gtk4/Fire.ui:141 resources/ui/gtk3/Fire.ui:189
msgid "Speed"
msgstr ""
#: resources/ui/gtk4/Fire.ui:191 resources/ui/gtk3/Fire.ui:241
msgid "3D Noise"
msgstr ""
#: resources/ui/gtk4/Fire.ui:200 resources/ui/gtk3/Fire.ui:250
msgid "Creates a more dynamic fire but requires more GPU power."
msgstr ""
#: resources/ui/gtk4/Fire.ui:240 resources/ui/gtk3/Fire.ui:300
msgid "Gradient"
msgstr ""
#: resources/ui/gtk4/TRexAttack.ui:70
msgid "Claw Scratch Scale"
msgstr ""
#: resources/ui/gtk4/TRexAttack.ui:116
msgid "Claw Scratch Count"
msgstr ""
#: resources/ui/gtk4/TRexAttack.ui:162
msgid "Warp Effect"
msgstr ""
#: resources/ui/gtk4/TRexAttack.ui:208
msgid "Flash Color"
msgstr ""
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
msgid "Preview this Effect"
msgstr ""
#: resources/ui/gtk4/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/gtk3/Fire.ui:63
msgid "Choose a Preset"
msgstr ""
#~ msgid "Via PayPal"
#~ msgstr "med PayPal"
#~ msgid "Via GitHub"
#~ msgstr "på GitHub"
+308
View File
@@ -0,0 +1,308 @@
# 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-02-18 20:33+0100\n"
"PO-Revision-Date: 2022-02-21 11:58+0000\n"
"Last-Translator: Heimen Stoffels <vistausss@fastmail.com>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/burn-my-windows/"
"core/nl/>\n"
"Language: nl\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.11-dev\n"
#: prefs.js:111
msgid "Effect Options"
msgstr "Effectvoorkeuren"
#: prefs.js:139
msgid "Go Back"
msgstr "Scherm sluiten"
#: prefs.js:181
msgid "General Options"
msgstr "Algemene voorkeuren"
#: prefs.js:276
msgid "Gold Sponsors"
msgstr "Gouden sponsoren"
#: prefs.js:279
msgid "Silver Sponsors"
msgstr "Zilveren sponsoren"
#: prefs.js:282
msgid "Bronze Sponsors"
msgstr "Bronzen sponsoren"
#: prefs.js:285
msgid "Past Sponsors"
msgstr "Voormalige sponsoren"
#. Translators: %s will be replaced by the effect's name.
#: prefs.js:512
#, javascript-format
msgid "Preview for %s"
msgstr "%s-voorvertoning"
#: prefs.js:534
msgid "Close this Window to Preview the Effect!"
msgstr "Sluit dit venster om het effect voor te vertonen."
#: src/BrokenGlass.js:57
msgid "Broken Glass"
msgstr "Gebroken glas"
#: src/TVEffect.js:56
msgid "TV Effect"
msgstr "Tv-effect"
#: src/TRexAttack.js:56
msgid "T-Rex Attack"
msgstr "T-Rex-aanval"
#: src/Wisps.js:55
msgid "Wisps"
msgstr "Dwaallicht"
#: src/Fire.js:58
msgid "Fire"
msgstr "Vuur"
#: src/Fire.js:130
msgid "Default Fire"
msgstr "Normaal vuur"
#: src/Fire.js:140
msgid "Hell Fire"
msgstr "Hellevuur"
#: src/Fire.js:150
msgid "Dark and Smutty"
msgstr "Donker en zwart"
#: src/Fire.js:160
msgid "Cold Breeze"
msgstr "Koude wind"
#: src/Fire.js:170
msgid "Santa is Coming"
msgstr "Kerstmanvuur"
#: src/EnergizeA.js:54
msgid "Energize A"
msgstr "Stimulatie A"
#: src/EnergizeB.js:54
msgid "Energize B"
msgstr "Stimulatie B"
#: src/Matrix.js:58
msgid "Matrix"
msgstr "Matrix"
#: resources/ui/common/main-menu.ui:6
msgid "Visit Homepage"
msgstr "Website openen"
#: resources/ui/common/main-menu.ui:10
msgid "View Changelog"
msgstr "Wijzigingslog bekijken"
#: resources/ui/common/main-menu.ui:16
msgid "Report a Bug"
msgstr "Bug melden"
#: resources/ui/common/main-menu.ui:20
msgid "Create an Effect"
msgstr "Effect creëren"
#: resources/ui/common/main-menu.ui:24
msgid "Translate"
msgstr "Vertalen"
#: resources/ui/common/main-menu.ui:28
msgid "Donate"
msgstr "Doneren"
#: resources/ui/common/main-menu.ui:45
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/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/EnergizeB.ui:24
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
#: resources/ui/gtk3/EnergizeB.ui:42
msgid "Animation Time [ms]"
msgstr "Animatieduur [in ms]"
#: resources/ui/gtk4/Matrix.ui:52 resources/ui/gtk4/Matrix.ui:98
#: resources/ui/gtk4/Matrix.ui:144 resources/ui/gtk4/Matrix.ui:190
#: resources/ui/gtk4/Matrix.ui:224 resources/ui/gtk4/Matrix.ui:258
#: resources/ui/gtk4/BrokenGlass.ui:52 resources/ui/gtk4/BrokenGlass.ui:98
#: resources/ui/gtk4/BrokenGlass.ui:144 resources/ui/gtk4/BrokenGlass.ui:190
#: resources/ui/gtk4/BrokenGlass.ui:244 resources/ui/gtk4/Wisps.ui:52
#: resources/ui/gtk4/Wisps.ui:98 resources/ui/gtk4/Wisps.ui:132
#: resources/ui/gtk4/Fire.ui:77 resources/ui/gtk4/Fire.ui:123
#: resources/ui/gtk4/Fire.ui:169 resources/ui/gtk4/Fire.ui:222
#: resources/ui/gtk4/Fire.ui:280 resources/ui/gtk4/TRexAttack.ui:52
#: resources/ui/gtk4/TRexAttack.ui:98 resources/ui/gtk4/TRexAttack.ui:144
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/EnergizeB.ui:52
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk3/Wisps.ui:68
#: resources/ui/gtk3/Wisps.ui:117 resources/ui/gtk3/Wisps.ui:160
#: resources/ui/gtk3/Fire.ui:119 resources/ui/gtk3/Fire.ui:167
#: resources/ui/gtk3/Fire.ui:215 resources/ui/gtk3/Fire.ui:277
#: resources/ui/gtk3/Fire.ui:345 resources/ui/gtk3/TVEffect.ui:61
#: resources/ui/gtk3/TVEffect.ui:104 resources/ui/gtk3/EnergizeA.ui:68
#: resources/ui/gtk3/EnergizeA.ui:117 resources/ui/gtk3/EnergizeA.ui:160
#: resources/ui/gtk3/EnergizeB.ui:68 resources/ui/gtk3/EnergizeB.ui:117
#: resources/ui/gtk3/EnergizeB.ui:160 resources/ui/gtk3/prefs.ui:219
msgid "Reset to Default Value"
msgstr "Standaardwaarde herstellen"
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/EnergizeB.ui:70
#: resources/ui/gtk3/Wisps.ui:91 resources/ui/gtk3/Fire.ui:141
#: resources/ui/gtk3/EnergizeA.ui:91 resources/ui/gtk3/EnergizeB.ui:91
msgid "Scale"
msgstr "Schaal"
#: resources/ui/gtk4/Matrix.ui:116
msgid "Randomness"
msgstr "Willekeurigheid"
#: resources/ui/gtk4/Matrix.ui:162
msgid "Vertical Overshooting"
msgstr "Verticale verspringing"
#: resources/ui/gtk4/Matrix.ui:208
msgid "Trail Color"
msgstr "Sleepspoorkleur"
#: resources/ui/gtk4/Matrix.ui:242
msgid "Tip Color"
msgstr "Piekkleur"
#: resources/ui/gtk4/BrokenGlass.ui:116
msgid "Gravity"
msgstr "Zwaartekracht"
#: resources/ui/gtk4/BrokenGlass.ui:162
msgid "Blow Force"
msgstr "Windkracht"
#: resources/ui/gtk4/BrokenGlass.ui:212
msgid "Shatter From Pointer Location"
msgstr "Uiteenvallen bij cursorpositie"
#: resources/ui/gtk4/BrokenGlass.ui:221
msgid ""
"The shards will fly away from where your mouse pointer was when closing the "
"window."
msgstr ""
"De stukken vliegen weg vanaf de cursorpositie na het sluiten van een venster."
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/TVEffect.ui:70
#: resources/ui/gtk4/EnergizeA.ui:116 resources/ui/gtk4/EnergizeB.ui:116
#: resources/ui/gtk3/Wisps.ui:139 resources/ui/gtk3/TVEffect.ui:83
#: resources/ui/gtk3/EnergizeA.ui:139 resources/ui/gtk3/EnergizeB.ui:139
msgid "Color"
msgstr "Kleur"
#: resources/ui/gtk4/Fire.ui:25 resources/ui/gtk3/Fire.ui:49
msgid "Presets"
msgstr "Voorinstellingen"
#: resources/ui/gtk4/Fire.ui:141 resources/ui/gtk3/Fire.ui:189
msgid "Speed"
msgstr "Snelheid"
#: resources/ui/gtk4/Fire.ui:191 resources/ui/gtk3/Fire.ui:241
msgid "3D Noise"
msgstr "3D-ruis"
#: resources/ui/gtk4/Fire.ui:200 resources/ui/gtk3/Fire.ui:250
msgid "Creates a more dynamic fire but requires more GPU power."
msgstr "Zorgt voor een speels vuur, maar vereist meer computerkracht."
#: resources/ui/gtk4/Fire.ui:240 resources/ui/gtk3/Fire.ui:300
msgid "Gradient"
msgstr "Verloop"
#: resources/ui/gtk4/TRexAttack.ui:70
msgid "Claw Scratch Scale"
msgstr "Schaal van pootkrabben"
#: resources/ui/gtk4/TRexAttack.ui:116
msgid "Claw Scratch Count"
msgstr "Aantal pootkrabben"
#: resources/ui/gtk4/TRexAttack.ui:162
msgid "Warp Effect"
msgstr "Vervormingseffect"
#: resources/ui/gtk4/TRexAttack.ui:208
msgid "Flash Color"
msgstr "Flitskleur"
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
msgid "Preview this Effect"
msgstr "Voorvertonen"
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
msgid "Welcome to Burn-My-Windows!"
msgstr "Welkom bij ‘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 ""
"Als u deze uitbreiding leuk vindt, deel hem dan met vrienden en kennissen. :)"
#: resources/ui/gtk4/prefs.ui:66 resources/ui/gtk3/prefs.ui:74
msgid "Open Window Animation"
msgstr "Animatie bij openen van vensters"
#: 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 ""
"Als er meerdere effecten zijn geselecteerd, dan wordt er willekeurig gekozen."
#: 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 "Kies de effecten"
#: resources/ui/gtk4/prefs.ui:110 resources/ui/gtk3/prefs.ui:138
msgid "Close Window Animation"
msgstr "Animatie bij sluiten van vensters"
#: resources/ui/gtk4/prefs.ui:150 resources/ui/gtk3/prefs.ui:198
msgid "Also Add Effects to Dialogs"
msgstr "Dialoogvensters ook voorzien van effecten"
#: resources/ui/gtk3/Fire.ui:63
msgid "Choose a Preset"
msgstr "Kies een voorinstelling"
#~ msgid "Via PayPal"
#~ msgstr "Via PayPal"
#~ msgid "Via GitHub"
#~ msgstr "Via GitHub"
+304
View File
@@ -0,0 +1,304 @@
# 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-02-18 20:33+0100\n"
"PO-Revision-Date: 2022-03-29 18:24+0000\n"
"Last-Translator: ANIGO R. (AR) <franigoyt@gmail.com>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/burn-my-windows/"
"core/ru/>\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.12-dev\n"
#: prefs.js:111
msgid "Effect Options"
msgstr "Параметры эффекта"
#: prefs.js:139
msgid "Go Back"
msgstr "Назад"
#: prefs.js:181
msgid "General Options"
msgstr "Общие настройки"
#: prefs.js:276
msgid "Gold Sponsors"
msgstr "Золотые спонсоры"
#: prefs.js:279
msgid "Silver Sponsors"
msgstr "Серебряные спонсоры"
#: prefs.js:282
msgid "Bronze Sponsors"
msgstr "Бронзовые спонсоры"
#: prefs.js:285
msgid "Past Sponsors"
msgstr "Прошлые спонсоры"
#. Translators: %s will be replaced by the effect's name.
#: prefs.js:512
#, javascript-format
msgid "Preview for %s"
msgstr "Предварительный просмотр %s"
#: prefs.js:534
msgid "Close this Window to Preview the Effect!"
msgstr "Закройте это окно для предварительного просмотра эффекта!"
#: src/BrokenGlass.js:57
msgid "Broken Glass"
msgstr "Разбитое стекло"
#: src/TVEffect.js:56
msgid "TV Effect"
msgstr "Телевизионный эффект"
#: src/TRexAttack.js:56
msgid "T-Rex Attack"
msgstr "T-Rex атака"
#: src/Wisps.js:55
msgid "Wisps"
msgstr "Огоньки"
#: src/Fire.js:58
msgid "Fire"
msgstr "Огонь"
#: src/Fire.js:130
msgid "Default Fire"
msgstr "по умолчанию FIRE"
#: src/Fire.js:140
msgid "Hell Fire"
msgstr "Адский Огонь"
#: src/Fire.js:150
msgid "Dark and Smutty"
msgstr "Тёмный и развратный"
#: src/Fire.js:160
msgid "Cold Breeze"
msgstr "Холодный ветер"
#: src/Fire.js:170
msgid "Santa is Coming"
msgstr "Дед мороз приходит"
#: src/EnergizeA.js:54
msgid "Energize A"
msgstr "Заряжение A"
#: src/EnergizeB.js:54
msgid "Energize B"
msgstr "Энергия B"
#: src/Matrix.js:58
msgid "Matrix"
msgstr "Матрица"
#: resources/ui/common/main-menu.ui:6
msgid "Visit Homepage"
msgstr "Перейти на главную страницу"
#: resources/ui/common/main-menu.ui:10
msgid "View Changelog"
msgstr "Просмотреть список изменений"
#: resources/ui/common/main-menu.ui:16
msgid "Report a Bug"
msgstr "Сообщить об ошибке"
#: resources/ui/common/main-menu.ui:20
msgid "Create an Effect"
msgstr "Создать эффект"
#: resources/ui/common/main-menu.ui:24
msgid "Translate"
msgstr "Перевести"
#: resources/ui/common/main-menu.ui:28
msgid "Donate"
msgstr "Пожертвовать"
#: resources/ui/common/main-menu.ui:45
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/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/EnergizeB.ui:24
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
#: resources/ui/gtk3/EnergizeB.ui:42
msgid "Animation Time [ms]"
msgstr "Время анимации (mc)"
#: resources/ui/gtk4/Matrix.ui:52 resources/ui/gtk4/Matrix.ui:98
#: resources/ui/gtk4/Matrix.ui:144 resources/ui/gtk4/Matrix.ui:190
#: resources/ui/gtk4/Matrix.ui:224 resources/ui/gtk4/Matrix.ui:258
#: resources/ui/gtk4/BrokenGlass.ui:52 resources/ui/gtk4/BrokenGlass.ui:98
#: resources/ui/gtk4/BrokenGlass.ui:144 resources/ui/gtk4/BrokenGlass.ui:190
#: resources/ui/gtk4/BrokenGlass.ui:244 resources/ui/gtk4/Wisps.ui:52
#: resources/ui/gtk4/Wisps.ui:98 resources/ui/gtk4/Wisps.ui:132
#: resources/ui/gtk4/Fire.ui:77 resources/ui/gtk4/Fire.ui:123
#: resources/ui/gtk4/Fire.ui:169 resources/ui/gtk4/Fire.ui:222
#: resources/ui/gtk4/Fire.ui:280 resources/ui/gtk4/TRexAttack.ui:52
#: resources/ui/gtk4/TRexAttack.ui:98 resources/ui/gtk4/TRexAttack.ui:144
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/EnergizeB.ui:52
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk3/Wisps.ui:68
#: resources/ui/gtk3/Wisps.ui:117 resources/ui/gtk3/Wisps.ui:160
#: resources/ui/gtk3/Fire.ui:119 resources/ui/gtk3/Fire.ui:167
#: resources/ui/gtk3/Fire.ui:215 resources/ui/gtk3/Fire.ui:277
#: resources/ui/gtk3/Fire.ui:345 resources/ui/gtk3/TVEffect.ui:61
#: resources/ui/gtk3/TVEffect.ui:104 resources/ui/gtk3/EnergizeA.ui:68
#: resources/ui/gtk3/EnergizeA.ui:117 resources/ui/gtk3/EnergizeA.ui:160
#: resources/ui/gtk3/EnergizeB.ui:68 resources/ui/gtk3/EnergizeB.ui:117
#: resources/ui/gtk3/EnergizeB.ui:160 resources/ui/gtk3/prefs.ui:219
msgid "Reset to Default Value"
msgstr "Сброс на значение по умолчанию"
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/EnergizeB.ui:70
#: resources/ui/gtk3/Wisps.ui:91 resources/ui/gtk3/Fire.ui:141
#: resources/ui/gtk3/EnergizeA.ui:91 resources/ui/gtk3/EnergizeB.ui:91
msgid "Scale"
msgstr "Масштаб"
#: resources/ui/gtk4/Matrix.ui:116
msgid "Randomness"
msgstr "Случайность"
#: resources/ui/gtk4/Matrix.ui:162
msgid "Vertical Overshooting"
msgstr "Вертикальное превышение"
#: resources/ui/gtk4/Matrix.ui:208
msgid "Trail Color"
msgstr "Цвет следа"
#: resources/ui/gtk4/Matrix.ui:242
msgid "Tip Color"
msgstr "Цвет наконечника"
#: resources/ui/gtk4/BrokenGlass.ui:116
msgid "Gravity"
msgstr "Сила тяжести"
#: resources/ui/gtk4/BrokenGlass.ui:162
msgid "Blow Force"
msgstr "Сила удара"
#: resources/ui/gtk4/BrokenGlass.ui:212
msgid "Shatter From Pointer Location"
msgstr "Разбить из местоположения указателя"
#: resources/ui/gtk4/BrokenGlass.ui:221
msgid ""
"The shards will fly away from where your mouse pointer was when closing the "
"window."
msgstr ""
"Осколки разлетятся в стороны от того места, где находился указатель мыши при "
"закрытии окна."
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/TVEffect.ui:70
#: resources/ui/gtk4/EnergizeA.ui:116 resources/ui/gtk4/EnergizeB.ui:116
#: resources/ui/gtk3/Wisps.ui:139 resources/ui/gtk3/TVEffect.ui:83
#: resources/ui/gtk3/EnergizeA.ui:139 resources/ui/gtk3/EnergizeB.ui:139
msgid "Color"
msgstr "Цвет"
#: resources/ui/gtk4/Fire.ui:25 resources/ui/gtk3/Fire.ui:49
msgid "Presets"
msgstr "Заготовки"
#: resources/ui/gtk4/Fire.ui:141 resources/ui/gtk3/Fire.ui:189
msgid "Speed"
msgstr "Скорость"
#: resources/ui/gtk4/Fire.ui:191 resources/ui/gtk3/Fire.ui:241
msgid "3D Noise"
msgstr "3D Шум"
#: resources/ui/gtk4/Fire.ui:200 resources/ui/gtk3/Fire.ui:250
msgid "Creates a more dynamic fire but requires more GPU power."
msgstr "Создает более динамичный огонь, но требует большей мощности GPU."
#: resources/ui/gtk4/Fire.ui:240 resources/ui/gtk3/Fire.ui:300
msgid "Gradient"
msgstr "Градиент"
#: resources/ui/gtk4/TRexAttack.ui:70
msgid "Claw Scratch Scale"
msgstr "царапины"
#: resources/ui/gtk4/TRexAttack.ui:116
msgid "Claw Scratch Count"
msgstr "Количество царапин от когтей"
#: resources/ui/gtk4/TRexAttack.ui:162
msgid "Warp Effect"
msgstr "Эффект искривления"
#: resources/ui/gtk4/TRexAttack.ui:208
msgid "Flash Color"
msgstr "Цвет вспышки"
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
msgid "Preview this Effect"
msgstr "Предварительный просмотр этого эффекта"
#: resources/ui/gtk4/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/gtk3/Fire.ui:63
msgid "Choose a Preset"
msgstr "Выберите заготовку"
+301
View File
@@ -0,0 +1,301 @@
# 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-02-18 20:33+0100\n"
"PO-Revision-Date: 2022-03-21 05:57+0000\n"
"Last-Translator: Muha Aliss <muhaaliss@pm.me>\n"
"Language-Team: Turkish <https://hosted.weblate.org/projects/burn-my-windows/"
"core/tr/>\n"
"Language: tr\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:111
msgid "Effect Options"
msgstr "Efekt Seçenekleri"
#: prefs.js:139
msgid "Go Back"
msgstr "Geri Dön"
#: prefs.js:181
msgid "General Options"
msgstr "Genel Ayarlar"
#: prefs.js:276
msgid "Gold Sponsors"
msgstr "Altın Sponsorlar"
#: prefs.js:279
msgid "Silver Sponsors"
msgstr "Gümüş Sponsorlar"
#: prefs.js:282
msgid "Bronze Sponsors"
msgstr "Bronz Sponsorlar"
#: prefs.js:285
msgid "Past Sponsors"
msgstr "Eski Sponsorlar"
#. Translators: %s will be replaced by the effect's name.
#: prefs.js:512
#, javascript-format
msgid "Preview for %s"
msgstr "%s ön izleme"
#: prefs.js:534
msgid "Close this Window to Preview the Effect!"
msgstr "Efekti Ön izlemek İçin Bu Pencereyi Kapatın!"
#: src/BrokenGlass.js:57
msgid "Broken Glass"
msgstr "Kırılan Cam"
#: src/TVEffect.js:56
msgid "TV Effect"
msgstr "TV Efekti"
#: src/TRexAttack.js:56
msgid "T-Rex Attack"
msgstr "T-Rex Saldırısı"
#: src/Wisps.js:55
msgid "Wisps"
msgstr ""
#: src/Fire.js:58
msgid "Fire"
msgstr "Ateş"
#: src/Fire.js:130
msgid "Default Fire"
msgstr "Varsayılan Ateş"
#: src/Fire.js:140
msgid "Hell Fire"
msgstr "Cehennem Ateşi"
#: src/Fire.js:150
msgid "Dark and Smutty"
msgstr "Karanlık ve Sürmeli"
#: src/Fire.js:160
msgid "Cold Breeze"
msgstr "Soğuk Esinti"
#: src/Fire.js:170
msgid "Santa is Coming"
msgstr "Noel Baba Geliyor"
#: src/EnergizeA.js:54
msgid "Energize A"
msgstr "Enerji A"
#: src/EnergizeB.js:54
msgid "Energize B"
msgstr "Enerji B"
#: src/Matrix.js:58
msgid "Matrix"
msgstr "Matrix"
#: resources/ui/common/main-menu.ui:6
msgid "Visit Homepage"
msgstr "Ana Sayfaya Git"
#: resources/ui/common/main-menu.ui:10
msgid "View Changelog"
msgstr "Değişim Günlüğü"
#: resources/ui/common/main-menu.ui:16
msgid "Report a Bug"
msgstr "Hata Bildir"
#: resources/ui/common/main-menu.ui:20
msgid "Create an Effect"
msgstr "Efekt Oluştur"
#: resources/ui/common/main-menu.ui:24
msgid "Translate"
msgstr "Çevir"
#: resources/ui/common/main-menu.ui:28
msgid "Donate"
msgstr "Bağış"
#: resources/ui/common/main-menu.ui:45
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/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/EnergizeB.ui:24
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
#: resources/ui/gtk3/EnergizeB.ui:42
msgid "Animation Time [ms]"
msgstr "Animasyon Süresi [ms]"
#: resources/ui/gtk4/Matrix.ui:52 resources/ui/gtk4/Matrix.ui:98
#: resources/ui/gtk4/Matrix.ui:144 resources/ui/gtk4/Matrix.ui:190
#: resources/ui/gtk4/Matrix.ui:224 resources/ui/gtk4/Matrix.ui:258
#: resources/ui/gtk4/BrokenGlass.ui:52 resources/ui/gtk4/BrokenGlass.ui:98
#: resources/ui/gtk4/BrokenGlass.ui:144 resources/ui/gtk4/BrokenGlass.ui:190
#: resources/ui/gtk4/BrokenGlass.ui:244 resources/ui/gtk4/Wisps.ui:52
#: resources/ui/gtk4/Wisps.ui:98 resources/ui/gtk4/Wisps.ui:132
#: resources/ui/gtk4/Fire.ui:77 resources/ui/gtk4/Fire.ui:123
#: resources/ui/gtk4/Fire.ui:169 resources/ui/gtk4/Fire.ui:222
#: resources/ui/gtk4/Fire.ui:280 resources/ui/gtk4/TRexAttack.ui:52
#: resources/ui/gtk4/TRexAttack.ui:98 resources/ui/gtk4/TRexAttack.ui:144
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/EnergizeB.ui:52
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk3/Wisps.ui:68
#: resources/ui/gtk3/Wisps.ui:117 resources/ui/gtk3/Wisps.ui:160
#: resources/ui/gtk3/Fire.ui:119 resources/ui/gtk3/Fire.ui:167
#: resources/ui/gtk3/Fire.ui:215 resources/ui/gtk3/Fire.ui:277
#: resources/ui/gtk3/Fire.ui:345 resources/ui/gtk3/TVEffect.ui:61
#: resources/ui/gtk3/TVEffect.ui:104 resources/ui/gtk3/EnergizeA.ui:68
#: resources/ui/gtk3/EnergizeA.ui:117 resources/ui/gtk3/EnergizeA.ui:160
#: resources/ui/gtk3/EnergizeB.ui:68 resources/ui/gtk3/EnergizeB.ui:117
#: resources/ui/gtk3/EnergizeB.ui:160 resources/ui/gtk3/prefs.ui:219
msgid "Reset to Default Value"
msgstr "Varsayılan Değere Sıfırla"
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/EnergizeB.ui:70
#: resources/ui/gtk3/Wisps.ui:91 resources/ui/gtk3/Fire.ui:141
#: resources/ui/gtk3/EnergizeA.ui:91 resources/ui/gtk3/EnergizeB.ui:91
msgid "Scale"
msgstr "Ölçek"
#: resources/ui/gtk4/Matrix.ui:116
msgid "Randomness"
msgstr "Rastgelelik"
#: resources/ui/gtk4/Matrix.ui:162
msgid "Vertical Overshooting"
msgstr "Dikey Taşma"
#: resources/ui/gtk4/Matrix.ui:208
msgid "Trail Color"
msgstr "İz Rengi"
#: resources/ui/gtk4/Matrix.ui:242
msgid "Tip Color"
msgstr "Yazı Rengi"
#: resources/ui/gtk4/BrokenGlass.ui:116
msgid "Gravity"
msgstr "Yer Çekimi"
#: resources/ui/gtk4/BrokenGlass.ui:162
msgid "Blow Force"
msgstr "Darbe Kuvveti"
#: resources/ui/gtk4/BrokenGlass.ui:212
msgid "Shatter From Pointer Location"
msgstr "İşaretçi Konumundan Parçalanma"
#: resources/ui/gtk4/BrokenGlass.ui:221
msgid ""
"The shards will fly away from where your mouse pointer was when closing the "
"window."
msgstr ""
"Parçalar, pencereyi kapatırken fare işaretçinizin bulunduğu yerden uzağa "
"uçacaktır."
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/TVEffect.ui:70
#: resources/ui/gtk4/EnergizeA.ui:116 resources/ui/gtk4/EnergizeB.ui:116
#: resources/ui/gtk3/Wisps.ui:139 resources/ui/gtk3/TVEffect.ui:83
#: resources/ui/gtk3/EnergizeA.ui:139 resources/ui/gtk3/EnergizeB.ui:139
msgid "Color"
msgstr "Renk"
#: resources/ui/gtk4/Fire.ui:25 resources/ui/gtk3/Fire.ui:49
msgid "Presets"
msgstr "Şablon"
#: resources/ui/gtk4/Fire.ui:141 resources/ui/gtk3/Fire.ui:189
msgid "Speed"
msgstr "Hız"
#: 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 "Daha dinamik bir ateş oluşturur ancak daha fazla GPU gücü gerektirir."
#: resources/ui/gtk4/Fire.ui:240 resources/ui/gtk3/Fire.ui:300
msgid "Gradient"
msgstr "Gradyan"
#: resources/ui/gtk4/TRexAttack.ui:70
msgid "Claw Scratch Scale"
msgstr "Pençe Çizik Ölçeği"
#: resources/ui/gtk4/TRexAttack.ui:116
msgid "Claw Scratch Count"
msgstr "Pençe Çizik Sayısı"
#: resources/ui/gtk4/TRexAttack.ui:162
msgid "Warp Effect"
msgstr ""
#: resources/ui/gtk4/TRexAttack.ui:208
msgid "Flash Color"
msgstr "Flaş Rengi"
#: resources/ui/gtk4/effectPage.ui:37 resources/ui/gtk3/effectPage.ui:37
msgid "Preview this Effect"
msgstr "Bu Efekti Önizle"
#: resources/ui/gtk4/prefs.ui:28 resources/ui/gtk3/prefs.ui:35
msgid "Welcome to Burn-My-Windows!"
msgstr "Burn-My-Windows'a Hoş Geldiniz!"
#: resources/ui/gtk4/prefs.ui:39 resources/ui/gtk3/prefs.ui:46
msgid "If you like this extension, recommend it to your friends :)"
msgstr "Bu uzantıyı beğendiyseniz, arkadaşlarınıza tavsiye edin :)"
#: resources/ui/gtk4/prefs.ui:66 resources/ui/gtk3/prefs.ui:74
msgid "Open Window Animation"
msgstr "Pencere Animasyonunu Aç"
#: 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 "Birden fazla seçilirse, rastgele biri uygulanır."
#: 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 "Efektleri Seçin"
#: resources/ui/gtk4/prefs.ui:110 resources/ui/gtk3/prefs.ui:138
msgid "Close Window Animation"
msgstr "Pencere Animasyonunu Kapat"
#: resources/ui/gtk4/prefs.ui:150 resources/ui/gtk3/prefs.ui:198
msgid "Also Add Effects to Dialogs"
msgstr "Ayrıca Diyaloglara Efektler Ekle"
#: resources/ui/gtk3/Fire.ui:63
msgid "Choose a Preset"
msgstr "Bir Şablon Seçin"
+322
View File
@@ -0,0 +1,322 @@
# 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-02-18 20:33+0100\n"
"PO-Revision-Date: 2022-03-01 15:05+0000\n"
"Last-Translator: 刘韬 <lyuutau@outlook.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"burn-my-windows/core/zh_Hans/>\n"
"Language: zh_Hans\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.11.1-dev\n"
#: prefs.js:111
#, fuzzy
msgid "Effect Options"
msgstr "效果选项"
#: prefs.js:139
msgid "Go Back"
msgstr ""
#: prefs.js:181
#, fuzzy
msgid "General Options"
msgstr "一般选项"
#: prefs.js:276
#, fuzzy
msgid "Gold Sponsors"
msgstr "金牌赞助商"
#: prefs.js:279
#, fuzzy
msgid "Silver Sponsors"
msgstr "银牌赞助商"
#: prefs.js:282
#, fuzzy
msgid "Bronze Sponsors"
msgstr "铜牌赞助商"
#: prefs.js:285
#, fuzzy
msgid "Past Sponsors"
msgstr "往届赞助商"
#. Translators: %s will be replaced by the effect's name.
#: prefs.js:512
#, fuzzy, javascript-format
msgid "Preview for %s"
msgstr "%s 的预览"
#: prefs.js:534
#, fuzzy
msgid "Close this Window to Preview the Effect!"
msgstr "关闭此窗口,预览效果!"
#: src/BrokenGlass.js:57
#, fuzzy
msgid "Broken Glass"
msgstr "破碎的玻璃"
#: src/TVEffect.js:56
#, fuzzy
msgid "TV Effect"
msgstr "电视效果"
#: src/TRexAttack.js:56
#, fuzzy
msgid "T-Rex Attack"
msgstr "霸王龙攻击"
#: src/Wisps.js:55
msgid "Wisps"
msgstr ""
#: src/Fire.js:58
msgid "Fire"
msgstr ""
#: src/Fire.js:130
msgid "Default Fire"
msgstr ""
#: src/Fire.js:140
#, fuzzy
msgid "Hell Fire"
msgstr "地狱之火"
#: src/Fire.js:150
#, fuzzy
msgid "Dark and Smutty"
msgstr "黑暗和污秽"
#: src/Fire.js:160
#, fuzzy
msgid "Cold Breeze"
msgstr "寒风"
#: src/Fire.js:170
#, fuzzy
msgid "Santa is Coming"
msgstr "圣诞老人来了"
#: src/EnergizeA.js:54
msgid "Energize A"
msgstr ""
#: src/EnergizeB.js:54
msgid "Energize B"
msgstr ""
#: src/Matrix.js:58
msgid "Matrix"
msgstr "矩阵"
#: resources/ui/common/main-menu.ui:6
msgid "Visit Homepage"
msgstr "访问主页"
#: resources/ui/common/main-menu.ui:10
msgid "View Changelog"
msgstr "查看更新日志"
#: resources/ui/common/main-menu.ui:16
msgid "Report a Bug"
msgstr "报告错误"
#: resources/ui/common/main-menu.ui:20
#, fuzzy
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:45
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/TRexAttack.ui:24 resources/ui/gtk4/TVEffect.ui:24
#: resources/ui/gtk4/EnergizeA.ui:24 resources/ui/gtk4/EnergizeB.ui:24
#: resources/ui/gtk3/Wisps.ui:42 resources/ui/gtk3/Fire.ui:93
#: resources/ui/gtk3/TVEffect.ui:35 resources/ui/gtk3/EnergizeA.ui:42
#: resources/ui/gtk3/EnergizeB.ui:42
#, fuzzy
msgid "Animation Time [ms]"
msgstr "动画时间 [毫秒]"
#: resources/ui/gtk4/Matrix.ui:52 resources/ui/gtk4/Matrix.ui:98
#: resources/ui/gtk4/Matrix.ui:144 resources/ui/gtk4/Matrix.ui:190
#: resources/ui/gtk4/Matrix.ui:224 resources/ui/gtk4/Matrix.ui:258
#: resources/ui/gtk4/BrokenGlass.ui:52 resources/ui/gtk4/BrokenGlass.ui:98
#: resources/ui/gtk4/BrokenGlass.ui:144 resources/ui/gtk4/BrokenGlass.ui:190
#: resources/ui/gtk4/BrokenGlass.ui:244 resources/ui/gtk4/Wisps.ui:52
#: resources/ui/gtk4/Wisps.ui:98 resources/ui/gtk4/Wisps.ui:132
#: resources/ui/gtk4/Fire.ui:77 resources/ui/gtk4/Fire.ui:123
#: resources/ui/gtk4/Fire.ui:169 resources/ui/gtk4/Fire.ui:222
#: resources/ui/gtk4/Fire.ui:280 resources/ui/gtk4/TRexAttack.ui:52
#: resources/ui/gtk4/TRexAttack.ui:98 resources/ui/gtk4/TRexAttack.ui:144
#: resources/ui/gtk4/TRexAttack.ui:190 resources/ui/gtk4/TRexAttack.ui:224
#: resources/ui/gtk4/TVEffect.ui:52 resources/ui/gtk4/TVEffect.ui:86
#: resources/ui/gtk4/EnergizeA.ui:52 resources/ui/gtk4/EnergizeA.ui:98
#: resources/ui/gtk4/EnergizeA.ui:132 resources/ui/gtk4/EnergizeB.ui:52
#: resources/ui/gtk4/EnergizeB.ui:98 resources/ui/gtk4/EnergizeB.ui:132
#: resources/ui/gtk4/prefs.ui:166 resources/ui/gtk3/Wisps.ui:68
#: resources/ui/gtk3/Wisps.ui:117 resources/ui/gtk3/Wisps.ui:160
#: resources/ui/gtk3/Fire.ui:119 resources/ui/gtk3/Fire.ui:167
#: resources/ui/gtk3/Fire.ui:215 resources/ui/gtk3/Fire.ui:277
#: resources/ui/gtk3/Fire.ui:345 resources/ui/gtk3/TVEffect.ui:61
#: resources/ui/gtk3/TVEffect.ui:104 resources/ui/gtk3/EnergizeA.ui:68
#: resources/ui/gtk3/EnergizeA.ui:117 resources/ui/gtk3/EnergizeA.ui:160
#: resources/ui/gtk3/EnergizeB.ui:68 resources/ui/gtk3/EnergizeB.ui:117
#: resources/ui/gtk3/EnergizeB.ui:160 resources/ui/gtk3/prefs.ui:219
msgid "Reset to Default Value"
msgstr "重置为默认值"
#: resources/ui/gtk4/Matrix.ui:70 resources/ui/gtk4/BrokenGlass.ui:70
#: resources/ui/gtk4/Wisps.ui:70 resources/ui/gtk4/Fire.ui:95
#: resources/ui/gtk4/EnergizeA.ui:70 resources/ui/gtk4/EnergizeB.ui:70
#: resources/ui/gtk3/Wisps.ui:91 resources/ui/gtk3/Fire.ui:141
#: resources/ui/gtk3/EnergizeA.ui:91 resources/ui/gtk3/EnergizeB.ui:91
#, fuzzy
msgid "Scale"
msgstr "规模"
#: resources/ui/gtk4/Matrix.ui:116
#, 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 "提示颜色"
#: resources/ui/gtk4/BrokenGlass.ui:116
msgid "Gravity"
msgstr "重力"
#: resources/ui/gtk4/BrokenGlass.ui:162
#, fuzzy
msgid "Blow Force"
msgstr "吹力"
#: resources/ui/gtk4/BrokenGlass.ui:212
msgid "Shatter From Pointer Location"
msgstr ""
#: resources/ui/gtk4/BrokenGlass.ui:221
msgid ""
"The shards will fly away from where your mouse pointer was when closing the "
"window."
msgstr ""
#: resources/ui/gtk4/Wisps.ui:116 resources/ui/gtk4/TVEffect.ui:70
#: resources/ui/gtk4/EnergizeA.ui:116 resources/ui/gtk4/EnergizeB.ui:116
#: resources/ui/gtk3/Wisps.ui:139 resources/ui/gtk3/TVEffect.ui:83
#: resources/ui/gtk3/EnergizeA.ui:139 resources/ui/gtk3/EnergizeB.ui:139
msgid "Color"
msgstr "颜色"
#: resources/ui/gtk4/Fire.ui:25 resources/ui/gtk3/Fire.ui:49
msgid "Presets"
msgstr "预设"
#: resources/ui/gtk4/Fire.ui:141 resources/ui/gtk3/Fire.ui:189
msgid "Speed"
msgstr "速度"
#: resources/ui/gtk4/Fire.ui:191 resources/ui/gtk3/Fire.ui:241
#, fuzzy
msgid "3D Noise"
msgstr "3D 噪点"
#: resources/ui/gtk4/Fire.ui:200 resources/ui/gtk3/Fire.ui:250
msgid "Creates a more dynamic fire but requires more GPU power."
msgstr ""
#: 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/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/gtk3/Fire.ui:63
msgid "Choose a Preset"
msgstr ""
+333 -13
View File
@@ -13,7 +13,18 @@
'use strict'; 'use strict';
const {Gio, Gtk, Gdk} = imports.gi; const {Gio, Gtk, Gdk, GLib, GObject} = imports.gi;
const ByteArray = imports.byteArray;
// libadwaita is available starting with GNOME Shell 42.
let Adw = null;
try {
Adw = imports.gi.Adw;
} catch (e) {
// Nothing to do.
}
const _ = imports.gettext.domain('burn-my-windows').gettext;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const Me = imports.misc.extensionUtils.getCurrentExtension(); const Me = imports.misc.extensionUtils.getCurrentExtension();
@@ -25,11 +36,15 @@ const ALL_EFFECTS = [
Me.imports.src.EnergizeB.EnergizeB, Me.imports.src.EnergizeB.EnergizeB,
Me.imports.src.Fire.Fire, Me.imports.src.Fire.Fire,
Me.imports.src.Matrix.Matrix, Me.imports.src.Matrix.Matrix,
Me.imports.src.BrokenGlass.BrokenGlass,
Me.imports.src.TRexAttack.TRexAttack, Me.imports.src.TRexAttack.TRexAttack,
Me.imports.src.TVEffect.TVEffect, Me.imports.src.TVEffect.TVEffect,
Me.imports.src.Wisps.Wisps, Me.imports.src.Wisps.Wisps,
]; ];
// This template widget class is defined at the bottom of this file.
var BurnMyWindowsEffectPage = null;
////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////
// The preferences dialog is organized in pages, each of which is loaded from a // // The preferences dialog is organized in pages, each of which is loaded from a //
// separate ui file. There's one page with general options, all other paged are loaded // // separate ui file. There's one page with general options, all other paged are loaded //
@@ -45,6 +60,17 @@ var PreferencesDialog = class PreferencesDialog {
this._resources = Gio.Resource.load(Me.path + '/resources/burn-my-windows.gresource'); this._resources = Gio.Resource.load(Me.path + '/resources/burn-my-windows.gresource');
Gio.resources_register(this._resources); Gio.resources_register(this._resources);
// Load the CSS file for the settings dialog.
const styleProvider = Gtk.CssProvider.new();
styleProvider.load_from_resource('/css/gtk.css');
if (utils.isGTK4()) {
Gtk.StyleContext.add_provider_for_display(Gdk.Display.get_default(), styleProvider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
} else {
Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(), styleProvider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION);
}
// Make sure custom icons are found. // Make sure custom icons are found.
if (utils.isGTK4()) { if (utils.isGTK4()) {
Gtk.IconTheme.get_for_display(Gdk.Display.get_default()).add_resource_path('/img'); Gtk.IconTheme.get_for_display(Gdk.Display.get_default()).add_resource_path('/img');
@@ -52,6 +78,9 @@ var PreferencesDialog = class PreferencesDialog {
Gtk.IconTheme.get_default().add_resource_path('/img'); Gtk.IconTheme.get_default().add_resource_path('/img');
} }
// Register the template widgets used in the settings dialog.
this._registerCustomClasses();
// Store a reference to the settings object. // Store a reference to the settings object.
this._settings = ExtensionUtils.getSettings(); this._settings = ExtensionUtils.getSettings();
@@ -63,16 +92,116 @@ var PreferencesDialog = class PreferencesDialog {
// Bind general options properties. // Bind general options properties.
this.bindSwitch('destroy-dialogs'); this.bindSwitch('destroy-dialogs');
// Starting with GNOME Shell 42, the settings dialog uses libadwaita. We have to use a
// different layout, as the stack sidebar looks pretty ugly with the included
// Adw.Clamp...
if (utils.shellVersionIsAtLeast(42, 'beta')) {
// This is our top-level widget which we will return later.
this._widget = new Gtk.Box({orientation: Gtk.Orientation.VERTICAL});
// Add the general options page to the settings dialog.
const generalPrefs = this._builder.get_object('general-prefs');
this.gtkBoxAppend(this._widget, generalPrefs);
// Then add a preferences group with action rows to open the effect subpages.
const group = new Adw.PreferencesGroup({title: _('Effect Options')});
this.gtkBoxAppend(this._widget, group);
ALL_EFFECTS.forEach(Effect => {
const [minMajor, minMinor] = Effect.getMinShellVersion();
if (utils.shellVersionIsAtLeast(minMajor, minMinor)) {
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);
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);
if (preferences) {
this.gtkBoxAppend(page, preferences);
}
// Add a button for back navigation.
const backButton = new Gtk.Button({
halign: Gtk.Align.CENTER,
label: _('Go Back'),
});
backButton.add_css_class('suggested-action');
backButton.add_css_class('pill-button');
backButton.connect('clicked', () => {
row.get_root().close_subpage();
});
this.gtkBoxAppend(page, backButton);
// Wrap the preferences group in an Adw.Clamp.
const clamp = new Adw.Clamp({
child: page,
maximum_size: 600,
tightening_threshold: 400,
});
// Open the subpage on click.
row.get_root().present_subpage(clamp);
});
group.add(row);
}
});
}
// On older GNOME versions, we use a StackSidebar.
else {
// This is our top-level widget which we will return later.
this._widget = new Gtk.Box({
orientation: Gtk.Orientation.HORIZONTAL,
});
const stack = new Gtk.Stack({
transition_type: Gtk.StackTransitionType.SLIDE_UP_DOWN,
});
// Add the general options page.
const generalPage = this._builder.get_object('general-prefs');
generalPage.margin_start = 60;
generalPage.margin_end = 60;
stack.add_titled(generalPage, 'general', _('General Options'));
this.gtkBoxAppend(this._widget, new Gtk.StackSidebar({stack: stack}));
this.gtkBoxAppend(this._widget, stack);
// Add all other effect pages. // Add all other effect pages.
ALL_EFFECTS.forEach(Effect => { ALL_EFFECTS.forEach(Effect => {
const [minMajor, minMinor] = Effect.getMinShellVersion(); const [minMajor, minMinor] = Effect.getMinShellVersion();
if (utils.shellVersionIsAtLeast(minMajor, minMinor)) { if (utils.shellVersionIsAtLeast(minMajor, minMinor)) {
Effect.initPreferences(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);
if (preferences) {
this.gtkBoxAppend(page, preferences);
}
stack.add_titled(page, Effect.getNick(), Effect.getLabel());
} }
}); });
}
// This is our top-level widget which we will return later.
this._widget = this._builder.get_object('settings-widget');
// Some things can only be done once the widget is shown as we do not have access to // Some things can only be done once the widget is shown as we do not have access to
// the toplevel widget before. // the toplevel widget before.
@@ -86,25 +215,103 @@ var PreferencesDialog = class PreferencesDialog {
{ {
// Add the menu button to the title bar. // Add the menu button to the title bar.
const menu = this._builder.get_object('menu-button'); const menu = this._builder.get_object('menu-button');
// Starting with GNOME Shell 42, we have to hack our way through the widget tree
// of the Adw.PreferencesWindow...
if (utils.shellVersionIsAtLeast(42, 'beta')) {
const header = this._findWidgetByType(window.get_content(), Adw.HeaderBar);
header.pack_end(menu);
// Allow closing of the sub pages.
window.can_navigate_back = true;
} else {
window.get_titlebar().pack_end(menu); window.get_titlebar().pack_end(menu);
}
// Populate the menu with actions. // Populate the menu with actions.
const group = Gio.SimpleActionGroup.new(); const group = Gio.SimpleActionGroup.new();
window.insert_action_group('prefs', group); window.insert_action_group('prefs', group);
const addAction = (name, uri) => { const addURIAction = (name, uri) => {
const action = Gio.SimpleAction.new(name, null); const action = Gio.SimpleAction.new(name, null);
action.connect('activate', () => Gtk.show_uri(null, uri, Gdk.CURRENT_TIME)); action.connect('activate', () => Gtk.show_uri(null, uri, Gdk.CURRENT_TIME));
group.add_action(action); group.add_action(action);
}; };
// clang-format off // clang-format off
addAction('homepage', 'https://github.com/Schneegans/Burn-My-Windows'); addURIAction('homepage', 'https://github.com/Schneegans/Burn-My-Windows');
addAction('changelog', 'https://github.com/Schneegans/Burn-My-Windows/blob/main/docs/changelog.md'); addURIAction('changelog', 'https://github.com/Schneegans/Burn-My-Windows/blob/main/docs/changelog.md');
addAction('bugs', 'https://github.com/Schneegans/Burn-My-Windows/issues'); addURIAction('bugs', 'https://github.com/Schneegans/Burn-My-Windows/issues');
addAction('donate-paypal', 'https://www.paypal.com/donate/?hosted_button_id=3F7UFL8KLVPXE'); addURIAction('new-effect', 'https://github.com/Schneegans/Burn-My-Windows/blob/main/docs/how-to-create-new-effects.md');
addAction('donate-github', 'https://github.com/sponsors/Schneegans'); addURIAction('translate', 'https://hosted.weblate.org/engage/burn-my-windows/');
addURIAction('donate-paypal', 'https://www.paypal.com/donate/?hosted_button_id=3F7UFL8KLVPXE');
addURIAction('donate-github', 'https://github.com/sponsors/Schneegans');
// clang-format on // clang-format on
// Add the about dialog.
const aboutAction = Gio.SimpleAction.new('about', null);
aboutAction.connect('activate', () => {
// The JSON report format from weblate is a bit weird. Here we extract all
// unique names from the translation report.
const translators = new Set();
this._getJSONResource('/credits/translators.json').forEach(i => {
for (const j of Object.values(i)) {
j.forEach(k => translators.add(k[1]));
}
});
const sponsors = this._getJSONResource('/credits/sponsors.json');
const dialog = new Gtk.AboutDialog({transient_for: window, modal: true});
dialog.set_logo_icon_name('burn-my-windows-symbolic');
dialog.set_program_name(`Burn-My-Windows ${Me.metadata.version}`);
dialog.set_website('https://github.com/Schneegans/Burn-My-Windows');
dialog.set_authors(['Simon Schneegans']);
dialog.set_copyright('© 2022 Simon Schneegans');
dialog.set_translator_credits([...translators].join('\n'));
if (sponsors.gold.length > 0) {
dialog.add_credit_section(_('Gold Sponsors'), sponsors.gold);
}
if (sponsors.silver.length > 0) {
dialog.add_credit_section(_('Silver Sponsors'), sponsors.silver);
}
if (sponsors.bronze.length > 0) {
dialog.add_credit_section(_('Bronze Sponsors'), sponsors.bronze);
}
if (sponsors.past.length > 0) {
dialog.add_credit_section(_('Past Sponsors'), sponsors.past);
}
dialog.set_license_type(Gtk.License.GPL_3_0);
if (utils.isGTK4()) {
dialog.show();
} else {
dialog.show_all();
}
});
group.add_action(aboutAction);
}
// Populate the open-effects drop-down menu.
{
const menu = this._builder.get_object('open-effect-menu');
const group = Gio.SimpleActionGroup.new();
window.insert_action_group('open-effects', group);
ALL_EFFECTS.forEach(Effect => {
const [minMajor, minMinor] = Effect.getMinShellVersion();
if (utils.shellVersionIsAtLeast(minMajor, minMinor)) {
const nick = Effect.getNick();
const label = Effect.getLabel();
const actionName = nick + '-open-effect';
const fullName = 'open-effects.' + actionName;
const action = this._settings.create_action(actionName);
group.add_action(action);
menu.append_item(Gio.MenuItem.new(label, fullName));
}
});
} }
// Populate the close-effects drop-down menu. // Populate the close-effects drop-down menu.
@@ -209,6 +416,17 @@ var PreferencesDialog = class PreferencesDialog {
this._bindResetButton(settingsKey); this._bindResetButton(settingsKey);
} }
// ----------------------------------------------------------------- GTK3 / GTK4 helpers
// Appends the given child widget to the given Gtk.Box.
gtkBoxAppend(box, child) {
if (utils.isGTK4()) {
box.append(child);
} else {
box.pack_start(child, false, false, 0);
}
}
// ----------------------------------------------------------------------- private stuff // ----------------------------------------------------------------------- private stuff
// Searches for a reset button for the given settings key and make it reset the settings // Searches for a reset button for the given settings key and make it reset the settings
@@ -233,10 +451,112 @@ var PreferencesDialog = class PreferencesDialog {
this._bindResetButton(settingsKey); this._bindResetButton(settingsKey);
} }
// 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);
} }
// Nothing to do for now... // This traverses the widget tree below the given parent recursively and returns the
function init() {} // first widget of the given type.
_findWidgetByType(parent, type) {
for (const child of [...parent]) {
if (child instanceof type) return child;
const match = this._findWidgetByType(child, type);
if (match) return match;
}
return null;
}
// Initializes template widgets used by the preferences dialog.
_registerCustomClasses() {
// Each effect page is based on a template widget. This template contains the title
// and the preview button.
if (GObject.type_from_name('BurnMyWindowsEffectPage') == null) {
BurnMyWindowsEffectPage = GObject.registerClass(
{
GTypeName: 'BurnMyWindowsEffectPage',
Template: `resource:///ui/${utils.getGTKString()}/effectPage.ui`,
InternalChildren: ['label', 'button'],
},
class BurnMyWindowsEffectPage extends Gtk.Box { // ------------------------------
_init(Effect, dialog) {
super._init();
// Set the effect's name as label.
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());
// Make sure that the window.show() firther below "sees" this change.
Gio.Settings.sync();
// 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()),
default_width: 800,
default_height: 450,
modal: true,
transient_for: utils.isGTK4() ? this._button.get_root() :
this._button.get_toplevel()
});
// Add a header bar to the window.
if (utils.isGTK4()) {
const header = Gtk.HeaderBar.new();
window.set_titlebar(header);
}
const box = new Gtk.Box({
orientation: Gtk.Orientation.VERTICAL,
valign: Gtk.Align.CENTER,
spacing: 10,
margin_start: 50,
margin_end: 50
});
const label = Gtk.Label.new(_('Close this Window to Preview the Effect!'));
label.wrap = true;
label.justify = Gtk.Justification.CENTER;
label.get_style_context().add_class('large-title');
const image = new Gtk.Image({
icon_name: 'burn-my-windows-symbolic',
pixel_size: 128,
});
dialog.gtkBoxAppend(box, image);
dialog.gtkBoxAppend(box, label);
if (utils.isGTK4()) {
window.set_child(box);
window.show();
} else {
window.add(box);
window.show_all();
}
});
}
});
}
}
}
// This is used for setting up the translations.
function init() {
ExtensionUtils.initTranslations();
}
// This function is called when the preferences window is created to build and return a // This function is called when the preferences window is created to build and return a
// Gtk widget. We create a new instance of the PreferencesDialog class each time this // Gtk widget. We create a new instance of the PreferencesDialog class each time this
+1
View File
@@ -0,0 +1 @@
The `translators.json` file is directly exported from weblate.
+20
View File
@@ -0,0 +1,20 @@
{
"gold": [
"<a href='https://github.com/dennis1248'>Dennis ten Hoove</a>"
],
"silver": [
"<a href='https://twitter.com/tjiiik'>tj3k</a>",
"<a href='https://github.com/MRR-dev'>@MRR-dev</a>",
"<a href='https://github.com/castrojo'>Jorge Castro</a>"
],
"bronze": [
"<a href='https://github.com/danielheadbang'>@danielheadbang</a>"
],
"past": [
"<a href='https://github.com/MrTomRod'>@MrTomRod</a>",
"Pouhiou",
"DAPREMONT Christophe",
"<a href='https://github.com/manero6'>@manero6</a>",
"<a href='https://github.com/RickStanley'>@RickStanley</a>"
]
}
+117
View File
@@ -0,0 +1,117 @@
[
{
"Norwegian Bokm\u00e5l": [
[
"epost@anotheragency.no",
"Allan Nordh\u00f8y",
3
]
]
},
{
"Dutch": [
[
"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",
57
]
]
},
{
"Italian": [
[
"mario03@gmail.com",
"Mario",
1
],
[
"albano_battistella@hotmail.com",
"albanobattistella",
63
]
]
},
{
"Chinese (Simplified)": [
[
"lyuutau@outlook.com",
"\u5218\u97ec",
36
]
]
},
{
"German": [
[
"code@simonschneegans.de",
"Simon Schneegans",
59
]
]
},
{
"French": [
[
"redxxiii@zaclys.net",
"Reda",
13
],
[
"theo.remon+weblate@uswery.eu",
"Th\u00e9o Remon",
24
],
[
"bonnemainsnathan@gmail.com",
"Nathan",
42
]
]
},
{
"Spanish": [
[
"ulicesah@gmail.com",
"Ulices",
7
],
[
"fitojb@ubuntu.com",
"Adolfo Jayme Barrientos",
11
],
[
"oscfdezdz@tuta.io",
"\u00d3scar Fern\u00e1ndez D\u00edaz",
55
]
]
}
]
+3
View File
@@ -0,0 +1,3 @@
.pill-button {
border-radius: 9999px;
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 372 KiB

+19 -5
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface domain="burn-my-windows">
<menu id="main-menu"> <menu id="main-menu">
<section> <section>
<item> <item>
@@ -10,23 +10,37 @@
<attribute name="label" translatable="yes">View Changelog</attribute> <attribute name="label" translatable="yes">View Changelog</attribute>
<attribute name="action">prefs.changelog</attribute> <attribute name="action">prefs.changelog</attribute>
</item> </item>
</section>
<section>
<item> <item>
<attribute name="label" translatable="yes">Report a Bug</attribute> <attribute name="label" translatable="yes">Report a Bug</attribute>
<attribute name="action">prefs.bugs</attribute> <attribute name="action">prefs.bugs</attribute>
</item> </item>
</section> <item>
<section> <attribute name="label" translatable="yes">Create an Effect</attribute>
<attribute name="action">prefs.new-effect</attribute>
</item>
<item>
<attribute name="label" translatable="yes">Translate</attribute>
<attribute name="action">prefs.translate</attribute>
</item>
<submenu> <submenu>
<attribute name="label" translatable="yes">Donate</attribute> <attribute name="label" translatable="yes">Donate</attribute>
<item> <item>
<attribute name="label" translatable="yes">Via PayPal</attribute> <attribute name="label">PayPal</attribute>
<attribute name="action">prefs.donate-paypal</attribute> <attribute name="action">prefs.donate-paypal</attribute>
</item> </item>
<item> <item>
<attribute name="label" translatable="yes">Via GitHub</attribute> <attribute name="label">GitHub</attribute>
<attribute name="action">prefs.donate-github</attribute> <attribute name="action">prefs.donate-github</attribute>
</item> </item>
</submenu> </submenu>
</section> </section>
<section>
<item>
<attribute name="label" translatable="yes">About Burn-My-Windows</attribute>
<attribute name="action">prefs.about</attribute>
</item>
</section>
</menu> </menu>
</interface> </interface>
+6 -10
View File
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface domain="burn-my-windows">
<object class="GtkAdjustment" id="energize-a-animation-time"> <object class="GtkAdjustment" id="energize-a-animation-time">
<property name="upper">10000</property> <property name="upper">10000</property>
<property name="lower">500</property> <property name="lower">100</property>
<property name="step-increment">10</property> <property name="step-increment">1</property>
<property name="page-increment">100</property> <property name="page-increment">100</property>
</object> </object>
@@ -17,10 +17,6 @@
<object class="GtkBox" id="energize-a-prefs"> <object class="GtkBox" id="energize-a-prefs">
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="margin-start">60</property>
<property name="margin-end">60</property>
<property name="margin-top">60</property>
<property name="margin-bottom">60</property>
<child> <child>
<object class="GtkFrame"> <object class="GtkFrame">
@@ -69,7 +65,7 @@
<property name="icon-size">1</property> <property name="icon-size">1</property>
</object> </object>
</child> </child>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -118,7 +114,7 @@
<property name="icon-size">1</property> <property name="icon-size">1</property>
</object> </object>
</child> </child>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -161,7 +157,7 @@
<property name="icon-size">1</property> <property name="icon-size">1</property>
</object> </object>
</child> </child>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
+6 -10
View File
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface domain="burn-my-windows">
<object class="GtkAdjustment" id="energize-b-animation-time"> <object class="GtkAdjustment" id="energize-b-animation-time">
<property name="upper">10000</property> <property name="upper">10000</property>
<property name="lower">500</property> <property name="lower">100</property>
<property name="step-increment">10</property> <property name="step-increment">1</property>
<property name="page-increment">100</property> <property name="page-increment">100</property>
</object> </object>
@@ -17,10 +17,6 @@
<object class="GtkBox" id="energize-b-prefs"> <object class="GtkBox" id="energize-b-prefs">
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="margin-start">60</property>
<property name="margin-end">60</property>
<property name="margin-top">60</property>
<property name="margin-bottom">60</property>
<child> <child>
<object class="GtkFrame"> <object class="GtkFrame">
@@ -69,7 +65,7 @@
<property name="icon-size">1</property> <property name="icon-size">1</property>
</object> </object>
</child> </child>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -118,7 +114,7 @@
<property name="icon-size">1</property> <property name="icon-size">1</property>
</object> </object>
</child> </child>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -161,7 +157,7 @@
<property name="icon-size">1</property> <property name="icon-size">1</property>
</object> </object>
</child> </child>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
+8 -25
View File
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface domain="burn-my-windows">
<object class="GtkAdjustment" id="fire-animation-time"> <object class="GtkAdjustment" id="fire-animation-time">
<property name="upper">10000</property> <property name="upper">10000</property>
<property name="lower">500</property> <property name="lower">100</property>
<property name="step-increment">10</property> <property name="step-increment">1</property>
<property name="page-increment">100</property> <property name="page-increment">100</property>
</object> </object>
@@ -24,10 +24,6 @@
<object class="GtkBox" id="fire-prefs"> <object class="GtkBox" id="fire-prefs">
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="margin-start">60</property>
<property name="margin-end">60</property>
<property name="margin-top">60</property>
<property name="margin-bottom">60</property>
<child> <child>
<object class="GtkFrame"> <object class="GtkFrame">
@@ -81,19 +77,6 @@
</child> </child>
</object> </object>
</child> </child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkFrame">
<child>
<object class="GtkListBox">
<property name="selection-mode">none</property>
<style>
<class name="rich-list" />
</style>
<child> <child>
<object class="GtkListBoxRow"> <object class="GtkListBoxRow">
@@ -133,7 +116,7 @@
<property name="icon-size">1</property> <property name="icon-size">1</property>
</object> </object>
</child> </child>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -181,7 +164,7 @@
<property name="icon-size">1</property> <property name="icon-size">1</property>
</object> </object>
</child> </child>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -229,7 +212,7 @@
<property name="icon-size">1</property> <property name="icon-size">1</property>
</object> </object>
</child> </child>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -291,7 +274,7 @@
<property name="icon-size">1</property> <property name="icon-size">1</property>
</object> </object>
</child> </child>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -359,7 +342,7 @@
<property name="icon-size">1</property> <property name="icon-size">1</property>
</object> </object>
</child> </child>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
+3 -7
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface domain="burn-my-windows">
<object class="GtkAdjustment" id="tv-animation-time"> <object class="GtkAdjustment" id="tv-animation-time">
<property name="upper">5000</property> <property name="upper">5000</property>
@@ -10,10 +10,6 @@
<object class="GtkBox" id="tv-prefs"> <object class="GtkBox" id="tv-prefs">
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="margin-start">60</property>
<property name="margin-end">60</property>
<property name="margin-top">60</property>
<property name="margin-bottom">60</property>
<child> <child>
<object class="GtkFrame"> <object class="GtkFrame">
@@ -62,7 +58,7 @@
<property name="icon-size">1</property> <property name="icon-size">1</property>
</object> </object>
</child> </child>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -105,7 +101,7 @@
<property name="icon-size">1</property> <property name="icon-size">1</property>
</object> </object>
</child> </child>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
+6 -10
View File
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface domain="burn-my-windows">
<object class="GtkAdjustment" id="wisps-animation-time"> <object class="GtkAdjustment" id="wisps-animation-time">
<property name="upper">10000</property> <property name="upper">10000</property>
<property name="lower">500</property> <property name="lower">100</property>
<property name="step-increment">10</property> <property name="step-increment">1</property>
<property name="page-increment">100</property> <property name="page-increment">100</property>
</object> </object>
@@ -17,10 +17,6 @@
<object class="GtkBox" id="wisps-prefs"> <object class="GtkBox" id="wisps-prefs">
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="margin-start">60</property>
<property name="margin-end">60</property>
<property name="margin-top">60</property>
<property name="margin-bottom">60</property>
<child> <child>
<object class="GtkFrame"> <object class="GtkFrame">
@@ -69,7 +65,7 @@
<property name="icon-size">1</property> <property name="icon-size">1</property>
</object> </object>
</child> </child>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -118,7 +114,7 @@
<property name="icon-size">1</property> <property name="icon-size">1</property>
</object> </object>
</child> </child>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -161,7 +157,7 @@
<property name="icon-size">1</property> <property name="icon-size">1</property>
</object> </object>
</child> </child>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
+53
View File
@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface domain="burn-my-windows">
<requires lib="gtk" version="3.0" />
<template class="BurnMyWindowsEffectPage" parent="GtkBox">
<property name="orientation">vertical</property>
<property name="hexpand">1</property>
<property name="spacing">10</property>
<child>
<object class="GtkBox">
<child>
<object class="GtkLabel" id="label">
<property name="xalign">0</property>
<property name="hexpand">1</property>
<style>
<class name="large-title" />
</style>
</object>
</child>
<child>
<object class="GtkButton" id="button">
<property name="valign">center</property>
<child>
<object class="GtkBox">
<property name="margin_start">8</property>
<property name="margin_end">8</property>
<property name="spacing">6</property>
<child>
<object class="GtkImage">
<property name="icon_name">media-playback-start-symbolic</property>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="halign">start</property>
<property name="label" translatable="yes">Preview this Effect</property>
</object>
</child>
</object>
</child>
<style>
<class name="pill-button" />
<class name="flat" />
</style>
</object>
</child>
</object>
</child>
</template>
</interface>
+68 -30
View File
@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface domain="burn-my-windows">
<requires lib="gtk" version="3.0" /> <requires lib="gtk" version="3.0" />
<menu id="close-effect-menu"></menu> <menu id="close-effect-menu"></menu>
<menu id="open-effect-menu"></menu>
<object class="GtkMenuButton" id="menu-button"> <object class="GtkMenuButton" id="menu-button">
<property name="menu-model">main-menu</property> <property name="menu-model">main-menu</property>
@@ -16,22 +17,8 @@
</child> </child>
</object> </object>
<object class="GtkBox" id="settings-widget">
<child>
<object class="GtkStackSidebar">
<property name="stack">main-stack</property>
</object>
</child>
<child>
<object class="GtkStack" id="main-stack">
<property name="transition-type">slide-up-down</property>
<property name="hexpand">1</property>
<child>
<object class="GtkBox" id="general-prefs"> <object class="GtkBox" id="general-prefs">
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="margin-start">60</property>
<property name="margin-end">60</property>
<property name="margin-top">30</property> <property name="margin-top">30</property>
<property name="margin-bottom">30</property> <property name="margin-bottom">30</property>
@@ -68,6 +55,70 @@
<object class="GtkListBox"> <object class="GtkListBox">
<property name="selection-mode">none</property> <property name="selection-mode">none</property>
<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="GtkBox">
<property name="orientation">vertical</property>
<property name="spacing">3</property>
<child>
<object class="GtkLabel">
<property name="label" translatable="yes">Open Window Animation</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 multiple are selected, one is chosen randomly.</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="GtkMenuButton" id="open-effect-button">
<property name="menu-model">open-effect-menu</property>
<child>
<object class="GtkBox">
<property name="spacing">8</property>
<child>
<object class="GtkLabel">
<property name="label" translatable="yes">Choose Effects</property>
</object>
</child>
<child>
<object class="GtkImage">
<property name="icon-name">pan-down-symbolic</property>
<property name="icon-size">1</property>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</child>
<child> <child>
<object class="GtkListBoxRow"> <object class="GtkListBoxRow">
<property name="margin-start">10</property> <property name="margin-start">10</property>
@@ -144,7 +195,7 @@
<property name="spacing">8</property> <property name="spacing">8</property>
<child> <child>
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label" translatable="yes">Also Burn Dialogs</property> <property name="label" translatable="yes">Also Add Effects to Dialogs</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="halign">start</property> <property name="halign">start</property>
<property name="valign">center</property> <property name="valign">center</property>
@@ -165,7 +216,7 @@
<property name="icon-size">1</property> <property name="icon-size">1</property>
</object> </object>
</child> </child>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -181,18 +232,5 @@
</object> </object>
</child> </child>
</object> </object>
<packing>
<property name="name">general</property>
<property name="title" translatable="yes">General Options</property>
</packing>
</child>
<!-- Stack pages are inserted here -->
</object>
</child>
</object>
</interface> </interface>
+263
View File
@@ -0,0 +1,263 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface domain="burn-my-windows">
<object class="GtkBox" id="broken-glass-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="broken-glass-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-broken-glass-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="broken-glass-scale">
<property name="upper">5</property>
<property name="lower">0.2</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-broken-glass-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">Gravity</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="broken-glass-gravity">
<property name="upper">2.0</property>
<property name="lower">-2.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-broken-glass-gravity">
<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">Blow Force</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="broken-glass-blow-force">
<property name="upper">2.0</property>
<property name="lower">-2.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-broken-glass-blow-force">
<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">Shatter From Pointer Location</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">The shards will fly away from where your mouse pointer was when closing the window.</property>
<property name="xalign">0</property>
<property name="halign">start</property>
<property name="valign">center</property>
<property name="hexpand">1</property>
<property name="wrap">1</property>
<style>
<class name="dim-label" />
<class name="caption" />
</style>
</object>
</child>
</object>
</child>
<child>
<object class="GtkSwitch" id="broken-glass-use-pointer">
<property name="halign">end</property>
<property name="valign">center</property>
</object>
</child>
<child>
<object class="GtkButton" id="reset-broken-glass-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>
</object>
</child>
</object>
</child>
</object>
</interface>
+6 -10
View File
@@ -1,12 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface domain="burn-my-windows">
<object class="GtkBox" id="energize-a-prefs"> <object class="GtkBox" id="energize-a-prefs">
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="margin-start">60</property>
<property name="margin-end">60</property>
<property name="margin-top">60</property>
<property name="margin-bottom">60</property>
<child> <child>
<object class="GtkFrame"> <object class="GtkFrame">
@@ -43,8 +39,8 @@
<property name="adjustment"> <property name="adjustment">
<object class="GtkAdjustment" id="energize-a-animation-time"> <object class="GtkAdjustment" id="energize-a-animation-time">
<property name="upper">10000</property> <property name="upper">10000</property>
<property name="lower">500</property> <property name="lower">100</property>
<property name="step-increment">10</property> <property name="step-increment">1</property>
<property name="page-increment">100</property> <property name="page-increment">100</property>
</object> </object>
</property> </property>
@@ -53,7 +49,7 @@
<child> <child>
<object class="GtkButton" id="reset-energize-a-animation-time"> <object class="GtkButton" id="reset-energize-a-animation-time">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -99,7 +95,7 @@
<child> <child>
<object class="GtkButton" id="reset-energize-a-scale"> <object class="GtkButton" id="reset-energize-a-scale">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -133,7 +129,7 @@
<child> <child>
<object class="GtkButton" id="reset-energize-a-color"> <object class="GtkButton" id="reset-energize-a-color">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
+6 -10
View File
@@ -1,12 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface domain="burn-my-windows">
<object class="GtkBox" id="energize-b-prefs"> <object class="GtkBox" id="energize-b-prefs">
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="margin-start">60</property>
<property name="margin-end">60</property>
<property name="margin-top">60</property>
<property name="margin-bottom">60</property>
<child> <child>
<object class="GtkFrame"> <object class="GtkFrame">
@@ -43,8 +39,8 @@
<property name="adjustment"> <property name="adjustment">
<object class="GtkAdjustment" id="energize-b-animation-time"> <object class="GtkAdjustment" id="energize-b-animation-time">
<property name="upper">10000</property> <property name="upper">10000</property>
<property name="lower">500</property> <property name="lower">100</property>
<property name="step-increment">10</property> <property name="step-increment">1</property>
<property name="page-increment">100</property> <property name="page-increment">100</property>
</object> </object>
</property> </property>
@@ -53,7 +49,7 @@
<child> <child>
<object class="GtkButton" id="reset-energize-b-animation-time"> <object class="GtkButton" id="reset-energize-b-animation-time">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -99,7 +95,7 @@
<child> <child>
<object class="GtkButton" id="reset-energize-b-scale"> <object class="GtkButton" id="reset-energize-b-scale">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -133,7 +129,7 @@
<child> <child>
<object class="GtkButton" id="reset-energize-b-color"> <object class="GtkButton" id="reset-energize-b-color">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
+8 -26
View File
@@ -1,12 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface domain="burn-my-windows">
<object class="GtkBox" id="fire-prefs"> <object class="GtkBox" id="fire-prefs">
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="margin-start">60</property>
<property name="margin-end">60</property>
<property name="margin-top">60</property>
<property name="margin-bottom">60</property>
<child> <child>
<object class="GtkFrame"> <object class="GtkFrame">
@@ -42,20 +38,6 @@
</child> </child>
</object> </object>
</child> </child>
</object>
</child>
</object>
</child>
<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> <child>
<object class="GtkListBoxRow"> <object class="GtkListBoxRow">
@@ -82,8 +64,8 @@
<property name="adjustment"> <property name="adjustment">
<object class="GtkAdjustment" id="fire-animation-time"> <object class="GtkAdjustment" id="fire-animation-time">
<property name="upper">10000</property> <property name="upper">10000</property>
<property name="lower">500</property> <property name="lower">100</property>
<property name="step-increment">10</property> <property name="step-increment">1</property>
<property name="page-increment">100</property> <property name="page-increment">100</property>
</object> </object>
</property> </property>
@@ -92,7 +74,7 @@
<child> <child>
<object class="GtkButton" id="reset-fire-animation-time"> <object class="GtkButton" id="reset-fire-animation-time">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -138,7 +120,7 @@
<child> <child>
<object class="GtkButton" id="reset-flame-scale"> <object class="GtkButton" id="reset-flame-scale">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -184,7 +166,7 @@
<child> <child>
<object class="GtkButton" id="reset-flame-movement-speed"> <object class="GtkButton" id="reset-flame-movement-speed">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -237,7 +219,7 @@
<child> <child>
<object class="GtkButton" id="reset-flame-3d-noise"> <object class="GtkButton" id="reset-flame-3d-noise">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -295,7 +277,7 @@
<child> <child>
<object class="GtkButton" id="reset-fire-colors"> <object class="GtkButton" id="reset-fire-colors">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
+54 -12
View File
@@ -1,12 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface domain="burn-my-windows">
<object class="GtkBox" id="matrix-prefs"> <object class="GtkBox" id="matrix-prefs">
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="margin-start">60</property>
<property name="margin-end">60</property>
<property name="margin-top">60</property>
<property name="margin-bottom">60</property>
<child> <child>
<object class="GtkFrame"> <object class="GtkFrame">
@@ -43,8 +39,8 @@
<property name="adjustment"> <property name="adjustment">
<object class="GtkAdjustment" id="matrix-animation-time"> <object class="GtkAdjustment" id="matrix-animation-time">
<property name="upper">10000</property> <property name="upper">10000</property>
<property name="lower">500</property> <property name="lower">100</property>
<property name="step-increment">10</property> <property name="step-increment">1</property>
<property name="page-increment">100</property> <property name="page-increment">100</property>
</object> </object>
</property> </property>
@@ -53,7 +49,7 @@
<child> <child>
<object class="GtkButton" id="reset-matrix-animation-time"> <object class="GtkButton" id="reset-matrix-animation-time">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -99,7 +95,7 @@
<child> <child>
<object class="GtkButton" id="reset-matrix-scale"> <object class="GtkButton" id="reset-matrix-scale">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -145,7 +141,53 @@
<child> <child>
<object class="GtkButton" id="reset-matrix-randomness"> <object class="GtkButton" id="reset-matrix-randomness">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</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">Vertical Overshooting</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="matrix-overshoot">
<property name="upper">1.0</property>
<property name="lower">0.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-matrix-overshoot">
<property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -179,7 +221,7 @@
<child> <child>
<object class="GtkButton" id="reset-matrix-trail-color"> <object class="GtkButton" id="reset-matrix-trail-color">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -213,7 +255,7 @@
<child> <child>
<object class="GtkButton" id="reset-matrix-tip-color"> <object class="GtkButton" id="reset-matrix-tip-color">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
+8 -12
View File
@@ -1,12 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface domain="burn-my-windows">
<object class="GtkBox" id="trex-prefs"> <object class="GtkBox" id="trex-prefs">
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="margin-start">60</property>
<property name="margin-end">60</property>
<property name="margin-top">60</property>
<property name="margin-bottom">60</property>
<child> <child>
<object class="GtkFrame"> <object class="GtkFrame">
@@ -43,8 +39,8 @@
<property name="adjustment"> <property name="adjustment">
<object class="GtkAdjustment" id="trex-animation-time"> <object class="GtkAdjustment" id="trex-animation-time">
<property name="upper">10000</property> <property name="upper">10000</property>
<property name="lower">500</property> <property name="lower">100</property>
<property name="step-increment">10</property> <property name="step-increment">1</property>
<property name="page-increment">100</property> <property name="page-increment">100</property>
</object> </object>
</property> </property>
@@ -53,7 +49,7 @@
<child> <child>
<object class="GtkButton" id="reset-trex-animation-time"> <object class="GtkButton" id="reset-trex-animation-time">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -99,7 +95,7 @@
<child> <child>
<object class="GtkButton" id="reset-claw-scratch-scale"> <object class="GtkButton" id="reset-claw-scratch-scale">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -145,7 +141,7 @@
<child> <child>
<object class="GtkButton" id="reset-claw-scratch-count"> <object class="GtkButton" id="reset-claw-scratch-count">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -191,7 +187,7 @@
<child> <child>
<object class="GtkButton" id="reset-claw-scratch-warp"> <object class="GtkButton" id="reset-claw-scratch-warp">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -225,7 +221,7 @@
<child> <child>
<object class="GtkButton" id="reset-claw-scratch-color"> <object class="GtkButton" id="reset-claw-scratch-color">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
+3 -7
View File
@@ -1,12 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface domain="burn-my-windows">
<object class="GtkBox" id="tv-prefs"> <object class="GtkBox" id="tv-prefs">
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="margin-start">60</property>
<property name="margin-end">60</property>
<property name="margin-top">60</property>
<property name="margin-bottom">60</property>
<child> <child>
<object class="GtkFrame"> <object class="GtkFrame">
@@ -53,7 +49,7 @@
<child> <child>
<object class="GtkButton" id="reset-tv-animation-time"> <object class="GtkButton" id="reset-tv-animation-time">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -87,7 +83,7 @@
<child> <child>
<object class="GtkButton" id="reset-tv-effect-color"> <object class="GtkButton" id="reset-tv-effect-color">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
+6 -10
View File
@@ -1,12 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface domain="burn-my-windows">
<object class="GtkBox" id="wisps-prefs"> <object class="GtkBox" id="wisps-prefs">
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="margin-start">60</property>
<property name="margin-end">60</property>
<property name="margin-top">60</property>
<property name="margin-bottom">60</property>
<child> <child>
<object class="GtkFrame"> <object class="GtkFrame">
@@ -43,8 +39,8 @@
<property name="adjustment"> <property name="adjustment">
<object class="GtkAdjustment" id="wisps-animation-time"> <object class="GtkAdjustment" id="wisps-animation-time">
<property name="upper">10000</property> <property name="upper">10000</property>
<property name="lower">500</property> <property name="lower">100</property>
<property name="step-increment">10</property> <property name="step-increment">1</property>
<property name="page-increment">100</property> <property name="page-increment">100</property>
</object> </object>
</property> </property>
@@ -53,7 +49,7 @@
<child> <child>
<object class="GtkButton" id="reset-wisps-animation-time"> <object class="GtkButton" id="reset-wisps-animation-time">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -99,7 +95,7 @@
<child> <child>
<object class="GtkButton" id="reset-wisps-scale"> <object class="GtkButton" id="reset-wisps-scale">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -133,7 +129,7 @@
<child> <child>
<object class="GtkButton" id="reset-wisps-color"> <object class="GtkButton" id="reset-wisps-color">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
+53
View File
@@ -0,0 +1,53 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface domain="burn-my-windows">
<requires lib="gtk" version="4.0" />
<template class="BurnMyWindowsEffectPage" parent="GtkBox">
<property name="orientation">vertical</property>
<property name="hexpand">1</property>
<property name="spacing">10</property>
<child>
<object class="GtkBox">
<child>
<object class="GtkLabel" id="label">
<property name="xalign">0</property>
<property name="hexpand">1</property>
<style>
<class name="large-title" />
</style>
</object>
</child>
<child>
<object class="GtkButton" id="button">
<property name="valign">center</property>
<property name="child">
<object class="GtkBox">
<property name="margin_start">8</property>
<property name="margin_end">8</property>
<property name="spacing">6</property>
<child>
<object class="GtkImage">
<property name="icon_name">media-playback-start-symbolic</property>
</object>
</child>
<child>
<object class="GtkLabel">
<property name="halign">start</property>
<property name="label" translatable="yes">Preview this Effect</property>
</object>
</child>
</object>
</property>
<style>
<class name="pill-button" />
<class name="flat" />
</style>
</object>
</child>
</object>
</child>
</template>
</interface>
+49 -32
View File
@@ -1,35 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<interface> <interface domain="burn-my-windows">
<requires lib="gtk" version="4.0" /> <requires lib="gtk" version="4.0" />
<menu id="close-effect-menu"></menu> <menu id="close-effect-menu"></menu>
<menu id="open-effect-menu"></menu>
<object class="GtkMenuButton" id="menu-button"> <object class="GtkMenuButton" id="menu-button">
<property name="menu-model">main-menu</property> <property name="menu-model">main-menu</property>
<property name="icon-name">open-menu-symbolic</property> <property name="icon-name">open-menu-symbolic</property>
</object> </object>
<object class="GtkBox" id="settings-widget">
<child>
<object class="GtkStackSidebar">
<property name="stack">main-stack</property>
</object>
</child>
<child>
<object class="GtkStack" id="main-stack">
<property name="transition-type">slide-up-down</property>
<property name="hexpand">1</property>
<child>
<object class="GtkStackPage">
<property name="name">general</property>
<property name="title" translatable="yes">General Options</property>
<property name="child">
<object class="GtkBox" id="general-prefs"> <object class="GtkBox" id="general-prefs">
<property name="orientation">vertical</property> <property name="orientation">vertical</property>
<property name="margin-start">60</property>
<property name="margin-end">60</property>
<property name="margin-top">60</property> <property name="margin-top">60</property>
<property name="margin-bottom">60</property> <property name="margin-bottom">60</property>
@@ -70,6 +52,50 @@
</style> </style>
<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">Open Window Animation</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 multiple are selected, one is chosen randomly.</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="GtkMenuButton" id="open-effect-button">
<property name="label" translatable="yes">Choose Effects</property>
<property name="menu-model">open-effect-menu</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child> <child>
<object class="GtkListBoxRow"> <object class="GtkListBoxRow">
<property name="activatable">0</property> <property name="activatable">0</property>
@@ -105,7 +131,7 @@
</child> </child>
<child> <child>
<object class="GtkMenuButton" id="close-effect-button"> <object class="GtkMenuButton" id="close-effect-button">
<property name="label">Choose Effects</property> <property name="label" translatable="yes">Choose Effects</property>
<property name="menu-model">close-effect-menu</property> <property name="menu-model">close-effect-menu</property>
</object> </object>
</child> </child>
@@ -121,7 +147,7 @@
<object class="GtkBox"> <object class="GtkBox">
<child> <child>
<object class="GtkLabel"> <object class="GtkLabel">
<property name="label" translatable="yes">Also Burn Dialogs</property> <property name="label" translatable="yes">Also Add Effects to Dialogs</property>
<property name="xalign">0</property> <property name="xalign">0</property>
<property name="halign">start</property> <property name="halign">start</property>
<property name="valign">center</property> <property name="valign">center</property>
@@ -137,7 +163,7 @@
<child> <child>
<object class="GtkButton" id="reset-destroy-dialogs"> <object class="GtkButton" id="reset-destroy-dialogs">
<property name="icon-name">edit-clear-symbolic</property> <property name="icon-name">edit-clear-symbolic</property>
<property name="tooltip-text">Reset to Default Value</property> <property name="tooltip-text" translatable="yes">Reset to Default Value</property>
<style> <style>
<class name="flat" /> <class name="flat" />
</style> </style>
@@ -154,14 +180,5 @@
</child> </child>
</object> </object>
</property>
</object>
</child>
<!-- Stack pages are inserted here -->
</object>
</child>
</object>
</interface> </interface>
@@ -13,6 +13,24 @@
<description>Set to true to burn dialogs as well.</description> <description>Set to true to burn dialogs as well.</description>
</key> </key>
<key name="close-preview-effect" type="s">
<default>""</default>
<summary>Close Preview Effect</summary>
<description>The effect with this nick will be used for the next window-close animation.</description>
</key>
<key name="open-preview-effect" type="s">
<default>""</default>
<summary>Open Preview Effect</summary>
<description>The effect with this nick will be used for the next window-open animation.</description>
</key>
<key name="test-mode" type="b">
<default>false</default>
<summary>Test Mode</summary>
<description>If set to true, all animations will show only one still frame to allow for continuous integration tests.</description>
</key>
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
<!-- Fire Options --> <!-- Fire Options -->
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
@@ -23,6 +41,12 @@
<description>Use the fire effect for window closing.</description> <description>Use the fire effect for window closing.</description>
</key> </key>
<key name="fire-open-effect" type="b">
<default>false</default>
<summary>Fire Open Effect</summary>
<description>Use the fire effect for window opening.</description>
</key>
<key name="fire-animation-time" type="i"> <key name="fire-animation-time" type="i">
<default>1500</default> <default>1500</default>
<summary>Fire Animation Time</summary> <summary>Fire Animation Time</summary>
@@ -87,8 +111,14 @@
<description>Use the matrix effect for window closing.</description> <description>Use the matrix effect for window closing.</description>
</key> </key>
<key name="matrix-open-effect" type="b">
<default>false</default>
<summary>Matrix Open Effect</summary>
<description>Use the matrix effect for window opening.</description>
</key>
<key name="matrix-animation-time" type="i"> <key name="matrix-animation-time" type="i">
<default>3000</default> <default>1500</default>
<summary>Matrix Animation Time</summary> <summary>Matrix Animation Time</summary>
<description>The time the matrix effect takes.</description> <description>The time the matrix effect takes.</description>
</key> </key>
@@ -117,6 +147,12 @@
<description>The color matrix trails.</description> <description>The color matrix trails.</description>
</key> </key>
<key name="matrix-overshoot" type="d">
<default>0.25</default>
<summary>Matrix Overshoot</summary>
<description>The vertical overshooting of the matrix effect.</description>
</key>
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
<!-- TV Effect Options --> <!-- TV Effect Options -->
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --> <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
@@ -127,6 +163,12 @@
<description>Use the tv effect for window closing.</description> <description>Use the tv effect for window closing.</description>
</key> </key>
<key name="tv-open-effect" type="b">
<default>false</default>
<summary>TV Open Effect</summary>
<description>Use the tv effect for window opening.</description>
</key>
<key name="tv-animation-time" type="i"> <key name="tv-animation-time" type="i">
<default>400</default> <default>400</default>
<summary>TV Animation Time</summary> <summary>TV Animation Time</summary>
@@ -149,8 +191,14 @@
<description>Use the trex effect for window closing.</description> <description>Use the trex effect for window closing.</description>
</key> </key>
<key name="trex-open-effect" type="b">
<default>false</default>
<summary>T-Rex Open Effect</summary>
<description>Use the trex effect for window opening.</description>
</key>
<key name="trex-animation-time" type="i"> <key name="trex-animation-time" type="i">
<default>1500</default> <default>1000</default>
<summary>T-Rex Animation Time</summary> <summary>T-Rex Animation Time</summary>
<description>The time the trex effect takes.</description> <description>The time the trex effect takes.</description>
</key> </key>
@@ -189,6 +237,12 @@
<description>Use the Energize A effect for window closing.</description> <description>Use the Energize A effect for window closing.</description>
</key> </key>
<key name="energize-a-open-effect" type="b">
<default>false</default>
<summary>Energize A Open Effect</summary>
<description>Use the Energize A effect for window opening.</description>
</key>
<key name="energize-a-animation-time" type="i"> <key name="energize-a-animation-time" type="i">
<default>2000</default> <default>2000</default>
<summary>Energize A Animation Time</summary> <summary>Energize A Animation Time</summary>
@@ -217,8 +271,14 @@
<description>Use the Energize B effect for window closing.</description> <description>Use the Energize B effect for window closing.</description>
</key> </key>
<key name="energize-b-open-effect" type="b">
<default>false</default>
<summary>Energize B Open Effect</summary>
<description>Use the Energize B effect for window opening.</description>
</key>
<key name="energize-b-animation-time" type="i"> <key name="energize-b-animation-time" type="i">
<default>2000</default> <default>1000</default>
<summary>Energize B Animation Time</summary> <summary>Energize B Animation Time</summary>
<description>The time the Energize B effect takes.</description> <description>The time the Energize B effect takes.</description>
</key> </key>
@@ -245,8 +305,14 @@
<description>Use the wisps effect for window closing.</description> <description>Use the wisps effect for window closing.</description>
</key> </key>
<key name="wisps-open-effect" type="b">
<default>false</default>
<summary>Wisps Open Effect</summary>
<description>Use the wisps effect for window opening.</description>
</key>
<key name="wisps-animation-time" type="i"> <key name="wisps-animation-time" type="i">
<default>2000</default> <default>1500</default>
<summary>Wisps Animation Time</summary> <summary>Wisps Animation Time</summary>
<description>The time the wisps effect takes.</description> <description>The time the wisps effect takes.</description>
</key> </key>
@@ -263,6 +329,52 @@
<description>The color of the wisps effect.</description> <description>The color of the wisps effect.</description>
</key> </key>
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
<!-- Broken Glass Effect Options -->
<!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
<key name="broken-glass-close-effect" type="b">
<default>false</default>
<summary>Broken Glass Close Effect</summary>
<description>Use the broken glass effect for window closing.</description>
</key>
<key name="broken-glass-open-effect" type="b">
<default>false</default>
<summary>Broken Glass Open Effect</summary>
<description>Use the broken glass effect for window opening.</description>
</key>
<key name="broken-glass-animation-time" type="i">
<default>1000</default>
<summary>Broken Glass Animation Time</summary>
<description>The time the broken glass effect takes.</description>
</key>
<key name="broken-glass-scale" type="d">
<default>1.0</default>
<summary>Broken Glass Scale</summary>
<description>The size of the broken glass effect.</description>
</key>
<key name="broken-glass-gravity" type="d">
<default>-1.0</default>
<summary>Broken Glass Gravity</summary>
<description>The gravity of the broken glass effect.</description>
</key>
<key name="broken-glass-blow-force" type="d">
<default>0.5</default>
<summary>Broken Glass Blow Force</summary>
<description>The blow force of the broken glass effect.</description>
</key>
<key name="broken-glass-use-pointer" type="b">
<default>false</default>
<summary>Broken Glass Use Pointer</summary>
<description>Use the pointer location for the broken glass effect.</description>
</key>
</schema> </schema>
</schemalist> </schemalist>
+245
View File
@@ -0,0 +1,245 @@
//////////////////////////////////////////////////////////////////////////////////////////
// ) ( //
// ( /( ( ( ) ( ( ( ( )\ ) ( ( //
// )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( //
// ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ //
// | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) //
// | '_ \ || | '_| ' \)) | ' \()| || | \ 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;
//////////////////////////////////////////////////////////////////////////////////////////
// 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. //
//////////////////////////////////////////////////////////////////////////////////////////
// The shader class for this effect is registered further down in this file.
let Shader = null;
// 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 {
// ---------------------------------------------------------------------------- metadata
// This effect is only available on GNOME Shell 40+.
static getMinShellVersion() {
return [40, 0];
}
// This will be called in various places where a unique identifier for this effect is
// required. It should match the prefix of the settings keys which store whether the
// effect is enabled currently (e.g. '*-close-effect'), and its animation time
// (e.g. '*-animation-time').
static 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() {
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) {
// Add the settings page to the builder.
dialog.getBuilder().add_from_resource('/ui/gtk4/BrokenGlass.ui');
// Bind all properties.
dialog.bindAdjustment('broken-glass-animation-time');
dialog.bindAdjustment('broken-glass-scale');
dialog.bindAdjustment('broken-glass-gravity');
dialog.bindAdjustment('broken-glass-blow-force');
dialog.bindSwitch('broken-glass-use-pointer');
// Finally, return the new settings page.
return dialog.getBuilder().get_object('broken-glass-prefs');
}
// ---------------------------------------------------------------- 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 shader class for this effect will only be registered in GNOME Shell's process //
// (not in the preferences process). It's done this way as Clutter may not be installed //
// on the system and therefore the preferences would crash. //
//////////////////////////////////////////////////////////////////////////////////////////
if (utils.isInShellProcess()) {
const {Clutter, GdkPixbuf, Cogl} = imports.gi;
const shaderSnippets = Me.imports.src.shaderSnippets;
// This shader creates a complex-looking effect with rather simple means. Here is how it
// works: The window is drawn five times on top of each other (see the SHARD_LAYERS
// constant in the GLSL code). Each layer only draws some of the shards, all layers
// combined make up the entire window. The layers are then scaled, rotated, and moved
// independently from each other - this creates the impression that all shards are
// moving independently. In reality, there are only five groups of shards! Which shard
// belongs to which layer is defined by the green channel of the texture
// resources/img/shards.png. The red channel of the texture contains the distance to the
// shard edges. This information is used to fade out the shards.
Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect {
_init(actor, settings, forOpening) {
super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
// Load the shards texture. As the shader is re-created for each window animation,
// this texture is also re-created each time. This could be improved in the future!
const shardData = GdkPixbuf.Pixbuf.new_from_resource('/img/shards.png');
this._shardTexture = new Clutter.Image();
this._shardTexture.set_data(shardData.get_pixels(), Cogl.PixelFormat.RGB_888,
shardData.width, shardData.height, shardData.rowstride);
// Usually, the shards fly away from the center of the window.
let epicenterX = 0.5;
let epicenterY = 0.5;
// However, if this option is set, we use the mouse pointer position.
if (settings.get_boolean('broken-glass-use-pointer')) {
const [x, y] = global.get_pointer();
const [ok, localX, localY] = actor.transform_stage_point(x, y);
epicenterX = localX / actor.width;
epicenterY = localY / actor.height;
}
// If we are currently performing integration test, the animation uses a fixed seed.
const testMode = settings.get_boolean('test-mode');
this.set_shader_source(`
// Inject some common shader snippets.
${shaderSnippets.standardUniforms()}
uniform sampler2D uShardTexture;
const vec2 SEED = vec2(${testMode ? 0 : Math.random()},
${testMode ? 0 : Math.random()});
const float SHARD_SCALE = ${settings.get_double('broken-glass-scale')};
const float SHARD_LAYERS = 5;
const float BLOW_FORCE = ${settings.get_double('broken-glass-blow-force')};
const float ACTOR_SCALE = 2.0;
const float PADDING = ACTOR_SCALE / 2.0 - 0.5;
const vec2 EPICENTER = vec2(${epicenterX}, ${epicenterY});
const float GRAVITY = ${forOpening ? '-1.0' : '1.0'} *
${settings.get_double('broken-glass-gravity')};
void main() {
cogl_color_out = vec4(0, 0, 0, 0);
float progress = ${forOpening ? '1.0-uProgress' : 'uProgress'};
// Draw the individual shard layers.
for (float i=0; i<SHARD_LAYERS; ++i) {
// To enable drawing shards outside of the window bounds, the actor was scaled
// by ACTOR_SCALE. Here we scale and move the texture coordinates so that the
// window gets drawn at the correct position again.
vec2 coords = cogl_tex_coord_in[0].st * ACTOR_SCALE - PADDING;
// Scale and rotate around our epicenter.
coords -= EPICENTER;
// Scale each layer a bit differently.
coords /= mix(1.0, 1.0 + BLOW_FORCE*(i+2)/SHARD_LAYERS, progress);
// Rotate each layer a bit differently.
float rotation = (mod(i, 2.0)-0.5)*0.2*progress;
coords = vec2(coords.x * cos(rotation) - coords.y * sin(rotation),
coords.x * sin(rotation) + coords.y * cos(rotation));
// Move down each layer a bit.
float gravity = GRAVITY*0.1*(i+1)*progress*progress;
coords += vec2(0, gravity);
// Restore correct position.
coords += EPICENTER;
// Retrieve information from the shard texture for our layer.
vec2 shardCoords = (coords + SEED) * vec2(uSizeX, uSizeY) / SHARD_SCALE / 500.0;
vec2 shardMap = texture2D(uShardTexture, shardCoords).rg;
// The green channel contains a random value in [0..1] for each shard. We
// discretize this into SHARD_LAYERS bins and check if our layer falls into
// the bin of the current shard.
float shardGroup = floor(shardMap.g * SHARD_LAYERS * 0.999);
if (shardGroup == i) {
vec4 windowColor = texture2D(uTexture, coords);
// Dissolve the shard by using distance information from the red channel.
float dissolve = (shardMap.x - pow(progress+0.1, 2)) > 0 ? 1: 0;
cogl_color_out = mix(cogl_color_out, windowColor, dissolve);
}
}
}
`);
};
// This is overridden to bind the shard texture for drawing. Sadly, this seems to be
// impossible under GNOME 3.3x as this.get_pipeline() is not available. It was called
// get_target() back then but this is not wrapped in GJS.
// https://gitlab.gnome.org/GNOME/mutter/-/blob/gnome-3-36/clutter/clutter/clutter-offscreen-effect.c#L598
vfunc_paint_target(node, paint_context) {
const pipeline = this.get_pipeline();
// Use linear filtering for the window texture.
pipeline.set_layer_filters(0, Cogl.PipelineFilter.LINEAR,
Cogl.PipelineFilter.LINEAR);
// Bind the shard texture.
pipeline.set_layer_texture(1, this._shardTexture.get_texture());
pipeline.set_layer_wrap_mode(1, Cogl.PipelineWrapMode.REPEAT);
this.set_uniform_value('uShardTexture', 1);
super.vfunc_paint_target(node, paint_context);
}
});
}
+34 -28
View File
@@ -15,6 +15,8 @@
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const _ = imports.gettext.domain('burn-my-windows').gettext;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const Me = imports.misc.extensionUtils.getCurrentExtension(); const Me = imports.misc.extensionUtils.getCurrentExtension();
const utils = Me.imports.src.utils; const utils = Me.imports.src.utils;
@@ -40,7 +42,8 @@ var EnergizeA = class EnergizeA {
// This will be called in various places where a unique identifier for this effect is // 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 // required. It should match the prefix of the settings keys which store whether the
// effect is enabled currently (e.g. the '*-close-effect'). // effect is enabled currently (e.g. '*-close-effect'), and its animation time
// (e.g. '*-animation-time').
static getNick() { static getNick() {
return 'energize-a'; return 'energize-a';
} }
@@ -48,7 +51,7 @@ var EnergizeA = class EnergizeA {
// This will be shown in the sidebar of the preferences dialog as well as in the // 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. // drop-down menus where the user can choose the effect.
static getLabel() { static getLabel() {
return 'Energize A'; return _('Energize A');
} }
// -------------------------------------------------------------------- API for prefs.js // -------------------------------------------------------------------- API for prefs.js
@@ -56,7 +59,7 @@ var EnergizeA = class EnergizeA {
// This is called by the preferences dialog. It loads the settings page for this effect, // 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 // binds all properties to the settings and appends the page to the main stack of the
// preferences dialog. // preferences dialog.
static initPreferences(dialog) { static getPreferences(dialog) {
// Add the settings page to the builder. // Add the settings page to the builder.
dialog.getBuilder().add_from_resource(`/ui/${utils.getGTKString()}/EnergizeA.ui`); dialog.getBuilder().add_from_resource(`/ui/${utils.getGTKString()}/EnergizeA.ui`);
@@ -66,38 +69,33 @@ var EnergizeA = class EnergizeA {
dialog.bindAdjustment('energize-a-scale'); dialog.bindAdjustment('energize-a-scale');
dialog.bindColorButton('energize-a-color'); dialog.bindColorButton('energize-a-color');
// Finally, append the settings page to the main stack. // Finally, return the new settings page.
const stack = dialog.getBuilder().get_object('main-stack'); return dialog.getBuilder().get_object('energize-a-prefs');
stack.add_titled(
dialog.getBuilder().get_object('energize-a-prefs'), EnergizeA.getNick(),
EnergizeA.getLabel());
} }
// ---------------------------------------------------------------- API for extension.js // ---------------------------------------------------------------- API for extension.js
// This is called from extension.js whenever a window is closed with this effect. // This is called from extension.js whenever a window is closed with this effect.
static createShader(settings) { static createShader(actor, settings, forOpening) {
return new Shader(settings); return new Shader(settings, forOpening);
} }
// This is also called from extension.js. It is used to tweak the ongoing transitions of // The tweakTransition() is called from extension.js to tweak a window's open / close
// the actor - usually windows are faded to transparency and scaled down slightly by // transitions - usually windows are faded in / out and scaled up / down by GNOME Shell.
// GNOME Shell. Here, we modify this behavior as well as the transition duration. // The parameter 'forOpening' is set to true if this is called for a window-open
static tweakTransitions(actor, settings) { // transition, for a window-close transition it is set to false. The modes can be set to
const animationTime = settings.get_int('energize-a-animation-time'); // 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+.
const tweakTransition = (property, value) => { // For this effect, windows should neither be scaled nor faded.
const transition = actor.get_transition(property); static tweakTransition(actor, settings, forOpening) {
if (transition) { return {
transition.set_to(value); 'opacity': {from: 255, to: 255, mode: 3},
transition.set_duration(animationTime); 'scale-x': {from: 1.0, to: 1.0, mode: 3},
} 'scale-y': {from: 1.0, to: 1.0, mode: 3}
}; };
// We re-target these transitions so that the window is neither scaled nor faded.
tweakTransition('opacity', 255);
tweakTransition('scale-x', 1);
tweakTransition('scale-y', 1);
} }
} }
@@ -114,11 +112,14 @@ if (utils.isInShellProcess()) {
const shaderSnippets = Me.imports.src.shaderSnippets; const shaderSnippets = Me.imports.src.shaderSnippets;
Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect { Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect {
_init(settings) { _init(settings, forOpening) {
super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER}); super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
const color = Clutter.Color.from_string(settings.get_string('energize-a-color'))[1]; 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(` this.set_shader_source(`
// Inject some common shader snippets. // Inject some common shader snippets.
@@ -126,7 +127,8 @@ if (utils.isInShellProcess()) {
${shaderSnippets.noise()} ${shaderSnippets.noise()}
${shaderSnippets.edgeMask()} ${shaderSnippets.edgeMask()}
const vec2 SEED = vec2(${Math.random()}, ${Math.random()}); const vec2 SEED = vec2(${testMode ? 0 : Math.random()},
${testMode ? 0 : Math.random()});
const float FADE_IN_TIME = 0.3; const float FADE_IN_TIME = 0.3;
const float FADE_OUT_TIME = 0.6; const float FADE_OUT_TIME = 0.6;
const float HEART_FADE_TIME = 0.3; const float HEART_FADE_TIME = 0.3;
@@ -159,6 +161,10 @@ if (utils.isInShellProcess()) {
// Compute fading window opacity. // Compute fading window opacity.
float windowMask = pow(1.0 - fadeOutProgress, 2.0); float windowMask = pow(1.0 - fadeOutProgress, 2.0);
#if ${forOpening ? '1' : '0'}
windowMask = 1.0 - windowMask;
#endif
return vec2(atomMask, windowMask); return vec2(atomMask, windowMask);
} }
+36 -30
View File
@@ -15,6 +15,8 @@
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const _ = imports.gettext.domain('burn-my-windows').gettext;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const Me = imports.misc.extensionUtils.getCurrentExtension(); const Me = imports.misc.extensionUtils.getCurrentExtension();
const utils = Me.imports.src.utils; const utils = Me.imports.src.utils;
@@ -40,7 +42,8 @@ var EnergizeB = class EnergizeB {
// This will be called in various places where a unique identifier for this effect is // 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 // required. It should match the prefix of the settings keys which store whether the
// effect is enabled currently (e.g. the '*-close-effect'). // effect is enabled currently (e.g. '*-close-effect'), and its animation time
// (e.g. '*-animation-time').
static getNick() { static getNick() {
return 'energize-b'; return 'energize-b';
} }
@@ -48,7 +51,7 @@ var EnergizeB = class EnergizeB {
// This will be shown in the sidebar of the preferences dialog as well as in the // 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. // drop-down menus where the user can choose the effect.
static getLabel() { static getLabel() {
return 'Energize B'; return _('Energize B');
} }
// -------------------------------------------------------------------- API for prefs.js // -------------------------------------------------------------------- API for prefs.js
@@ -56,7 +59,7 @@ var EnergizeB = class EnergizeB {
// This is called by the preferences dialog. It loads the settings page for this effect, // 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 // binds all properties to the settings and appends the page to the main stack of the
// preferences dialog. // preferences dialog.
static initPreferences(dialog) { static getPreferences(dialog) {
// Add the settings page to the builder. // Add the settings page to the builder.
dialog.getBuilder().add_from_resource(`/ui/${utils.getGTKString()}/EnergizeB.ui`); dialog.getBuilder().add_from_resource(`/ui/${utils.getGTKString()}/EnergizeB.ui`);
@@ -66,38 +69,33 @@ var EnergizeB = class EnergizeB {
dialog.bindAdjustment('energize-b-scale'); dialog.bindAdjustment('energize-b-scale');
dialog.bindColorButton('energize-b-color'); dialog.bindColorButton('energize-b-color');
// Finally, append the settings page to the main stack. // Finally, return the new settings page.
const stack = dialog.getBuilder().get_object('main-stack'); return dialog.getBuilder().get_object('energize-b-prefs');
stack.add_titled(
dialog.getBuilder().get_object('energize-b-prefs'), EnergizeB.getNick(),
EnergizeB.getLabel());
} }
// ---------------------------------------------------------------- API for extension.js // ---------------------------------------------------------------- API for extension.js
// This is called from extension.js whenever a window is closed with this effect. // This is called from extension.js whenever a window is closed with this effect.
static createShader(settings) { static createShader(actor, settings, forOpening) {
return new Shader(settings); return new Shader(settings, forOpening);
} }
// This is also called from extension.js. It is used to tweak the ongoing transitions of // The tweakTransition() is called from extension.js to tweak a window's open / close
// the actor - usually windows are faded to transparency and scaled down slightly by // transitions - usually windows are faded in / out and scaled up / down by GNOME Shell.
// GNOME Shell. Here, we modify this behavior as well as the transition duration. // The parameter 'forOpening' is set to true if this is called for a window-open
static tweakTransitions(actor, settings) { // transition, for a window-close transition it is set to false. The modes can be set to
const animationTime = settings.get_int('energize-b-animation-time'); // 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+.
const tweakTransition = (property, value) => { // For this effect, windows should neither be scaled nor faded.
const transition = actor.get_transition(property); static tweakTransition(actor, settings, forOpening) {
if (transition) { return {
transition.set_to(value); 'opacity': {from: 255, to: 255, mode: 3},
transition.set_duration(animationTime); 'scale-x': {from: 1.0, to: 1.0, mode: 3},
} 'scale-y': {from: 1.0, to: 1.0, mode: 3}
}; };
// We re-target these transitions so that the window is neither scaled nor faded.
tweakTransition('opacity', 255);
tweakTransition('scale-x', 1);
tweakTransition('scale-y', 1);
} }
} }
@@ -114,11 +112,14 @@ if (utils.isInShellProcess()) {
const shaderSnippets = Me.imports.src.shaderSnippets; const shaderSnippets = Me.imports.src.shaderSnippets;
Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect { Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect {
_init(settings) { _init(settings, forOpening) {
super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER}); super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
const color = Clutter.Color.from_string(settings.get_string('energize-b-color'))[1]; 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(` this.set_shader_source(`
// Inject some common shader snippets. // Inject some common shader snippets.
@@ -126,8 +127,9 @@ if (utils.isInShellProcess()) {
${shaderSnippets.noise()} ${shaderSnippets.noise()}
${shaderSnippets.edgeMask()} ${shaderSnippets.edgeMask()}
const vec2 SEED = vec2(${Math.random()}, ${Math.random()}); const vec2 SEED = vec2(${testMode ? 0 : Math.random()},
const float SHOWER_TIME = 0.2; ${testMode ? 0 : Math.random()});
const float SHOWER_TIME = 0.3;
const float SHOWER_WIDTH = 0.3; const float SHOWER_WIDTH = 0.3;
const float STREAK_TIME = 0.6; const float STREAK_TIME = 0.6;
const float EDGE_FADE = 50; const float EDGE_FADE = 50;
@@ -156,7 +158,7 @@ if (utils.isInShellProcess()) {
float atomMask = getRelativeEdgeMask(0.2); float atomMask = getRelativeEdgeMask(0.2);
atomMask = max(0, atomMask - showerMask); atomMask = max(0, atomMask - showerMask);
atomMask *= streakMask; atomMask *= streakMask;
atomMask *= (1.0 - fadeProgress); atomMask *= sqrt(1-fadeProgress*fadeProgress);
// Make some particles visible in the streaks. // Make some particles visible in the streaks.
showerMask += 0.05 * streakMask; showerMask += 0.05 * streakMask;
@@ -177,6 +179,10 @@ if (utils.isInShellProcess()) {
// Compute fading window opacity. // Compute fading window opacity.
float windowMask = pow(1.0 - fadeProgress, 2.0); float windowMask = pow(1.0 - fadeProgress, 2.0);
#if ${forOpening ? '1' : '0'}
windowMask = 1.0 - windowMask;
#endif
return vec4(showerMask, streakMask, atomMask, windowMask); return vec4(showerMask, streakMask, atomMask, windowMask);
} }
+37 -34
View File
@@ -15,6 +15,8 @@
const {Gio, GObject} = imports.gi; const {Gio, GObject} = imports.gi;
const _ = imports.gettext.domain('burn-my-windows').gettext;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const Me = imports.misc.extensionUtils.getCurrentExtension(); const Me = imports.misc.extensionUtils.getCurrentExtension();
const utils = Me.imports.src.utils; const utils = Me.imports.src.utils;
@@ -44,7 +46,8 @@ var Fire = class Fire {
// This will be called in various places where a unique identifier for this effect is // 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 // required. It should match the prefix of the settings keys which store whether the
// effect is enabled currently (e.g. the '*-close-effect'). // effect is enabled currently (e.g. '*-close-effect'), and its animation time
// (e.g. '*-animation-time').
static getNick() { static getNick() {
return 'fire'; return 'fire';
} }
@@ -52,7 +55,7 @@ var Fire = class Fire {
// This will be shown in the sidebar of the preferences dialog as well as in the // 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. // drop-down menus where the user can choose the effect.
static getLabel() { static getLabel() {
return 'Fire'; return _('Fire');
} }
// -------------------------------------------------------------------- API for prefs.js // -------------------------------------------------------------------- API for prefs.js
@@ -60,7 +63,7 @@ var Fire = class Fire {
// This is called by the preferences dialog. It loads the settings page for this effect, // 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 // binds all properties to the settings and appends the page to the main stack of the
// preferences dialog. // preferences dialog.
static initPreferences(dialog) { static getPreferences(dialog) {
// Add the settings page to the builder. // Add the settings page to the builder.
dialog.getBuilder().add_from_resource(`/ui/${utils.getGTKString()}/Fire.ui`); dialog.getBuilder().add_from_resource(`/ui/${utils.getGTKString()}/Fire.ui`);
@@ -88,47 +91,43 @@ var Fire = class Fire {
// Initialize the fire-preset dropdown. // Initialize the fire-preset dropdown.
Fire._createFirePresets(dialog); Fire._createFirePresets(dialog);
// Finally, append the settings page to the main stack. // Finally, return the new settings page.
const stack = dialog.getBuilder().get_object('main-stack'); return dialog.getBuilder().get_object('fire-prefs');
stack.add_titled(
dialog.getBuilder().get_object('fire-prefs'), Fire.getNick(), Fire.getLabel());
} }
// ---------------------------------------------------------------- API for extension.js // ---------------------------------------------------------------- API for extension.js
// This is called from extension.js whenever a window is closed with this effect. // This is called from extension.js whenever a window is closed with this effect.
static createShader(settings) { static createShader(actor, settings, forOpening) {
return new Shader(settings); return new Shader(settings, forOpening);
} }
// This is also called from extension.js. It is used to tweak the ongoing transitions of // The tweakTransition() is called from extension.js to tweak a window's open / close
// the actor - usually windows are faded to transparency and scaled down slightly by // transitions - usually windows are faded in / out and scaled up / down by GNOME Shell.
// GNOME Shell. Here, we modify this behavior as well as the transition duration. // The parameter 'forOpening' is set to true if this is called for a window-open
static tweakTransitions(actor, settings) { // transition, for a window-close transition it is set to false. The modes can be set to
const animationTime = settings.get_int('fire-animation-time'); // 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+.
const tweakTransition = (property, value) => { // For this effect, windows should neither be scaled nor faded.
const transition = actor.get_transition(property); static tweakTransition(actor, settings, forOpening) {
if (transition) { return {
transition.set_to(value); 'opacity': {from: 255, to: 255, mode: 3},
transition.set_duration(animationTime); 'scale-x': {from: 1.0, to: 1.0, mode: 3},
} 'scale-y': {from: 1.0, to: 1.0, mode: 3}
}; };
// We re-target these transitions so that the window is neither scaled nor faded.
tweakTransition('opacity', 255);
tweakTransition('scale-x', 1);
tweakTransition('scale-y', 1);
} }
// ----------------------------------------------------------------------- private stuff // ----------------------------------------------------------------------- private stuff
// This populates the preset dropdown menu for the fire options. // This populates the preset dropdown menu for the fire options.
static _createFirePresets(dialog) { static _createFirePresets(dialog) {
dialog.getBuilder().get_object('settings-widget').connect('realize', (widget) => { dialog.getBuilder().get_object('fire-prefs').connect('realize', (widget) => {
const presets = [ const presets = [
{ {
name: 'Default Fire', name: _('Default Fire'),
scale: 1.0, scale: 1.0,
speed: 0.5, speed: 0.5,
color1: 'rgba(76, 51, 25, 0.0)', color1: 'rgba(76, 51, 25, 0.0)',
@@ -138,7 +137,7 @@ var Fire = class Fire {
color5: 'rgba(255, 255, 255, 1)' color5: 'rgba(255, 255, 255, 1)'
}, },
{ {
name: 'Hell Fire', name: _('Hell Fire'),
scale: 1.5, scale: 1.5,
speed: 0.2, speed: 0.2,
color1: 'rgba(0,0,0,0)', color1: 'rgba(0,0,0,0)',
@@ -148,7 +147,7 @@ var Fire = class Fire {
color5: 'rgba(255, 255, 255, 1)' color5: 'rgba(255, 255, 255, 1)'
}, },
{ {
name: 'Dark and Smutty', name: _('Dark and Smutty'),
scale: 1.0, scale: 1.0,
speed: 0.5, speed: 0.5,
color1: 'rgba(0,0,0,0)', color1: 'rgba(0,0,0,0)',
@@ -158,7 +157,7 @@ var Fire = class Fire {
color5: 'rgb(255,238,166)' color5: 'rgb(255,238,166)'
}, },
{ {
name: 'Cold Breeze', name: _('Cold Breeze'),
scale: 1.5, scale: 1.5,
speed: -0.1, speed: -0.1,
color1: 'rgba(0,110,255,0)', color1: 'rgba(0,110,255,0)',
@@ -168,7 +167,7 @@ var Fire = class Fire {
color5: 'rgb(97,189,255)' color5: 'rgb(97,189,255)'
}, },
{ {
name: 'Santa is Coming', name: _('Santa is Coming'),
scale: 0.4, scale: 0.4,
speed: -0.5, speed: -0.5,
color1: 'rgba(0,110,255,0)', color1: 'rgba(0,110,255,0)',
@@ -224,7 +223,7 @@ if (utils.isInShellProcess()) {
const shaderSnippets = Me.imports.src.shaderSnippets; const shaderSnippets = Me.imports.src.shaderSnippets;
Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect { Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect {
_init(settings) { _init(settings, forOpening) {
super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER}); super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
// Load the gradient values from the settings. We directly inject the values in the // Load the gradient values from the settings. We directly inject the values in the
@@ -247,7 +246,7 @@ if (utils.isInShellProcess()) {
${shaderSnippets.edgeMask()} ${shaderSnippets.edgeMask()}
// These may be configurable in the future. // These may be configurable in the future.
const float EDGE_FADE = 90; const float EDGE_FADE = 70;
const float FADE_WIDTH = 0.1; const float FADE_WIDTH = 0.1;
const float HIDE_TIME = 0.4; const float HIDE_TIME = 0.4;
const vec2 FIRE_SCALE = vec2(400, 600) * ${settings.get_double('flame-scale')}; const vec2 FIRE_SCALE = vec2(400, 600) * ${settings.get_double('flame-scale')};
@@ -309,6 +308,10 @@ if (utils.isInShellProcess()) {
// Fade at window borders. // Fade at window borders.
effectMask *= getAbsoluteEdgeMask(edgeFadeWidth); effectMask *= getAbsoluteEdgeMask(edgeFadeWidth);
#if ${forOpening ? '1' : '0'}
windowMask = 1.0 - windowMask;
#endif
return vec2(windowMask, effectMask); return vec2(windowMask, effectMask);
} }
@@ -336,7 +339,7 @@ if (utils.isInShellProcess()) {
cogl_color_out = texture2D(uTexture, cogl_tex_coord_in[0].st) * effectMask.x; cogl_color_out = texture2D(uTexture, cogl_tex_coord_in[0].st) * effectMask.x;
// Add the fire to the window. // Add the fire to the window.
cogl_color_out += fire; cogl_color_out = cogl_color_out * (1.0 - fire.a) + fire;
// These are pretty useful for understanding how this works. // These are pretty useful for understanding how this works.
// cogl_color_out = vec4(vec3(noise), 1); // cogl_color_out = vec4(vec3(noise), 1);
+52 -38
View File
@@ -15,6 +15,8 @@
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const _ = imports.gettext.domain('burn-my-windows').gettext;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const Me = imports.misc.extensionUtils.getCurrentExtension(); const Me = imports.misc.extensionUtils.getCurrentExtension();
const utils = Me.imports.src.utils; const utils = Me.imports.src.utils;
@@ -44,7 +46,8 @@ var Matrix = class Matrix {
// This will be called in various places where a unique identifier for this effect is // 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 // required. It should match the prefix of the settings keys which store whether the
// effect is enabled currently (e.g. the '*-close-effect'). // effect is enabled currently (e.g. '*-close-effect'), and its animation time
// (e.g. '*-animation-time').
static getNick() { static getNick() {
return 'matrix'; return 'matrix';
} }
@@ -52,7 +55,7 @@ var Matrix = class Matrix {
// This will be shown in the sidebar of the preferences dialog as well as in the // 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. // drop-down menus where the user can choose the effect.
static getLabel() { static getLabel() {
return 'Matrix'; return _('Matrix');
} }
// -------------------------------------------------------------------- API for prefs.js // -------------------------------------------------------------------- API for prefs.js
@@ -60,7 +63,7 @@ var Matrix = class Matrix {
// This is called by the preferences dialog. It loads the settings page for this effect, // 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 // binds all properties to the settings and appends the page to the main stack of the
// preferences dialog. // preferences dialog.
static initPreferences(dialog) { static getPreferences(dialog) {
// Add the settings page to the builder. // Add the settings page to the builder.
dialog.getBuilder().add_from_resource('/ui/gtk4/Matrix.ui'); dialog.getBuilder().add_from_resource('/ui/gtk4/Matrix.ui');
@@ -69,41 +72,39 @@ var Matrix = class Matrix {
dialog.bindAdjustment('matrix-animation-time'); dialog.bindAdjustment('matrix-animation-time');
dialog.bindAdjustment('matrix-scale'); dialog.bindAdjustment('matrix-scale');
dialog.bindAdjustment('matrix-randomness'); dialog.bindAdjustment('matrix-randomness');
dialog.bindAdjustment('matrix-overshoot');
dialog.bindColorButton('matrix-trail-color'); dialog.bindColorButton('matrix-trail-color');
dialog.bindColorButton('matrix-tip-color'); dialog.bindColorButton('matrix-tip-color');
// Finally, append the settings page to the main stack. // Finally, return the new settings page.
const stack = dialog.getBuilder().get_object('main-stack'); return dialog.getBuilder().get_object('matrix-prefs');
stack.add_titled(
dialog.getBuilder().get_object('matrix-prefs'), Matrix.getNick(),
Matrix.getLabel());
} }
// ---------------------------------------------------------------- API for extension.js // ---------------------------------------------------------------- API for extension.js
// This is called from extension.js whenever a window is closed with this effect. // This is called from extension.js whenever a window is closed with this effect.
static createShader(settings) { static createShader(actor, settings, forOpening) {
return new Shader(settings); return new Shader(settings, forOpening);
} }
// This is also called from extension.js. It is used to tweak the ongoing transitions of // The tweakTransition() is called from extension.js to tweak a window's open / close
// the actor - usually windows are faded to transparency and scaled down slightly by // transitions - usually windows are faded in / out and scaled up / down by GNOME Shell.
// GNOME Shell. Here, we modify this behavior as well as the transition duration. // The parameter 'forOpening' is set to true if this is called for a window-open
static tweakTransitions(actor, settings) { // transition, for a window-close transition it is set to false. The modes can be set to
const animationTime = settings.get_int('matrix-animation-time'); // 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+.
const tweakTransition = (property, value) => { // For this effect, windows should not be faded but scaled vertically to allow for some
const transition = actor.get_transition(property); // overshooting.
if (transition) { static tweakTransition(actor, settings, forOpening) {
transition.set_to(value); const yScale = 1.0 + settings.get_double('matrix-overshoot');
transition.set_duration(animationTime); 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}
}; };
// We re-target these transitions so that the window is neither scaled nor faded.
tweakTransition('opacity', 255);
tweakTransition('scale-x', 1);
tweakTransition('scale-y', 1);
} }
} }
@@ -120,7 +121,7 @@ if (utils.isInShellProcess()) {
const shaderSnippets = Me.imports.src.shaderSnippets; const shaderSnippets = Me.imports.src.shaderSnippets;
Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect { Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect {
_init(settings) { _init(settings, forOpening) {
super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER}); super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
// Load the font texture. As the shader is re-created for each window animation, // Load the font texture. As the shader is re-created for each window animation,
@@ -158,6 +159,7 @@ if (utils.isInShellProcess()) {
const float LETTER_SIZE = ${settings.get_int('matrix-scale')}; const float LETTER_SIZE = ${settings.get_int('matrix-scale')};
const float LETTER_FLICKER_SPEED = 2.0; const float LETTER_FLICKER_SPEED = 2.0;
const float RANDOMNESS = ${settings.get_double('matrix-randomness')}; const float RANDOMNESS = ${settings.get_double('matrix-randomness')};
const float OVERSHOOT = ${settings.get_double('matrix-overshoot')};
// This returns a flickering grid of random letters. // This returns a flickering grid of random letters.
float getText(vec2 fragCoord) { float getText(vec2 fragCoord) {
@@ -176,37 +178,49 @@ if (utils.isInShellProcess()) {
// to one below each drop and to zero above it. This second value is used for fading // to one below each drop and to zero above it. This second value is used for fading
// the window texture. // the window texture.
vec2 getRain(vec2 fragCoord) { vec2 getRain(vec2 fragCoord) {
vec2 coords = fragCoord * vec2(uSizeX, uSizeY); float column = cogl_tex_coord_in[0].x * uSizeX;
coords.x -= mod(coords.x, LETTER_SIZE); column -= mod(column, LETTER_SIZE);
float delay = fract(sin(coords.x)*78.233) * mix(0.0, 1.0, RANDOMNESS); float delay = fract(sin(column)*78.233) * mix(0.0, 1.0, RANDOMNESS);
float speed = fract(cos(coords.x)*12.989) * mix(0.0, 0.3, RANDOMNESS) + 1.5; float speed = fract(cos(column)*12.989) * mix(0.0, 0.3, RANDOMNESS) + 1.5;
float distToDrop = (uProgress*2-delay)*speed - fragCoord.y; float distToDrop = (uProgress*2-delay)*speed - cogl_tex_coord_in[0].y;
float rainAlpha = distToDrop >= 0 ? exp(-distToDrop/TRAIL_LENGTH) : 0; float rainAlpha = distToDrop >= 0 ? exp(-distToDrop/TRAIL_LENGTH) : 0;
float windowAlpha = 1 - clamp(uSizeY*distToDrop, 0, FADE_WIDTH) / FADE_WIDTH; 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); return vec2(rainAlpha, windowAlpha);
} }
void main() { 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. // Get a cool matrix effect. See comments for those methods above.
vec2 rain = getRain(cogl_tex_coord_in[0].st); vec2 rain = getRain(coords);
float text = getText(cogl_tex_coord_in[0].st); float text = getText(coords);
// Get the window texture and fade it according to the effect mask. // Get the window texture and fade it according to the effect mask.
cogl_color_out = texture2D(uTexture, cogl_tex_coord_in[0].st) * rain.y; cogl_color_out = texture2D(uTexture, coords) * rain.y;
// This is used to fade out the remaining trails in the end. // This is used to fade out the remaining trails in the end.
float finalFade = 1-clamp((uProgress-FINAL_FADE_START_TIME)/ float finalFade = 1-clamp((uProgress-FINAL_FADE_START_TIME)/
(1-FINAL_FADE_START_TIME), 0, 1); (1-FINAL_FADE_START_TIME), 0, 1);
float rainAlpha = finalFade * rain.x; float rainAlpha = finalFade * rain.x;
// Fade at window borders.
rainAlpha *= getAbsoluteEdgeMask(EDGE_FADE);
// Add the matrix effect to the window. // Add the matrix effect to the window.
vec3 trailColor = vec3(${trailColor.red / 255}, vec3 trailColor = vec3(${trailColor.red / 255},
${trailColor.green / 255}, ${trailColor.green / 255},
+44 -42
View File
@@ -15,6 +15,8 @@
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const _ = imports.gettext.domain('burn-my-windows').gettext;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const Me = imports.misc.extensionUtils.getCurrentExtension(); const Me = imports.misc.extensionUtils.getCurrentExtension();
const utils = Me.imports.src.utils; const utils = Me.imports.src.utils;
@@ -42,7 +44,8 @@ var TRexAttack = class TRexAttack {
// This will be called in various places where a unique identifier for this effect is // 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 // required. It should match the prefix of the settings keys which store whether the
// effect is enabled currently (e.g. the '*-close-effect'). // effect is enabled currently (e.g. '*-close-effect'), and its animation time
// (e.g. '*-animation-time').
static getNick() { static getNick() {
return 'trex'; return 'trex';
} }
@@ -50,7 +53,7 @@ var TRexAttack = class TRexAttack {
// This will be shown in the sidebar of the preferences dialog as well as in the // 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. // drop-down menus where the user can choose the effect.
static getLabel() { static getLabel() {
return 'T-Rex Attack'; return _('T-Rex Attack');
} }
// -------------------------------------------------------------------- API for prefs.js // -------------------------------------------------------------------- API for prefs.js
@@ -58,7 +61,7 @@ var TRexAttack = class TRexAttack {
// This is called by the preferences dialog. It loads the settings page for this effect, // 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 // binds all properties to the settings and appends the page to the main stack of the
// preferences dialog. // preferences dialog.
static initPreferences(dialog) { static getPreferences(dialog) {
// Add the settings page to the builder. // Add the settings page to the builder.
dialog.getBuilder().add_from_resource('/ui/gtk4/TRexAttack.ui'); dialog.getBuilder().add_from_resource('/ui/gtk4/TRexAttack.ui');
@@ -70,40 +73,34 @@ var TRexAttack = class TRexAttack {
dialog.bindAdjustment('claw-scratch-count'); dialog.bindAdjustment('claw-scratch-count');
dialog.bindAdjustment('claw-scratch-warp'); dialog.bindAdjustment('claw-scratch-warp');
// Finally, append the settings page to the main stack. // Finally, return the new settings page.
const stack = dialog.getBuilder().get_object('main-stack'); return dialog.getBuilder().get_object('trex-prefs');
stack.add_titled(
dialog.getBuilder().get_object('trex-prefs'), TRexAttack.getNick(),
TRexAttack.getLabel());
} }
// ---------------------------------------------------------------- API for extension.js // ---------------------------------------------------------------- API for extension.js
// This is called from extension.js whenever a window is closed with this effect. // This is called from extension.js whenever a window is closed with this effect.
static createShader(settings) { static createShader(actor, settings, forOpening) {
return new Shader(settings); return new Shader(settings, forOpening);
} }
// This is also called from extension.js. It is used to tweak the ongoing transitions of // The tweakTransition() is called from extension.js to tweak a window's open / close
// the actor - usually windows are faded to transparency and scaled down slightly by // transitions - usually windows are faded in / out and scaled up / down by GNOME Shell.
// GNOME Shell. Here, we modify this behavior as well as the transition duration. // The parameter 'forOpening' is set to true if this is called for a window-open
static tweakTransitions(actor, settings) { // transition, for a window-close transition it is set to false. The modes can be set to
const animationTime = settings.get_int('trex-animation-time'); // 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+.
const tweakTransition = (property, value) => { // For this effect, we slightly increase the window's scale as part of the warp effect.
const transition = actor.get_transition(property); static tweakTransition(actor, settings, forOpening) {
if (transition) { const warp = 1.0 + 0.5 * settings.get_double('claw-scratch-warp');
transition.set_to(value); return {
transition.set_duration(animationTime); '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}
}; };
// For this effect, we slightly increase the window's scale as part of the warp
// effect.
const warp = 0.5 * settings.get_double('claw-scratch-warp');
tweakTransition('opacity', 255);
tweakTransition('scale-x', 1.0 + warp);
tweakTransition('scale-y', 1.0 + warp);
} }
} }
@@ -120,7 +117,7 @@ if (utils.isInShellProcess()) {
const shaderSnippets = Me.imports.src.shaderSnippets; const shaderSnippets = Me.imports.src.shaderSnippets;
Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect { Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect {
_init(settings) { _init(settings, forOpening) {
super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER}); super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
// Load the claw texture. As the shader is re-created for each window animation, // Load the claw texture. As the shader is re-created for each window animation,
@@ -128,13 +125,15 @@ if (utils.isInShellProcess()) {
// See assets/README.md for how this texture was created. // See assets/README.md for how this texture was created.
const clawData = GdkPixbuf.Pixbuf.new_from_resource('/img/claws.png'); const clawData = GdkPixbuf.Pixbuf.new_from_resource('/img/claws.png');
this._clawTexture = new Clutter.Image(); this._clawTexture = new Clutter.Image();
this._clawTexture.set_data( this._clawTexture.set_data(clawData.get_pixels(), Cogl.PixelFormat.RGB_888,
clawData.get_pixels(), Cogl.PixelFormat.RGB_888, clawData.width, clawData.width, clawData.height, clawData.rowstride);
clawData.height, clawData.rowstride);
const color = const color =
Clutter.Color.from_string(settings.get_string('claw-scratch-color'))[1]; 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(` this.set_shader_source(`
// Inject some common shader snippets. // Inject some common shader snippets.
@@ -144,13 +143,14 @@ if (utils.isInShellProcess()) {
// See assets/README.md for how this texture was created. // See assets/README.md for how this texture was created.
uniform sampler2D uClawTexture; uniform sampler2D uClawTexture;
const vec2 SEED = vec2(${Math.random()}, ${Math.random()}); const vec2 SEED = vec2(${testMode ? 0 : Math.random()},
${testMode ? 0 : Math.random()});
const float CLAW_SIZE = ${settings.get_double('claw-scratch-scale')}; const float CLAW_SIZE = ${settings.get_double('claw-scratch-scale')};
const float NUM_CLAWS = ${settings.get_int('claw-scratch-count')}; const float NUM_CLAWS = ${settings.get_int('claw-scratch-count')};
const float WARP_INTENSITY = 1.0 + ${settings.get_double('claw-scratch-warp')}; const float WARP_INTENSITY = 1.0 + ${settings.get_double('claw-scratch-warp')};
const float FLASH_INTENSITY = 0.1; const float FLASH_INTENSITY = 0.1;
const float MAX_SPAWN_TIME = 0.5; // Scratches will only start in the first half of the animation. const float MAX_SPAWN_TIME = 0.6; // Scratches will only start in the first half of the animation.
const float FF_TIME = 0.5; // Relative time for the final fade to transparency. 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 // 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 // UV squares. It returns the texture coords of the UV square at the given actor
@@ -191,11 +191,13 @@ if (utils.isInShellProcess()) {
void main() { void main() {
float progress = ${forOpening ? '1.0-uProgress' : 'uProgress'};
// Warp the texture coordinates to create a blow-up effect. // Warp the texture coordinates to create a blow-up effect.
vec2 coords = cogl_tex_coord_in[0].st * 2.0 - 1.0; vec2 coords = cogl_tex_coord_in[0].st * 2.0 - 1.0;
float dist = length(coords); float dist = length(coords);
coords = (coords/dist * pow(dist, WARP_INTENSITY)) * 0.5 + 0.5; coords = (coords/dist * pow(dist, WARP_INTENSITY)) * 0.5 + 0.5;
coords = mix(cogl_tex_coord_in[0].st, coords, uProgress); coords = mix(cogl_tex_coord_in[0].st, coords, progress);
// Accumulate several random scratches. The color in the scratch map refers to the // 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 // relative time when the respective part will become invisible. Therefore we can
@@ -209,11 +211,11 @@ if (utils.isInShellProcess()) {
// Get the window texture. We shift the texture lookup by the local derivative of // Get the window texture. We shift the texture lookup by the local derivative of
// the claw texture in order to mimic some folding distortion. // the claw texture in order to mimic some folding distortion.
vec2 offset = vec2(dFdx(scratchMap), dFdy(scratchMap)) * uProgress * 0.5; vec2 offset = vec2(dFdx(scratchMap), dFdy(scratchMap)) * progress * 0.5;
cogl_color_out = texture2D(uTexture, coords + offset); cogl_color_out = texture2D(uTexture, coords + offset);
// Add colorful flashes. // Add colorful flashes.
float flashIntensity = 1.0 / FLASH_INTENSITY * (scratchMap - uProgress) + 1; float flashIntensity = 1.0 / FLASH_INTENSITY * (scratchMap - progress) + 1;
if (flashIntensity < 0 || flashIntensity >= 1) { if (flashIntensity < 0 || flashIntensity >= 1) {
flashIntensity = 0; flashIntensity = 0;
} }
@@ -222,17 +224,17 @@ if (utils.isInShellProcess()) {
flashIntensity *= cogl_color_out.a; flashIntensity *= cogl_color_out.a;
// Hide scratched out parts. // Hide scratched out parts.
cogl_color_out *= (scratchMap > uProgress ? 1 : 0); cogl_color_out *= (scratchMap > progress ? 1 : 0);
vec3 flashColor = vec3(${color.red / 255}, vec3 flashColor = vec3(${color.red / 255},
${color.green / 255}, ${color.green / 255},
${color.blue / 255}) * ${color.alpha / 255}; ${color.blue / 255}) * ${color.alpha / 255};
cogl_color_out.rgb += flashIntensity * mix(flashColor, vec3(0), uProgress); cogl_color_out.rgb += flashIntensity * mix(flashColor, vec3(0), progress);
// Fade out the remaining shards. // Fade out the remaining shards.
float fade = smoothstep(0, 1, 1 - clamp((uProgress - 1.0 + FF_TIME)/FF_TIME, 0, 1)); float fadeProgress = smoothstep(0, 1, (progress - 1.0 + FF_TIME)/FF_TIME);
cogl_color_out *= fade; cogl_color_out *= sqrt(1-fadeProgress*fadeProgress);
// These are pretty useful for understanding how this works. // These are pretty useful for understanding how this works.
// cogl_color_out = vec4(vec3(flashIntensity), 1); // cogl_color_out = vec4(vec3(flashIntensity), 1);
+32 -32
View File
@@ -15,6 +15,8 @@
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const _ = imports.gettext.domain('burn-my-windows').gettext;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const Me = imports.misc.extensionUtils.getCurrentExtension(); const Me = imports.misc.extensionUtils.getCurrentExtension();
const utils = Me.imports.src.utils; const utils = Me.imports.src.utils;
@@ -42,7 +44,8 @@ var TVEffect = class TVEffect {
// This will be called in various places where a unique identifier for this effect is // 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 // required. It should match the prefix of the settings keys which store whether the
// effect is enabled currently (e.g. the '*-close-effect'). // effect is enabled currently (e.g. '*-close-effect'), and its animation time
// (e.g. '*-animation-time').
static getNick() { static getNick() {
return 'tv'; return 'tv';
} }
@@ -50,7 +53,7 @@ var TVEffect = class TVEffect {
// This will be shown in the sidebar of the preferences dialog as well as in the // 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. // drop-down menus where the user can choose the effect.
static getLabel() { static getLabel() {
return 'TV Effect'; return _('TV Effect');
} }
// -------------------------------------------------------------------- API for prefs.js // -------------------------------------------------------------------- API for prefs.js
@@ -58,7 +61,7 @@ var TVEffect = class TVEffect {
// This is called by the preferences dialog. It loads the settings page for this effect, // 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 // binds all properties to the settings and appends the page to the main stack of the
// preferences dialog. // preferences dialog.
static initPreferences(dialog) { static getPreferences(dialog) {
// Add the settings page to the builder. // Add the settings page to the builder.
dialog.getBuilder().add_from_resource(`/ui/${utils.getGTKString()}/TVEffect.ui`); dialog.getBuilder().add_from_resource(`/ui/${utils.getGTKString()}/TVEffect.ui`);
@@ -67,38 +70,33 @@ var TVEffect = class TVEffect {
dialog.bindAdjustment('tv-animation-time'); dialog.bindAdjustment('tv-animation-time');
dialog.bindColorButton('tv-effect-color'); dialog.bindColorButton('tv-effect-color');
// Finally, append the settings page to the main stack. // Finally, return the new settings page.
const stack = dialog.getBuilder().get_object('main-stack'); return dialog.getBuilder().get_object('tv-prefs');
stack.add_titled(
dialog.getBuilder().get_object('tv-prefs'), TVEffect.getNick(),
TVEffect.getLabel());
} }
// ---------------------------------------------------------------- API for extension.js // ---------------------------------------------------------------- API for extension.js
// This is called from extension.js whenever a window is closed with this effect. // This is called from extension.js whenever a window is closed with this effect.
static createShader(settings) { static createShader(actor, settings, forOpening) {
return new Shader(settings); return new Shader(settings, forOpening);
} }
// This is also called from extension.js. It is used to tweak the ongoing transitions of // The tweakTransition() is called from extension.js to tweak a window's open / close
// the actor - usually windows are faded to transparency and scaled down slightly by // transitions - usually windows are faded in / out and scaled up / down by GNOME Shell.
// GNOME Shell. Here, we modify this behavior as well as the transition duration. // The parameter 'forOpening' is set to true if this is called for a window-open
static tweakTransitions(actor, settings) { // transition, for a window-close transition it is set to false. The modes can be set to
const animationTime = settings.get_int('tv-animation-time'); // 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+.
const tweakTransition = (property, value) => { // For this effect, windows are scaled down vertically.
const transition = actor.get_transition(property); static tweakTransition(actor, settings, forOpening) {
if (transition) { return {
transition.set_to(value); 'opacity': {from: 255, to: 255, mode: 3},
transition.set_duration(animationTime); '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}
}; };
// For this effect, we scale the window only vertically.
tweakTransition('opacity', 255);
tweakTransition('scale-x', 1);
tweakTransition('scale-y', 0.5);
} }
} }
@@ -115,7 +113,7 @@ if (utils.isInShellProcess()) {
const shaderSnippets = Me.imports.src.shaderSnippets; const shaderSnippets = Me.imports.src.shaderSnippets;
Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect { Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect {
_init(settings) { _init(settings, forOpening) {
super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER}); super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
const color = Clutter.Color.from_string(settings.get_string('tv-effect-color'))[1]; const color = Clutter.Color.from_string(settings.get_string('tv-effect-color'))[1];
@@ -129,17 +127,19 @@ if (utils.isInShellProcess()) {
const float TB_TIME = 0.7; // Relative time for the top/bottom animation. 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_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 LR_DELAY = 0.6; // Delay after which the left/right animation starts.
const float FF_TIME = 0.2; // Relative time for the final fade to transparency. const float FF_TIME = 0.1; // Relative time for the final fade to transparency.
void main() { void main() {
float progress = ${forOpening ? '1.0-uProgress' : 'uProgress'};
// All of these are in [0..1] during the different stages of the animation. // All of these are in [0..1] during the different stages of the animation.
// tb refers to the top-bottom animation. // tb refers to the top-bottom animation.
// lr refers to the left-right animation. // lr refers to the left-right animation.
// ff refers to the final fade animation. // ff refers to the final fade animation.
float tbProgress = smoothstep(0, 1, clamp(uProgress/TB_TIME, 0, 1)); float tbProgress = smoothstep(0, 1, clamp(progress/TB_TIME, 0, 1));
float lrProgress = smoothstep(0, 1, clamp((uProgress - LR_DELAY)/LR_TIME, 0, 1)); float lrProgress = smoothstep(0, 1, clamp((progress - LR_DELAY)/LR_TIME, 0, 1));
float ffProgress = smoothstep(0, 1, clamp((uProgress - 1.0 + FF_TIME)/FF_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] // This is a top-center-bottom gradient in [0..1..0]
float tb = cogl_tex_coord_in[0].t * 2; float tb = cogl_tex_coord_in[0].t * 2;
@@ -162,7 +162,7 @@ if (utils.isInShellProcess()) {
${color.green / 255}, ${color.green / 255},
${color.blue / 255}, 1.0) * windowColor.a; ${color.blue / 255}, 1.0) * windowColor.a;
windowColor.rgb = mix(windowColor.rgb, effectColor.rgb, smoothstep(0, 1, uProgress)); windowColor.rgb = mix(windowColor.rgb, effectColor.rgb, smoothstep(0, 1, progress));
cogl_color_out = windowColor * mask; cogl_color_out = windowColor * mask;
+39 -35
View File
@@ -15,6 +15,8 @@
const GObject = imports.gi.GObject; const GObject = imports.gi.GObject;
const _ = imports.gettext.domain('burn-my-windows').gettext;
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const Me = imports.misc.extensionUtils.getCurrentExtension(); const Me = imports.misc.extensionUtils.getCurrentExtension();
const utils = Me.imports.src.utils; const utils = Me.imports.src.utils;
@@ -27,9 +29,10 @@ const utils = Me.imports.src.utils;
// The shader class for this effect is registered further down in this file. // The shader class for this effect is registered further down in this file.
let Shader = null; let Shader = null;
// The effect class is completely static. It can be used to get some metadata (like the // This will be called in various places where a unique identifier for this effect is
// effect's name or supported GNOME Shell versions), to initialize the respective page of // required. It should match the prefix of the settings keys which store whether the
// the settings dialog, as well as to create the actual shader for the effect. // effect is enabled currently (e.g. '*-close-effect'), and its animation time
// (e.g. '*-animation-time').
var Wisps = class Wisps { var Wisps = class Wisps {
// ---------------------------------------------------------------------------- metadata // ---------------------------------------------------------------------------- metadata
@@ -49,7 +52,7 @@ var Wisps = class Wisps {
// This will be shown in the sidebar of the preferences dialog as well as in the // 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. // drop-down menus where the user can choose the effect.
static getLabel() { static getLabel() {
return 'Wisps'; return _('Wisps');
} }
// -------------------------------------------------------------------- API for prefs.js // -------------------------------------------------------------------- API for prefs.js
@@ -57,7 +60,7 @@ var Wisps = class Wisps {
// This is called by the preferences dialog. It loads the settings page for this effect, // 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 // binds all properties to the settings and appends the page to the main stack of the
// preferences dialog. // preferences dialog.
static initPreferences(dialog) { static getPreferences(dialog) {
// Add the settings page to the builder. // Add the settings page to the builder.
dialog.getBuilder().add_from_resource(`/ui/${utils.getGTKString()}/Wisps.ui`); dialog.getBuilder().add_from_resource(`/ui/${utils.getGTKString()}/Wisps.ui`);
@@ -67,38 +70,33 @@ var Wisps = class Wisps {
dialog.bindAdjustment('wisps-scale'); dialog.bindAdjustment('wisps-scale');
dialog.bindColorButton('wisps-color'); dialog.bindColorButton('wisps-color');
// Finally, append the settings page to the main stack. // Finally, return the new settings page.
const stack = dialog.getBuilder().get_object('main-stack'); return dialog.getBuilder().get_object('wisps-prefs');
stack.add_titled(
dialog.getBuilder().get_object('wisps-prefs'), Wisps.getNick(), Wisps.getLabel());
} }
// ---------------------------------------------------------------- API for extension.js // ---------------------------------------------------------------- API for extension.js
// This is called from extension.js whenever a window is closed with this effect. // This is called from extension.js whenever a window is closed with this effect.
static createShader(settings) { static createShader(actor, settings, forOpening) {
return new Shader(settings); return new Shader(settings, forOpening);
} }
// This is also called from extension.js. It is used to tweak the ongoing transitions of // The tweakTransition() is called from extension.js to tweak a window's open / close
// the actor - usually windows are faded to transparency and scaled down slightly by // transitions - usually windows are faded in / out and scaled up / down by GNOME Shell.
// GNOME Shell. Here, we modify this behavior as well as the transition duration. // The parameter 'forOpening' is set to true if this is called for a window-open
static tweakTransitions(actor, settings) { // transition, for a window-close transition it is set to false. The modes can be set to
const animationTime = settings.get_int('wisps-animation-time'); // 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+.
const tweakTransition = (property, value) => { // For this effect, windows should be scaled down slightly but not faded.
const transition = actor.get_transition(property); static tweakTransition(actor, settings, forOpening) {
if (transition) { return {
transition.set_to(value); 'opacity': {from: 255, to: 255, mode: 3},
transition.set_duration(animationTime); 'scale-x': {from: forOpening ? 0.9 : 1.0, to: forOpening ? 1.0 : 0.9, mode: 3},
} 'scale-y': {from: forOpening ? 0.9 : 1.0, to: forOpening ? 1.0 : 0.9, mode: 3}
}; };
// We re-target these transitions so that the window is not faded but scaled down a
// tiny bit.
tweakTransition('opacity', 255);
tweakTransition('scale-x', 0.9);
tweakTransition('scale-y', 0.9);
} }
} }
@@ -115,11 +113,14 @@ if (utils.isInShellProcess()) {
const shaderSnippets = Me.imports.src.shaderSnippets; const shaderSnippets = Me.imports.src.shaderSnippets;
Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect { Shader = GObject.registerClass({}, class Shader extends Clutter.ShaderEffect {
_init(settings) { _init(settings, forOpening) {
super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER}); super._init({shader_type: Clutter.ShaderType.FRAGMENT_SHADER});
const color = Clutter.Color.from_string(settings.get_string('wisps-color'))[1]; const color = Clutter.Color.from_string(settings.get_string('wisps-color'))[1];
// If we are currently performing integration test, the animation uses a fixed seed.
const testMode = settings.get_boolean('test-mode');
this.set_shader_source(` this.set_shader_source(`
// Inject some common shader snippets. // Inject some common shader snippets.
@@ -127,7 +128,8 @@ if (utils.isInShellProcess()) {
${shaderSnippets.noise()} ${shaderSnippets.noise()}
${shaderSnippets.edgeMask()} ${shaderSnippets.edgeMask()}
const vec2 SEED = vec2(${Math.random()}, ${Math.random()}); const vec2 SEED = vec2(${testMode ? 0 : Math.random()},
${testMode ? 0 : Math.random()});
const float WISPS_RADIUS = 20.0; const float WISPS_RADIUS = 20.0;
const float WISPS_SPEED = 10.0; const float WISPS_SPEED = 10.0;
const float WISPS_SPACING = 40 + WISPS_RADIUS; const float WISPS_SPACING = 40 + WISPS_RADIUS;
@@ -175,6 +177,8 @@ if (utils.isInShellProcess()) {
void main() { void main() {
float progress = ${forOpening ? '1.0-uProgress' : 'uProgress'};
// Get the color of the window. // Get the color of the window.
vec4 windowColor = texture2D(uTexture, cogl_tex_coord_in[0].st); vec4 windowColor = texture2D(uTexture, cogl_tex_coord_in[0].st);
vec4 effectColor = vec4(${color.red / 255}, vec4 effectColor = vec4(${color.red / 255},
@@ -182,7 +186,7 @@ if (utils.isInShellProcess()) {
${color.blue / 255}, 1.0) * windowColor.a; ${color.blue / 255}, 1.0) * windowColor.a;
// Compute several layers of moving wisps. // Compute several layers of moving wisps.
vec2 uv = (cogl_tex_coord_in[0].st-0.5) / mix(1.0, 0.5, uProgress) + 0.5; vec2 uv = (cogl_tex_coord_in[0].st-0.5) / mix(1.0, 0.5, progress) + 0.5;
uv /= ${settings.get_double('wisps-scale')}; uv /= ${settings.get_double('wisps-scale')};
float wisps = 0; float wisps = 0;
for (int i=0; i<WISPS_LAYERS; ++i) { for (int i=0; i<WISPS_LAYERS; ++i) {
@@ -190,12 +194,12 @@ if (utils.isInShellProcess()) {
} }
// Compute shrinking edge mask. // Compute shrinking edge mask.
float mask = getRelativeEdgeMask(mix(0.01, 0.5, uProgress)); float mask = getRelativeEdgeMask(mix(0.01, 0.5, progress));
// Compute three different progress values. // Compute three different progress values.
float wispsIn = smoothstep(0, 1, clamp(uProgress/WISPS_IN_TIME, 0, 1)); float wispsIn = smoothstep(0, 1, clamp(progress/WISPS_IN_TIME, 0, 1));
float wispsOut = smoothstep(0, 1, clamp((uProgress - WISPS_IN_TIME)/(1.0 - WISPS_IN_TIME), 0, 1)); float wispsOut = smoothstep(0, 1, clamp((progress - WISPS_IN_TIME)/(1.0 - WISPS_IN_TIME), 0, 1));
float windowOut = smoothstep(0, 1, clamp(uProgress/WINDOW_OUT_TIME, 0, 1)); float windowOut = smoothstep(0, 1, clamp(progress/WINDOW_OUT_TIME, 0, 1));
// Use a noise function to dissolve the window. // Use a noise function to dissolve the window.
float noise = smoothstep(1.0, 0.0, abs(2.0 * simplex2DFractal(uv * vec2(uSizeX, uSizeY) / 250) - 1.0)); float noise = smoothstep(1.0, 0.0, abs(2.0 * simplex2DFractal(uv * vec2(uSizeX, uSizeY) / 250) - 1.0));
+18 -4
View File
@@ -15,8 +15,22 @@
const {Gtk} = imports.gi; const {Gtk} = imports.gi;
// Returns the given argument, except for "alpha", "beta", and "rc". In these cases -3,
// -2, and -1 are returned respectively.
function toNumericVersion(x) {
switch (x) {
case 'alpha':
return -3;
case 'beta':
return -2;
case 'rc':
return -1;
}
return x;
}
const Config = imports.misc.config; const Config = imports.misc.config;
const [GS_MAJOR, GS_MINOR] = Config.PACKAGE_VERSION.split('.'); const [GS_MAJOR, GS_MINOR] = Config.PACKAGE_VERSION.split('.').map(toNumericVersion);
const ExtensionUtils = imports.misc.extensionUtils; const ExtensionUtils = imports.misc.extensionUtils;
const Me = imports.misc.extensionUtils.getCurrentExtension(); const Me = imports.misc.extensionUtils.getCurrentExtension();
@@ -60,18 +74,18 @@ function isInShellProcess() {
// This method returns true if the current GNOME Shell version matches the given // This method returns true if the current GNOME Shell version matches the given
// arguments. // arguments.
function shellVersionIs(major, minor) { function shellVersionIs(major, minor) {
return GS_MAJOR == major && GS_MINOR == minor; return GS_MAJOR == major && GS_MINOR == toNumericVersion(minor);
} }
// This method returns true if the current GNOME Shell version is at least as high as the // This method returns true if the current GNOME Shell version is at least as high as the
// given arguments. // given arguments. Supports "alpha" and "beta" for the minor version number.
function shellVersionIsAtLeast(major, minor) { function shellVersionIsAtLeast(major, minor) {
if (GS_MAJOR > major) { if (GS_MAJOR > major) {
return true; return true;
} }
if (GS_MAJOR == major) { if (GS_MAJOR == major) {
return GS_MINOR >= minor; return GS_MINOR >= toNumericVersion(minor);
} }
return false; return false;
+183
View File
@@ -0,0 +1,183 @@
#!/bin/bash
# -------------------------------------------------------------------------------------- #
# ) ( #
# ( /( ( ( ) ( ( ( ( )\ ) ( ( #
# )\()) ))\ )( ( ( )\ ) )\))( )\ ( (()/( ( )\))( ( #
# ((_)\ /((_|()\ )\ ) )\ '(()/( ((_)()((_) )\ ) ((_)))\((_)()\ )\ #
# | |(_|_))( ((_)_(_/( _((_)) )(_)) _(()((_|_)_(_/( _| |((_)(()((_|(_) #
# | '_ \ || | '_| ' \)) | ' \()| || | \ V V / | ' \)) _` / _ \ V V (_-< #
# |_.__/\_,_|_| |_||_| |_|_|_| \_, | \_/\_/|_|_||_|\__,_\___/\_/\_//__/ #
# |__/ #
# Copyright (c) 2021 Simon Schneegans #
# Released under the GPLv3 or later. See LICENSE file for details. #
# -------------------------------------------------------------------------------------- #
# This script is used to generate the reference images required for the run-tests.sh
# script. To do this, it installs the extension in a fedora-based container running GNOME
# Shell on xvfb. It requires the burn-my-windows@schneegans.github.com.zip file which is
# expected to be present in the repository root. Therefore you have to call "make" before
# this script.
#
# The scripts supports two arguments:
#
# -v fedora_version: This determines the version of GNOME Shell to test agains.
# -v 32: GNOME Shell 3.36
# -v 33: GNOME Shell 3.38
# -v 34: GNOME Shell 40
# -v 35: GNOME Shell 41
# -s session: This can either be "gnome-xsession" or "gnome-wayland-nested".
# Exit on error.
set -e
usage() {
echo "Usage: $0 -v fedora_version -s session" >&2
}
FEDORA_VERSION=33
SESSION="gnome-xsession"
while getopts "v:s:h" opt; do
case $opt in
v) FEDORA_VERSION="${OPTARG}";;
s) SESSION="${OPTARG}";;
h) usage; exit 0;;
*) usage; exit 1;;
esac
done
# Go to the repo root.
cd "$( cd "$( dirname "$0" )" && pwd )/.." || \
{ echo "ERROR: Could not find the repo root."; exit 1; }
IMAGE="ghcr.io/schneegans/gnome-shell-pod-${FEDORA_VERSION}"
EXTENSION="burn-my-windows@schneegans.github.com"
# All references images of the effects are captured at & cropped to this region
# in the center of the screen. This is kind of arbitrary, but has been choosen so that
# something is visible from each effect.
CROP="100x100+910+480"
# Run the container. For more info, visit https://github.com/Schneegans/gnome-shell-pod.
POD=$(podman run --rm --cap-add=SYS_NICE --cap-add=IPC_LOCK -td "${IMAGE}")
# Properly shutdown podman when this script is exited.
quit() {
podman kill "${POD}"
wait
}
trap quit INT TERM EXIT
# -------------------------------------------------------------------------------- methods
# This function is used below to execute any shell command inside the running container.
do_in_pod() {
podman exec --user gnomeshell --workdir /home/gnomeshell "${POD}" set-env.sh "$@"
}
# This simulates the given keystroke in the container. Simply calling "xdotool key $1"
# sometimes fails to be recognized. Maybe the default 12ms between key-down and key-up
# are too short for xvfb...
send_keystroke() {
do_in_pod xdotool keydown "${1}"
sleep 0.5
do_in_pod xdotool keyup "${1}"
}
# This can be used to set a gsettings key of the extension.
set_setting() {
do_in_pod gsettings --schemadir /home/gnomeshell/.local/share/gnome-shell/extensions/burn-my-windows@schneegans.github.com/schemas \
set org.gnome.shell.extensions.burn-my-windows "${1}" "${2}"
}
# This makes a screen capture (cropped to $CROP) inside the container and stores it
# on the host relative to this script with the given file name.
capture() {
do_in_pod import -window root -crop $CROP out.png
podman cp "${POD}":/home/gnomeshell/out.png "${1}"
}
# This opens the extensions preferences dialog and captures two images: One during the
# window-open animation, and one during the window-close animation. The sleeps are a bit
# excessive, but it's difficult to get consistent results with shorter sleeps. The
# animations are shown for five seconds, so we also have to make sure that one animation
# is finished before starting the next one.
capture_effect() {
echo "Capturing ${1} effect."
set_setting "open-preview-effect" "${1}"
set_setting "close-preview-effect" "${1}"
sleep 2
do_in_pod gnome-extensions prefs "${EXTENSION}"
sleep 2
capture "tests/references/${1}-open-${SESSION}-${FEDORA_VERSION}.png"
send_keystroke "Alt+F4"
sleep 2
capture "tests/references/${1}-close-${SESSION}-${FEDORA_VERSION}.png"
sleep 2
}
# ----------------------------------------------------- wait for the container to start up
echo "Waiting for D-Bus."
do_in_pod wait-user-bus.sh > /dev/null 2>&1
# ----------------------------------------------------- install the to-be-tested extension
echo "Installing extension."
podman cp "tests/references" "${POD}:/home/gnomeshell/references"
podman cp "${EXTENSION}.zip" "${POD}:/home/gnomeshell"
do_in_pod gnome-extensions install "${EXTENSION}.zip"
# ---------------------------------------------------------------------- start GNOME Shell
# Starting with GNOME 40, there is a "Welcome Tour" dialog popping up at first launch.
# We disable this beforehand.
if [[ "${FEDORA_VERSION}" -gt 33 ]]; then
echo "Disabling welcome tour."
do_in_pod gsettings set org.gnome.shell welcome-dialog-last-shown-version "999" || true
fi
echo "Starting $(do_in_pod gnome-shell --version)."
do_in_pod systemctl --user start "${SESSION}@:99"
sleep 10
# Enable the extension.
do_in_pod gnome-extensions enable "${EXTENSION}"
# Starting with GNOME 40, the overview is the default mode. We close this here by hitting
# the super key.
if [[ "${FEDORA_VERSION}" -gt 33 ]]; then
echo "Closing Overview."
send_keystroke "super"
fi
# Wait until the extension is enabled and the overview closed.
sleep 3
# --------------------------------------------------------------------- capture the images
# The test mode ensures that the animations are "frozen" and do not change in time.
echo "Entering test mode."
set_setting "test-mode" true
do_in_pod gsettings set org.gnome.mutter center-new-windows true
capture_effect "energize-a"
capture_effect "energize-b"
capture_effect "fire"
capture_effect "tv"
capture_effect "wisps"
if [[ "${FEDORA_VERSION}" -gt 33 ]]; then
capture_effect "trex"
capture_effect "broken-glass"
capture_effect "matrix"
fi
echo "All reference images generated successfully."
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

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