From 075e55a8e8ef0e6c9fd71a4d797c0958a8a39c60 Mon Sep 17 00:00:00 2001 From: Aleksander Date: Fri, 28 Feb 2025 22:05:27 +0100 Subject: [PATCH] WayVR: Add `DashboardShown` and `DashboardHidden` events, add `WlxInputState` support (#167) Wlx: Fix various Clippy warnings --- Cargo.lock | 2 +- Cargo.toml | 2 +- src/backend/osc.rs | 8 +++--- src/backend/wayvr/display.rs | 3 +-- src/backend/wayvr/mod.rs | 5 +++- src/backend/wayvr/server_ipc.rs | 44 ++++++++++++++++++++++++++++++--- src/graphics/mod.rs | 2 ++ src/gui/canvas/builder.rs | 1 + src/gui/canvas/control.rs | 1 + src/overlays/keyboard.rs | 4 +-- src/overlays/wayvr.rs | 21 ++++++++++++---- 11 files changed, 73 insertions(+), 20 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fec1e89..a8e610c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4655,7 +4655,7 @@ dependencies = [ [[package]] name = "wayvr_ipc" version = "0.1.0" -source = "git+https://github.com/olekolek1000/wayvr-ipc.git?rev=3c411d09ba1bba2609288e29739c0f1ec736b012#3c411d09ba1bba2609288e29739c0f1ec736b012" +source = "git+https://github.com/olekolek1000/wayvr-ipc.git?rev=a72587d23f3bb8624d9aeb1f13c0a21e65350f51#a72587d23f3bb8624d9aeb1f13c0a21e65350f51" dependencies = [ "anyhow", "bytes", diff --git a/Cargo.toml b/Cargo.toml index d377253..326976b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -86,7 +86,7 @@ wayland-client = { version = "0.31.6", optional = true } wayland-egl = { version = "0.32.4", optional = true } interprocess = { version = "2.2.2", optional = true } bytes = { version = "1.9.0", optional = true } -wayvr_ipc = { git = "https://github.com/olekolek1000/wayvr-ipc.git", rev = "3c411d09ba1bba2609288e29739c0f1ec736b012", default-features = false, optional = true } +wayvr_ipc = { git = "https://github.com/olekolek1000/wayvr-ipc.git", rev = "a72587d23f3bb8624d9aeb1f13c0a21e65350f51", default-features = false, optional = true } ################################ [build-dependencies] diff --git a/src/backend/osc.rs b/src/backend/osc.rs index 5e046e0..406913c 100644 --- a/src/backend/osc.rs +++ b/src/backend/osc.rs @@ -146,24 +146,24 @@ impl OscSender { // send device battery parameters self.send_message( - format!("/avatar/parameters/{parameter}Battery").into(), + format!("/avatar/parameters/{parameter}Battery"), vec![OscType::Float(level)], )?; self.send_message( - format!("/avatar/parameters/{parameter}Charging").into(), + format!("/avatar/parameters/{parameter}Charging"), vec![OscType::Bool(device.charging)], )?; } // send average controller and tracker battery parameters self.send_message( - format!("/avatar/parameters/averageControllerBattery").into(), + String::from("/avatar/parameters/averageControllerBattery"), vec![OscType::Float( controller_total_bat / controller_count as f32, )], )?; self.send_message( - format!("/avatar/parameters/averageTrackerBattery").into(), + String::from("/avatar/parameters/averageTrackerBattery"), vec![OscType::Float(tracker_total_bat / tracker_count as f32)], )?; } diff --git a/src/backend/wayvr/display.rs b/src/backend/wayvr/display.rs index de9f439..7f52a5e 100644 --- a/src/backend/wayvr/display.rs +++ b/src/backend/wayvr/display.rs @@ -291,8 +291,7 @@ impl Display { renderer.bind(self.gles_texture.clone())?; let size = Size::from((self.width as i32, self.height as i32)); - let damage: Rectangle = - Rectangle::from_loc_and_size((0, 0), size); + let damage: Rectangle = Rectangle::from_size(size); let elements: Vec> = self .displayed_windows diff --git a/src/backend/wayvr/mod.rs b/src/backend/wayvr/mod.rs index 8673f0d..ecb0556 100644 --- a/src/backend/wayvr/mod.rs +++ b/src/backend/wayvr/mod.rs @@ -40,6 +40,8 @@ use std::{ use time::get_millis; use wayvr_ipc::{packet_client, packet_server}; +use crate::state::AppState; + const STR_INVALID_HANDLE_DISP: &str = "Invalid display handle"; const STR_INVALID_HANDLE_PROCESS: &str = "Invalid process handle"; @@ -277,12 +279,13 @@ impl WayVR { Ok(()) } - pub fn tick_events(&mut self) -> anyhow::Result> { + pub fn tick_events(&mut self, app: &AppState) -> anyhow::Result> { let mut tasks: Vec = Vec::new(); self.ipc_server.tick(&mut server_ipc::TickParams { state: &mut self.state, tasks: &mut tasks, + app, })?; // Check for redraw events diff --git a/src/backend/wayvr/server_ipc.rs b/src/backend/wayvr/server_ipc.rs index 0b7b95a..ce5e241 100644 --- a/src/backend/wayvr/server_ipc.rs +++ b/src/backend/wayvr/server_ipc.rs @@ -1,12 +1,15 @@ +use crate::state::AppState; + use super::{display, process, window, TickTask, WayVRSignal}; use bytes::BufMut; +use glam::Vec3A; use interprocess::local_socket::{self, traits::Listener, ToNsName}; use smallvec::SmallVec; use std::io::{Read, Write}; use wayvr_ipc::{ ipc::{self}, packet_client::{self, PacketClient}, - packet_server::{self, PacketServer}, + packet_server::{self, PacketServer, WlxInputStatePointer}, }; pub struct AuthInfo { @@ -70,6 +73,7 @@ fn read_payload(conn: &mut local_socket::Stream, size: u32) -> Option { pub struct TickParams<'a> { pub state: &'a mut super::WayVRState, pub tasks: &'a mut Vec, + pub app: &'a AppState, } pub fn gen_args_vec(input: &str) -> Vec<&str> { @@ -177,6 +181,34 @@ impl Connection { Ok(()) } + fn handle_wlx_input_state( + &mut self, + params: &TickParams, + serial: ipc::Serial, + ) -> anyhow::Result<()> { + let input_state = ¶ms.app.input_state; + + let to_arr = |vec: &Vec3A| -> [f32; 3] { [vec.x, vec.y, vec.z] }; + + send_packet( + &mut self.conn, + &ipc::data_encode(&PacketServer::WlxInputStateResponse( + serial, + packet_server::WlxInputState { + hmd_pos: to_arr(&input_state.hmd.translation), + left: WlxInputStatePointer { + pos: to_arr(&input_state.pointers[0].raw_pose.translation), + }, + right: WlxInputStatePointer { + pos: to_arr(&input_state.pointers[0].raw_pose.translation), + }, + }, + )), + )?; + + Ok(()) + } + fn handle_wvr_display_create( &mut self, params: &mut TickParams, @@ -471,6 +503,9 @@ impl Connection { match packet { PacketClient::Handshake(_) => unreachable!(), // handled previously + PacketClient::WlxInputState(serial) => { + self.handle_wlx_input_state(params, serial)?; + } PacketClient::WvrDisplayList(serial) => { self.handle_wvr_display_list(params, serial)?; } @@ -633,10 +668,11 @@ impl WayVRServer { Ok(()) } - pub fn broadcast(&mut self, packet: packet_server::PacketServer) -> anyhow::Result<()> { + pub fn broadcast(&mut self, packet: packet_server::PacketServer) { for connection in &mut self.connections { - send_packet(&mut connection.conn, &ipc::data_encode(&packet))?; + if let Err(e) = send_packet(&mut connection.conn, &ipc::data_encode(&packet)) { + log::error!("failed to broadcast packet: {:?}", e); + } } - Ok(()) } } diff --git a/src/graphics/mod.rs b/src/graphics/mod.rs index 3024981..49a64fb 100644 --- a/src/graphics/mod.rs +++ b/src/graphics/mod.rs @@ -942,6 +942,7 @@ impl WlxGraphics { )?)) } + #[allow(clippy::too_many_arguments)] pub fn create_pipeline_with_layouts( self: &Arc, render_target: Arc, @@ -1304,6 +1305,7 @@ impl WlxPipeline { ) } + #[allow(clippy::too_many_arguments)] fn new_with_layout( render_target: Arc, graphics: Arc, diff --git a/src/gui/canvas/builder.rs b/src/gui/canvas/builder.rs index e349c0c..61922e3 100644 --- a/src/gui/canvas/builder.rs +++ b/src/gui/canvas/builder.rs @@ -153,6 +153,7 @@ impl CanvasBuilder { &mut self.canvas.controls[idx] } + #[allow(clippy::too_many_arguments)] pub fn key_button( &mut self, x: f32, diff --git a/src/gui/canvas/control.rs b/src/gui/canvas/control.rs index 868492d..b6c09fb 100644 --- a/src/gui/canvas/control.rs +++ b/src/gui/canvas/control.rs @@ -19,6 +19,7 @@ pub type ControlRendererHl = fn( Vec4, ) -> anyhow::Result<()>; +#[allow(clippy::type_complexity)] pub(crate) struct Control { pub state: Option, pub rect: Rect, diff --git a/src/overlays/keyboard.rs b/src/overlays/keyboard.rs index 80a2fb3..a691dbe 100644 --- a/src/overlays/keyboard.rs +++ b/src/overlays/keyboard.rs @@ -95,7 +95,7 @@ where canvas.fg_color = color_parse("#cad3f5").unwrap(); //safe canvas.bg_color = color_parse("#1e2030").unwrap(); //safe - let has_altgr = keymap.as_ref().map_or(false, |k| k.has_altgr()); + let has_altgr = keymap.as_ref().is_some_and(|k| k.has_altgr()); if !LAYOUT.auto_labels.unwrap_or(true) { keymap = None; @@ -125,7 +125,7 @@ where let label0 = keymap.label_for_key(vk, 0); let label1 = keymap.label_for_key(vk, SHIFT); - if label0.chars().next().map_or(false, |f| f.is_alphabetic()) { + if label0.chars().next().is_some_and(|f| f.is_alphabetic()) { label.push(label1); if has_altgr { cap_type = KeyCapType::RegularAltGr; diff --git a/src/overlays/wayvr.rs b/src/overlays/wayvr.rs index ccf4de9..ad083ff 100644 --- a/src/overlays/wayvr.rs +++ b/src/overlays/wayvr.rs @@ -1,7 +1,7 @@ use glam::{vec3a, Affine2, Vec3, Vec3A}; use std::{cell::RefCell, collections::HashMap, rc::Rc, sync::Arc}; use vulkano::image::SubresourceLayout; -use wayvr_ipc::packet_server; +use wayvr_ipc::packet_server::{self, PacketServer, WvrStateChanged}; use wlx_capture::frame::{DmabufFrame, FourCC, FrameFormat, FramePlane}; use crate::{ @@ -332,12 +332,23 @@ where anyhow::bail!("Overlay ID not set for dashboard display"); }; + let cur_visibility = !display.visible; + + wayvr + .data + .ipc_server + .broadcast(PacketServer::WvrStateChanged(if cur_visibility { + WvrStateChanged::DashboardShown + } else { + WvrStateChanged::DashboardHidden + })); + app.tasks.enqueue(TaskType::Overlay( OverlaySelector::Id(overlay_id), Box::new(move |app, o| { // Toggle visibility - o.want_visible = !o.want_visible; - if o.want_visible { + o.want_visible = cur_visibility; + if cur_visibility { o.reset(app, true); } }), @@ -447,12 +458,12 @@ where wayvr .data .ipc_server - .broadcast(packet_server::PacketServer::WvrStateChanged(packet))?; + .broadcast(packet_server::PacketServer::WvrStateChanged(packet)); } } } - let res = wayvr.data.tick_events()?; + let res = wayvr.data.tick_events(app)?; drop(wayvr); for result in res {