From 5dffbb9fdb3a15102262e496061272781ae979b9 Mon Sep 17 00:00:00 2001 From: Aleksander Date: Sun, 26 Jul 2026 11:04:00 +0200 Subject: [PATCH] wayvr-ipc: bump to version 4, remove unused WayVR signal broadcast feature, fix broken `window-set-visible` command --- wayvr-ipc/src/client.rs | 16 -------------- wayvr-ipc/src/ipc.rs | 2 +- wayvr/src/backend/wayvr/mod.rs | 40 +++++++++++++++------------------- wayvr/src/ipc/events.rs | 13 ++++++----- wayvr/src/ipc/ipc_server.rs | 19 +++++----------- wayvr/src/ipc/signal.rs | 4 +++- wayvr/src/state.rs | 2 +- wayvrctl/src/main.rs | 7 ++++-- 8 files changed, 39 insertions(+), 64 deletions(-) diff --git a/wayvr-ipc/src/client.rs b/wayvr-ipc/src/client.rs index 947ac456..a1a94604 100644 --- a/wayvr-ipc/src/client.rs +++ b/wayvr-ipc/src/client.rs @@ -32,8 +32,6 @@ pub struct AuthInfo { pub runtime: String, } -type SignalFunc = Box bool + Send>; - pub struct WayVRClient { receiver: ReceiverMutex, sender: SenderMutex, @@ -41,7 +39,6 @@ pub struct WayVRClient { exiting: bool, queued_packets: DenseSlotMap, pub auth: Option, - pub on_signal: Option, } pub async fn send_packet(sender: &SenderMutex, data: &[u8]) -> anyhow::Result<()> { @@ -128,10 +125,6 @@ macro_rules! send_only { } impl WayVRClient { - pub fn set_signal_handler(&mut self, on_signal: SignalFunc) { - self.on_signal = Some(on_signal); - } - pub async fn new(client_name: &str) -> anyhow::Result { let printname = "/tmp/wayvr_ipc.sock"; @@ -156,7 +149,6 @@ impl WayVRClient { exiting: false, queued_packets: Default::default(), auth: None, - on_signal: None, })); WayVRClient::start_runner(client.clone(), cancel_rx); @@ -251,14 +243,6 @@ impl WayVRClient { ); } - if let PacketServer::WvrStateChanged(_) = &packet - && let Some(on_signal) = &mut client.on_signal - && (*on_signal)(&packet) - { - // Signal consumed - return Ok(()); - } - // queue packet to read if it contains a serial response if let Some(serial) = packet.serial() { for (_, qpacket) in &mut client.queued_packets { diff --git a/wayvr-ipc/src/ipc.rs b/wayvr-ipc/src/ipc.rs index 4a29e4f4..5e598369 100644 --- a/wayvr-ipc/src/ipc.rs +++ b/wayvr-ipc/src/ipc.rs @@ -22,7 +22,7 @@ impl SerialGenerator { } } -pub const PROTOCOL_VERSION: u32 = 3; +pub const PROTOCOL_VERSION: u32 = 4; pub const CONNECTION_MAGIC: &str = "wayvr_ipc"; pub fn data_encode(data: &T) -> Vec diff --git a/wayvr/src/backend/wayvr/mod.rs b/wayvr/src/backend/wayvr/mod.rs index d30550ea..ba38aa27 100644 --- a/wayvr/src/backend/wayvr/mod.rs +++ b/wayvr/src/backend/wayvr/mod.rs @@ -53,7 +53,7 @@ use std::{ }; use vulkano::image::view::ImageView; use wayland_protocols::xdg::shell::server::xdg_toplevel; -use wayvr_ipc::{packet_client::PositionMode, packet_server}; +use wayvr_ipc::packet_client::PositionMode; use wgui::{gfx::WGfx, log::LogErr}; use wlx_capture::frame::Transform; use wlx_common::{ @@ -74,7 +74,7 @@ use crate::{ }, }, graphics::{ExtentExt, WGfxExtras}, - ipc::{event_queue::SyncEventQueue, ipc_server, signal::WayVRSignal}, + ipc::{event_queue::SyncEventQueue, ipc_server}, overlays::{ anchor::ALTTAB_HELP_NAME, wayvr::{WvrCommand, create_wl_window_overlay}, @@ -126,6 +126,7 @@ pub enum WayVRTask { DropToplevel(ClientId, ToplevelSurface), MinimizeRequest(ClientId, ToplevelSurface), TitleChange(ClientId, ToplevelSurface), + VisibilityChange(window::WindowHandle, bool), NewExternalProcess(ExternalProcessRequest), ProcessTerminationRequest(process::ProcessHandle, KillSignal), CloseWindowRequest(window::WindowHandle), @@ -138,7 +139,6 @@ pub struct WvrServerState { pub tasks: SyncEventQueue, ticks: u64, cur_modifiers: u8, - signals: SyncEventQueue, mouse_freeze: Instant, window_to_overlay: HashMap, overlay_to_window: SecondaryMap, @@ -171,11 +171,7 @@ const KEY_REPEAT_RATE: i32 = 50; const WAYVR_SCREEN_RES: [i32; 2] = [2560, 1440]; impl WvrServerState { - pub fn new( - gfx: Arc, - gfx_extras: &WGfxExtras, - signals: SyncEventQueue, - ) -> anyhow::Result { + pub fn new(gfx: Arc, gfx_extras: &WGfxExtras) -> anyhow::Result { const fn filter_allow_any(_: &wayland_server::Client) -> bool { true } @@ -301,7 +297,6 @@ impl WvrServerState { ticks: 0, tasks, cur_modifiers: 0, - signals, mouse_freeze: Instant::now(), window_to_overlay: HashMap::new(), overlay_to_window: SecondaryMap::new(), @@ -343,12 +338,6 @@ impl WvrServerState { wvr_server.process_removed(&mut app.tasks, *p_handle); } - if !to_remove.is_empty() { - app.wayvr_signals.send(WayVRSignal::BroadcastStateChanged( - packet_server::WvrStateChanged::ProcessRemoved, - )); - } - while let Some(task) = wvr_server.tasks.read() { match task { WayVRTask::NewExternalProcess(req) => { @@ -506,10 +495,6 @@ impl WvrServerState { .ok() }), ))); - - app.wayvr_signals.send(WayVRSignal::BroadcastStateChanged( - packet_server::WvrStateChanged::WindowCreated, - )); } } WayVRTask::DropToplevel(client_id, toplevel) => { @@ -554,6 +539,19 @@ impl WvrServerState { wvr_server.wm.remove_window(window_handle); } } + WayVRTask::VisibilityChange(window_handle, visible) => { + if let Some(oid) = wvr_server.window_to_overlay.get(&window_handle) { + app.tasks + .enqueue(TaskType::Overlay(OverlayTask::ToggleOverlay( + OverlaySelector::Id(*oid), + if visible { + ToggleMode::EnsureOn + } else { + ToggleMode::EnsureOff + }, + ))); + } + } WayVRTask::MinimizeRequest(client_id, toplevel) => { for client in &wvr_server.manager.clients { if client.client.id() != client_id { @@ -1258,10 +1256,6 @@ impl WvrServerState { pos_mode, })); - self.signals.send(WayVRSignal::BroadcastStateChanged( - packet_server::WvrStateChanged::ProcessCreated, - )); - Ok(handle) } diff --git a/wayvr/src/ipc/events.rs b/wayvr/src/ipc/events.rs index bfad3970..0edae993 100644 --- a/wayvr/src/ipc/events.rs +++ b/wayvr/src/ipc/events.rs @@ -1,9 +1,7 @@ +use crate::backend::wayvr::{self, WayVRTask, WvrServerState}; use wayvr_ipc::packet_client::{HandsfreeMode, HandsfreeParams}; -use wayvr_ipc::packet_server; use wlx_common::config::HandsfreePointer; -use crate::backend::wayvr::{self, WvrServerState}; - use crate::{ backend::{ self, @@ -41,9 +39,12 @@ where { while let Some(signal) = app.wayvr_signals.read() { match signal { - WayVRSignal::BroadcastStateChanged(packet) => { - app.ipc_server - .broadcast(packet_server::PacketServer::WvrStateChanged(packet)); + WayVRSignal::WindowVisibilityChanged(window_handle, visible) => { + if let Some(server) = &mut app.wvr_server { + server + .tasks + .send(WayVRTask::VisibilityChange(window_handle, visible)); + } } WayVRSignal::DeviceHaptics(device, haptics) => { app.tasks diff --git a/wayvr/src/ipc/ipc_server.rs b/wayvr/src/ipc/ipc_server.rs index 0320effb..0bf51095 100644 --- a/wayvr/src/ipc/ipc_server.rs +++ b/wayvr/src/ipc/ipc_server.rs @@ -223,13 +223,12 @@ impl Connection { handle: packet_server::WvrWindowHandle, visible: bool, ) { - if let Some(window) = params - .wvr_server - .wm - .windows - .get_mut(wayvr::window::WindowHandle::from_packet(handle)) - { + let window_handle = wayvr::window::WindowHandle::from_packet(handle); + if let Some(window) = params.wvr_server.wm.windows.get_mut(window_handle) { window.visible = visible; + params + .signals + .send(WayVRSignal::WindowVisibilityChanged(window_handle, visible)) } } @@ -576,12 +575,4 @@ impl WayVRServer { self.accept_connections(); self.tick_connections(params); } - - pub fn broadcast(&mut self, packet: packet_server::PacketServer) { - for connection in &mut self.connections { - if let Err(e) = send_packet(&mut connection.conn, &ipc::data_encode(&packet)) { - log::error!("failed to broadcast packet: {e:?}"); - } - } - } } diff --git a/wayvr/src/ipc/signal.rs b/wayvr/src/ipc/signal.rs index bff9703d..89f82f79 100644 --- a/wayvr/src/ipc/signal.rs +++ b/wayvr/src/ipc/signal.rs @@ -1,9 +1,11 @@ +use crate::backend::wayvr::window; + #[derive(Clone)] pub enum WayVRSignal { - BroadcastStateChanged(wayvr_ipc::packet_server::WvrStateChanged), DeviceHaptics(usize, crate::backend::input::Haptics), SwitchSet(Option), Handsfree(wayvr_ipc::packet_client::HandsfreeParams), ShowHide, CustomTask(crate::backend::task::ModifyPanelTask), + WindowVisibilityChanged(window::WindowHandle, bool), } diff --git a/wayvr/src/state.rs b/wayvr/src/state.rs index 3b802e68..e42ad4a9 100644 --- a/wayvr/src/state.rs +++ b/wayvr/src/state.rs @@ -106,7 +106,7 @@ impl AppState { let wvr_signals = SyncEventQueue::new(); let wvr_server = { - let mut maybe_wvr = WvrServerState::new(gfx.clone(), &gfx_extras, wvr_signals.clone()) + let mut maybe_wvr = WvrServerState::new(gfx.clone(), &gfx_extras) .log_err("Could not initialize WayVR Server") .ok(); if let Some(wvr) = maybe_wvr.as_mut() { diff --git a/wayvrctl/src/main.rs b/wayvrctl/src/main.rs index e67cdab4..967505dd 100644 --- a/wayvrctl/src/main.rs +++ b/wayvrctl/src/main.rs @@ -11,6 +11,7 @@ use wayvr_ipc::{ client::WayVRClient, ipc, packet_client::{self, PositionMode}, + packet_server::{WvrProcessHandle, WvrWindowHandle}, }; use crate::helper::{ @@ -107,11 +108,13 @@ async fn run_once(state: &mut WayVRClientState, args: Args) -> anyhow::Result<() handle, visible_0_or_1, } => { - let handle = serde_json::from_str(&handle).context("Invalid handle")?; + let handle = + serde_json::from_str::(&handle).context("Invalid handle")?; wvr_window_set_visible(state, handle, visible_0_or_1 != 0).await; } Subcommands::ProcessGet { handle } => { - let handle = serde_json::from_str(&handle).context("Invalid handle")?; + let handle = + serde_json::from_str::(&handle).context("Invalid handle")?; wvr_process_get(state, handle).await; } Subcommands::ProcessList => {