native-activity: Propagate onNativeWindowRedrawNeeded callback to main loop

This commit is contained in:
Marijn Suijten
2023-04-01 14:41:33 +02:00
parent a04c483d79
commit 87fe6a8465
2 changed files with 24 additions and 2 deletions
+2 -2
View File
@@ -17,7 +17,7 @@ license = "MIT OR Apache-2.0"
#
# In general it's only the final application crate that needs
# to decide on a backend.
default=[]
default = []
game-activity = []
native-activity = []
@@ -43,4 +43,4 @@ targets = [
"x86_64-linux-android",
]
rustdoc-args = ["--cfg", "docsrs" ]
rustdoc-args = ["--cfg", "docsrs"]
@@ -127,6 +127,8 @@ impl NativeActivityGlue {
(*(*activity).callbacks).onWindowFocusChanged = Some(on_window_focus_changed);
(*(*activity).callbacks).onNativeWindowCreated = Some(on_native_window_created);
(*(*activity).callbacks).onNativeWindowResized = Some(on_native_window_resized);
(*(*activity).callbacks).onNativeWindowRedrawNeeded =
Some(on_native_window_redraw_needed);
(*(*activity).callbacks).onNativeWindowDestroyed = Some(on_native_window_destroyed);
(*(*activity).callbacks).onInputQueueCreated = Some(on_input_queue_created);
(*(*activity).callbacks).onInputQueueDestroyed = Some(on_input_queue_destroyed);
@@ -407,6 +409,16 @@ impl WaitableNativeActivityState {
guard.write_cmd(AppCmd::WindowResized);
}
pub fn notify_window_redraw_needed(&self, native_window: *mut ndk_sys::ANativeWindow) {
let mut guard = self.mutex.lock().unwrap();
// set_window always syncs .pending_window back to .window before returning. This callback
// from Android can never arrive at an interim state, and validates that Android:
// 1. Only provides resizes in between onNativeWindowCreated and onNativeWindowDestroyed;
// 2. Doesn't call it on a bogus window pointer that we don't know about.
debug_assert_eq!(guard.window.as_ref().unwrap().ptr().as_ptr(), native_window);
guard.write_cmd(AppCmd::WindowRedrawNeeded);
}
unsafe fn set_input(&self, input_queue: *mut ndk_sys::AInputQueue) {
let mut guard = self.mutex.lock().unwrap();
@@ -722,6 +734,16 @@ unsafe extern "C" fn on_native_window_resized(
});
}
unsafe extern "C" fn on_native_window_redraw_needed(
activity: *mut ndk_sys::ANativeActivity,
window: *mut ndk_sys::ANativeWindow,
) {
log::debug!("NativeWindowRedrawNeeded: {:p} -- {:p}\n", activity, window);
try_with_waitable_activity_ref(activity, |waitable_activity| {
waitable_activity.notify_window_redraw_needed(window)
});
}
unsafe extern "C" fn on_native_window_destroyed(
activity: *mut ndk_sys::ANativeActivity,
window: *mut ndk_sys::ANativeWindow,