WayVR: Add DashboardShown and DashboardHidden events, add WlxInputState support (#167)

Wlx: Fix various Clippy warnings
This commit is contained in:
Aleksander
2025-02-28 22:05:27 +01:00
committed by GitHub
parent e66a8d27c9
commit 075e55a8e8
11 changed files with 73 additions and 20 deletions

2
Cargo.lock generated
View File

@@ -4655,7 +4655,7 @@ dependencies = [
[[package]] [[package]]
name = "wayvr_ipc" name = "wayvr_ipc"
version = "0.1.0" 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 = [ dependencies = [
"anyhow", "anyhow",
"bytes", "bytes",

View File

@@ -86,7 +86,7 @@ wayland-client = { version = "0.31.6", optional = true }
wayland-egl = { version = "0.32.4", optional = true } wayland-egl = { version = "0.32.4", optional = true }
interprocess = { version = "2.2.2", optional = true } interprocess = { version = "2.2.2", optional = true }
bytes = { version = "1.9.0", 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] [build-dependencies]

View File

@@ -146,24 +146,24 @@ impl OscSender {
// send device battery parameters // send device battery parameters
self.send_message( self.send_message(
format!("/avatar/parameters/{parameter}Battery").into(), format!("/avatar/parameters/{parameter}Battery"),
vec![OscType::Float(level)], vec![OscType::Float(level)],
)?; )?;
self.send_message( self.send_message(
format!("/avatar/parameters/{parameter}Charging").into(), format!("/avatar/parameters/{parameter}Charging"),
vec![OscType::Bool(device.charging)], vec![OscType::Bool(device.charging)],
)?; )?;
} }
// send average controller and tracker battery parameters // send average controller and tracker battery parameters
self.send_message( self.send_message(
format!("/avatar/parameters/averageControllerBattery").into(), String::from("/avatar/parameters/averageControllerBattery"),
vec![OscType::Float( vec![OscType::Float(
controller_total_bat / controller_count as f32, controller_total_bat / controller_count as f32,
)], )],
)?; )?;
self.send_message( self.send_message(
format!("/avatar/parameters/averageTrackerBattery").into(), String::from("/avatar/parameters/averageTrackerBattery"),
vec![OscType::Float(tracker_total_bat / tracker_count as f32)], vec![OscType::Float(tracker_total_bat / tracker_count as f32)],
)?; )?;
} }

View File

@@ -291,8 +291,7 @@ impl Display {
renderer.bind(self.gles_texture.clone())?; renderer.bind(self.gles_texture.clone())?;
let size = Size::from((self.width as i32, self.height as i32)); let size = Size::from((self.width as i32, self.height as i32));
let damage: Rectangle<i32, smithay::utils::Physical> = let damage: Rectangle<i32, smithay::utils::Physical> = Rectangle::from_size(size);
Rectangle::from_loc_and_size((0, 0), size);
let elements: Vec<WaylandSurfaceRenderElement<GlesRenderer>> = self let elements: Vec<WaylandSurfaceRenderElement<GlesRenderer>> = self
.displayed_windows .displayed_windows

View File

@@ -40,6 +40,8 @@ use std::{
use time::get_millis; use time::get_millis;
use wayvr_ipc::{packet_client, packet_server}; use wayvr_ipc::{packet_client, packet_server};
use crate::state::AppState;
const STR_INVALID_HANDLE_DISP: &str = "Invalid display handle"; const STR_INVALID_HANDLE_DISP: &str = "Invalid display handle";
const STR_INVALID_HANDLE_PROCESS: &str = "Invalid process handle"; const STR_INVALID_HANDLE_PROCESS: &str = "Invalid process handle";
@@ -277,12 +279,13 @@ impl WayVR {
Ok(()) Ok(())
} }
pub fn tick_events(&mut self) -> anyhow::Result<Vec<TickTask>> { pub fn tick_events(&mut self, app: &AppState) -> anyhow::Result<Vec<TickTask>> {
let mut tasks: Vec<TickTask> = Vec::new(); let mut tasks: Vec<TickTask> = Vec::new();
self.ipc_server.tick(&mut server_ipc::TickParams { self.ipc_server.tick(&mut server_ipc::TickParams {
state: &mut self.state, state: &mut self.state,
tasks: &mut tasks, tasks: &mut tasks,
app,
})?; })?;
// Check for redraw events // Check for redraw events

View File

@@ -1,12 +1,15 @@
use crate::state::AppState;
use super::{display, process, window, TickTask, WayVRSignal}; use super::{display, process, window, TickTask, WayVRSignal};
use bytes::BufMut; use bytes::BufMut;
use glam::Vec3A;
use interprocess::local_socket::{self, traits::Listener, ToNsName}; use interprocess::local_socket::{self, traits::Listener, ToNsName};
use smallvec::SmallVec; use smallvec::SmallVec;
use std::io::{Read, Write}; use std::io::{Read, Write};
use wayvr_ipc::{ use wayvr_ipc::{
ipc::{self}, ipc::{self},
packet_client::{self, PacketClient}, packet_client::{self, PacketClient},
packet_server::{self, PacketServer}, packet_server::{self, PacketServer, WlxInputStatePointer},
}; };
pub struct AuthInfo { pub struct AuthInfo {
@@ -70,6 +73,7 @@ fn read_payload(conn: &mut local_socket::Stream, size: u32) -> Option<Payload> {
pub struct TickParams<'a> { pub struct TickParams<'a> {
pub state: &'a mut super::WayVRState, pub state: &'a mut super::WayVRState,
pub tasks: &'a mut Vec<TickTask>, pub tasks: &'a mut Vec<TickTask>,
pub app: &'a AppState,
} }
pub fn gen_args_vec(input: &str) -> Vec<&str> { pub fn gen_args_vec(input: &str) -> Vec<&str> {
@@ -177,6 +181,34 @@ impl Connection {
Ok(()) Ok(())
} }
fn handle_wlx_input_state(
&mut self,
params: &TickParams,
serial: ipc::Serial,
) -> anyhow::Result<()> {
let input_state = &params.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( fn handle_wvr_display_create(
&mut self, &mut self,
params: &mut TickParams, params: &mut TickParams,
@@ -471,6 +503,9 @@ impl Connection {
match packet { match packet {
PacketClient::Handshake(_) => unreachable!(), // handled previously PacketClient::Handshake(_) => unreachable!(), // handled previously
PacketClient::WlxInputState(serial) => {
self.handle_wlx_input_state(params, serial)?;
}
PacketClient::WvrDisplayList(serial) => { PacketClient::WvrDisplayList(serial) => {
self.handle_wvr_display_list(params, serial)?; self.handle_wvr_display_list(params, serial)?;
} }
@@ -633,10 +668,11 @@ impl WayVRServer {
Ok(()) 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 { 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(())
} }
} }

View File

@@ -942,6 +942,7 @@ impl WlxGraphics {
)?)) )?))
} }
#[allow(clippy::too_many_arguments)]
pub fn create_pipeline_with_layouts( pub fn create_pipeline_with_layouts(
self: &Arc<Self>, self: &Arc<Self>,
render_target: Arc<ImageView>, render_target: Arc<ImageView>,
@@ -1304,6 +1305,7 @@ impl WlxPipeline<WlxPipelineLegacy> {
) )
} }
#[allow(clippy::too_many_arguments)]
fn new_with_layout( fn new_with_layout(
render_target: Arc<ImageView>, render_target: Arc<ImageView>,
graphics: Arc<WlxGraphics>, graphics: Arc<WlxGraphics>,

View File

@@ -153,6 +153,7 @@ impl<D, S> CanvasBuilder<D, S> {
&mut self.canvas.controls[idx] &mut self.canvas.controls[idx]
} }
#[allow(clippy::too_many_arguments)]
pub fn key_button( pub fn key_button(
&mut self, &mut self,
x: f32, x: f32,

View File

@@ -19,6 +19,7 @@ pub type ControlRendererHl<D, S> = fn(
Vec4, Vec4,
) -> anyhow::Result<()>; ) -> anyhow::Result<()>;
#[allow(clippy::type_complexity)]
pub(crate) struct Control<D, S> { pub(crate) struct Control<D, S> {
pub state: Option<S>, pub state: Option<S>,
pub rect: Rect, pub rect: Rect,

View File

@@ -95,7 +95,7 @@ where
canvas.fg_color = color_parse("#cad3f5").unwrap(); //safe canvas.fg_color = color_parse("#cad3f5").unwrap(); //safe
canvas.bg_color = color_parse("#1e2030").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) { if !LAYOUT.auto_labels.unwrap_or(true) {
keymap = None; keymap = None;
@@ -125,7 +125,7 @@ where
let label0 = keymap.label_for_key(vk, 0); let label0 = keymap.label_for_key(vk, 0);
let label1 = keymap.label_for_key(vk, SHIFT); 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); label.push(label1);
if has_altgr { if has_altgr {
cap_type = KeyCapType::RegularAltGr; cap_type = KeyCapType::RegularAltGr;

View File

@@ -1,7 +1,7 @@
use glam::{vec3a, Affine2, Vec3, Vec3A}; use glam::{vec3a, Affine2, Vec3, Vec3A};
use std::{cell::RefCell, collections::HashMap, rc::Rc, sync::Arc}; use std::{cell::RefCell, collections::HashMap, rc::Rc, sync::Arc};
use vulkano::image::SubresourceLayout; 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 wlx_capture::frame::{DmabufFrame, FourCC, FrameFormat, FramePlane};
use crate::{ use crate::{
@@ -332,12 +332,23 @@ where
anyhow::bail!("Overlay ID not set for dashboard display"); 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( app.tasks.enqueue(TaskType::Overlay(
OverlaySelector::Id(overlay_id), OverlaySelector::Id(overlay_id),
Box::new(move |app, o| { Box::new(move |app, o| {
// Toggle visibility // Toggle visibility
o.want_visible = !o.want_visible; o.want_visible = cur_visibility;
if o.want_visible { if cur_visibility {
o.reset(app, true); o.reset(app, true);
} }
}), }),
@@ -447,12 +458,12 @@ where
wayvr wayvr
.data .data
.ipc_server .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); drop(wayvr);
for result in res { for result in res {