wvrsv: handle minimize, maximize fullscreen request

This commit is contained in:
galister
2026-01-09 21:16:49 +09:00
parent 080274ccf4
commit 7b60b86f46
2 changed files with 61 additions and 2 deletions

View File

@@ -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<wl_output::WlOutput>,
) {
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 {

View File

@@ -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);