From de6c5b8ad99c6094ae2d1df17c2a545a5fcc76ed Mon Sep 17 00:00:00 2001 From: Aleksander Date: Sun, 12 Jan 2025 16:30:07 +0100 Subject: [PATCH] WayVR: Fix process launching calling create_display two times --- src/backend/wayvr/display.rs | 3 +++ src/backend/wayvr/egl_data.rs | 5 +++-- src/backend/wayvr/event_queue.rs | 3 ++- src/backend/wayvr/handle.rs | 4 +++- src/backend/wayvr/mod.rs | 7 +++++-- src/backend/wayvr/process.rs | 3 +++ src/backend/wayvr/server_ipc.rs | 7 ++++--- src/backend/wayvr/window.rs | 2 ++ src/overlays/wayvr.rs | 17 ++++++++++------- 9 files changed, 35 insertions(+), 16 deletions(-) diff --git a/src/backend/wayvr/display.rs b/src/backend/wayvr/display.rs index 063eac1..c07939f 100644 --- a/src/backend/wayvr/display.rs +++ b/src/backend/wayvr/display.rs @@ -31,6 +31,7 @@ fn generate_auth_key() -> String { uuid.to_string() } +#[derive(Debug)] pub struct DisplayWindow { pub window_handle: window::WindowHandle, pub toplevel: ToplevelSurface, @@ -42,12 +43,14 @@ pub struct SpawnProcessResult { pub child: std::process::Child, } +#[derive(Debug)] pub enum DisplayTask { ProcessCleanup(process::ProcessHandle), } const MAX_DISPLAY_SIZE: u16 = 8192; +#[derive(Debug)] pub struct Display { // Display info stuff pub width: u16, diff --git a/src/backend/wayvr/egl_data.rs b/src/backend/wayvr/egl_data.rs index 8c47b2c..db72796 100644 --- a/src/backend/wayvr/egl_data.rs +++ b/src/backend/wayvr/egl_data.rs @@ -1,6 +1,7 @@ use super::egl_ex; use anyhow::anyhow; +#[derive(Debug)] pub struct EGLData { pub egl: khronos_egl::Instance, pub display: khronos_egl::Display, @@ -15,13 +16,13 @@ macro_rules! bind_egl_function { }; } -#[derive(Clone)] +#[derive(Debug, Clone)] pub struct DMAbufModifierInfo { pub modifiers: Vec, pub fourcc: u32, } -#[derive(Clone)] +#[derive(Debug, Clone)] pub struct DMAbufData { pub fd: i32, pub stride: i32, diff --git a/src/backend/wayvr/event_queue.rs b/src/backend/wayvr/event_queue.rs index 6f6df55..9b104a6 100644 --- a/src/backend/wayvr/event_queue.rs +++ b/src/backend/wayvr/event_queue.rs @@ -2,11 +2,12 @@ use std::{cell::RefCell, collections::VecDeque, rc::Rc}; +#[derive(Debug)] struct Data { queue: VecDeque, } -#[derive(Clone)] +#[derive(Debug, Clone)] pub struct SyncEventQueue { data: Rc>>, } diff --git a/src/backend/wayvr/handle.rs b/src/backend/wayvr/handle.rs index a408d41..7b3207d 100644 --- a/src/backend/wayvr/handle.rs +++ b/src/backend/wayvr/handle.rs @@ -6,12 +6,14 @@ macro_rules! gen_id { $cell_name:ident, $handle_name:ident) => { //ThingCell + #[derive(Debug)] pub struct $cell_name { pub obj: $instance_name, pub generation: u64, } //ThingVec + #[derive(Debug)] pub struct $container_name { // Vec> pub vec: Vec>, @@ -20,7 +22,7 @@ macro_rules! gen_id { } //ThingHandle - #[derive(Default, Clone, Copy, PartialEq, Hash, Eq)] + #[derive(Default, Debug, Clone, Copy, PartialEq, Hash, Eq)] pub struct $handle_name { idx: u32, generation: u64, diff --git a/src/backend/wayvr/mod.rs b/src/backend/wayvr/mod.rs index bcbd5fc..1bd91c8 100644 --- a/src/backend/wayvr/mod.rs +++ b/src/backend/wayvr/mod.rs @@ -35,7 +35,7 @@ use wayvr_ipc::packet_client; const STR_INVALID_HANDLE_DISP: &str = "Invalid display handle"; const STR_INVALID_HANDLE_PROCESS: &str = "Invalid process handle"; -#[derive(Clone)] +#[derive(Debug, Clone)] pub struct WaylandEnv { pub display_num: u32, } @@ -106,7 +106,10 @@ pub enum MouseIndex { pub enum TickTask { NewExternalProcess(ExternalProcessRequest), // Call WayVRCompositor::add_client after receiving this message - NewDisplay(packet_client::WvrDisplayCreateParams), + NewDisplay( + packet_client::WvrDisplayCreateParams, + Option, /* existing handle? */ + ), } impl WayVR { diff --git a/src/backend/wayvr/process.rs b/src/backend/wayvr/process.rs index 395c5d1..ef0a956 100644 --- a/src/backend/wayvr/process.rs +++ b/src/backend/wayvr/process.rs @@ -4,6 +4,7 @@ use crate::gen_id; use super::display; +#[derive(Debug)] pub struct WayVRProcess { pub auth_key: String, pub child: std::process::Child, @@ -14,11 +15,13 @@ pub struct WayVRProcess { pub env: Vec<(String, String)>, } +#[derive(Debug)] pub struct ExternalProcess { pub pid: u32, pub display_handle: display::DisplayHandle, } +#[derive(Debug)] pub enum Process { Managed(WayVRProcess), // Process spawned by WayVR External(ExternalProcess), // External process not directly controlled by us diff --git a/src/backend/wayvr/server_ipc.rs b/src/backend/wayvr/server_ipc.rs index 418f791..d412bfd 100644 --- a/src/backend/wayvr/server_ipc.rs +++ b/src/backend/wayvr/server_ipc.rs @@ -158,9 +158,10 @@ impl Connection { false, )?; - params - .tasks - .push(TickTask::NewDisplay(packet_params.clone())); + params.tasks.push(TickTask::NewDisplay( + packet_params.clone(), + Some(display_handle), + )); send_packet( &mut self.conn, diff --git a/src/backend/wayvr/window.rs b/src/backend/wayvr/window.rs index d49a4a0..787c5e2 100644 --- a/src/backend/wayvr/window.rs +++ b/src/backend/wayvr/window.rs @@ -2,6 +2,7 @@ use smithay::wayland::shell::xdg::ToplevelSurface; use crate::gen_id; +#[derive(Debug)] pub struct Window { pub pos_x: i32, pub pos_y: i32, @@ -38,6 +39,7 @@ impl Window { } } +#[derive(Debug)] pub struct WindowManager { pub windows: WindowVec, } diff --git a/src/overlays/wayvr.rs b/src/overlays/wayvr.rs index 5085ed4..d9e9771 100644 --- a/src/overlays/wayvr.rs +++ b/src/overlays/wayvr.rs @@ -440,19 +440,22 @@ where }); } } - wayvr::TickTask::NewDisplay(cpar) => { + wayvr::TickTask::NewDisplay(cpar, disp_handle) => { log::info!("Creating new display with name \"{}\"", cpar.name); let mut wayvr = r_wayvr.borrow_mut(); let unique_name = wayvr.get_unique_display_name(cpar.name); - let disp_handle = wayvr.data.state.create_display( - cpar.width, - cpar.height, - &unique_name, - false, - )?; + let disp_handle = match disp_handle { + Some(d) => d, + None => wayvr.data.state.create_display( + cpar.width, + cpar.height, + &unique_name, + false, + )?, + }; wayvr.overlays_to_create.push(OverlayToCreate { disp_handle,