@@ -221,6 +221,7 @@ pub(crate) struct WaylandClientState {
// Output to scale mapping
outputs: HashMap<ObjectId, Output>,
in_progress_outputs: HashMap<ObjectId, InProgressOutput>,
+ wl_outputs: HashMap<ObjectId, wl_output::WlOutput>,
keyboard_layout: LinuxKeyboardLayout,
keymap_state: Option<xkb::State>,
compose_state: Option<xkb::compose::State>,
@@ -463,6 +464,8 @@ impl WaylandClient {
let mut seat: Option<wl_seat::WlSeat> = None;
#[allow(clippy::mutable_key_type)]
let mut in_progress_outputs = HashMap::default();
+ #[allow(clippy::mutable_key_type)]
+ let mut wl_outputs: HashMap<ObjectId, wl_output::WlOutput> = HashMap::default();
globals.contents().with_list(|list| {
for global in list {
match &global.interface[..] {
@@ -482,6 +485,7 @@ impl WaylandClient {
(),
);
in_progress_outputs.insert(output.id(), InProgressOutput::default());
+ wl_outputs.insert(output.id(), output);
}
_ => {}
}
@@ -589,6 +593,7 @@ impl WaylandClient {
composing: false,
outputs: HashMap::default(),
in_progress_outputs,
+ wl_outputs,
windows: HashMap::default(),
common,
keyboard_layout: LinuxKeyboardLayout::new(UNKNOWN_KEYBOARD_LAYOUT_NAME),
@@ -720,6 +725,15 @@ impl LinuxClient for WaylandClient {
let parent = state.keyboard_focused_window.clone();
+ let target_output = params.display_id.and_then(|display_id| {
+ let target_protocol_id: u32 = display_id.into();
+ state
+ .wl_outputs
+ .iter()
+ .find(|(id, _)| id.protocol_id() == target_protocol_id)
+ .map(|(_, output)| output.clone())
+ });
+
let appearance = state.common.appearance;
let compositor_gpu = state.compositor_gpu.take();
let (window, surface_id) = WaylandWindow::new(
@@ -731,6 +745,7 @@ impl LinuxClient for WaylandClient {
params,
appearance,
parent,
+ target_output,
)?;
state.windows.insert(surface_id, window.0.clone());
@@ -1020,6 +1035,7 @@ impl Dispatch<wl_registry::WlRegistry, GlobalListContents> for WaylandClientStat
state
.in_progress_outputs
.insert(output.id(), InProgressOutput::default());
+ state.wl_outputs.insert(output.id(), output);
}
_ => {}
},
@@ -12,7 +12,10 @@ use futures::channel::oneshot::Receiver;
use raw_window_handle as rwh;
use wayland_backend::client::ObjectId;
use wayland_client::WEnum;
-use wayland_client::{Proxy, protocol::wl_surface};
+use wayland_client::{
+ Proxy,
+ protocol::{wl_output, wl_surface},
+};
use wayland_protocols::wp::viewporter::client::wp_viewport;
use wayland_protocols::xdg::decoration::zv1::client::zxdg_toplevel_decoration_v1;
use wayland_protocols::xdg::shell::client::xdg_surface;
@@ -129,6 +132,7 @@ impl WaylandSurfaceState {
globals: &Globals,
params: &WindowParams,
parent: Option<WaylandWindowStatePtr>,
+ target_output: Option<wl_output::WlOutput>,
) -> anyhow::Result<Self> {
// For layer_shell windows, create a layer surface instead of an xdg surface
if let WindowKind::LayerShell(options) = ¶ms.kind {
@@ -138,7 +142,7 @@ impl WaylandSurfaceState {
let layer_surface = layer_shell.get_layer_surface(
&surface,
- None,
+ target_output.as_ref(),
super::layer_shell::wayland_layer(options.layer),
options.namespace.clone(),
&globals.qh,
@@ -494,9 +498,11 @@ impl WaylandWindow {
params: WindowParams,
appearance: WindowAppearance,
parent: Option<WaylandWindowStatePtr>,
+ target_output: Option<wl_output::WlOutput>,
) -> anyhow::Result<(Self, ObjectId)> {
let surface = globals.compositor.create_surface(&globals.qh, ());
- let surface_state = WaylandSurfaceState::new(&surface, &globals, ¶ms, parent.clone())?;
+ let surface_state =
+ WaylandSurfaceState::new(&surface, &globals, ¶ms, parent.clone(), target_output)?;
if let Some(fractional_scale_manager) = globals.fractional_scale_manager.as_ref() {
fractional_scale_manager.get_fractional_scale(&surface, &globals.qh, surface.id());