summaryrefslogtreecommitdiffstats
path: root/winit
diff options
context:
space:
mode:
Diffstat (limited to 'winit')
-rw-r--r--winit/src/application.rs27
-rw-r--r--winit/src/conversion.rs35
-rw-r--r--winit/src/multi_window.rs105
3 files changed, 83 insertions, 84 deletions
diff --git a/winit/src/application.rs b/winit/src/application.rs
index 4aed1eee..d93ea42e 100644
--- a/winit/src/application.rs
+++ b/winit/src/application.rs
@@ -12,7 +12,8 @@ use crate::core::widget::operation;
use crate::core::window;
use crate::core::{Color, Event, Point, Size, Theme};
use crate::futures::futures;
-use crate::futures::{Executor, Runtime, Subscription};
+use crate::futures::subscription::{self, Subscription};
+use crate::futures::{Executor, Runtime};
use crate::graphics;
use crate::graphics::compositor::{self, Compositor};
use crate::runtime::clipboard;
@@ -574,12 +575,10 @@ async fn run_instance<A, E, C>(
event::Event::PlatformSpecific(event::PlatformSpecific::MacOS(
event::MacOS::ReceivedUrl(url),
)) => {
- use crate::core::event;
-
- events.push(Event::PlatformSpecific(
- event::PlatformSpecific::MacOS(event::MacOS::ReceivedUrl(
- url,
- )),
+ runtime.broadcast(subscription::Event::PlatformSpecific(
+ subscription::PlatformSpecific::MacOS(
+ subscription::MacOS::ReceivedUrl(url),
+ ),
));
}
event::Event::UserEvent(message) => {
@@ -623,7 +622,6 @@ 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()),
);
@@ -651,7 +649,11 @@ async fn run_instance<A, E, C>(
_ => ControlFlow::Wait,
});
- runtime.broadcast(redraw_event, core::event::Status::Ignored);
+ runtime.broadcast(subscription::Event::Interaction {
+ window: window::Id::MAIN,
+ event: redraw_event,
+ status: core::event::Status::Ignored,
+ });
debug.draw_started();
let new_mouse_interaction = user_interface.draw(
@@ -714,7 +716,6 @@ 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(),
@@ -742,7 +743,11 @@ async fn run_instance<A, E, C>(
for (event, status) in
events.drain(..).zip(statuses.into_iter())
{
- runtime.broadcast(event, status);
+ runtime.broadcast(subscription::Event::Interaction {
+ window: window::Id::MAIN,
+ event,
+ status,
+ });
}
if !messages.is_empty()
diff --git a/winit/src/conversion.rs b/winit/src/conversion.rs
index ea33e610..79fcf92e 100644
--- a/winit/src/conversion.rs
+++ b/winit/src/conversion.rs
@@ -126,7 +126,6 @@ pub fn window_attributes(
/// Converts a winit window event into an iced event.
pub fn window_event(
- id: window::Id,
event: winit::event::WindowEvent,
scale_factor: f64,
modifiers: winit::keyboard::ModifiersState,
@@ -137,16 +136,13 @@ pub fn window_event(
WindowEvent::Resized(new_size) => {
let logical_size = new_size.to_logical(scale_factor);
- Some(Event::Window(
- id,
- window::Event::Resized {
- width: logical_size.width,
- height: logical_size.height,
- },
- ))
+ Some(Event::Window(window::Event::Resized {
+ width: logical_size.width,
+ height: logical_size.height,
+ }))
}
WindowEvent::CloseRequested => {
- Some(Event::Window(id, window::Event::CloseRequested))
+ Some(Event::Window(window::Event::CloseRequested))
}
WindowEvent::CursorMoved { position, .. } => {
let position = position.to_logical::<f64>(scale_factor);
@@ -264,22 +260,19 @@ pub fn window_event(
self::modifiers(new_modifiers.state()),
)))
}
- WindowEvent::Focused(focused) => Some(Event::Window(
- id,
- if focused {
- window::Event::Focused
- } else {
- window::Event::Unfocused
- },
- )),
+ WindowEvent::Focused(focused) => Some(Event::Window(if focused {
+ window::Event::Focused
+ } else {
+ window::Event::Unfocused
+ })),
WindowEvent::HoveredFile(path) => {
- Some(Event::Window(id, window::Event::FileHovered(path.clone())))
+ Some(Event::Window(window::Event::FileHovered(path.clone())))
}
WindowEvent::DroppedFile(path) => {
- Some(Event::Window(id, window::Event::FileDropped(path.clone())))
+ Some(Event::Window(window::Event::FileDropped(path.clone())))
}
WindowEvent::HoveredFileCancelled => {
- Some(Event::Window(id, window::Event::FilesHoveredLeft))
+ Some(Event::Window(window::Event::FilesHoveredLeft))
}
WindowEvent::Touch(touch) => {
Some(Event::Touch(touch_event(touch, scale_factor)))
@@ -288,7 +281,7 @@ pub fn window_event(
let winit::dpi::LogicalPosition { x, y } =
position.to_logical(scale_factor);
- Some(Event::Window(id, window::Event::Moved { x, y }))
+ Some(Event::Window(window::Event::Moved { x, y }))
}
_ => None,
}
diff --git a/winit/src/multi_window.rs b/winit/src/multi_window.rs
index 74ab64f2..2eaf9241 100644
--- a/winit/src/multi_window.rs
+++ b/winit/src/multi_window.rs
@@ -16,7 +16,8 @@ use crate::futures::futures::channel::oneshot;
use crate::futures::futures::executor;
use crate::futures::futures::task;
use crate::futures::futures::{Future, StreamExt};
-use crate::futures::{Executor, Runtime, Subscription};
+use crate::futures::subscription::{self, Subscription};
+use crate::futures::{Executor, Runtime};
use crate::graphics;
use crate::graphics::{compositor, Compositor};
use crate::multi_window::window_manager::WindowManager;
@@ -491,14 +492,11 @@ async fn run_instance<A, E, C>(
let mut clipboard = Clipboard::connect(&main_window.raw);
let mut events = {
vec![(
- Some(window::Id::MAIN),
- core::Event::Window(
- window::Id::MAIN,
- window::Event::Opened {
- position: main_window.position(),
- size: main_window.size(),
- },
- ),
+ window::Id::MAIN,
+ core::Event::Window(window::Event::Opened {
+ position: main_window.position(),
+ size: main_window.size(),
+ }),
)]
};
@@ -564,14 +562,11 @@ async fn run_instance<A, E, C>(
let _ = ui_caches.insert(id, user_interface::Cache::default());
events.push((
- Some(id),
- core::Event::Window(
- id,
- window::Event::Opened {
- position: window.position(),
- size: window.size(),
- },
- ),
+ id,
+ core::Event::Window(window::Event::Opened {
+ position: window.position(),
+ size: window.size(),
+ }),
));
}
Event::EventLoopAwakened(event) => {
@@ -591,16 +586,13 @@ async fn run_instance<A, E, C>(
event::MacOS::ReceivedUrl(url),
),
) => {
- use crate::core::event;
-
- events.push((
- None,
- event::Event::PlatformSpecific(
- event::PlatformSpecific::MacOS(
- event::MacOS::ReceivedUrl(url),
+ runtime.broadcast(
+ subscription::Event::PlatformSpecific(
+ subscription::PlatformSpecific::MacOS(
+ subscription::MacOS::ReceivedUrl(url),
),
),
- ));
+ );
}
event::Event::UserEvent(message) => {
messages.push(message);
@@ -623,7 +615,6 @@ 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 = core::Event::Window(
- id,
window::Event::RedrawRequested(Instant::now()),
);
@@ -662,10 +653,11 @@ async fn run_instance<A, E, C>(
window.mouse_interaction = new_mouse_interaction;
}
- runtime.broadcast(
- redraw_event.clone(),
- core::event::Status::Ignored,
- );
+ runtime.broadcast(subscription::Event::Interaction {
+ window: id,
+ event: redraw_event,
+ status: core::event::Status::Ignored,
+ });
let _ = control_sender.start_send(Control::ChangeFlow(
match ui_state {
@@ -801,8 +793,8 @@ async fn run_instance<A, E, C>(
let _ = ui_caches.remove(&id);
events.push((
- None,
- core::Event::Window(id, window::Event::Closed),
+ id,
+ core::Event::Window(window::Event::Closed),
));
if window_manager.is_empty() {
@@ -816,12 +808,11 @@ async fn run_instance<A, E, C>(
);
if let Some(event) = conversion::window_event(
- id,
window_event,
window.state.scale_factor(),
window.state.modifiers(),
) {
- events.push((Some(id), event));
+ events.push((id, event));
}
}
}
@@ -837,8 +828,7 @@ async fn run_instance<A, E, C>(
let mut window_events = vec![];
events.retain(|(window_id, event)| {
- if *window_id == Some(id) || window_id.is_none()
- {
+ if *window_id == id {
window_events.push(event.clone());
false
} else {
@@ -874,10 +864,26 @@ async fn run_instance<A, E, C>(
.into_iter()
.zip(statuses.into_iter())
{
- runtime.broadcast(event, status);
+ runtime.broadcast(
+ subscription::Event::Interaction {
+ window: id,
+ event,
+ status,
+ },
+ );
}
}
+ for (id, event) in events.drain(..) {
+ runtime.broadcast(
+ subscription::Event::Interaction {
+ window: id,
+ event,
+ status: core::event::Status::Ignored,
+ },
+ );
+ }
+
debug.event_processing_finished();
// TODO mw application update returns which window IDs to update
@@ -1272,25 +1278,20 @@ fn run_command<A, C, E>(
std::mem::take(ui_caches),
);
- 'operate: while let Some(mut operation) =
- current_operation.take()
- {
+ while let Some(mut operation) = current_operation.take() {
for (id, ui) in uis.iter_mut() {
if let Some(window) = window_manager.get_mut(*id) {
ui.operate(&window.renderer, operation.as_mut());
+ }
+ }
- match operation.finish() {
- operation::Outcome::None => {}
- operation::Outcome::Some(message) => {
- proxy.send(message);
-
- // operation completed, don't need to try to operate on rest of UIs
- break 'operate;
- }
- operation::Outcome::Chain(next) => {
- current_operation = Some(next);
- }
- }
+ match operation.finish() {
+ operation::Outcome::None => {}
+ operation::Outcome::Some(message) => {
+ proxy.send(message);
+ }
+ operation::Outcome::Chain(next) => {
+ current_operation = Some(next);
}
}
}