output_configuration: Allow setting xwayland primary output

This commit is contained in:
Victoria Brekenfeld 2025-04-09 20:10:13 +02:00 committed by Victoria Brekenfeld
parent 2e7d051816
commit 2a3bd84e22
4 changed files with 46 additions and 2 deletions

View file

@ -21,7 +21,7 @@ use cosmic_protocols::output_management::v1::server::{
zcosmic_output_manager_v1::{self, ZcosmicOutputManagerV1},
};
use crate::wayland::protocols::output_configuration::*;
use crate::{config::OutputState as EnabledState, wayland::protocols::output_configuration::*};
impl<D> GlobalDispatch<ZcosmicOutputManagerV1, OutputMngrGlobalData, D>
for OutputConfigurationState<D>
@ -109,6 +109,25 @@ where
} => {
data_init.init(extended, config_head.downgrade());
}
zcosmic_output_manager_v1::Request::SetXwaylandPrimary { head } => {
let Some(head) = head else {
state.request_xwayland_primary(None);
return;
};
let inner = state.output_configuration_state();
if let Some(head_data) = inner.instances.iter_mut().find_map(|instance| {
instance
.heads
.iter()
.find(|instance| instance.extension_obj.as_ref() == Some(&head))
}) {
let output = head_data.output.clone();
if output.config().enabled == EnabledState::Enabled {
state.request_xwayland_primary(Some(output));
}
}
}
_ => {}
}
}

View file

@ -58,6 +58,8 @@ pub trait OutputConfigurationHandler: Sized {
fn test_configuration(&mut self, conf: Vec<(Output, OutputConfiguration)>) -> bool;
fn apply_configuration(&mut self, conf: Vec<(Output, OutputConfiguration)>) -> bool;
fn request_xwayland_primary(&mut self, output: Option<Output>);
}
pub struct OutputMngrGlobalData {
@ -189,7 +191,7 @@ where
);
let extension_global = dh.create_global::<D, ZcosmicOutputManagerV1, _>(
2,
3,
OutputMngrGlobalData {
filter: Box::new(client_filter),
},
@ -505,6 +507,14 @@ where
instance.obj.model(physical.model);
}
}
if let Some(extension_obj) = instance.extension_obj.as_ref() {
if inner.enabled
&& extension_obj.version() >= zcosmic_output_head_v1::EVT_XWAYLAND_PRIMARY_SINCE
{
extension_obj.xwayland_primary(output.config().xwayland_primary as u32);
}
}
}
fn remove_global_with_timer<D: 'static>(