Implement revamped RedrawRequested on iOS. (#1299)

* Implement revamped `RedrawRequested` on iOS

* Added RedrawEventsCleared to events_cleared logic

* Fixed from comments

* Added RedrawEventsCleared to draw_rect handler.

* Fixed out of order `RedrawEventsCleared` events.

* cargo fmt
This commit is contained in:
simlay 2019-12-21 16:35:18 -08:00 committed by Osspial
parent 133b11fa6d
commit 530ff5420b
2 changed files with 14 additions and 16 deletions

View file

@ -12,7 +12,7 @@ use std::{
use objc::runtime::{BOOL, YES};
use crate::{
event::{Event, StartCause, WindowEvent},
event::{Event, StartCause},
event_loop::ControlFlow,
platform_impl::platform::{
event_loop::{EventHandler, Never},
@ -51,11 +51,7 @@ enum UserCallbackTransitionResult<'a> {
impl Event<Never> {
fn is_redraw(&self) -> bool {
if let Event::WindowEvent {
window_id: _,
event: WindowEvent::RedrawRequested,
} = self
{
if let Event::RedrawRequested(_) = self {
true
} else {
false
@ -776,16 +772,18 @@ pub unsafe fn handle_main_events_cleared() {
// User events are always sent out at the end of the "MainEventLoop"
handle_user_events();
handle_nonuser_event(Event::EventsCleared);
handle_nonuser_event(Event::MainEventsCleared);
let mut this = AppState::get_mut();
let redraw_events = this
let mut redraw_events: Vec<Event<Never>> = this
.main_events_cleared_transition()
.into_iter()
.map(|window| Event::WindowEvent {
window_id: RootWindowId(window.into()),
event: WindowEvent::RedrawRequested,
});
.map(|window| Event::RedrawRequested(RootWindowId(window.into())))
.collect();
if !redraw_events.is_empty() {
redraw_events.push(Event::RedrawEventsCleared);
}
drop(this);
handle_nonuser_events(redraw_events);

View file

@ -102,10 +102,10 @@ unsafe fn get_view_class(root_view_class: &'static Class) -> &'static Class {
unsafe {
let window: id = msg_send![object, window];
assert!(!window.is_null());
app_state::handle_nonuser_event(Event::WindowEvent {
window_id: RootWindowId(window.into()),
event: WindowEvent::RedrawRequested,
});
app_state::handle_nonuser_events(
std::iter::once(Event::RedrawRequested(RootWindowId(window.into())))
.chain(std::iter::once(Event::RedrawEventsCleared)),
);
let superclass: &'static Class = msg_send![object, superclass];
let () = msg_send![super(object, superclass), drawRect: rect];
}