From 9fc5e8c8b01d7b4091fd3f37c78f02b3c7ade164 Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Fri, 9 Jan 2026 00:59:50 +0900 Subject: [PATCH] implement spawn positioning --- dash-frontend/src/views/app_launcher.rs | 4 ++-- wayvr-ipc/src/packet_client.rs | 2 +- wlx-overlay-s/src/backend/wayvr/mod.rs | 10 +++++++--- wlx-overlay-s/src/backend/wayvr/process.rs | 3 ++- wlx-overlay-s/src/ipc/ipc_server.rs | 1 + wlx-overlay-s/src/overlays/dashboard.rs | 1 + wlx-overlay-s/src/overlays/wayvr.rs | 17 +++++++++++++++-- wlx-overlay-s/src/windowing/window.rs | 8 +++++++- 8 files changed, 36 insertions(+), 10 deletions(-) diff --git a/dash-frontend/src/views/app_launcher.rs b/dash-frontend/src/views/app_launcher.rs index c5aaf05..c1a82aa 100644 --- a/dash-frontend/src/views/app_launcher.rs +++ b/dash-frontend/src/views/app_launcher.rs @@ -169,7 +169,7 @@ impl View { //radio_orientation.set_value(orientation_mode.as_ref())?; //tasks.push(Task::SetOrientation(orientation_mode)); - let pos_mode = PosMode::Floating; + let pos_mode = PosMode::Anchored; // TODO: configurable defaults ? //radio_pos.set_value(pos_mode.as_ref())?; //tasks.push(Task::SetPos(pos_mode)); @@ -359,7 +359,7 @@ impl View { }; let pos_mode = match params.pos_mode { - PosMode::Floating => PositionMode::Anchor, + PosMode::Floating => PositionMode::Float, PosMode::Anchored => PositionMode::Anchor, PosMode::Static => PositionMode::Static, }; diff --git a/wayvr-ipc/src/packet_client.rs b/wayvr-ipc/src/packet_client.rs index 4cb5b9f..2afc66f 100644 --- a/wayvr-ipc/src/packet_client.rs +++ b/wayvr-ipc/src/packet_client.rs @@ -13,7 +13,7 @@ pub struct Handshake { pub client_name: String, } -#[derive(Debug, Clone, Deserialize, Serialize)] +#[derive(Debug, Clone, Copy, Deserialize, Serialize)] pub enum PositionMode { Float, Anchor, diff --git a/wlx-overlay-s/src/backend/wayvr/mod.rs b/wlx-overlay-s/src/backend/wayvr/mod.rs index 677eb27..6771bb1 100644 --- a/wlx-overlay-s/src/backend/wayvr/mod.rs +++ b/wlx-overlay-s/src/backend/wayvr/mod.rs @@ -32,7 +32,7 @@ use std::{ }; use time::get_millis; use vulkano::image::view::ImageView; -use wayvr_ipc::packet_server; +use wayvr_ipc::{packet_client::PositionMode, packet_server}; use wgui::gfx::WGfx; use wlx_capture::frame::Transform; use wlx_common::desktop_finder::DesktopFinder; @@ -300,15 +300,16 @@ impl WvrServerState { }; // Size, icon & fallback title comes from process - let ([size_x, size_y], fallback_title, icon, is_cage) = + let ([size_x, size_y], pos, fallback_title, icon, is_cage) = match wvr_server.processes.get(&process_handle) { Some(Process::Managed(p)) => ( p.resolution, + p.pos_mode, Some(p.app_name.clone()), p.icon.as_ref().cloned(), p.exec_path.ends_with("cage"), ), - _ => ([1920, 1080], None, None, false), + _ => ([1920, 1080], PositionMode::Float, None, None, false), }; let window_handle = wvr_server.wm.create_window( @@ -373,6 +374,7 @@ impl WvrServerState { window_handle, icon, [size_x, size_y], + pos, ) .context("Could not create WvrWindow overlay") .inspect_err(|e| log::warn!("{e:?}")) @@ -571,6 +573,7 @@ impl WvrServerState { args: &[&str], env: &[(&str, &str)], resolution: [u32; 2], + pos_mode: PositionMode, working_dir: Option<&str>, icon: Option<&str>, userdata: HashMap, @@ -606,6 +609,7 @@ impl WvrServerState { .collect(), icon: icon.map(Arc::from), resolution, + pos_mode, })); self.signals.send(WayVRSignal::BroadcastStateChanged( diff --git a/wlx-overlay-s/src/backend/wayvr/process.rs b/wlx-overlay-s/src/backend/wayvr/process.rs index 9df35cf..0428155 100644 --- a/wlx-overlay-s/src/backend/wayvr/process.rs +++ b/wlx-overlay-s/src/backend/wayvr/process.rs @@ -1,6 +1,6 @@ use std::{collections::HashMap, io::Read, sync::Arc}; -use wayvr_ipc::packet_server; +use wayvr_ipc::{packet_client, packet_server}; use crate::gen_id; @@ -15,6 +15,7 @@ pub struct WayVRProcess { pub env: Vec<(String, String)>, pub working_dir: Option, pub resolution: [u32; 2], + pub pos_mode: packet_client::PositionMode, pub icon: Option>, pub userdata: HashMap, diff --git a/wlx-overlay-s/src/ipc/ipc_server.rs b/wlx-overlay-s/src/ipc/ipc_server.rs index 542bdea..869991f 100644 --- a/wlx-overlay-s/src/ipc/ipc_server.rs +++ b/wlx-overlay-s/src/ipc/ipc_server.rs @@ -244,6 +244,7 @@ impl Connection { &args_vec, &env_vec, packet_params.resolution, + packet_params.pos_mode, None, packet_params.icon.as_deref(), packet_params.userdata, diff --git a/wlx-overlay-s/src/overlays/dashboard.rs b/wlx-overlay-s/src/overlays/dashboard.rs index ec47b7c..feae803 100644 --- a/wlx-overlay-s/src/overlays/dashboard.rs +++ b/wlx-overlay-s/src/overlays/dashboard.rs @@ -365,6 +365,7 @@ impl DashInterface for DashInterfaceLive { &args_vec, &env_vec, params.resolution, + params.pos_mode, None, params.icon.as_deref(), params.userdata, diff --git a/wlx-overlay-s/src/overlays/wayvr.rs b/wlx-overlay-s/src/overlays/wayvr.rs index 1a75b8c..688fc19 100644 --- a/wlx-overlay-s/src/overlays/wayvr.rs +++ b/wlx-overlay-s/src/overlays/wayvr.rs @@ -1,3 +1,4 @@ +use chrono_tz::PST8PDT; use glam::{Affine2, Affine3A, Quat, Vec2, Vec3, vec2, vec3}; use smithay::{ desktop::PopupManager, @@ -7,6 +8,7 @@ use std::{ops::RangeInclusive, sync::Arc}; use vulkano::{ buffer::BufferUsage, image::view::ImageView, pipeline::graphics::color_blend::AttachmentBlend, }; +use wayvr_ipc::packet_client::PositionMode; use wgui::{ components::button::ComponentButton, event::EventCallback, @@ -58,21 +60,32 @@ pub fn create_wl_window_overlay( window: wayvr::window::WindowHandle, icon: Arc, size: [u32; 2], + pos_mode: PositionMode, ) -> anyhow::Result { let scale = size[0].max(size[1]) as f32 / 1920.0; let curve_scale = size[0] as f32 / 1920.0; + let z_dist = if matches!(pos_mode, PositionMode::Anchor) { + 0.0 + } else { + -0.95 + }; + Ok(OverlayWindowConfig { name: name.clone(), default_state: OverlayWindowState { grabbable: true, interactable: true, - positioning: Positioning::Floating, + positioning: match pos_mode { + PositionMode::Float => Positioning::Floating, + PositionMode::Anchor => Positioning::Anchored, + PositionMode::Static => Positioning::Static, + }, curvature: Some(0.15 * curve_scale), transform: Affine3A::from_scale_rotation_translation( Vec3::ONE * scale, Quat::IDENTITY, - vec3(0.0, 0.0, -0.95), + vec3(0.0, 0.0, z_dist), ), ..OverlayWindowState::default() }, diff --git a/wlx-overlay-s/src/windowing/window.rs b/wlx-overlay-s/src/windowing/window.rs index c64cb7c..cbcc1df 100644 --- a/wlx-overlay-s/src/windowing/window.rs +++ b/wlx-overlay-s/src/windowing/window.rs @@ -204,7 +204,13 @@ impl OverlayWindowConfig { hand, align_to_hmd, .. } => (app.input_state.pointers[hand as usize].pose, align_to_hmd), Positioning::Anchored => (app.anchor, false), - Positioning::Static => return, + Positioning::Static => { + if hard_reset { + (app.input_state.hmd, false) + } else { + return; + } + } }; if hard_reset {