1
0
mirror of https://gitlab.com/marcandre.lureau/qemu-display.git synced 2025-03-07 15:25:04 +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:
Marc-André Lureau 2021-03-05 00:49:12 +04:00
parent 35cc658983
commit 903bedad06
4 changed files with 35 additions and 23 deletions

View File

@ -5,7 +5,7 @@ use std::{os::unix::io::AsRawFd, thread};
use zbus::{dbus_proxy, export::zvariant::Fd};
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")]
pub trait Console {

View File

@ -1,12 +1,14 @@
use std::cell::RefCell;
use std::ops::Drop;
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 derivative::Derivative;
use zbus::{dbus_interface, export::zvariant::Fd};
use crate::EventSender;
#[derive(Derivative)]
#[derivative(Debug)]
pub struct Scanout {
@ -79,32 +81,15 @@ pub enum ConsoleEvent {
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)]
pub(crate) struct ConsoleListener<E: EventSender> {
pub(crate) struct ConsoleListener<E: EventSender<Event = ConsoleEvent>> {
tx: E,
wait_rx: Receiver<()>,
err: Arc<RefCell<Option<SendError<ConsoleEvent>>>>,
}
#[dbus_interface(name = "org.qemu.Display1.Listener")]
impl<E: 'static + EventSender> ConsoleListener<E> {
impl<E: 'static + EventSender<Event = ConsoleEvent>> ConsoleListener<E> {
fn scanout(
&mut self,
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 {
let err = Arc::new(RefCell::new(None));
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) {
self.send(ConsoleEvent::Disconnected)
}

View 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)
}
}

View File

@ -3,6 +3,9 @@
mod error;
pub use error::*;
mod event_sender;
use event_sender::*;
mod vm;
pub use vm::*;