From a97ee2cee2ebbf3e5fc68d5e935868c005a70576 Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Wed, 14 Jan 2026 15:01:01 +0900 Subject: [PATCH] wayvrctl switch-set --- wayvr-ipc/src/client.rs | 7 ++++++- wayvr-ipc/src/packet_client.rs | 1 + wayvr/src/ipc/events.rs | 4 ++++ wayvr/src/ipc/ipc_server.rs | 11 +++++++++-- wayvr/src/ipc/signal.rs | 1 + wayvr/src/windowing/manager.rs | 7 +------ wayvrctl/src/helper.rs | 12 ++++++++++-- wayvrctl/src/main.rs | 16 ++++++++++++---- 8 files changed, 44 insertions(+), 15 deletions(-) diff --git a/wayvr-ipc/src/client.rs b/wayvr-ipc/src/client.rs index 710444e..c6d33bb 100644 --- a/wayvr-ipc/src/client.rs +++ b/wayvr-ipc/src/client.rs @@ -410,11 +410,16 @@ impl WayVRClient { Ok(()) } - pub async fn fn_wlx_overlay_show_hide(client: WayVRClientMutex) -> anyhow::Result<()> { + pub async fn fn_wlx_show_hide(client: WayVRClientMutex) -> anyhow::Result<()> { send_only!(client, &PacketClient::WlxShowHide); Ok(()) } + pub async fn fn_wlx_switch_set(client: WayVRClientMutex, set: Option) -> anyhow::Result<()> { + send_only!(client, &PacketClient::WlxSwitchSet(set)); + Ok(()) + } + pub async fn fn_wlx_modify_panel( client: WayVRClientMutex, params: packet_client::WlxModifyPanelParams, diff --git a/wayvr-ipc/src/packet_client.rs b/wayvr-ipc/src/packet_client.rs index 4f01f47..6f8649b 100644 --- a/wayvr-ipc/src/packet_client.rs +++ b/wayvr-ipc/src/packet_client.rs @@ -68,4 +68,5 @@ pub enum PacketClient { WlxModifyPanel(WlxModifyPanelParams), WlxDeviceHaptics(usize, WlxHapticsParams), WlxShowHide, + WlxSwitchSet(Option), } diff --git a/wayvr/src/ipc/events.rs b/wayvr/src/ipc/events.rs index df10582..b107c73 100644 --- a/wayvr/src/ipc/events.rs +++ b/wayvr/src/ipc/events.rs @@ -50,6 +50,10 @@ where WayVRSignal::ShowHide => { app.tasks.enqueue(TaskType::Overlay(OverlayTask::ShowHide)); } + WayVRSignal::SwitchSet(set) => { + app.tasks + .enqueue(TaskType::Overlay(OverlayTask::SwitchSet(set))); + } WayVRSignal::DropOverlay(overlay_id) => { app.tasks .enqueue(TaskType::Overlay(OverlayTask::Drop(OverlaySelector::Id( diff --git a/wayvr/src/ipc/ipc_server.rs b/wayvr/src/ipc/ipc_server.rs index bf7a3c4..28db88a 100644 --- a/wayvr/src/ipc/ipc_server.rs +++ b/wayvr/src/ipc/ipc_server.rs @@ -341,10 +341,14 @@ impl Connection { )); } - fn handle_wlx_overlay_show_hide(params: &mut TickParams) { + fn handle_wlx_show_hide(params: &mut TickParams) { params.signals.send(WayVRSignal::ShowHide); } + fn handle_wlx_switch_set(params: &mut TickParams, set: Option) { + params.signals.send(WayVRSignal::SwitchSet(set)); + } + fn handle_wlx_panel( params: &mut TickParams, custom_params: packet_client::WlxModifyPanelParams, @@ -414,7 +418,10 @@ impl Connection { Self::handle_wlx_device_haptics(params, device, haptics_params); } PacketClient::WlxShowHide => { - Self::handle_wlx_overlay_show_hide(params); + Self::handle_wlx_show_hide(params); + } + PacketClient::WlxSwitchSet(set) => { + Self::handle_wlx_switch_set(params, set); } PacketClient::WlxModifyPanel(custom_params) => { Self::handle_wlx_panel(params, custom_params); diff --git a/wayvr/src/ipc/signal.rs b/wayvr/src/ipc/signal.rs index 04d58b2..12e9661 100644 --- a/wayvr/src/ipc/signal.rs +++ b/wayvr/src/ipc/signal.rs @@ -3,6 +3,7 @@ pub enum WayVRSignal { BroadcastStateChanged(wayvr_ipc::packet_server::WvrStateChanged), DeviceHaptics(usize, crate::backend::input::Haptics), DropOverlay(crate::windowing::OverlayID), + SwitchSet(Option), ShowHide, CustomTask(crate::backend::task::ModifyPanelTask), } diff --git a/wayvr/src/windowing/manager.rs b/wayvr/src/windowing/manager.rs index 52c3f71..dbd7eb6 100644 --- a/wayvr/src/windowing/manager.rs +++ b/wayvr/src/windowing/manager.rs @@ -751,7 +751,7 @@ impl OverlayWindowManager { new_set: Option, keep_transforms: bool, ) { - if new_set == self.current_set { + if new_set == self.current_set || new_set.is_some_and(|x| x >= self.sets.len()) { return; } @@ -766,11 +766,6 @@ impl OverlayWindowManager { } if let Some(new_set) = new_set { - if new_set >= self.sets.len() { - log::error!("switch_to_set: new_set is out of range ({new_set:?})"); - return; - } - let mut num_overlays = 0; let ws = &mut self.sets[new_set]; for (id, data) in self.overlays.iter_mut().filter(|(_, d)| !d.config.global) { diff --git a/wayvrctl/src/helper.rs b/wayvrctl/src/helper.rs index 266c5ac..097f269 100644 --- a/wayvrctl/src/helper.rs +++ b/wayvrctl/src/helper.rs @@ -156,14 +156,22 @@ pub async fn wlx_device_haptics( ) } -pub async fn wlx_overlay_show_hide(state: &mut WayVRClientState) { +pub async fn wlx_show_hide(state: &mut WayVRClientState) { handle_empty_result( - WayVRClient::fn_wlx_overlay_show_hide(state.wayvr_client.clone()) + WayVRClient::fn_wlx_show_hide(state.wayvr_client.clone()) .await .context("failed to trigger overlay show hide"), ) } +pub async fn wlx_switch_set(state: &mut WayVRClientState, set: Option) { + handle_empty_result( + WayVRClient::fn_wlx_switch_set(state.wayvr_client.clone(), set) + .await + .context("failed to switch to set"), + ) +} + pub async fn wlx_panel_modify( state: &mut WayVRClientState, overlay: String, diff --git a/wayvrctl/src/main.rs b/wayvrctl/src/main.rs index e970194..2ddd820 100644 --- a/wayvrctl/src/main.rs +++ b/wayvrctl/src/main.rs @@ -14,9 +14,9 @@ use wayvr_ipc::{ }; use crate::helper::{ - WayVRClientState, wlx_device_haptics, wlx_input_state, wlx_overlay_show_hide, wlx_panel_modify, - wvr_process_get, wvr_process_launch, wvr_process_list, wvr_process_terminate, wvr_window_list, - wvr_window_set_visible, + WayVRClientState, wlx_device_haptics, wlx_input_state, wlx_panel_modify, wlx_show_hide, + wlx_switch_set, wvr_process_get, wvr_process_launch, wvr_process_list, wvr_process_terminate, + wvr_window_list, wvr_window_set_visible, }; mod helper; @@ -164,7 +164,7 @@ async fn run_once(state: &mut WayVRClientState, args: Args) -> anyhow::Result<() wlx_device_haptics(state, device, intensity, duration, frequency).await; } Subcommands::ShowHide {} => { - wlx_overlay_show_hide(state).await; + wlx_show_hide(state).await; } Subcommands::PanelModify { overlay, @@ -191,6 +191,10 @@ async fn run_once(state: &mut WayVRClientState, args: Args) -> anyhow::Result<() wlx_panel_modify(state, overlay, element, command).await; } + Subcommands::SwitchSet { set_or_0: set } => { + let set = if set <= 0 { None } else { Some((set - 1) as _) }; + wlx_switch_set(state, set).await; + } } Ok(()) } @@ -283,6 +287,10 @@ enum Subcommands { #[command(subcommand)] command: SubcommandPanelModify, }, + SwitchSet { + /// Set number to switch to, 0 to hide all sets + set_or_0: usize, + }, } #[derive(Debug, Clone, Copy, clap::ValueEnum)]