summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón <hector0193@gmail.com>2021-06-25 14:47:14 +0200
committerLibravatar GitHub <noreply@github.com>2021-06-25 14:47:14 +0200
commit06d0158efbaadc5ae0a6dea22e7a761a3e1c2a8f (patch)
treeacf6d59469d89e46020cb7a27ce217294ed47e9e
parentd2c8a3e04b02a1fcf54504bcbd41c488a8bba88a (diff)
parent612585109ffc9a14a507c3c8423c6aa790c35cbf (diff)
downloadiced-06d0158efbaadc5ae0a6dea22e7a761a3e1c2a8f.tar.gz
iced-06d0158efbaadc5ae0a6dea22e7a761a3e1c2a8f.tar.bz2
iced-06d0158efbaadc5ae0a6dea22e7a761a3e1c2a8f.zip
Merge pull request #917 from derezzedex/macos-url
Enable receiving URLs on MacOS
-rw-r--r--Cargo.toml1
-rw-r--r--examples/url_handler/Cargo.toml10
-rw-r--r--examples/url_handler/src/main.rs73
-rw-r--r--glutin/Cargo.toml6
-rw-r--r--glutin/src/application.rs10
-rw-r--r--native/src/event.rs21
-rw-r--r--winit/Cargo.toml6
-rw-r--r--winit/src/application.rs10
8 files changed, 134 insertions, 3 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 6d894eba..329877c8 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -84,6 +84,7 @@ members = [
"examples/todos",
"examples/tour",
"examples/tooltip",
+ "examples/url_handler",
]
[dependencies]
diff --git a/examples/url_handler/Cargo.toml b/examples/url_handler/Cargo.toml
new file mode 100644
index 00000000..911b2f25
--- /dev/null
+++ b/examples/url_handler/Cargo.toml
@@ -0,0 +1,10 @@
+[package]
+name = "url_handler"
+version = "0.1.0"
+authors = ["Héctor Ramón Jiménez <hector0193@gmail.com>"]
+edition = "2018"
+publish = false
+
+[dependencies]
+iced = { path = "../.." }
+iced_native = { path = "../../native" } \ No newline at end of file
diff --git a/examples/url_handler/src/main.rs b/examples/url_handler/src/main.rs
new file mode 100644
index 00000000..f14e5227
--- /dev/null
+++ b/examples/url_handler/src/main.rs
@@ -0,0 +1,73 @@
+use iced::{
+ executor, Application, Clipboard, Command, Container, Element, Length,
+ Settings, Subscription, Text,
+};
+use iced_native::{
+ event::{MacOS, PlatformSpecific},
+ Event,
+};
+
+pub fn main() -> iced::Result {
+ App::run(Settings::default())
+}
+
+#[derive(Debug, Default)]
+struct App {
+ url: Option<String>,
+}
+
+#[derive(Debug, Clone)]
+enum Message {
+ EventOccurred(iced_native::Event),
+}
+
+impl Application for App {
+ type Executor = executor::Default;
+ type Message = Message;
+ type Flags = ();
+
+ fn new(_flags: ()) -> (App, Command<Message>) {
+ (App::default(), Command::none())
+ }
+
+ fn title(&self) -> String {
+ String::from("Url - Iced")
+ }
+
+ fn update(
+ &mut self,
+ message: Message,
+ _clipboard: &mut Clipboard,
+ ) -> Command<Message> {
+ match message {
+ Message::EventOccurred(event) => {
+ if let Event::PlatformSpecific(PlatformSpecific::MacOS(
+ MacOS::ReceivedUrl(url),
+ )) = event
+ {
+ self.url = Some(url);
+ }
+ }
+ };
+
+ Command::none()
+ }
+
+ fn subscription(&self) -> Subscription<Message> {
+ iced_native::subscription::events().map(Message::EventOccurred)
+ }
+
+ fn view(&mut self) -> Element<Message> {
+ let content = match &self.url {
+ Some(url) => Text::new(format!("{}", url)),
+ None => Text::new("No URL received yet!"),
+ };
+
+ Container::new(content.size(48))
+ .width(Length::Fill)
+ .height(Length::Fill)
+ .center_x()
+ .center_y()
+ .into()
+ }
+}
diff --git a/glutin/Cargo.toml b/glutin/Cargo.toml
index 92aa5018..913ff5b8 100644
--- a/glutin/Cargo.toml
+++ b/glutin/Cargo.toml
@@ -13,8 +13,10 @@ categories = ["gui"]
[features]
debug = ["iced_winit/debug"]
-[dependencies]
-glutin = "0.27"
+[dependencies.glutin]
+version = "0.27"
+git = "https://github.com/iced-rs/glutin"
+rev = "be6793b5b3defc9452cd1c896cd315ed7442d546"
[dependencies.iced_native]
version = "0.4"
diff --git a/glutin/src/application.rs b/glutin/src/application.rs
index 79fcf745..a8e5dbf9 100644
--- a/glutin/src/application.rs
+++ b/glutin/src/application.rs
@@ -237,6 +237,16 @@ async fn run_instance<A, E, C>(
context.window().request_redraw();
}
+ event::Event::PlatformSpecific(event::PlatformSpecific::MacOS(
+ event::MacOS::ReceivedUrl(url),
+ )) => {
+ use iced_native::event;
+ events.push(iced_native::Event::PlatformSpecific(
+ event::PlatformSpecific::MacOS(event::MacOS::ReceivedUrl(
+ url,
+ )),
+ ));
+ }
event::Event::UserEvent(message) => {
messages.push(message);
}
diff --git a/native/src/event.rs b/native/src/event.rs
index 205bb797..1c26b5f2 100644
--- a/native/src/event.rs
+++ b/native/src/event.rs
@@ -23,6 +23,27 @@ pub enum Event {
/// A touch event
Touch(touch::Event),
+
+ /// A platform specific event
+ PlatformSpecific(PlatformSpecific),
+}
+
+/// A platform specific event
+#[derive(Debug, Clone, PartialEq)]
+pub enum PlatformSpecific {
+ /// A MacOS specific event
+ MacOS(MacOS),
+}
+
+/// Describes an event specific to MacOS
+#[derive(Debug, Clone, PartialEq)]
+pub enum MacOS {
+ /// Triggered when the app receives an URL from the system
+ ///
+ /// _**Note:** For this event to be triggered, the executable needs to be properly [bundled]!_
+ ///
+ /// [bundled]: https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html#//apple_ref/doc/uid/10000123i-CH101-SW19
+ ReceivedUrl(String),
}
/// The status of an [`Event`] after being processed.
diff --git a/winit/Cargo.toml b/winit/Cargo.toml
index 4bb46029..b926a9c5 100644
--- a/winit/Cargo.toml
+++ b/winit/Cargo.toml
@@ -14,11 +14,15 @@ categories = ["gui"]
debug = ["iced_native/debug"]
[dependencies]
-winit = "0.25"
window_clipboard = "0.2"
log = "0.4"
thiserror = "1.0"
+[dependencies.winit]
+version = "0.25"
+git = "https://github.com/iced-rs/winit"
+rev = "9c358959ed99736566d50a511b03d2fed3aac2ae"
+
[dependencies.iced_native]
version = "0.4"
path = "../native"
diff --git a/winit/src/application.rs b/winit/src/application.rs
index b1d5f418..49f2f513 100644
--- a/winit/src/application.rs
+++ b/winit/src/application.rs
@@ -310,6 +310,16 @@ async fn run_instance<A, E, C>(
window.request_redraw();
}
+ event::Event::PlatformSpecific(event::PlatformSpecific::MacOS(
+ event::MacOS::ReceivedUrl(url),
+ )) => {
+ use iced_native::event;
+ events.push(iced_native::Event::PlatformSpecific(
+ event::PlatformSpecific::MacOS(event::MacOS::ReceivedUrl(
+ url,
+ )),
+ ));
+ }
event::Event::UserEvent(message) => {
messages.push(message);
}