Skip to content

Commit

Permalink
Implement Window::request_redraw on Android (#1953)
Browse files Browse the repository at this point in the history
  • Loading branch information
Tilmann Meyer committed Jun 5, 2021
1 parent 1eff7ae commit 67cca71
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 3 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
# Unreleased

- On Android, implement `Window::request_redraw`
- **Breaking:** On Web, remove the `stdweb` backend.
- Added `Window::focus_window`to bring the window to the front and set input focus.

Expand Down
26 changes: 24 additions & 2 deletions src/platform_impl/android/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,24 @@ use std::{

lazy_static! {
static ref CONFIG: RwLock<Configuration> = RwLock::new(Configuration::new());
// If this is `Some()` a `Poll::Wake` is considered an `EventSource::Internal` with the event
// contained in the `Option`. The event is moved outside of the `Option` replacing it with a
// `None`.
//
// This allows us to inject event into the event loop without going through `ndk-glue` and
// calling unsafe function that should only be called by Android.
static ref INTERNAL_EVENT: RwLock<Option<InternalEvent>> = RwLock::new(None);
}

enum InternalEvent {
RedrawRequested,
}

enum EventSource {
Callback,
InputQueue,
User,
Internal(InternalEvent),
}

fn poll(poll: Poll) -> Option<EventSource> {
Expand All @@ -36,7 +48,13 @@ fn poll(poll: Poll) -> Option<EventSource> {
_ => unreachable!(),
},
Poll::Timeout => None,
Poll::Wake => Some(EventSource::User),
Poll::Wake => Some(
INTERNAL_EVENT
.write()
.unwrap()
.take()
.map_or(EventSource::User, EventSource::Internal),
),
Poll::Callback => unreachable!(),
}
}
Expand Down Expand Up @@ -283,6 +301,9 @@ impl<T: 'static> EventLoop<T> {
);
}
}
Some(EventSource::Internal(internal)) => match internal {
InternalEvent::RedrawRequested => redraw = true,
},
None => {}
}

Expand Down Expand Up @@ -478,7 +499,8 @@ impl Window {
}

pub fn request_redraw(&self) {
// TODO
*INTERNAL_EVENT.write().unwrap() = Some(InternalEvent::RedrawRequested);
ForeignLooper::for_thread().unwrap().wake();
}

pub fn inner_position(&self) -> Result<PhysicalPosition<i32>, error::NotSupportedError> {
Expand Down
2 changes: 1 addition & 1 deletion src/window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -438,7 +438,7 @@ impl Window {
/// ## Platform-specific
///
/// - **iOS:** Can only be called on the main thread.
/// - **Android:** Unsupported.
/// - **Android:** Subsequent calls after `MainEventsCleared` are not handled.
#[inline]
pub fn request_redraw(&self) {
self.window.request_redraw()
Expand Down

0 comments on commit 67cca71

Please sign in to comment.