Submitted by: Zeckma
Date: 2026-08-01
Initial Package Version: 0.10.0
Origin: Diff from 0.10.0 tarball to HEAD of
https://github.com/WayfireWM/wayfire-plugins-extra
Upstream Status: Upstream
Description: Brings 0.10.0 to HEAD as there were multiple changes
to the plugin API over time. All of these changes
should land in 0.11.0 anyhow.
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/meson.build wayfire-plugins-extra/locale/meson.build
--- wayfire-plugins-extra-0.10.0/locale/meson.build 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/meson.build 2026-08-01 16:00:35.432705142 -0600
@@ -0,0 +1,19 @@
+share_dir = join_paths(get_option('prefix'), 'share')
+wayfire_locale_dir = join_paths(share_dir, 'locale')
+
+fs = import('fs')
+
+po_files_raw = run_command('find', '.', '-name', '*.po', check : true).stdout().strip().split('\n')
+po_files = files(po_files_raw)
+
+foreach po_file : po_files
+ language = fs.name(fs.parent(fs.parent(po_file)))
+ install_path = join_paths(wayfire_locale_dir, language, 'LC_MESSAGES')
+ mo_dir = join_paths(meson.project_build_root(), 'locale', language, 'LC_MESSAGES')
+ mo_file = fs.stem(po_file) + '.mo'
+ mo_path = join_paths(mo_dir, mo_file)
+ run_command('mkdir', '-p', mo_dir, check : true)
+ run_command('msgfmt', po_file, '-o', mo_path, check : true)
+ install_data(mo_path, install_dir : install_path)
+endforeach
+
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-annotate.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-annotate.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-annotate.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-annotate.po 2026-08-01 16:00:35.432842092 -0600
@@ -0,0 +1,102 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-09-30 08:00+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/annotate.xml:4
+msgid "Annotate"
+msgstr "Adnotare"
+
+#. (itstool) path: plugin/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/annotate.xml:5
+msgid "Draw on the output."
+msgstr "Desenează pe ecran."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/annotate.xml:8
+msgid "Draw"
+msgstr "Desenare"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/annotate.xml:9
+msgid "Begin drawing on workspace."
+msgstr "Începe desenarea pe birou."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/annotate.xml:13
+msgid "Clear Workspace"
+msgstr "Ștergere birou"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/annotate.xml:14
+msgid "Clear workspace."
+msgstr "Șterge biroul."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/annotate.xml:18
+msgid "Stroke Color"
+msgstr "Culoarea conturului"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/annotate.xml:19
+msgid "Color used for drawing."
+msgstr "Culoarea folosită pentru desen."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/annotate.xml:23
+msgid "Drawing Method"
+msgstr "Metoda desenului"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/annotate.xml:24
+msgid "Method used for drawing."
+msgstr "Metoda folosită pentru desen."
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/annotate.xml:28
+msgid "Free Draw"
+msgstr "Desen liber"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/annotate.xml:32
+msgid "Line"
+msgstr "Linie"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/annotate.xml:36
+msgid "Rectangle"
+msgstr "Dreptunghi"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/annotate.xml:40
+msgid "Circle"
+msgstr "Cerc"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/annotate.xml:44
+msgid "Line Width"
+msgstr "Grosimea liniei"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/annotate.xml:45
+msgid "Line width used for drawing."
+msgstr "Grosimea liniei folosite pentru desen."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/annotate.xml:51
+msgid "Draw Shapes From Center"
+msgstr "Desenează formele din centru"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/annotate.xml:52
+msgid "Draw shapes from center of drag point."
+msgstr "Desenează formele centrate pe punctul tragerii."
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-autorotate-iio.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-autorotate-iio.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-autorotate-iio.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-autorotate-iio.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,42 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-09-30 08:54+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/autorotate-iio.xml:4
+msgid "Auto Rotate"
+msgstr "Rotire automată"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/autorotate-iio.xml:7
+msgid "Lock Rotation"
+msgstr "Blocare rotație"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/autorotate-iio.xml:11
+msgid "Rotate Up"
+msgstr "Rotire în sus"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/autorotate-iio.xml:15
+msgid "Rotate Left"
+msgstr "Rotire la stânga"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/autorotate-iio.xml:19
+msgid "Rotate Down"
+msgstr "Rotire în jos"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/autorotate-iio.xml:23
+msgid "Rotate Right"
+msgstr "Rotire la dreapta"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-bench.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-bench.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-bench.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-bench.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,87 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-09-30 08:56+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/bench.xml:4
+msgid "Bench"
+msgstr "Probă de performanță"
+
+#. (itstool) path: plugin/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/bench.xml:5
+msgid "Display fps on each output."
+msgstr "Afișează numărul de cadre pe secundă pe fiecare ecran."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/bench.xml:8
+msgid "Average frames"
+msgstr "Cadre pentru medie"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/bench.xml:9
+msgid "How many frames to average to get the FPS value."
+msgstr "Pe câte cadre să se facă media pentru a obține valoarea frecvenței cadrelor."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/bench.xml:14
+msgid "Position"
+msgstr "Poziție"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/bench.xml:15
+msgid "Position of rendering."
+msgstr "Poziția desenării."
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/bench.xml:19
+msgid "Top Left"
+msgstr "Stânga-sus"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/bench.xml:23
+msgid "Top Center"
+msgstr "Centru-sus"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/bench.xml:27
+msgid "Top Right"
+msgstr "Dreapta-sus"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/bench.xml:31
+msgid "Center Left"
+msgstr "Stânga-centru"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/bench.xml:35
+msgid "Center"
+msgstr "Centru"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/bench.xml:39
+msgid "Center Right"
+msgstr "Dreapta-centru"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/bench.xml:43
+msgid "Bottom Left"
+msgstr "Stânga-jos"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/bench.xml:47
+msgid "Bottom Center"
+msgstr "Centru-jos"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/bench.xml:51
+msgid "Bottom Right"
+msgstr "Dreapta-jos"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-crosshair.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-crosshair.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-crosshair.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-crosshair.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,42 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-09-30 08:58+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/crosshair.xml:4
+msgid "Crosshair"
+msgstr "Reticulă"
+
+#. (itstool) path: plugin/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/crosshair.xml:5
+msgid "Render fullscreen mouse crosshair"
+msgstr "Desenează reticula mausului pe tot ecranul."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/crosshair.xml:8
+msgid "Line Width"
+msgstr "Grosimea liniei"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/crosshair.xml:9
+msgid "Line width of crosshair"
+msgstr "Grosimea liniei reticulei."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/crosshair.xml:14
+msgid "Line Color"
+msgstr "Culoarea liniei"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/crosshair.xml:15
+msgid "Color used for rendering crosshair"
+msgstr "Culoarea folosită pentru a desena reticula."
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-extra-animations.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-extra-animations.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-extra-animations.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-extra-animations.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,207 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-09-30 12:09+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:4
+msgid "Extra Animations"
+msgstr "Animații suplimentare"
+
+#. (itstool) path: plugin/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:5
+msgid "Extra animations to extend animate plugin"
+msgstr "Animații care suplimentează modulul de animații"
+
+#. (itstool) path: group/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:8
+msgid "Blinds Settings"
+msgstr "Opțiuni jaluzele"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:10
+msgid "Blinds duration"
+msgstr "Durata jaluzelelor"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:11
+msgid "Sets the duration for the blinds animation in milliseconds."
+msgstr "Stabilește durata pentru animația de jaluzele, în milisecunde."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:15
+msgid "Blinds strip height"
+msgstr "Înălțimea fâșiei de jaluzele"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:16
+msgid "Height of each blinds strip in pixels."
+msgstr "Înălțimea fiecărei fâșii a jaluzelelor, în pixeli."
+
+#. (itstool) path: group/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:22
+msgid "Helix Settings"
+msgstr "Opțiuni helix"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:24
+msgid "Helix duration"
+msgstr "Durata helixului"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:25
+msgid "Sets the duration for the helix animation in milliseconds."
+msgstr "Stabilește durata pentru animația helix, în milisecunde."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:29
+msgid "Helix rotations"
+msgstr "Rotații helix"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:30
+msgid "Number of rotations for the helix animation."
+msgstr "Numărul de rotații pentru animația helix."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:35
+msgid "Helix strip height"
+msgstr "Înălțimea fâșiei de helix"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:36
+msgid "Height of each helix strip in pixels."
+msgstr "Înălțimea fiecărei fâșii a helixului, în pixeli."
+
+#. (itstool) path: group/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:42
+msgid "Shatter Settings"
+msgstr "Opțiuni spargere"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:44
+msgid "Shatter duration"
+msgstr "Durata spargerii"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:45
+msgid "Sets the duration for the shatter animation in milliseconds."
+msgstr "Stabilește durata pentru animația de spargere, în milisecunde."
+
+#. (itstool) path: group/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:50
+msgid "Vortex Settings"
+msgstr "Opțiuni vârtej"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:52
+msgid "Vortex duration"
+msgstr "Durata vârtejului"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:53
+msgid "Sets the duration for the vortex animation in milliseconds."
+msgstr "Stabilește durata animației de vârtej, în milisecunde."
+
+#. (itstool) path: group/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:58
+msgid "Melt Settings"
+msgstr "Opțiuni topire"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:60
+msgid "Melt duration"
+msgstr "Durata topirii"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:61
+msgid "Sets the duration for the melt animation in milliseconds."
+msgstr "Stabilește durata animației de topire, în milisecunde."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:65
+msgid "Melt distortion factor"
+msgstr "Factor de deformare pentru topire"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:66
+msgid "Distortion factor for melt animation."
+msgstr "Stabilește factorul de deformare folosit la animația de topire."
+
+#. (itstool) path: group/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:72
+msgid "Dodge Settings"
+msgstr "Opțiuni suprapunere"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:74
+msgid "Enable Dodge"
+msgstr "Activează suprapunerea"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:75
+msgid "Enables the Dodge focus animation."
+msgstr "Activează animația de suprapunere la focalizare."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:79
+msgid "Duration"
+msgstr "Durata"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:80
+msgid "Sets the animation duration in milliseconds."
+msgstr "Stabilește durata animației, în milisecunde."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:84
+msgid "Rotate"
+msgstr "Rotire"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:85
+msgid "Rotate windows during animation."
+msgstr "Rotește ferestrele în timpul animației."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:89
+msgid "Zoom"
+msgstr "Mărire"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:90
+msgid "Slightly increase zoom for the focusing window during animation."
+msgstr "Mărește puțin fereastra ce se focalizează în animație."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:94
+msgid "Animation Direction"
+msgstr "Direcția animației"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:95
+msgid "Sets the animation direction."
+msgstr "Stabilește direcția animației."
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:98
+msgid "Cardinal"
+msgstr "Cardinală"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:102
+msgid "Diagonal"
+msgstr "Diagonală"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/extra-animations.xml:106
+msgid "Circular"
+msgstr "Circulară"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-focus-change.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-focus-change.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-focus-change.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-focus-change.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,172 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-09-30 13:10+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:4
+msgid "Focus Change"
+msgstr "Schimbare focalizare"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:7
+msgid "focus up"
+msgstr "Focalizare în sus"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:8
+msgid "move focus to the closest window above"
+msgstr "Mută focalizarea la cea mai apropiată fereastră de deasupra."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:12
+msgid "focus down"
+msgstr "Focalizare în jos"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:13
+msgid "move focus to the closest window below"
+msgstr "Mută focalizarea la cea mai apropiată fereastră de dedesubt."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:17
+msgid "focus right"
+msgstr "Focalizare la dreapta"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:18
+msgid "move focus to the closest window to the right"
+msgstr "Mută focalizarea la cea mai apropiată fereastră de la dreapta."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:22
+msgid "focus left"
+msgstr "Focalizare la stânga"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:23
+msgid "move focus to the closest window to the left"
+msgstr "Mută focalizarea la cea mai apropiată fereastră de la stânga."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:27
+msgid "upwards grace in pixels"
+msgstr "Grație în sus în pixeli"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:28
+msgid ""
+"add an amount of pixel upwards in which windows will be ignored. Can be "
+"negative"
+msgstr ""
+"Adaugă pixeli în sus în care ferestrele vor fi ignorate. Poate fi negativ."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:32
+msgid "downwards grace in pixels"
+msgstr "Grație în jos în pixeli"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:33
+msgid ""
+"add an amount of pixel downwards in which windows will be ignored. Can be "
+"negative"
+msgstr ""
+"Adaugă pixeli în jos în care ferestrele vor fi ignorate. Poate fi negativ."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:37
+msgid "rightwards grace in pixels"
+msgstr "Grație în dreapta în pixeli"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:38
+msgid ""
+"add an amount of pixel to the right in which windows will be ignored. Can be "
+"negative"
+msgstr ""
+"Adaugă pixeli în dreapta în care ferestrele vor fi ignorate. Poate fi "
+"negativ."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:42
+msgid "leftwards grace in pixels"
+msgstr "Grație în stânga în pixeli"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:43
+msgid ""
+"add an amount of pixel to the left in which windows will be ignored. Can be "
+"negative"
+msgstr ""
+"Adaugă pixeli în stânga în care ferestrele vor fi ignorate. Poate fi negativ."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:47
+msgid "ignores output boundraries"
+msgstr "Ignoră granițele ecranelor"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:48
+msgid "enables moving focus between different outputs"
+msgstr "Permite mutarea focalizării între ecrane diferite."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:52
+msgid "ignores workspace boundraries"
+msgstr "Ignoră granițele birourilor"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:53
+msgid "enables moving focus between workspaces on the same output"
+msgstr "Permite mutarea focalizării între birouri de pe același ecran."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:57
+msgid "raise window on change"
+msgstr "Ridică fereastra la schimbare"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:58
+msgid "raise the newly focused window to the top"
+msgstr "Mută fereastra nou focalizată deasupra."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:62
+msgid "scan height"
+msgstr "Înălțime scanare"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:63
+msgid ""
+"the height of the bounding box used to scan for windows to the left or "
+"right. If zero it will be the height of the view. If negative it will be the "
+"height of the view subtracted by the value"
+msgstr ""
+"Înălțimea casetei care scanează ferestre în stânga sau în dreapta. Dacă este "
+"0, va fi înălțimea ferestrei. Dacă este negativă, va fi înălțimea ferestrei "
+"minus valoarea dată."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:67
+msgid "scan width"
+msgstr "Lățime scanare"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-change.xml:68
+msgid ""
+"the width of the bounding box used to scan for window above or below. If "
+"zero it will be the width of the view. If negative it will be the width of "
+"the view subtracted by the value"
+msgstr ""
+"Lățimea casetei care scanează ferestre în sus sau în jos. Dacă este 0, va fi "
+"lățimea ferestrei. Dacă este negativă, va fi lățimea ferestrei minus "
+"valoarea dată."
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-focus-steal-prevent.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-focus-steal-prevent.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-focus-steal-prevent.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-focus-steal-prevent.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,61 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-09-30 21:43+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-steal-prevent.xml:4
+msgid "Focus Stealing Prevention"
+msgstr "Prevenirea furtului de focalizare"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-steal-prevent.xml:7
+msgid "The timeout (in ms) to prevent focus stealing"
+msgstr "Timpul, în milisecunde, pentru care să se prevină furtul focalizării"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-steal-prevent.xml:8
+msgid ""
+"A timer will be reset to the timeout (in ms) on every keystroke. If the "
+"timer is active when another window would normally gain focus, the focus is "
+"reset to the window that is accepting input."
+msgstr ""
+"Un cronometru va fi reînceput până la timpul stabilit (în milisecunde) la "
+"fiecare batere a tastelor. Dacă cronometrul este activ când altă fereastră "
+"ar deveni focalizată, focalizarea este restabilită la fereastra care "
+"acceptă intrare."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-steal-prevent.xml:13
+msgid "Deny focus to views matching this criteria"
+msgstr "Refuză focalizarea ferestrelor ce satisfac criteriile"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-steal-prevent.xml:14
+msgid ""
+"If a view matches when mapped, focus is reset to the last view with focus."
+msgstr ""
+"Dacă o fereastră corespunde când i se alocă ecran, focalizarea este "
+"restabilită la ultima fereastră focalizată."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-steal-prevent.xml:18
+msgid "Cancel focus stealing prevention on these keys"
+msgstr "Anulează prevenirea furtului de focalizare la aceste taste"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/focus-steal-prevent.xml:19
+msgid ""
+"Cancel focus stealing prevention when any of these keys are pressed. The "
+"string consists of keycode names delimited by | character."
+msgstr ""
+"Anulează prevenirea furtului de focalizare când oricare dintre aceste taste "
+"este apăsată. Șirul constă din coduri de taste delimitate de caracterul |."
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-follow-focus.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-follow-focus.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-follow-focus.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-follow-focus.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,87 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-09-30 21:49+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/follow-focus.xml:4
+msgid "Follow Focus"
+msgstr "Urmărirea focalizării"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/follow-focus.xml:7
+msgid "View focus follows mouse"
+msgstr "Focalizarea ferestrelor urmărește mausul."
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/follow-focus.xml:8
+msgid ""
+"When the mouse pointer is moved, the view focus changes to the view under "
+"the pointer."
+msgstr ""
+"Când se mișcă cursorul mausului, focalizarea se acordă ferestrei de sub "
+"acesta."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/follow-focus.xml:12
+msgid "Output focus follows mouse"
+msgstr "Focalizarea ecranelor urmărește mausul."
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/follow-focus.xml:13
+msgid ""
+"When the mouse pointer is moved, the output focus changes to the output that "
+"the pointer is currently on."
+msgstr ""
+"Când se mișcă cursorul mausului, focalizarea se acordă ecranului de sub "
+"acesta."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/follow-focus.xml:17
+msgid "Delay (in ms) before focus change will be triggered"
+msgstr "Timp de așteptare (în ms) până se declanșează schimbarea focalizării"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/follow-focus.xml:18
+msgid ""
+"The delay in ms before the plugin will trigger a focus change after the "
+"movement finished."
+msgstr ""
+"Timpul de așteptare, în milisecunde, înainte ca modulul să inițieze o "
+"schimbare a focalizării după ce s-a terminat mișcarea."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/follow-focus.xml:23
+msgid "Minimum cursor movement"
+msgstr "Mișcarea minimă a cursorului"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/follow-focus.xml:24
+msgid ""
+"The distance (x+y) the cursor should be moved at least before the plugin "
+"gets activated"
+msgstr ""
+"Distanța minimă (x+y) pentru care să se miște cursorul înainte să se "
+"activeze modului."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/follow-focus.xml:29
+msgid "Raise the focused view to the top"
+msgstr "Ridică fereastra focalizată"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/follow-focus.xml:30
+msgid ""
+"If disabled the focused view will only get keyboard focus, but will not be "
+"raised to the top."
+msgstr ""
+"Dacă este dezactivată, fereastra focalizată va prelua doar focalizarea "
+"tastaturii, dar nu va fi pusă deasupra."
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-force-fullscreen.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-force-fullscreen.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-force-fullscreen.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-force-fullscreen.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,67 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-09-30 22:16+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/force-fullscreen.xml:4
+msgid "Fullscreen Window"
+msgstr "Fereastră pe ecran complet"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/force-fullscreen.xml:7
+msgid "Key Toggle Fullscreen"
+msgstr "Tastă pentru comutarea ecranului complet"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/force-fullscreen.xml:11
+msgid "Preserve Aspect Ratio"
+msgstr "Păstrează raportul de aspect"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/force-fullscreen.xml:15
+msgid "Transparent Behind Views"
+msgstr "Transparent în spatele ferestrelor"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/force-fullscreen.xml:19
+msgid "Skew view width by multiplying by this factor"
+msgstr "Întinde lățimea ferestrei înmulțind cu acest factor"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/force-fullscreen.xml:25
+msgid "Skew view height by multiplying by this factor"
+msgstr "Întinde înălțimea ferestrei înmulțind cu acest factor"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/force-fullscreen.xml:31
+msgid "Constrain Mouse Pointer"
+msgstr "Constrânge cursorul mausului"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/force-fullscreen.xml:35
+msgid "Constraint Area"
+msgstr "Zonă de constrângere"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/force-fullscreen.xml:36
+msgid "If constrain pointer is enabled, constrain to this area."
+msgstr "Dacă constrângerea cursorului este activată, constrânge la această zonă."
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/force-fullscreen.xml:40
+msgid "View"
+msgstr "Fereastră"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/force-fullscreen.xml:44
+msgid "Output"
+msgstr "Ecran"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-ghost.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-ghost.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-ghost.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-ghost.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,37 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-09-30 22:22+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/ghost.xml:4
+msgid "Ghost Windows"
+msgstr "Ferestre fantomă"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/ghost.xml:7
+msgid "Ghosted Windows"
+msgstr "Ferestre fantomă"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/ghost.xml:8
+msgid "Automatically sets the matched windows to be click-through."
+msgstr "Face automat ca clicul să treacă prin ferestrele corespunzătoare."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/ghost.xml:12
+msgid "Toggle Ghost Window"
+msgstr "Comută fereastră fantomă"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/ghost.xml:13
+msgid "Toggles the active window being click-through to whatever is below."
+msgstr "Comută dacă clicul în fereastra activă este transmis la fereastra de dedesubt."
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-hide-cursor.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-hide-cursor.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-hide-cursor.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-hide-cursor.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,46 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-09-30 22:24+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/hide-cursor.xml:4
+msgid "Hide Cursor"
+msgstr "Ascundere cursor"
+
+#. (itstool) path: plugin/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/hide-cursor.xml:5
+msgid "A plugin that allows to toggle hide mouse cursor."
+msgstr "Un modul care permite comutarea vizibilității cursorului mausului."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/hide-cursor.xml:8
+msgid "Toggle"
+msgstr "Comutare"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/hide-cursor.xml:9
+msgid "Toggles hide mouse cursor."
+msgstr "Comută vizibilitatea cursorului mausului."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/hide-cursor.xml:13
+msgid "Delay (in ms) before cursor will be hidden"
+msgstr "Timp de așteptare (în ms) până se ascunde cursorul"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/hide-cursor.xml:14
+msgid ""
+"The delay in ms before the plugin will hide the cursor. The cursor is shown "
+"again when cursor motion happens."
+msgstr ""
+"Timpul, în milisecunde, care să se aștepte înainte ca modulul să ascundă "
+"cursorul. Cursorul este afișat din nou când se mișcă."
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-join-views.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-join-views.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-join-views.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-join-views.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,17 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-09-30 22:25+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/join-views.xml:4
+msgid "Join Views"
+msgstr "Alăturare ferestre"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-keycolor.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-keycolor.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-keycolor.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-keycolor.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,32 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-09-30 22:25+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/keycolor.xml:4
+msgid "Keycolor"
+msgstr "Culoare-cheie"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/keycolor.xml:7
+msgid "Key Color"
+msgstr "Culoare-cheie"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/keycolor.xml:11
+msgid "Opacity"
+msgstr "Opacitate"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/keycolor.xml:15
+msgid "Threshold"
+msgstr "Limită"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-mag.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-mag.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-mag.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-mag.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,32 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-09-30 22:26+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/mag.xml:4
+msgid "Magnifier"
+msgstr "Lupă"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/mag.xml:7
+msgid "Toggle"
+msgstr "Inițiere"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/mag.xml:11
+msgid "Zoom Level"
+msgstr "Nivelul măririi"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/mag.xml:17
+msgid "Default View Height"
+msgstr "Înălțimea standard a ferestrei"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-obs.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-obs.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-obs.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-obs.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,22 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-09-30 22:27+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/obs.xml:4
+msgid "OBS"
+msgstr "OLS"
+
+#. (itstool) path: plugin/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/obs.xml:5
+msgid "Change the opacity, brightness and saturation of windows using ipc scripts"
+msgstr "Schimbă opacitatea, luminozitatea și saturația ferestrelor folosind scripturi IPC."
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-pin-view.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-pin-view.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-pin-view.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-pin-view.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,22 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-09-30 22:28+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/pin-view.xml:4
+msgid "Pin View"
+msgstr "Prindere fereastră"
+
+#. (itstool) path: plugin/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/pin-view.xml:5
+msgid "Set a view layer, role and workspace"
+msgstr "Stabilește un strat, rol și birou pentru o fereastră."
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-showrepaint.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-showrepaint.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-showrepaint.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-showrepaint.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,50 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-09-30 22:31+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/showrepaint.xml:4
+msgid "Show Repaint"
+msgstr "Arată redesenările"
+
+#. (itstool) path: plugin/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/showrepaint.xml:5
+msgid "Show repainted areas on the screen."
+msgstr "Arată zonele redesenate pe ecran."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/showrepaint.xml:8
+msgid "Toggle"
+msgstr "Inițiere"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/showrepaint.xml:9
+msgid "Toggles the plugin state."
+msgstr "Comută starea modulului."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/showrepaint.xml:13
+msgid "Reduce Flicker"
+msgstr "Redu pâlpâirea"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/showrepaint.xml:14
+msgid ""
+"Reduce flicker by copying the client damage region from the last frame to "
+"the current frame. This means that only the the damage region for all "
+"surfaces of the frame are painted and the rest of the output is painted with "
+"the contents of the last frame."
+msgstr ""
+"Redu pâlpâirea copiind regiunea de pătare a clientului de la cadrul anterior "
+"la cadrul actual. Aceasta înseamnă că doar regiunea de pătare pentru fiecare "
+"suprafață a cadrului este desenată și că restul ecranului este desenat cu "
+"conținutul cadrului anterior."
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-showtouch.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-showtouch.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-showtouch.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-showtouch.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,72 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-09-30 22:34+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/showtouch.xml:4
+msgid "Showtouch"
+msgstr "Arată atingeri"
+
+#. (itstool) path: plugin/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/showtouch.xml:5
+msgid "Render touchscreen fingers"
+msgstr "Desenează degetele de pe un ecran tactil."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/showtouch.xml:8
+msgid "Finger Color"
+msgstr "Culoarea degetului"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/showtouch.xml:9
+msgid "Color used for rendering finger touches"
+msgstr "Culoarea folosită pentru desenarea atingerilor cu degetul."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/showtouch.xml:13
+msgid "Center Color"
+msgstr "Culoarea centrului"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/showtouch.xml:14
+msgid "Color used for rendering computed center of fingers"
+msgstr "Culoarea folosită pentru desenarea centrului calculat al degetelor."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/showtouch.xml:18
+msgid "Touch Radius"
+msgstr "Raza atingerii"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/showtouch.xml:19
+msgid "Radius used to size the finger touch point renderings"
+msgstr "Raza folosită pentru a dimensiona desenele punctelor de atingere cu degetul."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/showtouch.xml:23
+msgid "Touch Duration"
+msgstr "Durata atingerii"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/showtouch.xml:24
+msgid "Milliseconds the visual finger indicator will stay on screen"
+msgstr "Câte milisecunde să stea indicatorul vizual al degetului pe ecran"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/showtouch.xml:28
+msgid "Toggle"
+msgstr "Comutare"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/showtouch.xml:29
+msgid "Toggles the finger indicators off and on"
+msgstr "Comută afișarea indicatorilor de degete"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-view-shot.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-view-shot.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-view-shot.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-view-shot.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,52 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-10-01 10:58+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/view-shot.xml:4
+msgid "View Shot"
+msgstr "Captură fereastră"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/view-shot.xml:7
+msgid "Capture"
+msgstr "Capturează"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/view-shot.xml:8
+msgid "Captures the cursor focus view."
+msgstr "Capturează fereastra focalizată pentru cursor."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/view-shot.xml:12
+msgid "File Name"
+msgstr "Numele fișierului"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/view-shot.xml:13
+msgid ""
+"C date format specifiers are repleaced by the time/date/etc. For example, %Y "
+"is replaced by the current year."
+msgstr ""
+"Specificatorii formatului de dată C sunt înlocuiți de dată/oră/etc. De "
+"exemplu, %Y este înlocuit cu anul actual."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/view-shot.xml:17
+msgid "Run Command"
+msgstr "Execută comanda"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/view-shot.xml:18
+msgid ""
+"Runs the command after the capturing. %f is replaced with the file name."
+msgstr "Execută comanda după capturare. %f este înlocuit cu numele fișierului."
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-water.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-water.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-water.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-water.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,32 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-09-30 22:36+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/water.xml:4
+msgid "Water"
+msgstr "Apă"
+
+#. (itstool) path: plugin/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/water.xml:5
+msgid "Water effect."
+msgstr "Efect acvatic."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/water.xml:8
+msgid "Activate"
+msgstr "Inițiere"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/water.xml:9
+msgid "Activates water effect."
+msgstr "Activează efectul acvatic."
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-window-zoom.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-window-zoom.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-window-zoom.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-window-zoom.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,86 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-09-30 23:36+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/window-zoom.xml:4
+msgid "Window Zoom"
+msgstr "Mărire fereastră"
+
+#. (itstool) path: plugin/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/window-zoom.xml:5
+msgid "A plugin to zoom windows."
+msgstr "Un modul pentru a mări ferestre."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/window-zoom.xml:8
+msgid "Modifier"
+msgstr "Modificatoare"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/window-zoom.xml:9
+msgid ""
+"When the modifier key is held down, you can scroll down and up to adjust the "
+"zoom of the window."
+msgstr ""
+"Când tasta modificatoare este ținută apăsată, puteți derula în sus și în jos "
+"pentru a regla gradul de mărire a ferestrei."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/window-zoom.xml:13
+msgid "Zoom Step"
+msgstr "Treaptă de mărire"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/window-zoom.xml:14
+msgid "Sets the zoom increment per binding action."
+msgstr "Stabilește treapta gradului de mărire pentru o acțiune de asociere."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/window-zoom.xml:19
+msgid "Preserve Aspect"
+msgstr "Păstrează raportul de aspect"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/window-zoom.xml:20
+msgid "Preserve the aspect ratio of the view."
+msgstr "Păstrează raportul de aspect al ferestrei."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/window-zoom.xml:24
+msgid "Nearest Filtering"
+msgstr "Filtru „cel mai apropiat”"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/window-zoom.xml:25
+msgid "Use GL_NEAREST instead of GL_LINEAR."
+msgstr "Folosește GL_NEAREST în locul lui GL_LINEAR."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/window-zoom.xml:29
+msgid "Increment X"
+msgstr "Incrementare X"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/window-zoom.xml:33
+msgid "Decrement X"
+msgstr "Decrementare X"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/window-zoom.xml:37
+msgid "Increment Y"
+msgstr "Incrementare Y"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/window-zoom.xml:41
+msgid "Decrement Y"
+msgstr "Decrementare Y"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-workspace-names.po wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-workspace-names.po
--- wayfire-plugins-extra-0.10.0/locale/ro/LC_MESSAGES/wf-plugin-workspace-names.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/LC_MESSAGES/wf-plugin-workspace-names.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,181 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-29 13:01+0300\n"
+"PO-Revision-Date: 2025-10-01 10:56+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.4.2\n"
+
+#. (itstool) path: plugin/_short
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:4
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:92
+msgid "Workspace Names"
+msgstr "Nume de birou"
+
+#. (itstool) path: plugin/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:5
+msgid "Name workspaces."
+msgstr "Denumiți birourile."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:8
+msgid "Display Duration"
+msgstr "Durata de afișare"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:9
+msgid "How long the name is displayed."
+msgstr "Pentru cât timp se afișează numele."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:14
+msgid "Margin"
+msgstr "Margine"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:15
+msgid "Distance from edge of screen to indicator."
+msgstr "Distanța de la marginea ecranului la indicator."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:20
+msgid "Position"
+msgstr "Poziție"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:21
+msgid "Position of rendering."
+msgstr "Poziția desenării."
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:25
+msgid "Top Left"
+msgstr "Stânga-sus"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:29
+msgid "Top Center"
+msgstr "Centru-sus"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:33
+msgid "Top Right"
+msgstr "Dreapta-sus"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:37
+msgid "Center Left"
+msgstr "Stânga-centru"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:41
+msgid "Center"
+msgstr "Centru"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:45
+msgid "Center Right"
+msgstr "Dreapta-centru"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:49
+msgid "Bottom Left"
+msgstr "Stânga-jos"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:53
+msgid "Bottom Center"
+msgstr "Centru-jos"
+
+#. (itstool) path: desc/_name
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:57
+msgid "Bottom Right"
+msgstr "Dreapta-jos"
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:61
+msgid "Background Color"
+msgstr "Culoarea de fundal"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:62
+msgid "Background color for text."
+msgstr "Culoarea de fundal a textului."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:66
+msgid "Text Color"
+msgstr "Culoarea textului"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:67
+msgid "Text color."
+msgstr "Culoarea textului."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:71
+msgid "Text Font"
+msgstr "Fontul textului"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:72
+msgid "Font used for text rendering."
+msgstr "Fontul folosit pentru desenarea textului."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:76
+msgid "Show Option Names"
+msgstr "Arată numele opțiunilor"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:77
+msgid "Display option names on screen for convenience."
+msgstr "Afișează numele opțiunilor pe ecran pentru comoditate."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:81
+msgid "Show Option Values"
+msgstr "Arată valorile opțiunilor"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:82
+msgid ""
+"Display option values instead of names, when show_option_names is enabled."
+msgstr ""
+"Afișează valorile opțiunilor în locul numelor când show_option_names este "
+"activat."
+
+#. (itstool) path: option/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:86
+msgid "Background Corner Radius"
+msgstr "Raza colțurilor fundalului"
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:87
+msgid "Radius for the corners of the background."
+msgstr "Raza de folosit pentru colțurile fundalului."
+
+#. (itstool) path: option/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:93
+msgid ""
+"Names of the workspaces. By default, they will have the name Workspace #N, "
+"where #N is the workspace number."
+msgstr ""
+"Numele birourilor. În mod implicit, vor avea numele Workspace #N, unde #N "
+"este numărul biroului."
+
+#. (itstool) path: entry/_short
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:95
+msgid "Workspace Name"
+msgstr "Numele biroului"
+
+#. (itstool) path: entry/_long
+#: /home/vlad/wayfire-plugins-extra/metadata/workspace-names.xml:96
+msgid "Sets the name of the workspace"
+msgstr "Stabilește numele biroului."
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/ro/wf-plugin-fisheye.po wayfire-plugins-extra/locale/ro/wf-plugin-fisheye.po
--- wayfire-plugins-extra-0.10.0/locale/ro/wf-plugin-fisheye.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/ro/wf-plugin-fisheye.po 2026-08-01 16:00:35.432890271 -0600
@@ -0,0 +1,44 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: \n"
+"POT-Creation-Date: 2025-09-18 14:55+0300\n"
+"PO-Revision-Date: 2025-09-18 18:31+0300\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: ro\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 3.7\n"
+
+#. (itstool) path: plugin/_short
+msgid "Fisheye"
+msgstr "Ochi de pește"
+
+#. (itstool) path: plugin/_long
+msgid "A plugin which provides fisheye effect."
+msgstr "Un modul care furnizează un efect de obiectiv „ochi de pește”."
+
+#. (itstool) path: option/_short
+msgid "Toggle"
+msgstr "Inițiere"
+
+#. (itstool) path: option/_long
+msgid "Toggles fisheye with the specified activator."
+msgstr "Comută ochiul de pește cu activatorul specificat."
+
+#. (itstool) path: option/_short
+msgid "Radius"
+msgstr "Rază"
+
+#. (itstool) path: option/_long
+msgid "Sets the border radius in pixels."
+msgstr "Stabilește raza colțului în pixeli."
+
+#. (itstool) path: option/_short
+msgid "Zoom"
+msgstr "Mărire"
+
+#. (itstool) path: option/_long
+msgid "Sets the zoom factor."
+msgstr "Stabilește factorul de mărire."
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-annotate.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-annotate.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-annotate.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-annotate.po 2026-08-01 16:00:35.433260551 -0600
@@ -0,0 +1,83 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+msgid "Annotate"
+msgstr "标注"
+
+#. (itstool) path: plugin/_long
+msgid "Draw on the output."
+msgstr "在输出上绘制。"
+
+#. (itstool) path: option/_short
+msgid "Draw"
+msgstr "绘图"
+
+#. (itstool) path: option/_long
+msgid "Begin drawing on workspace."
+msgstr "开始在工作区上绘图。"
+
+#. (itstool) path: option/_short
+msgid "Clear Workspace"
+msgstr "清除工作区"
+
+#. (itstool) path: option/_long
+msgid "Clear workspace."
+msgstr "清除工作区。"
+
+#. (itstool) path: option/_short
+msgid "Stroke Color"
+msgstr "描边颜色"
+
+#. (itstool) path: option/_long
+msgid "Color used for drawing."
+msgstr "用于绘图的颜色。"
+
+#. (itstool) path: option/_short
+msgid "Drawing Method"
+msgstr "绘图方法"
+
+#. (itstool) path: option/_long
+msgid "Method used for drawing."
+msgstr "用于绘图的方法。"
+
+#. (itstool) path: desc/_name
+msgid "Free Draw"
+msgstr "自由绘图"
+
+#. (itstool) path: desc/_name
+msgid "Line"
+msgstr "直线"
+
+#. (itstool) path: desc/_name
+msgid "Rectangle"
+msgstr "矩形"
+
+#. (itstool) path: desc/_name
+msgid "Circle"
+msgstr "圆形"
+
+#. (itstool) path: option/_short
+msgid "Line Width"
+msgstr "线宽"
+
+#. (itstool) path: option/_long
+msgid "Line width used for drawing."
+msgstr "用于绘图的线宽。"
+
+#. (itstool) path: option/_short
+msgid "Draw Shapes From Center"
+msgstr "从中心绘制形状"
+
+#. (itstool) path: option/_long
+msgid "Draw shapes from center of drag point."
+msgstr "从拖动点的中心绘制形状。"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-autorotate-iio.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-autorotate-iio.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-autorotate-iio.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-autorotate-iio.po 2026-08-01 16:00:35.433292492 -0600
@@ -0,0 +1,35 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+msgid "Auto Rotate"
+msgstr "自动旋转"
+
+#. (itstool) path: option/_short
+msgid "Lock Rotation"
+msgstr "锁定旋转"
+
+#. (itstool) path: option/_short
+msgid "Rotate Up"
+msgstr "向上旋转"
+
+#. (itstool) path: option/_short
+msgid "Rotate Left"
+msgstr "向左旋转"
+
+#. (itstool) path: option/_short
+msgid "Rotate Down"
+msgstr "向下旋转"
+
+#. (itstool) path: option/_short
+msgid "Rotate Right"
+msgstr "向右旋转"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-bench.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-bench.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-bench.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-bench.po 2026-08-01 16:00:35.433292492 -0600
@@ -0,0 +1,71 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+msgid "Bench"
+msgstr "基准测试"
+
+#. (itstool) path: plugin/_long
+msgid "Display fps on each output."
+msgstr "在每个输出上显示帧率。"
+
+#. (itstool) path: option/_short
+msgid "Average frames"
+msgstr "平均帧数"
+
+#. (itstool) path: option/_long
+msgid "How many frames to average to get the FPS value."
+msgstr "计算平均帧率所用的帧数。"
+
+#. (itstool) path: option/_short
+msgid "Position"
+msgstr "位置"
+
+#. (itstool) path: option/_long
+msgid "Position of rendering."
+msgstr "渲染位置。"
+
+#. (itstool) path: desc/_name
+msgid "Top Left"
+msgstr "左上"
+
+#. (itstool) path: desc/_name
+msgid "Top Center"
+msgstr "中上"
+
+#. (itstool) path: desc/_name
+msgid "Top Right"
+msgstr "右上"
+
+#. (itstool) path: desc/_name
+msgid "Center Left"
+msgstr "左中"
+
+#. (itstool) path: desc/_name
+msgid "Center"
+msgstr "居中"
+
+#. (itstool) path: desc/_name
+msgid "Center Right"
+msgstr "右中"
+
+#. (itstool) path: desc/_name
+msgid "Bottom Left"
+msgstr "左下"
+
+#. (itstool) path: desc/_name
+msgid "Bottom Center"
+msgstr "中下"
+
+#. (itstool) path: desc/_name
+msgid "Bottom Right"
+msgstr "右下"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-crosshair.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-crosshair.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-crosshair.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-crosshair.po 2026-08-01 16:00:35.433292492 -0600
@@ -0,0 +1,35 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+msgid "Crosshair"
+msgstr "十字线"
+
+#. (itstool) path: plugin/_long
+msgid "Render fullscreen mouse crosshair"
+msgstr "渲染全屏鼠标十字线"
+
+#. (itstool) path: option/_short
+msgid "Line Width"
+msgstr "线宽"
+
+#. (itstool) path: option/_long
+msgid "Line width of crosshair"
+msgstr "十字线的线宽"
+
+#. (itstool) path: option/_short
+msgid "Line Color"
+msgstr "线条颜色"
+
+#. (itstool) path: option/_long
+msgid "Color used for rendering crosshair"
+msgstr "用于渲染十字线的颜色"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-extra-animations.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-extra-animations.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-extra-animations.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-extra-animations.po 2026-08-01 16:00:35.433292492 -0600
@@ -0,0 +1,167 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+msgid "Extra Animations"
+msgstr "额外动画"
+
+#. (itstool) path: plugin/_long
+msgid "Extra animations to extend animate plugin"
+msgstr "扩展 animate 插件的额外动画"
+
+#. (itstool) path: group/_short
+msgid "Blinds Settings"
+msgstr "百叶窗设置"
+
+#. (itstool) path: option/_short
+msgid "Blinds duration"
+msgstr "百叶窗持续时间"
+
+#. (itstool) path: option/_long
+msgid "Sets the duration for the blinds animation in milliseconds."
+msgstr "以毫秒为单位设置百叶窗动画的持续时间。"
+
+#. (itstool) path: option/_short
+msgid "Blinds strip height"
+msgstr "百叶窗条高"
+
+#. (itstool) path: option/_long
+msgid "Height of each blinds strip in pixels."
+msgstr "每个百叶窗条的像素高度。"
+
+#. (itstool) path: group/_short
+msgid "Helix Settings"
+msgstr "螺旋设置"
+
+#. (itstool) path: option/_short
+msgid "Helix duration"
+msgstr "螺旋持续时间"
+
+#. (itstool) path: option/_long
+msgid "Sets the duration for the helix animation in milliseconds."
+msgstr "以毫秒为单位设置螺旋动画的持续时间。"
+
+#. (itstool) path: option/_short
+msgid "Helix rotations"
+msgstr "螺旋旋转次数"
+
+#. (itstool) path: option/_long
+msgid "Number of rotations for the helix animation."
+msgstr "螺旋动画的旋转次数。"
+
+#. (itstool) path: option/_short
+msgid "Helix strip height"
+msgstr "螺旋条高"
+
+#. (itstool) path: option/_long
+msgid "Height of each helix strip in pixels."
+msgstr "每个螺旋条的像素高度。"
+
+#. (itstool) path: group/_short
+msgid "Shatter Settings"
+msgstr "破碎设置"
+
+#. (itstool) path: option/_short
+msgid "Shatter duration"
+msgstr "破碎持续时间"
+
+#. (itstool) path: option/_long
+msgid "Sets the duration for the shatter animation in milliseconds."
+msgstr "以毫秒为单位设置破碎动画的持续时间。"
+
+#. (itstool) path: group/_short
+msgid "Vortex Settings"
+msgstr "旋涡设置"
+
+#. (itstool) path: option/_short
+msgid "Vortex duration"
+msgstr "旋涡持续时间"
+
+#. (itstool) path: option/_long
+msgid "Sets the duration for the vortex animation in milliseconds."
+msgstr "以毫秒为单位设置旋涡动画的持续时间。"
+
+#. (itstool) path: group/_short
+msgid "Melt Settings"
+msgstr "融化设置"
+
+#. (itstool) path: option/_short
+msgid "Melt duration"
+msgstr "融化持续时间"
+
+#. (itstool) path: option/_long
+msgid "Sets the duration for the melt animation in milliseconds."
+msgstr "以毫秒为单位设置融化动画的持续时间。"
+
+#. (itstool) path: option/_short
+msgid "Melt distortion factor"
+msgstr "融化变形系数"
+
+#. (itstool) path: option/_long
+msgid "Distortion factor for melt animation."
+msgstr "融化动画的变形系数。"
+
+#. (itstool) path: group/_short
+msgid "Dodge Settings"
+msgstr "闪避设置"
+
+#. (itstool) path: option/_short
+msgid "Enable Dodge"
+msgstr "启用闪避"
+
+#. (itstool) path: option/_long
+msgid "Enables the Dodge focus animation."
+msgstr "启用闪避焦点动画。"
+
+#. (itstool) path: option/_short
+msgid "Duration"
+msgstr "持续时间"
+
+#. (itstool) path: option/_long
+msgid "Sets the animation duration in milliseconds."
+msgstr "以毫秒为单位设置动画持续时间。"
+
+#. (itstool) path: option/_short
+msgid "Rotate"
+msgstr "旋转"
+
+#. (itstool) path: option/_long
+msgid "Rotate windows during animation."
+msgstr "动画期间旋转窗口。"
+
+#. (itstool) path: option/_short
+msgid "Zoom"
+msgstr "缩放"
+
+#. (itstool) path: option/_long
+msgid "Slightly increase zoom for the focusing window during animation."
+msgstr "在动画期间,将焦点窗口略微放大。"
+
+#. (itstool) path: option/_short
+msgid "Animation Direction"
+msgstr "动画方向"
+
+#. (itstool) path: option/_long
+msgid "Sets the animation direction."
+msgstr "设置动画方向。"
+
+#. (itstool) path: desc/_name
+msgid "Cardinal"
+msgstr "基数"
+
+#. (itstool) path: desc/_name
+msgid "Diagonal"
+msgstr "对角"
+
+#. (itstool) path: desc/_name
+msgid "Circular"
+msgstr "圆形"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-focus-change.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-focus-change.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-focus-change.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-focus-change.po 2026-08-01 16:00:35.433292492 -0600
@@ -0,0 +1,137 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+msgid "Focus Change"
+msgstr "焦点切换"
+
+#. (itstool) path: option/_short
+msgid "focus up"
+msgstr "上移焦点"
+
+#. (itstool) path: option/_long
+msgid "move focus to the closest window above"
+msgstr "将焦点移动到最靠近上方的窗口"
+
+#. (itstool) path: option/_short
+msgid "focus down"
+msgstr "下移焦点"
+
+#. (itstool) path: option/_long
+msgid "move focus to the closest window below"
+msgstr "将焦点移动到最靠近下方的窗口"
+
+#. (itstool) path: option/_short
+msgid "focus right"
+msgstr "右移焦点"
+
+#. (itstool) path: option/_long
+msgid "move focus to the closest window to the right"
+msgstr "将焦点移动到最靠近右侧的窗口"
+
+#. (itstool) path: option/_short
+msgid "focus left"
+msgstr "左移焦点"
+
+#. (itstool) path: option/_long
+msgid "move focus to the closest window to the left"
+msgstr "将焦点移动到最靠近左侧的窗口"
+
+#. (itstool) path: option/_short
+msgid "upwards grace in pixels"
+msgstr "向上容忍像素"
+
+#. (itstool) path: option/_long
+msgid ""
+"add an amount of pixel upwards in which windows will be ignored. Can be "
+"negative"
+msgstr "向上增加一定数量的像素,在此范围内将忽略窗口。可以是负值"
+
+#. (itstool) path: option/_short
+msgid "downwards grace in pixels"
+msgstr "向下容忍像素"
+
+#. (itstool) path: option/_long
+msgid ""
+"add an amount of pixel downwards in which windows will be ignored. Can be "
+"negative"
+msgstr "向下增加一定数量的像素,在此范围内将忽略窗口。可以是负值"
+
+#. (itstool) path: option/_short
+msgid "rightwards grace in pixels"
+msgstr "向右容忍像素"
+
+#. (itstool) path: option/_long
+msgid ""
+"add an amount of pixel to the right in which windows will be ignored. Can be "
+"negative"
+msgstr "向右增加一定数量的像素,在此范围内将忽略窗口。可以是负值"
+
+#. (itstool) path: option/_short
+msgid "leftwards grace in pixels"
+msgstr "向左容忍像素"
+
+#. (itstool) path: option/_long
+msgid ""
+"add an amount of pixel to the left in which windows will be ignored. Can be "
+"negative"
+msgstr "向左增加一定数量的像素,在此范围内将忽略窗口。可以是负值"
+
+#. (itstool) path: option/_short
+msgid "ignores output boundraries"
+msgstr "忽略输出边界"
+
+#. (itstool) path: option/_long
+msgid "enables moving focus between different outputs"
+msgstr "允许在不同输出之间移动焦点"
+
+#. (itstool) path: option/_short
+msgid "ignores workspace boundraries"
+msgstr "忽略工作区边界"
+
+#. (itstool) path: option/_long
+msgid "enables moving focus between workspaces on the same output"
+msgstr "允许在同一输出上的工作区之间移动焦点"
+
+#. (itstool) path: option/_short
+msgid "raise window on change"
+msgstr "切换时提升窗口"
+
+#. (itstool) path: option/_long
+msgid "raise the newly focused window to the top"
+msgstr "将新获得焦点的窗口提升到最顶层"
+
+#. (itstool) path: option/_short
+msgid "scan height"
+msgstr "扫描高度"
+
+#. (itstool) path: option/_long
+msgid ""
+"the height of the bounding box used to scan for windows to the left or "
+"right. If zero it will be the height of the view. If negative it will be the "
+"height of the view subtracted by the value"
+msgstr ""
+"用于扫描左侧或右侧窗口的边界框高度。如果为零,则为视图的高度。如果为负数,则"
+"为视图高度减去该值"
+
+#. (itstool) path: option/_short
+msgid "scan width"
+msgstr "扫描宽度"
+
+#. (itstool) path: option/_long
+msgid ""
+"the width of the bounding box used to scan for window above or below. If "
+"zero it will be the width of the view. If negative it will be the width of "
+"the view subtracted by the value"
+msgstr ""
+"用于扫描上方或下方窗口的边界框宽度。如果为零,则为视图的宽度。如果为负数,则"
+"为视图宽度减去该值"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-focus-steal-prevent.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-focus-steal-prevent.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-focus-steal-prevent.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-focus-steal-prevent.po 2026-08-01 16:00:35.433292492 -0600
@@ -0,0 +1,49 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+msgid "Focus Stealing Prevention"
+msgstr "焦点防盗"
+
+#. (itstool) path: option/_short
+msgid "The timeout (in ms) to prevent focus stealing"
+msgstr "防止焦点被盗的超时(毫秒)"
+
+#. (itstool) path: option/_long
+msgid ""
+"A timer will be reset to the timeout (in ms) on every keystroke. If the "
+"timer is active when another window would normally gain focus, the focus is "
+"reset to the window that is accepting input."
+msgstr ""
+"每次按键时,计时器将重置为设定的超时(毫秒)。如果在另一个窗口通常会获得焦点"
+"时计时器处于活动状态,则焦点将重置为正在接受输入的窗口。"
+
+#. (itstool) path: option/_short
+msgid "Deny focus to views matching this criteria"
+msgstr "拒绝焦点到符合此条件的视图"
+
+#. (itstool) path: option/_long
+msgid ""
+"If a view matches when mapped, focus is reset to the last view with focus."
+msgstr "如果某个视图在映射时匹配,焦点将重置为上一个具有焦点的视图。"
+
+#. (itstool) path: option/_short
+msgid "Cancel focus stealing prevention on these keys"
+msgstr "在这些键上取消焦点防盗"
+
+#. (itstool) path: option/_long
+msgid ""
+"Cancel focus stealing prevention when any of these keys are pressed. The "
+"string consists of keycode names delimited by | character."
+msgstr ""
+"按下这些键中的任何一个时,取消焦点防盗。该字符串由用 | 字符分隔的按键码名称组"
+"成。"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-follow-focus.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-follow-focus.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-follow-focus.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-follow-focus.po 2026-08-01 16:00:35.433292492 -0600
@@ -0,0 +1,65 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+msgid "Follow Focus"
+msgstr "跟随焦点"
+
+#. (itstool) path: option/_short
+msgid "View focus follows mouse"
+msgstr "视图焦点跟随鼠标"
+
+#. (itstool) path: option/_long
+msgid ""
+"When the mouse pointer is moved, the view focus changes to the view under "
+"the pointer."
+msgstr "当鼠标指针移动时,视图焦点会切换到指针下方的视图。"
+
+#. (itstool) path: option/_short
+msgid "Output focus follows mouse"
+msgstr "输出焦点跟随鼠标"
+
+#. (itstool) path: option/_long
+msgid ""
+"When the mouse pointer is moved, the output focus changes to the output that "
+"the pointer is currently on."
+msgstr "当鼠标指针移动时,输出焦点会切换到指针当前所在的输出。"
+
+#. (itstool) path: option/_short
+msgid "Delay (in ms) before focus change will be triggered"
+msgstr "焦点改变前的延迟(毫秒)"
+
+#. (itstool) path: option/_long
+msgid ""
+"The delay in ms before the plugin will trigger a focus change after the "
+"movement finished."
+msgstr "在移动结束后,插件触发焦点改变前的延迟(毫秒)。"
+
+#. (itstool) path: option/_short
+msgid "Minimum cursor movement"
+msgstr "最小光标移动"
+
+#. (itstool) path: option/_long
+msgid ""
+"The distance (x+y) the cursor should be moved at least before the plugin "
+"gets activated"
+msgstr "光标需要移动的最小距离 (x+y),在此之后插件才会激活。"
+
+#. (itstool) path: option/_short
+msgid "Raise the focused view to the top"
+msgstr "将焦点视图提升到顶部"
+
+#. (itstool) path: option/_long
+msgid ""
+"If disabled the focused view will only get keyboard focus, but will not be "
+"raised to the top."
+msgstr "如果禁用,焦点视图将只获得键盘焦点,但不会被提升到顶部。"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-force-fullscreen.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-force-fullscreen.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-force-fullscreen.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-force-fullscreen.po 2026-08-01 16:00:35.433292492 -0600
@@ -0,0 +1,51 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+msgid "Fullscreen Window"
+msgstr "全屏窗口"
+
+#. (itstool) path: option/_short
+msgid "Key Toggle Fullscreen"
+msgstr "按键切换全屏"
+
+#. (itstool) path: option/_short
+msgid "Preserve Aspect Ratio"
+msgstr "保持长宽比"
+
+#. (itstool) path: option/_short
+msgid "Transparent Behind Views"
+msgstr "视图后方透明"
+
+#. (itstool) path: option/_short
+msgid "Skew view width by multiplying by this factor"
+msgstr "通过乘以该因子来扭曲视图宽度"
+
+#. (itstool) path: option/_short
+msgid "Skew view height by multiplying by this factor"
+msgstr "通过乘以该因子来扭曲视图高度"
+
+#. (itstool) path: option/_short
+msgid "Constrain Mouse Pointer"
+msgstr "限制鼠标指针"
+
+#. (itstool) path: option/_long
+msgid "If constrain pointer is enabled, constrain to this area."
+msgstr "如果启用了限制指针,则限制在此区域。"
+
+#. (itstool) path: desc/_name
+msgid "View"
+msgstr "视图"
+
+#. (itstool) path: desc/_name
+msgid "Output"
+msgstr "输出"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-ghost.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-ghost.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-ghost.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-ghost.po 2026-08-01 16:00:35.433292492 -0600
@@ -0,0 +1,31 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+msgid "Ghost Windows"
+msgstr "幽灵窗口"
+
+#. (itstool) path: option/_short
+msgid "Ghosted Windows"
+msgstr "幽灵化窗口"
+
+#. (itstool) path: option/_long
+msgid "Automatically sets the matched windows to be click-through."
+msgstr "自动将匹配的窗口设置为可穿透点击。"
+
+#. (itstool) path: option/_short
+msgid "Toggle Ghost Window"
+msgstr "切换幽灵窗口"
+
+#. (itstool) path: option/_long
+msgid "Toggles the active window being click-through to whatever is below."
+msgstr "将活动窗口切换为可穿透点击,点击会作用于下方的内容。"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-hide-cursor.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-hide-cursor.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-hide-cursor.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-hide-cursor.po 2026-08-01 16:00:35.433292492 -0600
@@ -0,0 +1,37 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+msgid "Hide Cursor"
+msgstr "隐藏光标"
+
+#. (itstool) path: plugin/_long
+msgid "A plugin that allows to toggle hide mouse cursor."
+msgstr "一个允许切换隐藏鼠标光标的插件。"
+
+#. (itstool) path: option/_short
+msgid "Toggle"
+msgstr "切换"
+
+#. (itstool) path: option/_long
+msgid "Toggles hide mouse cursor."
+msgstr "切换隐藏鼠标光标。"
+
+#. (itstool) path: option/_short
+msgid "Delay (in ms) before cursor will be hidden"
+msgstr "光标隐藏前的延迟(毫秒)"
+
+#. (itstool) path: option/_long
+msgid ""
+"The delay in ms before the plugin will hide the cursor. The cursor is shown "
+"again when cursor motion happens."
+msgstr "插件隐藏光标前的延迟(毫秒)。当光标移动时,光标会再次显示。"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-join-views.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-join-views.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-join-views.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-join-views.po 2026-08-01 16:00:35.433292492 -0600
@@ -0,0 +1,15 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+msgid "Join Views"
+msgstr "合并视图"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-keycolor.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-keycolor.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-keycolor.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-keycolor.po 2026-08-01 16:00:35.433292492 -0600
@@ -0,0 +1,27 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+msgid "Keycolor"
+msgstr "键色"
+
+#. (itstool) path: option/_short
+msgid "Key Color"
+msgstr "键色"
+
+#. (itstool) path: option/_short
+msgid "Opacity"
+msgstr "不透明度"
+
+#. (itstool) path: option/_short
+msgid "Threshold"
+msgstr "阈值"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-mag.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-mag.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-mag.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-mag.po 2026-08-01 16:00:35.433292492 -0600
@@ -0,0 +1,27 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+msgid "Magnifier"
+msgstr "放大镜"
+
+#. (itstool) path: option/_short
+msgid "Toggle"
+msgstr "切换"
+
+#. (itstool) path: option/_short
+msgid "Zoom Level"
+msgstr "缩放级别"
+
+#. (itstool) path: option/_short
+msgid "Default View Height"
+msgstr "默认视图高度"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-obs.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-obs.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-obs.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-obs.po 2026-08-01 16:00:35.433292492 -0600
@@ -0,0 +1,20 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+msgid "OBS"
+msgstr "不透明度、亮度与饱和度"
+
+#. (itstool) path: plugin/_long
+msgid ""
+"Change the opacity, brightness and saturation of windows using ipc scripts"
+msgstr "使用 ipc 脚本更改窗口的不透明度、亮度和饱和度"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-pin-view.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-pin-view.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-pin-view.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-pin-view.po 2026-08-01 16:00:35.433292492 -0600
@@ -0,0 +1,19 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+msgid "Pin View"
+msgstr "固定视图"
+
+#. (itstool) path: plugin/_long
+msgid "Set a view layer, role and workspace"
+msgstr "设置视图图层、角色和工作区"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-showrepaint.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-showrepaint.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-showrepaint.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-showrepaint.po 2026-08-01 16:00:35.433292492 -0600
@@ -0,0 +1,41 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+msgid "Show Repaint"
+msgstr "显示重绘"
+
+#. (itstool) path: plugin/_long
+msgid "Show repainted areas on the screen."
+msgstr "在屏幕上显示重绘区域。"
+
+#. (itstool) path: option/_short
+msgid "Toggle"
+msgstr "切换"
+
+#. (itstool) path: option/_long
+msgid "Toggles the plugin state."
+msgstr "切换插件状态。"
+
+#. (itstool) path: option/_short
+msgid "Reduce Flicker"
+msgstr "减少闪烁"
+
+#. (itstool) path: option/_long
+msgid ""
+"Reduce flicker by copying the client damage region from the last frame to "
+"the current frame. This means that only the the damage region for all "
+"surfaces of the frame are painted and the rest of the output is painted with "
+"the contents of the last frame."
+msgstr ""
+"通过将客户端损坏区域从上一帧复制到当前帧来减少闪烁。这意味着只绘制帧中所有表"
+"面的损坏区域,其余输出则用上一帧的内容绘制。"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-showtouch.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-showtouch.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-showtouch.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-showtouch.po 2026-08-01 16:00:35.433292492 -0600
@@ -0,0 +1,59 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+msgid "Showtouch"
+msgstr "显示触控"
+
+#. (itstool) path: plugin/_long
+msgid "Render touchscreen fingers"
+msgstr "渲染触控笔划"
+
+#. (itstool) path: option/_short
+msgid "Finger Color"
+msgstr "手指颜色"
+
+#. (itstool) path: option/_long
+msgid "Color used for rendering finger touches"
+msgstr "用于渲染手指触控的颜色"
+
+#. (itstool) path: option/_short
+msgid "Center Color"
+msgstr "中心颜色"
+
+#. (itstool) path: option/_long
+msgid "Color used for rendering computed center of fingers"
+msgstr "用于渲染计算出的手指中心的颜色"
+
+#. (itstool) path: option/_short
+msgid "Touch Radius"
+msgstr "触控半径"
+
+#. (itstool) path: option/_long
+msgid "Radius used to size the finger touch point renderings"
+msgstr "用于调整手指触控点渲染大小的半径"
+
+#. (itstool) path: option/_short
+msgid "Touch Duration"
+msgstr "触控持续时间"
+
+#. (itstool) path: option/_long
+msgid "Milliseconds the visual finger indicator will stay on screen"
+msgstr "可视手指指示器在屏幕上停留的毫秒数"
+
+#. (itstool) path: option/_short
+msgid "Toggle"
+msgstr "切换"
+
+#. (itstool) path: option/_long
+msgid "Toggles the finger indicators off and on"
+msgstr "切换手指指示器的开启和关闭"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-view-shot.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-view-shot.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-view-shot.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-view-shot.po 2026-08-01 16:00:35.433292492 -0600
@@ -0,0 +1,42 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+msgid "View Shot"
+msgstr "视图截图"
+
+#. (itstool) path: option/_short
+msgid "Capture"
+msgstr "捕捉"
+
+#. (itstool) path: option/_long
+msgid "Captures the cursor focus view."
+msgstr "捕捉光标焦点视图。"
+
+#. (itstool) path: option/_short
+msgid "File Name"
+msgstr "文件名"
+
+#. (itstool) path: option/_long
+msgid ""
+"C date format specifiers are repleaced by the time/date/etc. For example, %Y "
+"is replaced by the current year."
+msgstr "C 日期格式说明符将被替换为时间/日期等。例如,%Y 会被替换为当前年份。"
+
+#. (itstool) path: option/_short
+msgid "Run Command"
+msgstr "运行命令"
+
+#. (itstool) path: option/_long
+msgid ""
+"Runs the command after the capturing. %f is replaced with the file name."
+msgstr "捕捉后运行命令。%f 会被替换为文件名。"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-water.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-water.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-water.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-water.po 2026-08-01 16:00:35.433292492 -0600
@@ -0,0 +1,27 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+msgid "Water"
+msgstr "水"
+
+#. (itstool) path: plugin/_long
+msgid "Water effect."
+msgstr "水面效果。"
+
+#. (itstool) path: option/_short
+msgid "Activate"
+msgstr "激活"
+
+#. (itstool) path: option/_long
+msgid "Activates water effect."
+msgstr "激活水面效果。"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-window-zoom.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-window-zoom.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-window-zoom.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-window-zoom.po 2026-08-01 16:00:35.433292492 -0600
@@ -0,0 +1,69 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+msgid "Window Zoom"
+msgstr "窗口缩放"
+
+#. (itstool) path: plugin/_long
+msgid "A plugin to zoom windows."
+msgstr "一个用于缩放窗口的插件。"
+
+#. (itstool) path: option/_short
+msgid "Modifier"
+msgstr "修饰键"
+
+#. (itstool) path: option/_long
+msgid ""
+"When the modifier key is held down, you can scroll down and up to adjust the "
+"zoom of the window."
+msgstr "按住修饰键时,您可以通过上下滚动来调整窗口的缩放。"
+
+#. (itstool) path: option/_short
+msgid "Zoom Step"
+msgstr "缩放步长"
+
+#. (itstool) path: option/_long
+msgid "Sets the zoom increment per binding action."
+msgstr "设置每个绑定操作的缩放增量。"
+
+#. (itstool) path: option/_short
+msgid "Preserve Aspect"
+msgstr "保持长宽比"
+
+#. (itstool) path: option/_long
+msgid "Preserve the aspect ratio of the view."
+msgstr "保持视图的长宽比。"
+
+#. (itstool) path: option/_short
+msgid "Nearest Filtering"
+msgstr "最近邻过滤"
+
+#. (itstool) path: option/_long
+msgid "Use GL_NEAREST instead of GL_LINEAR."
+msgstr "使用 GL_NEAREST 而不是 GL_LINEAR。"
+
+#. (itstool) path: option/_short
+msgid "Increment X"
+msgstr "X 增量"
+
+#. (itstool) path: option/_short
+msgid "Decrement X"
+msgstr "X 减量"
+
+#. (itstool) path: option/_short
+msgid "Increment Y"
+msgstr "Y 增量"
+
+#. (itstool) path: option/_short
+msgid "Decrement Y"
+msgstr "Y 减量"
diff --color -Naurp wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-workspace-names.po wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-workspace-names.po
--- wayfire-plugins-extra-0.10.0/locale/zh_CN/LC_MESSAGES/wf-plugin-workspace-names.po 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/locale/zh_CN/LC_MESSAGES/wf-plugin-workspace-names.po 2026-08-01 16:00:35.433292492 -0600
@@ -0,0 +1,144 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2025-09-28 22:10-0600\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: zh_CN \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. (itstool) path: plugin/_short
+#. (itstool) path: option/_short
+msgid "Workspace Names"
+msgstr "工作区名称"
+
+#. (itstool) path: plugin/_long
+msgid "Name workspaces."
+msgstr "为工作区命名。"
+
+#. (itstool) path: option/_short
+msgid "Display Duration"
+msgstr "显示持续时间"
+
+#. (itstool) path: option/_long
+msgid "How long the name is displayed."
+msgstr "名称的显示时长。"
+
+#. (itstool) path: option/_short
+msgid "Margin"
+msgstr "边距"
+
+#. (itstool) path: option/_long
+msgid "Distance from edge of screen to indicator."
+msgstr "指示器到屏幕边缘的距离。"
+
+#. (itstool) path: option/_short
+msgid "Position"
+msgstr "位置"
+
+#. (itstool) path: option/_long
+msgid "Position of rendering."
+msgstr "渲染位置。"
+
+#. (itstool) path: desc/_name
+msgid "Top Left"
+msgstr "左上"
+
+#. (itstool) path: desc/_name
+msgid "Top Center"
+msgstr "中上"
+
+#. (itstool) path: desc/_name
+msgid "Top Right"
+msgstr "右上"
+
+#. (itstool) path: desc/_name
+msgid "Center Left"
+msgstr "左中"
+
+#. (itstool) path: desc/_name
+msgid "Center"
+msgstr "居中"
+
+#. (itstool) path: desc/_name
+msgid "Center Right"
+msgstr "右中"
+
+#. (itstool) path: desc/_name
+msgid "Bottom Left"
+msgstr "左下"
+
+#. (itstool) path: desc/_name
+msgid "Bottom Center"
+msgstr "中下"
+
+#. (itstool) path: desc/_name
+msgid "Bottom Right"
+msgstr "右下"
+
+#. (itstool) path: option/_short
+msgid "Background Color"
+msgstr "背景颜色"
+
+#. (itstool) path: option/_long
+msgid "Background color for text."
+msgstr "文本的背景颜色。"
+
+#. (itstool) path: option/_short
+msgid "Text Color"
+msgstr "文本颜色"
+
+#. (itstool) path: option/_long
+msgid "Text color."
+msgstr "文本颜色。"
+
+#. (itstool) path: option/_short
+msgid "Text Font"
+msgstr "文本字体"
+
+#. (itstool) path: option/_long
+msgid "Font used for text rendering."
+msgstr "用于文本渲染的字体。"
+
+#. (itstool) path: option/_short
+msgid "Show Option Names"
+msgstr "显示选项名称"
+
+#. (itstool) path: option/_long
+msgid "Display option names on screen for convenience."
+msgstr "在屏幕上显示选项名称以方便使用。"
+
+#. (itstool) path: option/_short
+msgid "Show Option Values"
+msgstr "显示选项值"
+
+#. (itstool) path: option/_long
+msgid ""
+"Display option values instead of names, when show_option_names is enabled."
+msgstr "当启用显示选项名称时,显示选项值而不是名称。"
+
+#. (itstool) path: option/_short
+msgid "Background Corner Radius"
+msgstr "背景圆角半径"
+
+#. (itstool) path: option/_long
+msgid "Radius for the corners of the background."
+msgstr "背景圆角的半径。"
+
+#. (itstool) path: option/_long
+msgid ""
+"Names of the workspaces. By default, they will have the name Workspace #N, "
+"where #N is the workspace number."
+msgstr ""
+"工作区的名称。默认情况下,它们的名称为“工作区 #N”,其中 #N 是工作区编号。"
+
+#. (itstool) path: entry/_short
+msgid "Workspace Name"
+msgstr "工作区名称"
+
+#. (itstool) path: entry/_long
+msgid "Sets the name of the workspace"
+msgstr "设置工作区的名称"
diff --color -Naurp wayfire-plugins-extra-0.10.0/meson.build wayfire-plugins-extra/meson.build
--- wayfire-plugins-extra-0.10.0/meson.build 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/meson.build 2026-08-01 16:00:35.433292492 -0600
@@ -2,9 +2,9 @@ project(
'wayfire-plugins-extra',
'c',
'cpp',
- version: '0.10.0',
+ version: '0.11.0',
license: 'MIT',
- meson_version: '>=0.51.0',
+ meson_version: '>=0.59.0',
default_options: [
'cpp_std=c++17',
'c_std=c11',
@@ -13,7 +13,7 @@ project(
],
)
-wayfire = dependency('wayfire', version: '>=0.9.0')
+wayfire = dependency('wayfire', version: '>=0.11.0')
giomm = dependency('giomm-2.4', required: false)
wayland_protos = dependency('wayland-protocols', version: '>=1.12')
wayland_server = dependency('wayland-server')
@@ -43,6 +43,7 @@ add_project_arguments(['-Wno-unused-para
subdir('proto')
subdir('src')
subdir('metadata')
+subdir('locale')
summary = [
'',
diff --color -Naurp wayfire-plugins-extra-0.10.0/metadata/crosshair.xml wayfire-plugins-extra/metadata/crosshair.xml
--- wayfire-plugins-extra-0.10.0/metadata/crosshair.xml 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/metadata/crosshair.xml 2026-08-01 16:00:35.433615642 -0600
@@ -4,7 +4,7 @@
<_short>Crosshair
<_long>Render fullscreen mouse crosshair
Utility
-
+
+ <_short>Burn Settings
+
+
+
+
+
+
+
+
+ <_short>Magic Carpet Settings
+
+
+
+
+ <_short>Dodge Settings
+
+
+
+
+
+
diff --color -Naurp wayfire-plugins-extra-0.10.0/metadata/fisheye.xml wayfire-plugins-extra/metadata/fisheye.xml
--- wayfire-plugins-extra-0.10.0/metadata/fisheye.xml 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/metadata/fisheye.xml 2026-08-01 16:00:35.433615642 -0600
@@ -0,0 +1,27 @@
+
+
+
+ <_short>Fisheye
+ <_long>A plugin which provides fisheye effect.
+ Effects
+
+
+
+
+
diff --color -Naurp wayfire-plugins-extra-0.10.0/metadata/meson.build wayfire-plugins-extra/metadata/meson.build
--- wayfire-plugins-extra-0.10.0/metadata/meson.build 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/metadata/meson.build 2026-08-01 16:00:35.433615642 -0600
@@ -3,6 +3,7 @@ install_data('autorotate-iio.xml', insta
install_data('bench.xml', install_dir: wayfire.get_variable(pkgconfig: 'metadatadir'))
install_data('crosshair.xml', install_dir: wayfire.get_variable(pkgconfig: 'metadatadir'))
install_data('extra-animations.xml', install_dir: wayfire.get_variable(pkgconfig: 'metadatadir'))
+install_data('fisheye.xml', install_dir: wayfire.get_variable(pkgconfig: 'metadatadir'))
install_data('focus-change.xml', install_dir: wayfire.get_variable(pkgconfig: 'metadatadir'))
install_data('focus-steal-prevent.xml', install_dir: wayfire.get_variable(pkgconfig: 'metadatadir'))
install_data('follow-focus.xml', install_dir: wayfire.get_variable(pkgconfig: 'metadatadir'))
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/annotate.cpp wayfire-plugins-extra/src/annotate.cpp
--- wayfire-plugins-extra-0.10.0/src/annotate.cpp 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/src/annotate.cpp 2026-08-01 16:00:35.433615642 -0600
@@ -80,26 +80,23 @@ class simple_node_render_instance_t : pu
node_t *self;
damage_callback push_to_parent;
std::shared_ptr overlay, shape_overlay;
- int *x, *y, *w, *h;
+ wf::geometry_t *geometry;
public:
simple_node_render_instance_t(node_t *self, damage_callback push_dmg,
- int *x, int *y, int *w, int *h, std::shared_ptr overlay,
+ wf::geometry_t *geometry, std::shared_ptr overlay,
std::shared_ptr shape_overlay)
{
- this->x = x;
- this->y = y;
- this->w = w;
- this->h = h;
- this->self = self;
- this->overlay = overlay;
+ this->geometry = geometry;
+ this->self = self;
+ this->overlay = overlay;
this->shape_overlay = shape_overlay;
this->push_to_parent = push_dmg;
self->connect(&on_node_damaged);
}
void schedule_instructions(std::vector& instructions,
- const wf::render_target_t& target, wf::region_t& damage) override
+ const wf::render_target_t& target, wf::regionf_t& damage) override
{
// We want to render ourselves only, the node does not have children
instructions.push_back(render_instruction_t{
@@ -111,15 +108,15 @@ class simple_node_render_instance_t : pu
void render(const wf::scene::render_instruction_t& data) override
{
- auto ol = this->overlay;
- wlr_box og = {*x, *y, *w, *h};
+ auto ol = this->overlay;
+ wf::geometry_t og = *geometry;
data.pass->custom_gles_subpass([&]
{
wf::gles::bind_render_buffer(data.target);
for (auto& box : data.damage)
{
- wf::gles::render_target_logic_scissor(data.target, wlr_box_from_pixman_box(box));
+ wf::gles::render_target_logic_scissor(data.target, box);
if (ol->cr)
{
OpenGL::render_texture(wf::gles_texture_t{ol->texture->tex}, data.target, og,
@@ -139,16 +136,16 @@ class simple_node_render_instance_t : pu
class simple_node_t : public node_t
{
- int x, y, w, h;
+ wf::geometry_t geometry;
public:
std::shared_ptr overlay, shape_overlay;
simple_node_t(int x, int y, int w, int h) : node_t(false)
{
- this->x = x;
- this->y = y;
- this->w = w;
- this->h = h;
+ this->geometry.x = x;
+ this->geometry.y = y;
+ this->geometry.width = w;
+ this->geometry.height = h;
overlay = std::make_shared();
shape_overlay = std::make_shared();
}
@@ -161,10 +158,10 @@ class simple_node_t : public node_t
// this simple nodes does not need any transformations, so the push_damage
// callback is just passed along.
instances.push_back(std::make_unique(
- this, push_damage, &x, &y, &w, &h, overlay, shape_overlay));
+ this, push_damage, &geometry, overlay, shape_overlay));
}
- void do_push_damage(wf::region_t updated_region)
+ void do_push_damage(wf::regionf_t updated_region)
{
node_damage_signal ev;
ev.region = updated_region;
@@ -174,19 +171,19 @@ class simple_node_t : public node_t
wf::geometry_t get_bounding_box() override
{
// Specify whatever geometry your node has
- return {x, y, w, h};
+ return geometry;
}
void set_position(int x, int y)
{
- this->x = x;
- this->y = y;
+ this->geometry.x = x;
+ this->geometry.y = y;
}
void set_size(int w, int h)
{
- this->w = w;
- this->h = h;
+ this->geometry.width = w;
+ this->geometry.height = h;
}
};
@@ -201,7 +198,7 @@ std::shared_ptr add_simpl
class wayfire_annotate_screen : public wf::per_output_plugin_instance_t, public wf::pointer_interaction_t
{
uint32_t button;
- wlr_box last_bbox;
+ wf::geometry_t last_bbox;
annotate_draw_method draw_method;
wf::pointf_t grab_point, last_cursor;
std::vector>> overlays;
@@ -519,15 +516,15 @@ class wayfire_annotate_screen : public w
cairo_line_to(cr, to.x, to.y);
cairo_stroke(cr);
- wlr_box bbox;
+ wf::geometry_t bbox;
int padding = line_width + 1;
bbox.x = std::min(from.x, to.x) - padding;
bbox.y = std::min(from.y, to.y) - padding;
- bbox.width = abs(from.x - to.x) + padding * 2;
- bbox.height = abs(from.y - to.y) + padding * 2;
- get_node_overlay()->do_push_damage(wf::region_t(bbox));
+ bbox.width = std::abs(from.x - to.x) + padding * 2;
+ bbox.height = std::abs(from.y - to.y) + padding * 2;
+ get_node_overlay()->do_push_damage(wf::regionf_t(bbox));
cairo_surface_upload_to_texture_with_damage(ol->cairo_surface, *ol->texture,
- bbox);
+ wf::to_integer_box(bbox));
}
bool should_damage_last()
@@ -563,14 +560,14 @@ class wayfire_annotate_screen : public w
cairo_line_to(cr, to.x, to.y);
cairo_stroke(cr);
- wlr_box bbox;
+ wf::geometry_t bbox;
int padding = line_width + 1;
bbox.x = std::min(from.x, to.x) - padding;
bbox.y = std::min(from.y, to.y) - padding;
- bbox.width = abs(from.x - to.x) + padding * 2;
- bbox.height = abs(from.y - to.y) + padding * 2;
+ bbox.width = std::abs(from.x - to.x) + padding * 2;
+ bbox.height = std::abs(from.y - to.y) + padding * 2;
output->render->damage(bbox);
- wf::region_t damage_region{bbox};
+ wf::regionf_t damage_region{bbox};
if (damage_last_bbox)
{
output->render->damage(last_bbox);
@@ -579,14 +576,14 @@ class wayfire_annotate_screen : public w
damage_region &= output->get_relative_geometry();
auto damage_extents = damage_region.get_extents();
- wlr_box damage_box =
+ auto damage_box = wf::to_integer_box(wf::geometry_t
{damage_extents.x1, damage_extents.y1, damage_extents.x2 - damage_extents.x1,
- damage_extents.y2 - damage_extents.y1};
+ damage_extents.y2 - damage_extents.y1});
cairo_surface_upload_to_texture_with_damage(ol->cairo_surface, *ol->texture,
damage_box);
- get_node_overlay()->do_push_damage(wf::region_t(last_bbox));
- get_node_overlay()->do_push_damage(wf::region_t(bbox));
+ get_node_overlay()->do_push_damage(wf::regionf_t(last_bbox));
+ get_node_overlay()->do_push_damage(wf::regionf_t(bbox));
last_bbox = bbox;
}
@@ -632,14 +629,14 @@ class wayfire_annotate_screen : public w
cairo_rectangle(cr, x, y, w, h);
cairo_stroke(cr);
- wlr_box bbox;
+ wf::geometry_t bbox;
int padding = line_width + 1;
bbox.x = x - padding;
bbox.y = y - padding;
bbox.width = w + padding * 2;
bbox.height = h + padding * 2;
output->render->damage(bbox);
- wf::region_t damage_region{bbox};
+ wf::regionf_t damage_region{bbox};
if (damage_last_bbox)
{
output->render->damage(last_bbox);
@@ -648,14 +645,14 @@ class wayfire_annotate_screen : public w
damage_region &= output->get_relative_geometry();
auto damage_extents = damage_region.get_extents();
- wlr_box damage_box =
+ auto damage_box = wf::to_integer_box(wf::geometry_t
{damage_extents.x1, damage_extents.y1, damage_extents.x2 - damage_extents.x1,
- damage_extents.y2 - damage_extents.y1};
+ damage_extents.y2 - damage_extents.y1});
cairo_surface_upload_to_texture_with_damage(ol->cairo_surface, *ol->texture,
damage_box);
- get_node_overlay()->do_push_damage(wf::region_t(last_bbox));
- get_node_overlay()->do_push_damage(wf::region_t(bbox));
+ get_node_overlay()->do_push_damage(wf::regionf_t(last_bbox));
+ get_node_overlay()->do_push_damage(wf::regionf_t(bbox));
last_bbox = bbox;
}
@@ -695,14 +692,14 @@ class wayfire_annotate_screen : public w
cairo_arc(cr, from.x, from.y, radius, 0, 2 * M_PI);
cairo_stroke(cr);
- wlr_box bbox;
+ wf::geometry_t bbox;
int padding = line_width + 1;
bbox.x = (from.x - radius) - padding;
bbox.y = (from.y - radius) - padding;
bbox.width = (radius * 2) + padding * 2;
bbox.height = (radius * 2) + padding * 2;
output->render->damage(bbox);
- wf::region_t damage_region{bbox};
+ wf::regionf_t damage_region{bbox};
if (damage_last_bbox)
{
output->render->damage(last_bbox);
@@ -711,14 +708,14 @@ class wayfire_annotate_screen : public w
damage_region &= output->get_relative_geometry();
auto damage_extents = damage_region.get_extents();
- wlr_box damage_box =
+ auto damage_box = wf::to_integer_box(wf::geometry_t
{damage_extents.x1, damage_extents.y1, damage_extents.x2 - damage_extents.x1,
- damage_extents.y2 - damage_extents.y1};
+ damage_extents.y2 - damage_extents.y1});
cairo_surface_upload_to_texture_with_damage(ol->cairo_surface, *ol->texture,
damage_box);
- get_node_overlay()->do_push_damage(wf::region_t(last_bbox));
- get_node_overlay()->do_push_damage(wf::region_t(bbox));
+ get_node_overlay()->do_push_damage(wf::regionf_t(last_bbox));
+ get_node_overlay()->do_push_damage(wf::regionf_t(bbox));
last_bbox = bbox;
}
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/autorotate-iio.cpp wayfire-plugins-extra/src/autorotate-iio.cpp
--- wayfire-plugins-extra-0.10.0/src/autorotate-iio.cpp 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/src/autorotate-iio.cpp 2026-08-01 16:00:35.433998821 -0600
@@ -22,6 +22,7 @@ extern "C"
{
#include
#include
+#include
}
using namespace Gio;
@@ -105,6 +106,12 @@ class WayfireAutorotateIIO : public wf::
/* Transform coming from the iio-sensors, -1 means not set */
int32_t sensor_transform = -1;
+ /* Debounce: pending transform waiting to be confirmed stable */
+ int32_t pending_transform = -1;
+ guint debounce_timer_id = 0;
+ static constexpr guint DEBOUNCE_ROTATE_MS = 500;
+ static constexpr guint DEBOUNCE_NORMAL_MS = 1200;
+
bool on_rotate_binding(int32_t target_rotation)
{
if (!output->can_activate_plugin(&grab_interface))
@@ -154,10 +161,18 @@ class WayfireAutorotateIIO : public wf::
return true;
}
- wf::effect_hook_t on_frame = [=] ()
+ /* Wayland event loop timer — fires every 50ms to pump the GLib main context
+ * even when the display is idle and on_frame would not run. */
+ wl_event_source *glib_timer = nullptr;
+
+ static int glib_timer_cb(void *data)
{
+ auto *self = static_cast(data);
Glib::MainContext::get_default()->iteration(false);
- };
+ wl_event_source_timer_update(self->glib_timer, 50);
+ return 0;
+ }
+
Glib::RefPtr loop;
public:
@@ -185,7 +200,10 @@ class WayfireAutorotateIIO : public wf::
Gio::init();
loop = Glib::MainLoop::create(true);
- output->render->add_effect(&on_frame, wf::OUTPUT_EFFECT_PRE);
+
+ auto *evloop = wl_display_get_event_loop(wf::get_core().display);
+ glib_timer = wl_event_loop_add_timer(evloop, glib_timer_cb, this);
+ wl_event_source_timer_update(glib_timer, 50);
watch_id = DBus::watch_name(DBus::BUS_TYPE_SYSTEM, "net.hadess.SensorProxy",
sigc::mem_fun(this, &WayfireAutorotateIIO::on_iio_appeared),
@@ -210,6 +228,7 @@ class WayfireAutorotateIIO : public wf::
iio_proxy->signal_properties_changed().connect_notify(
sigc::mem_fun(this, &WayfireAutorotateIIO::on_properties_changed));
iio_proxy->call_sync("ClaimAccelerometer");
+ update_orientation();
}
void on_properties_changed(
@@ -228,6 +247,11 @@ class WayfireAutorotateIIO : public wf::
Glib::Variant orientation;
iio_proxy->get_cached_property(orientation, "AccelerometerOrientation");
+ if (!orientation)
+ {
+ return;
+ }
+
LOGI("IIO Accelerometer orientation: %s", orientation.get().c_str());
static const std::map transform_by_name =
@@ -238,10 +262,55 @@ class WayfireAutorotateIIO : public wf::
{"bottom-up", WL_OUTPUT_TRANSFORM_180},
};
- if (transform_by_name.count(orientation.get()))
+ if (!transform_by_name.count(orientation.get()))
{
- sensor_transform = transform_by_name.find(orientation.get())->second;
- update_transform();
+ return;
+ }
+
+ int32_t new_transform = transform_by_name.find(orientation.get())->second;
+
+ bool timer_running = (debounce_timer_id != 0);
+ bool new_is_normal = (new_transform == WL_OUTPUT_TRANSFORM_NORMAL);
+ bool pend_is_normal = (pending_transform == WL_OUTPUT_TRANSFORM_NORMAL);
+
+ if (!timer_running)
+ {
+ if (new_transform == sensor_transform)
+ {
+ return;
+ }
+
+ pending_transform = new_transform;
+ guint delay = new_is_normal ? DEBOUNCE_NORMAL_MS : DEBOUNCE_ROTATE_MS;
+ debounce_timer_id = g_timeout_add(delay, [] (gpointer data) -> gboolean
+ {
+ auto *self = static_cast(data);
+ self->debounce_timer_id = 0;
+ self->sensor_transform = self->pending_transform;
+ self->update_transform();
+ return G_SOURCE_REMOVE;
+ }, this);
+ } else if (!pend_is_normal)
+ {
+ if (!new_is_normal)
+ {
+ pending_transform = new_transform;
+ }
+ } else
+ {
+ if (!new_is_normal)
+ {
+ g_source_remove(debounce_timer_id);
+ pending_transform = new_transform;
+ debounce_timer_id = g_timeout_add(DEBOUNCE_ROTATE_MS, [] (gpointer data) -> gboolean
+ {
+ auto *self = static_cast(data);
+ self->debounce_timer_id = 0;
+ self->sensor_transform = self->pending_transform;
+ self->update_transform();
+ return G_SOURCE_REMOVE;
+ }, this);
+ }
}
}
@@ -259,13 +328,20 @@ class WayfireAutorotateIIO : public wf::
output->rem_binding(&on_rotate_up);
output->rem_binding(&on_rotate_down);
+ if (debounce_timer_id)
+ {
+ g_source_remove(debounce_timer_id);
+ debounce_timer_id = 0;
+ }
+
/* If loop is NULL, autorotate was disabled for the current output */
if (loop)
{
iio_proxy.reset();
DBus::unwatch_name(watch_id);
loop->quit();
- output->render->rem_effect(&on_frame);
+ wl_event_source_remove(glib_timer);
+ glib_timer = nullptr;
}
}
};
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/crosshair.cpp wayfire-plugins-extra/src/crosshair.cpp
--- wayfire-plugins-extra-0.10.0/src/crosshair.cpp 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/src/crosshair.cpp 2026-08-01 16:00:35.433998821 -0600
@@ -31,7 +31,7 @@
class wayfire_crosshair : public wf::per_output_plugin_instance_t
{
- wf::option_wrapper_t line_width{"crosshair/line_width"};
+ wf::option_wrapper_t line_width{"crosshair/line_width"};
wf::option_wrapper_t line_color{"crosshair/line_color"};
wf::geometry_t geometry[2];
@@ -56,9 +56,9 @@ class wayfire_crosshair : public wf::per
output->render->damage(geometry[1]);
geometry[0] =
- wf::geometry_t{int(oc.x - half_width), 0, line_width, og.height};
+ wf::geometry_t{oc.x - half_width, 0, line_width, og.height};
geometry[1] =
- wf::geometry_t{0, int(oc.y - half_width), og.width, line_width};
+ wf::geometry_t{0, oc.y - half_width, og.width, line_width};
output->render->damage(geometry[0]);
output->render->damage(geometry[1]);
@@ -68,17 +68,17 @@ class wayfire_crosshair : public wf::per
{
auto target_fb = output->render->get_target_framebuffer();
auto gc = wf::get_core().get_cursor_position();
- wf::point_t coords{(int)gc.x, (int)gc.y};
+ wf::pointf_t coords{gc.x, gc.y};
if (!(output->get_layout_geometry() & coords))
{
return;
}
- wf::region_t region;
+ wf::regionf_t region;
region |= geometry[0];
region |= geometry[1];
- region &= output->render->get_swap_damage();
+ region &= target_fb.geometry_region_from_framebuffer_region(output->render->get_swap_damage());
auto alpha = wf::color_t(line_color).a;
wf::color_t color = wf::color_t{
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/extra-animations/blinds.hpp wayfire-plugins-extra/src/extra-animations/blinds.hpp
--- wayfire-plugins-extra-0.10.0/src/extra-animations/blinds.hpp 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/src/extra-animations/blinds.hpp 2026-08-01 16:00:35.433998821 -0600
@@ -82,14 +82,8 @@ using namespace wf::animation;
static std::string blinds_transformer_name = "animation-blinds";
-wf::option_wrapper_t blinds_duration{"extra-animations/blinds_duration"};
wf::option_wrapper_t blinds_strip_height{"extra-animations/blinds_strip_height"};
-class blinds_animation_t : public duration_t
-{
- public:
- using duration_t::duration_t;
-};
class blinds_transformer : public wf::scene::view_2d_transformer_t
{
public:
@@ -97,7 +91,7 @@ class blinds_transformer : public wf::sc
OpenGL::program_t program;
wf::output_t *output;
wf::geometry_t animation_geometry;
- blinds_animation_t progression{blinds_duration};
+ duration_t progression;
class simple_node_render_instance_t : public wf::scene::transformer_render_instance_t
{
@@ -128,7 +122,7 @@ class blinds_transformer : public wf::sc
void schedule_instructions(
std::vector& instructions,
- const wf::render_target_t& target, wf::region_t& damage) override
+ const wf::render_target_t& target, wf::regionf_t& damage) override
{
instructions.push_back(render_instruction_t{
.instance = this,
@@ -137,9 +131,9 @@ class blinds_transformer : public wf::sc
});
}
- void transform_damage_region(wf::region_t& damage) override
+ void transform_damage_region(wf::regionf_t& damage) override
{
- damage |= wf::region_t{self->animation_geometry};
+ damage |= self->animation_geometry;
}
void render(const wf::scene::render_instruction_t& data) override
@@ -163,17 +157,17 @@ class blinds_transformer : public wf::sc
auto y = src_box.height - i;
auto inv_h = 1.0 / src_box.height;
uv.push_back(1.0);
- uv.push_back(std::max(0, y - line_height) * inv_h);
+ uv.push_back(std::max(0.0, y - line_height) * inv_h);
uv.push_back(0.0);
- uv.push_back(std::max(0, y - line_height) * inv_h);
+ uv.push_back(std::max(0.0, y - line_height) * inv_h);
uv.push_back(0.0);
uv.push_back(y * inv_h);
uv.push_back(1.0);
uv.push_back(y * inv_h);
auto x1 = src_box.width / 2.0;
auto x2 = -(src_box.width / 2.0);
- auto y1 = -(std::min(src_box.height - i, line_height) / 2.0);
- auto y2 = std::min(src_box.height - i, line_height) / 2.0;
+ auto y1 = -(std::min(src_box.height - i, (double)line_height) / 2.0);
+ auto y2 = std::min(src_box.height - i, (double)line_height) / 2.0;
glm::vec4 v, r;
glm::mat4 m(1.0);
m =
@@ -208,13 +202,14 @@ class blinds_transformer : public wf::sc
glm::mat4 p = glm::perspective(float(M_PI / 64.0), 1.0f, 0.1f, 100.0f);
glm::mat4 l = glm::lookAt(
- glm::vec3(0., 0., 1.0 / std::tan(float(M_PI / 64.0) / 2)),
+ glm::vec3(0., 0., -1.0 / std::tan(float(M_PI / 64.0) / 2)),
glm::vec3(0., 0., 0.),
- glm::vec3(0., 1., 0.));
+ glm::vec3(0., -1., 0.));
auto transform = p * l;
wf::auxilliary_buffer_t slice_buffer;
- slice_buffer.allocate({src_box.width + line_height * 2, static_cast(y2 - y1)});
+ slice_buffer.allocate({static_cast(std::ceil(src_box.width + line_height * 2)),
+ static_cast(std::ceil(y2 - y1))});
wf::gles::bind_render_buffer(slice_buffer.get_renderbuffer());
OpenGL::clear(wf::color_t{0.0, 0.0, 0.0, 0.0}, GL_COLOR_BUFFER_BIT);
self->program.use(wf::TEXTURE_TYPE_RGBA);
@@ -227,16 +222,17 @@ class blinds_transformer : public wf::sc
wf::gles_texture_t slice_tex{slice_buffer.get_texture()};
wf::gles::bind_render_buffer(data.target);
- for (auto box : data.damage)
- {
- wf::gles::render_target_logic_scissor(data.target, wlr_box_from_pixman_box(box));
- OpenGL::render_transformed_texture(slice_tex,
- gl_geometry{float(src_box.x - line_height),
- float(src_box.y + i),
- float((src_box.x - line_height) + src_box.width + line_height * 2.0),
- float((src_box.y + i) + (y2 - y1))}, {},
- wf::gles::render_target_orthographic_projection(data.target), glm::vec4(1.0), 0);
- }
+ /* XXX: Scissoring wrong boxes here makes only top part of effect work */
+ // for (auto box : data.damage)
+ // {
+ // wf::gles::render_target_logic_scissor(data.target, box);
+ OpenGL::render_transformed_texture(slice_tex,
+ gl_geometry{float(src_box.x - line_height),
+ float(src_box.y + i),
+ float((src_box.x - line_height) + src_box.width + line_height * 2.0),
+ float((src_box.y + i) + (y2 - y1))}, {},
+ wf::gles::render_target_orthographic_projection(data.target), glm::vec4(1.0), 0);
+ // }
slice_buffer.free();
}
@@ -244,9 +240,12 @@ class blinds_transformer : public wf::sc
}
};
- blinds_transformer(wayfire_view view, wf::geometry_t bbox) : wf::scene::view_2d_transformer_t(view)
+ blinds_transformer(wayfire_view view, wf::geometry_t bbox, wf::animation_description_t duration) :
+ wf::scene::view_2d_transformer_t(view)
{
this->view = view;
+ duration_t d;
+ this->progression = duration_t{wf::create_option(duration)};
if (view->get_output())
{
output = view->get_output();
@@ -263,11 +262,6 @@ class blinds_transformer : public wf::sc
});
}
- wf::geometry_t get_bounding_box() override
- {
- return this->animation_geometry;
- }
-
wf::effect_hook_t pre_hook = [=] ()
{
output->render->damage(animation_geometry);
@@ -316,7 +310,7 @@ class blinds_animation : public animatio
pop_transformer(view);
auto bbox = view->get_transformed_node()->get_bounding_box();
auto tmgr = view->get_transformed_node();
- auto node = std::make_shared(view, bbox);
+ auto node = std::make_shared(view, bbox, dur);
tmgr->add_transformer(node, wf::TRANSFORMER_HIGHLEVEL + 1, blinds_transformer_name);
node->init_animation(type & WF_ANIMATE_HIDING_ANIMATION);
}
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/extra-animations/burn.hpp wayfire-plugins-extra/src/extra-animations/burn.hpp
--- wayfire-plugins-extra-0.10.0/src/extra-animations/burn.hpp 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/src/extra-animations/burn.hpp 2026-08-01 16:00:35.434368211 -0600
@@ -0,0 +1,451 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Scott Moreau
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include
+#include
+#include
+#include
+#include
+
+
+static const char *burn_vert_source =
+ R"(
+#version 100
+
+attribute highp vec2 position;
+attribute highp vec2 uv_in;
+
+varying highp vec2 uvpos;
+
+void main() {
+
+ gl_Position = vec4(position.xy, 0.0, 1.0);
+ uvpos = uv_in;
+}
+)";
+
+static const char *burn_frag_source =
+ R"(
+#version 100
+@builtin_ext@
+@builtin@
+
+precision highp float;
+
+varying highp vec2 uvpos;
+uniform vec2 size;
+uniform float progress;
+uniform int direction;
+uniform float flame_speed;
+uniform float flame_width;
+uniform float flame_height;
+uniform int flame_smooth_1;
+uniform int flame_smooth_2;
+uniform int flame_smooth_3;
+uniform int flame_smooth_4;
+uniform vec4 flame_color;
+
+// procedural noise from IQ
+vec2 hash( vec2 p )
+{
+ p = vec2(dot(p,vec2(127.1,311.7)),
+ dot(p,vec2(269.5,183.3)));
+ return -1.0 + 2.0 * fract(sin(p) * 43758.5453123);
+}
+
+float noise( in vec2 p )
+{
+ const float K1 = 0.366025404; // (sqrt(3) - 1) / 2;
+ const float K2 = 0.211324865; // (3 - sqrt(3)) / 6;
+
+ vec2 i = floor( p + (p.x + p.y) * K1 );
+
+ vec2 a = p - i + (i.x + i.y) * K2;
+ vec2 o = (a.x > a.y) ? vec2(1.0, 0.0) : vec2(0.0, 1.0);
+ vec2 b = a - o + K2;
+ vec2 c = a - 1.0 + 2.0 * K2;
+
+ vec3 h = max(0.5 - vec3(dot(a, a), dot(b, b), dot(c, c) ), 0.0);
+
+ vec3 n = h * h * h * h * vec3(dot(a, hash(i)), dot(b, hash(i + o)), dot(c, hash(i + 1.0)));
+
+ return dot(n, vec3(70.0));
+}
+
+float fbm(vec2 uv)
+{
+ float f;
+ mat2 m = mat2(1.7, 1.2, -1.2, 1.7);
+ f = 0.5000 * noise( uv ); uv = m * uv;
+ if (flame_smooth_1 == 1)
+ {
+ f += 0.2500 * noise( uv ); uv = m * uv;
+ }
+ if (flame_smooth_2 == 1)
+ {
+ f += 0.1250 * noise( uv ); uv = m * uv;
+ }
+ if (flame_smooth_3 == 1)
+ {
+ f += 0.0625 * noise( uv ); uv = m * uv;
+ }
+ if (flame_smooth_4 == 1)
+ {
+ f += 0.0125 * noise( uv ); uv = m * uv;
+ }
+ return 0.5 + 0.3 * f;
+}
+
+void main()
+{
+ float width = size.x;
+ float height = size.y;
+ vec2 uv = vec2(uvpos.x * width * 0.02, (uvpos.y - progress) * height * 0.002);
+ vec2 q = vec2(uv.x, uv.y);
+ q.x *= (1.05 - flame_width) * 3.0;
+ q.y *= pow(0.4 / ((flame_height * 0.3) + 0.1), clamp(uvpos.y + 0.2 - progress, 0.1, 0.7) * 20.0);
+ float burn_progress = progress;
+ if (direction == 1)
+ {
+ burn_progress = 1.0 - burn_progress;
+ }
+ float T3 = burn_progress * flame_speed;
+ q.x -= 0.2;
+ q.y -= 0.1;
+ float n = fbm(q - vec2(0, T3));
+ float c = 1.0 - 12.0 * pow(max(0., length(vec2(q.x * 0.0001, q.y) * vec2(1.8 + q.y * 1.5, 0.75) ) - n * max(0.0, q.y + 0.25)), 1.2);
+ float c1 = n * c * (1.5 - pow(1.25 * uv.y, 4.0));
+ c = clamp(c, 0.0, 1.0);
+ c1 = clamp(c1, 0.0, 1.0);
+
+ float r = 1.0 / flame_color.r;
+ float g = 1.0 / flame_color.g;
+ float b = 1.0 / flame_color.b;
+
+ vec3 col = vec3(1.5 * pow(c1, r), 1.5 * pow(c1, g), 1.5 * pow(c1, b));
+
+ float a = clamp(c * (1.0 - pow(uvpos.y, 10.0)), 0.0, 1.0);
+ vec4 wfrag = get_pixel(uvpos);
+ if (uvpos.x < 0.0 || uvpos.x > 1.0 ||
+ uvpos.y < 0.0 || uvpos.y > 1.0 ||
+ uvpos.y < progress)
+ {
+ wfrag = vec4(0.0);
+ }
+ a *= clamp(progress * 10.0, 0.0, 1.0);
+ a *= 1.0 - pow(clamp(-uvpos.x * (width * 0.05), 0.0, 1.0), 0.7);
+ a *= 1.0 - pow(clamp((1.0 - (2.0 - uvpos.x)) * (width * 0.05), 0.0, 1.0), 0.7);
+ vec4 color = vec4(col * a, a);
+ gl_FragColor = color + wfrag * (1.0 - a);
+}
+)";
+
+namespace wf
+{
+namespace burn
+{
+using namespace wf::scene;
+using namespace wf::animate;
+using namespace wf::animation;
+
+static std::string burn_transformer_name = "animation-burn";
+
+wf::option_wrapper_t burn_flame_speed{"extra-animations/burn_flame_speed"};
+wf::option_wrapper_t burn_flame_width{"extra-animations/burn_flame_width"};
+wf::option_wrapper_t burn_flame_height{"extra-animations/burn_flame_height"};
+wf::option_wrapper_t burn_flame_color{"extra-animations/burn_flame_color"};
+wf::option_wrapper_t burn_flame_smoothness{"extra-animations/burn_flame_smoothness"};
+
+class burn_transformer : public wf::scene::view_2d_transformer_t
+{
+ public:
+ wayfire_view view;
+ wf::output_t *output;
+ OpenGL::program_t program;
+ wf::auxilliary_buffer_t buffer;
+ duration_t progression;
+
+ class simple_node_render_instance_t : public wf::scene::transformer_render_instance_t
+ {
+ wf::signal::connection_t on_node_damaged =
+ [=] (node_damage_signal *ev)
+ {
+ push_to_parent(ev->region);
+ };
+
+ burn_transformer *self;
+ wayfire_view view;
+ damage_callback push_to_parent;
+
+ public:
+ simple_node_render_instance_t(burn_transformer *self, damage_callback push_damage,
+ wayfire_view view) : wf::scene::transformer_render_instance_t(self,
+ push_damage,
+ view->get_output())
+ {
+ this->self = self;
+ this->view = view;
+ this->push_to_parent = push_damage;
+ self->connect(&on_node_damaged);
+ }
+
+ ~simple_node_render_instance_t()
+ {}
+
+ void schedule_instructions(
+ std::vector& instructions,
+ const wf::render_target_t& target, wf::regionf_t& damage) override
+ {
+ instructions.push_back(render_instruction_t{
+ .instance = this,
+ .target = target,
+ .damage = damage & self->get_bounding_box(),
+ });
+ }
+
+ void transform_damage_region(wf::regionf_t& damage) override
+ {
+ damage |= self->get_bounding_box();
+ }
+
+ void render(const wf::scene::render_instruction_t& data) override
+ {
+ auto bb = self->get_children_bounding_box();
+ auto pbb = self->get_padded_bounding_box();
+ auto tex = wf::gles_texture_t{get_texture(1.0)};
+
+ const float vertices[] = {
+ -1.0, -1.0,
+ 1.0f, -1.0,
+ 1.0f, 1.0f,
+ -1.0, 1.0f
+ };
+ wf::pointf_t offset1{-float(bb.x - pbb.x) / bb.width,
+ -float(pbb.height - ((bb.y - pbb.y) + bb.height)) / bb.height};
+ wf::pointf_t offset2{float(pbb.width) / bb.width + offset1.x,
+ float(pbb.height) / bb.height + offset1.y};
+ const float uv[] = {
+ float(offset1.x), float(offset2.y),
+ float(offset2.x), float(offset2.y),
+ float(offset2.x), float(offset1.y),
+ float(offset1.x), float(offset1.y),
+ };
+ auto progress = self->progression.progress();
+
+ data.pass->custom_gles_subpass([&]
+ {
+ self->buffer.allocate({int(pbb.width), int(pbb.height)});
+ wf::gles::bind_render_buffer(self->buffer.get_renderbuffer());
+ wf::gles_texture_t final_tex{self->buffer.get_texture()};
+ OpenGL::clear(wf::color_t{0.0, 0.0, 0.0, 0.0}, GL_COLOR_BUFFER_BIT);
+ self->program.use(wf::TEXTURE_TYPE_RGBA);
+ self->program.attrib_pointer("position", 2, 0, vertices);
+ self->program.attrib_pointer("uv_in", 2, 0, uv);
+ self->program.uniform2f("size", bb.width * 1.0, bb.height * 1.0);
+ self->program.uniform1f("progress", 1.0 - progress);
+ self->program.uniform1i("direction", self->progression.get_direction());
+ self->program.uniform1f("flame_speed", burn_flame_speed);
+ self->program.uniform1f("flame_width", burn_flame_width);
+ self->program.uniform1f("flame_height", burn_flame_height);
+ if (std::string(burn_flame_smoothness) == "softest")
+ {
+ self->program.uniform1i("flame_smooth_1", 0);
+ self->program.uniform1i("flame_smooth_2", 0);
+ self->program.uniform1i("flame_smooth_3", 0);
+ self->program.uniform1i("flame_smooth_4", 0);
+ } else if (std::string(burn_flame_smoothness) == "soft")
+ {
+ self->program.uniform1i("flame_smooth_1", 0);
+ self->program.uniform1i("flame_smooth_2", 1);
+ self->program.uniform1i("flame_smooth_3", 1);
+ self->program.uniform1i("flame_smooth_4", 1);
+ } else if (std::string(burn_flame_smoothness) == "hard")
+ {
+ self->program.uniform1i("flame_smooth_1", 1);
+ self->program.uniform1i("flame_smooth_2", 1);
+ self->program.uniform1i("flame_smooth_3", 1);
+ self->program.uniform1i("flame_smooth_4", 1);
+ } else // "normal"
+ {
+ self->program.uniform1i("flame_smooth_1", 1);
+ self->program.uniform1i("flame_smooth_2", 0);
+ self->program.uniform1i("flame_smooth_3", 1);
+ self->program.uniform1i("flame_smooth_4", 0);
+ }
+
+ glm::vec4 flame_color{
+ wf::color_t(burn_flame_color).r,
+ wf::color_t(burn_flame_color).g,
+ wf::color_t(burn_flame_color).b,
+ wf::color_t(burn_flame_color).a};
+ self->program.uniform4f("flame_color", flame_color);
+
+ self->program.set_active_texture(tex);
+ GL_CALL(glDrawArrays(GL_TRIANGLE_FAN, 0, 4));
+
+ wf::gles::bind_render_buffer(data.target);
+ for (auto box : data.damage)
+ {
+ wf::gles::render_target_logic_scissor(data.target, box);
+ OpenGL::render_transformed_texture(final_tex, pbb,
+ wf::gles::render_target_orthographic_projection(data.target),
+ glm::vec4(1.0, 1.0, 1.0, std::clamp((progress - 0.07) * 10.0, 0.0, 1.0)), 0);
+ }
+
+ GL_CALL(glBindTexture(GL_TEXTURE_2D, 0));
+ self->program.deactivate();
+ self->buffer.free();
+ });
+ }
+ };
+
+ burn_transformer(wayfire_view view, wf::geometry_t bbox,
+ wf::animation_description_t duration) : wf::scene::view_2d_transformer_t(view)
+ {
+ this->view = view;
+ this->progression = duration_t{wf::create_option(duration)};
+ if (view->get_output())
+ {
+ output = view->get_output();
+ output->render->add_effect(&pre_hook, wf::OUTPUT_EFFECT_PRE);
+ }
+
+ wf::gles::run_in_context([&]
+ {
+ program.compile(burn_vert_source, burn_frag_source);
+ });
+ }
+
+ wf::geometry_t get_padded_bounding_box()
+ {
+ auto box = this->get_children_bounding_box();
+ auto padding = 50;
+ box.x -= padding;
+ box.y -= padding;
+ box.width += padding * 2;
+ box.height += padding * 2;
+ return box;
+ }
+
+ wf::effect_hook_t pre_hook = [=] ()
+ {
+ output->render->damage(this->get_bounding_box());
+ };
+
+ void gen_render_instances(std::vector& instances,
+ damage_callback push_damage, wf::output_t *shown_on) override
+ {
+ instances.push_back(std::make_unique(
+ this, push_damage, view));
+ }
+
+ void init_animation(bool burn)
+ {
+ if (burn)
+ {
+ this->progression.reverse();
+ }
+
+ this->progression.start();
+ }
+
+ virtual ~burn_transformer()
+ {
+ if (output)
+ {
+ output->render->rem_effect(&pre_hook);
+ }
+
+ wf::gles::run_in_context_if_gles([&]
+ {
+ program.free_resources();
+ });
+ }
+};
+
+class burn_animation : public animation_base_t
+{
+ wayfire_view view;
+
+ public:
+ void init(wayfire_view view, wf::animation_description_t dur, animation_type type) override
+ {
+ this->view = view;
+ pop_transformer(view);
+ auto bbox = view->get_transformed_node()->get_bounding_box();
+ auto tmgr = view->get_transformed_node();
+ auto node = std::make_shared(view, bbox, dur);
+ tmgr->add_transformer(node, wf::TRANSFORMER_HIGHLEVEL + 1, burn_transformer_name);
+ node->init_animation(type & WF_ANIMATE_HIDING_ANIMATION);
+ }
+
+ void pop_transformer(wayfire_view view)
+ {
+ if (view->get_transformed_node()->get_transformer(burn_transformer_name))
+ {
+ view->get_transformed_node()->rem_transformer(burn_transformer_name);
+ }
+ }
+
+ bool step() override
+ {
+ if (!view)
+ {
+ return false;
+ }
+
+ auto tmgr = view->get_transformed_node();
+ if (!tmgr)
+ {
+ return false;
+ }
+
+ if (auto tr =
+ tmgr->get_transformer(burn_transformer_name))
+ {
+ auto running = tr->progression.running();
+ if (!running)
+ {
+ pop_transformer(view);
+ return false;
+ }
+
+ return running;
+ }
+
+ return false;
+ }
+
+ void reverse() override
+ {
+ if (auto tr =
+ view->get_transformed_node()->get_transformer(
+ burn_transformer_name))
+ {
+ tr->progression.reverse();
+ }
+ }
+};
+}
+}
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/extra-animations/carpet.hpp wayfire-plugins-extra/src/extra-animations/carpet.hpp
--- wayfire-plugins-extra-0.10.0/src/extra-animations/carpet.hpp 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/src/extra-animations/carpet.hpp 2026-08-01 16:00:35.434368211 -0600
@@ -0,0 +1,584 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Scott Moreau
+ * Copyright (c) 2025 Andrew Pliatsikas
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include
+#include
+#include
+#include
+#include
+
+
+static const char *carpet_vert_source =
+ R"(
+#version 100
+
+attribute highp vec2 position;
+attribute highp vec2 uv_in;
+
+varying highp vec2 uvpos_var;
+
+void main() {
+
+ gl_Position = vec4(position.xy, 0.0, 1.0);
+ uvpos_var = uv_in;
+}
+)";
+
+static const char *carpet_frag_source =
+ R"(
+#version 100
+@builtin_ext@
+@builtin@
+
+precision highp float;
+
+varying highp vec2 uvpos_var;
+
+uniform float progress;
+uniform int direction;
+
+#define M_PI 3.1415926535897932384626433832795
+
+// Original single roll effect
+vec4 single_roll(vec2 uvpos_var, float progress, int direction)
+{
+ vec4 wfrag;
+ vec2 uv;
+ vec2 uvpos;
+ if (direction == 1) // right
+ {
+ uvpos = vec2(1.0 - uvpos_var.x, uvpos_var.y);
+ } else if (direction == 2) // top
+ {
+ uvpos = vec2(1.0 - uvpos_var.y, uvpos_var.x);
+ } else if (direction == 3) // bottom
+ {
+ uvpos = vec2(uvpos_var.y, uvpos_var.x);
+ } else // left
+ {
+ uvpos = uvpos_var;
+ }
+ float offset = 0.1;
+ float p = progress * 1.2 - 0.2;
+
+ // initial color (transparent)
+ wfrag = vec4(0.0);
+ // get pixel from default position if left of peel line
+ if (uvpos.x < p + offset + 0.05)
+ {
+ if (uvpos_var.x >= 0.0 && uvpos_var.x <= 1.0 &&
+ uvpos_var.y >= 0.0 && uvpos_var.y <= 1.0)
+ {
+ // sample the texture, but only if within 0-1 range to avoid clamping
+ wfrag = get_pixel(uvpos_var);
+ }
+ }
+ // back of roll
+ if (uvpos.x > p + offset + 0.05 && uvpos.x < p + offset + 0.1)
+ {
+ // trigonometric sine
+ float tsin = (uvpos.x - (p + offset + 0.05)) * 20.0;
+ // angle from arcsine
+ float angle = asin(tsin);
+ // compute x sampling coordinate
+ if (direction == 0 || direction == 1)
+ {
+ uv.x = (angle / (M_PI)) * 0.15 + p + offset + 0.05;
+ } else
+ {
+ uv.x = (uvpos.y - 0.5) * pow(cos(angle), 0.02) + 0.5;
+ }
+ // compute y sampling coordinate
+ if (direction == 2 || direction == 3)
+ {
+ uv.y = (angle / (M_PI)) * 0.15 + p + offset + 0.05;
+ } else
+ {
+ uv.y = (uvpos.y - 0.5) * pow(cos(angle), 0.02) + 0.5;
+ }
+ vec4 pfrag = vec4(0.0);
+ if (uv.x >= 0.0 && uv.x <= 1.0 &&
+ uv.y >= 0.0 && uv.y <= 1.0)
+ {
+ // sample the texture, but only if within 0-1 range to avoid clamping
+ if (direction == 1)
+ {
+ pfrag = get_pixel(vec2(1.0 - uv.x, uv.y));
+ } else if (direction == 2)
+ {
+ pfrag = get_pixel(vec2(uv.x, 1.0 - uv.y));
+ } else
+ {
+ pfrag = get_pixel(uv);
+ }
+ }
+ // store color for fragment mixing with current fragment if translucent
+ wfrag = mix(pfrag, wfrag, wfrag.a);
+ }
+ // front of roll
+ if (uvpos.x > p + offset && uvpos.x < p + offset + 0.1)
+ {
+ // trigonometric sine
+ float tsin = (uvpos.x - (p + offset + 0.1)) * 20.0 + 1.0;
+ // angle from arcsine
+ float angle = asin(tsin);
+ // compute x sampling coordinate
+ if (direction == 0 || direction == 1)
+ {
+ uv.x = (angle / (-M_PI)) * 0.1 + p + offset + 0.2;
+ } else
+ {
+ uv.x = (uvpos.y - 0.5) * 0.9 * pow(cos(angle), -0.04) + 0.5;
+ }
+ // compute y sampling coordinate
+ if (direction == 2 || direction == 3)
+ {
+ uv.y = (angle / (-M_PI)) * 0.1 + p + offset + 0.2;
+ } else
+ {
+ uv.y = (uvpos.y - 0.5) * 0.9 * pow(cos(angle), -0.04) + 0.5;
+ }
+ vec4 pfrag = vec4(0.0);
+ if (uv.x >= 0.0 && uv.x <= 1.0 &&
+ uv.y >= 0.0 && uv.y <= 1.0)
+ {
+ // sample the texture, but only if within 0-1 range to avoid clamping
+ if (direction == 1)
+ {
+ pfrag = get_pixel(vec2(1.0 - uv.x, uv.y));
+ } else if (direction == 2)
+ {
+ pfrag = get_pixel(vec2(uv.x, 1.0 - uv.y));
+ } else
+ {
+ pfrag = get_pixel(uv);
+ }
+ }
+ // compute lighting
+ pfrag = vec4(clamp(pfrag.rgb + (angle / -M_PI), 0.0, 1.0), pfrag.a);
+ // store color for fragment mixing with current fragment if translucent
+ wfrag = mix(wfrag, pfrag, pfrag.a);
+ }
+
+ return wfrag;
+}
+
+// Dual scroll effect (both sides rolling toward/from middle) by Phodius
+vec4 dual_scroll(vec2 uvpos_var, float progress, int dir)
+{
+ vec4 wfrag = vec4(0.0);
+ vec2 uv;
+
+ float coord;
+ float other_coord;
+
+ // dir 5 = vertical, dir 4 = horizontal
+ if (dir == 5)
+ {
+ coord = uvpos_var.y;
+ other_coord = uvpos_var.x;
+ }
+ else
+ {
+ coord = uvpos_var.x;
+ other_coord = uvpos_var.y;
+ }
+
+ // Determine which half we're on
+ bool second_half = (coord > 0.5);
+
+ // Map to local coordinate: 0 at middle, 1 at edge
+ float local_coord;
+ if (second_half)
+ {
+ local_coord = (coord - 0.5) * 2.0;
+ }
+ else
+ {
+ local_coord = (0.5 - coord) * 2.0;
+ }
+
+ float offset = 0.1;
+ float p = progress * 1.2 - 0.2;
+
+ // Get pixel from default position if before peel line
+ if (local_coord < p + offset + 0.05)
+ {
+ if (uvpos_var.x >= 0.0 && uvpos_var.x <= 1.0 &&
+ uvpos_var.y >= 0.0 && uvpos_var.y <= 1.0)
+ {
+ wfrag = get_pixel(uvpos_var);
+ }
+ }
+
+ // Back of roll
+ if (local_coord > p + offset + 0.05 && local_coord < p + offset + 0.1)
+ {
+ float tsin = (local_coord - (p + offset + 0.05)) * 20.0;
+ float angle = asin(tsin);
+
+ float local_sample = (angle / M_PI) * 0.15 + p + offset + 0.05;
+
+ float global_sample;
+ if (second_half)
+ {
+ global_sample = 0.5 + local_sample * 0.5;
+ }
+ else
+ {
+ global_sample = 0.5 - local_sample * 0.5;
+ }
+
+ float perp_sample = (other_coord - 0.5) * pow(cos(angle), 0.02) + 0.5;
+
+ if (dir == 5)
+ {
+ uv.y = global_sample;
+ uv.x = perp_sample;
+ }
+ else
+ {
+ uv.x = global_sample;
+ uv.y = perp_sample;
+ }
+
+ vec4 pfrag = vec4(0.0);
+ if (uv.x >= 0.0 && uv.x <= 1.0 && uv.y >= 0.0 && uv.y <= 1.0)
+ {
+ pfrag = get_pixel(uv);
+ }
+ wfrag = mix(pfrag, wfrag, wfrag.a);
+ }
+
+ // Front of roll
+ if (local_coord > p + offset && local_coord < p + offset + 0.1)
+ {
+ float tsin = (local_coord - (p + offset + 0.1)) * 20.0 + 1.0;
+ float angle = asin(tsin);
+
+ float local_sample = (angle / (-M_PI)) * 0.1 + p + offset + 0.2;
+
+ float global_sample;
+ if (second_half)
+ {
+ global_sample = 0.5 + local_sample * 0.5;
+ }
+ else
+ {
+ global_sample = 0.5 - local_sample * 0.5;
+ }
+
+ float perp_sample = (other_coord - 0.5) * 0.9 * pow(cos(angle), -0.04) + 0.5;
+
+ if (dir == 5)
+ {
+ uv.y = global_sample;
+ uv.x = perp_sample;
+ }
+ else
+ {
+ uv.x = global_sample;
+ uv.y = perp_sample;
+ }
+
+ vec4 pfrag = vec4(0.0);
+ if (uv.x >= 0.0 && uv.x <= 1.0 && uv.y >= 0.0 && uv.y <= 1.0)
+ {
+ pfrag = get_pixel(uv);
+ }
+ pfrag = vec4(clamp(pfrag.rgb + (angle / -M_PI), 0.0, 1.0), pfrag.a);
+ wfrag = mix(wfrag, pfrag, pfrag.a);
+ }
+
+ return wfrag;
+}
+
+void main()
+{
+ vec4 wfrag;
+
+ if (direction <= 3)
+ {
+ // single roll: left, right, top, bottom
+ wfrag = single_roll(uvpos_var, progress, direction);
+ }
+ else
+ {
+ // dual scroll: horizontal or vertical from middle
+ wfrag = dual_scroll(uvpos_var, progress, direction);
+ }
+
+ gl_FragColor = wfrag;
+}
+)";
+
+namespace wf
+{
+namespace carpet
+{
+using namespace wf::scene;
+using namespace wf::animate;
+using namespace wf::animation;
+
+static std::string carpet_transformer_name = "animation-carpet";
+
+wf::option_wrapper_t carpet_roll_direction{"extra-animations/carpet_roll_direction"};
+
+class carpet_transformer : public wf::scene::view_2d_transformer_t
+{
+ public:
+ wayfire_view view;
+ wf::output_t *output;
+ OpenGL::program_t program;
+ wf::auxilliary_buffer_t buffer;
+ duration_t progression;
+
+ class simple_node_render_instance_t : public wf::scene::transformer_render_instance_t
+ {
+ wf::signal::connection_t on_node_damaged =
+ [=] (node_damage_signal *ev)
+ {
+ push_to_parent(ev->region);
+ };
+
+ carpet_transformer *self;
+ wayfire_view view;
+ damage_callback push_to_parent;
+
+ public:
+ simple_node_render_instance_t(carpet_transformer *self, damage_callback push_damage,
+ wayfire_view view) : wf::scene::transformer_render_instance_t(self,
+ push_damage,
+ view->get_output())
+ {
+ this->self = self;
+ this->view = view;
+ this->push_to_parent = push_damage;
+ self->connect(&on_node_damaged);
+ }
+
+ ~simple_node_render_instance_t()
+ {}
+
+ void schedule_instructions(
+ std::vector& instructions,
+ const wf::render_target_t& target, wf::regionf_t& damage) override
+ {
+ instructions.push_back(render_instruction_t{
+ .instance = this,
+ .target = target,
+ .damage = damage & self->get_bounding_box(),
+ });
+ }
+
+ void transform_damage_region(wf::regionf_t& damage) override
+ {
+ damage |= self->get_bounding_box();
+ }
+
+ void render(const wf::scene::render_instruction_t& data) override
+ {
+ auto bb = self->get_children_bounding_box();
+ auto pbb = self->get_padded_bounding_box();
+ auto tex = wf::gles_texture_t{get_texture(1.0)};
+
+ const float vertices[] = {
+ -1.0, -1.0,
+ 1.0f, -1.0,
+ 1.0f, 1.0f,
+ -1.0, 1.0f
+ };
+ wf::pointf_t offset1{-float(bb.x - pbb.x) / bb.width,
+ -float(pbb.height - ((bb.y - pbb.y) + bb.height)) / bb.height};
+ wf::pointf_t offset2{float(pbb.width) / bb.width + offset1.x,
+ float(pbb.height) / bb.height + offset1.y};
+ const float uv[] = {
+ float(offset1.x), float(offset2.y),
+ float(offset2.x), float(offset2.y),
+ float(offset2.x), float(offset1.y),
+ float(offset1.x), float(offset1.y),
+ };
+ auto progress = self->progression.progress();
+
+ data.pass->custom_gles_subpass([&]
+ {
+ self->buffer.allocate({int(pbb.width), int(pbb.height)});
+ wf::gles::bind_render_buffer(self->buffer.get_renderbuffer());
+ wf::gles_texture_t final_tex{self->buffer.get_texture()};
+ OpenGL::clear(wf::color_t{0.0, 0.0, 0.0, 0.0}, GL_COLOR_BUFFER_BIT);
+ self->program.use(wf::TEXTURE_TYPE_RGBA);
+ self->program.attrib_pointer("position", 2, 0, vertices);
+ self->program.attrib_pointer("uv_in", 2, 0, uv);
+ self->program.uniform1f("progress", progress);
+ self->program.uniform1i("direction", carpet_roll_direction);
+
+ self->program.set_active_texture(tex);
+ GL_CALL(glDrawArrays(GL_TRIANGLE_FAN, 0, 4));
+
+ wf::gles::bind_render_buffer(data.target);
+ for (auto box : data.damage)
+ {
+ wf::gles::render_target_logic_scissor(data.target, box);
+ OpenGL::render_transformed_texture(final_tex, pbb,
+ wf::gles::render_target_orthographic_projection(data.target),
+ glm::vec4(1.0, 1.0, 1.0, 1.0), 0);
+ }
+
+ GL_CALL(glBindTexture(GL_TEXTURE_2D, 0));
+ self->program.deactivate();
+ self->buffer.free();
+ });
+ }
+ };
+
+ carpet_transformer(wayfire_view view, wf::geometry_t bbox,
+ wf::animation_description_t duration) : wf::scene::view_2d_transformer_t(view)
+ {
+ this->view = view;
+ this->progression = duration_t{wf::create_option(duration)};
+ if (view->get_output())
+ {
+ output = view->get_output();
+ output->render->add_effect(&pre_hook, wf::OUTPUT_EFFECT_PRE);
+ }
+
+ wf::gles::run_in_context([&]
+ {
+ program.compile(carpet_vert_source, carpet_frag_source);
+ });
+ }
+
+ wf::geometry_t get_padded_bounding_box()
+ {
+ auto box = this->get_children_bounding_box();
+ auto padding = (box.width > box.height ? box.width : box.height) * 0.07;
+ box.x -= padding;
+ box.y -= padding;
+ box.width += padding * 2;
+ box.height += padding * 2;
+ return box;
+ }
+
+ wf::effect_hook_t pre_hook = [=] ()
+ {
+ output->render->damage(this->get_bounding_box());
+ };
+
+ void gen_render_instances(std::vector& instances,
+ damage_callback push_damage, wf::output_t *shown_on) override
+ {
+ instances.push_back(std::make_unique(
+ this, push_damage, view));
+ }
+
+ void init_animation(bool carpet)
+ {
+ if (carpet)
+ {
+ this->progression.reverse();
+ }
+
+ this->progression.start();
+ }
+
+ virtual ~carpet_transformer()
+ {
+ if (output)
+ {
+ output->render->rem_effect(&pre_hook);
+ }
+
+ wf::gles::run_in_context_if_gles([&]
+ {
+ program.free_resources();
+ });
+ }
+};
+
+class carpet_animation : public animation_base_t
+{
+ wayfire_view view;
+
+ public:
+ void init(wayfire_view view, wf::animation_description_t dur, animation_type type) override
+ {
+ this->view = view;
+ pop_transformer(view);
+ auto bbox = view->get_transformed_node()->get_bounding_box();
+ auto tmgr = view->get_transformed_node();
+ auto node = std::make_shared(view, bbox, dur);
+ tmgr->add_transformer(node, wf::TRANSFORMER_HIGHLEVEL + 1, carpet_transformer_name);
+ node->init_animation(type & WF_ANIMATE_HIDING_ANIMATION);
+ }
+
+ void pop_transformer(wayfire_view view)
+ {
+ if (view->get_transformed_node()->get_transformer(carpet_transformer_name))
+ {
+ view->get_transformed_node()->rem_transformer(carpet_transformer_name);
+ }
+ }
+
+ bool step() override
+ {
+ if (!view)
+ {
+ return false;
+ }
+
+ auto tmgr = view->get_transformed_node();
+ if (!tmgr)
+ {
+ return false;
+ }
+
+ if (auto tr =
+ tmgr->get_transformer(carpet_transformer_name))
+ {
+ auto running = tr->progression.running();
+ if (!running)
+ {
+ pop_transformer(view);
+ return false;
+ }
+
+ return running;
+ }
+
+ return false;
+ }
+
+ void reverse() override
+ {
+ if (auto tr =
+ view->get_transformed_node()->get_transformer(
+ carpet_transformer_name))
+ {
+ tr->progression.reverse();
+ }
+ }
+};
+}
+}
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/extra-animations/dodge.hpp wayfire-plugins-extra/src/extra-animations/dodge.hpp
--- wayfire-plugins-extra-0.10.0/src/extra-animations/dodge.hpp 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/src/extra-animations/dodge.hpp 2026-08-01 16:00:35.434368211 -0600
@@ -0,0 +1,550 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2025 Scott Moreau
+ * Copyright (c) 2025 Andrew Pliatsikas
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#pragma once
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace wf
+{
+namespace dodge
+{
+static std::string dodge_transformer_name = "dodge";
+
+struct dodge_view_data
+{
+ wayfire_view view;
+ wf::geometry_t from_bb, to_bb;
+ std::shared_ptr transformer;
+ wf::pointf_t direction;
+};
+
+bool boxes_intersect(const wayfire_view & a, const wayfire_view & b)
+{
+ auto ao = a->get_output();
+ auto bo = b->get_output();
+ if (!ao || !bo || (ao != bo))
+ {
+ return false;
+ }
+
+ auto a_bb = wf::toplevel_cast(a)->get_geometry();
+ auto b_bb = wf::toplevel_cast(b)->get_geometry();
+ return !(b_bb.x > a_bb.x + a_bb.width ||
+ a_bb.x > b_bb.x + b_bb.width ||
+ b_bb.y > a_bb.y + a_bb.height ||
+ a_bb.y > b_bb.y + b_bb.height);
+}
+
+class wayfire_dodge
+{
+ std::vector views_from;
+ std::list minimized_views;
+ wayfire_view view_to, last_focused_view;
+ wf::option_wrapper_t dodge_zoom{"extra-animations/dodge_zoom"};
+ wf::option_wrapper_t dodge_rotate{"extra-animations/dodge_rotate"};
+ wf::option_wrapper_t direction{"extra-animations/dodge_direction"};
+ wf::option_wrapper_t animation_duration{"extra-animations/dodge_duration"};
+ wf::animation::simple_animation_t progression{animation_duration};
+ bool view_to_focused;
+ wf::output_t *view_to_output;
+ bool hook_set = false;
+ bool view_unminimized = false;
+ bool from_mapped_event = false;
+ bool from_unmapped_event = false;
+ std::vector outputs;
+
+ public:
+ void init()
+ {
+ wf::get_core().connect(&view_mapped);
+ wf::get_core().connect(&view_unmapped);
+ this->progression.set(0, 0);
+ for (auto& view : wf::get_core().get_all_views())
+ {
+ if (wf::toplevel_cast(view))
+ {
+ view->connect(&view_activated);
+ view->get_output()->connect(&view_minimize_request);
+ if (std::find_if(outputs.begin(), outputs.end(), [=] (wf::output_t*& o)
+ {
+ return view->get_output() == o;
+ }) == outputs.end())
+ {
+ outputs.push_back(view->get_output());
+ }
+ }
+ }
+
+ for (auto output : outputs)
+ {
+ output->connect(&view_minimize_request);
+ }
+ }
+
+ wf::signal::connection_t view_minimize_request =
+ [=] (wf::view_minimize_request_signal *ev)
+ {
+ if (ev->state)
+ {
+ minimized_views.push_back(ev->view);
+ } else
+ {
+ minimized_views.remove(ev->view);
+ view_unminimized = true;
+ wf::view_activated_state_signal data;
+ data.view = ev->view;
+ view_activated.emit(&data);
+ }
+ };
+
+ wf::signal::connection_t view_activated =
+ [=] (wf::view_activated_state_signal *ev)
+ {
+ if (ev->view == wf::get_core().seat->get_active_view())
+ {
+ last_focused_view = wf::get_core().seat->get_active_view();
+ if (!from_mapped_event)
+ {
+ return;
+ }
+ }
+
+ if (from_unmapped_event)
+ {
+ from_unmapped_event = false;
+ return;
+ }
+
+ view_to = ev->view;
+
+ auto toplevel = wf::toplevel_cast(view_to);
+ if (!toplevel)
+ {
+ return;
+ }
+
+ if (!last_focused_view || !view_to || !view_to->is_mapped() ||
+ toplevel->parent)
+ {
+ return;
+ }
+
+ auto to_bb = toplevel->get_geometry();
+
+ if (from_mapped_event)
+ {
+ view_bring_to_front(view_to);
+ }
+
+ /* Find overlapping views */
+ std::vector overlapping_views;
+ auto all_views = wf::get_core().get_all_views();
+ std::sort(all_views.begin(), all_views.end(), [] (const wayfire_view& a, const wayfire_view& b)
+ {
+ return wf::get_focus_timestamp(a) < wf::get_focus_timestamp(b);
+ });
+ for (auto& view : all_views)
+ {
+ if (!view || !view->is_mapped())
+ {
+ continue;
+ }
+
+ toplevel = wf::toplevel_cast(view);
+ if (!toplevel)
+ {
+ continue;
+ }
+
+ if ((wf::get_focus_timestamp(view_to) < wf::get_focus_timestamp(view)) ||
+ ((from_mapped_event || view_unminimized) &&
+ (wf::get_focus_timestamp(view_to) > wf::get_focus_timestamp(view))))
+ {
+ if ((boxes_intersect(view, view_to) || from_mapped_event ||
+ view->get_transformed_node()->get_transformer(
+ dodge_transformer_name)) &&
+ (std::find_if(minimized_views.begin(), minimized_views.end(),
+ [view] (const wayfire_view& v) { return v == view; }) == minimized_views.end()))
+ {
+ overlapping_views.push_back(view);
+ view_bring_to_front(view);
+ }
+ }
+
+ if (!from_mapped_event)
+ {
+ view_bring_to_front(view);
+ }
+ }
+
+ view_unminimized = false;
+
+ if (overlapping_views.empty())
+ {
+ return;
+ }
+
+ if (!hook_set)
+ {
+ view_to_output = view_to->get_output();
+ view_to_output->render->add_effect(&dodge_animation_hook, wf::OUTPUT_EFFECT_PRE);
+ hook_set = true;
+ }
+
+ view_to_focused = false;
+ if (!this->progression.running())
+ {
+ views_from.clear();
+ this->progression.animate(0, 1);
+ }
+
+ for (size_t i = 0; i < overlapping_views.size(); i++)
+ {
+ dodge_view_data view_data;
+ view_data.view = overlapping_views[i];
+
+ view_data.from_bb = view_data.view->get_bounding_box();
+ view_data.to_bb = view_to->get_bounding_box();
+
+ bool view_found = false;
+ for (auto vd : views_from)
+ {
+ if (vd.view == view_data.view)
+ {
+ view_found = true;
+ if (dodge_rotate && from_mapped_event)
+ {
+ auto direction = compute_direction(view_data.from_bb, to_bb);
+ vd.direction.x = direction.x;
+ vd.direction.y = direction.y;
+ vd.transformer->angle = 0.1;
+ }
+
+ break;
+ }
+ }
+
+ if (view_found)
+ {
+ continue;
+ }
+
+ if (auto tr =
+ view_data.view->get_transformed_node()->get_transformer(
+ dodge_transformer_name))
+ {
+ view_data.transformer = tr;
+ if (dodge_rotate && from_mapped_event)
+ {
+ view_data.transformer->angle = 0.1;
+ }
+ } else
+ {
+ view_data.transformer = std::make_shared(view_data.view);
+ view_data.view->get_transformed_node()->add_transformer(view_data.transformer,
+ wf::TRANSFORMER_2D,
+ dodge_transformer_name);
+ auto d = compute_direction(view_data.from_bb, to_bb);
+ view_data.direction.x = d.x;
+ view_data.direction.y = d.y;
+
+ auto & x = view_data.direction.x;
+ auto & y = view_data.direction.y;
+ if ((((x < 0.001) && (x > -0.001)) && ((y < 0.001) && (y > -0.001))) || std::isnan(x) ||
+ std::isnan(y))
+ {
+ if ((std::string(direction) == "cardinal") || (std::string(direction) == "diagonal"))
+ {
+ srand(wf::get_current_time() + rand());
+ x = (rand() % 2) * 2 - 1;
+ srand(wf::get_current_time() + rand());
+ y = (rand() % 2) * 2 - 1;
+ } else if (std::string(direction) == "circular")
+ {
+ srand(wf::get_current_time() + rand());
+ x = (double(rand()) / RAND_MAX) * 2.0 - 1.0;
+ srand(wf::get_current_time() + rand());
+ y = (double(rand()) / RAND_MAX) * 2.0 - 1.0;
+ }
+ }
+
+ if (dodge_rotate)
+ {
+ view_data.transformer->angle = 0.1;
+ }
+ }
+
+ views_from.push_back(view_data);
+ }
+
+ from_mapped_event = false;
+ };
+
+ wf::signal::connection_t view_mapped =
+ [=] (wf::view_mapped_signal *ev)
+ {
+ from_mapped_event = true;
+ ev->view->connect(&view_activated);
+ if (std::find_if(outputs.begin(), outputs.end(), [=] (wf::output_t*& o)
+ {
+ return ev->view->get_output() == o;
+ }) == outputs.end())
+ {
+ ev->view->get_output()->connect(&view_minimize_request);
+ outputs.push_back(ev->view->get_output());
+ }
+ };
+
+ wf::signal::connection_t view_unmapped =
+ [=] (wf::view_unmapped_signal *ev)
+ {
+ from_unmapped_event = true;
+ last_focused_view = wf::get_core().seat->get_active_view();
+ if (ev->view == view_to)
+ {
+ view_bring_to_front(view_to);
+ view_to = nullptr;
+ }
+
+ if (ev->view == last_focused_view)
+ {
+ last_focused_view = nullptr;
+ }
+
+ views_from.erase(std::remove_if(views_from.begin(), views_from.end(),
+ [ev] (const dodge_view_data& data)
+ {
+ return data.view == ev->view;
+ }), views_from.end());
+ };
+
+ double magnitude(int x, int y)
+ {
+ return std::sqrt(x * x + y * y);
+ }
+
+ wf::pointf_t compute_direction(wf::geometry_t from_bb, wf::geometry_t to_bb)
+ {
+ auto from_center = wf::pointf_t{from_bb.x + from_bb.width / 2, from_bb.y + from_bb.height / 2};
+ auto to_center = wf::pointf_t{to_bb.x + to_bb.width / 2, to_bb.y + to_bb.height / 2};
+ auto x = double(from_center.x - to_center.x);
+ auto y = double(from_center.y - to_center.y);
+ auto m = magnitude(x, y);
+ if (m == 0)
+ {
+ return wf::pointf_t{0, 0};
+ }
+
+ x /= m;
+ y /= m;
+ if (std::string(direction) != "circular")
+ {
+ x = x * std::abs(1.0 / x);
+ y = y * std::abs(1.0 / y);
+ }
+
+ return wf::pointf_t{x, y};
+ }
+
+ void damage_views()
+ {
+ for (auto& view_data : views_from)
+ {
+ view_data.view->damage();
+ }
+
+ if (view_to)
+ {
+ view_to->damage();
+ }
+ }
+
+ void finish_animation()
+ {
+ for (auto& view : wf::get_core().get_all_views())
+ {
+ view->get_transformed_node()->rem_transformer(dodge_transformer_name);
+ }
+
+ if (hook_set)
+ {
+ view_to_output->render->rem_effect(&dodge_animation_hook);
+ hook_set = false;
+ }
+
+ views_from.clear();
+ view_to = nullptr;
+ }
+
+ bool step_animation()
+ {
+ if (!view_to)
+ {
+ return false;
+ }
+
+ double progress = progression.progress();
+ progress = (1.0 - progress) * (1.0 - progress);
+ progress = 1.0 - progress;
+
+ std::shared_ptr view_to_transformer;
+ if (std::find_if(minimized_views.begin(), minimized_views.end(), [&] (const wayfire_view& v)
+ {
+ return v == last_focused_view;
+ }) == minimized_views.end())
+ {
+ if (auto tr =
+ view_to->get_transformed_node()->get_transformer(
+ dodge_transformer_name))
+ {
+ view_to_transformer = tr;
+ } else
+ {
+ view_to_transformer = std::make_shared(view_to);
+ view_to->get_transformed_node()->add_transformer(view_to_transformer, wf::TRANSFORMER_2D,
+ dodge_transformer_name);
+ }
+ } else
+ {
+ view_to_focused = true;
+ }
+
+ if (dodge_zoom && view_to_transformer)
+ {
+ view_to_transformer->scale_x = view_to_transformer->scale_y = 1.0 + std::sin(
+ progression.progress() * M_PI) * 0.02;
+ }
+
+ for (auto& view_data : views_from)
+ {
+ auto to_bb = view_data.to_bb;
+ auto from_bb = view_data.from_bb;
+ double move_dist_x = std::min(from_bb.x + from_bb.width - to_bb.x,
+ to_bb.x + to_bb.width - from_bb.x);
+ double move_dist_y = std::min(from_bb.y + from_bb.height - to_bb.y,
+ to_bb.y + to_bb.height - from_bb.y);
+
+ if (dodge_zoom)
+ {
+ if (view_data.transformer->scale_x <= 1.0)
+ {
+ view_data.transformer->scale_x = view_data.transformer->scale_y = 1.0 - std::sin(
+ progression.progress() * M_PI) * 0.25;
+ } else
+ {
+ view_data.transformer->scale_x = view_data.transformer->scale_y = 1.0 + std::sin(
+ progression.progress() * M_PI) * 0.02;
+ }
+ }
+
+ if (dodge_rotate && (view_data.transformer->angle != 0.0))
+ {
+ view_data.transformer->angle = progress * M_PI * 2 * (view_data.direction.x > 0 ? 1 : -1);
+ if (view_data.transformer->angle == 0.0)
+ {
+ view_data.transformer->angle = 0.1;
+ }
+ }
+
+ if (std::string(direction) == "cardinal")
+ {
+ if (move_dist_x < move_dist_y)
+ {
+ move_dist_y = 0;
+ } else
+ {
+ move_dist_x = 0;
+ }
+ } else if (std::string(direction) == "circular")
+ {
+ auto direction_x = std::abs(view_data.direction.x);
+ auto direction_y = std::abs(view_data.direction.y);
+ if (direction_x < direction_y)
+ {
+ move_dist_x *= direction_x;
+ auto& y = view_data.direction.y;
+ y = y * std::abs(1.0 / y);
+ } else
+ {
+ move_dist_y *= direction_y;
+ auto& x = view_data.direction.x;
+ x = x * std::abs(1.0 / x);
+ }
+ }
+
+ double move_x = move_dist_x * view_data.direction.x;
+ double move_y = move_dist_y * view_data.direction.y;
+
+ view_data.transformer->translation_x = std::sin(progress * M_PI) * move_x;
+ view_data.transformer->translation_y = std::sin(progress * M_PI) * move_y;
+ }
+
+ if ((progress > 0.5) && !view_to_focused)
+ {
+ wf::get_core().seat->focus_view(view_to);
+ view_bring_to_front(view_to);
+ view_to_focused = true;
+ }
+
+ return progression.running();
+ }
+
+ wf::effect_hook_t dodge_animation_hook = [=] ()
+ {
+ damage_views();
+ bool result = step_animation();
+ damage_views();
+
+ if (!result)
+ {
+ finish_animation();
+ }
+ };
+
+ void fini()
+ {
+ finish_animation();
+ view_mapped.disconnect();
+ view_unmapped.disconnect();
+ view_activated.disconnect();
+ }
+};
+}
+}
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/extra-animations/helix.hpp wayfire-plugins-extra/src/extra-animations/helix.hpp
--- wayfire-plugins-extra-0.10.0/src/extra-animations/helix.hpp 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/src/extra-animations/helix.hpp 2026-08-01 16:00:35.434368211 -0600
@@ -82,15 +82,9 @@ using namespace wf::animation;
static std::string transformer_name = "animation-helix";
-wf::option_wrapper_t helix_duration{"extra-animations/helix_duration"};
wf::option_wrapper_t helix_strip_height{"extra-animations/helix_strip_height"};
wf::option_wrapper_t helix_rotations{"extra-animations/helix_rotations"};
-class helix_animation_t : public duration_t
-{
- public:
- using duration_t::duration_t;
-};
class helix_transformer : public wf::scene::view_2d_transformer_t
{
public:
@@ -98,7 +92,7 @@ class helix_transformer : public wf::sce
OpenGL::program_t program;
wf::output_t *output;
wf::geometry_t animation_geometry;
- helix_animation_t progression{helix_duration};
+ duration_t progression;
class simple_node_render_instance_t : public wf::scene::transformer_render_instance_t
{
@@ -129,7 +123,7 @@ class helix_transformer : public wf::sce
void schedule_instructions(
std::vector& instructions,
- const wf::render_target_t& target, wf::region_t& damage) override
+ const wf::render_target_t& target, wf::regionf_t& damage) override
{
instructions.push_back(render_instruction_t{
.instance = this,
@@ -138,9 +132,9 @@ class helix_transformer : public wf::sce
});
}
- void transform_damage_region(wf::region_t& damage) override
+ void transform_damage_region(wf::regionf_t& damage) override
{
- damage |= wf::region_t{self->animation_geometry};
+ damage |= self->animation_geometry;
}
void render(const wf::scene::render_instruction_t& data) override
@@ -165,9 +159,9 @@ class helix_transformer : public wf::sce
auto y = src_box.height - i;
auto inv_h = 1.0 / src_box.height;
uv.push_back(0.0);
- uv.push_back(std::max(0, y - line_height) * inv_h);
+ uv.push_back(std::max(0.0, y - line_height) * inv_h);
uv.push_back(1.0);
- uv.push_back(std::max(0, y - line_height) * inv_h);
+ uv.push_back(std::max(0.0, y - line_height) * inv_h);
uv.push_back(0.0);
uv.push_back(y * inv_h);
uv.push_back(1.0);
@@ -175,7 +169,7 @@ class helix_transformer : public wf::sce
uv.push_back(0.0);
uv.push_back(y * inv_h);
uv.push_back(1.0);
- uv.push_back(std::max(0, y - line_height) * inv_h);
+ uv.push_back(std::max(0.0, y - line_height) * inv_h);
glm::vec4 v, r;
glm::mat4 m(1.0);
m = glm::rotate(m, float(M_PI), glm::vec3(1.0, 0.0, 0.0));
@@ -237,7 +231,7 @@ class helix_transformer : public wf::sce
wf::gles::bind_render_buffer(data.target);
for (auto box : data.damage)
{
- wf::gles::render_target_logic_scissor(data.target, wlr_box_from_pixman_box(box));
+ wf::gles::render_target_logic_scissor(data.target, box);
self->program.use(wf::TEXTURE_TYPE_RGBA);
self->program.uniformMatrix4f("matrix", transform);
self->program.attrib_pointer("position", 3, 0, vertices.data());
@@ -249,9 +243,11 @@ class helix_transformer : public wf::sce
}
};
- helix_transformer(wayfire_view view, wf::geometry_t bbox) : wf::scene::view_2d_transformer_t(view)
+ helix_transformer(wayfire_view view, wf::geometry_t bbox,
+ wf::animation_description_t duration) : wf::scene::view_2d_transformer_t(view)
{
this->view = view;
+ this->progression = duration_t{wf::create_option(duration)};
if (view->get_output())
{
output = view->get_output();
@@ -318,7 +314,7 @@ class helix_animation : public animation
pop_transformer(view);
auto bbox = view->get_transformed_node()->get_bounding_box();
auto tmgr = view->get_transformed_node();
- auto node = std::make_shared(view, bbox);
+ auto node = std::make_shared(view, bbox, dur);
tmgr->add_transformer(node, wf::TRANSFORMER_HIGHLEVEL + 1, transformer_name);
node->init_animation(type & WF_ANIMATE_HIDING_ANIMATION);
}
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/extra-animations/melt.hpp wayfire-plugins-extra/src/extra-animations/melt.hpp
--- wayfire-plugins-extra-0.10.0/src/extra-animations/melt.hpp 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/src/extra-animations/melt.hpp 2026-08-01 16:00:35.434368211 -0600
@@ -22,9 +22,12 @@
* SOFTWARE.
*/
+#include
#include
#include
#include
+#include
+#include
static const char *melt_vert_source =
@@ -53,10 +56,11 @@ precision highp float;
varying highp vec2 uvpos;
uniform float time;
+uniform float random;
uniform float distortion;
float rand(vec2 n) {
- return fract(sin(dot(n, vec2(12.9898, 4.1414))) * 43758.5453);
+ return fract(sin(dot(n, vec2(12.9898, 4.1414))) * 43758.5453 * random);
}
// Noise function from: https://gist.github.com/patriciogonzalezvivo/670c22f3966e662d2f83
@@ -95,22 +99,17 @@ using namespace wf::animation;
static std::string melt_transformer_name = "animation-melt";
-wf::option_wrapper_t melt_duration{"extra-animations/melt_duration"};
wf::option_wrapper_t melt_distortion_factor{"extra-animations/melt_distortion_factor"};
-class melt_animation_t : public duration_t
-{
- public:
- using duration_t::duration_t;
-};
class melt_transformer : public wf::scene::view_2d_transformer_t
{
public:
wayfire_view view;
+ float random_number;
wf::output_t *output;
OpenGL::program_t program;
wf::auxilliary_buffer_t buffer;
- melt_animation_t progression{melt_duration};
+ duration_t progression;
class simple_node_render_instance_t : public wf::scene::transformer_render_instance_t
{
@@ -141,7 +140,7 @@ class melt_transformer : public wf::scen
void schedule_instructions(
std::vector& instructions,
- const wf::render_target_t& target, wf::region_t& damage) override
+ const wf::render_target_t& target, wf::regionf_t& damage) override
{
instructions.push_back(render_instruction_t{
.instance = this,
@@ -150,14 +149,14 @@ class melt_transformer : public wf::scen
});
}
- void transform_damage_region(wf::region_t& damage) override
+ void transform_damage_region(wf::regionf_t& damage) override
{
damage |= self->get_padded_bounding_box();
}
void render(const wf::scene::render_instruction_t& data) override
{
- auto bb = self->get_bounding_box();
+ auto bb = self->get_children_bounding_box();
auto pbb = self->get_padded_bounding_box();
auto tex = wf::gles_texture_t{get_texture(1.0)};
@@ -181,7 +180,7 @@ class melt_transformer : public wf::scen
data.pass->custom_gles_subpass([&]
{
- self->buffer.allocate({pbb.width, pbb.height});
+ self->buffer.allocate({int(pbb.width), int(pbb.height)});
wf::gles::bind_render_buffer(self->buffer.get_renderbuffer());
wf::gles_texture_t final_tex{self->buffer.get_texture()};
OpenGL::clear(wf::color_t{0.0, 0.0, 0.0, 0.0}, GL_COLOR_BUFFER_BIT);
@@ -189,6 +188,7 @@ class melt_transformer : public wf::scen
self->program.attrib_pointer("position", 2, 0, vertices);
self->program.attrib_pointer("uv_in", 2, 0, uv);
self->program.uniform1f("time", progress);
+ self->program.uniform1f("random", self->random_number);
self->program.uniform1f("distortion", float(melt_distortion_factor));
self->program.set_active_texture(tex);
GL_CALL(glDrawArrays(GL_TRIANGLE_FAN, 0, 4));
@@ -196,7 +196,7 @@ class melt_transformer : public wf::scen
wf::gles::bind_render_buffer(data.target);
for (auto box : data.damage)
{
- wf::gles::render_target_logic_scissor(data.target, wlr_box_from_pixman_box(box));
+ wf::gles::render_target_logic_scissor(data.target, box);
OpenGL::render_transformed_texture(final_tex, pbb,
wf::gles::render_target_orthographic_projection(data.target),
glm::vec4(1.0, 1.0, 1.0, 1.0 / (1.0 + pow(2.718, -(progress * 15.0 - 3.0)))), 0);
@@ -209,9 +209,11 @@ class melt_transformer : public wf::scen
}
};
- melt_transformer(wayfire_view view, wf::geometry_t bbox) : wf::scene::view_2d_transformer_t(view)
+ melt_transformer(wayfire_view view, wf::geometry_t bbox,
+ wf::animation_description_t duration) : wf::scene::view_2d_transformer_t(view)
{
this->view = view;
+ this->progression = duration_t{wf::create_option(duration)};
if (view->get_output())
{
output = view->get_output();
@@ -222,12 +224,15 @@ class melt_transformer : public wf::scen
{
program.compile(melt_vert_source, melt_frag_source);
});
+
+ srand(wf::get_current_time());
+ this->random_number = (rand() % 1000000) / 1000000.0;
}
wf::geometry_t get_padded_bounding_box()
{
auto box = this->get_children_bounding_box();
- auto padding = 100;
+ auto padding = 50;
box.x -= padding;
box.y -= padding;
box.width += padding * 2;
@@ -282,7 +287,7 @@ class melt_animation : public animation_
pop_transformer(view);
auto bbox = view->get_transformed_node()->get_bounding_box();
auto tmgr = view->get_transformed_node();
- auto node = std::make_shared(view, bbox);
+ auto node = std::make_shared(view, bbox, dur);
tmgr->add_transformer(node, wf::TRANSFORMER_HIGHLEVEL + 1, melt_transformer_name);
node->init_animation(type & WF_ANIMATE_HIDING_ANIMATION);
}
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/extra-animations/plugin.cpp wayfire-plugins-extra/src/extra-animations/plugin.cpp
--- wayfire-plugins-extra-0.10.0/src/extra-animations/plugin.cpp 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/src/extra-animations/plugin.cpp 2026-08-01 16:00:35.434368211 -0600
@@ -32,10 +32,23 @@
#include "shatter.hpp"
#include "vortex.hpp"
#include "melt.hpp"
+#include "dodge.hpp"
+#include "burn.hpp"
+#include "carpet.hpp"
class wayfire_extra_animations : public wf::plugin_interface_t
{
wf::shared_data::ref_ptr_t effects_registry;
+ wf::option_wrapper_t dodge_toggle{"extra-animations/dodge_toggle"};
+ wf::option_wrapper_t blinds_duration{"extra-animations/blinds_duration"};
+ wf::option_wrapper_t helix_duration{"extra-animations/helix_duration"};
+ wf::option_wrapper_t shatter_duration{"extra-animations/shatter_duration"};
+ wf::option_wrapper_t vortex_duration{"extra-animations/vortex_duration"};
+ wf::option_wrapper_t melt_duration{"extra-animations/melt_duration"};
+ wf::option_wrapper_t burn_duration{"extra-animations/burn_duration"};
+ wf::option_wrapper_t carpet_roll_duration{
+ "extra-animations/carpet_roll_duration"};
+ std::unique_ptr dodge_plugin;
public:
void init() override
@@ -48,24 +61,47 @@ class wayfire_extra_animations : public
effects_registry->register_effect("blinds", wf::animate::effect_description_t{
.generator = [] { return std::make_unique(); },
- .default_duration = [=] { return wf::blinds::blinds_duration.value(); },
+ .default_duration = [=] { return blinds_duration.value(); },
});
effects_registry->register_effect("helix", wf::animate::effect_description_t{
.generator = [] { return std::make_unique(); },
- .default_duration = [=] { return wf::helix::helix_duration.value(); },
+ .default_duration = [=] { return helix_duration.value(); },
});
effects_registry->register_effect("shatter", wf::animate::effect_description_t{
.generator = [] { return std::make_unique(); },
- .default_duration = [=] { return wf::shatter::shatter_duration.value(); },
+ .default_duration = [=] { return shatter_duration.value(); },
});
effects_registry->register_effect("vortex", wf::animate::effect_description_t{
.generator = [] { return std::make_unique(); },
- .default_duration = [=] { return wf::vortex::vortex_duration.value(); },
+ .default_duration = [=] { return vortex_duration.value(); },
});
effects_registry->register_effect("melt", wf::animate::effect_description_t{
.generator = [] { return std::make_unique(); },
- .default_duration = [=] { return wf::melt::melt_duration.value(); },
+ .default_duration = [=] { return melt_duration.value(); },
});
+ effects_registry->register_effect("burn", wf::animate::effect_description_t{
+ .generator = [] { return std::make_unique(); },
+ .default_duration = [=] { return burn_duration.value(); },
+ });
+ effects_registry->register_effect("carpet", wf::animate::effect_description_t{
+ .generator = [] { return std::make_unique(); },
+ .default_duration = [=] { return carpet_roll_duration.value(); },
+ });
+ dodge_toggle.set_callback([=] {dodge_option_changed();});
+ dodge_option_changed();
+ }
+
+ void dodge_option_changed()
+ {
+ if (dodge_toggle && !dodge_plugin)
+ {
+ dodge_plugin = std::make_unique();
+ dodge_plugin->init();
+ } else if (!dodge_toggle && dodge_plugin)
+ {
+ dodge_plugin->fini();
+ dodge_plugin.reset();
+ }
}
void fini() override
@@ -75,6 +111,14 @@ class wayfire_extra_animations : public
effects_registry->unregister_effect("shatter");
effects_registry->unregister_effect("vortex");
effects_registry->unregister_effect("melt");
+ effects_registry->unregister_effect("burn");
+ effects_registry->unregister_effect("carpet");
+
+ if (dodge_plugin)
+ {
+ dodge_plugin->fini();
+ dodge_plugin.reset();
+ }
}
};
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/extra-animations/shatter.hpp wayfire-plugins-extra/src/extra-animations/shatter.hpp
--- wayfire-plugins-extra-0.10.0/src/extra-animations/shatter.hpp 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/src/extra-animations/shatter.hpp 2026-08-01 16:00:35.434368211 -0600
@@ -89,14 +89,6 @@ using namespace wf::animation;
static std::string shatter_transformer_name = "animation-shatter";
-wf::option_wrapper_t shatter_duration{"extra-animations/shatter_duration"};
-
-class shatter_animation_t : public duration_t
-{
- public:
- using duration_t::duration_t;
- timed_transition_t shatter{*this};
-};
class shatter_transformer : public wf::scene::view_2d_transformer_t
{
public:
@@ -104,7 +96,7 @@ class shatter_transformer : public wf::s
OpenGL::program_t program;
wf::output_t *output;
wf::geometry_t animation_geometry;
- shatter_animation_t progression{shatter_duration};
+ duration_t progression;
voronoi_diagram vd;
std::vector rotations;
std::vector> points;
@@ -138,7 +130,7 @@ class shatter_transformer : public wf::s
void schedule_instructions(
std::vector& instructions,
- const wf::render_target_t& target, wf::region_t& damage) override
+ const wf::render_target_t& target, wf::regionf_t& damage) override
{
instructions.push_back(render_instruction_t{
.instance = this,
@@ -147,9 +139,9 @@ class shatter_transformer : public wf::s
});
}
- void transform_damage_region(wf::region_t& damage) override
+ void transform_damage_region(wf::regionf_t& damage) override
{
- damage |= wf::region_t{self->animation_geometry};
+ damage |= self->animation_geometry;
}
void render(const wf::scene::render_instruction_t& data) override
@@ -289,9 +281,11 @@ class shatter_transformer : public wf::s
}
};
- shatter_transformer(wayfire_view view, wf::geometry_t bbox) : wf::scene::view_2d_transformer_t(view)
+ shatter_transformer(wayfire_view view, wf::geometry_t bbox,
+ wf::animation_description_t duration) : wf::scene::view_2d_transformer_t(view)
{
this->view = view;
+ this->progression = duration_t{wf::create_option(duration)};
if (view->get_output())
{
output = view->get_output();
@@ -378,7 +372,7 @@ class shatter_animation : public animati
pop_transformer(view);
auto bbox = view->get_transformed_node()->get_bounding_box();
auto tmgr = view->get_transformed_node();
- auto node = std::make_shared(view, bbox);
+ auto node = std::make_shared(view, bbox, dur);
tmgr->add_transformer(node, wf::TRANSFORMER_HIGHLEVEL + 1, shatter_transformer_name);
node->init_animation(type & WF_ANIMATE_HIDING_ANIMATION);
}
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/extra-animations/vortex.hpp wayfire-plugins-extra/src/extra-animations/vortex.hpp
--- wayfire-plugins-extra-0.10.0/src/extra-animations/vortex.hpp 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/src/extra-animations/vortex.hpp 2026-08-01 16:00:35.434368211 -0600
@@ -110,13 +110,6 @@ using namespace wf::animation;
static std::string vortex_transformer_name = "animation-vortex";
-wf::option_wrapper_t vortex_duration{"extra-animations/vortex_duration"};
-
-class vortex_animation_t : public duration_t
-{
- public:
- using duration_t::duration_t;
-};
class vortex_transformer : public wf::scene::view_2d_transformer_t
{
public:
@@ -124,7 +117,7 @@ class vortex_transformer : public wf::sc
OpenGL::program_t program;
wf::output_t *output;
wf::geometry_t animation_geometry;
- vortex_animation_t progression{vortex_duration};
+ duration_t progression;
class simple_node_render_instance_t : public wf::scene::transformer_render_instance_t
{
@@ -155,7 +148,7 @@ class vortex_transformer : public wf::sc
void schedule_instructions(
std::vector& instructions,
- const wf::render_target_t& target, wf::region_t& damage) override
+ const wf::render_target_t& target, wf::regionf_t& damage) override
{
instructions.push_back(render_instruction_t{
.instance = this,
@@ -164,9 +157,9 @@ class vortex_transformer : public wf::sc
});
}
- void transform_damage_region(wf::region_t& damage) override
+ void transform_damage_region(wf::regionf_t& damage) override
{
- damage |= wf::region_t{self->animation_geometry};
+ damage |= self->animation_geometry;
}
void render(const wf::scene::render_instruction_t& data) override
@@ -183,13 +176,13 @@ class vortex_transformer : public wf::sc
};
const float vertex_data_pos[] = {
- 1.0f * src_box.x,
- 1.0f * src_box.y + src_box.height,
- 1.0f * src_box.x + src_box.width,
- 1.0f * src_box.y + src_box.height,
- 1.0f * src_box.x + src_box.width,
- 1.0f * src_box.y,
- 1.0f * src_box.x, 1.0f * src_box.y,
+ (float)src_box.x,
+ (float)src_box.y + (float)src_box.height,
+ (float)src_box.x + (float)src_box.width,
+ (float)src_box.y + (float)src_box.height,
+ (float)src_box.x + (float)src_box.width,
+ (float)src_box.y,
+ (float)src_box.x, (float)src_box.y,
};
data.pass->custom_gles_subpass([&]
@@ -207,9 +200,11 @@ class vortex_transformer : public wf::sc
}
};
- vortex_transformer(wayfire_view view, wf::geometry_t bbox) : wf::scene::view_2d_transformer_t(view)
+ vortex_transformer(wayfire_view view, wf::geometry_t bbox,
+ wf::animation_description_t duration) : wf::scene::view_2d_transformer_t(view)
{
this->view = view;
+ this->progression = duration_t{wf::create_option(duration)};
if (view->get_output())
{
output = view->get_output();
@@ -223,11 +218,6 @@ class vortex_transformer : public wf::sc
});
}
- wf::geometry_t get_bounding_box() override
- {
- return this->animation_geometry;
- }
-
wf::effect_hook_t pre_hook = [=] ()
{
output->render->damage(animation_geometry);
@@ -275,7 +265,7 @@ class vortex_animation : public animatio
pop_transformer(view);
auto bbox = view->get_transformed_node()->get_bounding_box();
auto tmgr = view->get_transformed_node();
- auto node = std::make_shared(view, bbox);
+ auto node = std::make_shared(view, bbox, dur);
tmgr->add_transformer(node, wf::TRANSFORMER_HIGHLEVEL + 1, vortex_transformer_name);
node->init_animation(type & WF_ANIMATE_HIDING_ANIMATION);
}
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/fisheye.cpp wayfire-plugins-extra/src/fisheye.cpp
--- wayfire-plugins-extra-0.10.0/src/fisheye.cpp 1969-12-31 17:00:00.000000000 -0700
+++ wayfire-plugins-extra/src/fisheye.cpp 2026-08-01 16:00:35.434368211 -0600
@@ -0,0 +1,237 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2018 Scott Moreau
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include
+#include
+#include
+#include
+#include
+
+static const char *vertex_shader =
+ R"(
+#version 100
+
+attribute highp vec2 position;
+
+void main() {
+
+ gl_Position = vec4(position.xy, 0.0, 1.0);
+}
+)";
+
+static const char *fragment_shader =
+ R"(
+#version 100
+precision highp float;
+
+uniform vec2 u_resolution;
+uniform vec2 u_mouse;
+uniform float u_radius;
+uniform float u_zoom;
+uniform sampler2D u_texture;
+
+const float PI = 3.1415926535;
+
+void main()
+{
+ float radius = u_radius;
+
+ float zoom = u_zoom;
+ float pw = 1.0 / u_resolution.x;
+ float ph = 1.0 / u_resolution.y;
+
+ vec4 p0 = vec4(u_mouse.x, u_resolution.y - u_mouse.y, 1.0 / radius, 0.0);
+ vec4 p1 = vec4(pw, ph, PI / radius, (zoom - 1.0) * zoom);
+ vec4 p2 = vec4(0, 0, -PI / 2.0, 0.0);
+
+ vec4 t0, t1, t2, t3;
+
+ vec3 tc = vec3(1.0, 0.0, 0.0);
+ vec2 uv = vec2(gl_FragCoord.x, gl_FragCoord.y);
+
+ t1 = p0.xyww - vec4(uv, 0.0, 0.0);
+ t2.x = t2.y = t2.z = t2.w = 1.0 / sqrt(dot(t1.xyz, t1.xyz));
+ t0 = t2 - p0;
+
+ t3.x = t3.y = t3.z = t3.w = 1.0 / t2.x;
+ t3 = t3 * p1.z + p2.z;
+ t3.x = t3.y = t3.z = t3.w = cos(t3.x);
+
+ t3 = t3 * p1.w;
+
+ t1 = t2 * t1;
+ t1 = t1 * t3 + vec4(uv, 0.0, 0.0);
+
+ if (t0.z < 0.0) {
+ t1.x = uv.x;
+ t1.y = uv.y;
+ }
+
+ t1 = t1 * p1 + p2;
+
+ tc = texture2D(u_texture, t1.xy).rgb;
+
+ gl_FragColor = vec4(tc, 1.0);
+}
+)";
+
+class wayfire_fisheye : public wf::per_output_plugin_instance_t
+{
+ wf::animation::simple_animation_t progression{wf::create_option(300)};
+
+ float target_zoom;
+ bool active, hook_set;
+
+ wf::option_wrapper_t radius{"fisheye/radius"};
+ wf::option_wrapper_t zoom{"fisheye/zoom"};
+
+ OpenGL::program_t program;
+
+ wf::plugin_activation_data_t grab_interface = {
+ .name = "fisheye",
+ .capabilities = 0,
+ };
+
+ public:
+ void init() override
+ {
+ if (!wf::get_core().is_gles2())
+ {
+ const char *render_type =
+ wf::get_core().is_vulkan() ? "vulkan" : (wf::get_core().is_pixman() ? "pixman" : "unknown");
+ LOGE("fisheye: requires GLES2 support, but current renderer is ", render_type);
+ return;
+ }
+
+ wf::gles::run_in_context_if_gles([&]
+ {
+ program.set_simple(OpenGL::compile_program(vertex_shader, fragment_shader));
+ });
+
+ hook_set = active = false;
+ output->add_activator(wf::option_wrapper_t{"fisheye/toggle"}, &toggle_cb);
+
+ target_zoom = zoom;
+ zoom.set_callback([=] ()
+ {
+ if (active)
+ {
+ this->progression.animate(zoom);
+ }
+ });
+ }
+
+ wf::activator_callback toggle_cb = [=] (auto)
+ {
+ if (!output->can_activate_plugin(&grab_interface))
+ {
+ return false;
+ }
+
+ if (active)
+ {
+ active = false;
+ progression.animate(0);
+ } else
+ {
+ active = true;
+ progression.animate(zoom);
+ if (!hook_set)
+ {
+ hook_set = true;
+ output->render->add_post(&render_hook);
+ output->render->set_redraw_always();
+ }
+ }
+
+ return true;
+ };
+
+ wf::post_hook_t render_hook = [=] (wf::auxilliary_buffer_t& source,
+ const wf::render_buffer_t& dest)
+ {
+ auto oc = output->get_cursor_position();
+ wf::geometry_t box = {oc.x, oc.y, 1, 1};
+ auto fb_box = output->render->get_target_framebuffer().
+ framebuffer_box_from_geometry_box(box);
+ oc.x = fb_box.x;
+ oc.y = fb_box.y;
+
+ static const float vertexData[] = {
+ -1.0f, -1.0f,
+ 1.0f, -1.0f,
+ 1.0f, 1.0f,
+ -1.0f, 1.0f
+ };
+
+ wf::gles::run_in_context_if_gles([&]
+ {
+ wf::gles::bind_render_buffer(dest);
+ program.use(wf::TEXTURE_TYPE_RGBA);
+ GL_CALL(glBindTexture(GL_TEXTURE_2D, wf::gles_texture_t::from_aux(source).tex_id));
+ GL_CALL(glActiveTexture(GL_TEXTURE0));
+
+ program.uniform2f("u_mouse", oc.x, dest.get_size().height - oc.y);
+ program.uniform2f("u_resolution", dest.get_size().width, dest.get_size().height);
+ program.uniform1f("u_radius", radius);
+ program.uniform1f("u_zoom", progression);
+
+ program.attrib_pointer("position", 2, 0, vertexData);
+
+ GL_CALL(glDrawArrays(GL_TRIANGLE_FAN, 0, 4));
+ GL_CALL(glBindTexture(GL_TEXTURE_2D, 0));
+
+ program.deactivate();
+ });
+
+ if (!active && !progression.running())
+ {
+ finalize();
+ }
+ };
+
+ void finalize()
+ {
+ output->render->rem_post(&render_hook);
+ output->render->set_redraw_always(false);
+ hook_set = false;
+ }
+
+ void fini() override
+ {
+ if (hook_set)
+ {
+ finalize();
+ }
+
+ wf::gles::run_in_context_if_gles([&]
+ {
+ program.free_resources();
+ });
+
+ output->rem_binding(&toggle_cb);
+ }
+};
+
+DECLARE_WAYFIRE_PLUGIN(wf::per_output_plugin_t);
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/follow-focus.cpp wayfire-plugins-extra/src/follow-focus.cpp
--- wayfire-plugins-extra-0.10.0/src/follow-focus.cpp 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/src/follow-focus.cpp 2026-08-01 16:00:35.434368211 -0600
@@ -43,7 +43,7 @@ class wayfire_follow_focus : public wf::
private:
wayfire_view focus_view = nullptr;
wf::wl_timer change_output_focus, change_view_focus;
- wf::point_t last_output_coords, last_view_coords;
+ wf::pointf_t last_output_coords, last_view_coords;
wf::option_wrapper_t should_change_view{"follow-focus/change_view"};
wf::option_wrapper_t should_change_output{"follow-focus/change_output"};
@@ -67,7 +67,7 @@ class wayfire_follow_focus : public wf::
void change_output()
{
auto cpf = wf::get_core().get_cursor_position();
- wf::point_t coords{static_cast(cpf.x), static_cast(cpf.y)};
+ wf::pointf_t coords{cpf.x, cpf.y};
if (output->get_layout_geometry() & coords && (output == focus_output))
{
@@ -90,7 +90,7 @@ class wayfire_follow_focus : public wf::
}
auto cpf = wf::get_core().get_cursor_position();
- wf::point_t coords{static_cast(cpf.x), static_cast(cpf.y)};
+ wf::pointf_t coords{cpf.x, cpf.y};
if (output->get_layout_geometry() & coords && (output != focus_output))
{
@@ -98,7 +98,7 @@ class wayfire_follow_focus : public wf::
focus_output = output;
}
- if (abs(coords - last_output_coords) < threshold)
+ if (wf::abs(coords - last_output_coords) < threshold)
{
return;
}
@@ -142,14 +142,14 @@ class wayfire_follow_focus : public wf::
}
auto cpf = wf::get_core().get_cursor_position();
- wf::point_t coords{static_cast(cpf.x), static_cast(cpf.y)};
+ wf::pointf_t coords{cpf.x, cpf.y};
if (view != focus_view)
{
last_view_coords = coords;
focus_view = view;
}
- if (abs(coords - last_view_coords) < threshold)
+ if (wf::abs(coords - last_view_coords) < threshold)
{
return;
}
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/force-fullscreen.cpp wayfire-plugins-extra/src/force-fullscreen.cpp
--- wayfire-plugins-extra-0.10.0/src/force-fullscreen.cpp 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/src/force-fullscreen.cpp 2026-08-01 16:00:35.434368211 -0600
@@ -55,21 +55,18 @@ class simple_node_render_instance_t : pu
node_t *self;
wayfire_toplevel_view view;
damage_callback push_to_parent;
- int *x, *y, *w, *h;
- wlr_box *transparent_box;
+ wf::geometry_t *geometry;
+ wf::geometry_t *transparent_box;
wf::option_wrapper_t transparent_behind_views{
"force-fullscreen/transparent_behind_views"};
public:
simple_node_render_instance_t(node_t *self, damage_callback push_damage,
- wayfire_toplevel_view view, int *x, int *y, int *w, int *h, wlr_box *transparent_box)
+ wayfire_toplevel_view view, wf::geometry_t *geometry, wf::geometry_t *transparent_box)
{
- this->x = x;
- this->y = y;
- this->w = w;
- this->h = h;
- this->self = self;
- this->view = view;
+ this->geometry = geometry;
+ this->self = self;
+ this->view = view;
this->transparent_box = transparent_box;
this->push_to_parent = push_damage;
self->connect(&on_node_damaged);
@@ -77,7 +74,7 @@ class simple_node_render_instance_t : pu
void schedule_instructions(
std::vector& instructions,
- const wf::render_target_t& target, wf::region_t& damage) override
+ const wf::render_target_t& target, wf::regionf_t& damage) override
{
// We want to render ourselves only, the node does not have children
instructions.push_back(render_instruction_t{
@@ -96,7 +93,7 @@ class simple_node_render_instance_t : pu
return;
}
- wf::region_t scissor_region{data.damage};
+ wf::regionf_t scissor_region{data.damage};
if (transparent_behind_views)
{
auto bbox = *transparent_box;
@@ -104,7 +101,7 @@ class simple_node_render_instance_t : pu
bbox.y += 1;
bbox.width -= 2;
bbox.height -= 2;
- scissor_region ^= wf::region_t{bbox};
+ scissor_region ^= wf::regionf_t{bbox};
}
data.pass->clear(scissor_region, {0, 0, 0, 1});
@@ -114,18 +111,18 @@ class simple_node_render_instance_t : pu
class black_border_node_t : public node_t
{
wayfire_toplevel_view view;
- wlr_box transparent_box;
+ wf::geometry_t transparent_box;
public:
- int x, y, w, h;
+ wf::geometry_t geometry;
black_border_node_t(wayfire_toplevel_view view, int x, int y, int w,
- int h, wlr_box transparent_box) : node_t(false)
+ int h, wf::geometry_t transparent_box) : node_t(false)
{
- this->x = x;
- this->y = y;
- this->w = w;
- this->h = h;
+ this->geometry.x = x;
+ this->geometry.y = y;
+ this->geometry.width = w;
+ this->geometry.height = h;
this->view = view;
this->transparent_box = transparent_box;
}
@@ -138,13 +135,13 @@ class black_border_node_t : public node_
// this simple nodes does not need any transformations, so the push_damage
// callback is just passed along.
instances.push_back(std::make_unique(
- this, push_damage, view, &x, &y, &w, &h, &transparent_box));
+ this, push_damage, view, &geometry, &transparent_box));
}
wf::geometry_t get_bounding_box() override
{
// Specify whatever geometry your node has
- return {x, y, w, h};
+ return geometry;
}
};
@@ -156,7 +153,7 @@ class fullscreen_background
std::shared_ptr transformer;
std::shared_ptr black_border_node;
bool black_border = false;
- wlr_box transformed_view_box;
+ wf::geometry_t transformed_view_box;
fullscreen_background(wayfire_toplevel_view view)
{}
@@ -216,11 +213,11 @@ class wayfire_force_fullscreen : public
int x = offset.x * og.width;
int y = offset.y * og.height;
b.second->transformed_view_box.x = x + w;
- b.second->black_border_node->x = x;
- b.second->black_border_node->y = y;
- b.second->black_border_node->w = og.width;
- b.second->black_border_node->h = og.height;
- b.second->transformed_view_box.y = b.second->black_border_node->y =
+ b.second->black_border_node->geometry.x = x;
+ b.second->black_border_node->geometry.y = y;
+ b.second->black_border_node->geometry.width = og.width;
+ b.second->black_border_node->geometry.height = og.height;
+ b.second->transformed_view_box.y = b.second->black_border_node->geometry.y =
y;
}
@@ -228,7 +225,7 @@ class wayfire_force_fullscreen : public
}
};
- void ensure_subsurface(wayfire_toplevel_view view, wlr_box transformed_view_box)
+ void ensure_subsurface(wayfire_toplevel_view view, wf::geometry_t transformed_view_box)
{
auto pair = backgrounds.find(view);
@@ -289,7 +286,7 @@ class wayfire_force_fullscreen : public
scale_x = scale_y = std::min(scale_x, scale_y);
}
- wlr_box box;
+ wf::geometry_t box;
box.width = std::floor(vg.width * scale_x);
box.height = std::floor(vg.height * scale_y);
box.x = std::ceil((og.width - box.width) / 2.0);
@@ -332,7 +329,7 @@ class wayfire_force_fullscreen : public
return false;
}
- wlr_box saved_geometry = view->get_geometry();
+ wf::geometry_t saved_geometry = view->get_geometry();
auto background = backgrounds.find(view);
bool fullscreen = background == backgrounds.end() ? true : false;
@@ -340,7 +337,7 @@ class wayfire_force_fullscreen : public
view->toplevel()->pending().fullscreen = fullscreen;
wf::get_core().tx_manager->schedule_object(view->toplevel());
- wlr_box undecorated_geometry = view->get_geometry();
+ wf::geometry_t undecorated_geometry = view->get_geometry();
if (!fullscreen)
{
@@ -505,7 +502,7 @@ class wayfire_force_fullscreen : public
for (auto& b : backgrounds)
{
auto view = wf::get_active_view_for_output(output);
- wlr_box box;
+ wf::geometry_t box;
box = b.second->transformed_view_box;
box.x += og.x;
@@ -519,7 +516,8 @@ class wayfire_force_fullscreen : public
if ((b.first == view) &&
!(box & wf::pointf_t{cursor.x, cursor.y}))
{
- wlr_box_closest_point(&box, cursor.x, cursor.y,
+ auto ibox = wf::to_integer_box(box);
+ wlr_box_closest_point(&ibox, cursor.x, cursor.y,
&cursor.x, &cursor.y);
ev->event->delta_x = ev->event->unaccel_dx =
cursor.x - last_cursor.x;
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/keycolor.cpp wayfire-plugins-extra/src/keycolor.cpp
--- wayfire-plugins-extra-0.10.0/src/keycolor.cpp 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/src/keycolor.cpp 2026-08-01 16:00:35.434368211 -0600
@@ -130,7 +130,7 @@ class simple_node_render_instance_t : pu
void schedule_instructions(
std::vector& instructions,
- const wf::render_target_t& target, wf::region_t& damage) override
+ const wf::render_target_t& target, wf::regionf_t& damage) override
{
// We want to render ourselves only, the node does not have children
instructions.push_back(render_instruction_t{
@@ -196,7 +196,7 @@ class simple_node_render_instance_t : pu
for (const auto& box : data.damage)
{
- wf::gles::render_target_logic_scissor(data.target, wlr_box_from_pixman_box(box));
+ wf::gles::render_target_logic_scissor(data.target, box);
GL_CALL(glDrawArrays(GL_TRIANGLE_FAN, 0, 4));
}
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/mag.cpp wayfire-plugins-extra/src/mag.cpp
--- wayfire-plugins-extra-0.10.0/src/mag.cpp 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/src/mag.cpp 2026-08-01 16:00:35.434368211 -0600
@@ -71,7 +71,8 @@ class mag_view_t : public wf::toplevel_v
/* Draw the inside of the rect, if we have already captured the output's contents */
if (view->mag_tex.get_buffer() != NULL)
{
- data.pass->add_texture({view->mag_tex.get_texture()}, data.target, geometry, data.damage);
+ data.pass->add_texture(wf::texture_t::from_aux(
+ view->mag_tex), data.target, geometry, data.damage);
}
}
};
@@ -296,7 +297,7 @@ class wayfire_magnifier : public wf::per
{
auto og = output->get_relative_geometry();
float aspect = (float)og.width / og.height;
- wf::geometry_t start_geometry = {100, 100, (int)(default_height * aspect), default_height};
+ wf::geometry_t start_geometry = {100, 100, default_height *aspect, (double)default_height};
return start_geometry;
}
@@ -344,7 +345,7 @@ class wayfire_magnifier : public wf::per
glm::translate(glm::mat4(1.0), glm::vec3(0.5, 0.5, 0.0)) *
glm::scale(glm::mat4(1.0), glm::vec3{0.5, -0.5, 1.0}) * ortho;
- glm::vec4 cursor = glm::vec4(cursor_position.x, cursor_position.y, 0.0, 1.0);
+ glm::vec4 cursor = glm::vec4((int)cursor_position.x, (int)cursor_position.y, 0.0, 1.0);
cursor = cursor_transform * cursor;
float x = cursor.x;
@@ -399,10 +400,10 @@ class wayfire_magnifier : public wf::per
zoom_box.y2 = 1.0;
}
- zoom_box.x1 *= width - 1;
- zoom_box.x2 *= width - 1;
- zoom_box.y1 *= height - 1;
- zoom_box.y2 *= height - 1;
+ zoom_box.x1 *= width;
+ zoom_box.x2 *= width;
+ zoom_box.y1 *= height;
+ zoom_box.y2 *= height;
/* Copy zoom_box part of the output to our own texture to be
* read by the mag_view_t. */
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/meson.build wayfire-plugins-extra/src/meson.build
--- wayfire-plugins-extra-0.10.0/src/meson.build 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/src/meson.build 2026-08-01 16:00:35.434368211 -0600
@@ -16,6 +16,10 @@ crosshair = shared_module('crosshair', '
dependencies: [wayfire],
install: true, install_dir: join_paths(get_option('libdir'), 'wayfire'))
+fisheye = shared_module('fisheye', 'fisheye.cpp',
+ dependencies: [wayfire],
+ install: true, install_dir: join_paths(get_option('libdir'), 'wayfire'))
+
focus_change = shared_module('focus-change', 'focus-change.cpp',
dependencies: [wayfire],
install: true, install_dir: join_paths(get_option('libdir'), 'wayfire'))
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/obs.cpp wayfire-plugins-extra/src/obs.cpp
--- wayfire-plugins-extra-0.10.0/src/obs.cpp 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/src/obs.cpp 2026-08-01 16:00:35.434368211 -0600
@@ -138,7 +138,7 @@ class wf_obs : public wf::scene::view_2d
}
void schedule_instructions(std::vector& instructions,
- const wf::render_target_t& target, wf::region_t& damage) override
+ const wf::render_target_t& target, wf::regionf_t& damage) override
{
// We want to render ourselves only, the node does not have children
instructions.push_back(render_instruction_t{
@@ -190,7 +190,7 @@ class wf_obs : public wf::scene::view_2d
for (const auto& box : data.damage)
{
- wf::gles::render_target_logic_scissor(data.target, wlr_box_from_pixman_box(box));
+ wf::gles::render_target_logic_scissor(data.target, box);
OpenGL::render_transformed_texture(final_tex, view_box,
wf::gles::render_target_orthographic_projection(data.target),
glm::vec4(1.0), 0);
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/showrepaint.cpp wayfire-plugins-extra/src/showrepaint.cpp
--- wayfire-plugins-extra-0.10.0/src/showrepaint.cpp 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/src/showrepaint.cpp 2026-08-01 16:00:35.434368211 -0600
@@ -119,13 +119,13 @@ class wayfire_showrepaint : public wf::p
wf::effect_hook_t overlay_hook = [=] ()
{
auto target_fb = output->render->get_target_framebuffer();
- wf::region_t swap_damage = target_fb.geometry_region_from_framebuffer_region(
+ wf::regionf_t swap_damage = target_fb.geometry_region_from_framebuffer_region(
output->render->get_swap_damage());
- wf::region_t scheduled_damage = output->render->get_scheduled_damage();
- wf::region_t output_region{target_fb.geometry};
- wf::region_t inverted_damage;
- wf::region_t damage;
+ wf::regionf_t scheduled_damage = output->render->get_scheduled_damage();
+ wf::regionf_t output_region{target_fb.geometry};
+ wf::regionf_t inverted_damage;
+ wf::regionf_t damage;
/* Show scheduled client damage. Scheduled damage is the client damage
* in union with last frame client damage. If this region is empty, we
@@ -167,9 +167,8 @@ class wayfire_showrepaint : public wf::p
*/
if (last_buffer.get_size().width > 0)
{
- wf::texture_t texture;
- texture.texture = last_buffer.get_texture();
- texture.transform = target_fb.wl_transform;
+ std::shared_ptr texture = wf::texture_t::from_aux(last_buffer);
+ texture->set_transform(target_fb.wl_transform);
rpass->add_texture(texture, target_fb, target_fb.geometry, inverted_damage);
}
};
@@ -189,8 +188,8 @@ class wayfire_showrepaint : public wf::p
*/
auto target_fb = output->render->get_target_framebuffer();
last_buffer.allocate(target_fb.get_size());
- wlr_box full = wf::construct_box({0, 0}, target_fb.get_size());
- last_buffer.get_renderbuffer().blit(target_fb, wf::geometry_to_fbox(full), full);
+ wf::geometry_t full = wf::construct_box({0, 0}, target_fb.get_size());
+ last_buffer.get_renderbuffer().blit(target_fb, full, full);
};
void fini() override
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/showtouch.cpp wayfire-plugins-extra/src/showtouch.cpp
--- wayfire-plugins-extra-0.10.0/src/showtouch.cpp 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/src/showtouch.cpp 2026-08-01 16:00:35.434368211 -0600
@@ -324,6 +324,7 @@ class wayfire_showtouch : public wf::per
wf::gles::run_in_context([&]
{
+ wf::gles::bind_render_buffer(dest);
program.use(wf::TEXTURE_TYPE_RGBA);
program.set_active_texture(tex);
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/window-zoom.cpp wayfire-plugins-extra/src/window-zoom.cpp
--- wayfire-plugins-extra-0.10.0/src/window-zoom.cpp 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/src/window-zoom.cpp 2026-08-01 16:00:35.434602314 -0600
@@ -60,14 +60,14 @@ class simple_node_render_instance_t : pu
node_t *self;
wayfire_toplevel_view view;
float *scale_x, *scale_y;
- wlr_box *transformed_view_geometry;
+ wf::geometry_t *transformed_view_geometry;
damage_callback push_damage;
wf::option_wrapper_t nearest_filtering{"winzoom/nearest_filtering"};
public:
simple_node_render_instance_t(transformer_base_node_t *self, damage_callback push_damage,
wayfire_toplevel_view view, float *scale_x, float *scale_y,
- wlr_box *transformed_view_geometry) :
+ wf::geometry_t *transformed_view_geometry) :
transformer_render_instance_t(self, push_damage,
view->get_output())
{
@@ -89,7 +89,7 @@ class simple_node_render_instance_t : pu
void schedule_instructions(
std::vector& instructions,
- const wf::render_target_t& target, wf::region_t& damage) override
+ const wf::render_target_t& target, wf::regionf_t& damage) override
{
// We want to render ourselves only, the node does not have children
instructions.push_back(render_instruction_t{
@@ -99,16 +99,16 @@ class simple_node_render_instance_t : pu
});
}
- void transform_damage_region(wf::region_t& damage) override
+ void transform_damage_region(wf::regionf_t& damage) override
{
damage |= view->get_transformed_node()->get_children_bounding_box();
}
- wlr_box get_scaled_geometry()
+ wf::geometry_t get_scaled_geometry()
{
auto vg = view->get_geometry();
auto midpoint = get_center(vg);
- auto result = wf::pointf_t{float(vg.x), float(vg.y)} - midpoint;
+ auto result = wf::pointf_t{vg.x, vg.y} - midpoint;
result.x *= *scale_x;
result.y *= *scale_y;
result += midpoint;
@@ -123,7 +123,7 @@ class simple_node_render_instance_t : pu
{
auto src_tex = get_texture(1.0);
auto scaled_geometry = get_scaled_geometry();
- src_tex.filter_mode = nearest_filtering ? WLR_SCALE_FILTER_NEAREST : WLR_SCALE_FILTER_BILINEAR;
+ src_tex->set_filter_mode(nearest_filtering ? WLR_SCALE_FILTER_NEAREST : WLR_SCALE_FILTER_BILINEAR);
data.pass->add_texture(src_tex, data.target, scaled_geometry, data.damage);
}
};
@@ -131,7 +131,7 @@ class simple_node_render_instance_t : pu
class winzoom_t : public view_2d_transformer_t
{
wayfire_toplevel_view view;
- wlr_box transformed_view_geometry;
+ wf::geometry_t transformed_view_geometry;
public:
winzoom_t(wayfire_toplevel_view view) : view_2d_transformer_t(view)
diff --color -Naurp wayfire-plugins-extra-0.10.0/src/workspace-names.cpp wayfire-plugins-extra/src/workspace-names.cpp
--- wayfire-plugins-extra-0.10.0/src/workspace-names.cpp 2025-08-11 22:03:47.000000000 -0600
+++ wayfire-plugins-extra/src/workspace-names.cpp 2026-08-01 16:00:35.434602314 -0600
@@ -1,7 +1,7 @@
/*
* The MIT License (MIT)
*
- * Copyright (c) 2023 Scott Moreau
+ * Copyright (c) 2026 Scott Moreau
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -91,7 +91,7 @@ class simple_node_render_instance_t : pu
void schedule_instructions(
std::vector& instructions,
- const wf::render_target_t& target, wf::region_t& damage) override
+ const wf::render_target_t& target, wf::regionf_t& damage) override
{
// We want to render ourselves only, the node does not have children
instructions.push_back(render_instruction_t{
@@ -113,7 +113,7 @@ class simple_node_render_instance_t : pu
wf::gles::bind_render_buffer(data.target);
for (auto& box : data.damage)
{
- wf::gles::render_target_logic_scissor(data.target, wlr_box_from_pixman_box(box));
+ wf::gles::render_target_logic_scissor(data.target, box);
OpenGL::render_texture(wf::gles_texture_t{workspace->texture->get_texture()},
data.target, g, glm::vec4(1, 1, 1, *alpha_fade), 0);
}
@@ -132,13 +132,20 @@ class simple_node_t : public node_t
public:
std::shared_ptr workspace;
- simple_node_t(wf::point_t offset) : node_t(false)
+ wf::point_t ws;
+ simple_node_t(wf::point_t offset, wf::point_t ws) : node_t(false)
{
- this->offset = offset;
+ this->ws = ws;
+ this->offset = offset;
this->alpha_fade = 0.0;
workspace = std::make_shared();
}
+ ~simple_node_t()
+ {
+ workspace = nullptr;
+ }
+
void gen_render_instances(std::vector& instances,
damage_callback push_damage, wf::output_t *shown_on) override
{
@@ -150,7 +157,7 @@ class simple_node_t : public node_t
this, push_damage, &offset, &alpha_fade, workspace));
}
- void do_push_damage(wf::region_t updated_region)
+ void do_push_damage(wf::regionf_t updated_region)
{
node_damage_signal ev;
ev.region = updated_region;
@@ -164,10 +171,14 @@ class simple_node_t : public node_t
workspace->rect.width, workspace->rect.height};
}
- void set_offset(int x, int y)
+ void set_offset(wf::point_t offset)
+ {
+ this->offset = offset;
+ }
+
+ wf::point_t get_ws()
{
- this->offset.x = x;
- this->offset.y = y;
+ return this->ws;
}
void set_alpha(double alpha)
@@ -177,9 +188,9 @@ class simple_node_t : public node_t
};
std::shared_ptr add_simple_node(wf::output_t *output,
- wf::point_t offset)
+ wf::point_t offset, wf::point_t ws)
{
- auto subnode = std::make_shared(offset);
+ auto subnode = std::make_shared(offset, ws);
wf::scene::add_front(output->node_for_layer(wf::scene::layer::OVERLAY), subnode);
return subnode;
}
@@ -187,8 +198,7 @@ std::shared_ptr add_simpl
class wayfire_workspace_names_output : public wf::per_output_plugin_instance_t
{
wf::wl_timer timer;
- bool hook_set = false;
- bool timed_out = false;
+ bool hook_set = false;
std::vector>> workspaces;
wf::option_wrapper_t font{"workspace-names/font"};
wf::option_wrapper_t position{"workspace-names/position"};
@@ -208,76 +218,90 @@ class wayfire_workspace_names_output : p
void init() override
{
alpha_fade.set(0, 0);
- timed_out = false;
+ output->wset()->connect(&workspace_grid_changed);
+ output->connect(&workarea_changed);
+ output->connect(&viewport_changed);
+ output->connect(&viewport_change_request);
+ font.set_callback(option_changed);
+ position.set_callback(option_changed);
+ background_color.set_callback(option_changed);
+ text_color.set_callback(option_changed);
+ show_option_values.set_callback(option_changed);
+ show_option_names.set_callback(show_options_changed);
+
+ if (show_option_names)
+ {
+ show_options_changed();
+ }
+ }
+
+ void init_workspace_name_nodes()
+ {
auto wsize = output->wset()->get_workspace_grid_size();
+ auto og = output->get_relative_geometry();
workspaces.resize(wsize.width);
for (int x = 0; x < wsize.width; x++)
{
workspaces[x].resize(wsize.height);
}
- auto og = output->get_relative_geometry();
for (int x = 0; x < wsize.width; x++)
{
for (int y = 0; y < wsize.height; y++)
{
- workspaces[x][y] = add_simple_node(output, {x *og.width,
- y * og.height});
+ workspaces[x][y] = add_simple_node(output, {int(x * og.width),
+ int(y * og.height)}, {x, y});
}
}
+ }
- output->connect(&workarea_changed);
- output->connect(&viewport_changed);
- font.set_callback(option_changed);
- position.set_callback(option_changed);
- background_color.set_callback(option_changed);
- text_color.set_callback(option_changed);
- show_option_names.set_callback(show_options_changed);
-
- if (show_option_names)
- {
- show_options_changed();
- } else
+ void fini_workspace_name_nodes()
+ {
+ for (auto & x : workspaces)
{
- update_names();
+ for (auto & workspace : x)
+ {
+ auto& wsn = workspace->workspace;
+ cairo_surface_destroy(wsn->cairo_surface);
+ cairo_destroy(wsn->cr);
+ wf::scene::remove_child(workspace);
+ workspace.reset();
+ }
}
-
- wf::get_core().connect(&reload_config);
}
- wf::signal::connection_t reload_config{[this] (wf::reload_config_signal *ev)
+ wf::signal::connection_t workspace_grid_changed{[this] (wf::
+ workspace_grid_changed_signal
+ *ev)
{
- update_names();
+ deactivate();
+ init_workspace_name_nodes();
}
};
wf::config::option_base_t::updated_callback_t show_options_changed = [=] ()
{
- update_names();
-
- viewport_changed.emit(nullptr);
-
if (show_option_names)
{
- timer.disconnect();
- output->render->rem_effect(&post_hook);
+ activate();
+ update_names();
+ viewport_changed.emit(nullptr);
+ alpha_fade.animate(alpha_fade, 1);
} else
{
- output->connect(&viewport_changed);
- output->render->add_effect(&post_hook, wf::OUTPUT_EFFECT_POST);
+ alpha_fade.animate(alpha_fade, 0);
}
- alpha_fade.animate(alpha_fade, 1.0);
output->render->damage_whole();
};
- void update_name(int x, int y)
+ void update_name(std::shared_ptr workspace)
{
auto section = wf::get_core().config->get_section("workspace-names");
auto wsize = output->wset()->get_workspace_grid_size();
- auto wsn = workspaces[x][y]->workspace;
- int ws_num = x + y * wsize.width + 1;
+ auto wsn = workspace->workspace;
+ int ws_num = workspace->get_ws().x + workspace->get_ws().y * wsize.width + 1;
// Get the option name (key) of the target workspace
std::string key = output->to_string() + "_workspace_" + std::to_string(ws_num);
@@ -327,13 +351,12 @@ class wayfire_workspace_names_output : p
void update_names()
{
- auto wsize = output->wset()->get_workspace_grid_size();
- for (int x = 0; x < wsize.width; x++)
+ for (auto & x : workspaces)
{
- for (int y = 0; y < wsize.height; y++)
+ for (auto & workspace : x)
{
- update_name(x, y);
- update_texture(workspaces[x][y]->workspace);
+ update_name(workspace);
+ update_texture(workspace->workspace);
}
}
}
@@ -400,7 +423,11 @@ class wayfire_workspace_names_output : p
wf::config::option_base_t::updated_callback_t option_changed = [=] ()
{
- update_textures();
+ if (hook_set)
+ {
+ update_names();
+ update_textures();
+ }
};
void update_texture_position(std::shared_ptr wsn)
@@ -455,6 +482,7 @@ class wayfire_workspace_names_output : p
wf::signal::connection_t workarea_changed{[this] (wf::workarea_changed_signal
*ev)
{
+ update_workspace_names_timeout();
update_textures();
}
};
@@ -528,73 +556,68 @@ class wayfire_workspace_names_output : p
if (alpha_fade.running())
{
set_alpha();
- output->render->damage_whole();
}
};
- wf::signal::connection_t viewport_changed{[this] (wf::
- workspace_changed_signal*
- ev)
- {
- auto wsize = output->wset()->get_workspace_grid_size();
- auto nvp = output->wset()->get_current_workspace();
- auto og = output->get_relative_geometry();
+ void update_workspace_names_timeout()
+ {
+ auto wsize = output->wset()->get_workspace_grid_size();
+ auto nvp = output->wset()->get_current_workspace();
+ auto og = output->get_relative_geometry();
+
+ activate();
+ update_textures();
+ update_names();
- for (int x = 0; x < wsize.width; x++)
+ for (int x = 0; x < wsize.width; x++)
+ {
+ for (int y = 0; y < wsize.height; y++)
{
- for (int y = 0; y < wsize.height; y++)
- {
- workspaces[x][y]->set_offset((x - nvp.x) * og.width,
- (y - nvp.y) * og.height);
- }
+ workspaces[x][y]->set_offset({int((x - nvp.x) * og.width), int((y - nvp.y) * og.height)});
}
+ }
- output->render->damage_whole();
+ output->render->damage_whole();
- activate();
+ if (show_option_names)
+ {
+ return;
+ }
- if (show_option_names)
- {
- return;
- }
+ alpha_fade.animate(alpha_fade, 1);
- if (!alpha_fade.running())
- {
- if (!timer.is_connected())
- {
- alpha_fade.animate(alpha_fade, 1.0);
- }
- } else if (timed_out)
- {
- timed_out = false;
- alpha_fade.animate(alpha_fade, 1.0);
- }
+ timer.disconnect();
+ timer.set_timeout((int)display_duration, timeout);
+ }
- timer.disconnect();
- timer.set_timeout((int)display_duration, timeout);
+ wf::signal::connection_t viewport_change_request{[this] (wf::
+ workspace_change_request_signal
+ *
+ ev)
+ {
+ update_workspace_names_timeout();
+ }
+ };
+
+ wf::signal::connection_t viewport_changed{[this] (wf::
+ workspace_changed_signal*
+ ev)
+ {
+ update_workspace_names_timeout();
}
};
wf::wl_timer::callback_t timeout = [=] ()
{
output->render->damage_whole();
- alpha_fade.animate(1.0, 0.0);
- timed_out = true;
+ alpha_fade.animate(alpha_fade, 0);
};
wf::effect_hook_t post_hook = [=] ()
{
- if (!alpha_fade.running())
+ if (!alpha_fade.running() && !timer.is_connected() && !show_option_names)
{
- if (timed_out)
- {
- deactivate();
- timed_out = false;
- output->render->damage_whole();
- } else if (!timer.is_connected())
- {
- timer.set_timeout((int)display_duration, timeout);
- }
+ deactivate();
} else
{
set_alpha();
@@ -608,6 +631,7 @@ class wayfire_workspace_names_output : p
return;
}
+ init_workspace_name_nodes();
output->render->add_effect(&post_hook, wf::OUTPUT_EFFECT_POST);
output->render->add_effect(&pre_hook, wf::OUTPUT_EFFECT_PRE);
output->render->damage_whole();
@@ -621,6 +645,8 @@ class wayfire_workspace_names_output : p
return;
}
+ timer.disconnect();
+ fini_workspace_name_nodes();
output->render->rem_effect(&post_hook);
output->render->rem_effect(&pre_hook);
hook_set = false;
@@ -629,18 +655,10 @@ class wayfire_workspace_names_output : p
void fini() override
{
deactivate();
- auto wsize = output->wset()->get_workspace_grid_size();
- for (int x = 0; x < wsize.width; x++)
- {
- for (int y = 0; y < wsize.height; y++)
- {
- auto& wsn = workspaces[x][y]->workspace;
- cairo_surface_destroy(wsn->cairo_surface);
- cairo_destroy(wsn->cr);
- wf::scene::remove_child(workspaces[x][y]);
- workspaces[x][y].reset();
- }
- }
+ workspace_grid_changed.disconnect();
+ viewport_change_request.disconnect();
+ viewport_changed.disconnect();
+ workarea_changed.disconnect();
output->render->damage_whole();
}
diff --color -Naurp wayfire-plugins-extra-0.10.0/subprojects/filters/ipc-scripts/filter-tiled.py wayfire-plugins-extra/subprojects/filters/ipc-scripts/filter-tiled.py
--- wayfire-plugins-extra-0.10.0/subprojects/filters/ipc-scripts/filter-tiled.py 2025-07-15 06:13:43.000000000 -0600
+++ wayfire-plugins-extra/subprojects/filters/ipc-scripts/filter-tiled.py 1969-12-31 17:00:00.000000000 -0700
@@ -1,45 +0,0 @@
-#!/usr/bin/python3
-
-# A simple script to apply a filter to untiled views.
-
-import os
-import sys
-from wayfire import WayfireSocket
-from wayfire.extra.wpe import WPE
-
-if len(sys.argv) < 2:
- print("Required arguments: ")
- exit(-1)
-
-sock = WayfireSocket()
-wpe = WPE(sock)
-sock.watch()
-
-def toggle_filter(view):
- try:
- if view["tiled-edges"] == 0:
- if wpe.view_has_shader(int(view["id"]))["has-shader"] is False:
- wpe.set_view_shader(int(view["id"]), os.path.abspath(str(sys.argv[1])))
- else:
- if wpe.view_has_shader(int(view["id"]))["has-shader"] is True:
- wpe.unset_view_shader(int(view["id"]))
- except:
- pass
-
-views = sock.list_views()
-for view in views:
- toggle_filter(view)
-
-while True:
- try:
- msg = sock.read_next_event()
- if "event" in msg and "view" in msg and (msg["view"] is not None):
- toggle_filter(msg["view"])
- except KeyboardInterrupt:
- views = sock.list_views()
- for view in views:
- try:
- wpe.unset_view_shader(int(view["id"]))
- except:
- pass
- exit(0)
diff --color -Naurp wayfire-plugins-extra-0.10.0/subprojects/filters/ipc-scripts/fs-has-shader.py wayfire-plugins-extra/subprojects/filters/ipc-scripts/fs-has-shader.py
--- wayfire-plugins-extra-0.10.0/subprojects/filters/ipc-scripts/fs-has-shader.py 2025-07-15 06:13:43.000000000 -0600
+++ wayfire-plugins-extra/subprojects/filters/ipc-scripts/fs-has-shader.py 1969-12-31 17:00:00.000000000 -0700
@@ -1,11 +0,0 @@
-#!/usr/bin/python3
-
-import os
-import sys
-from wayfire import WayfireSocket
-from wayfire.extra.wpe import WPE
-
-sock = WayfireSocket()
-wpe = WPE(sock)
-
-print(f'Output {sys.argv[1]} has shader: {wpe.fs_has_shader(sys.argv[1])["has-shader"]}')
diff --color -Naurp wayfire-plugins-extra-0.10.0/subprojects/filters/ipc-scripts/set-fs-shader.py wayfire-plugins-extra/subprojects/filters/ipc-scripts/set-fs-shader.py
--- wayfire-plugins-extra-0.10.0/subprojects/filters/ipc-scripts/set-fs-shader.py 2025-07-15 06:13:43.000000000 -0600
+++ wayfire-plugins-extra/subprojects/filters/ipc-scripts/set-fs-shader.py 1969-12-31 17:00:00.000000000 -0700
@@ -1,15 +0,0 @@
-#!/usr/bin/python3
-
-import os
-import sys
-from wayfire import WayfireSocket
-from wayfire.extra.wpe import WPE
-
-if len(sys.argv) < 3:
- print("Required arguments: