diff options
Diffstat (limited to 'winit')
| -rw-r--r-- | winit/src/application.rs | 27 | ||||
| -rw-r--r-- | winit/src/conversion.rs | 35 | ||||
| -rw-r--r-- | winit/src/multi_window.rs | 105 | 
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);                          }                      }                  } | 
