| ... | ... | @@ -237,6 +237,17 @@ type Continuation = Box<dyn FnOnce(&mut State) -> Result<(), Box<dyn Error>> + S |
| 237 | 237 | /// one is open; one cancelled drops its reply unanswered. |
| 238 | 238 | struct Reply<T>(Box<dyn FnOnce(T) + Send>); |
| 239 | 239 | |
| 240 | /// Open Notebook blocks target shortcuts until its reply is consumed or cancelled. |
| 241 | #[cfg(any(windows, target_os = "linux"))] |
| 242 | struct Prompt(EventLoopProxy<UserEvent>); |
| 243 | |
| 244 | #[cfg(any(windows, target_os = "linux"))] |
| 245 | impl Drop for Prompt { |
| 246 | fn drop(&mut self) { |
| 247 | let _ = self.0.send_event(UserEvent::Redraw); |
| 248 | } |
| 249 | } |
| 250 | |
| 240 | 251 | impl<T: Send + 'static> Reply<T> { |
| 241 | 252 | fn new( |
| 242 | 253 | proxy: &EventLoopProxy<UserEvent>, |
| ... | ... | @@ -877,6 +888,8 @@ struct State { |
| 877 | 888 | /// Snowbound's own dialogs, first the one shown, where the desktop has none. |
| 878 | 889 | #[cfg(target_os = "linux")] |
| 879 | 890 | asking: std::collections::VecDeque<dialog::Dialog>, |
| 891 | #[cfg(any(windows, target_os = "linux"))] |
| 892 | prompt: std::sync::Weak<Prompt>, |
| 880 | 893 | /// What has been read in each notebook, on this computer. |
| 881 | 894 | reads: unread::Reads, |
| 882 | 895 | #[cfg(feature = "live")] |
| ... | ... | @@ -1356,6 +1369,8 @@ impl State { |
| 1356 | 1369 | unpacking: None, |
| 1357 | 1370 | #[cfg(target_os = "linux")] |
| 1358 | 1371 | asking: Default::default(), |
| 1372 | #[cfg(any(windows, target_os = "linux"))] |
| 1373 | prompt: Default::default(), |
| 1359 | 1374 | reads, |
| 1360 | 1375 | #[cfg(feature = "live")] |
| 1361 | 1376 | peers: Default::default(), |
| ... | ... | @@ -3652,13 +3667,23 @@ impl State { |
| 3652 | 3667 | Command::RestoreVersion { page, version } => self.restore_version(page, version)?, |
| 3653 | 3668 | Command::DeletePageVersion { page, version } => self.delete_version(page, version)?, |
| 3654 | 3669 | Command::DeleteAllVersions(scope) => self.delete_all_versions(scope)?, |
| 3655 | | Command::OpenNotebook => platform::pick_notebook( |
| 3656 | | "Open Notebook", |
| 3657 | | self.reply(|state, path: PathBuf| { |
| 3658 | | state.open_path(&path); |
| 3659 | | Ok(()) |
| 3660 | | }), |
| 3661 | | ), |
| 3670 | Command::OpenNotebook => { |
| 3671 | #[cfg(any(windows, target_os = "linux"))] |
| 3672 | let prompt = self.prompt.upgrade().unwrap_or_else(|| { |
| 3673 | let prompt = Arc::new(Prompt(self.proxy.clone())); |
| 3674 | self.prompt = Arc::downgrade(&prompt); |
| 3675 | prompt |
| 3676 | }); |
| 3677 | platform::pick_notebook( |
| 3678 | "Open Notebook", |
| 3679 | self.reply(move |state, path: PathBuf| { |
| 3680 | #[cfg(any(windows, target_os = "linux"))] |
| 3681 | let _prompt = prompt; |
| 3682 | state.open_path(&path); |
| 3683 | Ok(()) |
| 3684 | }), |
| 3685 | ); |
| 3686 | } |
| 3662 | 3687 | Command::OpenFromServer(location) => self.open_server(location.as_deref()), |
| 3663 | 3688 | #[cfg(feature = "live")] |
| 3664 | 3689 | Command::OpenShared => self.open_shared(), |