From 84015c79724df49e66977d4f96c472c98350c7ba Mon Sep 17 00:00:00 2001 From: Aleksander Date: Sat, 14 Mar 2026 13:20:48 +0100 Subject: [PATCH 01/26] update toast.mp3 sound [skip ci] --- wayvr/src/res/toast.mp3 | Bin 3979 -> 9032 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/wayvr/src/res/toast.mp3 b/wayvr/src/res/toast.mp3 index a3ab62b1cfc6124340b4b7a36f1b0f8a6a09a1a4..702d330ce1eac161c232e3f6225f827ade2ab894 100644 GIT binary patch literal 9032 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 E0Bu`5YXATM literal 3979 zcmd6qi91w%8^@0^mSJed)|g6X5VA~zEJ?*!GFh@qRK^$vGe%>CBtv$l$C{~BWS4r8 zEUB!?R? z1wF|`ZIDSJGC?}k59B|K#1B&GRKV5J*@EA(D8D;BoSrV=YH`$o?{DGz0!g5izdxD8 z{6_|oKVWgx-v0kegNut5zh`NFYj(sl{)T#3eXK4H#}EAn-nv=af9!v*gb;r^-{DII z5C9JDNaFXXyE#+- zK^4mS+m?E)Sns_iuzBl_T>v1yRI1BF0S@0GP2uT4)Om zwtlq@<2KngZk~@rrTcc{rvAj(^ys~XLtbhq)#AB7YxV|eKJ%{0&F<5%a?b7@>auVM zvlwzNcP=`wNX*DhW6zyEowYyEqi}Kh(?$;GeQSNU-r(rk55)Re&3-UGgZnZEExCmp!%c{`@$>yYBa>Pkrc6 z387w9L8iy}plLgJ>osg|ZL)L_;ej_5MHa0YXC~H%Y2ut#zL3-0N3rWN5;c-|H{uInjI`wtJChjDY^CP+D)1J&@wiQ&%y(8%y z8Ay9YhUp9`M~sMSg2)ZO{A@$%R;u4vxQommS?ApOS9HUh4U*S0&wk#qVJ`F#-~dx7s1%i4dM~`i(PYDP&Nl6Z9ZxzL@LeV-Z8)|~KfFar zu_{-(5*^g%8+`obdU1=BiHeE-vqqj5c>jypHtEQqCP9f8dW_#zyA7LwNX`Hufp^< z4q;(WKOKxFW+U zpja!q>^AQc&rdm>1;o$oK&`PZ;FSlA56!Hh=I@Aa{^_lRWrU3MWli=6P_ zTJ5GFaR62k5c6vpKsuM~FL^ zE|jCi+pwUB6k%@o9~$B)IHRGzH$fR-J#U$VvHU}dUc6J7yGpqbrQx-fk|#eIhcBXz zhvTV=p^#ykaKT01j-mWBk+zdb#>Gyvh^?h$Uk?aScAXy} zoccidJpApYOSt}4+aORP9&CR1J~V7f?jy1OGm#_0V>#s zK$gV0Js#5~U2#X)!KUBgRTZLr!(=z*OmC=fnbDGaBab&Wh^Vga%jzDtlob_D0#_t6 zdn{EirA>Etk2n2jn~kO<#8pdH*enpzlAFtmW}0f+#cygN-$(!%FgxKd2%^k!t3W5N z59d^J_031?Yl)8sU8|B>E(eF3Oi%!b(!~x-T7FtrICnkIdq*x5)2Z)FYCbM*K%JtV z?i1};kQWm6%Pfb}V1&lo72BOCejd723*R*dCt5Kj3(GBc&K7W2C&SQ&Mn-}!1ua10 zn1}ro+@YP2Sat5ZqWIk9@Y@ZU<$DLC#;$CaKuL_`Kdy#Cu(EewJ6gM%sw0y}F-{}3 zK=VouS|KvX++9jqvM>lgb8t#jtZch!%B_%?g@`bpQq!NK2U^RszP}KQjPxfHw$W4% zneQ@RGWJabK@*>&$=BuNeLl#(+7AzCI*^)2_k(dPvor7NtDi5ZxpqIAi2#-$J@7n| zIMhbO@KEDyYQ}A@e5)Fx0rwm2-l(rhyh4x#6I(hy-Wsji!G_QdVOo%e(9J1l2uRpu zo%+C`Ia#L!{!)PB+7*2g^$&NjO?JUjQ%y~3D28umo;=v*nFJ}fY?>X`R2t}T%bJW> zvh;XJ8t;tP7kctyW$ocrg)1$S6Zg}pY!EtJg|aJ*LuuG{sCLCMR5ZGBN(eP}k+n#( z%1E19AMO|aE8&&4u!*#o#SvAE5V8A@ebfZ0={bYwTXx%dd-K(g#cT1fq|<_&6*7!*=kE+OOx$V;`0` zIElQz*7%qKpIK~pe-I6w&R^fbzPTJq!QHoJ>JE-m9a;#ot=JhE;oxE zYGx6yL^_o1<&#pbYn__*2rlYJSrt>uYDubUi&0O}W5b3;r))Kub$N`WLBJ3|p zI2pHJ>f;KK@mAQ?-puqQ%CYG@-mgnV+%ZA>C=6!W`7SE+!BLEF@PO{=*wNNSH`l6l z3GRlREmh7 Date: Mon, 16 Mar 2026 13:37:50 +0900 Subject: [PATCH 02/26] dbus notify timeout is ms --- wayvr/src/main.rs | 2 +- wayvr/src/overlays/screen/pw.rs | 3 ++- wayvr/src/subsystem/dbus/mod.rs | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/wayvr/src/main.rs b/wayvr/src/main.rs index 6d73a9ec..6f6bc079 100644 --- a/wayvr/src/main.rs +++ b/wayvr/src/main.rs @@ -192,7 +192,7 @@ fn auto_run(args: Args, used_backend: &mut Option) { let instructions = format!("Could not connect to runtime.\n{instructions}"); - let _ = DbusConnector::notify_send("WayVR", &instructions, 1, 0, 0, false); + let _ = DbusConnector::notify_send("WayVR", &instructions, 1, 30000, 0, false); #[cfg(not(any(feature = "openvr", feature = "openxr")))] compile_error!("No VR support! Enable either openvr or openxr features!"); diff --git a/wayvr/src/overlays/screen/pw.rs b/wayvr/src/overlays/screen/pw.rs index 7a254c84..1ab14e57 100644 --- a/wayvr/src/overlays/screen/pw.rs +++ b/wayvr/src/overlays/screen/pw.rs @@ -95,7 +95,8 @@ pub(super) fn select_pw_screen( task::Poll::Pending => { if Instant::now() >= print_at { log::info!("{instructions}"); - if let Ok(id) = DbusConnector::notify_send(instructions, "", 1, 60, 0, true) + if let Ok(id) = + DbusConnector::notify_send(instructions, "", 1, 30000, 0, true) { notify = Some(id); } diff --git a/wayvr/src/subsystem/dbus/mod.rs b/wayvr/src/subsystem/dbus/mod.rs index 552d9831..fa107f8a 100644 --- a/wayvr/src/subsystem/dbus/mod.rs +++ b/wayvr/src/subsystem/dbus/mod.rs @@ -94,7 +94,7 @@ impl DbusConnector { summary: &str, body: &str, urgency: u8, - timeout: i32, + timeout_ms: i32, replaces_id: u32, transient: bool, ) -> anyhow::Result { From 769978560e47d9152d4c78c70e32921585f54981 Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Mon, 16 Mar 2026 13:46:23 +0900 Subject: [PATCH 03/26] oops --- wayvr/src/subsystem/dbus/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wayvr/src/subsystem/dbus/mod.rs b/wayvr/src/subsystem/dbus/mod.rs index fa107f8a..171498b5 100644 --- a/wayvr/src/subsystem/dbus/mod.rs +++ b/wayvr/src/subsystem/dbus/mod.rs @@ -118,7 +118,7 @@ impl DbusConnector { body, vec![], hints, - timeout, + timeout_ms, )?; Ok(retval) } From d9f89faf33e4ed95b3d3dc7b803bb46e2adfc59a Mon Sep 17 00:00:00 2001 From: Aleksander Date: Sun, 15 Mar 2026 18:59:27 +0100 Subject: [PATCH 04/26] wayvr: "Fix floor" countdown timer and sound - 5-second timeout sound with countdown timer - sort locale JSON - modify toast lerp amount --- wayvr/src/assets/lang/de.json | 7 +-- wayvr/src/assets/lang/en.json | 85 ++++++++++++++++--------------- wayvr/src/assets/lang/es.json | 7 +-- wayvr/src/assets/lang/it.json | 7 +-- wayvr/src/assets/lang/ja.json | 7 +-- wayvr/src/assets/lang/pl.json | 7 +-- wayvr/src/assets/lang/zh_CN.json | 7 +-- wayvr/src/gui/panel/button.rs | 42 ++++++++++----- wayvr/src/overlays/toast.rs | 10 +++- wayvr/src/res/fix_floor.mp3 | Bin 0 -> 74120 bytes wayvr/src/state.rs | 12 ++++- 11 files changed, 116 insertions(+), 75 deletions(-) create mode 100644 wayvr/src/res/fix_floor.mp3 diff --git a/wayvr/src/assets/lang/de.json b/wayvr/src/assets/lang/de.json index bcdb30ac..f4969b8c 100644 --- a/wayvr/src/assets/lang/de.json +++ b/wayvr/src/assets/lang/de.json @@ -109,9 +109,10 @@ "LAST_EXISTING_SET": "Dies ist das letzte vorhandene Set.", "EMPTY_SET": "Leeres Set!", "LETS_ADD_OVERLAYS": "Lass uns ein paar Overlays von der Uhr hinzufügen!", - "FIXING_FLOOR": "Boden wird in 5 Sekunden fixiert...", "ONE_CONTROLLER_ON_FLOOR": "Lege einen Controller auf den Boden!", "CANNOT_ADD_SET": "Satz kann nicht hinzugefügt werden!", - "MAXIMUM_SETS_REACHED": "Maximale Anzahl an Sets erreicht." - } + "MAXIMUM_SETS_REACHED": "Maximale Anzahl an Sets erreicht.", + "FIXING_FLOOR_IN_X_SECS": "Boden wird in {SECONDS} Sekunde(n) repariert..." + }, + "DONE": "Erledigt" } \ No newline at end of file diff --git a/wayvr/src/assets/lang/en.json b/wayvr/src/assets/lang/en.json index 2c176feb..b3a3070a 100644 --- a/wayvr/src/assets/lang/en.json +++ b/wayvr/src/assets/lang/en.json @@ -4,41 +4,56 @@ }, "BAR": { "ADD_MIRROR": "Add a new mirror overlay", - "EDIT_MODE_TOGGLE": "Toggle edit mode", "ADD_NEW_SET": "Add new set", - "DELETE_CURRENT_SET": "Delete current set", - "TOGGLE_VISIBILITY": "Toggle visibility", - "RESET_POSITION": "Reset position", - "RELOAD_FROM_DISK": "Reload XML from disk", - "CLOSE_MIRROR": "Close mirror", "CLOSE_APP": "Close app", + "CLOSE_MIRROR": "Close mirror", + "DELETE_CURRENT_SET": "Delete current set", + "EDIT_MODE_TOGGLE": "Toggle edit mode", "FORCE_CLOSE_APP": "Force close app", "HANDSFREE": { - "TITLE": "Handsfree mode", - "NONE": "Off", - "HMD": "HMD + pinch", + "EYE_ONLY": "Eye only", "EYE_TRACKING": "Eye + pinch", + "HMD": "HMD + pinch", "HMD_ONLY": "HMD only", - "EYE_ONLY": "Eye only" - } + "NONE": "Off", + "TITLE": "Handsfree mode" + }, + "RELOAD_FROM_DISK": "Reload XML from disk", + "RESET_POSITION": "Reset position", + "TOGGLE_VISIBILITY": "Toggle visibility" }, "DEFAULT": "Default", "DISABLED": "Disabled", + "DONE": "Done", "EDIT_MODE": { "ADJUST_CURVATURE": "Adjust curvature", + "ALIGN_TO_HMD": "Align to HMD", "ALPHA_BLEND_MODE": "Alpha blend mode", - "BLENDING_ADDITIVE": "Additive blending", "ANGLE_FADE": "Angle fade", "ANGLE_FADE_HELP": "Fade when not facing HMD", + "BLENDING_ADDITIVE": "Additive blending", + "BLOCK_INPUT": "Block game input", "CURVATURE": "Curvature", "DELETE": "Long press to remove from current set", "DISABLE_GRAB": "Disable grab", + "GLOBAL": "Always visible", "HINT_POINT_WINDOW": "Point at a window to change its parameters.\nOnce done, leave edit mode using the button on the right.", "INTERPOLATION": "Interpolation", - "ALIGN_TO_HMD": "Align to HMD", "KEYBOARD": "Keyboard", "LEAVE": "Leave edit mode", "LOCK_INTERACTION": "Lock interaction", + "MOUSE": { + "FLIP180": "Flipped 180°", + "FLIP270": "Flipped 270°", + "FLIP90": "Flipped 90°", + "FLIPPED": "Flipped", + "NORMAL": "Normal", + "ROTATE180": "Rotated 180°", + "ROTATE270": "Rotated 270°", + "ROTATE90": "Rotated 90°", + "TITLE": "Mouse fixes", + "WRONG_SCREEN_SELECTION_HELP": "If the cursor moves on a completely different screen,\nthe screens were likely selected wrong. See readme." + }, "MOVE_PRESS_AND_DRAG": "Move (press & drag)", "OPACITY": "Opacity", "POS_ANCHORED": "Anchored: Moves with center marker. Default.", @@ -48,56 +63,42 @@ "POS_HMD": "Follow the HMD.", "POS_STATIC": "Static: Not part of any set, no recenter.", "POSITIONING": "Positioning", - "GLOBAL": "Always visible", - "BLOCK_INPUT": "Block game input", "RESIZE_PRESS_AND_DRAG": "Resize (press & drag)", "STEREO_3D_MODE": { "ADJUST_MOUSE": "Adjust mouse", + "FULL_FRAME": "Full 3D", + "FULL_FRAME_BAT": "Full-BAT", + "FULL_FRAME_SBS": "Full-SBS", + "FULL_FRAME_TAB": "Full-TAB", "SPLIT_BOTTOM_TOP": "BOTTOM→TOP", "SPLIT_LEFT_RIGHT": "LEFT→RIGHT", "SPLIT_RIGHT_LEFT": "RIGHT→LEFT", "SPLIT_TOP_BOTTOM": "TOP→BOTTOM", - "TITLE": "3D Stereo Mode", - "FULL_FRAME": "Full 3D", - "FULL_FRAME_SBS": "Full-SBS", - "FULL_FRAME_TAB": "Full-TAB", - "FULL_FRAME_BAT": "Full-BAT" - }, - "MOUSE": { - "TITLE": "Mouse fixes", - "WRONG_SCREEN_SELECTION_HELP": "If the cursor moves on a completely different screen,\nthe screens were likely selected wrong. See readme.", - "NORMAL": "Normal", - "ROTATE90": "Rotated 90°", - "ROTATE180": "Rotated 180°", - "ROTATE270": "Rotated 270°", - "FLIPPED": "Flipped", - "FLIP90": "Flipped 90°", - "FLIP180": "Flipped 180°", - "FLIP270": "Flipped 270°" + "TITLE": "3D Stereo Mode" } }, "GRAB": { "ADJUST_DISTANCE": "Adjust distance", "ADJUST_SIZE": "Adjust size", - "UNRESTRICTED_MOVEMENT": "Unrestricted movement", - "GRABBING_WATCH": "To swap hands, move the watch in front and grab it with the other hand.", - "GRABBING_STATIC": "This overlay is Static and will stay in place, ignoring recenter.", "GRABBING_ANCHORED": "Anchored overlays all move together. Separate a single window by grabbing it with the other hand while still grabbing the anchor.", "GRABBING_ANCHORED_EDIT": "This overlay will stay anchored to the center marker.", "GRABBING_FLOATING": "This overlay is Floating and will stay in place, unless recentered.", - "GRABBING_FOLLOW": "This overlay will follow the device it is attached to." + "GRABBING_FOLLOW": "This overlay will follow the device it is attached to.", + "GRABBING_STATIC": "This overlay is Static and will stay in place, ignoring recenter.", + "GRABBING_WATCH": "To swap hands, move the watch in front and grab it with the other hand.", + "UNRESTRICTED_MOVEMENT": "Unrestricted movement" }, "TOAST": { - "DEFAULT_TITLE": "Notification", - "ERROR": "Error", "CANNOT_ADD_SET": "Cannot add set!", - "MAXIMUM_SETS_REACHED": "Maximum number of sets reached.", "CANNOT_REMOVE_SET": "Cannot remove set!", - "NO_SET_SELECTED": "No set is selected.", - "LAST_EXISTING_SET": "This is the last existing set.", + "DEFAULT_TITLE": "Notification", "EMPTY_SET": "Empty set!", + "ERROR": "Error", + "FIXING_FLOOR_IN_X_SECS": "Fixing floor in {SECONDS} second(s)...", + "LAST_EXISTING_SET": "This is the last existing set.", "LETS_ADD_OVERLAYS": "Let's add some overlays from the watch!", - "FIXING_FLOOR": "Fixing floor in 5 seconds...", + "MAXIMUM_SETS_REACHED": "Maximum number of sets reached.", + "NO_SET_SELECTED": "No set is selected.", "ONE_CONTROLLER_ON_FLOOR": "Place one controller on the floor!" }, "WATCH": { diff --git a/wayvr/src/assets/lang/es.json b/wayvr/src/assets/lang/es.json index 6dc279c2..8236a64a 100644 --- a/wayvr/src/assets/lang/es.json +++ b/wayvr/src/assets/lang/es.json @@ -109,9 +109,10 @@ "LAST_EXISTING_SET": "Este es el último conjunto existente.", "EMPTY_SET": "¡Conjunto vacío!", "LETS_ADD_OVERLAYS": "¡Añadamos algunos overlays desde el reloj!", - "FIXING_FLOOR": "Fijando el suelo en 5 segundos...", "ONE_CONTROLLER_ON_FLOOR": "¡Coloca un mando en el suelo!", "CANNOT_ADD_SET": "¡No se puede agregar el conjunto!", - "MAXIMUM_SETS_REACHED": "Se ha alcanzado el número máximo de sets." - } + "MAXIMUM_SETS_REACHED": "Se ha alcanzado el número máximo de sets.", + "FIXING_FLOOR_IN_X_SECS": "Corrigiendo el suelo en {SECONDS} segundo(s)..." + }, + "DONE": "Hecho" } \ No newline at end of file diff --git a/wayvr/src/assets/lang/it.json b/wayvr/src/assets/lang/it.json index f21ea3b9..ed3015e8 100644 --- a/wayvr/src/assets/lang/it.json +++ b/wayvr/src/assets/lang/it.json @@ -97,8 +97,8 @@ "LAST_EXISTING_SET": "Questo è l'ultimo set esistente.", "EMPTY_SET": "Set vuoto!", "LETS_ADD_OVERLAYS": "Aggiungiamo degli overlay dal Watch!", - "FIXING_FLOOR": "Rifissaggio del pavimento tra 5 secondi...", - "ONE_CONTROLLER_ON_FLOOR": "Posiziona un controller a terra!" + "ONE_CONTROLLER_ON_FLOOR": "Posiziona un controller a terra!", + "FIXING_FLOOR_IN_X_SECS": "Correzione del pavimento in {SECONDS} secondo/i..." }, "WATCH": { "ADD_NEW_SET": "Aggiungi un nuovo set", @@ -111,5 +111,6 @@ "RECENTER": "Recentra l'area di gioco", "SWITCH_TO_SET": "Passa a set", "TOGGLE_FOR_CURRENT_SET": "Attiva/disattiva per il set corrente" - } + }, + "DONE": "Fatto" } \ No newline at end of file diff --git a/wayvr/src/assets/lang/ja.json b/wayvr/src/assets/lang/ja.json index 111fddc5..c493120a 100644 --- a/wayvr/src/assets/lang/ja.json +++ b/wayvr/src/assets/lang/ja.json @@ -107,9 +107,10 @@ "LAST_EXISTING_SET": "これが最後の設定です。", "EMPTY_SET": "空のセットです!", "LETS_ADD_OVERLAYS": "ウォッチからオーバーレイを追加しましょう!", - "FIXING_FLOOR": "5秒後にフロアを固定します...", "ONE_CONTROLLER_ON_FLOOR": "コントローラーを床に置いてください!", "CANNOT_ADD_SET": "セットを追加できません!", - "MAXIMUM_SETS_REACHED": "最大セット数に達しました。" - } + "MAXIMUM_SETS_REACHED": "最大セット数に達しました。", + "FIXING_FLOOR_IN_X_SECS": "{SECONDS}秒で床を固定中..." + }, + "DONE": "完了" } \ No newline at end of file diff --git a/wayvr/src/assets/lang/pl.json b/wayvr/src/assets/lang/pl.json index d69cd719..0d3d1fca 100644 --- a/wayvr/src/assets/lang/pl.json +++ b/wayvr/src/assets/lang/pl.json @@ -107,9 +107,10 @@ "LAST_EXISTING_SET": "To jest ostatni istniejący zestaw.", "EMPTY_SET": "Pusty zestaw!", "LETS_ADD_OVERLAYS": "Dodajmy kilka nakładek z zegarka!", - "FIXING_FLOOR": "Naprawianie podłogi za 5 sekund...", "ONE_CONTROLLER_ON_FLOOR": "Umieść jeden kontroler na podłodze!", "CANNOT_ADD_SET": "Nie można dodać zestawu!", - "MAXIMUM_SETS_REACHED": "Osiągnięto maksymalną liczbę zestawów." - } + "MAXIMUM_SETS_REACHED": "Osiągnięto maksymalną liczbę zestawów.", + "FIXING_FLOOR_IN_X_SECS": "Naprawianie podłogi za {SECONDS} sekund(y)..." + }, + "DONE": "Gotowe" } \ No newline at end of file diff --git a/wayvr/src/assets/lang/zh_CN.json b/wayvr/src/assets/lang/zh_CN.json index 87ff1f5c..eda4e52a 100644 --- a/wayvr/src/assets/lang/zh_CN.json +++ b/wayvr/src/assets/lang/zh_CN.json @@ -97,8 +97,8 @@ "LAST_EXISTING_SET": "这是最后一个现有的集合。", "EMPTY_SET": "空集合!", "LETS_ADD_OVERLAYS": "让我们从手表添加一些覆盖层吧!", - "FIXING_FLOOR": "将在 5 秒内修复地面...", - "ONE_CONTROLLER_ON_FLOOR": "请将一个控制器放在地面上!" + "ONE_CONTROLLER_ON_FLOOR": "请将一个控制器放在地面上!", + "FIXING_FLOOR_IN_X_SECS": "{SECONDS}秒内固定地面..." }, "WATCH": { "ADD_NEW_SET": "添加新集合", @@ -111,5 +111,6 @@ "RECENTER": "重置游玩区中心 (Recenter)", "SWITCH_TO_SET": "切换到集合", "TOGGLE_FOR_CURRENT_SET": "切换当前集合" - } + }, + "DONE": "完成" } \ No newline at end of file diff --git a/wayvr/src/gui/panel/button.rs b/wayvr/src/gui/panel/button.rs index ab14b660..ad4e9689 100644 --- a/wayvr/src/gui/panel/button.rs +++ b/wayvr/src/gui/panel/button.rs @@ -577,19 +577,37 @@ pub(super) fn setup_custom_button( return Ok(EventResult::Pass); } - Toast::new( - ToastTopic::System, - "TOAST.FIXING_FLOOR".into(), - "TOAST.ONE_CONTROLLER_ON_FLOOR".into(), - ) - .with_timeout(5.) - .with_sound(true) - .submit(app); + let globals = app.wgui_globals.clone(); - app.tasks.enqueue_at( - TaskType::Playspace(PlayspaceTask::FixFloor), - Instant::now() + Duration::from_secs(5), - ); + let duration_secs = 5; + let now = Instant::now(); + + for i in 0..duration_secs { + Toast::new( + ToastTopic::System, + globals.i18n().translate_and_replace( + "TOAST.FIXING_FLOOR_IN_X_SECS", + ("{SECONDS}", &format!("{}", duration_secs - i)), + ), + "TOAST.ONE_CONTROLLER_ON_FLOOR".into(), + ) + .with_timeout(1.0) + .with_lerp_amount(1.0) + .with_sound(i == 0) + .submit_at(app, now + Duration::from_secs(i as _)); + } + + app.audio_sample_player + .play_sample(&mut app.audio_system, "fix_floor"); + + let deadline = now + Duration::from_secs(duration_secs); + + app.tasks + .enqueue_at(TaskType::Playspace(PlayspaceTask::FixFloor), deadline); + + Toast::new(ToastTopic::System, "DONE".into(), String::new()) + .with_timeout(2.0) + .submit_at(app, deadline); Ok(EventResult::Consumed) }), "::Shutdown" => Box::new(move |_common, data, app, _| { diff --git a/wayvr/src/overlays/toast.rs b/wayvr/src/overlays/toast.rs index 7db4fb48..410a54a3 100644 --- a/wayvr/src/overlays/toast.rs +++ b/wayvr/src/overlays/toast.rs @@ -30,6 +30,7 @@ pub struct Toast { pub body: String, pub opacity: f32, pub timeout: f32, + pub lerp_amount: f32, pub sound: bool, pub topic: ToastTopic, } @@ -41,6 +42,7 @@ impl Toast { title, body, opacity: 1.0, + lerp_amount: 0.1, timeout: 3.0, sound: false, topic, @@ -50,6 +52,10 @@ impl Toast { self.timeout = timeout; self } + pub const fn with_lerp_amount(mut self, lerp: f32) -> Self { + self.lerp_amount = lerp; + self + } pub const fn with_opacity(mut self, opacity: f32) -> Self { self.opacity = opacity; self @@ -118,7 +124,9 @@ fn new_toast(toast: Toast, app: &mut AppState) -> Option { ToastDisplayMethod::Center => ( vec3(0., -0.2, -0.5), Quat::IDENTITY, - Positioning::FollowHead { lerp: 0.1 }, + Positioning::FollowHead { + lerp: toast.lerp_amount, + }, ), ToastDisplayMethod::Watch => { let relative_to = Positioning::FollowHand { diff --git a/wayvr/src/res/fix_floor.mp3 b/wayvr/src/res/fix_floor.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..8a2cf9c6b92abf5d490499b1503ce3a38edf4288 GIT binary patch literal 74120 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

