reduce coupling of emulation and capture backends

This commit is contained in:
Ferdinand Schober
2024-07-02 11:17:08 +02:00
parent b6b16063a8
commit 70a23b9fa7
21 changed files with 341 additions and 260 deletions

View File

@@ -5,8 +5,8 @@ use std::{collections::HashSet, net::SocketAddr};
use tokio::{process::Command, sync::mpsc::Sender, task::JoinHandle};
use crate::{
capture::{self, error::CaptureCreationError, InputCapture},
client::{ClientEvent, ClientHandle},
capture::{self, error::CaptureCreationError, CaptureHandle, InputCapture, Position},
client::ClientHandle,
config::CaptureBackend,
event::{Event, KeyboardEvent},
scancode,
@@ -19,8 +19,10 @@ use super::Server;
pub enum CaptureEvent {
/// capture must release the mouse
Release,
/// capture is notified of a change in client states
ClientEvent(ClientEvent),
/// add a capture client
Create(CaptureHandle, Position),
/// destory a capture client
Destroy(CaptureHandle),
/// termination signal
Terminate,
}
@@ -52,9 +54,9 @@ pub fn new(
CaptureEvent::Release => {
capture.release()?;
server.state.replace(State::Receiving);
}
CaptureEvent::ClientEvent(e) => capture.notify(e)?,
CaptureEvent::Create(h, p) => capture.create(h, p)?,
CaptureEvent::Destroy(h) => capture.destroy(h)?,
CaptureEvent::Terminate => break,
},
None => break,
@@ -82,7 +84,7 @@ async fn handle_capture_event(
capture: &mut Box<dyn InputCapture>,
sender_tx: &Sender<(Event, SocketAddr)>,
timer_tx: &Sender<()>,
event: (ClientHandle, Event),
event: (CaptureHandle, Event),
pressed_keys: &mut HashSet<scancode::Linux>,
release_bind: &[scancode::Linux],
) -> Result<()> {

View File

@@ -7,9 +7,9 @@ use tokio::{
};
use crate::{
client::{ClientEvent, ClientHandle},
client::ClientHandle,
config::EmulationBackend,
emulate::{self, error::EmulationCreationError, InputEmulation},
emulate::{self, error::EmulationCreationError, EmulationHandle, InputEmulation},
event::{Event, KeyboardEvent},
scancode,
server::State,
@@ -19,8 +19,10 @@ use super::{CaptureEvent, Server};
#[derive(Clone, Debug)]
pub enum EmulationEvent {
/// input emulation is notified of a change in client states
ClientEvent(ClientEvent),
/// create a new client
Create(EmulationHandle),
/// destroy a client
Destroy(EmulationHandle),
/// input emulation must release keys for client
ReleaseKeys(ClientHandle),
/// termination signal
@@ -49,7 +51,8 @@ pub fn new(
emulate_event = rx.recv() => {
match emulate_event {
Some(e) => match e {
EmulationEvent::ClientEvent(e) => emulate.notify(e).await,
EmulationEvent::Create(h) => emulate.create(h).await,
EmulationEvent::Destroy(h) => emulate.destroy(h).await,
EmulationEvent::ReleaseKeys(c) => release_keys(&server, &mut emulate, c).await,
EmulationEvent::Terminate => break,
},
@@ -73,8 +76,6 @@ pub fn new(
release_keys(&server, &mut emulate, client).await;
}
// destroy emulator
emulate.destroy().await;
anyhow::Ok(())
});
Ok((emulate_task, tx))

View File

@@ -17,7 +17,7 @@ use tokio::{
};
use crate::{
client::{ClientEvent, ClientHandle, Position},
client::{ClientHandle, Position},
frontend::{self, FrontendEvent, FrontendListener, FrontendRequest},
};
@@ -205,9 +205,8 @@ pub async fn deactivate_client(
None => return,
};
let event = ClientEvent::Destroy(handle);
let _ = capture.send(CaptureEvent::ClientEvent(event)).await;
let _ = emulate.send(EmulationEvent::ClientEvent(event)).await;
let _ = capture.send(CaptureEvent::Destroy(handle)).await;
let _ = emulate.send(EmulationEvent::Destroy(handle)).await;
}
pub async fn activate_client(
@@ -237,9 +236,8 @@ pub async fn activate_client(
};
/* notify emulation, capture and frontends */
let event = ClientEvent::Create(handle, pos);
let _ = capture.send(CaptureEvent::ClientEvent(event)).await;
let _ = emulate.send(EmulationEvent::ClientEvent(event)).await;
let _ = capture.send(CaptureEvent::Create(handle, pos.into())).await;
let _ = emulate.send(EmulationEvent::Create(handle)).await;
}
pub async fn remove_client(
@@ -258,9 +256,8 @@ pub async fn remove_client(
};
if active {
let destroy = ClientEvent::Destroy(handle);
let _ = capture.send(CaptureEvent::ClientEvent(destroy)).await;
let _ = emulate.send(EmulationEvent::ClientEvent(destroy)).await;
let _ = capture.send(CaptureEvent::Destroy(handle)).await;
let _ = emulate.send(EmulationEvent::Destroy(handle)).await;
}
}
@@ -335,13 +332,11 @@ async fn update_pos(
// update state in event input emulator & input capture
if changed {
if active {
let destroy = ClientEvent::Destroy(handle);
let _ = capture.send(CaptureEvent::ClientEvent(destroy)).await;
let _ = emulate.send(EmulationEvent::ClientEvent(destroy)).await;
let _ = capture.send(CaptureEvent::Destroy(handle)).await;
let _ = emulate.send(EmulationEvent::Destroy(handle)).await;
}
let create = ClientEvent::Create(handle, pos);
let _ = capture.send(CaptureEvent::ClientEvent(create)).await;
let _ = emulate.send(EmulationEvent::ClientEvent(create)).await;
let _ = capture.send(CaptureEvent::Create(handle, pos.into())).await;
let _ = emulate.send(EmulationEvent::Create(handle)).await;
}
}