wvrsv: handle minimize, maximize fullscreen request
This commit is contained in:
@@ -269,7 +269,6 @@ impl XdgShellHandler for Application {
|
|||||||
}
|
}
|
||||||
surface.with_pending_state(|state| {
|
surface.with_pending_state(|state| {
|
||||||
state.states.set(xdg_toplevel::State::Activated);
|
state.states.set(xdg_toplevel::State::Activated);
|
||||||
state.states.set(xdg_toplevel::State::Fullscreen);
|
|
||||||
});
|
});
|
||||||
surface.send_configure();
|
surface.send_configure();
|
||||||
}
|
}
|
||||||
@@ -305,6 +304,44 @@ impl XdgShellHandler for Application {
|
|||||||
) {
|
) {
|
||||||
// Handle popup reposition here
|
// 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 {
|
impl ShmHandler for Application {
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ use xkbcommon::xkb;
|
|||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
backend::{
|
backend::{
|
||||||
task::{OverlayTask, TaskType},
|
task::{OverlayTask, TaskType, ToggleMode},
|
||||||
wayvr::{
|
wayvr::{
|
||||||
image_importer::ImageImporter,
|
image_importer::ImageImporter,
|
||||||
process::{KillSignal, Process},
|
process::{KillSignal, Process},
|
||||||
@@ -86,6 +86,7 @@ pub struct ExternalProcessRequest {
|
|||||||
pub enum WayVRTask {
|
pub enum WayVRTask {
|
||||||
NewToplevel(ClientId, ToplevelSurface),
|
NewToplevel(ClientId, ToplevelSurface),
|
||||||
DropToplevel(ClientId, ToplevelSurface),
|
DropToplevel(ClientId, ToplevelSurface),
|
||||||
|
MinimizeRequest(ClientId, ToplevelSurface),
|
||||||
NewExternalProcess(ExternalProcessRequest),
|
NewExternalProcess(ExternalProcessRequest),
|
||||||
ProcessTerminationRequest(process::ProcessHandle, KillSignal),
|
ProcessTerminationRequest(process::ProcessHandle, KillSignal),
|
||||||
CloseWindowRequest(window::WindowHandle),
|
CloseWindowRequest(window::WindowHandle),
|
||||||
@@ -409,6 +410,27 @@ impl WvrServerState {
|
|||||||
wvr_server.wm.remove_window(window_handle);
|
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) => {
|
WayVRTask::ProcessTerminationRequest(process_handle, signal) => {
|
||||||
if let Some(process) = wvr_server.processes.get_mut(&process_handle) {
|
if let Some(process) = wvr_server.processes.get_mut(&process_handle) {
|
||||||
process.kill(signal);
|
process.kill(signal);
|
||||||
|
|||||||
Reference in New Issue
Block a user