mirror of
https://github.com/rustdesk/qemu-display.git
synced 2025-08-17 16:25:39 +00:00
Make EventSender more generic, see if it helps
Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>
This commit is contained in:
parent
35cc658983
commit
903bedad06
@ -5,7 +5,7 @@ use std::{os::unix::io::AsRawFd, thread};
|
|||||||
use zbus::{dbus_proxy, export::zvariant::Fd};
|
use zbus::{dbus_proxy, export::zvariant::Fd};
|
||||||
|
|
||||||
use crate::Result;
|
use crate::Result;
|
||||||
use crate::{ConsoleEvent, KeyboardProxy, ConsoleListener, MouseProxy};
|
use crate::{ConsoleEvent, ConsoleListener, KeyboardProxy, MouseProxy};
|
||||||
|
|
||||||
#[dbus_proxy(default_service = "org.qemu", interface = "org.qemu.Display1.Console")]
|
#[dbus_proxy(default_service = "org.qemu", interface = "org.qemu.Display1.Console")]
|
||||||
pub trait Console {
|
pub trait Console {
|
||||||
|
@ -1,12 +1,14 @@
|
|||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
use std::ops::Drop;
|
use std::ops::Drop;
|
||||||
use std::os::unix::io::{AsRawFd, RawFd};
|
use std::os::unix::io::{AsRawFd, RawFd};
|
||||||
use std::sync::mpsc::{Receiver, RecvError, SendError, Sender};
|
use std::sync::mpsc::{Receiver, RecvError, SendError};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use derivative::Derivative;
|
use derivative::Derivative;
|
||||||
use zbus::{dbus_interface, export::zvariant::Fd};
|
use zbus::{dbus_interface, export::zvariant::Fd};
|
||||||
|
|
||||||
|
use crate::EventSender;
|
||||||
|
|
||||||
#[derive(Derivative)]
|
#[derive(Derivative)]
|
||||||
#[derivative(Debug)]
|
#[derivative(Debug)]
|
||||||
pub struct Scanout {
|
pub struct Scanout {
|
||||||
@ -79,32 +81,15 @@ pub enum ConsoleEvent {
|
|||||||
Disconnected,
|
Disconnected,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) trait EventSender {
|
|
||||||
fn send_event(&self, t: ConsoleEvent) -> Result<(), SendError<ConsoleEvent>>;
|
|
||||||
}
|
|
||||||
|
|
||||||
impl EventSender for Sender<ConsoleEvent> {
|
|
||||||
fn send_event(&self, t: ConsoleEvent) -> Result<(), SendError<ConsoleEvent>> {
|
|
||||||
self.send(t)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(feature = "glib")]
|
|
||||||
impl EventSender for glib::Sender<ConsoleEvent> {
|
|
||||||
fn send_event(&self, t: ConsoleEvent) -> Result<(), SendError<ConsoleEvent>> {
|
|
||||||
self.send(t)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub(crate) struct ConsoleListener<E: EventSender> {
|
pub(crate) struct ConsoleListener<E: EventSender<Event = ConsoleEvent>> {
|
||||||
tx: E,
|
tx: E,
|
||||||
wait_rx: Receiver<()>,
|
wait_rx: Receiver<()>,
|
||||||
err: Arc<RefCell<Option<SendError<ConsoleEvent>>>>,
|
err: Arc<RefCell<Option<SendError<ConsoleEvent>>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[dbus_interface(name = "org.qemu.Display1.Listener")]
|
#[dbus_interface(name = "org.qemu.Display1.Listener")]
|
||||||
impl<E: 'static + EventSender> ConsoleListener<E> {
|
impl<E: 'static + EventSender<Event = ConsoleEvent>> ConsoleListener<E> {
|
||||||
fn scanout(
|
fn scanout(
|
||||||
&mut self,
|
&mut self,
|
||||||
width: u32,
|
width: u32,
|
||||||
@ -189,7 +174,7 @@ impl<E: 'static + EventSender> ConsoleListener<E> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<E: EventSender> ConsoleListener<E> {
|
impl<E: EventSender<Event = ConsoleEvent>> ConsoleListener<E> {
|
||||||
pub(crate) fn new(tx: E, wait_rx: Receiver<()>) -> Self {
|
pub(crate) fn new(tx: E, wait_rx: Receiver<()>) -> Self {
|
||||||
let err = Arc::new(RefCell::new(None));
|
let err = Arc::new(RefCell::new(None));
|
||||||
ConsoleListener { tx, wait_rx, err }
|
ConsoleListener { tx, wait_rx, err }
|
||||||
@ -210,7 +195,7 @@ impl<E: EventSender> ConsoleListener<E> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<E: EventSender> Drop for ConsoleListener<E> {
|
impl<E: EventSender<Event = ConsoleEvent>> Drop for ConsoleListener<E> {
|
||||||
fn drop(&mut self) {
|
fn drop(&mut self) {
|
||||||
self.send(ConsoleEvent::Disconnected)
|
self.send(ConsoleEvent::Disconnected)
|
||||||
}
|
}
|
||||||
|
24
qemu-display-listener/src/event_sender.rs
Normal file
24
qemu-display-listener/src/event_sender.rs
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
use std::sync::mpsc::{Sender, SendError};
|
||||||
|
|
||||||
|
pub(crate) trait EventSender {
|
||||||
|
type Event;
|
||||||
|
|
||||||
|
fn send_event(&self, t: Self::Event) -> Result<(), SendError<Self::Event>>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T> EventSender for Sender<T> {
|
||||||
|
type Event = T;
|
||||||
|
|
||||||
|
fn send_event(&self, t: Self::Event) -> Result<(), SendError<Self::Event>> {
|
||||||
|
self.send(t)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "glib")]
|
||||||
|
impl<T> EventSender for glib::Sender<T> {
|
||||||
|
type Event = T;
|
||||||
|
|
||||||
|
fn send_event(&self, t: Self::Event) -> Result<(), SendError<Self::Event>> {
|
||||||
|
self.send(t)
|
||||||
|
}
|
||||||
|
}
|
@ -3,6 +3,9 @@
|
|||||||
mod error;
|
mod error;
|
||||||
pub use error::*;
|
pub use error::*;
|
||||||
|
|
||||||
|
mod event_sender;
|
||||||
|
use event_sender::*;
|
||||||
|
|
||||||
mod vm;
|
mod vm;
|
||||||
pub use vm::*;
|
pub use vm::*;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user