Fix: call `save` when hiding tab, and `update` when focusing it (#5114)
Fix for a regression in 0.28 * `App::save` will now be called when the web app is hidden (e.g. goes to a background tab) * `App::update` will now be called when the web app is un-hidden (e.g. becomes the foreground tab)
This commit is contained in:
parent
1488ffa35a
commit
89da356b79
|
|
@ -176,6 +176,12 @@ impl AppRunner {
|
||||||
///
|
///
|
||||||
/// Technically: does either the canvas or the [`TextAgent`] have focus?
|
/// Technically: does either the canvas or the [`TextAgent`] have focus?
|
||||||
pub fn has_focus(&self) -> bool {
|
pub fn has_focus(&self) -> bool {
|
||||||
|
let window = web_sys::window().unwrap();
|
||||||
|
let document = window.document().unwrap();
|
||||||
|
if document.hidden() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
super::has_focus(self.canvas()) || self.text_agent.has_focus()
|
super::has_focus(self.canvas()) || self.text_agent.has_focus()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,7 @@ pub(crate) fn install_event_handlers(runner_ref: &WebRunner) -> Result<(), JsVal
|
||||||
let document = window.document().unwrap();
|
let document = window.document().unwrap();
|
||||||
let canvas = runner_ref.try_lock().unwrap().canvas().clone();
|
let canvas = runner_ref.try_lock().unwrap().canvas().clone();
|
||||||
|
|
||||||
|
install_blur_focus(runner_ref, &document)?;
|
||||||
install_blur_focus(runner_ref, &canvas)?;
|
install_blur_focus(runner_ref, &canvas)?;
|
||||||
|
|
||||||
prevent_default_and_stop_propagation(
|
prevent_default_and_stop_propagation(
|
||||||
|
|
@ -106,15 +107,10 @@ pub(crate) fn install_event_handlers(runner_ref: &WebRunner) -> Result<(), JsVal
|
||||||
fn install_blur_focus(runner_ref: &WebRunner, target: &EventTarget) -> Result<(), JsValue> {
|
fn install_blur_focus(runner_ref: &WebRunner, target: &EventTarget) -> Result<(), JsValue> {
|
||||||
// NOTE: because of the text agent we sometime miss 'blur' events,
|
// NOTE: because of the text agent we sometime miss 'blur' events,
|
||||||
// so we also poll the focus state each frame in `AppRunner::logic`.
|
// so we also poll the focus state each frame in `AppRunner::logic`.
|
||||||
for event_name in ["blur", "focus"] {
|
for event_name in ["blur", "focus", "visibilitychange"] {
|
||||||
let closure = move |_event: web_sys::MouseEvent, runner: &mut AppRunner| {
|
let closure = move |_event: web_sys::MouseEvent, runner: &mut AppRunner| {
|
||||||
log::trace!("{} {event_name:?}", runner.canvas().id());
|
log::trace!("{} {event_name:?}", runner.canvas().id());
|
||||||
runner.update_focus();
|
runner.update_focus();
|
||||||
|
|
||||||
if event_name == "blur" {
|
|
||||||
// This might be a good time to save the state
|
|
||||||
runner.save();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
runner_ref.add_event_listener(target, event_name, closure)?;
|
runner_ref.add_event_listener(target, event_name, closure)?;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue