Implement Window::request_redraw on Android (#1953)

This commit is contained in:
Tilmann Meyer 2021-06-05 12:47:08 +02:00 committed by GitHub
parent 1eff7ae004
commit 67cca71524
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 26 additions and 3 deletions

View file

@ -1,5 +1,6 @@
# Unreleased # Unreleased
- On Android, implement `Window::request_redraw`
- **Breaking:** On Web, remove the `stdweb` backend. - **Breaking:** On Web, remove the `stdweb` backend.
- Added `Window::focus_window`to bring the window to the front and set input focus. - Added `Window::focus_window`to bring the window to the front and set input focus.

View file

@ -20,12 +20,24 @@ use std::{
lazy_static! { lazy_static! {
static ref CONFIG: RwLock<Configuration> = RwLock::new(Configuration::new()); 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 { enum EventSource {
Callback, Callback,
InputQueue, InputQueue,
User, User,
Internal(InternalEvent),
} }
fn poll(poll: Poll) -> Option<EventSource> { fn poll(poll: Poll) -> Option<EventSource> {
@ -36,7 +48,13 @@ fn poll(poll: Poll) -> Option<EventSource> {
_ => unreachable!(), _ => unreachable!(),
}, },
Poll::Timeout => None, 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!(), Poll::Callback => unreachable!(),
} }
} }
@ -283,6 +301,9 @@ impl<T: 'static> EventLoop<T> {
); );
} }
} }
Some(EventSource::Internal(internal)) => match internal {
InternalEvent::RedrawRequested => redraw = true,
},
None => {} None => {}
} }
@ -478,7 +499,8 @@ impl Window {
} }
pub fn request_redraw(&self) { 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> { pub fn inner_position(&self) -> Result<PhysicalPosition<i32>, error::NotSupportedError> {

View file

@ -438,7 +438,7 @@ impl Window {
/// ## Platform-specific /// ## Platform-specific
/// ///
/// - **iOS:** Can only be called on the main thread. /// - **iOS:** Can only be called on the main thread.
/// - **Android:** Unsupported. /// - **Android:** Subsequent calls after `MainEventsCleared` are not handled.
#[inline] #[inline]
pub fn request_redraw(&self) { pub fn request_redraw(&self) {
self.window.request_redraw() self.window.request_redraw()