From d39562cff629720154be93af76e66c020bf83000 Mon Sep 17 00:00:00 2001 From: Sebastian Imlay Date: Sat, 30 Nov 2019 20:30:10 -0800 Subject: [PATCH 1/6] Implement revamped `RedrawRequested` on iOS --- src/platform_impl/ios/app_state.rs | 15 ++++----------- src/platform_impl/ios/view.rs | 11 ++++++----- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/platform_impl/ios/app_state.rs b/src/platform_impl/ios/app_state.rs index 6009a26a7e..2307247264 100644 --- a/src/platform_impl/ios/app_state.rs +++ b/src/platform_impl/ios/app_state.rs @@ -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 { 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,13 @@ 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 .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()))); drop(this); handle_nonuser_events(redraw_events); diff --git a/src/platform_impl/ios/view.rs b/src/platform_impl/ios/view.rs index 6f712dd30f..342571d6b0 100644 --- a/src/platform_impl/ios/view.rs +++ b/src/platform_impl/ios/view.rs @@ -102,10 +102,9 @@ 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_event(Event::RedrawRequested(RootWindowId( + window.into(), + ))); let superclass: &'static Class = msg_send![object, superclass]; let () = msg_send![super(object, superclass), drawRect: rect]; } @@ -500,7 +499,9 @@ pub unsafe fn create_window( let () = msg_send![uiscreen, setCurrentMode: video_mode.video_mode.screen_mode]; msg_send![window, setScreen:video_mode.monitor().ui_screen()] } - Some(Fullscreen::Borderless(ref monitor)) => msg_send![window, setScreen:monitor.ui_screen()], + Some(Fullscreen::Borderless(ref monitor)) => { + msg_send![window, setScreen:monitor.ui_screen()] + } None => (), } From 5e04303ea12afe0e084e36ea9d5206c27e0a5509 Mon Sep 17 00:00:00 2001 From: Sebastian Imlay Date: Sun, 1 Dec 2019 17:11:23 -0800 Subject: [PATCH 2/6] Added RedrawEventsCleared to events_cleared logic --- src/platform_impl/ios/app_state.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/platform_impl/ios/app_state.rs b/src/platform_impl/ios/app_state.rs index 2307247264..2627d9c680 100644 --- a/src/platform_impl/ios/app_state.rs +++ b/src/platform_impl/ios/app_state.rs @@ -778,7 +778,8 @@ pub unsafe fn handle_main_events_cleared() { let redraw_events = this .main_events_cleared_transition() .into_iter() - .map(|window| Event::RedrawRequested(RootWindowId(window.into()))); + .map(|window| Event::RedrawRequested(RootWindowId(window.into()))) + .map(|_: Event| Event::RedrawEventsCleared); drop(this); handle_nonuser_events(redraw_events); From 4abb0dc4f0274e19628439f16c32c18f4d6c7d2b Mon Sep 17 00:00:00 2001 From: Sebastian Imlay Date: Tue, 3 Dec 2019 12:43:35 -0800 Subject: [PATCH 3/6] Fixed from comments --- src/platform_impl/ios/app_state.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform_impl/ios/app_state.rs b/src/platform_impl/ios/app_state.rs index 2627d9c680..35b8ac12c9 100644 --- a/src/platform_impl/ios/app_state.rs +++ b/src/platform_impl/ios/app_state.rs @@ -779,7 +779,7 @@ pub unsafe fn handle_main_events_cleared() { .main_events_cleared_transition() .into_iter() .map(|window| Event::RedrawRequested(RootWindowId(window.into()))) - .map(|_: Event| Event::RedrawEventsCleared); + .chain(std::iter::once(Event::RedrawEventsCleared)); drop(this); handle_nonuser_events(redraw_events); From ae417ccdfac6a2a9935819310f565fb8859239bc Mon Sep 17 00:00:00 2001 From: Sebastian Imlay Date: Fri, 13 Dec 2019 11:05:59 -0800 Subject: [PATCH 4/6] Added RedrawEventsCleared to draw_rect handler. --- src/platform_impl/ios/view.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/platform_impl/ios/view.rs b/src/platform_impl/ios/view.rs index 342571d6b0..4906c4ab25 100644 --- a/src/platform_impl/ios/view.rs +++ b/src/platform_impl/ios/view.rs @@ -102,9 +102,12 @@ 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::RedrawRequested(RootWindowId( - window.into(), - ))); + 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]; } From caf56bc7d1177def02bf49ed3f050b59c787fabf Mon Sep 17 00:00:00 2001 From: Sebastian Imlay Date: Wed, 18 Dec 2019 13:19:49 -0800 Subject: [PATCH 5/6] Fixed out of order `RedrawEventsCleared` events. --- src/platform_impl/ios/app_state.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/platform_impl/ios/app_state.rs b/src/platform_impl/ios/app_state.rs index 35b8ac12c9..e82da8b5b5 100644 --- a/src/platform_impl/ios/app_state.rs +++ b/src/platform_impl/ios/app_state.rs @@ -775,11 +775,14 @@ pub unsafe fn handle_main_events_cleared() { handle_nonuser_event(Event::MainEventsCleared); let mut this = AppState::get_mut(); - let redraw_events = this + let mut redraw_events : Vec> = this .main_events_cleared_transition() .into_iter() - .map(|window| Event::RedrawRequested(RootWindowId(window.into()))) - .chain(std::iter::once(Event::RedrawEventsCleared)); + .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); From a62909c8943cd2fe6b61bb136ececf24847ad0cc Mon Sep 17 00:00:00 2001 From: Sebastian Imlay Date: Sat, 21 Dec 2019 12:53:16 -0800 Subject: [PATCH 6/6] cargo fmt --- src/platform_impl/ios/app_state.rs | 5 +++-- src/platform_impl/ios/view.rs | 6 ++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/platform_impl/ios/app_state.rs b/src/platform_impl/ios/app_state.rs index e82da8b5b5..e1b82be194 100644 --- a/src/platform_impl/ios/app_state.rs +++ b/src/platform_impl/ios/app_state.rs @@ -775,10 +775,11 @@ pub unsafe fn handle_main_events_cleared() { handle_nonuser_event(Event::MainEventsCleared); let mut this = AppState::get_mut(); - let mut redraw_events : Vec> = this + let mut redraw_events: Vec> = this .main_events_cleared_transition() .into_iter() - .map(|window| Event::RedrawRequested(RootWindowId(window.into()))).collect(); + .map(|window| Event::RedrawRequested(RootWindowId(window.into()))) + .collect(); if !redraw_events.is_empty() { redraw_events.push(Event::RedrawEventsCleared); diff --git a/src/platform_impl/ios/view.rs b/src/platform_impl/ios/view.rs index 4906c4ab25..2ed6d77a2d 100644 --- a/src/platform_impl/ios/view.rs +++ b/src/platform_impl/ios/view.rs @@ -103,10 +103,8 @@ unsafe fn get_view_class(root_view_class: &'static Class) -> &'static Class { let window: id = msg_send![object, window]; assert!(!window.is_null()); app_state::handle_nonuser_events( - std::iter::once(Event::RedrawRequested(RootWindowId( - window.into(), - ))) - .chain(std::iter::once(Event::RedrawEventsCleared)) + 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];