mirror of
https://github.com/feschber/lan-mouse.git
synced 2026-04-08 23:41:29 +03:00
create capture session only if clients are active
This commit is contained in:
@@ -248,7 +248,7 @@ impl<'a> LibeiInputCapture<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn do_capture<'a>(
|
async fn do_capture<'a>(
|
||||||
input_capture_ptr: *const InputCapture<'static>,
|
input_capture: *const InputCapture<'a>,
|
||||||
mut capture_event: Receiver<CaptureEvent>,
|
mut capture_event: Receiver<CaptureEvent>,
|
||||||
mut release_capture_channel: Receiver<ReleaseCaptureEvent>,
|
mut release_capture_channel: Receiver<ReleaseCaptureEvent>,
|
||||||
session: Option<(Session<'a>, BitFlags<Capabilities>)>,
|
session: Option<(Session<'a>, BitFlags<Capabilities>)>,
|
||||||
@@ -258,49 +258,27 @@ async fn do_capture<'a>(
|
|||||||
let mut session = session.map(|s| s.0);
|
let mut session = session.map(|s| s.0);
|
||||||
|
|
||||||
/* safety: libei_task does not outlive Self */
|
/* safety: libei_task does not outlive Self */
|
||||||
let input_capture = unsafe { &*input_capture_ptr };
|
let input_capture = unsafe { &*input_capture };
|
||||||
|
|
||||||
let mut active_clients: Vec<(CaptureHandle, Position)> = vec![];
|
let mut active_clients: Vec<(CaptureHandle, Position)> = vec![];
|
||||||
let mut next_barrier_id = 1u32;
|
let mut next_barrier_id = 1u32;
|
||||||
|
|
||||||
let mut zones_changed = input_capture.receive_zones_changed().await?;
|
let mut zones_changed = input_capture.receive_zones_changed().await?;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
// create session
|
|
||||||
let mut session = match session.take() {
|
|
||||||
Some(s) => s,
|
|
||||||
None => create_session(input_capture).await?.0,
|
|
||||||
};
|
|
||||||
|
|
||||||
// do capture session
|
// do capture session
|
||||||
let cancel_session = CancellationToken::new();
|
let cancel_session = CancellationToken::new();
|
||||||
let cancel_update = CancellationToken::new();
|
let cancel_update = CancellationToken::new();
|
||||||
|
|
||||||
let capture_session = do_capture_session(
|
|
||||||
input_capture,
|
|
||||||
&mut session,
|
|
||||||
&event_tx,
|
|
||||||
&mut active_clients,
|
|
||||||
&mut next_barrier_id,
|
|
||||||
&mut release_capture_channel,
|
|
||||||
cancel_session.clone(),
|
|
||||||
cancel_update.clone(),
|
|
||||||
);
|
|
||||||
|
|
||||||
let mut capture_event_occured: Option<CaptureEvent> = None;
|
let mut capture_event_occured: Option<CaptureEvent> = None;
|
||||||
let mut zones_have_changed = false;
|
let mut zones_have_changed = false;
|
||||||
|
|
||||||
// kill session if clients need to be updated
|
// kill session if clients need to be updated
|
||||||
let handle_session_update_request = async {
|
let handle_session_update_request = async {
|
||||||
tokio::select! {
|
tokio::select! {
|
||||||
/* exit requested */
|
_ = cancellation_token.cancelled() => {}, /* exit requested */
|
||||||
_ = cancellation_token.cancelled() => {},
|
_ = cancel_update.cancelled() => {}, /* session exited */
|
||||||
/* session exited */
|
_ = zones_changed.next() => zones_have_changed = true, /* zones have changed */
|
||||||
_ = cancel_update.cancelled() => {},
|
e = capture_event.recv() => if let Some(e) = e { /* clients changed */
|
||||||
/* zones have changed */
|
|
||||||
_ = zones_changed.next() => zones_have_changed = true,
|
|
||||||
/* clients changed */
|
|
||||||
e = capture_event.recv() => if let Some(e) = e {
|
|
||||||
capture_event_occured.replace(e);
|
capture_event_occured.replace(e);
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
@@ -308,12 +286,38 @@ async fn do_capture<'a>(
|
|||||||
cancel_session.cancel();
|
cancel_session.cancel();
|
||||||
};
|
};
|
||||||
|
|
||||||
let (capture_result, ()) = tokio::join!(capture_session, handle_session_update_request);
|
if !active_clients.is_empty() {
|
||||||
log::info!("capture session + session_update task done!");
|
// create session
|
||||||
|
let mut session = match session.take() {
|
||||||
|
Some(s) => s,
|
||||||
|
None => create_session(input_capture).await?.0,
|
||||||
|
};
|
||||||
|
|
||||||
// disable capture
|
let capture_session = do_capture_session(
|
||||||
log::info!("disabling input capture");
|
input_capture,
|
||||||
input_capture.disable(&session).await?;
|
&mut session,
|
||||||
|
&event_tx,
|
||||||
|
&mut active_clients,
|
||||||
|
&mut next_barrier_id,
|
||||||
|
&mut release_capture_channel,
|
||||||
|
cancel_session.clone(),
|
||||||
|
cancel_update.clone(),
|
||||||
|
);
|
||||||
|
|
||||||
|
let (capture_result, ()) = tokio::join!(capture_session, handle_session_update_request);
|
||||||
|
log::info!("capture session + session_update task done!");
|
||||||
|
|
||||||
|
// disable capture
|
||||||
|
log::info!("disabling input capture");
|
||||||
|
input_capture.disable(&session).await?;
|
||||||
|
|
||||||
|
// propagate error from capture session
|
||||||
|
if capture_result.is_err() {
|
||||||
|
return capture_result;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
handle_session_update_request.await;
|
||||||
|
}
|
||||||
|
|
||||||
// update clients if requested
|
// update clients if requested
|
||||||
if let Some(event) = capture_event_occured.take() {
|
if let Some(event) = capture_event_occured.take() {
|
||||||
@@ -323,11 +327,6 @@ async fn do_capture<'a>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// propagate error from capture session
|
|
||||||
if capture_result.is_err() {
|
|
||||||
return capture_result;
|
|
||||||
}
|
|
||||||
|
|
||||||
log::info!("no error occured");
|
log::info!("no error occured");
|
||||||
|
|
||||||
// break
|
// break
|
||||||
|
|||||||
Reference in New Issue
Block a user