MCPcopy Create free account
hub / github.com/emberian/evdev / poll_event

Method poll_event

src/sync_stream.rs:833–872  ·  view source on GitHub ↗

A lower-level function for directly polling this stream.

(&mut self, cx: &mut Context<'_>)

Source from the content-addressed store, hash-verified

831
832 /// A lower-level function for directly polling this stream.
833 pub fn poll_event(&mut self, cx: &mut Context<'_>) -> Poll<io::Result<InputEvent>> {
834 'outer: loop {
835 let dev = self.device.get_mut();
836 if let Some(ev) = compensate_events(&mut self.sync, dev) {
837 return Poll::Ready(Ok(ev));
838 }
839 let state = &mut dev.state;
840 let (res, consumed_to) =
841 sync_events(&mut self.event_range, &dev.raw.event_buf, |ev| {
842 state.process_event(ev)
843 });
844 if let Some(end) = consumed_to {
845 self.consumed_to = end
846 }
847 match res {
848 Ok(ev) => return Poll::Ready(Ok(InputEvent::from(ev))),
849 Err(requires_sync) => {
850 if requires_sync {
851 dev.block_dropped = true;
852 }
853 }
854 }
855 dev.raw.event_buf.drain(..self.consumed_to);
856 self.consumed_to = 0;
857
858 loop {
859 let mut guard = ready!(self.device.poll_read_ready_mut(cx))?;
860
861 let res = guard.try_io(|device| device.get_mut().fetch_events_inner());
862 match res {
863 Ok(res) => {
864 self.sync = res?;
865 self.event_range = 0..0;
866 continue 'outer;
867 }
868 Err(_would_block) => continue,
869 }
870 }
871 }
872 }
873 }
874
875 #[cfg(feature = "stream-trait")]

Callers 2

next_eventMethod · 0.45
poll_nextMethod · 0.45

Calls 4

compensate_eventsFunction · 0.85
sync_eventsFunction · 0.85
process_eventMethod · 0.80
fetch_events_innerMethod · 0.80

Tested by

no test coverage detected