Skip to content

Commit 6333f8e

Browse files
committed
fix double release
1 parent a0bbdc4 commit 6333f8e

File tree

6 files changed

+51
-32
lines changed

6 files changed

+51
-32
lines changed

input-capture/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ impl InputCapture {
129129

130130
/// release mouse
131131
pub async fn release(&mut self) -> Result<(), CaptureError> {
132+
log::info!("RELEASE CAPTURE");
132133
self.pressed_keys.clear();
133134
self.capture.release().await
134135
}

input-capture/src/libei.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -502,10 +502,10 @@ async fn release_capture<'a>(
502502
.unwrap(); // FIXME
503503
let (dx, dy) = match pos {
504504
// offset cursor position to not enter again immediately
505-
Position::Left => (1., 0.),
506-
Position::Right => (-1., 0.),
507-
Position::Top => (0., 1.),
508-
Position::Bottom => (0., -1.),
505+
Position::Left => (10., 0.),
506+
Position::Right => (-10., 0.),
507+
Position::Top => (0., 10.),
508+
Position::Bottom => (0., -10.),
509509
};
510510
// release 1px to the right of the entered zone
511511
let cursor_position = (x as f64 + dx, y as f64 + dy);

src/capture.rs

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -111,33 +111,35 @@ async fn do_capture(
111111
capture.create(handle, to_capture_pos(pos)).await?;
112112
}
113113

114-
let mut state = State::Idle;
114+
let mut state = State::Receiving;
115115

116116
loop {
117117
tokio::select! {
118118
event = capture.next() => match event {
119119
Some(event) => handle_capture_event(server, &mut capture, conn, event?, &mut state).await?,
120120
None => return Ok(()),
121121
},
122-
(handle, event) = conn.recv() => if let Some(active) = server.get_active() {
123-
if handle != active {
124-
// we only care about events coming from the client we are currently connected to
125-
// only `Ack` and `Leave` are relevant
126-
continue
122+
(handle, event) = conn.recv() => {
123+
if let Some(active) = server.get_active() {
124+
if handle != active {
125+
// we only care about events coming from the client we are currently connected to
126+
// only `Ack` and `Leave` are relevant
127+
continue
128+
}
127129
}
128130

129131
match event {
130132
// connection acknowlegded => set state to Sending
131133
ProtoEvent::Ack(_) => state = State::Sending,
132134
// client disconnected
133-
ProtoEvent::Leave(_) => release_capture(&mut capture, server, &mut state).await?,
135+
ProtoEvent::Leave(_) => release_capture(&mut capture, server).await?,
134136
_ => {}
135137
}
136138
},
137139
e = rx.recv() => {
138140
match e {
139141
Some(e) => match e {
140-
CaptureRequest::Release => release_capture(&mut capture, server, &mut state).await?,
142+
CaptureRequest::Release => release_capture(&mut capture, server).await?,
141143
CaptureRequest::Create(h, p) => capture.create(h, p).await?,
142144
CaptureRequest::Destroy(h) => capture.destroy(h).await?,
143145
},
@@ -173,8 +175,9 @@ macro_rules! debounce {
173175
};
174176
}
175177

178+
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
176179
enum State {
177-
Idle,
180+
Receiving,
178181
WaitingForAck,
179182
Sending,
180183
}
@@ -189,41 +192,45 @@ async fn handle_capture_event(
189192
let (handle, event) = event;
190193
log::trace!("({handle}): {event:?}");
191194

192-
if server.should_release.borrow_mut().take().is_some()
193-
|| capture.keys_pressed(&server.release_bind)
194-
{
195-
return release_capture(capture, server, state).await;
195+
if server.should_release.borrow_mut().take().is_some() && *state != State::Receiving {
196+
log::info!("releasing capture: a client entered the device");
197+
*state = State::Receiving;
198+
return release_capture(capture, server).await;
199+
}
200+
201+
if capture.keys_pressed(&server.release_bind) {
202+
log::info!("releasing capture: release-bind pressed");
203+
return release_capture(capture, server).await;
196204
}
197205

198206
if event == CaptureEvent::Begin {
199-
*state = State::WaitingForAck;
207+
if *state != State::Sending {
208+
*state = State::WaitingForAck;
209+
}
200210
server.set_active(Some(handle));
201211
spawn_hook_command(server, handle);
202212
}
203213

204214
let event = match event {
205215
CaptureEvent::Begin => ProtoEvent::Enter(lan_mouse_proto::Position::Left),
206216
CaptureEvent::Input(e) => match state {
207-
State::Sending => ProtoEvent::Input(e),
208217
// connection not acknowledged, repeat `Enter` event
209-
_ => ProtoEvent::Enter(lan_mouse_proto::Position::Left),
218+
State::WaitingForAck => ProtoEvent::Enter(lan_mouse_proto::Position::Left),
219+
_ => ProtoEvent::Input(e),
210220
},
211221
};
212222

223+
log::info!("CAPTURE {event} >=>=>=>=>=> {handle}");
213224
if let Err(e) = conn.send(event, handle).await {
214-
const DUR: Duration = Duration::from_millis(500);
215-
debounce!(PREV_LOG, DUR, log::warn!("releasing capture: {e}"));
225+
// const DUR: Duration = Duration::from_millis(500);
226+
log::warn!("releasing capture: {e}");
227+
// debounce!(PREV_LOG, DUR, log::warn!("releasing capture: {e}"));
216228
capture.release().await?;
217229
}
218230
Ok(())
219231
}
220232

221-
async fn release_capture(
222-
capture: &mut InputCapture,
223-
server: &Server,
224-
state: &mut State,
225-
) -> Result<(), CaptureError> {
226-
*state = State::Idle;
233+
async fn release_capture(capture: &mut InputCapture, server: &Server) -> Result<(), CaptureError> {
227234
server.set_active(None);
228235
capture.release().await
229236
}

src/connect.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,19 +96,19 @@ impl LanMouseConnection {
9696
) -> Result<(), LanMouseConnectionError> {
9797
let (buf, len): ([u8; MAX_EVENT_SIZE], usize) = event.into();
9898
let buf = &buf[..len];
99+
log::info!("{event} =>=>=>=>=>=> {handle}");
99100
if let Some(addr) = self.server.active_addr(handle) {
100101
let conn = {
101102
let conns = self.conns.lock().await;
102103
conns.get(&addr).cloned()
103104
};
104105
if let Some(conn) = conn {
105-
log::trace!("{event} >->->->->- {addr}");
106+
log::info!("{event} >->->->->- {addr}");
106107
match conn.send(buf).await {
107108
Ok(_) => return Ok(()),
108109
Err(e) => {
109110
log::warn!("client {handle} failed to send: {e}");
110-
self.conns.lock().await.remove(&addr);
111-
self.server.set_active_addr(handle, None);
111+
disconnect(&self.server, handle, addr, &self.conns).await;
112112
}
113113
}
114114
}
@@ -186,6 +186,7 @@ async fn ping_pong(
186186
) {
187187
loop {
188188
let (buf, len) = ProtoEvent::Ping.into();
189+
log::trace!("PING >->->->->- {addr}");
189190
if let Err(e) = conn.send(&buf[..len]).await {
190191
log::warn!("send: {e}");
191192
disconnect(&server, handle, addr, &conns).await;

src/emulation.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,15 @@ impl Emulation {
4141
Some(e) => e,
4242
None => break,
4343
};
44+
if let ProtoEvent::Ping = event {
45+
log::trace!("{event} <-<-<-<-<- {addr}");
46+
} else {
47+
log::info!("{event} <-<-<-<-<- {addr}");
48+
}
4449
last_response.insert(addr, Instant::now());
4550
match event {
4651
ProtoEvent::Enter(_) => {
52+
log::info!("A CLIENT ENTERED THE DEVICE!");
4753
server.release_capture();
4854
listener.reply(addr, ProtoEvent::Ack(0)).await;
4955
}

src/listen.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,6 @@ impl LanMouseListener {
5151
let tx = listen_tx.clone();
5252
let listen_task: JoinHandle<()> = spawn_local(async move {
5353
loop {
54-
log::info!("accepting ...");
5554
let sleep = tokio::time::sleep(Duration::from_secs(2));
5655
let (conn, addr) = tokio::select! {
5756
_ = sleep => continue,
@@ -97,6 +96,11 @@ impl LanMouseListener {
9796
}
9897

9998
pub(crate) async fn reply(&self, addr: SocketAddr, event: ProtoEvent) {
99+
if let ProtoEvent::Pong = event {
100+
log::trace!("reply {event} >=>=>=>=>=> {addr}");
101+
} else {
102+
log::info!("reply {event} >=>=>=>=>=> {addr}");
103+
}
100104
let (buf, len): ([u8; MAX_EVENT_SIZE], usize) = event.into();
101105
let conns = self.conns.lock().await;
102106
for (a, conn) in conns.iter() {

0 commit comments

Comments
 (0)