summaryrefslogtreecommitdiffstats
path: root/winit/src/application.rs
diff options
context:
space:
mode:
Diffstat (limited to 'winit/src/application.rs')
-rw-r--r--winit/src/application.rs140
1 files changed, 54 insertions, 86 deletions
diff --git a/winit/src/application.rs b/winit/src/application.rs
index 2c5c864a..d9700075 100644
--- a/winit/src/application.rs
+++ b/winit/src/application.rs
@@ -1,6 +1,4 @@
//! Create interactive, native cross-platform applications.
-#[cfg(feature = "trace")]
-mod profiler;
mod state;
pub use state::State;
@@ -27,11 +25,6 @@ use futures::channel::mpsc;
use std::mem::ManuallyDrop;
-#[cfg(feature = "trace")]
-pub use profiler::Profiler;
-#[cfg(feature = "trace")]
-use tracing::{info_span, instrument::Instrument};
-
/// An interactive, native cross-platform application.
///
/// This trait is the main entrypoint of Iced. Once implemented, you can run
@@ -119,15 +112,9 @@ where
use futures::Future;
use winit::event_loop::EventLoopBuilder;
- #[cfg(feature = "trace")]
- let _guard = Profiler::init();
-
let mut debug = Debug::new();
debug.startup_started();
- #[cfg(feature = "trace")]
- let _ = info_span!("Application", "RUN").entered();
-
let event_loop = EventLoopBuilder::with_user_event().build();
let proxy = event_loop.create_proxy();
@@ -148,14 +135,15 @@ where
let target = settings.window.platform_specific.target.clone();
let should_be_visible = settings.window.visible;
- let builder = settings
- .window
- .into_builder(
- &application.title(),
- event_loop.primary_monitor(),
- settings.id,
- )
- .with_visible(false);
+ let exit_on_close_request = settings.window.exit_on_close_request;
+
+ let builder = conversion::window_settings(
+ settings.window,
+ &application.title(),
+ event_loop.primary_monitor(),
+ settings.id,
+ )
+ .with_visible(false);
log::debug!("Window builder: {builder:#?}");
@@ -193,8 +181,8 @@ where
};
}
- let (compositor, mut renderer) =
- C::new(compositor_settings, Some(&window))?;
+ let compositor = C::new(compositor_settings, Some(&window))?;
+ let mut renderer = compositor.create_renderer();
for font in settings.fonts {
use crate::core::text::Renderer;
@@ -205,28 +193,20 @@ where
let (mut event_sender, event_receiver) = mpsc::unbounded();
let (control_sender, mut control_receiver) = mpsc::unbounded();
- let mut instance = Box::pin({
- let run_instance = run_instance::<A, E, C>(
- application,
- compositor,
- renderer,
- runtime,
- proxy,
- debug,
- event_receiver,
- control_sender,
- init_command,
- window,
- should_be_visible,
- settings.exit_on_close_request,
- );
-
- #[cfg(feature = "trace")]
- let run_instance =
- run_instance.instrument(info_span!("Application", "LOOP"));
-
- run_instance
- });
+ let mut instance = Box::pin(run_instance::<A, E, C>(
+ application,
+ compositor,
+ renderer,
+ runtime,
+ proxy,
+ debug,
+ event_receiver,
+ control_sender,
+ init_command,
+ window,
+ should_be_visible,
+ exit_on_close_request,
+ ));
let mut context = task::Context::from_waker(task::noop_waker_ref());
@@ -426,6 +406,7 @@ async fn run_instance<A, E, C>(
// Then, we can use the `interface_state` here to decide if a redraw
// is needed right away, or simply wait until a specific time.
let redraw_event = Event::Window(
+ window::Id::MAIN,
window::Event::RedrawRequested(Instant::now()),
);
@@ -488,9 +469,6 @@ async fn run_instance<A, E, C>(
messages.push(message);
}
event::Event::RedrawRequested(_) => {
- #[cfg(feature = "trace")]
- let _ = info_span!("Application", "FRAME").entered();
-
let physical_size = state.physical_size();
if physical_size.width == 0 || physical_size.height == 0 {
@@ -578,6 +556,7 @@ async fn run_instance<A, E, C>(
state.update(&window, &window_event, &mut debug);
if let Some(event) = conversion::window_event(
+ window::Id::MAIN,
&window_event,
state.scale_factor(),
state.modifiers(),
@@ -629,24 +608,12 @@ pub fn build_user_interface<'a, A: Application>(
where
<A::Renderer as core::Renderer>::Theme: StyleSheet,
{
- #[cfg(feature = "trace")]
- let view_span = info_span!("Application", "VIEW").entered();
-
debug.view_started();
let view = application.view();
-
- #[cfg(feature = "trace")]
- let _ = view_span.exit();
debug.view_finished();
- #[cfg(feature = "trace")]
- let layout_span = info_span!("Application", "LAYOUT").entered();
-
debug.layout_started();
let user_interface = UserInterface::build(view, size, cache, renderer);
-
- #[cfg(feature = "trace")]
- let _ = layout_span.exit();
debug.layout_finished();
user_interface
@@ -673,16 +640,10 @@ pub fn update<A: Application, C, E: Executor>(
<A::Renderer as core::Renderer>::Theme: StyleSheet,
{
for message in messages.drain(..) {
- #[cfg(feature = "trace")]
- let update_span = info_span!("Application", "UPDATE").entered();
-
debug.log_message(&message);
debug.update_started();
let command = runtime.enter(|| application.update(message));
-
- #[cfg(feature = "trace")]
- let _ = update_span.exit();
debug.update_finished();
run_command(
@@ -752,20 +713,27 @@ pub fn run_command<A, C, E>(
}
},
command::Action::Window(action) => match action {
- window::Action::Close => {
+ window::Action::Close(_id) => {
*should_exit = true;
}
- window::Action::Drag => {
+ window::Action::Drag(_id) => {
let _res = window.drag_window();
}
- window::Action::Resize(size) => {
+ window::Action::Spawn { .. } => {
+ log::warn!(
+ "Spawning a window is only available with \
+ multi-window applications."
+ );
+ }
+ window::Action::Resize(_id, size) => {
window.set_inner_size(winit::dpi::LogicalSize {
width: size.width,
height: size.height,
});
}
- window::Action::FetchSize(callback) => {
- let size = window.inner_size();
+ window::Action::FetchSize(_id, callback) => {
+ let size =
+ window.inner_size().to_logical(window.scale_factor());
proxy
.send_event(callback(Size::new(
@@ -774,29 +742,29 @@ pub fn run_command<A, C, E>(
)))
.expect("Send message to event loop");
}
- window::Action::Maximize(maximized) => {
+ window::Action::Maximize(_id, maximized) => {
window.set_maximized(maximized);
}
- window::Action::Minimize(minimized) => {
+ window::Action::Minimize(_id, minimized) => {
window.set_minimized(minimized);
}
- window::Action::Move { x, y } => {
+ window::Action::Move(_id, position) => {
window.set_outer_position(winit::dpi::LogicalPosition {
- x,
- y,
+ x: position.x,
+ y: position.y,
});
}
- window::Action::ChangeMode(mode) => {
+ window::Action::ChangeMode(_id, mode) => {
window.set_visible(conversion::visible(mode));
window.set_fullscreen(conversion::fullscreen(
window.current_monitor(),
mode,
));
}
- window::Action::ChangeIcon(icon) => {
+ window::Action::ChangeIcon(_id, icon) => {
window.set_window_icon(conversion::icon(icon));
}
- window::Action::FetchMode(tag) => {
+ window::Action::FetchMode(_id, tag) => {
let mode = if window.is_visible().unwrap_or(true) {
conversion::mode(window.fullscreen())
} else {
@@ -807,29 +775,29 @@ pub fn run_command<A, C, E>(
.send_event(tag(mode))
.expect("Send message to event loop");
}
- window::Action::ToggleMaximize => {
+ window::Action::ToggleMaximize(_id) => {
window.set_maximized(!window.is_maximized());
}
- window::Action::ToggleDecorations => {
+ window::Action::ToggleDecorations(_id) => {
window.set_decorations(!window.is_decorated());
}
- window::Action::RequestUserAttention(user_attention) => {
+ window::Action::RequestUserAttention(_id, user_attention) => {
window.request_user_attention(
user_attention.map(conversion::user_attention),
);
}
- window::Action::GainFocus => {
+ window::Action::GainFocus(_id) => {
window.focus_window();
}
- window::Action::ChangeLevel(level) => {
+ window::Action::ChangeLevel(_id, level) => {
window.set_window_level(conversion::window_level(level));
}
- window::Action::FetchId(tag) => {
+ window::Action::FetchId(_id, tag) => {
proxy
.send_event(tag(window.id().into()))
.expect("Send message to event loop");
}
- window::Action::Screenshot(tag) => {
+ window::Action::Screenshot(_id, tag) => {
let bytes = compositor.screenshot(
renderer,
surface,