Create iced_futures and wire everything up

This commit is contained in:
Héctor Ramón Jiménez 2020-01-19 10:17:08 +01:00
parent d50ff9b5d9
commit b5b17ed4d8
23 changed files with 196 additions and 195 deletions

View file

@ -1,9 +1,10 @@
use crate::{
conversion,
input::{keyboard, mouse},
subscription, window, Cache, Clipboard, Command, Debug, Element, Event,
Mode, MouseCursor, Settings, Size, Subscription, UserInterface,
window, Cache, Clipboard, Command, Debug, Element, Event, Mode,
MouseCursor, Proxy, Settings, Size, Subscription, UserInterface,
};
use iced_native::Runtime;
/// An interactive, native cross-platform application.
///
@ -109,17 +110,19 @@ pub trait Application: Sized {
debug.startup_started();
let event_loop = EventLoop::with_user_event();
let proxy = event_loop.create_proxy();
let mut thread_pool =
futures::executor::ThreadPool::new().expect("Create thread pool");
let mut subscription_pool = subscription::Pool::new();
let mut runtime = {
let thread_pool = futures::executor::ThreadPool::new()
.expect("Create thread pool");
Runtime::new(thread_pool, Proxy::new(event_loop.create_proxy()))
};
let mut external_messages = Vec::new();
let (mut application, init_command) = Self::new();
spawn(init_command, &mut thread_pool, &proxy);
runtime.spawn(init_command);
let subscription = application.subscription();
subscription_pool.update(subscription, &mut thread_pool, &proxy);
runtime.track(subscription);
let mut title = application.title();
let mut mode = application.mode();
@ -212,7 +215,7 @@ pub trait Application: Sized {
events
.iter()
.cloned()
.for_each(|event| subscription_pool.broadcast_event(event));
.for_each(|event| runtime.broadcast(event));
let mut messages = user_interface.update(
&renderer,
@ -241,17 +244,15 @@ pub trait Application: Sized {
debug.log_message(&message);
debug.update_started();
let command = application.update(message);
spawn(command, &mut thread_pool, &proxy);
let command =
runtime.enter(|| application.update(message));
runtime.spawn(command);
debug.update_finished();
}
let subscription = application.subscription();
subscription_pool.update(
subscription,
&mut thread_pool,
&proxy,
);
let subscription =
runtime.enter(|| application.subscription());
runtime.track(subscription);
// Update window title
let new_title = application.title();
@ -463,28 +464,6 @@ fn to_physical(size: winit::dpi::LogicalSize, dpi: f64) -> (u16, u16) {
)
}
fn spawn<Message: Send>(
command: Command<Message>,
thread_pool: &mut futures::executor::ThreadPool,
proxy: &winit::event_loop::EventLoopProxy<Message>,
) {
use futures::FutureExt;
let futures = command.futures();
for future in futures {
let proxy = proxy.clone();
let future = future.map(move |message| {
proxy
.send_event(message)
.expect("Send command result to event loop");
});
thread_pool.spawn_ok(future);
}
}
// As defined in: http://www.unicode.org/faq/private_use.html
// TODO: Remove once https://github.com/rust-windowing/winit/pull/1254 lands
fn is_private_use_character(c: char) -> bool {