h&y=0 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 literal 0 HcmV?d00001 diff --git a/wayvr/src/state.rs b/wayvr/src/state.rs index 59146f36..180f14dd 100644 --- a/wayvr/src/state.rs +++ b/wayvr/src/state.rs @@ -98,7 +98,7 @@ impl AppState { let mut audio_sample_player = audio::SamplePlayer::new(); audio_sample_player.register_sample( "key_click", - audio::AudioSample::from_mp3(&*audio::AudioSample::bytes_from_config_or_default( + audio::AudioSample::from_mp3(&audio::AudioSample::bytes_from_config_or_default( "sound/key_click.mp3", include_bytes!("res/key_click.mp3"), ))?, @@ -106,12 +106,20 @@ impl AppState { audio_sample_player.register_sample( "toast", - audio::AudioSample::from_mp3(&*audio::AudioSample::bytes_from_config_or_default( + audio::AudioSample::from_mp3(&audio::AudioSample::bytes_from_config_or_default( "sound/toast.mp3", include_bytes!("res/toast.mp3"), ))?, )?; + audio_sample_player.register_sample( + "fix_floor", + audio::AudioSample::from_mp3(&audio::AudioSample::bytes_from_config_or_default( + "sound/fix_floor.mp3", + include_bytes!("res/fix_floor.mp3"), + ))?, + )?; + let mut assets = Box::new(gui::asset::GuiAsset {}); audio_sample_player.register_wgui_samples(assets.as_mut())?; From 786847cc2f1d99010b6a7eb80e59941c6a58a3f2 Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Wed, 18 Mar 2026 12:31:24 +0900 Subject: [PATCH 05/26] update pipewire-rs to fix build on arch --- wlx-capture/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wlx-capture/Cargo.toml b/wlx-capture/Cargo.toml index 0e1b94dc..8ff3a9e0 100644 --- a/wlx-capture/Cargo.toml +++ b/wlx-capture/Cargo.toml @@ -32,7 +32,7 @@ drm-fourcc = "2.2.0" idmap = { workspace = true } libc = "0.2.178" log = { workspace = true } -pipewire = { git = "https://gitlab.freedesktop.org/galister/pipewire-rs.git", rev = "ba32202c3c391004c3bb533b58fa75a50e47ff57", features = [ +pipewire = { git = "https://gitlab.freedesktop.org/galister/pipewire-rs.git", rev = "6ef2cd1af41e5e8844c63c37ea9a01f0758079b0", features = [ "v0_3_33", ], optional = true } #pipewire = { version = "0.8.0", features = ["v0_3_33"], optional = true } From 635df298fec63c610062fa362b6fb03268efa37a Mon Sep 17 00:00:00 2001 From: Craig McLure Date: Wed, 18 Mar 2026 13:13:09 +0000 Subject: [PATCH 06/26] Updated the pipewire reference in Cargo.lock --- Cargo.lock | 53 ++++++++--------------------------------------------- 1 file changed, 8 insertions(+), 45 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 86f41ee9..9b591ec8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -143,16 +143,6 @@ dependencies = [ "libc", ] -[[package]] -name = "annotate-snippets" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccaf7e9dfbb6ab22c82e473cd1a8a7bd313c19a5b7e40970f3d89ef5a5c9e81e" -dependencies = [ - "unicode-width 0.1.14", - "yansi-term", -] - [[package]] name = "anstream" version = "0.6.21" @@ -683,21 +673,18 @@ checksum = "f09c37bc0e9f0924b7dae9988265ef3c76c88538f41a3b06caf4bed07cee5226" [[package]] name = "bindgen" -version = "0.69.5" +version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "annotate-snippets", "bitflags 2.10.0", "cexpr", "clang-sys", - "itertools 0.12.1", - "lazy_static", - "lazycell", + "itertools 0.10.5", "proc-macro2", "quote", "regex", - "rustc-hash 1.1.0", + "rustc-hash 2.1.1", "shlex", "syn 2.0.113", ] @@ -2666,15 +2653,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.13.0" @@ -2817,12 +2795,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "lebe" version = "0.5.3" @@ -2910,7 +2882,7 @@ dependencies = [ [[package]] name = "libspa" version = "0.8.0" -source = "git+https://gitlab.freedesktop.org/galister/pipewire-rs.git?rev=ba32202c3c391004c3bb533b58fa75a50e47ff57#ba32202c3c391004c3bb533b58fa75a50e47ff57" +source = "git+https://gitlab.freedesktop.org/galister/pipewire-rs.git?rev=6ef2cd1af41e5e8844c63c37ea9a01f0758079b0#6ef2cd1af41e5e8844c63c37ea9a01f0758079b0" dependencies = [ "bitflags 2.10.0", "cc", @@ -2926,7 +2898,7 @@ dependencies = [ [[package]] name = "libspa-sys" version = "0.8.0" -source = "git+https://gitlab.freedesktop.org/galister/pipewire-rs.git?rev=ba32202c3c391004c3bb533b58fa75a50e47ff57#ba32202c3c391004c3bb533b58fa75a50e47ff57" +source = "git+https://gitlab.freedesktop.org/galister/pipewire-rs.git?rev=6ef2cd1af41e5e8844c63c37ea9a01f0758079b0#6ef2cd1af41e5e8844c63c37ea9a01f0758079b0" dependencies = [ "bindgen", "cc", @@ -4003,7 +3975,7 @@ dependencies = [ [[package]] name = "pipewire" version = "0.8.0" -source = "git+https://gitlab.freedesktop.org/galister/pipewire-rs.git?rev=ba32202c3c391004c3bb533b58fa75a50e47ff57#ba32202c3c391004c3bb533b58fa75a50e47ff57" +source = "git+https://gitlab.freedesktop.org/galister/pipewire-rs.git?rev=6ef2cd1af41e5e8844c63c37ea9a01f0758079b0#6ef2cd1af41e5e8844c63c37ea9a01f0758079b0" dependencies = [ "anyhow", "bitflags 2.10.0", @@ -4019,7 +3991,7 @@ dependencies = [ [[package]] name = "pipewire-sys" version = "0.8.0" -source = "git+https://gitlab.freedesktop.org/galister/pipewire-rs.git?rev=ba32202c3c391004c3bb533b58fa75a50e47ff57#ba32202c3c391004c3bb533b58fa75a50e47ff57" +source = "git+https://gitlab.freedesktop.org/galister/pipewire-rs.git?rev=6ef2cd1af41e5e8844c63c37ea9a01f0758079b0#6ef2cd1af41e5e8844c63c37ea9a01f0758079b0" dependencies = [ "bindgen", "libspa-sys", @@ -7130,15 +7102,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" -[[package]] -name = "yansi-term" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe5c30ade05e61656247b2e334a031dfd0cc466fadef865bdcdea8d537951bf1" -dependencies = [ - "winapi", -] - [[package]] name = "yazi" version = "0.2.1" From b0bbc25083c1430fc4f43c109002865b5993bddc Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Fri, 20 Mar 2026 12:48:52 +0900 Subject: [PATCH 07/26] dont die if autostart app cant be started --- wayvr/src/overlays/dashboard.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wayvr/src/overlays/dashboard.rs b/wayvr/src/overlays/dashboard.rs index 48e9ef07..9b849d6e 100644 --- a/wayvr/src/overlays/dashboard.rs +++ b/wayvr/src/overlays/dashboard.rs @@ -74,7 +74,7 @@ impl DashFrontend { let mut interface = DashInterfaceLive::new(); for p in app.session.config.autostart_apps.clone() { - let _ = interface.process_launch(app, false, p)?; + let _ = interface.process_launch(app, false, p); } let frontend = frontend::Frontend::new(frontend::InitParams { From b89ae4726ca2a0daa4d7afab5ae481abec2e804b Mon Sep 17 00:00:00 2001 From: hare_ware <3469405-hare_ware@users.noreply.gitlab.com> Date: Wed, 18 Mar 2026 07:27:44 -0400 Subject: [PATCH 08/26] Revert "fix bindings for wmr controllers" This reverts commit 285f6db134852faad2940f630aac89c9818b157f. --- wayvr/src/backend/openxr/openxr_actions.json5 | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/wayvr/src/backend/openxr/openxr_actions.json5 b/wayvr/src/backend/openxr/openxr_actions.json5 index 53467d7c..c0950db7 100644 --- a/wayvr/src/backend/openxr/openxr_actions.json5 +++ b/wayvr/src/backend/openxr/openxr_actions.json5 @@ -261,11 +261,11 @@ right: "/user/hand/right/input/thumbstick/x" }, show_hide: { - left: "/user/hand/left/input/menu/click", + left: "/user/hand/left/input/system/click", }, space_drag: { double_click: true, - right: "/user/hand/left/input/menu/click", + right: "/user/hand/left/input/system/click", }, click_modifier_right: { left: "/user/hand/left/input/trackpad/dpad_up", @@ -305,11 +305,11 @@ right: "/user/hand/right/input/thumbstick/x" }, show_hide: { - left: "/user/hand/left/input/menu/click", + left: "/user/hand/left/input/system/click", }, space_drag: { double_click: true, - right: "/user/hand/left/input/menu/click", + right: "/user/hand/left/input/system/click", }, }, From ee4bb5ca29ab274f66125f2fb8dffed4af4bdd52 Mon Sep 17 00:00:00 2001 From: Earthgames <91308448+Earthgames@users.noreply.github.com> Date: Mon, 23 Mar 2026 04:24:16 +0100 Subject: [PATCH 09/26] Allow the checkbox to be themed (#462) --- wgui/doc/widgets.md | 2 ++ wgui/src/components/button.rs | 30 +++++++++------------------ wgui/src/components/checkbox.rs | 17 ++++++++++----- wgui/src/parser/component_checkbox.rs | 1 + 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/wgui/doc/widgets.md b/wgui/doc/widgets.md index 4878f2cc..24817b15 100644 --- a/wgui/doc/widgets.md +++ b/wgui/doc/widgets.md @@ -356,6 +356,8 @@ _Translated by key_ `box_size`: **float** (default: 24) +`color_checked`: #FFAABB | #FFAABBCC + `value`: **string** _optional value that will be sent with internal events_ diff --git a/wgui/src/components/button.rs b/wgui/src/components/button.rs index b782c280..b929d1b6 100644 --- a/wgui/src/components/button.rs +++ b/wgui/src/components/button.rs @@ -428,29 +428,19 @@ pub fn construct(ess: &mut ConstructEssentials, params: Params) -> anyhow::Resul style.overflow.y = taffy::Overflow::Hidden; // update colors to default ones if they are not specified - let color = if let Some(color) = params.color { - color - } else { - theme.button_color - }; + let color = params.color.unwrap_or(theme.button_color); - let border_color = if let Some(border_color) = params.border_color { - border_color - } else { - Color::new(color.r, color.g, color.b, color.a + 0.25) - }; + let border_color = params + .border_color + .unwrap_or_else(|| Color::new(color.r, color.g, color.b, color.a + 0.25)); - let hover_color = if let Some(hover_color) = params.hover_color { - hover_color - } else { - Color::new(color.r + 0.25, color.g + 0.25, color.g + 0.25, color.a + 0.15) - }; + let hover_color = params + .hover_color + .unwrap_or_else(|| Color::new(color.r + 0.25, color.g + 0.25, color.g + 0.25, color.a + 0.15)); - let hover_border_color = if let Some(hover_border_color) = params.hover_border_color { - hover_border_color - } else { - Color::new(color.r + 0.5, color.g + 0.5, color.g + 0.5, color.a + 0.5) - }; + let hover_border_color = params + .hover_border_color + .unwrap_or_else(|| Color::new(color.r + 0.5, color.g + 0.5, color.g + 0.5, color.a + 0.5)); let gradient_intensity = theme.gradient_intensity; diff --git a/wgui/src/components/checkbox.rs b/wgui/src/components/checkbox.rs index 68dff648..552e7ed6 100644 --- a/wgui/src/components/checkbox.rs +++ b/wgui/src/components/checkbox.rs @@ -31,6 +31,7 @@ use crate::{ pub struct Params { pub text: Translation, pub style: taffy::Style, + pub color_checked: Option, pub box_size: f32, pub checked: bool, pub radio_group: Option>, @@ -43,6 +44,7 @@ impl Default for Params { Self { text: Translation::from_raw_text(""), style: Default::default(), + color_checked: None, box_size: 24.0, checked: false, radio_group: None, @@ -84,6 +86,8 @@ struct Data { id_label: WidgetID, // Label, parent of container value: Option>, // arbitrary value assigned to the element radio_group: Option>, + + color_checked: Color, } pub struct ComponentCheckbox { @@ -92,6 +96,8 @@ pub struct ComponentCheckbox { state: Rc>, } +const COLOR_UNCHECKED: Color = Color::new(0.0, 0.0, 0.0, 0.0); + impl ComponentTrait for ComponentCheckbox { fn base(&self) -> &ComponentBase { &self.base @@ -106,12 +112,9 @@ impl ComponentTrait for ComponentCheckbox { } } -const COLOR_CHECKED: Color = Color::new(0.1, 0.5, 1.0, 1.0); -const COLOR_UNCHECKED: Color = Color::new(0.1, 0.5, 1.0, 0.0); - fn set_box_checked(widgets: &layout::WidgetMap, data: &Data, checked: bool) { widgets.call(data.id_inner_box, |rect: &mut WidgetRectangle| { - rect.params.color = if checked { COLOR_CHECKED } else { COLOR_UNCHECKED } + rect.params.color = if checked { data.color_checked } else { COLOR_UNCHECKED } }); } @@ -315,6 +318,7 @@ fn register_event_mouse_release( pub fn construct(ess: &mut ConstructEssentials, params: Params) -> anyhow::Result<(WidgetPair, Rc)> { let mut style = params.style; + let theme = &ess.layout.state.theme; // force-override style style.flex_wrap = taffy::FlexWrap::NoWrap; @@ -343,6 +347,8 @@ pub fn construct(ess: &mut ConstructEssentials, params: Params) -> anyhow::Resul (WLength::Units(5.0), WLength::Units(8.0)) }; + let color_checked = params.color_checked.unwrap_or(theme.accent_color); + let (root, _) = ess.layout.add_child( ess.parent, WidgetRectangle::create(WidgetRectangleParams { @@ -383,7 +389,7 @@ pub fn construct(ess: &mut ConstructEssentials, params: Params) -> anyhow::Resul outer_box.id, WidgetRectangle::create(WidgetRectangleParams { round: round_5, - color: if params.checked { COLOR_CHECKED } else { COLOR_UNCHECKED }, + color: if params.checked { color_checked } else { COLOR_UNCHECKED }, ..Default::default() }), taffy::Style { @@ -413,6 +419,7 @@ pub fn construct(ess: &mut ConstructEssentials, params: Params) -> anyhow::Resul id_label: label.id, value: params.value, radio_group: params.radio_group.as_ref().map(Rc::downgrade), + color_checked, }); let state = Rc::new(RefCell::new(State { diff --git a/wgui/src/parser/component_checkbox.rs b/wgui/src/parser/component_checkbox.rs index 252df4fd..3f011422 100644 --- a/wgui/src/parser/component_checkbox.rs +++ b/wgui/src/parser/component_checkbox.rs @@ -91,6 +91,7 @@ pub fn parse_component_checkbox( radio_group, value: component_value, tooltip: tooltip.get_info(), + color_checked: None, }, )?; From 5df6ce93f8e3e4a03446c535dd05a82381ee5dfd Mon Sep 17 00:00:00 2001 From: Aleksander Date: Tue, 24 Mar 2026 00:19:27 +0100 Subject: [PATCH 10/26] docs: move out docs to a separate repo/website, fix typos [skip ci] --- README.md | 7 +- wayvr-ipc/README.md | 6 +- wayvr/contrib/wayvr/README.md | 42 ------- wayvr/src/gui/README.md | 221 ---------------------------------- wayvrctl/src/main.rs | 2 +- wgui/README.md | 2 + 6 files changed, 8 insertions(+), 272 deletions(-) delete mode 100644 wayvr/contrib/wayvr/README.md delete mode 100644 wayvr/src/gui/README.md diff --git a/README.md b/README.md index 811068ff..44aa50f5 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Questions/issues specific to WayVR will be handled in the `wayvr` chat room. Fee There are multiple ways to install WayVR: 1. AppImage: Download from [Releases](https://github.com/wlx-team/wayvr/releases) -1. AUR package: [wayvr](https://aur.archlinux.org/packages/wayvr) or [wayvr-git](https://aur.archlinux.org/packages/wayvr-git) +1. AUR package: [wayvr](https://aur.archlinux.org/packages/wayvr) or [wayvr-git](https://aur.archlinux.org/packages/wayvr-git) 1. Nix package: [wayvr](https://search.nixos.org/packages?channel=unstable&show=wayvr&query=wayvr) or [unstable package from nixpkgs-xr](https://github.com/nix-community/nixpkgs-xr) 1. [Building from source](https://github.com/wlx-team/wayvr/wiki/Building-from-Source). @@ -131,7 +131,8 @@ Typing - While using the ORANGE laser, all keystrokes will have SHIFT applied. - Purple laser is customizable via the settings, no modifier by default. -**Modifier Keys are sticky**. They will remain pressed until eiter: +**Modifier Keys are sticky**. They will remain pressed until either: + - a non-modifier key is pressed - the modifier is toggled off by clicking again - the keyboard is hidden (including via show-hide) @@ -142,7 +143,6 @@ Typing ![Touch Controller Bindings](https://github.com/wlx-team/wayvr/blob/guide/wlx-oculus.png) - ### Changing Bindings SteamVR: Simply change the bindings from the SteamVR bindings section. If WayVR doesn't show up on the list, select any other title and then press back on the top left. (SteamVR is weird like that sometimes) @@ -155,6 +155,7 @@ We would like to work with you and include additional bindings. ## Customization See these relevant wiki pages: + - For all available config options, check [Wiki: Configuration](https://github.com/wlx-team/wayvr/wiki/Configuration) - Looking to customize look & feel, or add functionality? See [Wiki: Customization](https://github.com/wlx-team/wayvr/wiki/Customization) - Looking to change the OpenXR background? See [Wiki: OpenXR Skybox](https://github.com/wlx-team/wayvr/wiki/OpenXR-Skybox) diff --git a/wayvr-ipc/README.md b/wayvr-ipc/README.md index 776c16bc..9beaee71 100644 --- a/wayvr-ipc/README.md +++ b/wayvr-ipc/README.md @@ -2,8 +2,4 @@ This repository contains the IPC specification and client implementation for the WayVR protocol. The primary purpose is to enable communication between applications and the WayVR server, offering a range of API functions. -[WayVR Server README](https://github.com/wlx-team/wayvr/tree/main/wayvr/contrib/wayvr) - -## Usage - -[Example WayVR IPC Client usage in WayVR Dashboard (Legacy)](https://github.com/olekolek1000/wayvr-dashboard/blob/master/src-tauri/src/frontend_ipc.rs) +[Wayvrctl Documentation](https://wayvr.org/docs/various/integrations/wayvr_ipc/) diff --git a/wayvr/contrib/wayvr/README.md b/wayvr/contrib/wayvr/README.md deleted file mode 100644 index f8527261..00000000 --- a/wayvr/contrib/wayvr/README.md +++ /dev/null @@ -1,42 +0,0 @@ -

- -

- -# Overview - -### Features - -- Display Wayland applications without GPU overhead (zero-copy via dma-buf) -- Mouse and keyboard input, with precision scrolling support -- Tested on AMD and Nvidia - -### Supported software - -- Basically all Qt and GTK applications (they work out of the box) -- Most XWayland applications via `cage` - -### Launching external apps inside WayVR - -To launch your app externally: - -```sh -DISPLAY= WAYLAND_DISPLAY=wayland-$(cat $XDG_RUNTIME_DIR/wayvr.disp) yourapp -``` - -or (in the most cases): - -``` -DISPLAY= WAYLAND_DISPLAY=wayland-20 yourapp -``` - -Setting `DISPLAY` to an empty string forces various apps to use Wayland instead of X11. - -# Troubleshooting - -### My application doesn't launch but others do! - -Even though some applications support Wayland, some still check for the `DISPLAY` environment variable and an available X11 server, throwing an error. This can also be fixed by running `cage` on top of them. - -### Floating windows - -Context menus are not functional in most cases yet, including drag & drop support. diff --git a/wayvr/src/gui/README.md b/wayvr/src/gui/README.md deleted file mode 100644 index 9c3bb443..00000000 --- a/wayvr/src/gui/README.md +++ /dev/null @@ -1,221 +0,0 @@ -# Custom UI Elements - -Elements on custom panels may be modified at runtime using `wayvrctl`. - -For more, refer to: `wayvrctl panel-modify --help` - -### Labels - -#### Clock label - -Clock labels are driven by the current time, adhering to the user's 12/24 hour setting as well as timezone settings. - -Available display values are: `name` (timezone name), `time`, `date`, `dow` or a custom [format string](https://docs.rs/chrono/latest/chrono/format/strftime/index.html) like `%H:%M:%S`. - -See the Custom Timezones section for more info on timezones. Skip `_timezone` to use local time. - -```xml -