wvrsv: handle minimize, maximize fullscreen request
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user