summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/src/keyboard/modifiers.rs12
-rw-r--r--examples/integration/src/main.rs35
-rw-r--r--glutin/src/application.rs12
-rw-r--r--native/src/widget/pane_grid.rs37
-rw-r--r--native/src/widget/pane_grid/content.rs21
-rw-r--r--native/src/widget/pick_list.rs15
-rw-r--r--native/src/window/event.rs8
-rw-r--r--wgpu/src/backend.rs19
-rw-r--r--wgpu/src/settings.rs6
-rw-r--r--wgpu/src/window/compositor.rs10
-rw-r--r--winit/src/conversion.rs6
11 files changed, 119 insertions, 62 deletions
diff --git a/core/src/keyboard/modifiers.rs b/core/src/keyboard/modifiers.rs
index 383b9370..e61f145a 100644
--- a/core/src/keyboard/modifiers.rs
+++ b/core/src/keyboard/modifiers.rs
@@ -28,6 +28,18 @@ bitflags! {
}
impl Modifiers {
+ /// The "command" key.
+ ///
+ /// This is normally the main modifier to be used for hotkeys.
+ ///
+ /// On macOS, this is equivalent to `Self::LOGO`.
+ /// Ohterwise, this is equivalent to `Self::CTRL`.
+ pub const COMMAND: Self = if cfg!(target_os = "macos") {
+ Self::LOGO
+ } else {
+ Self::CTRL
+ };
+
/// Returns true if the [`SHIFT`] key is pressed in the [`Modifiers`].
pub fn shift(self) -> bool {
self.contains(Self::SHIFT)
diff --git a/examples/integration/src/main.rs b/examples/integration/src/main.rs
index 9ef31203..6f319466 100644
--- a/examples/integration/src/main.rs
+++ b/examples/integration/src/main.rs
@@ -34,7 +34,7 @@ pub fn main() {
let instance = wgpu::Instance::new(wgpu::BackendBit::PRIMARY);
let surface = unsafe { instance.create_surface(&window) };
- let (mut device, queue) = futures::executor::block_on(async {
+ let (format, (mut device, queue)) = futures::executor::block_on(async {
let adapter = instance
.request_adapter(&wgpu::RequestAdapterOptions {
power_preference: wgpu::PowerPreference::HighPerformance,
@@ -43,21 +43,24 @@ pub fn main() {
.await
.expect("Request adapter");
- adapter
- .request_device(
- &wgpu::DeviceDescriptor {
- label: None,
- features: wgpu::Features::empty(),
- limits: wgpu::Limits::default(),
- },
- None,
- )
- .await
- .expect("Request device")
+ (
+ adapter
+ .get_swap_chain_preferred_format(&surface)
+ .expect("Get preferred format"),
+ adapter
+ .request_device(
+ &wgpu::DeviceDescriptor {
+ label: None,
+ features: wgpu::Features::empty(),
+ limits: wgpu::Limits::default(),
+ },
+ None,
+ )
+ .await
+ .expect("Request device"),
+ )
});
- let format = wgpu::TextureFormat::Bgra8UnormSrgb;
-
let mut swap_chain = {
let size = window.inner_size();
@@ -65,7 +68,7 @@ pub fn main() {
&surface,
&wgpu::SwapChainDescriptor {
usage: wgpu::TextureUsage::RENDER_ATTACHMENT,
- format: format,
+ format,
width: size.width,
height: size.height,
present_mode: wgpu::PresentMode::Mailbox,
@@ -85,7 +88,7 @@ pub fn main() {
// Initialize iced
let mut debug = Debug::new();
let mut renderer =
- Renderer::new(Backend::new(&mut device, Settings::default()));
+ Renderer::new(Backend::new(&mut device, Settings::default(), format));
let mut state = program::State::new(
controls,
diff --git a/glutin/src/application.rs b/glutin/src/application.rs
index 991c8705..7ed6315d 100644
--- a/glutin/src/application.rs
+++ b/glutin/src/application.rs
@@ -146,7 +146,7 @@ async fn run_instance<A, E, C>(
mut runtime: Runtime<E, Proxy<A::Message>, A::Message>,
mut debug: Debug,
mut receiver: mpsc::UnboundedReceiver<glutin::event::Event<'_, A::Message>>,
- context: glutin::ContextWrapper<glutin::PossiblyCurrent, Window>,
+ mut context: glutin::ContextWrapper<glutin::PossiblyCurrent, Window>,
exit_on_close_request: bool,
) where
A: Application + 'static,
@@ -255,6 +255,16 @@ async fn run_instance<A, E, C>(
}
event::Event::RedrawRequested(_) => {
debug.render_started();
+
+ #[allow(unsafe_code)]
+ unsafe {
+ if !context.is_current() {
+ context = context
+ .make_current()
+ .expect("Make OpenGL context current");
+ }
+ }
+
let current_viewport_version = state.viewport_version();
if viewport_version != current_viewport_version {
diff --git a/native/src/widget/pane_grid.rs b/native/src/widget/pane_grid.rs
index b72172cc..26a72409 100644
--- a/native/src/widget/pane_grid.rs
+++ b/native/src/widget/pane_grid.rs
@@ -452,24 +452,25 @@ where
_ => {}
}
- if self.state.picked_pane().is_none() {
- self.elements
- .iter_mut()
- .zip(layout.children())
- .map(|((_, pane), layout)| {
- pane.on_event(
- event.clone(),
- layout,
- cursor_position,
- renderer,
- clipboard,
- messages,
- )
- })
- .fold(event_status, event::Status::merge)
- } else {
- event::Status::Captured
- }
+ let picked_pane = self.state.picked_pane().map(|(pane, _)| pane);
+
+ self.elements
+ .iter_mut()
+ .zip(layout.children())
+ .map(|((pane, content), layout)| {
+ let is_picked = picked_pane == Some(*pane);
+
+ content.on_event(
+ event.clone(),
+ layout,
+ cursor_position,
+ renderer,
+ clipboard,
+ messages,
+ is_picked,
+ )
+ })
+ .fold(event_status, event::Status::merge)
}
fn draw(
diff --git a/native/src/widget/pane_grid/content.rs b/native/src/widget/pane_grid/content.rs
index b0110393..bac9fdd4 100644
--- a/native/src/widget/pane_grid/content.rs
+++ b/native/src/widget/pane_grid/content.rs
@@ -149,6 +149,7 @@ where
renderer: &Renderer,
clipboard: &mut dyn Clipboard,
messages: &mut Vec<Message>,
+ is_picked: bool,
) -> event::Status {
let mut event_status = event::Status::Ignored;
@@ -169,14 +170,18 @@ where
layout
};
- let body_status = self.body.on_event(
- event,
- body_layout,
- cursor_position,
- renderer,
- clipboard,
- messages,
- );
+ let body_status = if is_picked {
+ event::Status::Ignored
+ } else {
+ self.body.on_event(
+ event,
+ body_layout,
+ cursor_position,
+ renderer,
+ clipboard,
+ messages,
+ )
+ };
event_status.merge(body_status)
}
diff --git a/native/src/widget/pick_list.rs b/native/src/widget/pick_list.rs
index f4b60fc4..d7792000 100644
--- a/native/src/widget/pick_list.rs
+++ b/native/src/widget/pick_list.rs
@@ -1,5 +1,6 @@
//! Display a dropdown list of selectable values.
use crate::event::{self, Event};
+use crate::keyboard;
use crate::layout;
use crate::mouse;
use crate::overlay;
@@ -20,6 +21,7 @@ where
[T]: ToOwned<Owned = Vec<T>>,
{
menu: &'a mut menu::State,
+ keyboard_modifiers: &'a mut keyboard::Modifiers,
is_open: &'a mut bool,
hovered_option: &'a mut Option<usize>,
last_selection: &'a mut Option<T>,
@@ -38,6 +40,7 @@ where
#[derive(Debug, Clone)]
pub struct State<T> {
menu: menu::State,
+ keyboard_modifiers: keyboard::Modifiers,
is_open: bool,
hovered_option: Option<usize>,
last_selection: Option<T>,
@@ -47,6 +50,7 @@ impl<T> Default for State<T> {
fn default() -> Self {
Self {
menu: menu::State::default(),
+ keyboard_modifiers: keyboard::Modifiers::default(),
is_open: bool::default(),
hovered_option: Option::default(),
last_selection: Option::default(),
@@ -71,6 +75,7 @@ where
) -> Self {
let State {
menu,
+ keyboard_modifiers,
is_open,
hovered_option,
last_selection,
@@ -78,6 +83,7 @@ where
Self {
menu,
+ keyboard_modifiers,
is_open,
hovered_option,
last_selection,
@@ -270,7 +276,8 @@ where
}
Event::Mouse(mouse::Event::WheelScrolled {
delta: mouse::ScrollDelta::Lines { y, .. },
- }) if layout.bounds().contains(cursor_position)
+ }) if self.keyboard_modifiers.command()
+ && layout.bounds().contains(cursor_position)
&& !*self.is_open =>
{
fn find_next<'a, T: PartialEq>(
@@ -302,9 +309,13 @@ where
messages.push((self.on_selected)(next_option.clone()));
}
- return event::Status::Captured;
+ event::Status::Captured
}
+ Event::Keyboard(keyboard::Event::ModifiersChanged(modifiers)) => {
+ *self.keyboard_modifiers = modifiers;
+ event::Status::Ignored
+ }
_ => event::Status::Ignored,
}
}
diff --git a/native/src/window/event.rs b/native/src/window/event.rs
index 3aa1ab0b..64f2b8d8 100644
--- a/native/src/window/event.rs
+++ b/native/src/window/event.rs
@@ -3,6 +3,14 @@ use std::path::PathBuf;
/// A window-related event.
#[derive(PartialEq, Clone, Debug)]
pub enum Event {
+ /// A window was moved.
+ Moved {
+ /// The new logical x location of the window
+ x: i32,
+ /// The new logical y location of the window
+ y: i32,
+ },
+
/// A window was resized.
Resized {
/// The new width of the window (in units)
diff --git a/wgpu/src/backend.rs b/wgpu/src/backend.rs
index 783079f3..4f34045b 100644
--- a/wgpu/src/backend.rs
+++ b/wgpu/src/backend.rs
@@ -30,23 +30,24 @@ pub struct Backend {
impl Backend {
/// Creates a new [`Backend`].
- pub fn new(device: &wgpu::Device, settings: Settings) -> Self {
+ pub fn new(
+ device: &wgpu::Device,
+ settings: Settings,
+ format: wgpu::TextureFormat,
+ ) -> Self {
let text_pipeline = text::Pipeline::new(
device,
- settings.format,
+ format,
settings.default_font,
settings.text_multithreading,
);
- let quad_pipeline = quad::Pipeline::new(device, settings.format);
- let triangle_pipeline = triangle::Pipeline::new(
- device,
- settings.format,
- settings.antialiasing,
- );
+ let quad_pipeline = quad::Pipeline::new(device, format);
+ let triangle_pipeline =
+ triangle::Pipeline::new(device, format, settings.antialiasing);
#[cfg(any(feature = "image_rs", feature = "svg"))]
- let image_pipeline = image::Pipeline::new(device, settings.format);
+ let image_pipeline = image::Pipeline::new(device, format);
Self {
quad_pipeline,
diff --git a/wgpu/src/settings.rs b/wgpu/src/settings.rs
index 9a7eed34..dc06b82d 100644
--- a/wgpu/src/settings.rs
+++ b/wgpu/src/settings.rs
@@ -6,11 +6,6 @@ pub use crate::Antialiasing;
/// [`Backend`]: crate::Backend
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Settings {
- /// The output format of the [`Backend`].
- ///
- /// [`Backend`]: crate::Backend
- pub format: wgpu::TextureFormat,
-
/// The present mode of the [`Backend`].
///
/// [`Backend`]: crate::Backend
@@ -68,7 +63,6 @@ impl Settings {
impl Default for Settings {
fn default() -> Settings {
Settings {
- format: wgpu::TextureFormat::Bgra8UnormSrgb,
present_mode: wgpu::PresentMode::Mailbox,
internal_backend: wgpu::BackendBit::PRIMARY,
default_font: None,
diff --git a/wgpu/src/window/compositor.rs b/wgpu/src/window/compositor.rs
index fb25fca4..b60efd25 100644
--- a/wgpu/src/window/compositor.rs
+++ b/wgpu/src/window/compositor.rs
@@ -13,6 +13,7 @@ pub struct Compositor {
queue: wgpu::Queue,
staging_belt: wgpu::util::StagingBelt,
local_pool: futures::executor::LocalPool,
+ format: wgpu::TextureFormat,
}
impl Compositor {
@@ -42,6 +43,10 @@ impl Compositor {
})
.await?;
+ let format = compatible_surface
+ .as_ref()
+ .and_then(|surf| adapter.get_swap_chain_preferred_format(surf))?;
+
let (device, queue) = adapter
.request_device(
&wgpu::DeviceDescriptor {
@@ -69,12 +74,13 @@ impl Compositor {
queue,
staging_belt,
local_pool,
+ format,
})
}
/// Creates a new rendering [`Backend`] for this [`Compositor`].
pub fn create_backend(&self) -> Backend {
- Backend::new(&self.device, self.settings)
+ Backend::new(&self.device, self.settings, self.format)
}
}
@@ -119,7 +125,7 @@ impl iced_graphics::window::Compositor for Compositor {
surface,
&wgpu::SwapChainDescriptor {
usage: wgpu::TextureUsage::RENDER_ATTACHMENT,
- format: self.settings.format,
+ format: self.format,
present_mode: self.settings.present_mode,
width,
height,
diff --git a/winit/src/conversion.rs b/winit/src/conversion.rs
index b3d05857..e0934f43 100644
--- a/winit/src/conversion.rs
+++ b/winit/src/conversion.rs
@@ -130,6 +130,12 @@ pub fn window_event(
WindowEvent::Touch(touch) => {
Some(Event::Touch(touch_event(*touch, scale_factor)))
}
+ WindowEvent::Moved(position) => {
+ let winit::dpi::LogicalPosition { x, y } =
+ position.to_logical(scale_factor);
+
+ Some(Event::Window(window::Event::Moved { x, y }))
+ }
_ => None,
}
}