rdp: use display queue

Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
This commit is contained in:
Marc-André Lureau 2024-08-20 11:15:42 +04:00
parent 8d267d73fd
commit 6709f7392a

View File

@ -1,22 +1,28 @@
use std::thread;
use anyhow::Result; use anyhow::Result;
use qemu_display::{Console, ConsoleListenerHandler, Cursor, Display, MouseSet, Scanout, Update}; use qemu_display::{Console, ConsoleListenerHandler, Cursor, Display, MouseSet, Scanout, Update};
use ironrdp::{ use ironrdp::{
connector::DesktopSize, connector::DesktopSize,
displaycontrol::pdu::DisplayControlMonitorLayout,
server::{ server::{
BitmapUpdate, DisplayUpdate, PixelOrder, RGBAPointer, RdpServerDisplay, BitmapUpdate, DisplayUpdate, PixelOrder, RGBAPointer, RdpServerDisplay,
RdpServerDisplayUpdates, RdpServerDisplayUpdates,
}, },
}; };
use crate::{cast, util::PixmanFormat}; use crate::{cast, utils::PixmanFormat};
mod queue;
use queue::DisplayQueue;
pub struct DisplayHandler { pub struct DisplayHandler {
console: Console, console: Console,
} }
struct DisplayUpdates { struct DisplayUpdates {
receiver: tokio::sync::mpsc::Receiver<DisplayUpdate>, receiver: queue::Receiver,
} }
impl DisplayHandler { impl DisplayHandler {
@ -27,7 +33,7 @@ impl DisplayHandler {
} }
async fn listen(&self) -> Result<DisplayUpdates> { async fn listen(&self) -> Result<DisplayUpdates> {
let (sender, receiver) = tokio::sync::mpsc::channel::<DisplayUpdate>(32); let (sender, receiver) = DisplayQueue::new();
let (width, height) = ( let (width, height) = (
self.console.width().await? as _, self.console.width().await? as _,
self.console.height().await? as _, self.console.height().await? as _,
@ -59,16 +65,34 @@ impl RdpServerDisplay for DisplayHandler {
async fn updates(&mut self) -> Result<Box<dyn RdpServerDisplayUpdates>> { async fn updates(&mut self) -> Result<Box<dyn RdpServerDisplayUpdates>> {
Ok(Box::new(self.listen().await?)) Ok(Box::new(self.listen().await?))
} }
fn request_layout(&mut self, layout: DisplayControlMonitorLayout) {
let console = self.console.proxy.clone();
thread::spawn(move || {
// TODO: multi-monitor
let Some(monitor) = layout.monitors().first() else {
return;
};
let (xoff, yoff) = monitor.position().unwrap_or_default();
let (width, height) = monitor.dimensions();
let (width_mm, height_mm) = monitor.physical_dimensions().unwrap_or_default();
crate::utils::block_on(async move {
let _ = console
.set_ui_info(width_mm as u16, height_mm as u16, xoff, yoff, width, height)
.await;
});
});
}
} }
struct Listener { struct Listener {
sender: tokio::sync::mpsc::Sender<DisplayUpdate>, sender: queue::Sender,
desktop_size: DesktopSize, desktop_size: DesktopSize,
cursor_hot: (i32, i32), cursor_hot: (i32, i32),
} }
impl Listener { impl Listener {
fn new(sender: tokio::sync::mpsc::Sender<DisplayUpdate>, desktop_size: DesktopSize) -> Self { fn new(sender: queue::Sender, desktop_size: DesktopSize) -> Self {
Self { Self {
sender, sender,
desktop_size, desktop_size,
@ -128,6 +152,7 @@ impl ConsoleListenerHandler for Listener {
format, format,
order: PixelOrder::TopToBottom, order: PixelOrder::TopToBottom,
data: update.data, data: update.data,
stride: cast!(update.stride),
}); });
self.send(bitmap).await; self.send(bitmap).await;