From 7b60b86f46bdc0dc7766742bb47e711cc29c5373 Mon Sep 17 00:00:00 2001 From: galister <22305755+galister@users.noreply.github.com> Date: Fri, 9 Jan 2026 21:16:49 +0900 Subject: [PATCH] wvrsv: handle minimize, maximize fullscreen request --- wlx-overlay-s/src/backend/wayvr/comp.rs | 39 ++++++++++++++++++++++++- wlx-overlay-s/src/backend/wayvr/mod.rs | 24 ++++++++++++++- 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/wlx-overlay-s/src/backend/wayvr/comp.rs b/wlx-overlay-s/src/backend/wayvr/comp.rs index 3d533f2..5f6a589 100644 --- a/wlx-overlay-s/src/backend/wayvr/comp.rs +++ b/wlx-overlay-s/src/backend/wayvr/comp.rs @@ -269,7 +269,6 @@ impl XdgShellHandler for Application { } surface.with_pending_state(|state| { state.states.set(xdg_toplevel::State::Activated); - state.states.set(xdg_toplevel::State::Fullscreen); }); surface.send_configure(); } @@ -305,6 +304,44 @@ impl XdgShellHandler for Application { ) { // Handle popup reposition here } + + // If the app wants to be fullscreen, make it think that it's fullscreen. + fn fullscreen_request( + &mut self, + surface: ToplevelSurface, + _output: Option, + ) { + surface.with_pending_state(|state| { + state.states.set(xdg_toplevel::State::Fullscreen); + }); + surface.send_configure(); + } + fn unfullscreen_request(&mut self, surface: ToplevelSurface) { + surface.with_pending_state(|state| { + state.states.unset(xdg_toplevel::State::Fullscreen); + }); + surface.send_configure(); + } + // If the app wants to be maximized, make it think that it's maximized. + fn maximize_request(&mut self, surface: ToplevelSurface) { + surface.with_pending_state(|state| { + state.states.set(xdg_toplevel::State::Maximized); + }); + surface.send_configure(); + } + fn unmaximize_request(&mut self, surface: ToplevelSurface) { + surface.with_pending_state(|state| { + state.states.unset(xdg_toplevel::State::Maximized); + }); + surface.send_configure(); + } + // If the app requests minimize, hide its window + fn minimize_request(&mut self, surface: ToplevelSurface) { + if let Some(client) = surface.wl_surface().client() { + self.wayvr_tasks + .send(WayVRTask::MinimizeRequest(client.id(), surface.clone())); + } + } } impl ShmHandler for Application { diff --git a/wlx-overlay-s/src/backend/wayvr/mod.rs b/wlx-overlay-s/src/backend/wayvr/mod.rs index adb8b26..128ec64 100644 --- a/wlx-overlay-s/src/backend/wayvr/mod.rs +++ b/wlx-overlay-s/src/backend/wayvr/mod.rs @@ -40,7 +40,7 @@ use xkbcommon::xkb; use crate::{ backend::{ - task::{OverlayTask, TaskType}, + task::{OverlayTask, TaskType, ToggleMode}, wayvr::{ image_importer::ImageImporter, process::{KillSignal, Process}, @@ -86,6 +86,7 @@ pub struct ExternalProcessRequest { pub enum WayVRTask { NewToplevel(ClientId, ToplevelSurface), DropToplevel(ClientId, ToplevelSurface), + MinimizeRequest(ClientId, ToplevelSurface), NewExternalProcess(ExternalProcessRequest), ProcessTerminationRequest(process::ProcessHandle, KillSignal), CloseWindowRequest(window::WindowHandle), @@ -409,6 +410,27 @@ impl WvrServerState { wvr_server.wm.remove_window(window_handle); } } + WayVRTask::MinimizeRequest(client_id, toplevel) => { + for client in &wvr_server.manager.clients { + if client.client.id() != client_id { + continue; + } + + let Some(window_handle) = wvr_server.wm.find_window_handle(&toplevel) + else { + log::warn!("MinimizeRequest: Couldn't find matching window handle"); + continue; + }; + + if let Some(oid) = wvr_server.window_to_overlay.get(&window_handle) { + app.tasks + .enqueue(TaskType::Overlay(OverlayTask::ToggleOverlay( + OverlaySelector::Id(*oid), + ToggleMode::EnsureOff, + ))); + } + } + } WayVRTask::ProcessTerminationRequest(process_handle, signal) => { if let Some(process) = wvr_server.processes.get_mut(&process_handle) { process.kill(signal);